summaryrefslogtreecommitdiff
path: root/packages/linux/ep93xx-kernel
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /packages/linux/ep93xx-kernel
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'packages/linux/ep93xx-kernel')
-rw-r--r--packages/linux/ep93xx-kernel/defconfig1176
-rw-r--r--packages/linux/ep93xx-kernel/derevo6.diff4434
-rw-r--r--packages/linux/ep93xx-kernel/dynamic-phys-offset-2.6.20-rc7.diff199
-rw-r--r--packages/linux/ep93xx-kernel/eabi-enums.patch16
-rw-r--r--packages/linux/ep93xx-kernel/linux-2.6.15-ep93xx-gao19.diff43746
5 files changed, 0 insertions, 49571 deletions
diff --git a/packages/linux/ep93xx-kernel/defconfig b/packages/linux/ep93xx-kernel/defconfig
deleted file mode 100644
index e42a804b5a..0000000000
--- a/packages/linux/ep93xx-kernel/defconfig
+++ /dev/null
@@ -1,1176 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc1-git9
-# Sat Jul 15 20:13:41 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_HARDIRQS_SW_RESEND=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_VECTORS_BASE=0xffff0000
-CONFIG_RUNTIME_PHYS_OFFSET=y
-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=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_UID16=y
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_EMBEDDED=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_RT_MUTEXES=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=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=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_BLK_DEV_IO_TRACE 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 is not set
-# 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=y
-# 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_IOP3XX 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_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
-
-#
-# Cirrus EP93xx Implementation Options
-#
-CONFIG_CRUNCH=y
-
-#
-# EP93xx Platforms
-#
-CONFIG_MACH_EDB9302=y
-CONFIG_MACH_EDB9315=y
-CONFIG_MACH_EDB9315A=y
-CONFIG_MACH_GESBC9312=y
-# CONFIG_MACH_MICRO9 is not set
-CONFIG_MACH_TS72XX=y
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_ARM920T=y
-CONFIG_CPU_32v4=y
-CONFIG_CPU_ABRT_EV4T=y
-CONFIG_CPU_CACHE_V4WT=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_COPY_V4WB=y
-CONFIG_CPU_TLB_V4WBI=y
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-# CONFIG_CPU_ICACHE_DISABLE is not set
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-CONFIG_ARM_VIC=y
-
-#
-# Bus support
-#
-CONFIG_ARM_AMBA=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Kernel Features
-#
-# CONFIG_PREEMPT is not set
-# CONFIG_NO_IDLE_HZ is not set
-CONFIG_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_SPLIT_PTLOCK_CPUS=4096
-# CONFIG_RESOURCES_64BIT is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyAM0,57600 root=/dev/nfs ip=bootp"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-CONFIG_FPE_NWFPE_XP=y
-# 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
-
-#
-# Power management options
-#
-# CONFIG_PM is not set
-# CONFIG_APM is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-CONFIG_NET_KEY=y
-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=y
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-# 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_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-CONFIG_IPV6=y
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_INET6_XFRM_MODE_TRANSPORT=y
-CONFIG_INET6_XFRM_MODE_TUNNEL=y
-# CONFIG_IPV6_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_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-# 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
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY 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_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_JEDECPROBE is not set
-CONFIG_MTD_GEN_PROBE=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-# CONFIG_MTD_CFI_GEOMETRY 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_OTP is not set
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_CFI_STAA=y
-CONFIG_MTD_CFI_UTIL=y
-# CONFIG_MTD_RAM is not set
-CONFIG_MTD_ROM=y
-# 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_PHYSMAP=y
-CONFIG_MTD_PHYSMAP_START=0x0
-CONFIG_MTD_PHYSMAP_LEN=0x0
-CONFIG_MTD_PHYSMAP_BANKWIDTH=1
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-# CONFIG_MTD_PLATRAM is not set
-
-#
-# Self-contained MTD device drivers
-#
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-CONFIG_MTD_NAND_TS7250=y
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# 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
-#
-
-#
-# 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 is not set
-# CONFIG_BLK_DEV_INITRD is not set
-# 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_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
-
-#
-# SCSI Transport Attributes
-#
-# 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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_DEBUG 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_EP93XX_ETH=y
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-# CONFIG_INPUT is not set
-
-#
-# Hardware I/O ports
-#
-# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-# CONFIG_VT is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_AMBA_PL010=y
-CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
-# CONFIG_SERIAL_AMBA_PL011 is not set
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-
-#
-# Watchdog Device Drivers
-#
-# CONFIG_SOFT_WATCHDOG is not set
-CONFIG_EP93XX_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
-#
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-CONFIG_I2C=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_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_EP93XX 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=y
-CONFIG_I2C_DEBUG_ALGO=y
-CONFIG_I2C_DEBUG_BUS=y
-CONFIG_I2C_DEBUG_CHIP=y
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU 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_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_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_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=y
-CONFIG_USB_DEBUG=y
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_DYNAMIC_MINORS=y
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_OHCI_HCD is not set
-# 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_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-
-#
-# Input core support is needed for USB HID input layer or HIDBP support
-#
-# CONFIG_USB_HIDDEV 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=y
-CONFIG_USB_RTL8150=y
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_MON is not set
-
-#
-# USB port drivers
-#
-
-#
-# USB Serial Converter support
-#
-CONFIG_USB_SERIAL=y
-CONFIG_USB_SERIAL_CONSOLE=y
-# CONFIG_USB_SERIAL_GENERIC 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_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 is not set
-# 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_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=y
-# 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
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_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_IDMOUSE is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-
-#
-# 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
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 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_M48T86=y
-CONFIG_RTC_DRV_EP93XX=y
-# CONFIG_RTC_DRV_PL031 is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_FS_XATTR is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG 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_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_SYSFS=y
-CONFIG_TMPFS=y
-# 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_JFFS_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 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=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
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-CONFIG_DEBUG_SLAB=y
-# CONFIG_DEBUG_SLAB_LEAK is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_RWSEMS 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_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_WAITQ=y
-CONFIG_DEBUG_ERRORS=y
-CONFIG_DEBUG_LL=y
-# CONFIG_DEBUG_ICEDCC is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
diff --git a/packages/linux/ep93xx-kernel/derevo6.diff b/packages/linux/ep93xx-kernel/derevo6.diff
deleted file mode 100644
index fc7f609056..0000000000
--- a/packages/linux/ep93xx-kernel/derevo6.diff
+++ /dev/null
@@ -1,4434 +0,0 @@
-diff -urN linux-2.6.15.commit/arch/arm/common/Kconfig linux-2.6.15.snap/arch/arm/common/Kconfig
---- linux-2.6.15.commit/arch/arm/common/Kconfig 2006-02-12 10:22:18.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/common/Kconfig 2006-02-20 13:56:04.000000000 +0100
-@@ -1,7 +1,10 @@
--config ICST525
-+config ARM_GIC
- bool
-
--config ARM_GIC
-+config ARM_VIC
-+ bool
-+
-+config ICST525
- bool
-
- config ICST307
-diff -urN linux-2.6.15.commit/arch/arm/common/Makefile linux-2.6.15.snap/arch/arm/common/Makefile
---- linux-2.6.15.commit/arch/arm/common/Makefile 2006-02-12 10:22:18.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/common/Makefile 2006-02-20 13:56:32.000000000 +0100
-@@ -5,6 +5,7 @@
- obj-y += rtctime.o
- obj-$(CONFIG_ARM_AMBA) += amba.o
- obj-$(CONFIG_ARM_GIC) += gic.o
-+obj-$(CONFIG_ARM_VIC) += vic.o
- obj-$(CONFIG_ICST525) += icst525.o
- obj-$(CONFIG_ICST307) += icst307.o
- obj-$(CONFIG_SA1111) += sa1111.o
-diff -urN linux-2.6.15.commit/arch/arm/common/vic.c linux-2.6.15.snap/arch/arm/common/vic.c
---- linux-2.6.15.commit/arch/arm/common/vic.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/common/vic.c 2006-02-20 18:38:41.000000000 +0100
-@@ -0,0 +1,91 @@
-+/*
-+ * linux/arch/arm/common/vic.c
-+ *
-+ * Copyright (C) 1999 - 2003 ARM Limited
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#include <linux/init.h>
-+#include <linux/list.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/mach/irq.h>
-+#include <asm/hardware/vic.h>
-+
-+static void vic_mask_irq(unsigned int irq)
-+{
-+ void __iomem *base = get_irq_chipdata(irq);
-+ irq &= 31;
-+ writel(1 << irq, base + VIC_INT_ENABLE_CLEAR);
-+}
-+
-+static void vic_unmask_irq(unsigned int irq)
-+{
-+ void __iomem *base = get_irq_chipdata(irq);
-+ irq &= 31;
-+ writel(1 << irq, base + VIC_INT_ENABLE);
-+}
-+
-+static struct irqchip vic_chip = {
-+ .ack = vic_mask_irq,
-+ .mask = vic_mask_irq,
-+ .unmask = vic_unmask_irq,
-+};
-+
-+void __init vic_init(void __iomem *base, unsigned int irq_start,
-+ u32 vic_sources)
-+{
-+ unsigned int i;
-+
-+ /* Disable all interrupts initially. */
-+
-+ writel(0, base + VIC_INT_SELECT);
-+ writel(~0, base + VIC_INT_ENABLE_CLEAR);
-+ writel(0, base + VIC_ITCR);
-+ writel(~0, base + VIC_INT_SOFT_CLEAR);
-+
-+ /*
-+ * Make sure we clear all existing interrupts
-+ */
-+ writel(0, base + VIC_VECT_ADDR);
-+ for (i = 0; i < 19; i++) {
-+ unsigned int value;
-+
-+ value = readl(base + VIC_VECT_ADDR);
-+ writel(value, base + VIC_VECT_ADDR);
-+ }
-+
-+ for (i = 0; i < 16; i++) {
-+ void __iomem *reg = base + VIC_VECT_CNTL0 + (i * 4);
-+// writel(VIC_VECT_CNTL_ENABLE | i, reg);
-+ writel(0, reg);
-+ }
-+
-+ writel(32, base + VIC_DEF_VECT_ADDR);
-+
-+ for (i = 0; i < 32; i++) {
-+ unsigned int irq = irq_start + i;
-+
-+ set_irq_chip(irq, &vic_chip);
-+ set_irq_chipdata(irq, base);
-+
-+ if (vic_sources & (1 << i)) {
-+ set_irq_handler(irq, do_level_IRQ);
-+ set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
-+ }
-+ }
-+}
-diff -urN linux-2.6.15.commit/arch/arm/configs/ep93xx_defconfig linux-2.6.15.snap/arch/arm/configs/ep93xx_defconfig
---- linux-2.6.15.commit/arch/arm/configs/ep93xx_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/configs/ep93xx_defconfig 2006-02-20 21:11:41.000000000 +0100
-@@ -0,0 +1,850 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.15
-+# Mon Feb 20 13:59:13 2006
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_CLEAN_COMPILE=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_KOBJECT_UEVENT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_INITRAMFS_SOURCE=""
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_EMBEDDED=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_SHMEM=y
-+CONFIG_CC_ALIGN_FUNCTIONS=0
-+CONFIG_CC_ALIGN_LABELS=0
-+CONFIG_CC_ALIGN_LOOPS=0
-+CONFIG_CC_ALIGN_JUMPS=0
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+
-+#
-+# Block layer
-+#
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS 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_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=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE is not set
-+# CONFIG_ARCH_REALVIEW is not set
-+# CONFIG_ARCH_IMX is not set
-+# CONFIG_ARCH_H720X is not set
-+# CONFIG_ARCH_AAEC2000 is not set
-+
-+#
-+# Cirrus EP93xx Implementation Options
-+#
-+
-+#
-+# EP93xx Platforms
-+#
-+CONFIG_MACH_GESBC9312=y
-+CONFIG_MACH_TS72XX=y
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_CACHE_VIVT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+CONFIG_ARM_THUMB=y
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+CONFIG_ARM_VIC=y
-+
-+#
-+# Bus support
-+#
-+CONFIG_ARM_AMBA=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Kernel Features
-+#
-+# CONFIG_PREEMPT is not set
-+# CONFIG_NO_IDLE_HZ is not set
-+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4096
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Boot options
-+#
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="console=ttyAM0,115200 root=/dev/nfs ip=bootp"
-+# CONFIG_XIP_KERNEL is not set
-+
-+#
-+# Floating point emulation
-+#
-+
-+#
-+# At least one emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+CONFIG_FPE_NWFPE_XP=y
-+# 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=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+CONFIG_NET_KEY=y
-+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=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_BIC=y
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+
-+#
-+# DCCP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_DCCP is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_IEEE80211 is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+
-+#
-+# Connector - unified userspace <-> kernelspace linker
-+#
-+# CONFIG_CONNECTOR is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+CONFIG_MTD_REDBOOT_PARTS=y
-+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY 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_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+# CONFIG_MTD_CFI 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=y
-+# 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_BLKMTD is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+
-+#
-+# NAND Flash Device Drivers
-+#
-+# CONFIG_MTD_NAND is not set
-+
-+#
-+# OneNAND Flash Device Drivers
-+#
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# Network device support
-+#
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# PHY device support
-+#
-+# CONFIG_PHYLIB is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_AMBA_PL010=y
-+CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+# CONFIG_WATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC 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
-+# CONFIG_TELCLOCK is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_PARPORT_LIGHT is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_RTC_X1205_I2C is not set
-+CONFIG_I2C_DEBUG_CORE=y
-+CONFIG_I2C_DEBUG_ALGO=y
-+CONFIG_I2C_DEBUG_BUS=y
-+CONFIG_I2C_DEBUG_CHIP=y
-+
-+#
-+# Hardware Monitoring support
-+#
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# Multimedia Capabilities Port drivers
-+#
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_FB is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_JBD is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_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_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=y
-+# CONFIG_RELAYFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS 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 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=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_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_LOG_BUF_SHIFT=14
-+CONFIG_DETECT_SOFTLOCKUP=y
-+# CONFIG_SCHEDSTATS is not set
-+CONFIG_DEBUG_SLAB=y
-+CONFIG_DEBUG_SPINLOCK=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_DEBUG_VM is not set
-+CONFIG_FRAME_POINTER=y
-+# CONFIG_RCU_TORTURE_TEST is not set
-+CONFIG_DEBUG_USER=y
-+CONFIG_DEBUG_WAITQ=y
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Hardware crypto devices
-+#
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-diff -urN linux-2.6.15.commit/arch/arm/Kconfig linux-2.6.15.snap/arch/arm/Kconfig
---- linux-2.6.15.commit/arch/arm/Kconfig 2006-02-12 10:22:17.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/Kconfig 2006-02-20 13:56:20.000000000 +0100
-@@ -103,6 +103,13 @@
- Ethernet interface, two PCMCIA sockets, two serial ports and a
- parallel port.
-
-+config ARCH_EP93XX
-+ bool "EP93xx-based"
-+ select ARM_AMBA
-+ select ARM_VIC
-+ help
-+ This enables support for the Cirrus EP93xx series of CPUs.
-+
- config ARCH_CAMELOT
- bool "Epxa10db"
- help
-@@ -219,6 +226,8 @@
-
- source "arch/arm/mach-clps711x/Kconfig"
-
-+source "arch/arm/mach-ep93xx/Kconfig"
-+
- source "arch/arm/mach-epxa10db/Kconfig"
-
- source "arch/arm/mach-footbridge/Kconfig"
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/core.c linux-2.6.15.snap/arch/arm/mach-ep93xx/core.c
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/core.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/core.c 2006-02-28 01:41:25.000000000 +0100
-@@ -0,0 +1,223 @@
-+/*
-+ * arch/arm/mach-ep93xx/core.c
-+ * Core routines for Cirrus EP93xx chips.
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * Thanks go to Michael Burian and Ray Lehtiniemi for their key
-+ * role in the ep93xx linux community.
-+ *
-+ * 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/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/spinlock.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/serial.h>
-+#include <linux/tty.h>
-+#include <linux/bitops.h>
-+#include <linux/serial.h>
-+#include <linux/serial_8250.h>
-+#include <linux/serial_core.h>
-+#include <linux/device.h>
-+#include <linux/mm.h>
-+#include <linux/time.h>
-+#include <linux/timex.h>
-+#include <linux/delay.h>
-+
-+#include <asm/types.h>
-+#include <asm/setup.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/system.h>
-+#include <asm/tlbflush.h>
-+#include <asm/pgtable.h>
-+#include <asm/io.h>
-+
-+#include <asm/mach/map.h>
-+#include <asm/mach/time.h>
-+#include <asm/mach/irq.h>
-+
-+#include <asm/hardware/amba.h>
-+#include <asm/hardware/vic.h>
-+
-+
-+/*************************************************************************
-+ * Static I/O mappings that are needed for all EP93xx platforms
-+ *************************************************************************/
-+static struct map_desc ep93xx_io_desc[] __initdata = {
-+ {
-+ .virtual = EP93XX_AHB_VIRT_BASE,
-+ .pfn = __phys_to_pfn(EP93XX_AHB_PHYS_BASE),
-+ .length = EP93XX_AHB_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = EP93XX_APB_VIRT_BASE,
-+ .pfn = __phys_to_pfn(EP93XX_APB_PHYS_BASE),
-+ .length = EP93XX_APB_SIZE,
-+ .type = MT_DEVICE,
-+ },
-+};
-+
-+void __init ep93xx_map_io(void)
-+{
-+ iotable_init(ep93xx_io_desc, ARRAY_SIZE(ep93xx_io_desc));
-+}
-+
-+
-+/*************************************************************************
-+ * Timer handling for EP93xx
-+ *************************************************************************
-+ * The ep93xx has four internal timers. Timers 1, 2 (both 16 bit) and
-+ * 3 (32 bit) count down at 508 kHz, are self-reloading, and can generate
-+ * an interrupt on underflow. Timer 4 (40 bit) counts down at 983.04 kHz,
-+ * is free-running, and can't generate interrupts.
-+ *
-+ * The 508 kHz timers are ideal for use for the timer interrupt, as the
-+ * most common values of HZ divide 508 kHz nicely. We pick one of the 16
-+ * bit timers (timer 1) since we don't need more than 16 bits of reload
-+ * value as long as HZ >= 8.
-+ *
-+ * The higher clock rate of timer 4 makes it a better choice than the
-+ * other timers for use in gettimeoffset(), while the fact that it can't
-+ * generate interrupts means we don't have to worry about not being able
-+ * to use this timer for something else. We also use timer 4 for keeping
-+ * track of lost jiffies.
-+ */
-+static unsigned int last_jiffy_time;
-+
-+#define TIMER4_TICKS_PER_JIFFY ((983040 + (HZ/2)) / HZ)
-+
-+static int ep93xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ write_seqlock(&xtime_lock);
-+
-+ __raw_writel(1, EP93XX_TIMER1_CLEAR);
-+ while (__raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time
-+ >= TIMER4_TICKS_PER_JIFFY) {
-+ last_jiffy_time += TIMER4_TICKS_PER_JIFFY;
-+ timer_tick(regs);
-+ }
-+
-+ write_sequnlock(&xtime_lock);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static struct irqaction ep93xx_timer_irq = {
-+ .name = "ep93xx timer",
-+ .flags = SA_INTERRUPT | SA_TIMER,
-+ .handler = ep93xx_timer_interrupt,
-+};
-+
-+static void __init ep93xx_timer_init(void)
-+{
-+ /* Enable periodic HZ timer. */
-+ __raw_writel(0x48, EP93XX_TIMER1_CONTROL);
-+ __raw_writel((CLOCK_TICK_RATE / HZ) - 1, EP93XX_TIMER1_LOAD);
-+ __raw_writel(0xc8, EP93XX_TIMER1_CONTROL);
-+
-+ /* Enable lost jiffy timer. */
-+ __raw_writel(0x100, EP93XX_TIMER4_VALUE_HIGH);
-+
-+ setup_irq(IRQ_EP93XX_TIMER1, &ep93xx_timer_irq);
-+}
-+
-+static unsigned long ep93xx_gettimeoffset(void)
-+{
-+ int offset;
-+
-+ offset = __raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time;
-+
-+ /* Calculate (1000000 / 983040) * offset. */
-+ return offset + (53 * offset / 3072);
-+}
-+
-+struct sys_timer ep93xx_timer = {
-+ .init = ep93xx_timer_init,
-+ .offset = ep93xx_gettimeoffset,
-+};
-+
-+
-+/*************************************************************************
-+ * EP93xx IRQ handling
-+ *************************************************************************/
-+void __init ep93xx_init_irq(void)
-+{
-+ vic_init((void *)EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK);
-+ vic_init((void *)EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK);
-+}
-+
-+
-+/*************************************************************************
-+ * EP93xx peripheral handling
-+ *************************************************************************/
-+static struct amba_device uart1_device = {
-+ .dev = {
-+ .bus_id = "apb:uart1",
-+ },
-+ .res = {
-+ .start = EP93XX_UART1_BASE,
-+ .end = EP93XX_UART1_BASE + 0xfff,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = { IRQ_EP93XX_UART1, NO_IRQ },
-+ .periphid = 0x0041010,
-+};
-+
-+static struct amba_device uart2_device = {
-+ .dev = {
-+ .bus_id = "apb:uart2",
-+ },
-+ .res = {
-+ .start = EP93XX_UART2_BASE,
-+ .end = EP93XX_UART2_BASE + 0xfff,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = { IRQ_EP93XX_UART2, NO_IRQ },
-+ .periphid = 0x0041010,
-+};
-+
-+static struct resource ep93xx_ohci_resources[] = {
-+ [0] = {
-+ .start = EP93XX_USB_BASE,
-+ .end = EP93XX_USB_BASE + 0xffff,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ [1] = {
-+ .start = IRQ_EP93XX_USB,
-+ .end = IRQ_EP93XX_USB,
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static struct platform_device ep93xx_ohci_device = {
-+ .name = "ep93xx-ohci",
-+ .id = -1,
-+ .dev = {
-+ .dma_mask = (void *)0xffffffff,
-+ .coherent_dma_mask = 0xffffffff,
-+ },
-+ .num_resources = ARRAY_SIZE(ep93xx_ohci_resources),
-+ .resource = ep93xx_ohci_resources,
-+};
-+
-+void __init ep93xx_init_devices(void)
-+{
-+#if 0
-+ __raw_writel(__raw_readl(EP93XX_SYSCON_CLOCK_CONTROL) |
-+ EP93XX_SYSCON_CLOCK_UARTBAUD,
-+ EP93XX_SYSCON_CLOCK_CONTROL);
-+#endif
-+
-+ amba_device_register(&uart1_device, &iomem_resource);
-+ amba_device_register(&uart2_device, &iomem_resource);
-+ platform_device_register(&ep93xx_ohci_device);
-+}
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/gesbc9312.c linux-2.6.15.snap/arch/arm/mach-ep93xx/gesbc9312.c
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/gesbc9312.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/gesbc9312.c 2006-02-20 22:30:19.000000000 +0100
-@@ -0,0 +1,40 @@
-+/*
-+ * arch/arm/mach-ep93xx/gesbc9312.c
-+ * Glomation GESBC-9312-sx support.
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/mtd/physmap.h>
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/mach-types.h>
-+#include <asm/mach/arch.h>
-+
-+static void __init gesbc9312_init_machine(void)
-+{
-+ ep93xx_init_devices();
-+ physmap_configure(0x60000000, 0x02000000, 1, NULL);
-+}
-+
-+MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx")
-+ /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
-+ .phys_io = EP93XX_APB_PHYS_BASE,
-+ .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
-+ .boot_params = 0x00000100,
-+ .map_io = ep93xx_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .timer = &ep93xx_timer,
-+ .init_machine = gesbc9312_init_machine,
-+MACHINE_END
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/Kconfig linux-2.6.15.snap/arch/arm/mach-ep93xx/Kconfig
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/Kconfig 2006-02-19 18:09:49.000000000 +0100
-@@ -0,0 +1,21 @@
-+if ARCH_EP93XX
-+
-+menu "Cirrus EP93xx Implementation Options"
-+
-+comment "EP93xx Platforms"
-+
-+config MACH_GESBC9312
-+ bool "Support Glomation GESBC-9312-sx"
-+ help
-+ Say 'Y' here if you want your kernel to support the Glomation
-+ GESBC-9312-sx board.
-+
-+config MACH_TS72XX
-+ bool "Support Technologic Systems TS-72xx SBC"
-+ help
-+ Say 'Y' here if you want your kernel to support the TS-72xx
-+ board.
-+
-+endmenu
-+
-+endif
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/Makefile linux-2.6.15.snap/arch/arm/mach-ep93xx/Makefile
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/Makefile 2006-02-19 17:47:43.000000000 +0100
-@@ -0,0 +1,10 @@
-+#
-+# Makefile for the linux kernel.
-+#
-+obj-y := core.o
-+obj-m :=
-+obj-n :=
-+obj- :=
-+
-+obj-$(CONFIG_MACH_GESBC9312) += gesbc9312.o
-+obj-$(CONFIG_MACH_TS72XX) += ts72xx.o
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/Makefile.boot linux-2.6.15.snap/arch/arm/mach-ep93xx/Makefile.boot
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/Makefile.boot 2006-02-19 22:04:54.000000000 +0100
-@@ -0,0 +1,2 @@
-+ zreladdr-y := 0x00008000
-+params_phys-y := 0x00000100
-diff -urN linux-2.6.15.commit/arch/arm/mach-ep93xx/ts72xx.c linux-2.6.15.snap/arch/arm/mach-ep93xx/ts72xx.c
---- linux-2.6.15.commit/arch/arm/mach-ep93xx/ts72xx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mach-ep93xx/ts72xx.c 2006-02-22 17:01:43.000000000 +0100
-@@ -0,0 +1,118 @@
-+/*
-+ * arch/arm/mach-ep93xx/ts72xx.c
-+ * Technologic Systems TS72xx SBC support.
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/mtd/physmap.h>
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/mach-types.h>
-+#include <asm/mach/arch.h>
-+#include <asm/mach/map.h>
-+
-+static struct map_desc ts72xx_io_desc[] __initdata = {
-+ {
-+ .virtual = TS72XX_MODEL_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_MODEL_PHYS_BASE),
-+ .length = TS72XX_MODEL_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_OPTIONS_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_OPTIONS_PHYS_BASE),
-+ .length = TS72XX_OPTIONS_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_OPTIONS2_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_OPTIONS2_PHYS_BASE),
-+ .length = TS72XX_OPTIONS2_SIZE,
-+ .type = MT_DEVICE,
-+ }
-+};
-+
-+static struct map_desc ts72xx_nand_io_desc[] __initdata = {
-+ {
-+ .virtual = TS72XX_NAND_DATA_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND1_DATA_PHYS_BASE),
-+ .length = TS72XX_NAND_DATA_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND1_CONTROL_PHYS_BASE),
-+ .length = TS72XX_NAND_CONTROL_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_NAND_BUSY_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND1_BUSY_PHYS_BASE),
-+ .length = TS72XX_NAND_BUSY_SIZE,
-+ .type = MT_DEVICE,
-+ }
-+};
-+
-+static struct map_desc ts72xx_alternate_nand_io_desc[] __initdata = {
-+ {
-+ .virtual = TS72XX_NAND_DATA_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND2_DATA_PHYS_BASE),
-+ .length = TS72XX_NAND_DATA_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_NAND_CONTROL_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND2_CONTROL_PHYS_BASE),
-+ .length = TS72XX_NAND_CONTROL_SIZE,
-+ .type = MT_DEVICE,
-+ }, {
-+ .virtual = TS72XX_NAND_BUSY_VIRT_BASE,
-+ .pfn = __phys_to_pfn(TS72XX_NAND2_BUSY_PHYS_BASE),
-+ .length = TS72XX_NAND_BUSY_SIZE,
-+ .type = MT_DEVICE,
-+ }
-+};
-+
-+static void __init ts72xx_map_io(void)
-+{
-+ ep93xx_map_io();
-+ iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc));
-+
-+ /*
-+ * The TS-7200 has NOR flash, the other models have NAND flash.
-+ */
-+ if (board_is_ts7200()) {
-+ physmap_configure(TS72XX_NOR_PHYS_BASE, 0x01000000, 1, NULL);
-+ } else {
-+ if (is_ts9420_installed()) {
-+ iotable_init(ts72xx_alternate_nand_io_desc,
-+ ARRAY_SIZE(ts72xx_alternate_nand_io_desc));
-+ } else {
-+ iotable_init(ts72xx_nand_io_desc,
-+ ARRAY_SIZE(ts72xx_nand_io_desc));
-+ }
-+ }
-+}
-+
-+static void __init ts72xx_init_machine(void)
-+{
-+ ep93xx_init_devices();
-+}
-+
-+MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")
-+ /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
-+ .phys_io = EP93XX_APB_PHYS_BASE,
-+ .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
-+ .boot_params = 0x00000100,
-+ .map_io = ts72xx_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .timer = &ep93xx_timer,
-+ .init_machine = ts72xx_init_machine,
-+MACHINE_END
-diff -urN linux-2.6.15.commit/arch/arm/Makefile linux-2.6.15.snap/arch/arm/Makefile
---- linux-2.6.15.commit/arch/arm/Makefile 2006-02-12 10:22:18.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/Makefile 2006-02-19 17:29:10.000000000 +0100
-@@ -102,6 +102,7 @@
- machine-$(CONFIG_ARCH_H720X) := h720x
- machine-$(CONFIG_ARCH_AAEC2000) := aaec2000
- machine-$(CONFIG_ARCH_REALVIEW) := realview
-+ machine-$(CONFIG_ARCH_EP93XX) := ep93xx
-
- ifeq ($(CONFIG_ARCH_EBSA110),y)
- # This is what happens if you forget the IOCS16 line.
-diff -urN linux-2.6.15.commit/arch/arm/mm/Kconfig linux-2.6.15.snap/arch/arm/mm/Kconfig
---- linux-2.6.15.commit/arch/arm/mm/Kconfig 2006-02-12 10:22:18.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/mm/Kconfig 2006-02-19 19:14:48.000000000 +0100
-@@ -62,7 +62,7 @@
- # ARM920T
- config CPU_ARM920T
- bool "Support ARM920T processor" if !ARCH_S3C2410
-- depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000
-+ depends on ARCH_EP93XX || ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000
- default y if ARCH_S3C2410
- select CPU_32v4
- select CPU_ABRT_EV4T
-diff -urN linux-2.6.15.commit/arch/arm/tools/mach-types linux-2.6.15.snap/arch/arm/tools/mach-types
---- linux-2.6.15.commit/arch/arm/tools/mach-types 2006-02-12 10:22:18.000000000 +0100
-+++ linux-2.6.15.snap/arch/arm/tools/mach-types 2006-02-19 19:49:29.000000000 +0100
-@@ -910,3 +910,4 @@
- nadia2vb MACH_NADIA2VB NADIA2VB 897
- r1000 MACH_R1000 R1000 898
- hw90250 MACH_HW90250 HW90250 899
-+gesbc9312 MACH_GESBC9312 GESBC9312 958
-diff -urN linux-2.6.15.commit/drivers/mtd/maps/physmap.c linux-2.6.15.snap/drivers/mtd/maps/physmap.c
---- linux-2.6.15.commit/drivers/mtd/maps/physmap.c 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/mtd/maps/physmap.c 2006-02-20 21:14:23.000000000 +0100
-@@ -51,6 +51,9 @@
- static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };
- const char **type;
-
-+ if (!physmap_map.size)
-+ return -EIO;
-+
- printk(KERN_NOTICE "physmap flash device: %lx at %lx\n", physmap_map.size, physmap_map.phys);
- physmap_map.virt = ioremap(physmap_map.phys, physmap_map.size);
-
-diff -urN linux-2.6.15.commit/drivers/mtd/nand/Kconfig linux-2.6.15.snap/drivers/mtd/nand/Kconfig
---- linux-2.6.15.commit/drivers/mtd/nand/Kconfig 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/mtd/nand/Kconfig 2006-02-20 21:20:41.000000000 +0100
-@@ -55,6 +55,12 @@
- help
- Support for NAND flash on Texas Instruments Toto platform.
-
-+config MTD_NAND_TS7250
-+ tristate "NAND Flash device on TS-7250 board"
-+ depends on MACH_TS72XX && MTD_NAND
-+ help
-+ Support for NAND flash on Technologic Systems TS-7250 platform.
-+
- config MTD_NAND_IDS
- tristate
-
-diff -urN linux-2.6.15.commit/drivers/mtd/nand/Makefile linux-2.6.15.snap/drivers/mtd/nand/Makefile
---- linux-2.6.15.commit/drivers/mtd/nand/Makefile 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/mtd/nand/Makefile 2006-02-20 21:19:38.000000000 +0100
-@@ -17,6 +17,7 @@
- obj-$(CONFIG_MTD_NAND_H1900) += h1910.o
- obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o
- obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o
-+obj-$(CONFIG_MTD_NAND_TS7250) += ts7250.o
- obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o
-
- nand-objs = nand_base.o nand_bbt.o
-diff -urN linux-2.6.15.commit/drivers/mtd/nand/ts7250.c linux-2.6.15.snap/drivers/mtd/nand/ts7250.c
---- linux-2.6.15.commit/drivers/mtd/nand/ts7250.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/drivers/mtd/nand/ts7250.c 2006-02-22 17:07:53.000000000 +0100
-@@ -0,0 +1,212 @@
-+/*
-+ * drivers/mtd/nand/ts7250.c
-+ *
-+ * Copyright (C) 2004 Technologic Systems (support@embeddedARM.com)
-+ *
-+ * Derived from drivers/mtd/nand/edb7312.c
-+ * Copyright (C) 2004 Marius Gröger (mag@sysgo.de)
-+ *
-+ * Derived from drivers/mtd/nand/autcpu12.c
-+ * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
-+ *
-+ * $Id: ts7250.c,v 1.4 2004/12/30 22:02:07 joff Exp $
-+ *
-+ * 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.
-+ *
-+ * Overview:
-+ * This is a device driver for the NAND flash device found on the
-+ * TS-7250 board which utilizes a Samsung 32 Mbyte part.
-+ */
-+
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/mtd/partitions.h>
-+#include <asm/io.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/sizes.h>
-+
-+/*
-+ * MTD structure for TS7250 board
-+ */
-+static struct mtd_info *ts7250_mtd = NULL;
-+
-+
-+/*
-+ * Module stuff
-+ */
-+static void *ts7250_nandctrl = (void *)TS72XX_NAND_CONTROL_VIRT_BASE;
-+static void *ts7250_nandbusy = (void *)TS72XX_NAND_BUSY_VIRT_BASE;
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+/*
-+ * Define static partitions for flash device
-+ */
-+static struct mtd_partition partition_info32[] = {
-+ {
-+ .name = "TS-BOOTROM",
-+ .offset = 0x00000000,
-+ .size = 0x00004000,
-+ }, {
-+ .name = "Linux",
-+ .offset = 0x00004000,
-+ .size = 0x01d00000,
-+ }, {
-+ .name = "RedBoot",
-+ .offset = 0x01d04000,
-+ .size = 0x002fc000,
-+ },
-+};
-+
-+/*
-+ * Define static partitions for flash device
-+ */
-+static struct mtd_partition partition_info128[] = {
-+ {
-+ .name = "TS-BOOTROM",
-+ .offset = 0x00000000,
-+ .size = 0x00004000,
-+ }, {
-+ .name = "Linux",
-+ .offset = 0x00004000,
-+ .size = 0x07d00000,
-+ }, {
-+ .name = "RedBoot",
-+ .offset = 0x07d04000,
-+ .size = 0x002fc000,
-+ },
-+};
-+
-+#define NUM_PARTITIONS 3
-+
-+extern int parse_cmdline_partitions(struct mtd_info *master,
-+ struct mtd_partition **pparts, const char *mtd_id);
-+#endif
-+
-+
-+/*
-+ * hardware specific access to control-lines
-+ */
-+static void ts7250_hwcontrol(struct mtd_info *mtd, int cmd)
-+{
-+ switch(cmd) {
-+ case NAND_CTL_SETCLE:
-+ writeb(readb(ts7250_nandctrl) | 0x2, ts7250_nandctrl);
-+ break;
-+ case NAND_CTL_CLRCLE:
-+ writeb(readb(ts7250_nandctrl) & ~0x2, ts7250_nandctrl);
-+ break;
-+ case NAND_CTL_SETALE:
-+ writeb(readb(ts7250_nandctrl) | 0x1, ts7250_nandctrl);
-+ break;
-+ case NAND_CTL_CLRALE:
-+ writeb(readb(ts7250_nandctrl) & ~0x1, ts7250_nandctrl);
-+ break;
-+ case NAND_CTL_SETNCE:
-+ writeb(readb(ts7250_nandctrl) | 0x4, ts7250_nandctrl);
-+ break;
-+ case NAND_CTL_CLRNCE:
-+ writeb(readb(ts7250_nandctrl) & ~0x4, ts7250_nandctrl);
-+ break;
-+ }
-+}
-+
-+/*
-+ * read device ready pin
-+ */
-+static int ts7250_device_ready(struct mtd_info *mtd)
-+{
-+ return readb(ts7250_nandbusy) & 0x20;
-+}
-+
-+/*
-+ * Main initialization routine
-+ */
-+static int __init ts7250_init (void)
-+{
-+ struct nand_chip *this;
-+ const char *part_type = 0;
-+ int mtd_parts_nb = 0;
-+ struct mtd_partition *mtd_parts = 0;
-+
-+ if (board_is_ts7200())
-+ return -ENXIO;
-+
-+ /* Allocate memory for MTD device structure and private data */
-+ ts7250_mtd = kmalloc(sizeof(struct mtd_info) +
-+ sizeof(struct nand_chip), GFP_KERNEL);
-+ if (!ts7250_mtd) {
-+ printk("Unable to allocate TS7250 NAND MTD device structure.\n");
-+ return -ENOMEM;
-+ }
-+
-+ /* Get pointer to private data */
-+ this = (struct nand_chip *) (&ts7250_mtd[1]);
-+
-+ /* Initialize structures */
-+ memset(ts7250_mtd, 0, sizeof(struct mtd_info));
-+ memset(this, 0, sizeof(struct nand_chip));
-+
-+ /* Link the private data with the MTD structure */
-+ ts7250_mtd->priv = this;
-+
-+ /* insert callbacks */
-+ this->IO_ADDR_R = (void *)TS72XX_NAND_DATA_VIRT_BASE;
-+ this->IO_ADDR_W = (void *)TS72XX_NAND_DATA_VIRT_BASE;
-+ this->hwcontrol = ts7250_hwcontrol;
-+ this->dev_ready = ts7250_device_ready;
-+ this->chip_delay = 15;
-+ this->eccmode = NAND_ECC_SOFT;
-+
-+ printk("Searching for NAND flash...\n");
-+ /* Scan to find existence of the device */
-+ if (nand_scan (ts7250_mtd, 1)) {
-+ kfree (ts7250_mtd);
-+ return -ENXIO;
-+ }
-+
-+#ifdef CONFIG_MTD_CMDLINE_PARTS
-+ mtd_parts_nb = parse_cmdline_partitions(ts7250_mtd, &mtd_parts,
-+ "ts7250-nand");
-+ if (mtd_parts_nb > 0)
-+ part_type = "command line";
-+ else
-+ mtd_parts_nb = 0;
-+#endif
-+ if (mtd_parts_nb == 0) {
-+ mtd_parts = partition_info32;
-+ if (ts7250_mtd->size >= (128 * 0x100000))
-+ mtd_parts = partition_info128;
-+ mtd_parts_nb = NUM_PARTITIONS;
-+ part_type = "static";
-+ }
-+
-+ /* Register the partitions */
-+ printk(KERN_NOTICE "Using %s partition definition\n", part_type);
-+ add_mtd_partitions(ts7250_mtd, mtd_parts, mtd_parts_nb);
-+
-+ /* Return happy */
-+ return 0;
-+}
-+module_init(ts7250_init);
-+
-+/*
-+ * Clean up routine
-+ */
-+static void __exit ts7250_cleanup (void)
-+{
-+ /* Unregister the device */
-+ del_mtd_device (ts7250_mtd);
-+
-+ /* Free the MTD device structure */
-+ kfree (ts7250_mtd);
-+}
-+module_exit(ts7250_cleanup);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jesse Off <joff@embeddedARM.com>");
-+MODULE_DESCRIPTION("MTD map driver for Technologic Systems TS-7250 board");
-diff -urN linux-2.6.15.commit/drivers/net/arm/ep93xx_eth_need_rewrite.c linux-2.6.15.snap/drivers/net/arm/ep93xx_eth_need_rewrite.c
---- linux-2.6.15.commit/drivers/net/arm/ep93xx_eth_need_rewrite.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/drivers/net/arm/ep93xx_eth_need_rewrite.c 2006-02-22 15:54:07.000000000 +0100
-@@ -0,0 +1,1417 @@
-+/*
-+ * ep93xx_eth.c
-+ * Ethernet Device Driver for Cirrus Logic EP93xx.
-+ *
-+ * Copyright (C) 2003 by Cirrus Logic www.cirrus.com
-+ * This software may be used and distributed according to the terms
-+ * of the GNU Public License.
-+ *
-+ * This driver was written based on skeleton.c by Donald Becker and
-+ * smc9194.c by Erik Stahlman.
-+ *
-+ * Getting a MAC address:
-+ *
-+ * Former versions of this driver got their MAC from I2C EEPROM or even used
-+ * hardcoded ones. Unfortunately I had to remove the board dependant I2C stuff,
-+ * and use a random generated MAC instead of the hardcoded one. Good news is
-+ * the there is support for setting the MAC from userspace now. (see below)
-+ *
-+ * first consider some potential problems if you use this random generated MAC:
-+ *
-+ * you can no longer count on it to be really unique
-+ * identifying a particular board over network will be difficult
-+ * DHCP servers can no longer use the MAC for assigning static IPs
-+ * DHCP servers with long leasetimes quickly run out of leases
-+ * ...
-+ *
-+ * So how can you set a valid MAC from userspace then?
-+ *
-+ * Let's say you've just bought your OUI from IEEE and it's "aa:bb:cc"
-+ * Now you'd like to assign the MAC for your EP93xx board with serial #5
-+ * MAC = OUI<<24 + serial number = aa:bb:cc:00:00:05
-+ *
-+ * ifconfig eth0 hw ether aa:bb:cc:00:00:05 # first set the MAC
-+ * ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up # then set the IP
-+ *
-+ * Apart from hardcoding this lines in your startup scripts you could also use
-+ * some userspace utility to read (and set) the MAC from eeprom, flash, ...
-+ *
-+ * History:
-+ * 07/19/01 0.1 Sungwook Kim initial release
-+ * 10/16/01 0.2 Sungwook Kim add workaround for ignorance of Tx request
-+ * while sending frame
-+ * add some error stuations handling
-+ *
-+ * 03/25/03 Melody Lee Modified for EP93xx
-+ *
-+ * 2004/2005 Michael Burian porting to linux-2.6
-+ * 2005-10-12 Michael Burian fix problems when setting MAC with ifconfig
-+ * 2005-10-30 Michael Burian cleanups, ethtool support
-+ */
-+
-+/* TODO:
-+ * 1. try if it's possible to use skbuff directly for RX/TX (avoid memcpy)
-+ * 2. use kzalloc instead of kmalloc+memset
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/fcntl.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <linux/in.h>
-+#include <linux/delay.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/mii.h>
-+#include <linux/crc32.h>
-+#include <linux/random.h>
-+#include <linux/ethtool.h>
-+
-+#include <asm/system.h>
-+#include <asm/bitops.h>
-+#include <asm/io.h>
-+#include <asm/dma.h>
-+#include <asm/irq.h>
-+#include <asm/arch/hardware.h>
-+
-+#include "ep93xx_eth_need_rewrite.h"
-+
-+#define DRV_NAME "ep93xx_eth"
-+#define DRV_VERSION "2.8"
-+#define DRV_DATE "2005-11-08"
-+
-+static const char *version = DRV_NAME ": version " DRV_VERSION " " DRV_DATE \
-+ " Cirrus Logic\n";
-+
-+/* total number of device instance, 0 means the 1st instance. */
-+static int num_of_instance;
-+static struct net_device * ep93xx_etherdev;
-+
-+/*
-+ * A List of default device port configuration for auto probing.
-+ * At this time, the CPU has only one Ethernet device,
-+ * but better to support multiple device configuration.
-+ * Keep in mind that the array must end in zero.
-+ */
-+
-+/* We get the MAC_BASE from include/asm-arm/arch-ep93xx/regmap.h */
-+static struct {
-+ unsigned int base_addr; /* base address, (0:end mark) */
-+ int irq; /* IRQ number, (0:auto detect) */
-+} port_list[] __initdata = {
-+ { EP93XX_ETHERNET_BASE, IRQ_EP93XX_ETHERNET },
-+ { 0 /* end mark */ , 0 },
-+};
-+
-+/*
-+ * Some definitions belong to the operation of this driver.
-+ * You should understand how it affect to driver before any modification.
-+ */
-+
-+/* Interrupt Sources in Use */
-+#define DEF_INT_SRC (IntEn_TxSQIE|IntEn_RxEOFIE|IntEn_RxEOBIE|IntEn_RxHDRIE)
-+
-+/*
-+ * Length of Device Queue in number of entries
-+ * (must be less than or equal to 255)
-+ */
-+
-+/* length of Rx Descriptor Queue (4 or bigger) Must be power of 2. */
-+#define LQRXD 64
-+#define LQRXS LQRXD /* length of Rx Status Queue */
-+
-+/* length of Tx Descriptor Queue (4 or bigger) Must be power of 2. */
-+#define LQTXD 8
-+#define LQTXS LQTXD /* length of Tx Status Queue */
-+
-+/* Tx Queue fill-up level control */
-+#define LVL_TXSTOP LQTXD - 2 /* level to ask the stack to stop Tx */
-+#define LVL_TXRESUME 2 /* level to ask the stack to resume Tx */
-+
-+/* Rx Buffer length in byte */
-+#define LRXB (1518+2+16) /* length of Rx buf, must be 4-byte aligned */
-+#define LTXB LRXB
-+
-+#define EP93XX_DEF_MSG (NETIF_MSG_DRV | \
-+ NETIF_MSG_PROBE | \
-+ NETIF_MSG_LINK | \
-+ NETIF_MSG_RX_ERR | \
-+ NETIF_MSG_TX_ERR | \
-+ NETIF_MSG_HW)
-+
-+#define DBG(lvl,msg,args...) do { printk(lvl"%s:%d: %s(): " msg, __FILE__, \
-+ __LINE__, __FUNCTION__, ## args); } while (0)
-+
-+/*
-+ * Custom Data Structures
-+ */
-+
-+/*
-+ * the information about the buffer passed to device.
-+ * there are matching bufdsc informations
-+ * for each Tx/Rx Descriptor Queue entry to trace
-+ * the buffer within those queues.
-+ */
-+struct bufdsc {
-+ /* virtual address representing the buffer passed to device */
-+ void *vaddr;
-+ /* free routine */
-+ int (*free_rout) (void *buf);
-+};
-+
-+/* device private information */
-+struct ep93xx_priv {
-+ /* static device information */
-+ int id; /* device instance ID */
-+ /* pointers to various queues (virtual address) */
-+ struct rx_dsc *rdq; /* Rx Descriptor Queue */
-+ struct rx_sts *rsq; /* Rx Status Queue */
-+ struct tx_dsc *tdq; /* Tx Descriptor Queue */
-+ struct tx_sts *tsq; /* Tx Status Queue */
-+ unsigned char *rxbuf; /* base of Rx Buffer pool */
-+ unsigned char *txbuf; /* base of Tx Buffer pool */
-+ struct bufdsc *rxbd; /* Rx Buffers info */
-+ struct bufdsc *txbd; /* Tx Buffers info */
-+ /* physical addresses of the same queues */
-+ dma_addr_t p_qbase; /* base */
-+ dma_addr_t p_rdq; /* Rx Descriptor Queue */
-+ dma_addr_t p_rsq; /* Rx Status Queue */
-+ dma_addr_t p_tdq; /* Tx Descriptor Queue */
-+ dma_addr_t p_tsq; /* Tx Status Queue */
-+ dma_addr_t p_rxbuf; /* Rx Buffer pool */
-+ dma_addr_t p_txbuf; /* Tx Buffer pool */
-+ /* MII Bus ID of Ethernet PHY */
-+ struct mii_if_info mii;
-+ /* lock for mii when using ioctls */
-+ spinlock_t mii_lock;
-+ /* dynamic information, subject to clear when device open */
-+ struct net_device_stats stats; /* statistic data */
-+ /* next processing index of device queues */
-+ int idx_rdq;
-+ int idx_rsq;
-+ int idx_tdqhead;
-+ int idx_tdqtail;
-+ int idx_tsq;
-+ void __iomem *base_addr; /* base address */
-+ u32 msg_enable;
-+ int regs_len;
-+};
-+
-+/*
-+ * Internal Routines
-+ */
-+
-+static inline unsigned int next_index(unsigned int idx_cur, unsigned int len)
-+{
-+ return (idx_cur + 1) % len; /* next array index */
-+}
-+
-+static inline u32 _rdl(struct net_device *dev, u32 reg)
-+{
-+ return readl(((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrl(struct net_device *dev, u32 val, u32 reg)
-+{
-+ writel(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrw(struct net_device *dev, u16 val, u32 reg)
-+{
-+ writew(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrb(struct net_device *dev, u8 val, u32 reg)
-+{
-+ writeb(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+/**
-+ * wait_on_reg()
-+ */
-+static int wait_on_reg(struct net_device *dev, int reg, unsigned long mask, unsigned long expect)
-+{
-+ int i, dt;
-+
-+ for (i = 0; i < 10000; i++) {
-+ dt = _rdl(dev, reg);
-+ dt = (dt ^ expect) & mask;
-+ if (0 == dt)
-+ break;
-+ }
-+ return dt;
-+}
-+
-+/**
-+ * mdio_write()
-+ */
-+static void mdio_write(struct net_device *dev, int idPhy, int reg, int dt)
-+{
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ _wrl(dev, dt, REG_MIIData);
-+ _wrl(dev, MIICmd_OP_WR | ((idPhy & 0x1f) << 5) | ((reg & 0x1f) << 0), REG_MIICmd);
-+}
-+
-+/**
-+ * mdio_read()
-+ */
-+static int mdio_read(struct net_device *dev, int idPhy, int reg)
-+{
-+ int dt;
-+
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ _wrl(dev, MIICmd_OP_RD | ((idPhy & 0x1f) << 5) | ((reg & 0x1f) << 0), REG_MIICmd);
-+
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ dt = _rdl(dev, REG_MIIData);
-+
-+ return dt & 0xffff;
-+}
-+
-+/**
-+ * phy_init()
-+ */
-+static void phy_init(struct net_device *dev)
-+{
-+
-+ u32 oldval;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ oldval = _rdl(dev, REG_SelfCTL);
-+
-+#if 0
-+ /* Set MDC clock to be divided by 8 and disable PreambleSuppress bit */
-+ _wrl(dev, 0x0e00, REG_SelfCTL);
-+#else
-+ /* Set MDC clock to be divided by 32 and disable PreambleSuppress bit */
-+ _wrl(dev, 0x6200, REG_SelfCTL);
-+#endif
-+
-+ if (mii_link_ok(&(priv->mii)))
-+ mii_check_media(&(priv->mii), netif_msg_link(priv), 1);
-+
-+ /* restore the old value */
-+ _wrl(dev, oldval, REG_SelfCTL);
-+}
-+
-+/**
-+ * devQue_start()
-+ *
-+ * make descriptor queues active
-+ * allocate queue entries if needed
-+ * and set device registers up to make it operational
-+ * assume device has been initialized
-+ */
-+static int devQue_start(struct net_device *dev)
-+{
-+ int err;
-+ int i;
-+ void *buf;
-+ u32 phy_addr;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* turn off device bus mastering */
-+ _wrl(dev, BMCtl_RxDis | BMCtl_TxDis | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+ err = wait_on_reg(dev, REG_BMSts, BMSts_TxAct, ~BMSts_TxAct);
-+ err |= wait_on_reg(dev, REG_BMSts, BMSts_RxAct, ~BMSts_RxAct);
-+ if (err && netif_msg_hw(priv))
-+ DBG(KERN_ERR, "%s: BM does not stop\n", dev->name);
-+
-+ /* Tx Status Queue */
-+ memset(priv->tsq, 0, sizeof(priv->tsq[0]) * LQTXS);
-+ priv->idx_tsq = 0;
-+ _wrl(dev, priv->p_tsq, REG_TxSBA);
-+ _wrl(dev, priv->p_tsq, REG_TxSCA);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSBL);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSCL);
-+
-+ /* Tx Descriptor Queue */
-+ memset(priv->tdq, 0, sizeof(priv->tdq[0]) * LQTXD);
-+ priv->idx_tdqhead = priv->idx_tdqtail = 0;
-+ _wrl(dev, priv->p_tdq, REG_TxDBA);
-+ _wrl(dev, priv->p_tdq, REG_TxDCA);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDBL);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDCL);
-+
-+ /* Rx Status Queue */
-+ memset(priv->rsq, 0, sizeof(priv->rsq[0]) * LQRXS);
-+ priv->idx_rsq = 0;
-+ _wrl(dev, priv->p_rsq, REG_RxSBA);
-+ _wrl(dev, priv->p_rsq, REG_RxSCA);
-+ _wrw(dev, sizeof(priv->rsq[0]) * LQRXS, REG_RxSBL);
-+ _wrw(dev, sizeof(priv->rsq[0]) * LQRXS, REG_RxSCL);
-+
-+ /* Rx Descriptor Queue */
-+ memset(priv->rdq, 0, sizeof(priv->rdq[0]) * LQRXD);
-+ phy_addr = priv->p_rxbuf;
-+ for (i = 0; i < LQRXD; i++) {
-+ priv->rdq[i].bi = i; /* index */
-+ priv->rdq[i].ba = phy_addr; /* physical address */
-+ priv->rdq[i].bl = LRXB; /* length */
-+ phy_addr += LRXB;
-+ }
-+ priv->idx_rdq = 0;
-+ _wrl(dev, priv->p_rdq, REG_RxDBA);
-+ _wrl(dev, priv->p_rdq, REG_RxDCA);
-+ _wrw(dev, sizeof(priv->rdq[0]) * LQRXD, REG_RxDBL);
-+ _wrw(dev, sizeof(priv->rdq[0]) * LQRXD, REG_RxDCL);
-+
-+ /* init Rx Buffer Descriptors */
-+ buf = priv->rxbuf;
-+ for (i = 0; i < LQRXD; i++) {
-+ priv->rxbd[i].vaddr = buf;
-+ priv->rxbd[i].free_rout = NULL;
-+ buf += LRXB;
-+ }
-+
-+ /* init Tx Buffer Descriptors */
-+ memset(priv->txbd, 0x0, sizeof(*priv->txbd) * LQTXD);
-+
-+ buf = priv->txbuf;
-+ for (i = 0; i < LQTXD; i++) {
-+ priv->txbd[i].vaddr = buf;
-+ priv->txbd[i].free_rout = NULL;
-+ buf += LTXB;
-+ }
-+
-+ /* turn on device bus mastering */
-+ _wrl(dev, BMCtl_TxEn | BMCtl_RxEn | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+ err = wait_on_reg(dev, REG_BMSts, BMSts_TxAct | BMSts_TxAct, BMSts_TxAct | BMSts_TxAct);
-+ if (err && netif_msg_hw(priv))
-+ DBG(KERN_ERR, "%s: BM does not start\n", dev->name);
-+
-+ /* Enqueue whole entries; this must be done after BM activation */
-+ _wrl(dev, LQRXS, REG_RxSEQ); /* Rx Status Queue */
-+ _wrl(dev, LQRXD, REG_RxDEQ); /* Rx Desc. queue */
-+
-+ return 0;
-+}
-+
-+/**
-+ * devQue_init()
-+ * init device descriptor queues at system level
-+ * device access is not recommended at this point
-+ *
-+ */
-+static int devQue_init(struct net_device *dev)
-+{
-+ void *buf;
-+ void *tmp;
-+ int size, size2;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* verify device Tx/Rx Descriptor/Status Queue data size */
-+ if (8 != sizeof(struct rx_dsc)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof rx_dsc != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (8 != sizeof(struct rx_sts)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof rx_sts != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (8 != sizeof(struct tx_dsc)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof tx_dsc != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (4 != sizeof(struct tx_sts)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof tx_sts != 4 bytes!\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ allocate kernel memory for whole queues
-+ best if non-cached memory block due to DMA access by the device
-+ if CPU doesn't have bus snooping
-+ */
-+ size = sizeof(struct rx_dsc) * (LQRXD + 1) +
-+ sizeof(struct rx_sts) * (LQRXS + 1) +
-+ sizeof(struct tx_dsc) * (LQTXD + 1) +
-+ sizeof(struct tx_sts) * (LQTXS + 1) + sizeof(unsigned long) * 4;
-+
-+ buf = tmp = dma_alloc_coherent(NULL, size, &priv->p_qbase, GFP_KERNEL | GFP_DMA);
-+ if (!buf) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for queue\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ * assign memory to each queue
-+ */
-+ priv->rdq = buf;
-+ buf = buf + sizeof(struct rx_dsc) * (LQRXD + 1);
-+ priv->rsq = buf;
-+ buf = buf + sizeof(struct rx_sts) * (LQRXS + 1);
-+ priv->tdq = buf;
-+ buf = buf + sizeof(struct tx_dsc) * (LQTXD + 1);
-+ priv->tsq = buf;
-+ buf = buf + sizeof(struct tx_sts) * (LQTXS + 1);
-+
-+ /*
-+ * store physical address of each queue
-+ */
-+ priv->p_rdq = priv->p_qbase;
-+ priv->p_rsq = priv->p_rdq + ((u32) priv->rsq - (u32) priv->rdq);
-+ priv->p_tdq = priv->p_rdq + ((u32) priv->tdq - (u32) priv->rdq);
-+ priv->p_tsq = priv->p_rdq + ((u32) priv->tsq - (u32) priv->rdq);
-+
-+ /*
-+ * init queue entries
-+ */
-+ memset(priv->rdq, 0, sizeof(struct rx_dsc) * LQRXD);
-+ memset(priv->rsq, 0, sizeof(struct rx_sts) * LQRXS);
-+ memset(priv->tdq, 0, sizeof(struct tx_dsc) * LQTXD);
-+ memset(priv->tsq, 0, sizeof(struct tx_sts) * LQTXS);
-+
-+ /* Allocate Rx Buffer
-+ (We might need to copy from Rx buf to skbuff in whatever case,
-+ because device bus master requires 32bit aligned Rx buffer address
-+ but Linux network stack requires odd 16bit aligned Rx buf address) */
-+ priv->rxbuf = dma_alloc_coherent(NULL, LRXB * LQRXD, &priv->p_rxbuf, GFP_KERNEL | GFP_DMA);
-+
-+ if (!priv->rxbuf) {
-+ priv->rxbuf = NULL;
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for RxBuf\n");
-+ goto err_free_qbase_1;
-+ }
-+
-+ /* Allocate Tx Buffer */
-+ priv->txbuf = dma_alloc_coherent(NULL, LTXB * LQTXD, &priv->p_txbuf, GFP_KERNEL | GFP_DMA);
-+
-+ if (!priv->txbuf) {
-+ priv->txbuf = NULL;
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for TxBuf\n");
-+ goto err_free_rxbuf_2;
-+ }
-+
-+ /*
-+ * allocate kernel memory for buffer descriptors
-+ */
-+ size2 = sizeof(struct bufdsc) * (LQRXD + LQTXD);
-+ buf = kmalloc(size2, GFP_KERNEL);
-+ if (!buf) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for buf desc\n");
-+ goto err_free_txbuf_3;
-+ }
-+ memset(buf, 0x0, size2); /* clear with 0 */
-+ priv->rxbd = buf;
-+ priv->txbd = buf + sizeof(struct bufdsc) * LQRXD;
-+
-+ return 0;
-+
-+err_free_txbuf_3:
-+ dma_free_coherent(NULL, LTXB * LQTXD, priv->txbuf, priv->p_txbuf);
-+err_free_rxbuf_2:
-+ dma_free_coherent(NULL, LRXB * LQRXD, priv->rxbuf, priv->p_rxbuf);
-+err_free_qbase_1:
-+ dma_free_coherent(NULL, size, tmp, priv->p_qbase);
-+ return -ENOMEM;
-+}
-+
-+/**
-+ * devQue_cleanup()
-+ * Release queue, Tx buffers and Rx buffers memory
-+ * Only call after unregister_netdev
-+ */
-+static void devQue_cleanup(struct net_device *dev)
-+{
-+ int size;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* descriptor queues size */
-+ size = sizeof(struct rx_dsc) * (LQRXD + 1) +
-+ sizeof(struct rx_sts) * (LQRXS + 1) +
-+ sizeof(struct tx_dsc) * (LQTXD + 1) +
-+ sizeof(struct tx_sts) * (LQTXS + 1) + sizeof(unsigned long) * 4;
-+
-+ dma_free_coherent(NULL, size, priv->rdq, priv->p_qbase);
-+ dma_free_coherent(NULL, LTXB * LQTXD, priv->txbuf, priv->p_txbuf);
-+ dma_free_coherent(NULL, LRXB * LQRXD, priv->rxbuf, priv->p_rxbuf);
-+ kfree(priv->rxbd);
-+
-+}
-+
-+/**
-+ * set_multicast_tbl()
-+ */
-+static void set_multicast_tbl(struct net_device *dev, u8 *buf)
-+{
-+ int i;
-+ unsigned char position;
-+ struct dev_mc_list *cur_addr;
-+
-+ memset(buf, 0x00, 8);
-+
-+ cur_addr = dev->mc_list;
-+ for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) {
-+
-+ if (!cur_addr)
-+ break;
-+ if (!(*cur_addr->dmi_addr & 1))
-+ continue; /* make sure multicast addr */
-+ position = ether_crc_le(6, cur_addr->dmi_addr) >> 26;
-+ buf[position >> 3] |= 1 << (position & 0x07);
-+ }
-+}
-+
-+/**
-+ * ind_addr_wr()
-+ */
-+static int ind_addr_wr(struct net_device *dev, int afp, char *buf)
-+{
-+ u32 rxctl;
-+ int i, len;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ afp &= 0x07;
-+ if (4 == afp || 5 == afp) {
-+ if (netif_msg_hw(priv))
-+ DBG(KERN_ERR, "invalid afp value\n");
-+ return -1;
-+ }
-+ len = (AFP_AFP_HASH == afp) ? 8 : 6;
-+
-+ rxctl = _rdl(dev, REG_RxCTL); /* turn Rx off */
-+ _wrl(dev, ~RxCTL_SRxON & rxctl, REG_RxCTL);
-+ _wrl(dev, afp, REG_AFP); /* load new address pattern */
-+ for (i = 0; i < len; i++)
-+ _wrb(dev, buf[i], REG_IndAD + i);
-+ _wrl(dev, rxctl, REG_RxCTL); /* turn Rx back */
-+
-+ return 0;
-+}
-+
-+/**
-+ * rx_ctl()
-+ */
-+static int rx_ctl(struct net_device *dev, int sw)
-+{
-+ unsigned long tmp = _rdl(dev, REG_RxCTL);
-+
-+ /*
-+ * Workaround for MAC lost 60-byte-long frames:
-+ * must enable Runt_CRC_Accept bit
-+ */
-+ if (sw)
-+ _wrl(dev, tmp | RxCTL_SRxON | RxCTL_RCRCA, REG_RxCTL);
-+ else
-+ _wrl(dev, tmp & ~RxCTL_SRxON, REG_RxCTL);
-+
-+ return 0;
-+}
-+
-+/**
-+ * chk_tx_lvl()
-+ */
-+static void chk_tx_lvl(struct net_device *dev)
-+{
-+ int filled;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* check Tx Descriptor Queue fill-up level */
-+ filled = priv->idx_tdqhead - priv->idx_tdqtail;
-+ if (filled < 0)
-+ filled += LQTXD;
-+
-+ if (filled <= (LVL_TXRESUME + 1))
-+ netif_wake_queue(dev);
-+}
-+
-+/**
-+ * cleanup_tx()
-+ */
-+static void cleanup_tx(struct net_device *dev)
-+{
-+ struct tx_sts *txsts;
-+ int idxsts, bi;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /*
-+ * process Tx Status Queue (no need to limit processing of TxStatus
-+ * Queue because each queue entry consist of 1 dword)
-+ */
-+ while (priv->tsq[priv->idx_tsq].flags & TXSTS_TXFP) {
-+ idxsts = priv->idx_tsq;
-+ priv->idx_tsq = next_index(priv->idx_tsq, LQTXS);
-+ txsts = &priv->tsq[idxsts];
-+ if (!(txsts->flags & TXSTS_TXFP)) { /* empty? */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "QueTxSts is empty\n");
-+ return;
-+ }
-+ txsts->flags &= ~TXSTS_TXFP; /* mark processed */
-+
-+ bi = txsts->bi & TXSTS_BI; /* buffer index */
-+
-+ /* statistics collection */
-+ if (txsts->flags & TXSTS_TXWE) { /* Sent without error */
-+ priv->stats.tx_packets++;
-+ priv->stats.tx_bytes += ((struct tx_dsc *)(priv->txbd[bi].vaddr))->bl_af & TXDSC_BL;
-+ } else { /* Tx failed due to error */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "Tx failed QueTxSts");
-+ priv->stats.tx_errors++;
-+ if (txsts->flags & TXSTS_LCRS)
-+ priv->stats.tx_carrier_errors++;
-+ if (txsts->flags & TXSTS_TXU)
-+ priv->stats.tx_fifo_errors++;
-+ if (txsts->flags & TXSTS_ECOLL)
-+ priv->stats.collisions++;
-+ }
-+
-+ /* free Tx buffer */
-+ if (priv->txbd[bi].free_rout) {
-+ (*priv->txbd[bi].free_rout)(priv->txbd[bi].vaddr);
-+ priv->txbd[bi].free_rout = NULL;
-+ }
-+
-+ /* ahead Tx Descriptor Queue tail index */
-+ priv->idx_tdqtail = next_index(priv->idx_tdqtail, LQTXD);
-+ }
-+}
-+
-+/**
-+ * restart_tx()
-+ */
-+static int restart_tx(struct net_device *dev)
-+{
-+ int i;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* disable int */
-+
-+ /* turn off master INT control */
-+ _wrl(dev, _rdl(dev, REG_GIntMsk) & ~GIntMsk_IntEn, REG_GIntMsk);
-+
-+ /* stop Tx and disable Tx DMA */
-+ _wrl(dev, _rdl(dev, REG_TxCTL) & ~TxCTL_STxON, REG_TxCTL);
-+ _wrl(dev, _rdl(dev, REG_BMCtl) | BMCtl_TxDis, REG_BMCtl);
-+
-+ /* reset Tx DMA */
-+ _wrl(dev, BMCtl_TxChR | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+
-+ /* release Tx buffers */
-+ for (i = 0; i < LQTXD; i++) {
-+ if (priv->txbd[i].free_rout) {
-+ priv->txbd[i].free_rout(priv->txbd[i].vaddr);
-+ priv->txbd[i].free_rout = NULL;
-+ }
-+ priv->stats.tx_dropped++;
-+ }
-+
-+ /* init Tx Queues and flush cache */
-+ memset(priv->tsq, 0, sizeof(priv->tsq[0]) * LQTXS);
-+
-+ /* init variables */
-+ priv->idx_tsq = priv->idx_tdqhead = priv->idx_tdqtail = 0;
-+
-+ /* init registers */
-+ wait_on_reg(dev, REG_BMSts, BMCtl_TxChR, ~BMCtl_TxChR);
-+ _wrl(dev, priv->p_tsq, REG_TxSBA);
-+ _wrl(dev, priv->p_tsq, REG_TxSCA);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSBL);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSCL);
-+ _wrl(dev, priv->p_tdq, REG_TxDBA);
-+ _wrl(dev, priv->p_tdq, REG_TxDCA);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDBL);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDCL);
-+
-+ /* start Tx and enable Tx DMA */
-+ _wrl(dev, _rdl(dev, REG_TxCTL) | TxCTL_STxON, REG_TxCTL);
-+ _wrl(dev, _rdl(dev, REG_BMCtl) | BMCtl_TxEn, REG_BMCtl);
-+
-+ /* enable int again */
-+ _wrl(dev, _rdl(dev, REG_GIntMsk) | GIntMsk_IntEn, REG_GIntMsk);
-+
-+ return 0;
-+}
-+
-+/**
-+ * reset()
-+ */
-+static void reset(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ /* soft reset command */
-+ _wrb(dev, SelfCTL_RESET, REG_SelfCTL);
-+ if (wait_on_reg(dev, REG_SelfCTL, SelfCTL_RESET, ~SelfCTL_RESET))
-+ if (netif_msg_drv(priv))
-+ DBG(KERN_WARNING, "Soft Reset does not self-clear\n");
-+}
-+
-+/**
-+ * eth_shutdown()- closes down the Ethernet module
-+ *
-+ * Make sure to:
-+ * 1. disable all interrupt mask
-+ * 2. disable Rx
-+ * 3. disable Tx
-+ *
-+ * TODO:
-+ * (1) maybe utilize power down mode.
-+ * Why not yet? Because while the chip will go into power down mode,
-+ * the manual says that it will wake up in response to any I/O requests
-+ * in the register space. Empirical results do not show this working.
-+ */
-+static int eth_shutdown(struct net_device *dev)
-+{
-+ reset(dev);
-+ return 0;
-+}
-+
-+/**
-+ * eth_init() - Reset and initialize the device.
-+ *
-+ * Device should be initialized enough to function in polling mode.
-+ * Tx and Rx must be disabled and no INT generation.
-+ */
-+static int eth_init(struct net_device *dev)
-+{
-+ /* reset device */
-+ reset(dev);
-+
-+ /* init PHY */
-+ phy_init(dev);
-+
-+ /* init MAC */
-+
-+ /*i Set MDC clock to be divided by 8 and enable PreambleSuppress bit */
-+ _wrl(dev, 0x0f00, REG_SelfCTL);
-+ /* mask Interrupt */
-+ _wrl(dev, 0x00, REG_GIntMsk);
-+ /* no Rx on at this point */
-+ _wrl(dev, RxCTL_BA | RxCTL_IA0, REG_RxCTL);
-+ _wrl(dev, 0x00, REG_TxCTL);
-+ _wrl(dev, 0x00, REG_GT);
-+ _wrl(dev, 0x00, REG_BMCtl);
-+ /* Buffer Threshold */
-+ _wrl(dev, (0x80 << 16) | (0x40 << 0), REG_RxBTH);
-+ _wrl(dev, (0x80 << 16) | (0x40 << 0), REG_TxBTH);
-+ /* Status Threshold */
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_RxSTH);
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_TxSTH);
-+ /* Descriptor Threshold */
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_RxDTH);
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_TxDTH);
-+ /* Max Frame Length & Tx Start Threshold */
-+ _wrl(dev, ((1518 + 1) << 16) | (944 << 0), REG_MaxFL);
-+
-+ _rdl(dev, REG_TxCollCnt); /* clear Tx Collision Count */
-+ _rdl(dev, REG_RxMissCnt); /* clear Rx Miss Counter */
-+ _rdl(dev, REG_RxRntCnt); /* clear Rx Runt Counter */
-+
-+ /* clear Pending INT */
-+ _rdl(dev, REG_IntStsC);
-+ /* Tx on */
-+ _wrl(dev, TxCTL_STxON | _rdl(dev, REG_TxCTL), REG_TxCTL);
-+
-+ /* Set MAC address */
-+ ind_addr_wr(dev, AFP_AFP_IA0, &dev->dev_addr[0]);
-+
-+ /* init queue */
-+ devQue_start(dev);
-+
-+ return 0;
-+}
-+
-+/**
-+ * rx_isr() - Receive Interrupt Service Routine
-+ */
-+static void rx_isr(struct net_device *dev)
-+{
-+ struct rx_sts *rxsts;
-+ /* index of Rx Status Queue Head from device (next put point) */
-+ int idx_rsqhead;
-+ int idxsts;
-+ int cnt_sts_processed, cnt_desc_processed;
-+ char *dest;
-+ struct sk_buff *skb;
-+ int len;
-+ unsigned int dt;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* get Current Rx Status Queue pointer */
-+ dt = _rdl(dev, REG_RxSCA);
-+
-+ /* convert to array index */
-+ idx_rsqhead = (dt - priv->p_rsq) / sizeof(priv->rsq[0]);
-+ if (!(0 <= idx_rsqhead && idx_rsqhead < LQRXS)) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, " invalid REG_RxSCA\n");
-+ return;
-+ }
-+
-+ /* process Rx (limit to idx_rsqhead due to cache) */
-+ cnt_sts_processed = cnt_desc_processed = 0;
-+ while (idx_rsqhead != priv->idx_rsq) {
-+ idxsts = priv->idx_rsq;
-+ priv->idx_rsq = next_index(priv->idx_rsq, LQRXS);
-+ rxsts = &priv->rsq[idxsts];
-+ if (!(rxsts->w1 & RXSTS_RFP)) { /* empty? */
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "QueRxSts empty\n");
-+ return;
-+ }
-+ rxsts->w1 &= ~RXSTS_RFP; /* mark processed */
-+
-+ cnt_sts_processed++;
-+
-+ if (!(rxsts->w1 & RXSTS_EOB)) /* buffer has no data */
-+ continue;
-+
-+ if ((rxsts->bi & RXSTS_BI) != priv->idx_rdq) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "unmatching idx_rdq\n");
-+ continue;
-+ }
-+ priv->idx_rdq = next_index(priv->idx_rdq, LQRXD);
-+ cnt_desc_processed++;
-+
-+ /* received a frame with error */
-+ if (!((rxsts->w1 & RXSTS_EOF) && (rxsts->w1 & RXSTS_RWE))) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_WARNING, "Rx error RxSts\n");
-+ priv->stats.rx_errors++;
-+ if (rxsts->w1 & RXSTS_OE)
-+ priv->stats.rx_fifo_errors++;
-+ if (rxsts->w1 & RXSTS_FE)
-+ priv->stats.rx_frame_errors++;
-+ if ((rxsts->w1 & RXSTS_RUNT) || (rxsts->w1 & RXSTS_EDATA))
-+ priv->stats.rx_length_errors++;
-+ if (rxsts->w1 & RXSTS_CRCE)
-+ priv->stats.rx_crc_errors++;
-+ continue;
-+ }
-+
-+ len = rxsts->fl;
-+
-+ /* alloc buffer for protocal stack */
-+ skb = dev_alloc_skb(len + 5);
-+ if (NULL == skb) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "Low Memory, Rx dropped\n");
-+ priv->stats.rx_dropped++;
-+ continue;
-+ }
-+
-+ /* odd 16 bit alignment to make protocal stack happy */
-+ skb_reserve(skb, 2);
-+ skb->dev = dev;
-+ dest = skb_put(skb, len);
-+ memcpy(dest, priv->rxbd[(rxsts->bi & RXSTS_BI)].vaddr, len);
-+ skb->protocol = eth_type_trans(skb, dev);
-+ /* pass Rx packet to system */
-+ netif_rx(skb);
-+ dev->last_rx = jiffies;
-+ priv->stats.rx_packets++;
-+ priv->stats.rx_bytes += len;
-+ if (RXSTS_AM == (rxsts->w1 & RXSTS_AM))
-+ priv->stats.multicast++;
-+ }
-+
-+ /* enqueue */
-+ _wrl(dev, cnt_sts_processed, REG_RxSEQ);
-+ _wrl(dev, cnt_desc_processed, REG_RxDEQ);
-+}
-+
-+/**
-+ * tx_isr() - Transmit Interrupt Service Routine
-+ */
-+static int tx_isr(struct net_device *dev)
-+{
-+ cleanup_tx(dev);
-+ chk_tx_lvl(dev); /* resume Tx if it was stopped */
-+ return 0;
-+}
-+
-+/**
-+ * ep93xx_isr()
-+ */
-+static irqreturn_t ep93xx_isr(int irq, void *dev_id, struct pt_regs *pRegs)
-+{
-+ struct net_device *dev = dev_id;
-+ int lpCnt;
-+ u32 intS;
-+
-+ lpCnt = 0;
-+ do {
-+ /* get INT status and then clear */
-+ intS = _rdl(dev, REG_IntStsC);
-+
-+ if (!intS)
-+ break; /* no INT */
-+ if (IntSts_RxSQ & intS)
-+ rx_isr(dev); /* Rx INT */
-+ if (IntSts_TxSQ & intS)
-+ tx_isr(dev); /* Tx INT */
-+ } while (lpCnt++ < 64); /* limit loop to serve other interrupts too */
-+ return IRQ_HANDLED;
-+}
-+
-+/* Exposed Driver Routines to the Outside World */
-+
-+/**
-+ * ep93xx_get_stats()
-+ */
-+static struct net_device_stats *ep93xx_get_stats(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return &priv->stats;
-+}
-+
-+/**
-+ * ep93xx_set_multicast_list()
-+ */
-+static void ep93xx_set_multicast_list(struct net_device *dev)
-+{
-+ u8 tbl[8 + 1];
-+
-+ if (IFF_PROMISC & dev->flags) {
-+ _wrl(dev, RxCTL_PA | _rdl(dev, REG_RxCTL), REG_RxCTL);
-+
-+ } else if (IFF_ALLMULTI & dev->flags) { /* receive all multicast addr */
-+ _wrl(dev, RxCTL_MA | (~RxCTL_PA & _rdl(dev, REG_RxCTL)), REG_RxCTL);
-+ memset(tbl, 0xff, 8);
-+ ind_addr_wr(dev, AFP_AFP_HASH, &tbl[0]);
-+
-+ } else if (dev->mc_count) { /* set H/W multicasting filter */
-+ _wrl(dev, RxCTL_MA | (~RxCTL_PA & _rdl(dev, REG_RxCTL)), REG_RxCTL);
-+ set_multicast_tbl(dev, &tbl[0]);
-+ ind_addr_wr(dev, AFP_AFP_HASH, &tbl[0]);
-+
-+ } else { /* no multicasting */
-+ _wrl(dev, ~(RxCTL_PA | RxCTL_MA) & _rdl(dev, REG_RxCTL), REG_RxCTL);
-+ }
-+}
-+
-+/**
-+ * ep93xx_tx_timeout()
-+ */
-+static void ep93xx_tx_timeout(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ /* If we get here, some higher level has decided we are broken.
-+ There should really be a "kick me" function call instead. */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_WARNING, "transmit timed out\n");
-+
-+ phy_init(dev);
-+
-+ /* kick Tx engine */
-+ restart_tx(dev);
-+
-+ /* ask the Network Stack to resume Tx if there is room available */
-+ chk_tx_lvl(dev);
-+}
-+
-+/**
-+ * ep93xx_start_xmit()
-+ */
-+static int ep93xx_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+/* @swk check H/W defect of Tx Underrun Error caused by certain frame length */
-+ struct tx_dsc *txdsc;
-+ int idx_tdqhd;
-+ int filled;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ idx_tdqhd = priv->idx_tdqhead;
-+ txdsc = &priv->tdq[idx_tdqhd];
-+
-+ /* check Tx Descriptor Queue fill-up level */
-+ filled = idx_tdqhd - priv->idx_tdqtail;
-+ if (filled < 0)
-+ filled += LQTXD;
-+ filled += 1;
-+
-+ /* check Queue level */
-+ if (LVL_TXSTOP <= filled) {
-+ netif_stop_queue(dev); /* no more Tx allowed */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_INFO, "%s: Tx STOP requested\n", dev->name);
-+ if (LVL_TXSTOP < filled) {
-+ /* this situation can not be happen */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "%s: Tx Request while stopped\n", dev->name);
-+ return NETDEV_TX_BUSY;
-+ }
-+ }
-+
-+ /* fill up Tx Descriptor Queue entry */
-+ if (skb->len < ETH_ZLEN) {
-+ txdsc->bl_af = ETH_ZLEN & TXDSC_BL; /* also clears AF! */
-+ skb = skb_padto(skb, ETH_ZLEN);
-+ if (skb == NULL)
-+ return NETDEV_TX_OK;
-+ } else {
-+ txdsc->bl_af = skb->len & TXDSC_BL; /* also clears AF! */
-+ }
-+ txdsc->ba = priv->p_txbuf + (idx_tdqhd * LTXB);
-+ txdsc->bi_eof = (idx_tdqhd & TXDSC_BI) | TXDSC_EOF;
-+
-+ dev->trans_start = jiffies;
-+
-+ /* copy data to Tx buffer */
-+ memcpy(priv->txbd[idx_tdqhd].vaddr, skb->data, skb->len);
-+ priv->txbd[idx_tdqhd].free_rout = NULL;
-+
-+ /* Free the data buffer passed by upper layer */
-+ dev_kfree_skb_any(skb);
-+
-+ /* ahead Tx Desc Queue */
-+ priv->idx_tdqhead = next_index(priv->idx_tdqhead, LQTXD);
-+ wmb();
-+
-+ /* Enqueue a Tx Descriptor to the device */
-+ _wrl(dev, 1, REG_TxDEQ);
-+
-+ if (netif_msg_tx_queued(priv))
-+ DBG(KERN_DEBUG, "%s: Tx packet queued\n", dev->name);
-+
-+ return NETDEV_TX_OK;
-+}
-+
-+/**
-+ * ep93xx_close()
-+ *
-+ * this makes the board clean up everything that it can
-+ * and not talk to the outside world. Caused by
-+ *. an 'ifconfig ethX down'
-+ */
-+static int ep93xx_close(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ free_irq(dev->irq, dev);
-+
-+ netif_stop_queue(dev);
-+ eth_shutdown(dev);
-+
-+ if (netif_msg_ifdown(priv))
-+ DBG(KERN_INFO, "%s: ep93xx_close()\n", dev->name);
-+
-+ return 0;
-+}
-+
-+/**
-+ * ep93xx_open() - Open and Initialize the board
-+ *
-+ * Set up everything, reset the card, etc ..
-+ */
-+static int ep93xx_open(struct net_device *dev)
-+{
-+ int status;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* clear dynamic device info */
-+ memset(&priv->stats, 0, sizeof(priv->stats));
-+ priv->idx_rdq = 0;
-+ priv->idx_rsq = 0;
-+ priv->idx_tdqhead = 0;
-+ priv->idx_tdqtail = 0;
-+ priv->idx_tsq = 0;
-+
-+ /* reset/init device */
-+ status = eth_init(dev);
-+ if (status != 0) {
-+ return -EAGAIN;
-+ }
-+
-+ /* turn on INT, turn on Rx */
-+ status = request_irq(dev->irq, &ep93xx_isr, 0, DRV_NAME, dev);
-+ if (status) {
-+ if (netif_msg_ifup(priv))
-+ DBG(KERN_ERR, "%s: unable to get IRQ\n", dev->name);
-+ return status;
-+ }
-+
-+ /* Enable interrupt driven operation. Also turn on Rx but no Tx. */
-+ /* setup Interrupt sources */
-+ _wrl(dev, DEF_INT_SRC, REG_IntEn);
-+ /* turn on INT */
-+ _wrl(dev, GIntMsk_IntEn, REG_GIntMsk);
-+ /* turn on Rx */
-+ rx_ctl(dev, 1);
-+
-+ /* link to upper layer */
-+ netif_start_queue(dev);
-+
-+ if (netif_msg_ifup(priv))
-+ DBG(KERN_INFO, "%s: irq=%d\n", dev->name, dev->irq);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ int rc;
-+
-+ if (!netif_running(dev))
-+ return -EINVAL;
-+
-+ spin_lock_irq(&priv->mii_lock);
-+ rc = generic_mii_ioctl(&priv->mii, if_mii(rq), cmd, NULL);
-+ spin_unlock_irq(&priv->mii_lock);
-+
-+ return rc;
-+}
-+
-+/*
-+ * Ethtool support
-+ */
-+
-+static void ep93xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-+{
-+ strcpy(info->driver, DRV_NAME);
-+ strcpy(info->version, DRV_VERSION);
-+}
-+
-+static int ep93xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ spin_lock_irq(&priv->mii_lock);
-+ mii_ethtool_gset(&priv->mii, cmd);
-+ spin_unlock_irq(&priv->mii_lock);
-+ return 0;
-+}
-+
-+static int ep93xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ int rc;
-+ spin_lock_irq(&priv->mii_lock);
-+ rc = mii_ethtool_sset(&priv->mii, cmd);
-+ spin_unlock_irq(&priv->mii_lock);
-+ return rc;
-+}
-+
-+static int ep93xx_nway_reset(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return mii_nway_restart(&priv->mii);
-+}
-+
-+static u32 ep93xx_get_link(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return mii_link_ok(&priv->mii);
-+}
-+
-+static u32 ep93xx_get_msglevel(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return priv->msg_enable;
-+}
-+
-+static void ep93xx_set_msglevel(struct net_device *dev, u32 datum)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ priv->msg_enable = datum;
-+}
-+
-+static void ep93xx_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ spin_lock_irq(&priv->mii_lock);
-+ memcpy_fromio(regbuf, priv->base_addr, regs->len);
-+ spin_unlock_irq(&priv->mii_lock);
-+}
-+
-+static int ep93xx_get_regs_len(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return priv->regs_len;
-+}
-+
-+static struct ethtool_ops ep93xx_ethtool_ops = {
-+ .get_drvinfo = ep93xx_get_drvinfo,
-+ .get_settings = ep93xx_get_settings,
-+ .set_settings = ep93xx_set_settings,
-+ .get_regs = ep93xx_get_regs,
-+ .get_regs_len = ep93xx_get_regs_len,
-+ .nway_reset = ep93xx_nway_reset,
-+ .get_link = ep93xx_get_link,
-+ .get_msglevel = ep93xx_get_msglevel,
-+ .set_msglevel = ep93xx_set_msglevel,
-+};
-+
-+/**
-+ * driver_init() - Logical driver initialization for an individual device
-+ *
-+ * Minimum device H/W access at this point
-+ *
-+ * Task:
-+ * Initialize the structure if needed
-+ * print out my vanity message if not done so already
-+ * print out what type of hardware is detected
-+ * print out the ethernet address
-+ * find the IRQ
-+ * set up my private data
-+ * configure the dev structure with my subroutines
-+ * actually GRAB the irq.
-+ * GRAB the region
-+ *
-+ */
-+static int __init driver_init(struct net_device *dev, u32 baseA, int irq)
-+{
-+ int i;
-+ struct resource *res;
-+ struct sockaddr sa;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ if (0 == num_of_instance)
-+ printk("%s", version);
-+
-+ /* skip probing for a second one, we _know_ that it does not exist */
-+ if (1 == num_of_instance)
-+ return -ENODEV;
-+
-+ memset(dev->priv, 0x00, sizeof(struct ep93xx_priv));
-+
-+ /* device instance ID */
-+ priv->id = num_of_instance;
-+
-+ /* mii stuff */
-+ spin_lock_init(&priv->mii_lock);
-+ priv->mii.dev = dev;
-+ priv->mii.mdio_read = mdio_read;
-+ priv->mii.mdio_write = mdio_write;
-+ priv->mii.phy_id_mask = 0x1f;
-+ priv->mii.reg_num_mask = 0x1f;
-+ priv->msg_enable = EP93XX_DEF_MSG;
-+ priv->regs_len = DEV_REG_SPACE;
-+
-+ priv->base_addr = (void *)(baseA);
-+
-+ dev->irq = irq;
-+
-+ res = request_mem_region(baseA, DEV_REG_SPACE, DRV_NAME);
-+ if (res == NULL) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "request_mem_region failed!\n");
-+ goto err_free_priv_1;
-+ }
-+
-+ dev->open = &ep93xx_open;
-+ dev->stop = &ep93xx_close;
-+ dev->do_ioctl = &ep93xx_ioctl;
-+ dev->hard_start_xmit = &ep93xx_start_xmit;
-+ dev->tx_timeout = &ep93xx_tx_timeout;
-+ dev->watchdog_timeo = HZ * 5;
-+ dev->get_stats = &ep93xx_get_stats;
-+ dev->set_multicast_list = &ep93xx_set_multicast_list;
-+ dev->ethtool_ops = &ep93xx_ethtool_ops;
-+
-+ ether_setup(dev);
-+
-+ if (devQue_init(dev))
-+ goto err_free_bd_memregion_irq_2;
-+
-+ reset(dev);
-+
-+ /*
-+ * use a random MAC for now -
-+ * don't forget to set a valid MAC later on with ifconfig
-+ */
-+ sa.sa_family = AF_INET;
-+// random_ether_addr(sa.sa_data);
-+ memcpy(sa.sa_data, "\x00\xd0\x69\x40\x2b\x13", 6);
-+ dev->set_mac_address(dev, &sa);
-+
-+ if (netif_msg_probe(priv)) {
-+ printk(KERN_INFO DRV_NAME ": #%d at 0x%p IRQ:%d\n", priv->id, priv->base_addr, dev->irq);
-+ printk(KERN_INFO DRV_NAME ": using random number");
-+ for (i = 0; i < 6; i++)
-+ printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
-+
-+ printk(" as MAC, don't forget to assign a valid MAC later!\n");
-+ }
-+ num_of_instance++;
-+ return 0;
-+
-+err_free_bd_memregion_irq_2:
-+ kfree(priv->rxbd);
-+ disable_irq(dev->irq);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+err_free_priv_1:
-+ kfree(dev->priv);
-+ return -EAGAIN;
-+}
-+
-+/**
-+ * ep93xx_probe - probe for ep93xx device
-+ *
-+ * Probe for the one (and only) ethernet device found on
-+ * EP93xx SOC CPU.
-+ */
-+static int __init ep93xx_probe(void)
-+{
-+ int err;
-+ struct ep93xx_priv *priv;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct ep93xx_priv));
-+
-+ if (!dev)
-+ return -ENODEV;
-+
-+ priv = netdev_priv(dev);
-+
-+ SET_MODULE_OWNER(dev);
-+
-+ sprintf(dev->name, "eth0");
-+
-+ priv->base_addr = (void *)(port_list[0].base_addr);
-+
-+ dev->irq = port_list[0].irq;
-+
-+ err = driver_init(dev, (u32)priv->base_addr, dev->irq);
-+ if (err)
-+ goto err_free_netdev;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto err_free_memregion_irq_1;
-+
-+ ep93xx_etherdev = dev;
-+ disable_irq(dev->irq);
-+ return 0;
-+
-+err_free_memregion_irq_1:
-+ kfree(priv->rxbd);
-+ disable_irq(dev->irq);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+err_free_netdev:
-+ free_netdev(dev);
-+ return err;
-+}
-+
-+static void __exit ep93xx_exit(void)
-+{
-+ struct net_device *dev = ep93xx_etherdev;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ if (dev) {
-+ unregister_netdev(dev);
-+ devQue_cleanup(dev);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+ free_netdev(dev);
-+ }
-+}
-+
-+module_init(ep93xx_probe);
-+module_exit(ep93xx_exit);
-+MODULE_LICENSE("GPL");
-diff -urN linux-2.6.15.commit/drivers/net/arm/ep93xx_eth_need_rewrite.h linux-2.6.15.snap/drivers/net/arm/ep93xx_eth_need_rewrite.h
---- linux-2.6.15.commit/drivers/net/arm/ep93xx_eth_need_rewrite.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/drivers/net/arm/ep93xx_eth_need_rewrite.h 2006-02-20 00:09:48.000000000 +0100
-@@ -0,0 +1,355 @@
-+/*
-+ * ep93xx_eth.h
-+ * : header file of Ethernet Device Driver for Cirrus Logic EP93xx.
-+ *
-+ * Copyright (C) 2003 by Cirrus Logic www.cirrus.com
-+ * This software may be used and distributed according to the terms
-+ * of the GNU Public License.
-+ *
-+ * This file contains device related information like register info
-+ * and register access method macros for the Ethernet device
-+ * embedded within Cirrus Logic's EP93xx SOC chip.
-+ *
-+ * Information contained in this file was obtained from
-+ * the EP9312 Manual Revision 0.12 and 0.14 from Cirrus Logic.
-+ *
-+ * History
-+ * 05/18/01 Sungwook Kim Initial release
-+ * 03/25/2003 Melody Modified for EP92xx
-+ */
-+
-+#ifndef _EP93xx_ETH_H_
-+#define _EP93xx_ETH_H_
-+
-+/*
-+ * Definition of the registers.
-+ * For details, refer to the datasheet .
-+ *
-+ * Basically, most registers are 32 bits width register.
-+ * But some are 16 bits and some are 6 or 8 bytes long.
-+ */
-+
-+#define REG_RxCTL 0x0000 /*offset to Receiver Control Reg */
-+#define RxCTL_PauseA (1<<20)
-+#define RxCTL_RxFCE1 (1<<19)
-+#define RxCTL_RxFCE0 (1<<18)
-+#define RxCTL_BCRC (1<<17)
-+#define RxCTL_SRxON (1<<16)
-+#define RxCTL_RCRCA (1<<13)
-+#define RxCTL_RA (1<<12)
-+#define RxCTL_PA (1<<11)
-+#define RxCTL_BA (1<<10)
-+#define RxCTL_MA (1<<9)
-+#define RxCTL_IAHA (1<<8)
-+#define RxCTL_IA3 (1<<3)
-+#define RxCTL_IA2 (1<<2)
-+#define RxCTL_IA1 (1<<1)
-+#define RxCTL_IA0 (1<<0)
-+
-+#define REG_TxCTL 0x0004 /*offset to Transmit Control Reg */
-+#define TxCTL_DefDis (1<<7)
-+#define TxCTL_MBE (1<<6)
-+#define TxCTL_ICRC (1<<5)
-+#define TxCTL_TxPD (1<<5)
-+#define TxCTL_OColl (1<<3)
-+#define TxCTL_SP (1<<2)
-+#define TxCTL_PB (1<<1)
-+#define TxCTL_STxON (1<<0)
-+
-+#define REG_TestCTL 0x0008 /*Test Control Reg, R/W */
-+#define TestCTL_MACF (1<<7)
-+#define TestCTL_MFDX (1<<6)
-+#define TestCTL_DB (1<<5)
-+#define TestCTL_MIIF (1<<4)
-+
-+#define REG_MIICmd 0x0010 /*offset to MII Command Reg, R/W */
-+#define MIICmd_OP (0x03<<14)
-+#define MIICmd_OP_RD (2<<14)
-+#define MIICmd_OP_WR (1<<14)
-+#define MIICmd_PHYAD (0x1f<<5)
-+#define MIICmd_REGAD (0x1f<<0)
-+
-+#define REG_MIIData 0x0014 /*offset to MII Data Reg, R/W */
-+#define MIIData_MIIData (0xffff<<0)
-+
-+#define REG_MIISts 0x0018 /*offset to MII Status Reg, R */
-+#define MIISts_Busy (1<<0)
-+
-+#define REG_SelfCTL 0x0020 /*offset to Self Control Reg */
-+#define SelfCTL_RWP (1<<7) /*Remote Wake Pin */
-+#define SelfCTL_GPO0 (1<<5)
-+#define SelfCTL_PUWE (1<<4)
-+#define SelfCTL_PDWE (1<<3)
-+#define SelfCTL_MIIL (1<<2)
-+#define SelfCTL_RESET (1<<0)
-+
-+#define REG_IntEn 0x0024 /*Interrupt Enable Reg, R/W */
-+#define IntEn_RWIE (1<<30)
-+#define IntEn_RxMIE (1<<29)
-+#define IntEn_RxBIE (1<<28)
-+#define IntEn_RxSQIE (1<<27)
-+#define IntEn_TxLEIE (1<<26)
-+#define IntEn_ECIE (1<<25)
-+#define IntEn_TxUHIE (1<<24)
-+#define IntEn_MOIE (1<<18)
-+#define IntEn_TxCOIE (1<<17)
-+#define IntEn_RxROIE (1<<16)
-+#define IntEn_MIIIE (1<<12)
-+#define IntEn_PHYSIE (1<<11)
-+#define IntEn_TIE (1<<10)
-+#define IntEn_SWIE (1<<8)
-+#define IntEn_TxSQIE (1<<3)
-+#define IntEn_RxEOFIE (1<<2)
-+#define IntEn_RxEOBIE (1<<1)
-+#define IntEn_RxHDRIE (1<<0)
-+
-+#define REG_IntStsP 0x0028 /*offset to Interrupt Status Preserve Reg, R/W */
-+#define REG_IntStsC 0x002c /*offset to Interrupt Status Clear Reg, R */
-+#define IntSts_RWI (1<<30)
-+#define IntSts_RxMI (1<<29)
-+#define IntSts_RxBI (1<<28)
-+#define IntSts_RxSQI (1<<27)
-+#define IntSts_TxLEI (1<<26)
-+#define IntSts_ECI (1<<25)
-+#define IntSts_TxUHI (1<<24)
-+#define IntSts_MOI (1<<18)
-+#define IntSts_TxCOI (1<<17)
-+#define IntSts_RxROI (1<<16)
-+#define IntSts_MIII (1<<12)
-+#define IntSts_PHYSI (1<<11)
-+#define IntSts_TI (1<<10)
-+#define IntSts_AHBE (1<<9)
-+#define IntSts_SWI (1<<8)
-+#define IntSts_OTHER (1<<4)
-+#define IntSts_TxSQ (1<<3)
-+#define IntSts_RxSQ (1<<2)
-+
-+#define REG_GT 0x0040 /*offset to General Timer Reg */
-+#define GT_GTC (0xffff<<16)
-+#define GT_GTP (0xffff<<0)
-+
-+#define REG_FCT 0x0044 /*offset to Flow Control Timer Reg */
-+#define FCT_FCT (0x00ffffff<<0)
-+
-+#define REG_FCF 0x0048 /*offset to Flow Control Format Reg */
-+#define FCF_MACCT (0xffff<<16)
-+#define FCF_TPT (0xffff<<0)
-+
-+#define REG_AFP 0x004c /*offset to Address Filter Pointer Reg */
-+#define AFP_AFP (0x07<<0) /*Address Filter Pointer
-+ (bank control for REG_IndAD) */
-+#define AFP_AFP_IA0 0 /*Primary Individual Address (MAC Addr) */
-+#define AFP_AFP_IA1 1 /*Individual Address 1 */
-+#define AFP_AFP_IA2 2 /*Individual Address 2 */
-+#define AFP_AFP_IA3 3 /*Individual Address 3 */
-+#define AFP_AFP_DTxP 6 /*Destination Address of Tx Pause Frame */
-+#define AFP_AFP_HASH 7 /*Hash Table */
-+
-+#define REG_IndAD 0x0050 /*offset to Individual Address Reg,
-+ n bytes, R/W */
-+
-+#define REG_GIntSts 0x0060 /*offset to Global Interrupt
-+ Status Reg (writing 1 will clear) */
-+#define REG_GIntROS 0x0068 /*offset to Global Interrupt
-+ Status Read Only Reg */
-+#define GIntSts_INT (1<<15) /*Global Interrupt Request Status */
-+
-+#define REG_GIntMsk 0x0064 /*offset to Global Interrupt Mask Reg */
-+#define GIntMsk_IntEn (1<<15) /*Global Interrupt Enable */
-+
-+#define REG_GIntFrc 0x006c /*offset to Global Interrupt Force Reg */
-+#define GIntFrc_INT (1<<15) /*Force to set GIntSts */
-+
-+#define REG_TxCollCnt 0x0070 /*Transmit Collision Count Reg, R */
-+#define REG_RxMissCnt 0x0074 /*Receive Miss Count Reg, R */
-+#define REG_RxRntCnt 0x0078 /*Receive Runt Count Reg, R */
-+
-+#define REG_BMCtl 0x0080 /*offset to Bus Master Control Reg, R/W */
-+#define BMCtl_MT (1<<13)
-+#define BMCtl_TT (1<<12)
-+#define BMCtl_UnH (1<<11)
-+#define BMCtl_TxChR (1<<10)
-+#define BMCtl_TxDis (1<<9)
-+#define BMCtl_TxEn (1<<8)
-+#define BMCtl_EH2 (1<<6)
-+#define BMCtl_EH1 (1<<5)
-+#define BMCtl_EEOB (1<<4)
-+#define BMCtl_RxChR (1<<2)
-+#define BMCtl_RxDis (1<<1)
-+#define BMCtl_RxEn (1<<0)
-+
-+#define REG_BMSts 0x0084 /*offset to Bus Master Status Reg, R */
-+#define BMSts_TxAct (1<<7)
-+#define BMSts_TP (1<<4)
-+#define BMSts_RxAct (1<<3)
-+#define BMSts_QID (0x07<<0)
-+#define BMSts_QID_RxDt (0<<0)
-+#define BMSts_QID_TxDt (1<<0)
-+#define BMSts_QID_RxSts (2<<0)
-+#define BMSts_QID_TxSts (3<<0)
-+#define BMSts_QID_RxDesc (4<<0)
-+#define BMSts_QID_TxDesc (5<<0)
-+
-+#define REG_RBCA 0x0088 /*offset to Receive Buffer
-+ Current Address Reg, R */
-+#define REG_TBCA 0x008c /*offset to Transmit Buffer
-+ Current Address Reg, R */
-+
-+#define REG_RxDBA 0x0090 /*offset to Receive Descriptor Queue
-+ Base Address Reg, R/W */
-+#define REG_RxDBL 0x0094 /*offset to Receive Descriptor Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_RxDCL 0x0096 /*offset to Receive Descriptor Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_RxDCA 0x0098 /*offset to Receive Descriptor Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxDEQ 0x009c /*offset to Receive Descriptor
-+ Enqueue Reg, R/W */
-+#define RxDEQ_RDV (0xffff<<16) /*R 16bit; Receive Descriptor Value */
-+#define RxDEQ_RDI (0xff<<0) /*W 8bit; Receive Descriptor Increment */
-+
-+#define REG_RxSBA 0x00a0 /*offset to Receive Status Queue
-+ Base Address Reg, R/W */
-+#define REG_RxSBL 0x00a4 /*offset to Receive Status Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_RxSCL 0x00a6 /*offset to Receive Status Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_RxSCA 0x00a8 /*offset to Receive Status Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxSEQ 0x00ac /*offset to Receive Status Queue
-+ Current Address Reg, R/W */
-+#define RxSEQ_RSV (0xffff<<16)
-+#define RxSEQ_RSI (0xff<<0)
-+
-+#define REG_TxDBA 0x00b0 /*offset to Transmit Descriptor Queue
-+ Base Address Reg, R/W */
-+#define REG_TxDBL 0x00b4 /*offset to Transmit Descriptor Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_TxDCL 0x00b6 /*offset to Transmit Descriptor Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_TxDCA 0x00b8 /*offset to Transmit Descriptor Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_TxDEQ 0x00bc /*offset to Transmit Descriptor Queue
-+ Current Address Reg, R/W */
-+#define TxDEQ_TDV (0xffff<<16)
-+#define TxDEQ_TDI (0xff<<0)
-+
-+#define REG_TxSBA 0x00c0 /*offset to Transmit Status Queue
-+ Base Address Reg, R/W */
-+#define REG_TxSBL 0x00c4 /*offset to Transmit Status Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_TxSCL 0x00c6 /*offset to Transmit Status Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_TxSCA 0x00c8 /*offset to Transmit Status Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxBTH 0x00d0 /*offset to Receive Buffer
-+ Threshold Reg, R/W */
-+#define RxBTH_RDHT (0x03ff<<16)
-+#define RxBTH_RDST (0x03ff<<0)
-+
-+#define REG_TxBTH 0x00d4 /*offset to Transmit Buffer
-+ Threshold Reg, R/W */
-+#define TxBTH_TDHT (0x03ff<<16)
-+#define TxBTH_TDST (0x03ff<<0)
-+
-+#define REG_RxSTH 0x00d8 /*offset to Receive Status
-+ Threshold Reg, R/W */
-+#define RxSTH_RSHT (0x003f<<16)
-+#define RxSTH_RSST (0x003f<<0)
-+
-+#define REG_TxSTH 0x00dc /*offset to Transmit Status
-+ Threshold Reg, R/W */
-+#define TxSTH_TSHT (0x003f<<16)
-+#define TxSTH_TSST (0x003f<<0)
-+
-+#define REG_RxDTH 0x00e0 /*offset to Receive Descriptor
-+ Threshold Reg, R/W */
-+#define RxDTH_RDHT (0x003f<<16)
-+#define RxDTH_RDST (0x003f<<0)
-+
-+#define REG_TxDTH 0x00e4 /*offset to Transmit Descriptor
-+ Threshold Reg, R/W */
-+#define TxDTH_TDHT (0x003f<<16)
-+#define TxDTH_TDST (0x003f<<0)
-+
-+#define REG_MaxFL 0x00e8 /*offset to Max Frame Length Reg, R/W */
-+#define MaxFL_MFL (0x07ff<<16)
-+#define MaxFL_TST (0x07ff<<0)
-+
-+#define REG_RxHL 0x00ec /*offset to Receive Header Length Reg, R/W */
-+#define RxHL_RHL2 (0x07ff<<16)
-+#define RxHL_RHL1 (0x03ff<<0)
-+
-+#define REG_MACCFG0 0x0100 /*offset to Test Reg #0, R/W */
-+#define MACCFG0_DbgSel (1<<7)
-+#define MACCFG0_LCKEN (1<<6)
-+#define MACCFG0_LRATE (1<<5)
-+#define MACCFG0_RXERR (1<<4)
-+#define MACCFG0_BIT33 (1<<2)
-+#define MACCFG0_PMEEN (1<<1)
-+#define MACCFG0_PMEST (1<<0)
-+
-+#define REG_MACCFG1 0x0104 /*offset to Test Reg #1, R/W */
-+#define REG_MACCFG2 0x0108 /*offset to Test Reg #2, R */
-+#define REG_MACCFG3 0x010c /*offset to Test Reg #3, R */
-+
-+/*---------------------------------------------------------------
-+ * Definition of Descriptor/Status Queue Entry
-+ *-------------------------------------------------------------*/
-+struct rx_dsc {
-+ __be32 ba;
-+ __be16 bl;
-+ __be16 bi; /* let nsof flag be part of bi */
-+};
-+
-+#define RXSTS_RFP 0x80000000
-+#define RXSTS_RWE 0x40000000
-+#define RXSTS_EOF 0x20000000
-+#define RXSTS_EOB 0x10000000
-+#define RXSTS_AM 0x00C00000
-+#define RXSTS_OE 0x00100000
-+#define RXSTS_FE 0x00080000
-+#define RXSTS_RUNT 0x00040000
-+#define RXSTS_EDATA 0x00020000
-+#define RXSTS_CRCE 0x00010000
-+
-+#define RXSTS_BI 0x7FFF
-+struct rx_sts { /* Receive Status Queue Entry */
-+ __be32 w1;
-+ __be16 fl;
-+ __be16 bi; /* bi and rfp2 */
-+};
-+
-+#define TXDSC_BL 0x0FFF
-+#define TXDSC_AF 0x8000
-+#define TXDSC_BI 0x7FFF
-+#define TXDSC_EOF 0x8000
-+struct tx_dsc { /* Transmit Descriptor Queue Entry */
-+ __be32 ba; /*b31-0: physical Buffer Address */
-+ __be16 bl_af; /* Buffer Length, Abort Frame */
-+ __be16 bi_eof; /* Buffer Index, End Of Frame */
-+};
-+
-+#define TXSTS_BI 0x7fff
-+#define TXSTS_TXFP 0x80
-+#define TXSTS_TXWE 0x40
-+#define TXSTS_LCRS 0x10
-+#define TXSTS_TXU 0x02
-+#define TXSTS_ECOLL 0x01
-+
-+struct tx_sts {
-+ __be16 bi;
-+ u8 ncoll;
-+ u8 flags;
-+};
-+
-+/*
-+ * Size of device registers occupied in memory/IO address map
-+ */
-+#define DEV_REG_SPACE 0x00010000
-+
-+#endif /* _EP93xx_ETH_H_ */
-diff -urN linux-2.6.15.commit/drivers/net/arm/Kconfig linux-2.6.15.snap/drivers/net/arm/Kconfig
---- linux-2.6.15.commit/drivers/net/arm/Kconfig 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/net/arm/Kconfig 2006-02-20 00:10:36.000000000 +0100
-@@ -44,3 +44,12 @@
- will generate a suitable hw address based on the board serial
- number (MTD support is required for this). Otherwise you will
- need to set a suitable hw address using ifconfig.
-+
-+config EP93XX_ETHERNET
-+ tristate "EP93xx Ethernet support"
-+ depends on NET_ETHERNET && ARM && ARCH_EP93XX
-+ select CRC32
-+ select MII
-+ help
-+ This is a driver for the ethernet hardware included in EP93xx CPUs.
-+ Say Y if you are building a kernel for EP93xx based devices.
-diff -urN linux-2.6.15.commit/drivers/net/arm/Makefile linux-2.6.15.snap/drivers/net/arm/Makefile
---- linux-2.6.15.commit/drivers/net/arm/Makefile 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/net/arm/Makefile 2006-02-20 00:12:09.000000000 +0100
-@@ -8,3 +8,4 @@
- obj-$(CONFIG_ARM_ETHERH) += etherh.o
- obj-$(CONFIG_ARM_ETHER3) += ether3.o
- obj-$(CONFIG_ARM_ETHER1) += ether1.o
-+obj-$(CONFIG_EP93XX_ETHERNET) += ep93xx_eth_need_rewrite.o
-diff -urN linux-2.6.15.commit/drivers/serial/amba-pl010.c linux-2.6.15.snap/drivers/serial/amba-pl010.c
---- linux-2.6.15.commit/drivers/serial/amba-pl010.c 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/serial/amba-pl010.c 2006-02-20 00:08:56.000000000 +0100
-@@ -93,8 +93,8 @@
- * UART0 7 6
- * UART1 5 4
- */
--#define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET)
--#define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET)
-+//#define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET)
-+//#define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET)
-
- /*
- * We wrap our port structure around the generic uart_port.
-@@ -339,8 +339,8 @@
- else
- ctrls |= uap->dtr_mask;
-
-- __raw_writel(ctrls, SC_CTRLS);
-- __raw_writel(ctrlc, SC_CTRLC);
-+// __raw_writel(ctrls, SC_CTRLS);
-+// __raw_writel(ctrlc, SC_CTRLC);
- }
-
- static void pl010_break_ctl(struct uart_port *port, int break_state)
-@@ -568,11 +568,12 @@
- static struct uart_amba_port amba_ports[UART_NR] = {
- {
- .port = {
-- .membase = (void *)IO_ADDRESS(INTEGRATOR_UART0_BASE),
-- .mapbase = INTEGRATOR_UART0_BASE,
-+ .membase = (void *)(EP93XX_APB_VIRT_BASE + 0x000c0000),
-+ .mapbase = EP93XX_APB_PHYS_BASE + 0x000c0000,
- .iotype = SERIAL_IO_MEM,
-- .irq = IRQ_UARTINT0,
-- .uartclk = 14745600,
-+ .irq = IRQ_EP93XX_UART1,
-+// .uartclk = 14745600,
-+ .uartclk = 7372800,
- .fifosize = 16,
- .ops = &amba_pl010_pops,
- .flags = ASYNC_BOOT_AUTOCONF,
-@@ -583,11 +584,12 @@
- },
- {
- .port = {
-- .membase = (void *)IO_ADDRESS(INTEGRATOR_UART1_BASE),
-- .mapbase = INTEGRATOR_UART1_BASE,
-+ .membase = (void *)(EP93XX_APB_VIRT_BASE + 0x000d0000),
-+ .mapbase = EP93XX_APB_PHYS_BASE + 0x000d0000,
- .iotype = SERIAL_IO_MEM,
-- .irq = IRQ_UARTINT1,
-- .uartclk = 14745600,
-+ .irq = IRQ_EP93XX_UART2,
-+// .uartclk = 14745600,
-+ .uartclk = 7372800,
- .fifosize = 16,
- .ops = &amba_pl010_pops,
- .flags = ASYNC_BOOT_AUTOCONF,
-diff -urN linux-2.6.15.commit/drivers/usb/host/ohci-ep93xx.c linux-2.6.15.snap/drivers/usb/host/ohci-ep93xx.c
---- linux-2.6.15.commit/drivers/usb/host/ohci-ep93xx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/drivers/usb/host/ohci-ep93xx.c 2006-02-28 02:18:54.000000000 +0100
-@@ -0,0 +1,170 @@
-+/*
-+ * OHCI HCD (Host Controller Driver) for USB.
-+ *
-+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
-+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
-+ * (C) Copyright 2002 Hewlett-Packard Company
-+ *
-+ * Bus Glue for ep93xx.
-+ *
-+ * Written by Christopher Hoover <ch@hpl.hp.com>
-+ * Based on fragments of previous driver by Russell King et al.
-+ *
-+ * Modified for LH7A404 from ohci-sa1111.c
-+ * by Durgesh Pattamatta <pattamattad@sharpsec.com>
-+ *
-+ * Modified for pxa27x from ohci-lh7a404.c
-+ * by Nick Bane <nick@cecomputing.co.uk> 26-8-2004
-+ *
-+ * Modified for ep93xx from ohci-pxa27x.c
-+ * by Lennert Buytenhek <buytenh@wantstofly.org> 28-2-2006
-+ * Based on an earlier driver by Ray Lehtiniemi
-+ *
-+ * This file is licenced under the GPL.
-+ */
-+
-+#include <linux/device.h>
-+#include <linux/signal.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware.h>
-+
-+static void ep93xx_start_hc(struct platform_device *dev)
-+{
-+ unsigned int pwrcnt;
-+
-+ pwrcnt = __raw_readl(EP93XX_SYSCON_CLOCK_CONTROL);
-+ pwrcnt |= EP93XX_SYSCON_CLOCK_USH_EN;
-+ __raw_writel(pwrcnt, EP93XX_SYSCON_CLOCK_CONTROL);
-+}
-+
-+static void ep93xx_stop_hc(struct platform_device *dev)
-+{
-+ unsigned int pwrcnt;
-+
-+ pwrcnt = __raw_readl(EP93XX_SYSCON_CLOCK_CONTROL);
-+ pwrcnt &= ~EP93XX_SYSCON_CLOCK_USH_EN;
-+ __raw_writel(pwrcnt, EP93XX_SYSCON_CLOCK_CONTROL);
-+}
-+
-+int usb_hcd_ep93xx_probe(const struct hc_driver *driver,
-+ struct platform_device *dev)
-+{
-+ int retval;
-+ struct usb_hcd *hcd;
-+
-+ hcd = usb_create_hcd(driver, &dev->dev, "ep93xx");
-+ if (hcd == NULL)
-+ return -ENOMEM;
-+
-+ hcd->rsrc_start = dev->resource[0].start;
-+ hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
-+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
-+ usb_put_hcd(hcd);
-+ retval = -EBUSY;
-+ goto err1;
-+ }
-+
-+ hcd->regs = (void __iomem *)dev->resource[0].start;
-+
-+ ep93xx_start_hc(dev);
-+
-+ ohci_hcd_init(hcd_to_ohci(hcd));
-+
-+ retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT);
-+ if (retval == 0)
-+ return retval;
-+
-+ ep93xx_stop_hc(dev);
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+err1:
-+ usb_put_hcd(hcd);
-+
-+ return retval;
-+}
-+
-+void usb_hcd_ep93xx_remove(struct usb_hcd *hcd, struct platform_device *dev)
-+{
-+ usb_remove_hcd(hcd);
-+ ep93xx_stop_hc(dev);
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+ usb_put_hcd(hcd);
-+}
-+
-+static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd)
-+{
-+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-+ int ret;
-+
-+ if ((ret = ohci_init(ohci)) < 0)
-+ return ret;
-+
-+ if ((ret = ohci_run(ohci)) < 0) {
-+ err("can't start %s", hcd->self.bus_name);
-+ ohci_stop(hcd);
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static struct hc_driver ohci_ep93xx_hc_driver = {
-+ .description = hcd_name,
-+ .product_desc = "EP93xx OHCI",
-+ .hcd_priv_size = sizeof(struct ohci_hcd),
-+ .irq = ohci_irq,
-+ .flags = HCD_USB11,
-+ .start = ohci_ep93xx_start,
-+ .stop = ohci_stop,
-+ .urb_enqueue = ohci_urb_enqueue,
-+ .urb_dequeue = ohci_urb_dequeue,
-+ .endpoint_disable = ohci_endpoint_disable,
-+ .get_frame_number = ohci_get_frame,
-+ .hub_status_data = ohci_hub_status_data,
-+ .hub_control = ohci_hub_control,
-+};
-+
-+extern int usb_disabled(void);
-+
-+static int ohci_hcd_ep93xx_drv_probe(struct platform_device *pdev)
-+{
-+ int ret;
-+
-+ ret = -ENODEV;
-+ if (!usb_disabled())
-+ ret = usb_hcd_ep93xx_probe(&ohci_ep93xx_hc_driver, pdev);
-+
-+ return ret;
-+ return -ENODEV;
-+}
-+
-+static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev)
-+{
-+ struct usb_hcd *hcd = platform_get_drvdata(pdev);
-+
-+ usb_hcd_ep93xx_remove(hcd, pdev);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver ohci_hcd_ep93xx_driver = {
-+ .probe = ohci_hcd_ep93xx_drv_probe,
-+ .remove = ohci_hcd_ep93xx_drv_remove,
-+ .driver = {
-+ .name = "ep93xx-ohci",
-+ },
-+};
-+
-+static int __init ohci_hcd_ep93xx_init(void)
-+{
-+ return platform_driver_register(&ohci_hcd_ep93xx_driver);
-+}
-+
-+static void __exit ohci_hcd_ep93xx_cleanup(void)
-+{
-+ platform_driver_unregister(&ohci_hcd_ep93xx_driver);
-+}
-+
-+module_init(ohci_hcd_ep93xx_init);
-+module_exit(ohci_hcd_ep93xx_cleanup);
-diff -urN linux-2.6.15.commit/drivers/usb/host/ohci-hcd.c linux-2.6.15.snap/drivers/usb/host/ohci-hcd.c
---- linux-2.6.15.commit/drivers/usb/host/ohci-hcd.c 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/usb/host/ohci-hcd.c 2006-02-28 01:30:21.000000000 +0100
-@@ -909,6 +909,10 @@
- #include "ohci-pxa27x.c"
- #endif
-
-+#ifdef CONFIG_ARCH_EP93XX
-+#include "ohci-ep93xx.c"
-+#endif
-+
- #ifdef CONFIG_SOC_AU1X00
- #include "ohci-au1xxx.c"
- #endif
-@@ -923,6 +927,7 @@
- || defined(CONFIG_ARCH_OMAP) \
- || defined (CONFIG_ARCH_LH7A404) \
- || defined (CONFIG_PXA27x) \
-+ || defined (CONFIG_ARCH_EP93XX) \
- || defined (CONFIG_SOC_AU1X00) \
- || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
- )
-diff -urN linux-2.6.15.commit/drivers/usb/Kconfig linux-2.6.15.snap/drivers/usb/Kconfig
---- linux-2.6.15.commit/drivers/usb/Kconfig 2006-02-12 10:22:16.000000000 +0100
-+++ linux-2.6.15.snap/drivers/usb/Kconfig 2006-02-20 22:56:03.000000000 +0100
-@@ -22,6 +22,7 @@
- default y if ARCH_LH7A404
- default y if ARCH_S3C2410
- default y if PXA27x
-+ default y if ARCH_EP93XX
- # PPC:
- default y if STB03xxx
- default y if PPC_MPC52xx
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/debug-macro.S linux-2.6.15.snap/include/asm-arm/arch-ep93xx/debug-macro.S
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/debug-macro.S 2006-02-19 18:59:06.000000000 +0100
-@@ -0,0 +1,35 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/debug-macro.S
-+ * Debugging macro include header
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+ .macro addruart,rx
-+ mrc p15, 0, \rx, c1, c0
-+ tst \rx, #1 @ MMU enabled?
-+ ldreq \rx, =EP93XX_APB_PHYS_BASE @ Physical base
-+ ldrne \rx, =EP93XX_APB_VIRT_BASE @ virtual base
-+ orr \rx, \rx, #0x000c0000
-+ .endm
-+
-+ .macro senduart,rd,rx
-+ strb \rd, [\rx]
-+ .endm
-+
-+ .macro busyuart,rd,rx
-+1001: ldrb \rd, [\rx, #0x18]
-+ tst \rd, #0x08
-+ bne 1001b
-+ .endm
-+
-+ .macro waituart,rd,rx
-+ nop
-+ nop
-+ nop
-+ .endm
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/dma.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/dma.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/dma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/dma.h 2006-02-19 19:28:06.000000000 +0100
-@@ -0,0 +1,6 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/dma.h
-+ */
-+
-+#define MAX_DMA_ADDRESS 0xffffffff
-+#define MAX_DMA_CHANNELS 0
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/entry-macro.S linux-2.6.15.snap/include/asm-arm/arch-ep93xx/entry-macro.S
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/entry-macro.S 2006-02-20 19:04:14.000000000 +0100
-@@ -0,0 +1,52 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/entry-macro.S
-+ * IRQ demultiplexing for EP93xx
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+ .macro disable_fiq
-+ .endm
-+
-+ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
-+ ldr \base, =(EP93XX_AHB_VIRT_BASE)
-+ orr \base, \base, #0x000b0000
-+ mov \irqnr, #0
-+ ldr \irqstat, [\base] @ lower 32 interrupts
-+ cmp \irqstat, #0
-+ bne 1001f
-+
-+ eor \base, \base, #0x00070000
-+ ldr \irqstat, [\base] @ upper 32 interrupts
-+ cmp \irqstat, #0
-+ beq 1002f
-+ mov \irqnr, #0x20
-+
-+1001:
-+ movs \tmp, \irqstat, lsl #16
-+ movne \irqstat, \tmp
-+ addeq \irqnr, \irqnr, #16
-+
-+ movs \tmp, \irqstat, lsl #8
-+ movne \irqstat, \tmp
-+ addeq \irqnr, \irqnr, #8
-+
-+ movs \tmp, \irqstat, lsl #4
-+ movne \irqstat, \tmp
-+ addeq \irqnr, \irqnr, #4
-+
-+ movs \tmp, \irqstat, lsl #2
-+ movne \irqstat, \tmp
-+ addeq \irqnr, \irqnr, #2
-+
-+ movs \tmp, \irqstat, lsl #1
-+ addeq \irqnr, \irqnr, #1
-+ orrs \base, \base, #1
-+
-+1002:
-+ .endm
-Binary files linux-2.6.15.commit/include/asm-arm/arch-ep93xx/.entry-macro.S.swp and linux-2.6.15.snap/include/asm-arm/arch-ep93xx/.entry-macro.S.swp differ
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/ep93xx-regs.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/ep93xx-regs.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/ep93xx-regs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/ep93xx-regs.h 2006-02-28 01:32:57.000000000 +0100
-@@ -0,0 +1,118 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/ep93xx-regs.h
-+ */
-+
-+#ifndef __ARCH_EP93XX_REGS_H
-+#define __ARCH_EP93XX_REGS_H
-+
-+/*
-+ * EP93xx linux memory map:
-+ *
-+ * virt phys size
-+ * fe800000 5M per-platform mappings
-+ * fed00000 80800000 2M APB
-+ * fef00000 80000000 1M AHB
-+ */
-+
-+#define EP93XX_AHB_PHYS_BASE 0x80000000
-+#define EP93XX_AHB_VIRT_BASE 0xfef00000
-+#define EP93XX_AHB_SIZE 0x00100000
-+
-+#define EP93XX_APB_PHYS_BASE 0x80800000
-+#define EP93XX_APB_VIRT_BASE 0xfed00000
-+#define EP93XX_APB_SIZE 0x00200000
-+
-+
-+/* AHB peripherals */
-+#define EP93XX_DMA_BASE (EP93XX_AHB_VIRT_BASE + 0x00000000)
-+
-+#define EP93XX_ETHERNET_BASE (EP93XX_AHB_VIRT_BASE + 0x00010000)
-+
-+#define EP93XX_USB_BASE (EP93XX_AHB_VIRT_BASE + 0x00020000)
-+
-+#define EP93XX_RASTER_BASE (EP93XX_AHB_VIRT_BASE + 0x00030000)
-+
-+#define EP93XX_SDRAM_CONTROLLER_BASE (EP93XX_AHB_VIRT_BASE + 0x00060000)
-+
-+#define EP93XX_PCMCIA_CONTROLLER_BASE (EP93XX_AHB_VIRT_BASE + 0x00080000)
-+
-+#define EP93XX_BOOT_ROM_BASE (EP93XX_AHB_VIRT_BASE + 0x00090000)
-+
-+#define EP93XX_IDE_BASE (EP93XX_AHB_VIRT_BASE + 0x000a0000)
-+
-+#define EP93XX_VIC1_BASE (EP93XX_AHB_VIRT_BASE + 0x000b0000)
-+#define EP93XX_VIC1_REG(x) (EP93XX_VIC1_BASE + (x))
-+#define EP93XX_VIC1_IRQ_STATUS EP93XX_VIC1_REG(0x0000)
-+#define EP93XX_VIC1_SELECT EP93XX_VIC1_REG(0x000c)
-+#define EP93XX_VIC1_ENABLE EP93XX_VIC1_REG(0x0010)
-+#define EP93XX_VIC1_ENABLE_CLEAR EP93XX_VIC1_REG(0x0014)
-+#define EP93XX_VIC1_VECT_CNTRL EP93XX_VIC1_REG(0x0200)
-+
-+#define EP93XX_VIC2_BASE (EP93XX_AHB_VIRT_BASE + 0x000c0000)
-+#define EP93XX_VIC2_REG(x) (EP93XX_VIC2_BASE + (x))
-+#define EP93XX_VIC2_IRQ_STATUS EP93XX_VIC2_REG(0x0000)
-+#define EP93XX_VIC2_SELECT EP93XX_VIC2_REG(0x000c)
-+#define EP93XX_VIC2_ENABLE EP93XX_VIC2_REG(0x0010)
-+#define EP93XX_VIC2_ENABLE_CLEAR EP93XX_VIC2_REG(0x0014)
-+#define EP93XX_VIC2_VECT_CNTRL EP93XX_VIC2_REG(0x0200)
-+
-+
-+/* APB peripherals */
-+#define EP93XX_TIMER_BASE (EP93XX_APB_VIRT_BASE + 0x00010000)
-+#define EP93XX_TIMER_REG(x) (EP93XX_TIMER_BASE + (x))
-+#define EP93XX_TIMER1_LOAD EP93XX_TIMER_REG(0x00)
-+#define EP93XX_TIMER1_VALUE EP93XX_TIMER_REG(0x04)
-+#define EP93XX_TIMER1_CONTROL EP93XX_TIMER_REG(0x08)
-+#define EP93XX_TIMER1_CLEAR EP93XX_TIMER_REG(0x0c)
-+#define EP93XX_TIMER2_LOAD EP93XX_TIMER_REG(0x20)
-+#define EP93XX_TIMER2_VALUE EP93XX_TIMER_REG(0x24)
-+#define EP93XX_TIMER2_CONTROL EP93XX_TIMER_REG(0x28)
-+#define EP93XX_TIMER2_CLEAR EP93XX_TIMER_REG(0x2c)
-+#define EP93XX_TIMER4_VALUE_LOW EP93XX_TIMER_REG(0x60)
-+#define EP93XX_TIMER4_VALUE_HIGH EP93XX_TIMER_REG(0x64)
-+#define EP93XX_TIMER3_LOAD EP93XX_TIMER_REG(0x80)
-+#define EP93XX_TIMER3_VALUE EP93XX_TIMER_REG(0x84)
-+#define EP93XX_TIMER3_CONTROL EP93XX_TIMER_REG(0x88)
-+#define EP93XX_TIMER3_CLEAR EP93XX_TIMER_REG(0x8c)
-+
-+#define EP93XX_I2S_BASE (EP93XX_APB_VIRT_BASE + 0x00020000)
-+
-+#define EP93XX_SECURITY_BASE (EP93XX_APB_VIRT_BASE + 0x00030000)
-+
-+#define EP93XX_GPIO_BASE (EP93XX_APB_VIRT_BASE + 0x00040000)
-+
-+#define EP93XX_AAC_BASE (EP93XX_APB_VIRT_BASE + 0x00080000)
-+
-+#define EP93XX_SPI_BASE (EP93XX_APB_VIRT_BASE + 0x000a0000)
-+
-+#define EP93XX_IRDA_BASE (EP93XX_APB_VIRT_BASE + 0x000b0000)
-+
-+#define EP93XX_UART1_BASE (EP93XX_APB_VIRT_BASE + 0x000c0000)
-+
-+#define EP93XX_UART2_BASE (EP93XX_APB_VIRT_BASE + 0x000d0000)
-+
-+#define EP93XX_UART3_BASE (EP93XX_APB_VIRT_BASE + 0x000e0000)
-+
-+#define EP93XX_KEY_MATRIX_BASE (EP93XX_APB_VIRT_BASE + 0x000f0000)
-+
-+#define EP93XX_TOUCHSCREEN_BASE (EP93XX_APB_VIRT_BASE + 0x00100000)
-+
-+#define EP93XX_PWM_BASE (EP93XX_APB_VIRT_BASE + 0x00110000)
-+
-+#define EP93XX_RTC_BASE (EP93XX_APB_VIRT_BASE + 0x00120000)
-+
-+#define EP93XX_SYSCON_BASE (EP93XX_APB_VIRT_BASE + 0x00130000)
-+#define EP93XX_SYSCON_REG(x) (EP93XX_SYSCON_BASE + (x))
-+#define EP93XX_SYSCON_POWER_STATE EP93XX_SYSCON_REG(0x00)
-+#define EP93XX_SYSCON_CLOCK_CONTROL EP93XX_SYSCON_REG(0x04)
-+#define EP93XX_SYSCON_CLOCK_UARTBAUD 0x20000000
-+#define EP93XX_SYSCON_CLOCK_USH_EN 0x10000000
-+#define EP93XX_SYSCON_HALT EP93XX_SYSCON_REG(0x08)
-+#define EP93XX_SYSCON_STANDBY EP93XX_SYSCON_REG(0x0c)
-+#define EP93XX_SYSCON_DEVICE_CONFIG EP93XX_SYSCON_REG(0x80)
-+#define EP93XX_SYSCON_SWLOCK EP93XX_SYSCON_REG(0xc0)
-+
-+#define EP93XX_WATCHDOG_BASE (EP93XX_APB_VIRT_BASE + 0x00140000)
-+
-+
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/gesbc9312.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/gesbc9312.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/gesbc9312.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/gesbc9312.h 2006-02-19 19:30:10.000000000 +0100
-@@ -0,0 +1,3 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/gesbc9312.h
-+ */
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/hardware.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/hardware.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/hardware.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/hardware.h 2006-02-19 20:15:12.000000000 +0100
-@@ -0,0 +1,12 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/hardware.h
-+ */
-+
-+#include "ep93xx-regs.h"
-+
-+#define pcibios_assign_all_busses() 0
-+
-+#include "platform.h"
-+
-+#include "gesbc9312.h"
-+#include "ts72xx.h"
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/io.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/io.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/io.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/io.h 2006-02-19 20:03:57.000000000 +0100
-@@ -0,0 +1,8 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/io.h
-+ */
-+
-+#define IO_SPACE_LIMIT 0xffffffff
-+
-+#define __io(p) ((void __iomem *)(p))
-+#define __mem_pci(p) (p)
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/irqs.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/irqs.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/irqs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/irqs.h 2006-02-19 21:29:37.000000000 +0100
-@@ -0,0 +1,78 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/irqs.h
-+ */
-+
-+#ifndef _IRQS_H
-+#define _IRQS_H
-+
-+#define IRQ_EP93XX_COMMRX 2
-+#define IRQ_EP93XX_COMMTX 3
-+#define IRQ_EP93XX_TIMER1 4
-+#define IRQ_EP93XX_TIMER2 5
-+#define IRQ_EP93XX_AACINTR 6
-+#define IRQ_EP93XX_DMAM2P0 7
-+#define IRQ_EP93XX_DMAM2P1 8
-+#define IRQ_EP93XX_DMAM2P2 9
-+#define IRQ_EP93XX_DMAM2P3 10
-+#define IRQ_EP93XX_DMAM2P4 11
-+#define IRQ_EP93XX_DMAM2P5 12
-+#define IRQ_EP93XX_DMAM2P6 13
-+#define IRQ_EP93XX_DMAM2P7 14
-+#define IRQ_EP93XX_DMAM2P8 15
-+#define IRQ_EP93XX_DMAM2P9 16
-+#define IRQ_EP93XX_DMAM2M0 17
-+#define IRQ_EP93XX_DMAM2M1 18
-+#define IRQ_EP93XX_GPIO0MUX 20
-+#define IRQ_EP93XX_GPIO1MUX 21
-+#define IRQ_EP93XX_GPIO2MUX 22
-+#define IRQ_EP93XX_GPIO3MUX 22
-+#define IRQ_EP93XX_UART1RX 23
-+#define IRQ_EP93XX_UART1TX 24
-+#define IRQ_EP93XX_UART2RX 25
-+#define IRQ_EP93XX_UART2TX 26
-+#define IRQ_EP93XX_UART3RX 27
-+#define IRQ_EP93XX_UART3TX 28
-+#define IRQ_EP93XX_KEY 29
-+#define IRQ_EP93XX_TOUCH 30
-+#define EP93XX_VIC1_VALID_IRQ_MASK 0x7ffffffc
-+
-+#define IRQ_EP93XX_EXT0 32
-+#define IRQ_EP93XX_EXT1 33
-+#define IRQ_EP93XX_EXT2 34
-+#define IRQ_EP93XX_64HZ 35
-+#define IRQ_EP93XX_WATCHDOG 36
-+#define IRQ_EP93XX_RTC 37
-+#define IRQ_EP93XX_IRDA 38
-+#define IRQ_EP93XX_ETHERNET 39
-+#define IRQ_EP93XX_EXT3 40
-+#define IRQ_EP93XX_PROG 41
-+#define IRQ_EP93XX_1HZ 42
-+#define IRQ_EP93XX_VSYNC 43
-+#define IRQ_EP93XX_VIDEO_FIFO 44
-+#define IRQ_EP93XX_SSP1RX 45
-+#define IRQ_EP93XX_SSP1TX 46
-+#define IRQ_EP93XX_GPIO4MUX 47
-+#define IRQ_EP93XX_GPIO5MUX 48
-+#define IRQ_EP93XX_GPIO6MUX 49
-+#define IRQ_EP93XX_GPIO7MUX 50
-+#define IRQ_EP93XX_TIMER3 51
-+#define IRQ_EP93XX_UART1 52
-+#define IRQ_EP93XX_SSP 53
-+#define IRQ_EP93XX_UART2 54
-+#define IRQ_EP93XX_UART3 55
-+#define IRQ_EP93XX_USB 56
-+#define IRQ_EP93XX_ETHERNET_PME 57
-+#define IRQ_EP93XX_DSP 58
-+#define IRQ_EP93XX_GPIO 59
-+#define IRQ_EP93XX_SAI 60
-+#define EP93XX_VIC2_VALID_IRQ_MASK 0x1fffffff
-+
-+#define NR_EP93XX_IRQS 64
-+
-+#define EP93XX_BOARD_IRQ(x) (NR_EP93XX_IRQS + (x))
-+#define EP93XX_BOARD_IRQS 32
-+
-+#define NR_IRQS (NR_EP93XX_IRQS + EP93XX_BOARD_IRQS)
-+
-+
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/memory.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/memory.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/memory.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/memory.h 2006-02-22 02:05:51.000000000 +0100
-@@ -0,0 +1,14 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/memory.h
-+ */
-+
-+#ifndef __ASM_ARCH_MEMORY_H
-+#define __ASM_ARCH_MEMORY_H
-+
-+#define PHYS_OFFSET UL(0x00000000)
-+
-+#define __bus_to_virt(x) __phys_to_virt(x)
-+#define __virt_to_bus(x) __virt_to_phys(x)
-+
-+
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/param.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/param.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/param.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/param.h 2006-02-22 02:05:20.000000000 +0100
-@@ -0,0 +1,3 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/param.h
-+ */
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/platform.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/platform.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/platform.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/platform.h 2006-02-20 14:26:36.000000000 +0100
-@@ -0,0 +1,14 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/platform.h
-+ */
-+
-+#ifndef __ASSEMBLY__
-+
-+void ep93xx_map_io(void);
-+void ep93xx_init_irq(void);
-+void ep93xx_init_time(unsigned long);
-+void ep93xx_init_devices(void);
-+extern struct sys_timer ep93xx_timer;
-+
-+
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/system.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/system.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/system.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/system.h 2006-02-20 21:28:04.000000000 +0100
-@@ -0,0 +1,26 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/system.h
-+ */
-+
-+#include <asm/hardware.h>
-+
-+static inline void arch_idle(void)
-+{
-+ cpu_do_idle();
-+}
-+
-+static inline void arch_reset(char mode)
-+{
-+ u32 devicecfg;
-+
-+ local_irq_disable();
-+
-+ devicecfg = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG);
-+ __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-+ __raw_writel(devicecfg | 0x80000000, EP93XX_SYSCON_DEVICE_CONFIG);
-+ __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-+ __raw_writel(devicecfg & ~0x80000000, EP93XX_SYSCON_DEVICE_CONFIG);
-+
-+ while (1)
-+ ;
-+}
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/timex.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/timex.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/timex.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/timex.h 2006-02-19 19:16:38.000000000 +0100
-@@ -0,0 +1,5 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/timex.h
-+ */
-+
-+#define CLOCK_TICK_RATE 508000
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/ts72xx.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/ts72xx.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/ts72xx.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/ts72xx.h 2006-02-22 17:01:02.000000000 +0100
-@@ -0,0 +1,90 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/ts72xx.h
-+ */
-+
-+/*
-+ * TS72xx memory map:
-+ *
-+ * virt phys size
-+ * febff000 22000000 4K model number register
-+ * febfe000 22400000 4K options register
-+ * febfd000 22800000 4K options register #2
-+ * febfc000 [67]0000000 4K NAND data register
-+ * febfb000 [67]0400000 4K NAND control register
-+ * febfa000 [67]0800000 4K NAND busy register
-+ */
-+
-+#define TS72XX_MODEL_PHYS_BASE 0x22000000
-+#define TS72XX_MODEL_VIRT_BASE 0xfebff000
-+#define TS72XX_MODEL_SIZE 0x00001000
-+
-+#define TS72XX_MODEL_TS7200 0x00
-+#define TS72XX_MODEL_TS7250 0x01
-+#define TS72XX_MODEL_TS7260 0x02
-+
-+
-+#define TS72XX_OPTIONS_PHYS_BASE 0x22400000
-+#define TS72XX_OPTIONS_VIRT_BASE 0xfebfe000
-+#define TS72XX_OPTIONS_SIZE 0x00001000
-+
-+#define TS72XX_OPTIONS_COM2_RS485 0x02
-+#define TS72XX_OPTIONS_MAX197 0x01
-+
-+
-+#define TS72XX_OPTIONS2_PHYS_BASE 0x22800000
-+#define TS72XX_OPTIONS2_VIRT_BASE 0xfebfd000
-+#define TS72XX_OPTIONS2_SIZE 0x00001000
-+
-+#define TS72XX_OPTIONS2_TS9420 0x04
-+#define TS72XX_OPTIONS2_TS9420_BOOT 0x02
-+
-+
-+#define TS72XX_NOR_PHYS_BASE 0x60000000
-+#define TS72XX_NOR2_PHYS_BASE 0x62000000
-+
-+#define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000
-+#define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000
-+#define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000
-+#define TS72XX_NAND_DATA_SIZE 0x00001000
-+
-+#define TS72XX_NAND1_CONTROL_PHYS_BASE 0x60400000
-+#define TS72XX_NAND2_CONTROL_PHYS_BASE 0x70400000
-+#define TS72XX_NAND_CONTROL_VIRT_BASE 0xfebfb000
-+#define TS72XX_NAND_CONTROL_SIZE 0x00001000
-+
-+#define TS72XX_NAND1_BUSY_PHYS_BASE 0x60800000
-+#define TS72XX_NAND2_BUSY_PHYS_BASE 0x70800000
-+#define TS72XX_NAND_BUSY_VIRT_BASE 0xfebfa000
-+#define TS72XX_NAND_BUSY_SIZE 0x00001000
-+
-+
-+#ifndef __ASSEMBLY__
-+#include <asm/io.h>
-+
-+static inline int board_is_ts7200(void)
-+{
-+ return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7200;
-+}
-+
-+static inline int board_is_ts7250(void)
-+{
-+ return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7250;
-+}
-+
-+static inline int board_is_ts7260(void)
-+{
-+ return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7260;
-+}
-+
-+static inline int is_max197_installed(void)
-+{
-+ return !!(__raw_readb(TS72XX_OPTIONS_VIRT_BASE) &
-+ TS72XX_OPTIONS_MAX197);
-+}
-+
-+static inline int is_ts9420_installed(void)
-+{
-+ return !!(__raw_readb(TS72XX_OPTIONS2_VIRT_BASE) &
-+ TS72XX_OPTIONS2_TS9420);
-+}
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/uncompress.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/uncompress.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/uncompress.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/uncompress.h 2006-02-22 02:20:49.000000000 +0100
-@@ -0,0 +1,42 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/uncompress.h
-+ *
-+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+#include <asm/arch/ep93xx-regs.h>
-+
-+#define PHYS_UART1_DATA ((unsigned long *)0x808c0000)
-+#define PHYS_UART1_FLAG ((unsigned long *)0x808c0018)
-+#define UART1_FLAG_TXFF 0x20
-+
-+static __inline__ void putc(char c)
-+{
-+ int i;
-+
-+ for (i = 0; i < 1000; i++) {
-+ /* Transmit fifo not full? */
-+ if (!(*PHYS_UART1_FLAG & UART1_FLAG_TXFF))
-+ break;
-+ }
-+
-+ *PHYS_UART1_DATA = c;
-+}
-+
-+static void putstr(const char *s)
-+{
-+ while (*s) {
-+ putc(*s);
-+ if (*s == '\n')
-+ putc('\r');
-+ s++;
-+ }
-+}
-+
-+#define arch_decomp_setup()
-+#define arch_decomp_wdog()
-diff -urN linux-2.6.15.commit/include/asm-arm/arch-ep93xx/vmalloc.h linux-2.6.15.snap/include/asm-arm/arch-ep93xx/vmalloc.h
---- linux-2.6.15.commit/include/asm-arm/arch-ep93xx/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/arch-ep93xx/vmalloc.h 2006-02-19 22:05:22.000000000 +0100
-@@ -0,0 +1,5 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/vmalloc.h
-+ */
-+
-+#define VMALLOC_END 0xfe800000
-diff -urN linux-2.6.15.commit/include/asm-arm/hardware/vic.h linux-2.6.15.snap/include/asm-arm/hardware/vic.h
---- linux-2.6.15.commit/include/asm-arm/hardware/vic.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/hardware/vic.h 2006-02-20 13:57:02.000000000 +0100
-@@ -0,0 +1,45 @@
-+/*
-+ * linux/include/asm-arm/hardware/vic.h
-+ *
-+ * Copyright (c) ARM Limited 2003. All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef __ASM_ARM_HARDWARE_VIC_H
-+#define __ASM_ARM_HARDWARE_VIC_H
-+
-+#define VIC_IRQ_STATUS 0x00
-+#define VIC_FIQ_STATUS 0x04
-+#define VIC_RAW_STATUS 0x08
-+#define VIC_INT_SELECT 0x0c /* 1 = FIQ, 0 = IRQ */
-+#define VIC_INT_ENABLE 0x10 /* 1 = enable, 0 = disable */
-+#define VIC_INT_ENABLE_CLEAR 0x14
-+#define VIC_INT_SOFT 0x18
-+#define VIC_INT_SOFT_CLEAR 0x1c
-+#define VIC_PROTECT 0x20
-+#define VIC_VECT_ADDR 0x30
-+#define VIC_DEF_VECT_ADDR 0x34
-+
-+#define VIC_VECT_ADDR0 0x100 /* 0 to 15 */
-+#define VIC_VECT_CNTL0 0x200 /* 0 to 15 */
-+#define VIC_ITCR 0x300 /* VIC test control register */
-+
-+#define VIC_VECT_CNTL_ENABLE (1 << 5)
-+
-+#ifndef __ASSEMBLY__
-+void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources);
-+#endif
-+
-+#endif
-diff -urN linux-2.6.15.commit/include/asm-arm/mach/irq.h linux-2.6.15.snap/include/asm-arm/mach/irq.h
---- linux-2.6.15.commit/include/asm-arm/mach/irq.h 2006-02-12 10:22:19.000000000 +0100
-+++ linux-2.6.15.snap/include/asm-arm/mach/irq.h 2006-02-20 13:57:02.000000000 +0100
-@@ -61,7 +61,7 @@
- struct irqchip *chip;
- struct irqaction *action;
- struct list_head pend;
-- void *chipdata;
-+ void __iomem *chipdata;
- void *data;
- unsigned int disable_depth;
-
diff --git a/packages/linux/ep93xx-kernel/dynamic-phys-offset-2.6.20-rc7.diff b/packages/linux/ep93xx-kernel/dynamic-phys-offset-2.6.20-rc7.diff
deleted file mode 100644
index 1f59be644e..0000000000
--- a/packages/linux/ep93xx-kernel/dynamic-phys-offset-2.6.20-rc7.diff
+++ /dev/null
@@ -1,199 +0,0 @@
-On the Cirrus Logic ep93xx, system RAM isn't one nice physically
-contiguous region as it is on most SoCs, but it is spread out over
-between one and four memory banks.
-
-What's worse, RAM doesn't necessarily start at any fixed physical
-memory location. The start of RAM (PHYS_OFFSET) is not only board-
-specific, but on some boards also depends on jumper settings (whether
-async or sync boot mode is selected.)
-
-The attached patch adds the RUNTIME_PHYS_OFFSET config option, which,
-if selected, turns PHYS_OFFSET into a variable which is determined and
-set by __create_page_tables by looking at the current pc. This allows
-booting a single kernel image on all the different flavors of ep93xx
-boards, reducing user confusion and hopefully pleasing our kautobuild
-admin :-) If the option isn't selected, there's zero impact.
-
-Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
-===================================================================
-20070202 modified to apply cleanly to linux-2.6.20-rc7 - NZG
-===================================================================
-diff -Naur linux-2.6.20-rc7/arch/arm/Kconfig linux-2.6.20-rc7-e1.0/arch/arm/Kconfig
---- linux-2.6.20-rc7/arch/arm/Kconfig 2007-02-02 10:26:21.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/Kconfig 2007-02-02 16:23:05.000000000 -0600
-@@ -113,6 +113,9 @@
- help
- The base address of exception vectors.
-
-+config RUNTIME_PHYS_OFFSET
-+ bool
-+
- source "init/Kconfig"
-
- menu "System Type"
-@@ -187,6 +190,7 @@
- bool "EP93xx-based"
- select ARM_AMBA
- select ARM_VIC
-+ select RUNTIME_PHYS_OFFSET
- help
- This enables support for the Cirrus EP93xx series of CPUs.
-
-diff -Naur linux-2.6.20-rc7/arch/arm/boot/compressed/Makefile linux-2.6.20-rc7-e1.0/arch/arm/boot/compressed/Makefile
---- linux-2.6.20-rc7/arch/arm/boot/compressed/Makefile 2006-11-29 15:57:37.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/boot/compressed/Makefile 2007-02-02 16:23:05.000000000 -0600
-@@ -78,13 +78,10 @@
- EXTRA_CFLAGS := -fpic
- EXTRA_AFLAGS :=
-
--# Supply ZRELADDR, INITRD_PHYS and PARAMS_PHYS to the decompressor via
--# linker symbols. We only define initrd_phys and params_phys if the
--# machine class defined the corresponding makefile variable.
-+# Supply ZRELADDR and PARAMS_PHYS to the decompressor via linker
-+# symbols. We only define params_phys if the machine class defined
-+# the corresponding makefile variable.
- LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR)
--ifneq ($(INITRD_PHYS),)
--LDFLAGS_vmlinux += --defsym initrd_phys=$(INITRD_PHYS)
--endif
- ifneq ($(PARAMS_PHYS),)
- LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
- endif
-diff -Naur linux-2.6.20-rc7/arch/arm/boot/compressed/head.S linux-2.6.20-rc7-e1.0/arch/arm/boot/compressed/head.S
---- linux-2.6.20-rc7/arch/arm/boot/compressed/head.S 2006-11-29 15:57:37.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/boot/compressed/head.S 2007-02-02 16:23:05.000000000 -0600
-@@ -156,6 +156,11 @@
- .text
- adr r0, LC0
- ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp}
-+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
-+ and r10, pc, #0xf0000000 @ fix up zreladdr
-+ add r4, r4, r10
-+#endif
-+
- subs r0, r0, r1 @ calculate the delta offset
-
- @ if delta is zero, we are
-diff -Naur linux-2.6.20-rc7/arch/arm/kernel/head.S linux-2.6.20-rc7-e1.0/arch/arm/kernel/head.S
---- linux-2.6.20-rc7/arch/arm/kernel/head.S 2007-02-02 10:26:21.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/kernel/head.S 2007-02-02 16:36:21.000000000 -0600
-@@ -43,8 +43,8 @@
- .globl swapper_pg_dir
- .equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000
-
-- .macro pgtbl, rd
-- ldr \rd, =(KERNEL_RAM_PADDR - 0x4000)
-+ .macro pgtbl, rd, phys_offset
-+ add \rd, \phys_offset, #(TEXT_OFFSET - 0x4000)
- .endm
-
- #ifdef CONFIG_XIP_KERNEL
-@@ -206,10 +206,22 @@
- * Returns:
- * r0, r3, r6, r7 corrupted
- * r4 = physical page table address
-+ * r5 = PHYS_OFFSET
- */
- .type __create_page_tables, %function
- __create_page_tables:
-- pgtbl r4 @ page table address
-+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
-+ adr r5, stext
-+ sub r5, r5, #TEXT_OFFSET @ r5 = phys_offset
-+
-+ ldr r4, =(phys_offset - PAGE_OFFSET)
-+ add r4, r4, r5
-+ str r5, [r4] @ save phys_offset
-+#else
-+ mov r5, #PHYS_OFFSET @ r5 = phys_offset
-+#endif
-+
-+ pgtbl r4, r5 @ r4 = page table address
-
- /*
- * Clear the 16K level 1 swapper page table
-@@ -255,8 +267,7 @@
- * Then map first 1MB of ram in case it contains our boot params.
- */
- add r0, r4, #PAGE_OFFSET >> 18
-- orr r6, r7, #(PHYS_OFFSET & 0xff000000)
-- orr r6, r6, #(PHYS_OFFSET & 0x00e00000)
-+ orr r6, r7, r5
- str r6, [r0]
-
- #ifdef CONFIG_XIP_KERNEL
-diff -Naur linux-2.6.20-rc7/arch/arm/kernel/setup.c linux-2.6.20-rc7-e1.0/arch/arm/kernel/setup.c
---- linux-2.6.20-rc7/arch/arm/kernel/setup.c 2007-02-02 10:26:21.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/kernel/setup.c 2007-02-02 16:23:05.000000000 -0600
-@@ -59,6 +59,16 @@
- extern int root_mountflags;
- extern void _stext, _text, _etext, __data_start, _edata, _end;
-
-+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
-+/*
-+ * The assignment is here solely to prevent this variable from ending
-+ * up in bss. As the early startup code writes to it, we don't want it
-+ * to be zeroed again later.
-+ */
-+unsigned long phys_offset = 0xdeadbeef;
-+EXPORT_SYMBOL(phys_offset);
-+#endif
-+
- unsigned int processor_id;
- unsigned int __machine_arch_type;
- EXPORT_SYMBOL(__machine_arch_type);
-@@ -749,7 +759,7 @@
- { tag_size(tag_core), ATAG_CORE },
- { 1, PAGE_SIZE, 0xff },
- { tag_size(tag_mem32), ATAG_MEM },
-- { MEM_SIZE, PHYS_OFFSET },
-+ { MEM_SIZE, 0 },
- { 0, ATAG_NONE }
- };
-
-@@ -770,6 +780,8 @@
- struct machine_desc *mdesc;
- char *from = default_command_line;
-
-+ init_tags.mem.start = PHYS_OFFSET;
-+
- setup_processor();
- mdesc = setup_machine(machine_arch_type);
- machine_name = mdesc->name;
-diff -Naur linux-2.6.20-rc7/arch/arm/mach-ep93xx/Makefile.boot linux-2.6.20-rc7-e1.0/arch/arm/mach-ep93xx/Makefile.boot
---- linux-2.6.20-rc7/arch/arm/mach-ep93xx/Makefile.boot 2006-11-29 15:57:37.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/arch/arm/mach-ep93xx/Makefile.boot 2007-02-02 16:23:05.000000000 -0600
-@@ -1,2 +1 @@
- zreladdr-y := 0x00008000
--params_phys-y := 0x00000100
-diff -Naur linux-2.6.20-rc7/include/asm-arm/arch-ep93xx/memory.h linux-2.6.20-rc7-e1.0/include/asm-arm/arch-ep93xx/memory.h
---- linux-2.6.20-rc7/include/asm-arm/arch-ep93xx/memory.h 2006-11-29 15:57:37.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/include/asm-arm/arch-ep93xx/memory.h 2007-02-02 16:23:05.000000000 -0600
-@@ -5,7 +5,9 @@
- #ifndef __ASM_ARCH_MEMORY_H
- #define __ASM_ARCH_MEMORY_H
-
-+#ifndef CONFIG_RUNTIME_PHYS_OFFSET
- #define PHYS_OFFSET UL(0x00000000)
-+#endif
-
- #define __bus_to_virt(x) __phys_to_virt(x)
- #define __virt_to_bus(x) __virt_to_phys(x)
-diff -Naur linux-2.6.20-rc7/include/asm-arm/memory.h linux-2.6.20-rc7-e1.0/include/asm-arm/memory.h
---- linux-2.6.20-rc7/include/asm-arm/memory.h 2007-02-02 10:26:27.000000000 -0600
-+++ linux-2.6.20-rc7-e1.0/include/asm-arm/memory.h 2007-02-02 16:23:05.000000000 -0600
-@@ -73,6 +73,14 @@
- */
- #define IOREMAP_MAX_ORDER 24
-
-+/*
-+ * PHYS_OFFSET determined at run time?
-+ */
-+#if defined(CONFIG_RUNTIME_PHYS_OFFSET) && !defined(__ASSEMBLY__)
-+extern unsigned long phys_offset;
-+#define PHYS_OFFSET (phys_offset)
-+#endif
-+
- #else /* CONFIG_MMU */
-
- /*
diff --git a/packages/linux/ep93xx-kernel/eabi-enums.patch b/packages/linux/ep93xx-kernel/eabi-enums.patch
deleted file mode 100644
index 9e5e9ec571..0000000000
--- a/packages/linux/ep93xx-kernel/eabi-enums.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Index: linux-2.6.16/arch/arm/Makefile
-===================================================================
---- linux-2.6.16.orig/arch/arm/Makefile 2006-03-20 05:53:29.000000000 +0000
-+++ linux-2.6.16/arch/arm/Makefile 2006-04-24 20:10:27.000000000 +0100
-@@ -57,7 +57,7 @@
- tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
-
- ifeq ($(CONFIG_AEABI),y)
--CFLAGS_ABI :=-mabi=aapcs -mno-thumb-interwork
-+CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork
- else
- CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
- endif
-
-
-
diff --git a/packages/linux/ep93xx-kernel/linux-2.6.15-ep93xx-gao19.diff b/packages/linux/ep93xx-kernel/linux-2.6.15-ep93xx-gao19.diff
deleted file mode 100644
index 3dc6b004b8..0000000000
--- a/packages/linux/ep93xx-kernel/linux-2.6.15-ep93xx-gao19.diff
+++ /dev/null
@@ -1,43746 +0,0 @@
-diff --git a/Documentation/arm/ep93xx/config.txt b/Documentation/arm/ep93xx/config.txt
-new file mode 100644
-index 0000000..9d13a15
---- /dev/null
-+++ b/Documentation/arm/ep93xx/config.txt
-@@ -0,0 +1,207 @@
-+-------------------------------------------------------------------------
-+config.txt
-+
-+Information on configuration options in the Linux kernel for the Cirrus
-+EP93xx.
-+
-+Note to developers: Let's stick to the essentials on "how to turn things
-+on in the Linux build." This information is presented from the standpoint
-+of someone doing a build, looking at a make menuconfig screen. If what you
-+are describing doesn't fit here, it should get its own document to go into
-+the level of detail you feel is most practicle.
-+-------------------------------------------------------------------------
-+
-+All options configured as built-in drivers, not loadable modules.
-+So on options that are selected by < >, select <*>, not <M>. To
-+do this either hit 'y' or hit the space bar twice.
-+
-+
-+----------------
-+Audio
-+----------------
-+Needed by:
-+Needs: DMA Support, dev fs.
-+
-+Ac97 and I2S audio are currently mutually exclusive.
-+
-+To enable Ac97 Audio:
-+ Go into "Sound --->"
-+ Enable "Sound Support"
-+ Enable "OSS sound modules"
-+ Select "Ac97" for "Cirrus EP93xx Sound Support"
-+
-+To enable I2S Audio:
-+ Go into "Sound --->"
-+ Enable "Sound Support"
-+ Enable "OSS sound modules"
-+ Select "I2S" for "Cirrus EP93xx Sound Support"
-+ If you have an EDB9312 board, select "CS4228A" for "Cirrus I2S Codec Support"
-+ If you have an EDB9301 board, select "CS4271" for "Cirrus I2S Codec Support"
-+
-+
-+----------------
-+Dev Fs
-+----------------
-+ DEVFS support is no longer available.
-+ Please consider using udev or create device nodes manually instead.
-+ You might also need to adapt your startup scripts and userspace
-+ apps.
-+
-+----------------
-+DMA
-+----------------
-+Needed by: Audio, IDE/DMA
-+Needs:
-+
-+To enable DMA:
-+ Go into "System Type --->"
-+ Go into "EP93XX Options --->"
-+ Enable "EP93XX Internal DMA Support"
-+
-+
-+----------------
-+IDE
-+----------------
-+Needed by:
-+Needs:
-+ To Turn on IDE support for the platform, you need to enable
-+General IDE support first - CONFIG_BLK_DEV_IDE, CONFIG_BLK_DEV_IDEDISK,
-+CONFIG_BLK_DEV_IDECD.
-+
-+ If multiword DMA and ultra DMA support is needed, general DMA support for
-+the platform must be enabled first. See DMA section of this document for
-+options to enable DMA for the platform.
-+
-+ If CDROM support is enabled, ISO9660 file system support should be enabled.
-+If a DVD support is needed, UDF file system support should be enabled.
-+
-+To enable CONFIG_BLK_DEV_IDE:
-+ Go into "ATA /ATAPI/MFM/RLL support --->"
-+ Enable "ATA/ATAPI/MFM/RLL support"
-+ Go into "IDE, ATA, and ATAPI Block devices --->"
-+ Enable "Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support"
-+
-+To enable CONFIG_BLK_DEV_IDEDISK:
-+ Go into "ATA /ATAPI/MFM/RLL support --->"
-+ Go into "IDE, ATA, and ATAPI Block devices --->"
-+ Enable "Include IDE/ATA-2 DISK support"
-+
-+To enable CONFIG_BLK_DEV_IDECD:
-+ Go into "ATA /ATAPI/MFM/RLL support --->"
-+ Go into "IDE, ATA, and ATAPI Block devices --->"
-+ Enable "Include IDE/ATAPI CDROM support"
-+
-+To enable EP93XX IDE (PIO mode only):
-+ Go into "ATA /ATAPI/MFM/RLL support --->"
-+ Go into "IDE, ATA, and ATAPI Block devices --->"
-+ Enable "EP93XX IDE Support"
-+
-+To enable EP93XX IDE DMA (mdma and udma modes):
-+ Go into "ATA /ATAPI/MFM/RLL support --->"
-+ Go into "IDE, ATA, and ATAPI Block devices --->"
-+ Enable "EP93XX IDE DMA support"
-+
-+To enabled ISO 9660 file system support:
-+ Go into "File systems --->"
-+ Enable "ISo 9660 CDROM file system support"
-+ Enable "Microsoft Joliet CDROM extensions"
-+
-+To enable UDF file system support:
-+ Go into "File systems --->"
-+ Enable "UDF file system support (read only)"
-+
-+See also /Documentation/arm/ep93xx/ide-hard-drive-support.txt for information
-+on configuring the hard drive.
-+
-+----------------
-+IrDA
-+----------------
-+Described in /Documentation/arm/ep93xx/irda.txt
-+
-+
-+----------------
-+NFS
-+----------------
-+Described in /Documentation/arm/ep93xx/nfs.txt
-+
-+
-+----------------
-+Serial Terminal
-+----------------
-+To enable serial terminal:
-+ Go into "Character devices --->"
-+ Turn off "Support for console on virtual terminal"
-+ Turn off "Virtual terminal"
-+ Go into "Serial drivers --->"
-+ Turn on "Cirrus EP93xx ARM AMBA serial port support"
-+ Turn on "Support for console on EP93xx serial port"
-+
-+Serial terminal is the bottom jack of J7.
-+Format is 57600,8N1, flow control: "none".
-+
-+
-+----------------
-+Touchscreen
-+----------------
-+To enable touchscreen driver:
-+ Go into "Character devices --->"
-+ Go into "Mice --->"
-+ Enable "Mouse Support (not serial and bus mice)"
-+ Disable "PS/2 Mouse (aka "auxiliary device") support
-+ Enable "EP93xx touch screen support"
-+
-+
-+----------------
-+USB
-+----------------
-+The order of all of the following statements is critical as some options enable
-+other options.
-+
-+To enable basic USB support(required for all devices listed below):
-+ Go into "USB support --->"
-+ Enable "Support for USB"
-+ Enable "Preliminary USB device filesystem" (optional)
-+ Enable "EP93XX OHCI-compatible host interface support"
-+
-+To enable support for USB mouse:
-+ Go into "Input core support --->"
-+ Enable "Input core support"
-+ Enable "Mouse support"
-+
-+ Go back to the top level of menuconfig
-+
-+ Go into "USB support --->"
-+ Enable "USB Human Interface Device (full HID) support"
-+ Enable "HID input layer support"
-+
-+To enable support for USB Keyboard:
-+ Go into "Input core support --->"
-+ Enable "Input core support"
-+ Enable "Keyboard support"
-+
-+ Go back to the top level of menuconfig
-+
-+ Go into "USB support --->"
-+ Enable "USB Human Interface Device (full HID) support"
-+ Enable "HID input layer support"
-+
-+ Go back to the top level of menuconfig
-+ Go into "Character devices --->"
-+ Set EP93xx Keyboard Support to "USB"
-+
-+To enable USB Mass Storage support:
-+ Go into "SCSI Support --->"
-+ Enable "SCSI Support"
-+ Enable "SCSI disk support"
-+
-+ Go back to the top level of menuconfig
-+
-+ Go into "USB support --->"
-+ Enable "USB Mass Storage support"
-+
-+ Go back to the top level of menuconfig
-+
-+(optional - Do this if you want to mount a USB flash drive)
-+ Go into "File systems --->"
-+ Enable "DOS FAT fs support"
-+ Enable "VFAT (Windows-95) fs support"
-diff --git a/Documentation/arm/ep93xx/dma.txt b/Documentation/arm/ep93xx/dma.txt
-new file mode 100644
-index 0000000..e7fc1bb
---- /dev/null
-+++ b/Documentation/arm/ep93xx/dma.txt
-@@ -0,0 +1,300 @@
-+Support Functions for the Cirrus Logic ep93xx Internal DMA controller.
-+==============================================================================
-+
-+State diagram
-+
-+States:
-+Uninitialized (!pause & !xfer_enable)
-+Stopped (pause & !xfer_enable)
-+Transferring (!pause & xfer_enable)
-+Stopped by starvation (pause & xfer_enable)
-+
-+ _______________
-+ request ----------> | | <------- free -----------
-+ | Uninitialized | /\
-+ |_______________| ||
-+ ||
-+ || ||
-+ init || ------------------------------>||
-+ || /\ ||
-+ \/ || ||
-+ _________ ||
-+ ||<-- start && new_buffers <= 1 -- | | <----- flush <--------- ||
-+ || | Stopped | /\ ||
-+ || ---------> pause------> |_________| -------------------->|| ||
-+ || /\ ||
-+ || || || ||
-+ || || || start && new_buffers > 1 ||
-+ || || || ||
-+ || || \/ ||
-+ || || ______________ ||
-+ || || | | ------------------------->||
-+ || ||<---------------- | Transferring | ------------------->|| ||
-+ || || |______________| || ||
-+ || || || ||
-+ || || || || ||
-+ || || || new_buffers = 0 || ||
-+ || || /\ || || ||
-+ || || || \/ || ||
-+ || || new_buffers > 1 || || ||
-+ || || || || ||
-+ || || _______________________ || ||
-+ || ||<-------------- | | || ||
-+ \/ | Stopped by starvation | ------------>|| ||
-+ ---------------------------> |_______________________| || ||
-+ || ||
-+ || /\ || ||
-+ || || || ||
-+ || ||<-------- flush <--------------- ||
-+ || ||
-+ ------------------------------------------->||
-+
-+
-+------------------------------------------------------------------------------
-+EP93XX DMA API Functions
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_request(int * handle, const char * device_id,
-+ ep93xx_dma_dev_t device)
-+
-+This function will allocate a DMA channel for a particular hardware
-+peripheral. Before initiating a transfer on the allocated channel, the
-+channel has to be setup, and buffers have to be added to the channel.
-+
-+Parameters:
-+ int * handle A pointer which is filled in with a unique
-+ integer value, or handle. The handle is used
-+ to verify the validity of each call to
-+ access the dma channel.
-+
-+ const char * device_id string which is the name of the device
-+ attached to the dma channel.
-+
-+ ep93xx_dma_dev_t device hardware port to attach to the dma channel
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_free(int handle)
-+
-+This function disables and powers down the dma channel, and releases it
-+for future requests. Buffers queued up for the specified channel are
-+released without transferring.
-+
-+Parameters:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a DMA channel.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_add_buffer(int handle, unsigned int source,
-+ unsigned int dest, unsigned int size
-+ unsigned int last, unsigned int buf_id)
-+
-+This function adds a buffer entry to the DMA buffer queue. If the channel is
-+in the active transfer state, the buffer is immediately transferred,
-+otherwise the buffer is not transferred until a start or resume
-+command is issued. A -1 is returned if an error occurs, otherwise
-+a 0 is returned.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+ unsigned int source physical address for the start of this
-+ buffer.
-+
-+ unsigned int source physical address destination of the data.
-+
-+ unsigned int size buffer size in bytes
-+
-+ unsigned int last 1 if this is the last buffer in the transfer.
-+ If 1, disable the NFBint so we aren't
-+ interrupted for another buffer
-+ when we know there won't be another.
-+
-+ unsigned int buf_id Unique value used to identify this buffer.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_remove_buffer(int handle, unsigned int * address,
-+ unsigned int * size)
-+
-+This function removes a buffer entry from the DMA buffer queue. If a buffer
-+was removed successfully, a 0 is returned, otherwise -1 is returned.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+ unsigned int * buf_id Pointer to an integer which is filled in
-+ with the buffer id..
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_queue_full(int handle)
-+
-+This function queries to determine if the buffer queue for the specified
-+channel is full. A return value of 1 indicates the queue is not full, and a
-+0 indicates the queue is full.
-+
-+Parameters:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_get_position(int handle, unsigned int * buf_id,
-+ unsigned int * total)
-+
-+This function fills in the buffer ID of the current buffer and fills in the
-+total bytes transferred on the channel. If no buffer is active on the channel,
-+buf_id is filled in with a -1, otherwise it is the active buffer.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+ unsigned int * buf_id pointer to an integer which is filled in with
-+ buffer ID of the buffer currently
-+ transferring.
-+
-+ unsigned int * total pointer to an integer which is filled in
-+ with the total bytes transferred on the channel.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_config(int handle, unsigned int flags_m2m,
-+ unsigned int flags_m2p, dma_callback callback,
-+ unsigned int user_data)
-+
-+This function configures the DMA channel registers and installs a dma
-+callback function into the DMA instance. The DMA callback function is
-+defined by the driver which is using this DMA channel. It is called in
-+response to DMA interrupts, at the end of the DMA channel's interrupt
-+handler. A -1 is returned if an error occurs, otherwise a 0 is returned.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+ unsigned int flags_m2m Flags used for M2M channel configuration.
-+
-+ unsigned int flags_m2p Flags used for M2P/P2M channel
-+ configuration.
-+
-+ dma_callback callback Pointer to the callback function which will
-+ be called at the end of the dma interrupt
-+ service routine.
-+
-+ unsigned int user_data Data defined by the driver installing the
-+ callback function. This piece of data will
-+ be returned to the driver when the callback
-+ function is called.
-+
-+Callback function prototype:
-+
-+ void (* dma_callback)(ep93xx_dma_int_t interrupt,
-+ ep93xx_dma_dev_t device, unsigned int user_data)
-+
-+ Parameters:
-+ ep93xx_dma_int_t interrupt
-+ used by the DMA driver to inform the DMA callback
-+ function of the type of DMA interrupt that happened.
-+
-+ ep93xx_dma_dev_t device
-+ hardware port attached to the dma channel.
-+
-+ unsigned int user_data
-+ is a value defined and passed in by the driver which
-+ registered the callback function.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_start(int handle, unsigned int channels,
-+ unsigned int * handles
-+
-+This function enables the DMA channel, and initiates the transfer. If the
-+peripheral interface calls for it, multiple DMA channels can be started
-+with one call to this IOCTL. A -1 is returned if an error occurs,
-+otherwise a 0 is returned.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel. For a start
-+ multiple, this handle can be the handle
-+ for any of the channels to be started.
-+
-+ unsigned int channels Number of channels to start for this transfer.
-+ Specifically this applies to an audio interface
-+ where you can have up to 3 dma channels
-+ servicing a 6 audio channel output, in which case
-+ you need to initiate transfers on all 3 dma
-+ channels as closely together as possible. For
-+ the case of only one channel to be started, this
-+ field should be a 1.
-+
-+ unsigned int * handles Pointer to an array of handles, one for
-+ each channel which is to be started. If only one
-+ channel is to be started, this field should be
-+ NULL.
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_pause(int handle, unsigned int channels,
-+ unsigned int * handles)
-+
-+This function disables the DMA channel, pausing the transfer. The
-+position within the currently transferring buffer is saved, and restored upon
-+restarting the transfer on this channel. If the peripheral interface calls
-+for it, multiple DMA channels can be paused with one call to this IOCTL.
-+A -1 is returned if an error occurs, otherwise a 0 is returned.
-+
-+Parameter:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-+
-+ unsigned int channels Number of channels to pause for this
-+ transfer. Specifically this applies to
-+ an audio interface where you can have
-+ up to 3 dma channels servicing a 6
-+ audio channel output, in which case you
-+ need to pause transfers on all 3 dma
-+ channels as closely together as possible.
-+
-+ unsigned int * handles Pointer to an array of handles, one for
-+ each channel which is to be paused.
-+
-+NOTE: There is another way to pause the DMA channel - starve it.
-+When the dma channel reaches the point where there are no buffers in
-+the queue, but the interface has not been paused, then the dma instance
-+will indicate that the channel is in the transfer state, but the
-+channel itself is disabled until a new buffer is added to the queue
-+If the channel is stopped via this method, a resume command is not
-+required to restart a transfer. A transfer is started immediately
-+after two new buffers are added to the queue. The reason for two is
-+so that both channel buffer descriptors can be programmed with valid
-+buffers
-+
-+------------------------------------------------------------------------------
-+
-+ int ep93xx_dma_flush(int handle)
-+
-+This function completely flushes all queued buffers and any on going
-+DMA transfers on a given channel. If the dma channel is in the
-+active transfer state, once two buffers are added to the queue, the
-+channel will begin transferring data right away. If in the stop
-+state, a start command must be issued before any new buffers are
-+processed. A -1 is returned if an error occurs, otherwise a 0 is returned.
-+
-+Parameters:
-+ int handle A unique integer value, assigned
-+ during open, used to verify the validity of
-+ this call to access a dma channel.
-diff --git a/Documentation/arm/ep93xx/status.txt b/Documentation/arm/ep93xx/status.txt
-new file mode 100644
-index 0000000..082c2dd
---- /dev/null
-+++ b/Documentation/arm/ep93xx/status.txt
-@@ -0,0 +1,288 @@
-+#
-+# EP93xx driver support status
-+#
-+
-+======================================================================
-+(I) Introduction
-+======================================================================
-+
-+The EP93xx are embedded System On Chip (SOC) processors produced
-+by Cirrus (www.cirrus.com). They provided support based on 2.4.21-rmk1
-+kernels, and they said that there might be 2.6.x support some day.
-+Meanwhile they've released a 2.6.8.1 based kernel called "ursus".
-+
-+Currently we still have got a communication problem with cirrus,
-+for some reason it seems to be impossible to directly talk to their
-+developers. Hope this will change some day, but we really cannot afford
-+to just sit down and wait.
-+
-+The purpose of this file is to document success and todo's.
-+
-+ - Section II describes hardware support, organized according to the
-+ EP9315 datasheet. Other device datasheets are ordered similarly,
-+ though section numbers may vary.
-+
-+ - Section III contains other miscellaneous information.
-+
-+The latest version of this document may be found at:
-+
-+ linux/Documentation/arm/ep93xx/status.txt
-+
-+projects homepage can be found at:
-+
-+ http://members.inode.at/m.burian/ep93xx/index.html
-+
-+
-+======================================================================
-+(II) Hardware Support
-+======================================================================
-+
-+These section numbers mirror the EP9315 datasheet.
-+
-+1. Introduction
-+---------------
-+N/A
-+
-+2. ARM920T Core and Advanced High-Speed Bus (AHB)
-+-------------------------------------------------
-+We have standard Linux 2.6 support for ARM920T Core. Thumb support
-+is pretty shaky, as most people do not seem to use Thumb in the
-+kernel. Address translation uses 16K small pages exclusively (FIXME:
-+is this true?)
-+
-+3. MaverickCrunch Coprocessor
-+-----------------------------
-+People have started with forward porting. Note that there's more
-+to it than just kernel support. You also need to have a toolchain
-+supporting it. We're in need of a comprehensive HOWTO that explains kernel,
-+toolchain and userspace aspects to a point where average developers can use it
-+
-+
-+4. Boot ROM
-+-----------
-+Well, not really kernel related, most people start with redboot. Make
-+sure to use a version that passes the correct machine type. Some
-+people also started porting blob / uboot.
-+
-+If any support is added for this device, it will likely be a simple
-+char device that allows you to read the contents of the boot rom
-+for interests sake.
-+
-+5. System Controller
-+--------------------
-+System Controllers registers are set by startup code and by individual
-+drivers as needed, we try to keep the processor dependent stuff to
-+a minimum.
-+
-+Ray really wants to overhaul the system configuration stuff and move
-+towards something like the SA1100 people are doing. It should make
-+things a lot cleaner for drivers that share physical pins, or for
-+multifunctional blocks that require several drivers (eg: UART2 with
-+IrDA support)
-+
-+There is currently no dynamic clock control support. We'll probably
-+want to tie into the CPUfreq code at some point.
-+
-+There is no support for querying the system boot configuration or
-+last reset source.
-+
-+There is no power management support. Individual drivers may power
-+up silicon blocks as required. Some research is needed to map the
-+EP93xx power states onto the ACPI or PCI states that everyone seems
-+to use.
-+
-+There is no support for the TICK and WATCHDOGEXPIRED interrupts
-+generated by this block.
-+
-+There is no support for the AHB bus arbiter priority settings.
-+
-+6. Vectored Interrupt Controller
-+--------------------------------
-+Since we can boot this can't be done dead wrong. Standard level-triggered
-+interrupt support is present.
-+
-+No FIQ interrupts are supported.
-+
-+Support for demultiplexing GPIO IRQs is available.
-+
-+
-+7. Raster Engine With Analog/LCD Integrated Timing and Interface
-+----------------------------------------------------------------
-+
-+Michael has rewritten large parts of the framebuffer driver based on
-+skeleton.c. You need to adapt this in case you can't live with
-+the standard display(s) that are included. Framebuffer is fixed
-+size, you can change some settings at compile time, though.
-+TODO: clean ups, different resolutions, etc
-+
-+
-+8. Graphics Accelerator
-+-----------------------
-+not available yet, will be done after the framebuffer code has been
-+cleaned up.
-+
-+
-+9. 1/10/100 Mbps Ethernet LAN Controller
-+----------------------------------------
-+Supported. Driver has been reviewed and cleaned up.
-+Uses generic mii routines now. It might be possible
-+to use DMA - but in that case we'd need to find a
-+workaround to get around the fact that it can only
-+transfer 32bit aligned data, while we'd need to transfer
-+data that's only 16 bit aligned.
-+
-+NICE-TO-HAVE: Could be ported to use NAPI.
-+
-+10. DMA Controller
-+------------------
-+There is some code and documentation ported forward from the Cirrus
-+2.4 port.
-+
-+11. Universal Serial Bus Host Controller
-+----------------------------------------
-+Ray has written some glue code to plug the OHCI host controller into
-+the Linux 2.6 USB stack. This has been tested on an EDB9301 board with
-+a single port populated. A serial dongle worked fine, and several
-+different flash keys seem to work okay with the USB mass storage
-+driver using SCSI disk emulation. This hasn't really been stress tested
-+yet, but initial results look very encouraging.
-+
-+12. Static Memory Controller
-+----------------------------
-+Not sure how much kernel support is required here. Flash and memory
-+timing needs to be setup by the bootloader, so there's not much
-+that needs to be done here.
-+
-+No support for PCMCIA at this time.
-+
-+13. SDRAM, SyncROM, and SyncFLASH Controller
-+--------------------------------------------
-+Again, this is probably the bootloaders problem.
-+
-+There is an errata about system instability when suspending with
-+an SDRAM bus speed over 50 MHz. May need to tweak this if we start
-+doing power management modes.
-+
-+14. UART1 With HDLC and Modem Control Signals
-+---------------------------------------------
-+We've got a driver to use this one as UART. No DMA support. FIFO support
-+works. No HDLC support. Needs some syscon support to cleanly handle
-+HDLC and some modem signals.
-+
-+15. UART2
-+---------
-+We've got a driver to use this one as UART. No DMA support. FIFO support
-+works. No IrDA SIR support. Needs some syscon support to cleanly handle
-+IrDA SIR.
-+
-+16. UART3 With HDLC Encoder
-+---------------------------
-+We've got a driver to use this one as UART. No DMA support. FIFO support
-+works. No HDLC or RS-485 support. Needs some syscon support to cleanly
-+handle HDLC and RS-485.
-+
-+17. IRDA
-+--------
-+There is some code and documentation ported forward from the Cirrus
-+2.4 port. No idea how well this works, if at all.
-+
-+18. TIMERS
-+----------
-+Timer1 is used at 508 kHz with a reload value of 5080 to provide a 100 Hz
-+tick signal to drive the kernel.
-+
-+Timer 2 and 3 are not currently used, nor is the debug timer 4.
-+
-+
-+19. WATCHDOG Timer
-+------------------
-+Ray has some initial experimental code written (not pushed) to drive this.
-+The onboard watchdog seems to have a 250 ms (!) timeout, while most PC
-+dogs seem to have timeouts on the order of one minute or more. The standard
-+approach of having a user level process open the watchdog device and
-+kick it every so often seems like a bad idea here... a momentary system
-+load spike could easily delay the monitor from being scheduled, and the
-+system would reboot.
-+
-+Test out a watchdog monitor running at a high scheduling priority, or else
-+design a kernel watchdog that kicks the dog every timer tick and exports
-+a more reasonable timeout value to userspace.
-+
-+20. Real Time Clock With Software Trim
-+--------------------------------------
-+We did not bother to write a driver yet, it would require a design
-+that ensures CPU is always powered on, and always have at least
-+a 32kHz clock running. Most people prefer to use and external RTC.
-+We've got support for the DS1337 RTC that seems to be popular on
-+ep93xx based boards.
-+
-+21. I2S Controller
-+------------------
-+No support yet. Klaus is working on it.
-+
-+22. AC97 Controller
-+-------------------
-+Supported but could need some testing.
-+
-+23. Synchronous Serial Port
-+---------------------------
-+Two driver are available, a forward port from the cirrus driver and
-+another driver from Ray.
-+
-+24. Pulse Width Modulator
-+-------------------------
-+No support yet.
-+
-+25. Analog Touch Screen Interface
-+---------------------------------
-+People already played with this, AFAIK one would need a silicon
-+revision > D1 (November 2004) for this to work properly.
-+
-+26. Keypad Interface
-+--------------------
-+We've got a driver for the 8x8 keypad. Chances are that you might
-+want to create a custom keymap. There's also support for mobile
-+phone like input (key 1 becomes -> A -> B -> C) if pressed repeatedly
-+within half a second.
-+
-+27. IDE interface
-+-----------------
-+We've got IDE working in polling only, no DMA support so far.
-+It needs to be cleaned up, too.
-+
-+28. GPIO
-+--------
-+Standard LED support for red and green leds is present.
-+
-+Michael has written an I2C bus driver using the new Linux device driver model.
-+It supports an external DS1337 RTC device on the EECLK/EEDAT pins.
-+
-+Need some syscon support to cleanly handle the multi-function GPIO pins.
-+
-+Demultiplexing of GPIO interrupts is possible now.
-+
-+29. Security
-+------------
-+No information available on this, so support is unlikely in the near future.
-+
-+30. Glossary
-+------------
-+N/A
-+
-+
-+======================================================================
-+(III) Stuff not found in the datasheet
-+======================================================================
-+
-+1. printascii hack has been removed from our tree.
-+
-+2. I2C driver
-+We've got a bit banging I2C driver
-+
-+3. External RTC (DS1337)
-+Setting and getting the time works
-+TODO: advanced features, such as alarm, timer for /dev/rtc
-+
-+4. Controller Area Network (CAN)
-+We have got a character device based driver for the OKI ML9620 CAN Controller.
-+
-diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 4b15f5f..f23341e 100644
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -103,6 +103,17 @@ config ARCH_EBSA110
- Ethernet interface, two PCMCIA sockets, two serial ports and a
- parallel port.
-
-+config ARCH_EP93XX
-+ bool "EP93xx"
-+ select ARM_AMBA
-+ help
-+ Say Y here to enable support for the Cirrus EP93xx CPU family
-+ and choose your specific CPU below.
-+
-+ See the Cirrus web page for details.
-+
-+ <http://www.cirrus.com/>
-+
- config ARCH_CAMELOT
- bool "Epxa10db"
- help
-@@ -219,6 +230,8 @@ endchoice
-
- source "arch/arm/mach-clps711x/Kconfig"
-
-+source "arch/arm/mach-ep93xx/Kconfig"
-+
- source "arch/arm/mach-epxa10db/Kconfig"
-
- source "arch/arm/mach-footbridge/Kconfig"
-@@ -403,7 +416,7 @@ config NO_IDLE_HZ
-
- config ARCH_DISCONTIGMEM_ENABLE
- bool
-- default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
-+ default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM) || ARCH_EP93XX
- help
- Say Y to support efficient handling of discontiguous physical memory,
- for architectures which are either NUMA (Non-Uniform Memory Access)
-@@ -415,7 +428,7 @@ source "mm/Kconfig"
- config LEDS
- bool "Timer and CPU usage LEDs"
- depends on ARCH_CDB89712 || ARCH_CO285 || ARCH_EBSA110 || \
-- ARCH_EBSA285 || ARCH_IMX || ARCH_INTEGRATOR || \
-+ ARCH_EBSA285 || ARCH_EP93XX || ARCH_IMX || ARCH_INTEGRATOR || \
- ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
- ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
- ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE
-@@ -432,7 +445,7 @@ config LEDS
-
- config LEDS_TIMER
- bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \
-- MACH_OMAP_H2 || MACH_OMAP_PERSEUS2
-+ MACH_OMAP_H2 || MACH_OMAP_PERSEUS2
- depends on LEDS
- default y if ARCH_EBSA110
- help
-@@ -702,9 +715,10 @@ source "drivers/block/Kconfig"
-
- source "drivers/acorn/block/Kconfig"
-
--if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \
-- || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
-- || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
-+if PCMCIA || ARCH_CLPS7500 || ARCH_EP9312 || ARCH_EP9315 \
-+ || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_L7200 || ARCH_LH7A40X \
-+ || ARCH_PXA || ARCH_RPC || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK \
-+ || FOOTBRIDGE
- source "drivers/ide/Kconfig"
- endif
-
-diff --git a/arch/arm/Makefile b/arch/arm/Makefile
-index 81bd219..924d31f 100644
---- a/arch/arm/Makefile
-+++ b/arch/arm/Makefile
-@@ -92,6 +92,7 @@ textaddr-$(CONFIG_ARCH_FORTUNET) := 0x
- machine-$(CONFIG_ARCH_IOP3XX) := iop3xx
- machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx
- machine-$(CONFIG_ARCH_IXP2000) := ixp2000
-+ machine-$(CONFIG_ARCH_EP93XX) := ep93xx
- machine-$(CONFIG_ARCH_OMAP1) := omap1
- machine-$(CONFIG_ARCH_OMAP2) := omap2
- incdir-$(CONFIG_ARCH_OMAP) := omap
-diff --git a/arch/arm/configs/adssphere_defconfig b/arch/arm/configs/adssphere_defconfig
-new file mode 100644
-index 0000000..195d80e
---- /dev/null
-+++ b/arch/arm/configs/adssphere_defconfig
-@@ -0,0 +1,1240 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.12.2
-+# Wed Jul 6 13:49:08 2005
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_IOMAP=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_CLEAN_COMPILE=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_KOBJECT_UEVENT=y
-+# CONFIG_IKCONFIG is not set
-+# CONFIG_EMBEDDED is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_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_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 is not set
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE is not set
-+# CONFIG_ARCH_IMX is not set
-+# CONFIG_ARCH_H720X is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+CONFIG_ARCH_EP9315=y
-+# CONFIG_MACH_EDB9315 is not set
-+CONFIG_MACH_ADSSPHERE=y
-+# CONFIG_MACH_ZEFEERDZQ is not set
-+CONFIG_EP93XX_DMA=y
-+# CONFIG_ARCH_EP93XX_IDE is not set
-+# CONFIG_EP93XX_SSP is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_CACHE_VIVT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+# CONFIG_ARM_THUMB is not set
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+
-+#
-+# Bus support
-+#
-+CONFIG_ARM_AMBA=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+CONFIG_PCCARD=y
-+# CONFIG_PCMCIA_DEBUG is not set
-+CONFIG_PCMCIA=y
-+
-+#
-+# PC-card bridges
-+#
-+# CONFIG_TCIC is not set
-+CONFIG_PCMCIA_EP93XX=y
-+
-+#
-+# Kernel Features
-+#
-+# CONFIG_SMP is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_LEDS=y
-+CONFIG_LEDS_TIMER=y
-+# CONFIG_LEDS_CPU is not set
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Boot options
-+#
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="console=ttyAM0,38400 rw root=/dev/ram initrd=0x00600000,5m ramdisk_size=12288 rootfstype=ext2 mtdparts=flash:256k(boot),256k(bootvars),1536k(zImage),5m(ramdisk.gz),-(flashfs1) SERIALGETTY=ttyAM0 SERIALBAUD=38400"
-+# CONFIG_XIP_KERNEL is not set
-+
-+#
-+# Floating point emulation
-+#
-+
-+#
-+# At least one emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+# CONFIG_FPE_NWFPE_XP is not set
-+# CONFIG_FPE_FASTFPE is not set
-+
-+#
-+# Userspace binary formats
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_ARTHUR is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_AFS_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM 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 is not set
-+CONFIG_MTD_ADSFLASH=y
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+
-+#
-+# NAND Flash Device Drivers
-+#
-+# CONFIG_MTD_NAND is not set
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=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_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CDROM_PKTCDVD is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+CONFIG_IDE=y
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+CONFIG_BLK_DEV_IDECS=y
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+CONFIG_BLK_DEV_EP93XX=y
-+# CONFIG_BLK_DEV_IDEDMA_EP93XX is not set
-+CONFIG_IDE_ARM=y
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+# CONFIG_IDEDMA_AUTO is not set
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=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
-+
-+#
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# 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_MD is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# Networking support
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+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_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+CONFIG_IP_MROUTE=y
-+# CONFIG_IP_PIMSM_V1 is not set
-+# CONFIG_IP_PIMSM_V2 is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_IP_TCPDIAG=y
-+# CONFIG_IP_TCPDIAG_IPV6 is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE is not set
-+
-+#
-+# Network testing
-+#
-+# 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=y
-+CONFIG_BT_L2CAP=y
-+# CONFIG_BT_SCO is not set
-+# CONFIG_BT_RFCOMM is not set
-+CONFIG_BT_BNEP=y
-+# CONFIG_BT_BNEP_MC_FILTER is not set
-+# CONFIG_BT_BNEP_PROTO_FILTER is not set
-+# CONFIG_BT_HIDP is not set
-+
-+#
-+# Bluetooth device drivers
-+#
-+CONFIG_BT_HCIUSB=y
-+# CONFIG_BT_HCIUSB_SCO is not set
-+# CONFIG_BT_HCIUART is not set
-+# CONFIG_BT_HCIBCM203X is not set
-+# CONFIG_BT_HCIBPA10X is not set
-+# CONFIG_BT_HCIBFUSB is not set
-+# CONFIG_BT_HCIDTL1 is not set
-+# CONFIG_BT_HCIBT3C is not set
-+# CONFIG_BT_HCIBLUECARD is not set
-+# CONFIG_BT_HCIBTUART is not set
-+# CONFIG_BT_HCIVHCI is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+CONFIG_NET_RADIO=y
-+
-+#
-+# Obsolete Wireless cards support (pre-802.11)
-+#
-+# CONFIG_STRIP is not set
-+# CONFIG_PCMCIA_WAVELAN is not set
-+# CONFIG_PCMCIA_NETWAVE is not set
-+
-+#
-+# Wireless 802.11 Frequency Hopping cards support
-+#
-+# CONFIG_PCMCIA_RAYCS is not set
-+
-+#
-+# Wireless 802.11b ISA/PCI cards support
-+#
-+CONFIG_HERMES=y
-+CONFIG_ATMEL=y
-+
-+#
-+# Wireless 802.11b Pcmcia/Cardbus cards support
-+#
-+CONFIG_PCMCIA_HERMES=y
-+CONFIG_AIRO_CS=y
-+CONFIG_PCMCIA_ATMEL=y
-+CONFIG_PCMCIA_WL3501=y
-+CONFIG_NET_WIRELESS=y
-+
-+#
-+# PCMCIA network device support
-+#
-+CONFIG_NET_PCMCIA=y
-+# CONFIG_PCMCIA_3C589 is not set
-+# CONFIG_PCMCIA_3C574 is not set
-+# CONFIG_PCMCIA_FMVJ18X is not set
-+CONFIG_PCMCIA_PCNET=y
-+# CONFIG_PCMCIA_NMCLAN is not set
-+# CONFIG_PCMCIA_SMC91C92 is not set
-+# CONFIG_PCMCIA_XIRC2PS is not set
-+# CONFIG_PCMCIA_AXNET 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
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_TSDEV=y
-+CONFIG_INPUT_TSDEV_SCREEN_X=640
-+CONFIG_INPUT_TSDEV_SCREEN_Y=480
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+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_EP93XX is not set
-+CONFIG_INPUT_MOUSE=y
-+# CONFIG_MOUSE_PS2 is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+CONFIG_INPUT_TOUCHSCREEN=y
-+# 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_EP93XX=y
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+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 is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_EP93XX_WATCHDOG=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_EP93XX_RTC is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_DRM is not set
-+
-+#
-+# PCMCIA character devices
-+#
-+# CONFIG_SYNCLINK_CS is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# TPM devices
-+#
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_EP93XX=y
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Hardware Sensors Chip support
-+#
-+CONFIG_I2C_SENSOR=y
-+# 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_ASB100 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_SMSC47B397 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+
-+#
-+# Other I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+CONFIG_SENSORS_DS1307=y
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 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
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# Multimedia devices
-+#
-+CONFIG_VIDEO_DEV=y
-+
-+#
-+# Video For Linux
-+#
-+
-+#
-+# Video Adapters
-+#
-+# CONFIG_VIDEO_CPIA is not set
-+# CONFIG_VIDEO_SAA5246A is not set
-+# CONFIG_VIDEO_SAA5249 is not set
-+# CONFIG_TUNER_3036 is not set
-+# CONFIG_VIDEO_OVCAMCHIP is not set
-+
-+#
-+# Radio Adapters
-+#
-+# CONFIG_RADIO_MAESTRO is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_FB=y
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+CONFIG_FB_SOFT_CURSOR=y
-+# CONFIG_FB_MACMODES is not set
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_TILEBLITTING is not set
-+# CONFIG_FB_ARMCLCD is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+CONFIG_FB_EP93XX=y
-+# CONFIG_FB_CRT_EP93XX is not set
-+# CONFIG_FB_LCD_EP93XX is not set
-+# CONFIG_FB_LCD_EP93XX_SHARP is not set
-+CONFIG_FB_LCD_EP93XX_SHARP_LQ64D343=y
-+# CONFIG_FB_CX25871 is not set
-+# CONFIG_FB_EP93XX_8BPP is not set
-+CONFIG_FB_EP93XX_16BPP_565=y
-+# CONFIG_FB_EP93XX_24BPP is not set
-+# CONFIG_FB_EP93XX_32BPP is not set
-+# 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_FONTS=y
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_FONT_6x11 is not set
-+# CONFIG_FONT_PEARL_8x8 is not set
-+# CONFIG_FONT_ACORN_8x8 is not set
-+# CONFIG_FONT_MINI_4x6 is not set
-+# CONFIG_FONT_SUN8x16 is not set
-+# CONFIG_FONT_SUN12x22 is not set
-+
-+#
-+# Logo configuration
-+#
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_LOGO_LINUX_CLUT224=y
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+# CONFIG_SND is not set
-+
-+#
-+# Open Sound System
-+#
-+CONFIG_SOUND_PRIME=y
-+# CONFIG_SOUND_BT878 is not set
-+# CONFIG_SOUND_FUSION is not set
-+# CONFIG_SOUND_CS4281 is not set
-+# CONFIG_SOUND_SONICVIBES is not set
-+# CONFIG_SOUND_TRIDENT is not set
-+# CONFIG_SOUND_MSNDCLAS is not set
-+# CONFIG_SOUND_MSNDPIN is not set
-+CONFIG_SOUND_OSS=y
-+# CONFIG_SOUND_TRACEINIT is not set
-+# CONFIG_SOUND_DMAP is not set
-+# CONFIG_SOUND_AD1816 is not set
-+# CONFIG_SOUND_SGALAXY is not set
-+# CONFIG_SOUND_ADLIB is not set
-+# CONFIG_SOUND_ACI_MIXER is not set
-+# CONFIG_SOUND_CS4232 is not set
-+# CONFIG_SOUND_SSCAPE is not set
-+# CONFIG_SOUND_GUS is not set
-+# CONFIG_SOUND_VMIDI is not set
-+# CONFIG_SOUND_TRIX is not set
-+# CONFIG_SOUND_MSS is not set
-+# CONFIG_SOUND_MPU401 is not set
-+# CONFIG_SOUND_NM256 is not set
-+# CONFIG_SOUND_MAD16 is not set
-+# CONFIG_SOUND_PAS is not set
-+# CONFIG_SOUND_PSS is not set
-+# CONFIG_SOUND_SB is not set
-+# CONFIG_SOUND_AWE32_SYNTH is not set
-+# CONFIG_SOUND_WAVEFRONT is not set
-+# CONFIG_SOUND_MAUI is not set
-+# CONFIG_SOUND_YM3812 is not set
-+# CONFIG_SOUND_OPL3SA1 is not set
-+# CONFIG_SOUND_OPL3SA2 is not set
-+# CONFIG_SOUND_UART6850 is not set
-+# CONFIG_SOUND_AEDSP16 is not set
-+CONFIG_SOUND_EP93XX_AC97=y
-+# CONFIG_SOUND_TVMIXER is not set
-+# CONFIG_SOUND_AD1980 is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_SL811_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_AUDIO is not set
-+
-+#
-+# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
-+#
-+# CONFIG_USB_MIDI 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
-+#
-+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
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+CONFIG_USB_HIDINPUT=y
-+# 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_KBTAB is not set
-+# CONFIG_USB_POWERMATE is not set
-+# CONFIG_USB_MTOUCH is not set
-+# CONFIG_USB_EGALAX is not set
-+# CONFIG_USB_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE 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
-+# CONFIG_USB_VICAM is not set
-+# CONFIG_USB_DSBR is not set
-+# CONFIG_USB_IBMCAM is not set
-+# CONFIG_USB_KONICAWC is not set
-+CONFIG_USB_OV511=y
-+# CONFIG_USB_SE401 is not set
-+# CONFIG_USB_SN9C102 is not set
-+# CONFIG_USB_STV680 is not set
-+# CONFIG_USB_PWC is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+CONFIG_USB_PEGASUS=y
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_USB_ZD1201 is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETKIT is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_IDMOUSE is not set
-+
-+#
-+# USB ATM/DSL drivers
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR 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_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_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_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_SYSFS=y
-+# CONFIG_DEVFS_FS is not set
-+CONFIG_DEVPTS_FS_XATTR=y
-+# CONFIG_DEVPTS_FS_SECURITY is not set
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_XATTR is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+# CONFIG_JFFS2_FS_NAND is not set
-+# CONFIG_JFFS2_FS_NOR_ECC 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_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_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=y
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_FS is not set
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+# CONFIG_DEBUG_LL is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Hardware crypto devices
-+#
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/dma03_defconfig b/arch/arm/configs/dma03_defconfig
-new file mode 100644
-index 0000000..59b677c
---- /dev/null
-+++ b/arch/arm/configs/dma03_defconfig
-@@ -0,0 +1,1281 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.15-rc4
-+# Fri Dec 9 21:21:27 2005
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_CLEAN_COMPILE is not set
-+CONFIG_BROKEN=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_KOBJECT_UEVENT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_EMBEDDED is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_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_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+
-+#
-+# Block layer
-+#
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE is not set
-+# CONFIG_ARCH_REALVIEW is not set
-+# CONFIG_ARCH_IMX is not set
-+# CONFIG_ARCH_H720X is not set
-+# CONFIG_ARCH_AAEC2000 is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+CONFIG_ARCH_EP9315=y
-+# CONFIG_MACH_EDB9315 is not set
-+# CONFIG_MACH_ADSSPHERE is not set
-+# CONFIG_MACH_ZEFEERDZQ is not set
-+CONFIG_MACH_DMA03=y
-+CONFIG_ARCH_EP93XX_GPIO_IRQ=y
-+CONFIG_EP93XX_DMA=y
-+CONFIG_EP93XX_SSP=y
-+CONFIG_EP93XX_SSP_CIRRUS=y
-+# CONFIG_EP93XX_SSP_LINUX is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_CACHE_VIVT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+# CONFIG_ARM_THUMB is not set
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+
-+#
-+# Bus support
-+#
-+CONFIG_ARM_AMBA=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Kernel Features
-+#
-+# CONFIG_PREEMPT is not set
-+# CONFIG_NO_IDLE_HZ is not set
-+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM_MANUAL=y
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4096
-+CONFIG_LEDS=y
-+CONFIG_LEDS_TIMER=y
-+CONFIG_LEDS_CPU=y
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Boot options
-+#
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="root=/dev/hda1 slram=sram,0x20000000,0x2010000 parport=0xD0000020,74 lp=parport0"
-+# CONFIG_XIP_KERNEL is not set
-+
-+#
-+# Floating point emulation
-+#
-+
-+#
-+# At least one emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+# CONFIG_FPE_NWFPE_XP is not set
-+# CONFIG_FPE_FASTFPE is not set
-+
-+#
-+# Userspace binary formats
-+#
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_AOUT=y
-+CONFIG_BINFMT_MISC=y
-+# 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=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+CONFIG_NET_KEY=y
-+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_TUNNEL is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_BIC=y
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+
-+#
-+# DCCP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_DCCP is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_IEEE80211 is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+
-+#
-+# Connector - unified userspace <-> kernelspace linker
-+#
-+# CONFIG_CONNECTOR is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+CONFIG_MTD_REDBOOT_PARTS=y
-+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-+CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_AFS_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+CONFIG_MTD_CFI_AMDSTD_RETRY=0
-+CONFIG_MTD_CFI_STAA=y
-+CONFIG_MTD_CFI_UTIL=y
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+CONFIG_MTD_ABSENT=y
-+# CONFIG_MTD_OBSOLETE_CHIPS is not set
-+# CONFIG_MTD_XIP is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+CONFIG_MTD_COMPLEX_MAPPINGS=y
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0x60000000
-+CONFIG_MTD_PHYSMAP_LEN=0x02000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=4
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_IMPA7 is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+CONFIG_MTD_SLRAM=y
-+CONFIG_MTD_PHRAM=y
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+
-+#
-+# NAND Flash Device Drivers
-+#
-+CONFIG_MTD_NAND=y
-+CONFIG_MTD_NAND_VERIFY_WRITE=y
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+
-+#
-+# OneNAND Flash Device Drivers
-+#
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# Parallel port support
-+#
-+CONFIG_PARPORT=y
-+CONFIG_PARPORT_PC=y
-+# CONFIG_PARPORT_PC_FIFO is not set
-+# CONFIG_PARPORT_PC_SUPERIO is not set
-+# CONFIG_PARPORT_ARC is not set
-+# CONFIG_PARPORT_GSC is not set
-+CONFIG_PARPORT_1284=y
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_PARIDE is not set
-+# 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=12288
-+CONFIG_BLK_DEV_INITRD=y
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+CONFIG_IDE=y
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+CONFIG_IDEDISK_MULTI_MODE=y
-+CONFIG_BLK_DEV_IDECD=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+CONFIG_BLK_DEV_EP93XX=y
-+# CONFIG_BLK_DEV_IDEDMA_EP93XX is not set
-+CONFIG_IDE_ARM=y
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+# CONFIG_IDEDMA_AUTO is not set
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=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 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# 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_ISCSI_TCP is not set
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_PPA is not set
-+# CONFIG_SCSI_IMM is not set
-+# CONFIG_SCSI_DEBUG 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
-+#
-+# CONFIG_IEEE1394 is not set
-+
-+#
-+# 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_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+# CONFIG_NET_POCKET is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PLIP is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+CONFIG_NETCONSOLE=y
-+CONFIG_NETPOLL=y
-+# CONFIG_NETPOLL_RX is not set
-+# CONFIG_NETPOLL_TRAP is not set
-+CONFIG_NET_POLL_CONTROLLER=y
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+# 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_EP93XX=y
-+CONFIG_KEYBOARD_EP93XX_SPI=y
-+CONFIG_KEYBOARD_EP93XX_8X8=y
-+CONFIG_KEYBOARD_EP93XX_8X8_CYCLING=y
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_SERIAL=y
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+CONFIG_INPUT_TOUCHSCREEN=y
-+# 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_EP93XX=y
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PARKBD is not set
-+# CONFIG_SERIO_AMBAKMI 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_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+CONFIG_PRINTER=m
-+# CONFIG_LP_CONSOLE is not set
-+CONFIG_PPDEV=m
-+# CONFIG_TIPAR is not set
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+# CONFIG_WATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_EP93XX_RTC is not set
-+CONFIG_DS1337_RTC=y
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+
-+#
-+# CAN bus devices
-+#
-+CONFIG_CAN_BUS=y
-+CONFIG_OKI_CAN_ML9620=y
-+# CONFIG_OKI_CAN_ML9620_MICRO9 is not set
-+CONFIG_OKI_CAN_ML9620_GASSNER=y
-+CONFIG_OKI_CAN_ML9620_2DEV=y
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# TPM devices
-+#
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_TELCLOCK is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_EP93XX=y
-+# CONFIG_I2C_PARPORT is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+CONFIG_SENSORS_DS1337=y
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_SENSORS_DS1307 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_RTC_X1205_I2C is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# Hardware Monitoring support
-+#
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# Multimedia Capabilities Port drivers
-+#
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_FB=y
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_MACMODES is not set
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_TILEBLITTING is not set
-+# CONFIG_FB_ARMCLCD is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+CONFIG_FB_EP93XX=y
-+# CONFIG_FB_CRT_EP93XX is not set
-+# CONFIG_FB_LCD_EP93XX is not set
-+CONFIG_FB_LCD_EP93XX_SHARP=y
-+# CONFIG_FB_LCD_EP93XX_SHARP_LQ64D343 is not set
-+# CONFIG_FB_CX25871 is not set
-+# CONFIG_FB_LCD_TX09D50VM1CCA is not set
-+# CONFIG_FB_EP93XX_8BPP is not set
-+# CONFIG_FB_EP93XX_16BPP_565 is not set
-+# CONFIG_FB_EP93XX_24BPP is not set
-+CONFIG_FB_EP93XX_32BPP=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=y
-+CONFIG_FONT_8x16=y
-+CONFIG_FONT_6x11=y
-+CONFIG_FONT_7x14=y
-+CONFIG_FONT_PEARL_8x8=y
-+CONFIG_FONT_ACORN_8x8=y
-+CONFIG_FONT_MINI_4x6=y
-+CONFIG_FONT_SUN8x16=y
-+CONFIG_FONT_SUN12x22=y
-+CONFIG_FONT_10x18=y
-+
-+#
-+# Logo configuration
-+#
-+# CONFIG_LOGO is not set
-+CONFIG_BACKLIGHT_LCD_SUPPORT=y
-+CONFIG_BACKLIGHT_CLASS_DEVICE=y
-+CONFIG_BACKLIGHT_DEVICE=y
-+CONFIG_LCD_CLASS_DEVICE=y
-+CONFIG_LCD_DEVICE=y
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=m
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+# CONFIG_SND is not set
-+
-+#
-+# Open Sound System
-+#
-+CONFIG_SOUND_PRIME=m
-+# CONFIG_OBSOLETE_OSS_DRIVER is not set
-+# CONFIG_SOUND_MSNDCLAS is not set
-+# CONFIG_SOUND_MSNDPIN is not set
-+CONFIG_SOUND_OSS=m
-+# CONFIG_SOUND_TRACEINIT is not set
-+# CONFIG_SOUND_DMAP is not set
-+# CONFIG_SOUND_AD1816 is not set
-+# CONFIG_SOUND_ADLIB is not set
-+# CONFIG_SOUND_ACI_MIXER is not set
-+# CONFIG_SOUND_VMIDI is not set
-+# CONFIG_SOUND_TRIX is not set
-+# CONFIG_SOUND_MSS is not set
-+# CONFIG_SOUND_MPU401 is not set
-+# CONFIG_SOUND_PAS is not set
-+# CONFIG_SOUND_PSS is not set
-+# CONFIG_SOUND_SB is not set
-+# CONFIG_SOUND_OPL3SA2 is not set
-+# CONFIG_SOUND_UART6850 is not set
-+# CONFIG_SOUND_AEDSP16 is not set
-+CONFIG_SOUND_EP93XX_AC97=m
-+CONFIG_SOUND_EP93XX_AC97_CODEC_CS4297=y
-+# CONFIG_SOUND_EP93XX_AUDIO_PIO is not set
-+# CONFIG_SOUND_TVMIXER is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-+# 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=y
-+CONFIG_USB_STORAGE_FREECOM=y
-+CONFIG_USB_STORAGE_ISD200=y
-+CONFIG_USB_STORAGE_DPCM=y
-+CONFIG_USB_STORAGE_USBAT=y
-+CONFIG_USB_STORAGE_SDDR09=y
-+CONFIG_USB_STORAGE_SDDR55=y
-+CONFIG_USB_STORAGE_JUMPSHOT=y
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+CONFIG_USB_HIDINPUT=y
-+# 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_YEALINK is not set
-+# CONFIG_USB_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+# CONFIG_USB_KEYSPAN_REMOTE is not set
-+# CONFIG_USB_APPLETOUCH is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# 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
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_USS720 is not set
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETKIT is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY 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 is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+CONFIG_ROMFS_FS=y
-+CONFIG_INOTIFY=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_AUTOFS_FS=y
-+# CONFIG_AUTOFS4_FS is not set
-+CONFIG_FUSE_FS=y
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_ZISOFS_FS=y
-+CONFIG_UDF_FS=y
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=850
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+# CONFIG_NTFS_RW is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLBFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=y
-+CONFIG_RELAYFS_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_JFFS_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_COMPRESSION_OPTIONS=y
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_JFFS2_CMODE_NONE is not set
-+CONFIG_JFFS2_CMODE_PRIORITY=y
-+# CONFIG_JFFS2_CMODE_SIZE 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 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=y
-+
-+#
-+# 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_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+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=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=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_LOG_BUF_SHIFT=17
-+# CONFIG_DETECT_SOFTLOCKUP is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_DEBUG_VM is not set
-+CONFIG_FRAME_POINTER=y
-+# CONFIG_RCU_TORTURE_TEST is not set
-+CONFIG_DEBUG_USER=y
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_HMAC=y
-+CONFIG_CRYPTO_NULL=y
-+CONFIG_CRYPTO_MD4=y
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+CONFIG_CRYPTO_SHA256=y
-+CONFIG_CRYPTO_SHA512=y
-+CONFIG_CRYPTO_WP512=y
-+CONFIG_CRYPTO_TGR192=y
-+CONFIG_CRYPTO_DES=y
-+CONFIG_CRYPTO_BLOWFISH=y
-+CONFIG_CRYPTO_TWOFISH=y
-+CONFIG_CRYPTO_SERPENT=y
-+CONFIG_CRYPTO_AES=y
-+CONFIG_CRYPTO_CAST5=y
-+CONFIG_CRYPTO_CAST6=y
-+CONFIG_CRYPTO_TEA=y
-+CONFIG_CRYPTO_ARC4=y
-+CONFIG_CRYPTO_KHAZAD=y
-+CONFIG_CRYPTO_ANUBIS=y
-+CONFIG_CRYPTO_DEFLATE=y
-+CONFIG_CRYPTO_MICHAEL_MIC=y
-+CONFIG_CRYPTO_CRC32C=y
-+# CONFIG_CRYPTO_TEST is not set
-+
-+#
-+# Hardware crypto devices
-+#
-+
-+#
-+# Library routines
-+#
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=y
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/edb9301_defconfig b/arch/arm/configs/edb9301_defconfig
-new file mode 100644
-index 0000000..e105976
---- /dev/null
-+++ b/arch/arm/configs/edb9301_defconfig
-@@ -0,0 +1,965 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.9-rc2-ep93xx
-+# Mon Nov 8 16:32:53 2004
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_IOMAP=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_CLEAN_COMPILE=y
-+CONFIG_BROKEN_ON_SMP=y
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+CONFIG_HOTPLUG=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_EMBEDDED=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SHMEM=y
-+# CONFIG_TINY_SHMEM is not set
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE_PB is not set
-+# CONFIG_ARCH_IMX is not set
-+
-+#
-+# EP93xx
-+#
-+CONFIG_ARCH_EP9301=y
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+# CONFIG_ARCH_EP9315 is not set
-+CONFIG_MACH_EDB9301=y
-+# CONFIG_MACH_TTML is not set
-+CONFIG_EP93XX_DMA=y
-+CONFIG_EP93XX_SSP=y
-+CONFIG_EP93XX_SSP_CIRRUS=y
-+# CONFIG_EP93XX_SSP_LINUX is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=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
-+
-+#
-+# General setup
-+#
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_ARM_AMBA=y
-+# CONFIG_ZBOOT_ROM is not set
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+
-+#
-+# PCMCIA/CardBus support
-+#
-+# CONFIG_PCMCIA is not set
-+
-+#
-+# At least one math emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+CONFIG_FPE_NWFPE_XP=y
-+# CONFIG_FPE_FASTFPE is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_PM is not set
-+# CONFIG_PREEMPT is not set
-+# CONFIG_ARTHUR is not set
-+CONFIG_CMDLINE="root=/dev/nfs ip=dhcp"
-+CONFIG_LEDS=y
-+CONFIG_LEDS_TIMER=y
-+CONFIG_LEDS_CPU=y
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_REDBOOT_PARTS=y
-+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY 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_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+# CONFIG_MTD_CFI_I2 is not set
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+CONFIG_MTD_ROM=y
-+# 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=0x60000000
-+CONFIG_MTD_PHYSMAP_LEN=0x01000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD is not set
-+
-+#
-+# 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 is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_FD 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 is not set
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Networking support
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+# CONFIG_NETLINK_DEV is not set
-+CONFIG_UNIX=y
-+CONFIG_NET_KEY=y
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# 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_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_HW_FLOWCONTROL is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE is not set
-+
-+#
-+# Network testing
-+#
-+# 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
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=y
-+# 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
-+
-+#
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+CONFIG_INPUT_EVBUG=y
-+
-+#
-+# Input I/O drivers
-+#
-+# CONFIG_GAMEPORT is not set
-+CONFIG_SOUND_GAMEPORT=y
-+# CONFIG_SERIO is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_UINPUT=y
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_EP93XX_WATCHDOG=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+CONFIG_EP93XX_RTC=y
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_EP93XX is not set
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_SCx200_ACB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Hardware Sensors Chip support
-+#
-+# CONFIG_I2C_SENSOR is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_IT87 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_LM90 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+
-+#
-+# Other I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 is not set
-+CONFIG_I2C_DEBUG_CORE=y
-+CONFIG_I2C_DEBUG_ALGO=y
-+CONFIG_I2C_DEBUG_BUS=y
-+CONFIG_I2C_DEBUG_CHIP=y
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_JBD is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_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_SYSFS=y
-+# CONFIG_DEVFS_FS is not set
-+CONFIG_DEVPTS_FS_XATTR=y
-+CONFIG_DEVPTS_FS_SECURITY=y
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+# CONFIG_JFFS2_FS_NAND is not set
-+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_JFFS2_CMODE_NONE is not set
-+CONFIG_JFFS2_CMODE_PRIORITY=y
-+# CONFIG_JFFS2_CMODE_SIZE 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_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_EXPORTFS is not set
-+CONFIG_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_FB is not set
-+# CONFIG_FB_CX25871_I2C 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 is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+CONFIG_SND_VERBOSE_PRINTK=y
-+CONFIG_SND_DEBUG=y
-+CONFIG_SND_DEBUG_MEMORY=y
-+CONFIG_SND_DEBUG_DETECT=y
-+
-+#
-+# Generic devices
-+#
-+CONFIG_SND_DUMMY=y
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# ALSA ARM devices
-+#
-+
-+#
-+# ALSA USB devices
-+#
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_USX2Y is not set
-+
-+#
-+# Open Sound System
-+#
-+# CONFIG_SOUND_PRIME is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# USB support
-+#
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811HS is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_AUDIO is not set
-+# CONFIG_USB_BLUETOOTH_TTY is not set
-+# CONFIG_USB_MIDI is not set
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+CONFIG_USB_STORAGE_RW_DETECT=y
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_HP8200e 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 Human Interface Devices (HID)
-+#
-+# 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_KBTAB is not set
-+# CONFIG_USB_POWERMATE is not set
-+# CONFIG_USB_MTOUCH is not set
-+# CONFIG_USB_EGALAX is not set
-+# CONFIG_USB_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_HPUSBSCSI is not set
-+
-+#
-+# USB Multimedia devices
-+#
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Video4Linux support is needed for USB Multimedia device support
-+#
-+
-+#
-+# USB Network adaptors
-+#
-+# 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
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+CONFIG_USB_SERIAL=y
-+# CONFIG_USB_SERIAL_CONSOLE is not set
-+# CONFIG_USB_SERIAL_GENERIC 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_EMPEG is not set
-+# CONFIG_USB_SERIAL_FTDI_SIO 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_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_PL2303=y
-+# CONFIG_USB_SERIAL_SAFE is not set
-+# CONFIG_USB_SERIAL_CYBERJACK is not set
-+# CONFIG_USB_SERIAL_XIRCOM is not set
-+# CONFIG_USB_SERIAL_OMNINET is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_TIGL is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_DEBUG_SLAB=y
-+CONFIG_DEBUG_SPINLOCK=y
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+CONFIG_DEBUG_WAITQ=y
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_LL_PRINTK_HACK is not set
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/edb9312_defconfig b/arch/arm/configs/edb9312_defconfig
-new file mode 100644
-index 0000000..1a0aa51
---- /dev/null
-+++ b/arch/arm/configs/edb9312_defconfig
-@@ -0,0 +1,920 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.9-rc2-ep93xx
-+# Mon Nov 8 16:40:30 2004
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_IOMAP=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_CLEAN_COMPILE is not set
-+CONFIG_BROKEN=y
-+CONFIG_BROKEN_ON_SMP=y
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_HOTPLUG is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SHMEM=y
-+# CONFIG_TINY_SHMEM is not set
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE_PB is not set
-+# CONFIG_ARCH_IMX is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+# CONFIG_ARCH_EP9302 is not set
-+CONFIG_ARCH_EP9312=y
-+# CONFIG_ARCH_EP9315 is not set
-+CONFIG_MACH_EDB9312=y
-+# CONFIG_MACH_ACC is not set
-+CONFIG_EP93XX_DMA=y
-+CONFIG_ARCH_EP93XX_IDE=y
-+CONFIG_EP93XX_SSP=y
-+CONFIG_EP93XX_SSP_CIRRUS=y
-+# CONFIG_EP93XX_SSP_LINUX is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+# CONFIG_ARM_THUMB is not set
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+
-+#
-+# General setup
-+#
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_ARM_AMBA=y
-+# CONFIG_ZBOOT_ROM is not set
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+
-+#
-+# At least one math emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+# CONFIG_FPE_NWFPE_XP is not set
-+# CONFIG_FPE_FASTFPE is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_AOUT=y
-+CONFIG_BINFMT_MISC=y
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_PM is not set
-+# CONFIG_PREEMPT is not set
-+# CONFIG_ARTHUR is not set
-+CONFIG_CMDLINE="root=/dev/hda1"
-+CONFIG_LEDS=y
-+CONFIG_LEDS_TIMER=y
-+CONFIG_LEDS_CPU=y
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_PARTITIONS=y
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_REDBOOT_PARTS=y
-+CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_AFS_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLOCK=y
-+CONFIG_FTL=y
-+CONFIG_NFTL=y
-+CONFIG_NFTL_RW=y
-+CONFIG_INFTL=y
-+
-+#
-+# 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=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+CONFIG_MTD_CFI_AMDSTD_RETRY=0
-+CONFIG_MTD_CFI_STAA=y
-+CONFIG_MTD_CFI_UTIL=y
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+CONFIG_MTD_ABSENT=y
-+# CONFIG_MTD_OBSOLETE_CHIPS is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+CONFIG_MTD_COMPLEX_MAPPINGS=y
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0x60000000
-+CONFIG_MTD_PHYSMAP_LEN=0x02000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=4
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+# CONFIG_MTD_IMPA7 is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+CONFIG_MTD_SLRAM=y
-+CONFIG_MTD_PHRAM=y
-+CONFIG_MTD_MTDRAM=y
-+CONFIG_MTDRAM_TOTAL_SIZE=512
-+CONFIG_MTDRAM_ERASE_SIZE=1
-+CONFIG_MTDRAM_ABS_POS=0x20000000
-+# CONFIG_MTD_BLKMTD 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=y
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_FD 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_RAM=y
-+CONFIG_BLK_DEV_RAM_SIZE=12288
-+CONFIG_BLK_DEV_INITRD=y
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Networking support
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+# CONFIG_NETLINK_DEV is not set
-+CONFIG_UNIX=y
-+CONFIG_NET_KEY=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+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_TUNNEL is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_HW_FLOWCONTROL is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+CONFIG_NETPOLL=y
-+# CONFIG_NETPOLL_RX is not set
-+# CONFIG_NETPOLL_TRAP is not set
-+CONFIG_NET_POLL_CONTROLLER=y
-+# 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
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+CONFIG_NETCONSOLE=y
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+CONFIG_IDE=y
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+CONFIG_IDEDISK_MULTI_MODE=y
-+CONFIG_BLK_DEV_IDECD=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+# CONFIG_IDE_TASKFILE_IO is not set
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+CONFIG_BLK_DEV_EP93XX=y
-+# CONFIG_BLK_DEV_IDEDMA_EP93XX is not set
-+CONFIG_IDE_ARM=y
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+# CONFIG_IDEDMA_AUTO is not set
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=y
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# 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
-+
-+#
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_IEEE1394 is not set
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+# 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 I/O drivers
-+#
-+# CONFIG_GAMEPORT is not set
-+CONFIG_SOUND_GAMEPORT=y
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_CT82C710 is not set
-+# CONFIG_SERIO_AMBAKMI is not set
-+# CONFIG_SERIO_RAW 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_EP93XX=y
-+CONFIG_KEYBOARD_EP93XX_SPI=y
-+CONFIG_KEYBOARD_EP93XX_8X8=y
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_SERIAL=y
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+CONFIG_INPUT_TOUCHSCREEN=y
-+# CONFIG_TOUCHSCREEN_GUNZE is not set
-+CONFIG_TOUCHSCREEN_EP93XX=y
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+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 is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_EP93XX_RTC is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+CONFIG_I2C_EP93XX=y
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_SCx200_ACB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Hardware Sensors Chip support
-+#
-+CONFIG_I2C_SENSOR=y
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_IT87 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_LM90 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+
-+#
-+# Other I2C Chip support
-+#
-+CONFIG_SENSORS_DS1337=y
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 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
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR 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_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_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+CONFIG_ROMFS_FS=y
-+# CONFIG_QUOTA is not set
-+CONFIG_AUTOFS_FS=y
-+# CONFIG_AUTOFS4_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_ZISOFS_FS=y
-+CONFIG_UDF_FS=y
-+CONFIG_UDF_NLS=y
-+
-+#
-+# 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_SYSFS=y
-+# CONFIG_DEVFS_FS is not set
-+# CONFIG_DEVFS_MOUNT is not set
-+# CONFIG_DEVFS_DEBUG is not set
-+# CONFIG_DEVPTS_FS_XATTR is not set
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLBFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+# CONFIG_JFFS2_FS_NAND is not set
-+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_JFFS2_CMODE_NONE is not set
-+CONFIG_JFFS2_CMODE_PRIORITY=y
-+# CONFIG_JFFS2_CMODE_SIZE 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_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_EXPORTFS is not set
-+CONFIG_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+CONFIG_NLS_ASCII=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=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_FB=y
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_ARMCLCD is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+CONFIG_FB_EP93XX=y
-+# CONFIG_FB_CRT_EP93XX is not set
-+CONFIG_FB_LCD_EP93XX=y
-+# CONFIG_FB_LCD_EP93XX_SHARP is not set
-+# CONFIG_FB_CX25871 is not set
-+# CONFIG_FB_EP93XX_8BPP is not set
-+# CONFIG_FB_EP93XX_16BPP_565 is not set
-+# CONFIG_FB_EP93XX_24BPP is not set
-+CONFIG_FB_EP93XX_32BPP=y
-+# 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_FONTS=y
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+CONFIG_FONT_6x11=y
-+CONFIG_FONT_PEARL_8x8=y
-+CONFIG_FONT_ACORN_8x8=y
-+# CONFIG_FONT_MINI_4x6 is not set
-+CONFIG_FONT_SUN8x16=y
-+CONFIG_FONT_SUN12x22=y
-+
-+#
-+# Logo configuration
-+#
-+CONFIG_LOGO=y
-+CONFIG_LOGO_LINUX_MONO=y
-+CONFIG_LOGO_LINUX_VGA16=y
-+CONFIG_LOGO_LINUX_CLUT224=y
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+# CONFIG_SND is not set
-+
-+#
-+# Open Sound System
-+#
-+CONFIG_SOUND_PRIME=y
-+# CONFIG_SOUND_BT878 is not set
-+# CONFIG_SOUND_FUSION is not set
-+# CONFIG_SOUND_CS4281 is not set
-+# CONFIG_SOUND_SONICVIBES is not set
-+# CONFIG_SOUND_TRIDENT is not set
-+# CONFIG_SOUND_MSNDCLAS is not set
-+# CONFIG_SOUND_MSNDPIN is not set
-+# CONFIG_SOUND_OSS is not set
-+# CONFIG_SOUND_TVMIXER is not set
-+# CONFIG_SOUND_AD1980 is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# USB support
-+#
-+# CONFIG_USB is not set
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+CONFIG_DEBUG_LL_PRINTK_HACK=y
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/edb9315_defconfig b/arch/arm/configs/edb9315_defconfig
-new file mode 100644
-index 0000000..3e6033b
---- /dev/null
-+++ b/arch/arm/configs/edb9315_defconfig
-@@ -0,0 +1,954 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.9-rc2-ep93xx
-+# Mon Nov 8 17:01:50 2004
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_IOMAP=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_CLEAN_COMPILE is not set
-+CONFIG_BROKEN=y
-+CONFIG_BROKEN_ON_SMP=y
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_HOTPLUG is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_EMBEDDED=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SHMEM=y
-+# CONFIG_TINY_SHMEM is not set
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE_PB is not set
-+# CONFIG_ARCH_IMX is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+CONFIG_ARCH_EP9315=y
-+CONFIG_MACH_EDB9315=y
-+CONFIG_EP93XX_DMA=y
-+# CONFIG_ARCH_EP93XX_IDE is not set
-+CONFIG_EP93XX_SSP=y
-+CONFIG_EP93XX_SSP_CIRRUS=y
-+# CONFIG_EP93XX_SSP_LINUX is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=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
-+
-+#
-+# General setup
-+#
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_ARM_AMBA=y
-+# CONFIG_ZBOOT_ROM is not set
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+
-+#
-+# At least one math emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+# CONFIG_FPE_NWFPE_XP is not set
-+# CONFIG_FPE_FASTFPE is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_PM is not set
-+# CONFIG_PREEMPT is not set
-+# CONFIG_ARTHUR is not set
-+CONFIG_CMDLINE="console=ttyCL0 map=mtd6,0x30000000,+0x200000 root=/dev/nfs nfsroot=192.168.1.224:/nfsarm_grma video=ep93xxfb ip=192.168.1.220:192.168.1.224:192.168.1.2:255.255.255.0::eth0:"
-+CONFIG_LEDS=y
-+CONFIG_LEDS_TIMER=y
-+CONFIG_LEDS_CPU=y
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+CONFIG_MTD_DEBUG=y
-+CONFIG_MTD_DEBUG_VERBOSE=3
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_REDBOOT_PARTS=y
-+CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
-+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
-+# 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_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
-+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 is not set
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+# 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_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0x60000000
-+CONFIG_MTD_PHYSMAP_LEN=0x2000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=4
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+CONFIG_MTD_MTDRAM=y
-+CONFIG_MTDRAM_TOTAL_SIZE=512
-+CONFIG_MTDRAM_ERASE_SIZE=128
-+CONFIG_MTDRAM_ABS_POS=0x20000000
-+# CONFIG_MTD_BLKMTD 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 is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_FD 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
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Networking support
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+# CONFIG_NETLINK_DEV is not set
-+CONFIG_UNIX=y
-+CONFIG_NET_KEY=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+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_TUNNEL is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_HW_FLOWCONTROL is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE is not set
-+
-+#
-+# Network testing
-+#
-+# 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
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=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
-+
-+#
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_IEEE1394 is not set
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+# 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 I/O drivers
-+#
-+# CONFIG_GAMEPORT is not set
-+CONFIG_SOUND_GAMEPORT=y
-+CONFIG_SERIO=y
-+# CONFIG_SERIO_SERPORT is not set
-+# CONFIG_SERIO_CT82C710 is not set
-+# CONFIG_SERIO_AMBAKMI is not set
-+# CONFIG_SERIO_RAW is not set
-+
-+#
-+# Input Device Drivers
-+#
-+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_EP93XX=y
-+# CONFIG_KEYBOARD_EP93XX_SPI is not set
-+# CONFIG_KEYBOARD_EP93XX_8X8 is not set
-+CONFIG_INPUT_MOUSE=y
-+# CONFIG_MOUSE_PS2 is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+CONFIG_INPUT_TOUCHSCREEN=y
-+# CONFIG_TOUCHSCREEN_GUNZE is not set
-+CONFIG_TOUCHSCREEN_EP93XX=y
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+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 is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_EP93XX_RTC is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+CONFIG_I2C_EP93XX=y
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_SCx200_ACB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Hardware Sensors Chip support
-+#
-+# CONFIG_I2C_SENSOR is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_IT87 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_LM90 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+
-+#
-+# Other I2C Chip support
-+#
-+CONFIG_SENSORS_DS1337=y
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 is not set
-+CONFIG_I2C_DEBUG_CORE=y
-+CONFIG_I2C_DEBUG_ALGO=y
-+CONFIG_I2C_DEBUG_BUS=y
-+CONFIG_I2C_DEBUG_CHIP=y
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_JBD is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_QUOTA is not set
-+CONFIG_AUTOFS_FS=y
-+# CONFIG_AUTOFS4_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_SYSFS=y
-+# CONFIG_DEVFS_FS is not set
-+CONFIG_DEVPTS_FS_XATTR=y
-+# CONFIG_DEVPTS_FS_SECURITY is not set
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLBFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=2
-+# CONFIG_JFFS2_FS_NAND 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_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_EXPORTFS is not set
-+CONFIG_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+CONFIG_LDM_PARTITION=y
-+# CONFIG_LDM_DEBUG is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=y
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_FB=y
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_ARMCLCD is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+CONFIG_FB_EP93XX=y
-+# CONFIG_FB_CRT_EP93XX is not set
-+CONFIG_FB_LCD_EP93XX=y
-+# CONFIG_FB_LCD_EP93XX_SHARP is not set
-+# CONFIG_FB_CX25871 is not set
-+# CONFIG_FB_EP93XX_8BPP is not set
-+CONFIG_FB_EP93XX_16BPP_565=y
-+# CONFIG_FB_EP93XX_24BPP is not set
-+# CONFIG_FB_EP93XX_32BPP 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_FONTS=y
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_FONT_6x11 is not set
-+# CONFIG_FONT_PEARL_8x8 is not set
-+# CONFIG_FONT_ACORN_8x8 is not set
-+# CONFIG_FONT_MINI_4x6 is not set
-+# CONFIG_FONT_SUN8x16 is not set
-+# CONFIG_FONT_SUN12x22 is not set
-+
-+#
-+# Logo configuration
-+#
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+CONFIG_LOGO_LINUX_CLUT224=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# USB support
-+#
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811HS 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
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_RW_DETECT 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_HP8200e 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 Human Interface Devices (HID)
-+#
-+CONFIG_USB_HID=y
-+CONFIG_USB_HIDINPUT=y
-+# CONFIG_HID_FF is not set
-+CONFIG_USB_HIDDEV=y
-+# CONFIG_USB_AIPTEK is not set
-+# CONFIG_USB_WACOM is not set
-+# CONFIG_USB_KBTAB is not set
-+# CONFIG_USB_POWERMATE is not set
-+# CONFIG_USB_MTOUCH is not set
-+# CONFIG_USB_EGALAX is not set
-+# CONFIG_USB_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_HPUSBSCSI is not set
-+
-+#
-+# USB Multimedia devices
-+#
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Video4Linux support is needed for USB Multimedia device support
-+#
-+
-+#
-+# USB Network adaptors
-+#
-+# 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
-+
-+#
-+# 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_TIGL is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_LL_PRINTK_HACK is not set
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/ttml_defconfig b/arch/arm/configs/ttml_defconfig
-new file mode 100644
-index 0000000..e0b96ae
---- /dev/null
-+++ b/arch/arm/configs/ttml_defconfig
-@@ -0,0 +1,1052 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.13
-+# Thu Sep 8 16:54:14 2005
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_CLEAN_COMPILE=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_KOBJECT_UEVENT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_EMBEDDED=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_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_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_UNLOAD is not set
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE is not set
-+# CONFIG_ARCH_IMX is not set
-+# CONFIG_ARCH_H720X is not set
-+# CONFIG_ARCH_AAEC2000 is not set
-+
-+#
-+# EP93xx
-+#
-+CONFIG_ARCH_EP9301=y
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+# CONFIG_ARCH_EP9315 is not set
-+# CONFIG_MACH_EDB9301 is not set
-+CONFIG_MACH_TTML=y
-+# CONFIG_ARCH_EP93XX_GPIO_IRQ is not set
-+CONFIG_EP93XX_DMA=y
-+CONFIG_EP93XX_SSP=y
-+# CONFIG_EP93XX_SSP_CIRRUS is not set
-+CONFIG_EP93XX_SSP_LINUX=y
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_CACHE_VIVT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+CONFIG_ARM_THUMB=y
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+
-+#
-+# Bus support
-+#
-+CONFIG_ARM_AMBA=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Kernel Features
-+#
-+# CONFIG_PREEMPT is not set
-+# CONFIG_NO_IDLE_HZ is not set
-+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM_MANUAL=y
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_LEDS is not set
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Boot options
-+#
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="ip=off root=1f02 rootfstype=jffs2"
-+# CONFIG_XIP_KERNEL is not set
-+
-+#
-+# Floating point emulation
-+#
-+
-+#
-+# At least one emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+CONFIG_FPE_NWFPE_XP=y
-+# 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=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+CONFIG_NET_KEY=y
-+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=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# 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=y
-+# 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
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE 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
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+
-+#
-+# 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=y
-+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY 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_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+# CONFIG_MTD_CFI_I2 is not set
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+CONFIG_MTD_ROM=y
-+# 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=0x60000000
-+CONFIG_MTD_PHYSMAP_LEN=0x01000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+
-+#
-+# NAND Flash Device Drivers
-+#
-+# CONFIG_MTD_NAND is not set
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CDROM_PKTCDVD is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+# CONFIG_IOSCHED_DEADLINE is not set
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=y
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG 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
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+CONFIG_INPUT_EVBUG=y
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_UINPUT=y
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_TTML_DEVICES=y
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_EP93XX_WATCHDOG=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+CONFIG_EP93XX_RTC=y
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+
-+#
-+# CAN bus devices
-+#
-+# CONFIG_CAN_BUS is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# TPM devices
-+#
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_EP93XX is not set
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+# CONFIG_I2C_SENSOR is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_SENSORS_DS1307 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_I2C_DEBUG_CORE=y
-+CONFIG_I2C_DEBUG_ALGO=y
-+CONFIG_I2C_DEBUG_BUS=y
-+CONFIG_I2C_DEBUG_CHIP=y
-+
-+#
-+# Hardware Monitoring support
-+#
-+CONFIG_HWMON=y
-+# 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_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_FB is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_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
-+#
-+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
-+
-+#
-+# 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_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+# CONFIG_USB_KEYSPAN_REMOTE 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
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+CONFIG_USB_SERIAL=y
-+# CONFIG_USB_SERIAL_CONSOLE is not set
-+# CONFIG_USB_SERIAL_GENERIC is not set
-+# CONFIG_USB_SERIAL_AIRPRIME 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 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_PL2303=y
-+# CONFIG_USB_SERIAL_HP4X is not set
-+# CONFIG_USB_SERIAL_SAFE 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_OMNINET is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETKIT is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_JBD is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+
-+#
-+# XFS support
-+#
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+
-+#
-+# 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_SYSFS=y
-+CONFIG_DEVPTS_FS_XATTR=y
-+CONFIG_DEVPTS_FS_SECURITY=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_XATTR is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_JFFS2_CMODE_NONE is not set
-+CONFIG_JFFS2_CMODE_PRIORITY=y
-+# CONFIG_JFFS2_CMODE_SIZE 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 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
-+
-+#
-+# 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_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_FS is not set
-+CONFIG_FRAME_POINTER=y
-+# CONFIG_DEBUG_USER is not set
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Hardware crypto devices
-+#
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/zefeerdzb_defconfig b/arch/arm/configs/zefeerdzb_defconfig
-new file mode 100644
-index 0000000..39aefdd
---- /dev/null
-+++ b/arch/arm/configs/zefeerdzb_defconfig
-@@ -0,0 +1,961 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.9-rc2-ep93xx
-+# Fri Jan 7 11:19:19 2005
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_IOMAP=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_CLEAN_COMPILE=y
-+CONFIG_BROKEN_ON_SMP=y
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+CONFIG_HOTPLUG=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_EMBEDDED=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SHMEM=y
-+# CONFIG_TINY_SHMEM is not set
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE_PB is not set
-+# CONFIG_ARCH_IMX is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+CONFIG_ARCH_EP9302=y
-+# CONFIG_ARCH_EP9312 is not set
-+# CONFIG_ARCH_EP9315 is not set
-+# CONFIG_MACH_EDB9302 is not set
-+CONFIG_MACH_ZEFEERDZB=y
-+CONFIG_ARCH_EP93XX_GPIO_IRQ=y
-+CONFIG_EP93XX_DMA=y
-+# CONFIG_EP93XX_SSP is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=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
-+
-+#
-+# General setup
-+#
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_ARM_AMBA=y
-+# CONFIG_ZBOOT_ROM is not set
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+
-+#
-+# PCMCIA/CardBus support
-+#
-+# CONFIG_PCMCIA is not set
-+
-+#
-+# At least one math emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+CONFIG_FPE_NWFPE_XP=y
-+# CONFIG_FPE_FASTFPE is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_PM is not set
-+# CONFIG_PREEMPT is not set
-+# CONFIG_ARTHUR is not set
-+CONFIG_CMDLINE="root=/dev/nfs ip=dhcp"
-+# CONFIG_LEDS is not set
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_REDBOOT_PARTS=y
-+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-+# CONFIG_MTD_REDBOOT_PARTS_READONLY 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_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+# CONFIG_MTD_CFI_I2 is not set
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+CONFIG_MTD_ROM=y
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+CONFIG_MTD_ZEFEERDZB=y
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD 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_IDS=y
-+CONFIG_MTD_NAND_ZEFEEREVB=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_FD 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_SIZE=6144
-+CONFIG_BLK_DEV_INITRD=y
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Networking support
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+# CONFIG_NETLINK_DEV is not set
-+CONFIG_UNIX=y
-+CONFIG_NET_KEY=y
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# 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_IPV6 is not set
-+# CONFIG_NETFILTER is not set
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_HW_FLOWCONTROL is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE is not set
-+
-+#
-+# Network testing
-+#
-+# 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
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=y
-+# CONFIG_SMC91X is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=y
-+# 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
-+
-+#
-+# 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+CONFIG_INPUT_EVBUG=y
-+
-+#
-+# Input I/O drivers
-+#
-+# CONFIG_GAMEPORT is not set
-+CONFIG_SOUND_GAMEPORT=y
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_CT82C710 is not set
-+# CONFIG_SERIO_AMBAKMI is not set
-+# CONFIG_SERIO_RAW 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_EP93XX=y
-+# CONFIG_KEYBOARD_EP93XX_SPI is not set
-+# CONFIG_KEYBOARD_EP93XX_8X8 is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_UINPUT=y
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_EP93XX_WATCHDOG=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+CONFIG_EP93XX_RTC=y
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+CONFIG_I2C_EP93XX=y
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_SCx200_ACB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+
-+#
-+# Hardware Sensors Chip support
-+#
-+# CONFIG_I2C_SENSOR is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_IT87 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_LM90 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+
-+#
-+# Other I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_RTC8564 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+CONFIG_I2C_DEBUG_CORE=y
-+CONFIG_I2C_DEBUG_ALGO=y
-+CONFIG_I2C_DEBUG_BUS=y
-+CONFIG_I2C_DEBUG_CHIP=y
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+CONFIG_EXT2_FS_XATTR=y
-+CONFIG_EXT2_FS_POSIX_ACL=y
-+CONFIG_EXT2_FS_SECURITY=y
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_JBD 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_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_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_SYSFS=y
-+# CONFIG_DEVFS_FS is not set
-+CONFIG_DEVPTS_FS_XATTR=y
-+CONFIG_DEVPTS_FS_SECURITY=y
-+CONFIG_TMPFS=y
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_NAND=y
-+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_JFFS2_CMODE_NONE is not set
-+CONFIG_JFFS2_CMODE_PRIORITY=y
-+# CONFIG_JFFS2_CMODE_SIZE 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_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_EXPORTFS is not set
-+CONFIG_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_FB is not set
-+# CONFIG_FB_CX25871_I2C 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 is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+CONFIG_SND_VERBOSE_PRINTK=y
-+CONFIG_SND_DEBUG=y
-+CONFIG_SND_DEBUG_MEMORY=y
-+CONFIG_SND_DEBUG_DETECT=y
-+
-+#
-+# Generic devices
-+#
-+CONFIG_SND_DUMMY=y
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# ALSA ARM devices
-+#
-+
-+#
-+# ALSA USB devices
-+#
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_USX2Y is not set
-+
-+#
-+# Open Sound System
-+#
-+# CONFIG_SOUND_PRIME is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# USB support
-+#
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811HS is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_AUDIO is not set
-+# CONFIG_USB_BLUETOOTH_TTY is not set
-+# CONFIG_USB_MIDI is not set
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+CONFIG_USB_STORAGE_RW_DETECT=y
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_HP8200e 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 Human Interface Devices (HID)
-+#
-+CONFIG_USB_HID=y
-+CONFIG_USB_HIDINPUT=y
-+# 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_KBTAB is not set
-+# CONFIG_USB_POWERMATE is not set
-+# CONFIG_USB_MTOUCH is not set
-+# CONFIG_USB_EGALAX is not set
-+# CONFIG_USB_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_HPUSBSCSI is not set
-+
-+#
-+# USB Multimedia devices
-+#
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Video4Linux support is needed for USB Multimedia device support
-+#
-+
-+#
-+# USB Network adaptors
-+#
-+# 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
-+
-+#
-+# 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_TIGL is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_DEBUG_SLAB=y
-+CONFIG_DEBUG_SPINLOCK=y
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+CONFIG_DEBUG_WAITQ=y
-+CONFIG_DEBUG_ERRORS=y
-+# CONFIG_DEBUG_DONT_REORDER_CODE is not set
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_LL_PRINTK_HACK is not set
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/configs/zefeerdzq_defconfig b/arch/arm/configs/zefeerdzq_defconfig
-new file mode 100644
-index 0000000..8314eee
---- /dev/null
-+++ b/arch/arm/configs/zefeerdzq_defconfig
-@@ -0,0 +1,1174 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.13
-+# Tue Oct 4 10:04:06 2005
-+#
-+CONFIG_ARM=y
-+CONFIG_MMU=y
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+# CONFIG_CLEAN_COMPILE is not set
-+CONFIG_BROKEN=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_AUDIT is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_KOBJECT_UEVENT=y
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_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_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_OBSOLETE_MODPARM=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+
-+#
-+# System Type
-+#
-+# CONFIG_ARCH_CLPS7500 is not set
-+# CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_CO285 is not set
-+# CONFIG_ARCH_EBSA110 is not set
-+CONFIG_ARCH_EP93XX=y
-+# CONFIG_ARCH_CAMELOT is not set
-+# CONFIG_ARCH_FOOTBRIDGE is not set
-+# CONFIG_ARCH_INTEGRATOR is not set
-+# CONFIG_ARCH_IOP3XX is not set
-+# CONFIG_ARCH_IXP4XX is not set
-+# CONFIG_ARCH_IXP2000 is not set
-+# CONFIG_ARCH_L7200 is not set
-+# CONFIG_ARCH_PXA is not set
-+# CONFIG_ARCH_RPC is not set
-+# CONFIG_ARCH_SA1100 is not set
-+# CONFIG_ARCH_S3C2410 is not set
-+# CONFIG_ARCH_SHARK is not set
-+# CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_OMAP is not set
-+# CONFIG_ARCH_VERSATILE is not set
-+# CONFIG_ARCH_IMX is not set
-+# CONFIG_ARCH_H720X is not set
-+# CONFIG_ARCH_AAEC2000 is not set
-+
-+#
-+# EP93xx
-+#
-+# CONFIG_ARCH_EP9301 is not set
-+# CONFIG_ARCH_EP9302 is not set
-+# CONFIG_ARCH_EP9312 is not set
-+CONFIG_ARCH_EP9315=y
-+# CONFIG_MACH_EDB9315 is not set
-+# CONFIG_MACH_ADSSPHERE is not set
-+CONFIG_MACH_ZEFEERDZQ=y
-+# CONFIG_MACH_DMA03 is not set
-+# CONFIG_ARCH_EP93XX_GPIO_IRQ is not set
-+CONFIG_EP93XX_DMA=y
-+# CONFIG_ARCH_EP93XX_IDE is not set
-+# CONFIG_EP93XX_SSP is not set
-+
-+#
-+# Processor Type
-+#
-+CONFIG_CPU_32=y
-+CONFIG_CPU_ARM920T=y
-+CONFIG_CPU_32v4=y
-+CONFIG_CPU_ABRT_EV4T=y
-+CONFIG_CPU_CACHE_V4WT=y
-+CONFIG_CPU_CACHE_VIVT=y
-+CONFIG_CPU_COPY_V4WB=y
-+CONFIG_CPU_TLB_V4WBI=y
-+
-+#
-+# Processor Features
-+#
-+# CONFIG_ARM_THUMB is not set
-+# CONFIG_CPU_ICACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_DISABLE is not set
-+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-+
-+#
-+# Bus support
-+#
-+CONFIG_ARM_AMBA=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Kernel Features
-+#
-+# CONFIG_SMP is not set
-+# CONFIG_PREEMPT is not set
-+# CONFIG_NO_IDLE_HZ is not set
-+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM_MANUAL=y
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_DISCONTIGMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_LEDS is not set
-+CONFIG_ALIGNMENT_TRAP=y
-+
-+#
-+# Boot options
-+#
-+CONFIG_ZBOOT_ROM_TEXT=0x0
-+CONFIG_ZBOOT_ROM_BSS=0x0
-+CONFIG_CMDLINE="root=/dev/ram"
-+# CONFIG_XIP_KERNEL is not set
-+
-+#
-+# Floating point emulation
-+#
-+
-+#
-+# At least one emulation must be selected
-+#
-+CONFIG_FPE_NWFPE=y
-+# CONFIG_FPE_NWFPE_XP is not set
-+# CONFIG_FPE_FASTFPE is not set
-+
-+#
-+# Userspace binary formats
-+#
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_AOUT=y
-+CONFIG_BINFMT_MISC=y
-+# 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=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+CONFIG_NET_KEY=y
-+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_TUNNEL is not set
-+CONFIG_IP_TCPDIAG=y
-+# 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
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+# CONFIG_NET_CLS_ROUTE 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
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER 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 is not set
-+# CONFIG_MTD_AFS_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+# CONFIG_MTD_CFI_I2 is not set
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+# CONFIG_MTD_OBSOLETE_CHIPS is not set
-+# CONFIG_MTD_XIP is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_ARM_INTEGRATOR is not set
-+# CONFIG_MTD_EDB7312 is not set
-+# CONFIG_MTD_PLATRAM is not set
-+CONFIG_MTD_ZEFEERDZQ=y
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLKMTD is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+
-+#
-+# NAND Flash Device Drivers
-+#
-+CONFIG_MTD_NAND=y
-+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-+CONFIG_MTD_NAND_IDS=y
-+CONFIG_MTD_NAND_ZEFEEREVB=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=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=12288
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CDROM_PKTCDVD is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+CONFIG_IDE=y
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+CONFIG_BLK_DEV_IDECD=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+CONFIG_BLK_DEV_EP93XX=y
-+# CONFIG_BLK_DEV_IDEDMA_EP93XX is not set
-+CONFIG_IDE_ARM=y
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+# CONFIG_IDEDMA_AUTO is not set
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_SCSI=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 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
-+
-+#
-+# SCSI Transport Attributes
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+
-+#
-+# SCSI low-level drivers
-+#
-+# CONFIG_SCSI_SATA is not set
-+# CONFIG_SCSI_DEBUG 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
-+#
-+# CONFIG_IEEE1394 is not set
-+
-+#
-+# 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
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_EP93XX_ETHERNET=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
-+
-+#
-+# Obsolete Wireless cards support (pre-802.11)
-+#
-+# CONFIG_STRIP is not set
-+# CONFIG_ATMEL 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=y
-+CONFIG_NETPOLL=y
-+# CONFIG_NETPOLL_RX is not set
-+# CONFIG_NETPOLL_TRAP is not set
-+CONFIG_NET_POLL_CONTROLLER=y
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+CONFIG_INPUT_EVBUG=y
-+
-+#
-+# Input Device Drivers
-+#
-+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_EP93XX=y
-+# CONFIG_KEYBOARD_EP93XX_SPI is not set
-+# CONFIG_KEYBOARD_EP93XX_8X8 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_AMBAKMI is not set
-+# 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_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_AMBA_PL010 is not set
-+# CONFIG_SERIAL_AMBA_PL011 is not set
-+CONFIG_SERIAL_EP93XX=y
-+CONFIG_SERIAL_EP93XX_CONSOLE=y
-+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 is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_EP93XX_RTC is not set
-+# CONFIG_DS1337_RTC is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+
-+#
-+# CAN bus devices
-+#
-+# CONFIG_CAN_BUS is not set
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# TPM devices
-+#
-+
-+#
-+# I2C support
-+#
-+CONFIG_I2C=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_EP93XX=y
-+# CONFIG_I2C_ISA is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+# CONFIG_I2C_SENSOR is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_SENSORS_DS1307 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_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# Hardware Monitoring support
-+#
-+CONFIG_HWMON=y
-+# CONFIG_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_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Misc devices
-+#
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_FB=y
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+CONFIG_FB_SOFT_CURSOR=y
-+# CONFIG_FB_MACMODES is not set
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_TILEBLITTING is not set
-+# CONFIG_FB_ARMCLCD is not set
-+# CONFIG_FB_CX25871_I2C is not set
-+CONFIG_FB_EP93XX=y
-+# CONFIG_FB_CRT_EP93XX is not set
-+# CONFIG_FB_LCD_EP93XX is not set
-+# CONFIG_FB_LCD_EP93XX_SHARP is not set
-+# CONFIG_FB_LCD_EP93XX_SHARP_LQ64D343 is not set
-+# CONFIG_FB_CX25871 is not set
-+CONFIG_FB_LCD_TX09D50VM1CCA=y
-+# CONFIG_FB_EP93XX_8BPP is not set
-+# CONFIG_FB_EP93XX_16BPP_565 is not set
-+CONFIG_FB_EP93XX_24BPP=y
-+# CONFIG_FB_EP93XX_32BPP is not set
-+# 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_FONTS=y
-+# CONFIG_FONT_8x8 is not set
-+CONFIG_FONT_8x16=y
-+# 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 is not set
-+CONFIG_FONT_SUN8x16=y
-+# CONFIG_FONT_SUN12x22 is not set
-+# CONFIG_FONT_10x18 is not set
-+
-+#
-+# Logo configuration
-+#
-+CONFIG_LOGO=y
-+CONFIG_LOGO_LINUX_MONO=y
-+CONFIG_LOGO_LINUX_VGA16=y
-+CONFIG_LOGO_LINUX_CLUT224=y
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+# CONFIG_SND is not set
-+
-+#
-+# Open Sound System
-+#
-+CONFIG_SOUND_PRIME=y
-+# CONFIG_SOUND_MSNDCLAS is not set
-+# CONFIG_SOUND_MSNDPIN is not set
-+# CONFIG_SOUND_OSS is not set
-+# CONFIG_SOUND_TVMIXER is not set
-+# CONFIG_SOUND_AD1980 is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_AUDIO is not set
-+# CONFIG_USB_BLUETOOTH_TTY is not set
-+# CONFIG_USB_MIDI 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
-+#
-+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
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+CONFIG_USB_HIDINPUT=y
-+# 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_XPAD is not set
-+# CONFIG_USB_ATI_REMOTE is not set
-+# CONFIG_USB_KEYSPAN_REMOTE 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_ZD1201 is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGETKIT is not set
-+# CONFIG_USB_PHIDGETSERVO is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+
-+#
-+# XFS support
-+#
-+# CONFIG_XFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+CONFIG_ROMFS_FS=y
-+CONFIG_INOTIFY=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_AUTOFS_FS=y
-+# CONFIG_AUTOFS4_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_ZISOFS_FS=y
-+CONFIG_UDF_FS=y
-+CONFIG_UDF_NLS=y
-+
-+#
-+# 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=y
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_SYSFS=y
-+# CONFIG_DEVPTS_FS_XATTR is not set
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_XATTR is not set
-+# CONFIG_HUGETLBFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=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_JFFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# 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=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
-+
-+#
-+# 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_EFI_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Profiling support
-+#
-+# CONFIG_PROFILING is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_FS is not set
-+CONFIG_FRAME_POINTER=y
-+CONFIG_DEBUG_USER=y
-+# CONFIG_DEBUG_WAITQ is not set
-+CONFIG_DEBUG_ERRORS=y
-+CONFIG_DEBUG_DONT_REORDER_CODE=y
-+CONFIG_DEBUG_LL=y
-+# CONFIG_DEBUG_ICEDCC is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_HMAC 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_DES=y
-+# 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_TEST is not set
-+
-+#
-+# Hardware crypto devices
-+#
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+CONFIG_CRC32=y
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/arm/mach-ep93xx/Kconfig b/arch/arm/mach-ep93xx/Kconfig
-new file mode 100644
-index 0000000..2b5c2d6
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/Kconfig
-@@ -0,0 +1,193 @@
-+
-+menu "EP93xx"
-+ depends on ARCH_EP93XX
-+
-+choice
-+ prompt "EP93xx CPU Type"
-+ default EP9312
-+ help
-+ There are several types of EP93xx CPUs available.
-+ Choosing the right one here enables you to select
-+ model specific drivers later.
-+
-+config ARCH_EP9301
-+ bool "EP9301"
-+ help
-+ Say Y here if you have intend to run this kernel on a EP9301 CPU.
-+
-+config ARCH_EP9302
-+ bool "EP9302"
-+ help
-+ Say Y here if you have intend to run this kernel on a EP9302 CPU.
-+
-+config ARCH_EP9312
-+ bool "EP9312"
-+ help
-+ Say Y here if you intend to run this kernel on a EP9312 CPU.
-+
-+
-+config ARCH_EP9315
-+ bool "EP9315"
-+ help
-+ Say Y here if you intend to run this kernel on a EP9315 CPU.
-+endchoice
-+
-+choice
-+ prompt "EP9301 Boards"
-+ depends on ARCH_EP9301
-+ default EDB9301
-+ help
-+ There are several EP9301-based boards available.
-+ Choosing the right one here enables various board-
-+ specific options.
-+
-+config MACH_EDB9301
-+ bool "Cirrus Logic EDB9301"
-+ select MTD
-+ select MTD_PHYSMAP
-+ help
-+ Say Y here if you intend to run this kernel on an EDB9301.
-+
-+config MACH_TTML
-+ bool "TTML TripDawg"
-+ help
-+ Say Y here if you intend to run this kernel on an TTML TripDawg.
-+
-+endchoice
-+
-+choice
-+ prompt "EP9302 Boards"
-+ depends on ARCH_EP9302
-+ default EDB9302
-+ help
-+ There are several EP9302-based boards available.
-+ Choosing the right one here enables various board-
-+ specific options.
-+
-+config MACH_EDB9302
-+ bool "Cirrus Logic EDB9302"
-+ select MTD
-+ select MTD_PHYSMAP
-+ help
-+ Say Y here if you intend to run this kernel on an EDB9302.
-+
-+config MACH_ZEFEERDZB
-+ bool "Dave Zefeer DZB on ZefeerEVB-L"
-+ select MTD
-+ help
-+ Say Y here if you intend to run this kernel on an Zefeer DZB.
-+ pluggend onto ZefeerEVB-L board.
-+
-+config MACH_ZEFEER_EVBL_107
-+ bool " Dave ZefeerEVB-L - version 1.0.7 (PCB CS044404)"
-+ depends on MACH_ZEFEERDZB
-+ default n
-+ help
-+ Say Y here if you intend to run this kernel on an ZefeerEVB-L
-+ version 1.0.7.
-+
-+endchoice
-+
-+choice
-+ prompt "EP9312 Boards"
-+ depends on ARCH_EP9312
-+ default EDB9312
-+ help
-+ There are several EP9312-based boards available.
-+ Choosing the right one here enables various board-
-+ specific options.
-+
-+config MACH_EDB9312
-+ bool "Cirrus Logic EDB9312"
-+ select MTD
-+ select MTD_PHYSMAP
-+ help
-+ Say Y here if you intend to run this kernel on an EDB9312.
-+
-+
-+config MACH_ACC
-+ bool "HiFish ACC"
-+ help
-+ Say Y here if you are using the HiFish Audio Control Center"
-+
-+endchoice
-+
-+choice
-+ prompt "EP9315 Boards"
-+ depends on ARCH_EP9315
-+ default EDB9315
-+ help
-+ There are several EP9315-based boards available.
-+ Choosing the right one here enables various board-
-+ specific options.
-+
-+config MACH_EDB9315
-+ bool "Cirrus Logic EDB9315"
-+ select MTD
-+ select MTD_PHYSMAP
-+ help
-+ Say Y here if you intend to run this kernel on an EDB9315.
-+
-+config MACH_ADSSPHERE
-+ bool "Applied Data Systems Sphere"
-+ select MTD
-+ help
-+ Say Y here if you intend to run this kernel on an ADSSPHERE.
-+
-+config MACH_ZEFEERDZQ
-+ bool "Dave Zefeer DZQ on ZefeerEVB (L or H)"
-+ select MTD
-+ help
-+ Say Y here if you intend to run this kernel on an Zefeer DZQ.
-+ Both evaluation board are supported (ZefeerEVB-L/ZefeerEVB-H).
-+
-+config MACH_DMA03
-+ bool "Gassner DMA03"
-+ select MTD
-+ select MTD_PHYSMAP
-+ help
-+ Say Y here if you intend to run this kernel on an DMA03.
-+
-+endchoice
-+
-+config ARCH_EP93XX_GPIO_IRQ
-+ bool " EP93xx GPIO IRQ demux"
-+ depends on ARCH_EP93XX
-+ help
-+ Say Y here if you want to expand the IRQ number to GPIO IRQ.
-+
-+config EP93XX_DMA
-+ bool " EP93xx Internal DMA Support"
-+ default y
-+ help
-+ Say Y here if you want to enable DMA Support for EP93XX family
-+ CPUs.
-+
-+config EP93XX_SSP
-+ bool "SSP support"
-+ help
-+ If you require SSP support, there are two SSP drivers
-+ available to choose from.
-+
-+choice
-+ prompt "SSP driver"
-+ depends on EP93XX_SSP
-+ default EP93XX_SSP_LINUX
-+
-+config EP93XX_SSP_CIRRUS
-+ tristate "Cirrus Logic SSP driver"
-+ depends on EP93XX_SSP
-+ help
-+ Say Y here for the Cirrus-supplied SSP driver. It is
-+ quite specific to the EDB93xx evaluation boards.
-+
-+config EP93XX_SSP_LINUX
-+ tristate "Linux SSP driver"
-+ depends on EP93XX_SSP
-+ help
-+ Say Y here for an SSP driver which is heavily based on the
-+ SA-1100 and PXA2xx SSP drivers.
-+
-+endchoice
-+
-+endmenu
-diff --git a/arch/arm/mach-ep93xx/Makefile b/arch/arm/mach-ep93xx/Makefile
-new file mode 100644
-index 0000000..19c56b3
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/Makefile
-@@ -0,0 +1,17 @@
-+obj-y += ep93xx.o irq.o time.o
-+
-+obj-$(CONFIG_MACH_ACC) += mach-acc.o
-+obj-$(CONFIG_MACH_EDB9301) += mach-edb9301.o
-+obj-$(CONFIG_MACH_EDB9302) += mach-edb9302.o
-+obj-$(CONFIG_MACH_EDB9312) += mach-edb9312.o
-+obj-$(CONFIG_MACH_EDB9315) += mach-edb9315.o
-+obj-$(CONFIG_MACH_ADSSPHERE) += mach-adssphere.o
-+obj-$(CONFIG_MACH_TTML) += mach-ttml.o
-+obj-$(CONFIG_MACH_ZEFEERDZB) += mach-zefeerdzb.o
-+obj-$(CONFIG_MACH_ZEFEERDZQ) += mach-zefeerdzq.o
-+obj-$(CONFIG_MACH_DMA03) += mach-dma03.o
-+
-+obj-$(CONFIG_EP93XX_DMA) += dma_ep93xx.o
-+
-+obj-$(CONFIG_EP93XX_SSP_LINUX) += ssp.o ssp2.o
-+obj-$(CONFIG_EP93XX_SSP_CIRRUS) += ssp-cirrus.o
-diff --git a/arch/arm/mach-ep93xx/Makefile.boot b/arch/arm/mach-ep93xx/Makefile.boot
-new file mode 100644
-index 0000000..c87653e
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/Makefile.boot
-@@ -0,0 +1,6 @@
-+ zreladdr-y := 0x00008000
-+params_phys-y := 0x00000100
-+ zreladdr-$(CONFIG_MACH_ZEFEERDZB) := 0xD0008000
-+params_phys-$(CONFIG_MACH_ZEFEERDZB) := 0xD0000100
-+ zreladdr-$(CONFIG_MACH_ZEFEERDZQ) := 0xD0008000
-+params_phys-$(CONFIG_MACH_ZEFEERDZQ) := 0xD0000100
-diff --git a/arch/arm/mach-ep93xx/dma_ep93xx.c b/arch/arm/mach-ep93xx/dma_ep93xx.c
-new file mode 100644
-index 0000000..817de48
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/dma_ep93xx.c
-@@ -0,0 +1,3346 @@
-+/******************************************************************************
-+ * arch/arm/mach-ep9312/dma_ep93xx.c
-+ *
-+ * Support functions for the ep93xx internal DMA channels.
-+ * (see also Documentation/arm/ep93xx/dma.txt)
-+ *
-+ * Copyright (C) 2003 Cirrus Logic
-+ *
-+ * A large portion of this file is based on the dma api implemented by
-+ * Nicolas Pitre, dma-sa1100.c, copyrighted 2000.
-+ *
-+ *
-+ * 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/module.h>
-+#include <linux/init.h>
-+#include <linux/sched.h>
-+#include <linux/spinlock.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/system.h>
-+#include <asm/irq.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/dma.h>
-+#include <asm/mach/dma.h>
-+#include "dma_ep93xx.h"
-+
-+/*****************************************************************************
-+ *
-+ * Debugging macros
-+ *
-+ ****************************************************************************/
-+#undef DEBUG
-+/*#define DEBUG 1 */
-+#ifdef DEBUG
-+#define DPRINTK( x... ) printk( ##x )
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+/*****************************************************************************
-+ *
-+ * static global variables
-+ *
-+ ****************************************************************************/
-+ep93xx_dma_t dma_chan[MAX_EP93XX_DMA_CHANNELS];
-+
-+/*
-+ * Maximum physical DMA buffer size
-+ */
-+#define MAX_DMA_SIZE 0xffff
-+#define MAX_DMA_ORDER 12
-+
-+/*
-+ * lock used to protect the list of dma channels while searching for a free
-+ * channel during dma_request.
-+ */
-+static spinlock_t dma_list_lock = SPIN_LOCK_UNLOCKED;
-+
-+/*****************************************************************************
-+ *
-+ * Internal DMA processing functions.
-+ *
-+ ****************************************************************************/
-+/*****************************************************************************
-+ *
-+ * get_dma_channel_from_handle()
-+ *
-+ * If Handle is valid, returns the DMA channel # (0 to 9 for channels 1-10)
-+ * If Handle is not valid, returns -1.
-+ *
-+ ****************************************************************************/
-+static int dma_get_channel_from_handle(int handle)
-+{
-+ int channel;
-+
-+ /*
-+ * Get the DMA channel # from the handle.
-+ */
-+ channel = ((int)handle & DMA_HANDLE_SPECIFIER_MASK) >> 28;
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (dma_chan[channel].last_valid_handle != (int)handle) {
-+ DPRINTK("DMA ERROR - invalid handle 0x%x \n", handle);
-+ /*
-+ * Fail, invalid handle
-+ */
-+ return (-1);
-+ }
-+
-+ /*
-+ * See if this instance is still open
-+ */
-+ if (!dma_chan[channel].ref_count) {
-+ /*
-+ * Fail, instance closed
-+ */
-+ return (-1);
-+ }
-+
-+ return (channel);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * dma_m2m_irq_handler
-+ *
-+ * TODO: need to add support for M2M interrupt handling!!!
-+ *
-+ ****************************************************************************/
-+static irqreturn_t
-+dma_m2m_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ ep93xx_dma_t *dma = (ep93xx_dma_t *) dev_id;
-+ unsigned int M2M_reg_base = dma->reg_base;
-+ ep93xx_dma_dev_t dma_int = UNDEF_INT;
-+ unsigned int read_back, loop, uiCONTROL, uiINTERRUPT;
-+
-+ loop = readl(M2M_reg_base + M2M_OFFSET_INTERRUPT);
-+
-+ /*
-+ * Determine what kind of dma interrupt this is.
-+ */
-+ if (readl(M2M_reg_base + M2M_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2M_STALLINT)
-+ dma_int = STALL;
-+ else if (readl(M2M_reg_base + M2M_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2M_NFBINT)
-+ dma_int = NFB;
-+ else if (readl(M2M_reg_base + M2M_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2M_DONEINT)
-+ dma_int = DONE;
-+
-+ DPRINTK("IRQ: b=%#x st=%#x\n", (int)dma->current_buffer->source,
-+ dma_int);
-+
-+ /*
-+ * Stall Interrupt: The Channel is stalled, meaning nothing is
-+ * programmed to transfer right now. So, we're back to the
-+ * beginnning. If there's a buffer to transfer, program it into
-+ * max and base 0 registers.
-+ */
-+ if (dma_int == STALL) {
-+ DPRINTK("1 ");
-+
-+ if (dma->total_buffers) {
-+
-+ if (readl(M2M_reg_base + M2M_OFFSET_BCR0) !=
-+ 0) {
-+ writel(0x0, M2M_reg_base + M2M_OFFSET_INTERRUPT);
-+ return IRQ_HANDLED;
-+
-+ }
-+
-+ /*
-+ * The current_buffer has already been tranfered, so add the
-+ * byte count to the total_bytes field.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->current_buffer].size;
-+
-+ /*
-+ * Mark the current_buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ /*
-+ * Increment the current_buffer
-+ */
-+ dma->current_buffer = (dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS;
-+
-+ /*
-+ * check if there's a new buffer to transfer.
-+ */
-+ if (dma->new_buffers && dma->xfer_enable) {
-+ /*
-+ * We have a new buffer to transfer so program in the buffer
-+ * values. Since a STALL interrupt was triggered, we
-+ * program the buffer descriptor 0
-+ *
-+ * Set the SAR_BASE/DAR_BASE/BCR registers with values from the
-+ * next buffer in the queue.
-+ */
-+ writel(dma->buffer_queue[dma->current_buffer].
-+ source,
-+ M2M_reg_base + M2M_OFFSET_SAR_BASE0);
-+ writel(dma->buffer_queue[dma->current_buffer].
-+ dest,
-+ M2M_reg_base + M2M_OFFSET_DAR_BASE0);
-+ writel(dma->buffer_queue[dma->current_buffer].
-+ size,
-+ M2M_reg_base + M2M_OFFSET_BCR0);
-+
-+ /*
-+ * Decrement the new buffer counter
-+ */
-+ dma->new_buffers--;
-+
-+ /*
-+ * If there's a second new buffer, we program the second
-+ * buffer descriptor.
-+ */
-+#if 0
-+ if (dma->new_buffers) {
-+ DPRINTK("A ");
-+
-+ /*
-+ * Set the SAR_BASE/DAR_BASE/BCR registers with values from the
-+ * next buffer in the queue.
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2M_reg_base + M2M_OFFSET_SAR_BASE1);
-+
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ dest,
-+ M2M_reg_base + M2M_OFFSET_DAR_BASE0);
-+
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2M_reg_base + M2M_OFFSET_BCR0);
-+
-+ /*
-+ * Decrement the new buffer counter
-+ */
-+ dma->new_buffers--;
-+
-+ /*
-+ * Enable the NFB Interrupt.
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2M_NFBINTEN;
-+ writel(uiCONTROL,
-+ M2M_reg_base + M2M_OFFSET_CONTROL);
-+ }
-+#endif
-+ }
-+ /*
-+ * Read my lips. No new buffers.
-+ */
-+ else {
-+ DPRINTK("2 \n");
-+ /*
-+ * There's a chance we setup both buffer descriptors, but
-+ * didn't service the NFB quickly enough, causing the channel
-+ * to transfer both buffers, then enter the stall state.
-+ * So, we need to be able to process the second buffer.
-+ */
-+ if ((dma->used_buffers + dma->new_buffers) <
-+ dma->total_buffers) {
-+ DPRINTK("3 ");
-+
-+ /*
-+ * The current_buffer has already been tranfered, so add the
-+ * byte count to the total_bytes field.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->
-+ current_buffer].
-+ size;
-+
-+ /*
-+ * Mark the current_buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].
-+ used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ /*
-+ * Increment the current buffer pointer.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ }
-+
-+ /*
-+ * No new buffers to transfer, so disable the channel.
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL,
-+ M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that this channel is in the pause by starvation
-+ * state by setting the pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+
-+ DPRINTK("End of stall handling. \n");
-+ DPRINTK("STATUS - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n",
-+ readl(M2M_reg_base + M2M_CONTROL.Value));
-+ DPRINTK("REMAIN - 0x%x \n",
-+ readl(M2M_reg_base + M2M_REMAIN.Value));
-+ DPRINTK("PPALLOC - 0x%x \n",
-+ readl(M2M_reg_base + M2M_PPALLOC.Value));
-+ DPRINTK("BASE0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_BASE0.Value));
-+ DPRINTK("MAXCNT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_MAXCNT0.Value));
-+ DPRINTK("CURRENT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_CURRENT0.Value));
-+ DPRINTK("BASE1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_BASE1.Value));
-+ DPRINTK("MAXCNT1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_MAXCNT1.Value));
-+ DPRINTK("CURRENT1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_CURRENT1.Value));
-+
-+ DPRINTK
-+ ("Buffer buf_id source size last used \n");
-+ for (loop = 0; loop < 32; loop++) {
-+ DPRINTK
-+ ("%d 0x%x 0x%x 0x%x %d %d \n",
-+ loop,
-+ dma->buffer_queue[loop].buf_id,
-+ dma->buffer_queue[loop].source,
-+ dma->buffer_queue[loop].size,
-+ dma->buffer_queue[loop].last,
-+ dma->buffer_queue[loop].used);
-+ }
-+ DPRINTK("Pause - %d \n", dma->pause);
-+ DPRINTK("xfer_enable - %d \n",
-+ dma->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n",
-+ dma->total_bytes);
-+ DPRINTK("total buffer - %d \n",
-+ dma->total_buffers);
-+ DPRINTK("new buffers - %d \n",
-+ dma->new_buffers);
-+ DPRINTK("current buffer - %d \n",
-+ dma->current_buffer);
-+ DPRINTK("last buffer - %d \n",
-+ dma->last_buffer);
-+ DPRINTK("used buffers - %d \n",
-+ dma->used_buffers);
-+ DPRINTK("callback addr - 0x%x \n",
-+ dma->callback);
-+ }
-+ }
-+ /*
-+ * Total number of buffers in the queue is 0.
-+ */
-+ else {
-+ /*
-+ * No buffers to transfer, or old buffers to mark as used,
-+ * so Disable the channel
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL,
-+ M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Must read the control register back after a write.
-+ */
-+ read_back =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that this channel is in the pause by
-+ * starvation state by setting the pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+ }
-+ }
-+ /*
-+ * Next Frame Buffer Interrupt. If there's a new buffer program it
-+ * Check if this is the last buffer in the transfer,
-+ * and if it is, disable the NFB int to prevent being
-+ * interrupted for another buffer when we know there won't be
-+ * another.
-+ */
-+ if (dma_int == NFB) {
-+ DPRINTK("5 ");
-+
-+ if (dma->total_buffers) {
-+ DPRINTK("6 ");
-+ /*
-+ * The iCurrentBuffer has already been transfered. so add the
-+ * byte count from the current buffer to the total byte count.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->current_buffer].size;
-+
-+ /*
-+ * Mark the Current Buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ if ((dma->buffer_queue[(dma->current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].last)
-+ || (dma->new_buffers == 0)
-+ || (dma->xfer_enable == FALSE)) {
-+ DPRINTK("7 ");
-+
-+ /*
-+ * This is the last Buffer in this transaction, so disable
-+ * the NFB interrupt. We shouldn't get an NFB int when the
-+ * FSM moves to the ON state where it would typically get the
-+ * NFB int indicating a new buffer can be programmed.
-+ * Instead, once in the ON state, the DMA will just proceed
-+ * to complet the transfer of the current buffer, move the
-+ * FSB directly to the STALL state where a STALL interrupt
-+ * will be generated.
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_NFBINTEN;
-+ writel(uiCONTROL,
-+ M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * The current buffer has been transferred, so increment
-+ * the current buffer counter to reflect this.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ DPRINTK("End of NFB handling. \n");
-+ DPRINTK("STATUS - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL));
-+ DPRINTK("REMAIN - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_REMAIN));
-+ DPRINTK("PPALLOC - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_PPALLOC));
-+ DPRINTK("BASE0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_BASE0));
-+ DPRINTK("MAXCNT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_MAXCNT0));
-+ DPRINTK("CURRENT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_CURRENT0));
-+ DPRINTK("BASE1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_BASE1));
-+ DPRINTK("MAXCNT1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_MAXCNT1));
-+ DPRINTK("CURRENT1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_CURRENT1));
-+
-+ DPRINTK
-+ ("Buffer buf_id source size last used \n");
-+ for (loop = 0; loop < 32; loop++) {
-+ DPRINTK
-+ ("%d 0x%x 0x%x 0x%x %d %d \n",
-+ loop,
-+ dma->buffer_queue[loop].buf_id,
-+ dma->buffer_queue[loop].source,
-+ dma->buffer_queue[loop].size,
-+ dma->buffer_queue[loop].last,
-+ dma->buffer_queue[loop].used);
-+ }
-+ DPRINTK
-+ ("pause 0x%x 0x%x 0x%x %d %d \n",
-+ dma->pause_buf.buf_id,
-+ dma->pause_buf.source, dma->pause_buf.size,
-+ dma->pause_buf.last, dma->pause_buf.used);
-+
-+ DPRINTK("Pause - %d \n", dma->pause);
-+ DPRINTK("xfer_enable - %d \n",
-+ dma->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n",
-+ dma->total_bytes);
-+ DPRINTK("total buffer - %d \n",
-+ dma->total_buffers);
-+ DPRINTK("new buffers - %d \n",
-+ dma->new_buffers);
-+ DPRINTK("current buffer - %d \n",
-+ dma->current_buffer);
-+ DPRINTK("last buffer - %d \n",
-+ dma->last_buffer);
-+ DPRINTK("used buffers - %d \n",
-+ dma->used_buffers);
-+ DPRINTK("callback addr - 0x%x \n",
-+ dma->callback);
-+
-+ } else if (dma->new_buffers) {
-+ DPRINTK("8 ");
-+ /*
-+ * we have a new buffer, so increment the current buffer to
-+ * point to the next buffer, which is already programmed into
-+ * the DMA. Next time around, it'll be pointing to the
-+ * current buffer.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ /*
-+ * we know we have a new buffer to program as the next
-+ * buffer, so check which set of SAR_BASE/DAR_BASE/BCR registers
-+ * to program.
-+ */
-+ if (readl(M2M_reg_base + M2M_OFFSET_STATUS) & STATUS_M2M_NB) {
-+ /*
-+ * Set the SAR_BASE1/DAR_BASE1/BCR1 registers with values from the
-+ * next buffer in the queue.
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2M_reg_base + M2M_OFFSET_SAR_BASE1);
-+
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ dest,
-+ M2M_reg_base + M2M_OFFSET_DAR_BASE1);
-+
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2M_reg_base + M2M_OFFSET_BCR1);
-+ } else {
-+ /*
-+ * Set the SAR_BASE0/DAR_BASE0/BCR0 registers with values from the
-+ * next buffer in the queue.
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2M_reg_base + M2M_OFFSET_SAR_BASE0);
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ dest,
-+ M2M_reg_base + M2M_OFFSET_DAR_BASE0);
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2M_reg_base + M2M_OFFSET_BCR0);
-+ }
-+
-+ /*
-+ * Decrement the new buffers counter
-+ */
-+ dma->new_buffers--;
-+ }
-+ }
-+ /*
-+ * Total number of buffers is 0 - really we should never get here,
-+ * but just in case.
-+ */
-+ else {
-+ DPRINTK("9 \n");
-+
-+ /*
-+ * No new buffers to transfer, so Disable the channel
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that the channel is paused by starvation.
-+ */
-+ dma->pause = 1;
-+ }
-+ }
-+
-+ /*
-+ * Done interrupt generated, indicating that the transfer is complete.
-+ */
-+ if (dma_int == DONE) {
-+#if 0
-+ /* The current_buffer has already been tranfered, so add the
-+ * byte count to the total_bytes field.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->current_buffer].size;
-+
-+ /*
-+ * Mark the current_buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ /*
-+ * Increment the current_buffer
-+ */
-+ dma->current_buffer = (dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS;
-+#endif
-+ /*
-+ * Clear the interrupt.
-+ */
-+ uiINTERRUPT =
-+ readl(M2M_reg_base + M2M_OFFSET_INTERRUPT);
-+ uiINTERRUPT &= ~INTERRUPT_M2M_DONEINT;
-+ writel(uiINTERRUPT,
-+ M2M_reg_base + M2M_OFFSET_INTERRUPT);
-+
-+ DPRINTK("STATUS - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL));
-+ DPRINTK("SAR_BASE0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_SAR_BASE0));
-+ DPRINTK("DAR_BASE0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_DAR_BASE0));
-+ DPRINTK("SAR_CURRENT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_SAR_CURRENT0));
-+ DPRINTK("DAR_CURRENT0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_DAR_CURRENT0));
-+ DPRINTK("BCR0 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_BCR0));
-+ DPRINTK("SAR_BASE1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_SAR_BASE1));
-+ DPRINTK("DAR_BASE1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_DAR_BASE1));
-+ DPRINTK("BCR1 - 0x%x \n",
-+ readl(M2M_reg_base + M2M_OFFSET_BCR1));
-+
-+ /*
-+ * Disable the channel.
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that we're in the stopped mode.
-+ */
-+ dma->pause = 1;
-+ dma->xfer_enable = 0;
-+ }
-+
-+ /*
-+ * Make sure the interrupt was valid, and if it was, then check
-+ * if a callback function was installed for this DMA channel. If a
-+ * callback was installed call it.
-+ */
-+ if ((dma_int != UNDEF_INT) && dma->callback) {
-+ dma->callback(dma_int, dma->device, dma->user_data);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * dma_m2p_irq_handler
-+ *
-+ *
-+ *
-+ ****************************************************************************/
-+static irqreturn_t
-+dma_m2p_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ ep93xx_dma_t *dma = (ep93xx_dma_t *) dev_id;
-+ unsigned int M2P_reg_base = dma->reg_base;
-+ unsigned int read_back;
-+ ep93xx_dma_dev_t dma_int = UNDEF_INT;
-+ unsigned int loop, uiCONTROL, uiINTERRUPT;
-+
-+ /*
-+ * Determine what kind of dma interrupt this is.
-+ */
-+ if (readl(M2P_reg_base + M2P_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2P_STALLINT)
-+ dma_int = STALL;
-+ else if (readl(M2P_reg_base + M2P_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2P_NFBINT)
-+ dma_int = NFB;
-+ else if (readl(M2P_reg_base + M2P_OFFSET_INTERRUPT) &
-+ INTERRUPT_M2P_CHERRORINT)
-+ dma_int = CHERROR;
-+
-+ /*
-+ * Stall Interrupt: The Channel is stalled, meaning nothing is
-+ * programmed to transfer right now. So, we're back to the
-+ * beginnning. If there's a buffer to transfer, program it into
-+ * max and base 0 registers.
-+ */
-+ if (dma_int == STALL) {
-+ DPRINTK("1 ");
-+
-+ if (dma->total_buffers) {
-+ /*
-+ * The current_buffer has already been tranfered, so add the
-+ * byte count to the total_bytes field.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->current_buffer].size;
-+
-+ /*
-+ * Mark the current_buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ /*
-+ * Increment the current_buffer
-+ */
-+ dma->current_buffer = (dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS;
-+
-+ /*
-+ * check if there's a new buffer to transfer.
-+ */
-+ if (dma->new_buffers && dma->xfer_enable) {
-+ /*
-+ * We have a new buffer to transfer so program in the buffer
-+ * values. Since a STALL interrupt was triggered, we
-+ * program the base0 and maxcnt0
-+ *
-+ * Set the MAXCNT0 register with the buffer size
-+ */
-+ writel(dma->buffer_queue[dma->current_buffer].size,
-+ M2P_reg_base + M2P_OFFSET_MAXCNT0);
-+
-+ /*
-+ * Set the BASE0 register with the buffer base address
-+ */
-+ writel(dma->buffer_queue[dma->current_buffer].source,
-+ M2P_reg_base + M2P_OFFSET_BASE0);
-+
-+ /*
-+ * Decrement the new buffer counter
-+ */
-+ dma->new_buffers--;
-+
-+ if (dma->new_buffers) {
-+ DPRINTK("A ");
-+ /*
-+ * Set the MAXCNT1 register with the buffer size
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2P_reg_base + M2P_OFFSET_MAXCNT1);
-+
-+ /*
-+ * Set the BASE1 register with the buffer base address
-+ */
-+ writel(dma->
-+ buffer_queue[dma->
-+ current_buffer +
-+ 1 %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2P_reg_base + M2P_OFFSET_BASE1);
-+
-+ /*
-+ * Decrement the new buffer counter
-+ */
-+ dma->new_buffers--;
-+
-+ /*
-+ * Enable the NFB Interrupt.
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2P_NFBINTEN;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+ }
-+ }
-+ /*
-+ * No new buffers.
-+ */
-+ else {
-+ DPRINTK("2 \n");
-+ /*
-+ * There's a chance we setup both buffer descriptors, but
-+ * didn't service the NFB quickly enough, causing the channel
-+ * to transfer both buffers, then enter the stall state.
-+ * So, we need to be able to process the second buffer.
-+ */
-+ if ((dma->used_buffers + dma->new_buffers) <
-+ dma->total_buffers) {
-+ DPRINTK("3 ");
-+
-+ /*
-+ * The current_buffer has already been tranfered, so add the
-+ * byte count to the total_bytes field.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->
-+ current_buffer].
-+ size;
-+
-+ /*
-+ * Mark the current_buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].
-+ used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ /*
-+ * Increment the current buffer pointer.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ }
-+
-+ /*
-+ * No new buffers to transfer, so disable the channel.
-+ */
-+ /* go dma_regs->CONTROL.Field.ENABLE = 0; */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2P_ENABLE;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that this channel is in the pause by starvation
-+ * state by setting the pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+
-+ DPRINTK("STATUS - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CONTROL));
-+ DPRINTK("REMAIN - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_REMAIN));
-+ DPRINTK("PPALLOC - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_PPALLOC));
-+ DPRINTK("BASE0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE0));
-+ DPRINTK("MAXCNT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT0));
-+ DPRINTK("CURRENT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT0));
-+ DPRINTK("BASE1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE1));
-+ DPRINTK("MAXCNT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT1));
-+ DPRINTK("CURRENT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT1));
-+
-+ DPRINTK
-+ ("Buffer buf_id source size last used \n");
-+ for (loop = 0; loop < 32; loop++) {
-+ DPRINTK
-+ ("%d 0x%x 0x%x 0x%x %d %d \n",
-+ loop,
-+ dma->buffer_queue[loop].buf_id,
-+ dma->buffer_queue[loop].source,
-+ dma->buffer_queue[loop].size,
-+ dma->buffer_queue[loop].last,
-+ dma->buffer_queue[loop].used);
-+ }
-+ DPRINTK
-+ ("pause 0x%x 0x%x 0x%x %d %d \n",
-+ dma->pause_buf.buf_id,
-+ dma->pause_buf.source, dma->pause_buf.size,
-+ dma->pause_buf.last, dma->pause_buf.used);
-+
-+ DPRINTK("Pause - %d \n", dma->pause);
-+ DPRINTK("xfer_enable - %d \n",
-+ dma->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n",
-+ dma->total_bytes);
-+ DPRINTK("total buffer - %d \n",
-+ dma->total_buffers);
-+ DPRINTK("new buffers - %d \n",
-+ dma->new_buffers);
-+ DPRINTK("current buffer - %d \n",
-+ dma->current_buffer);
-+ DPRINTK("last buffer - %d \n",
-+ dma->last_buffer);
-+ DPRINTK("used buffers - %d \n",
-+ dma->used_buffers);
-+ DPRINTK("callback addr - 0x%x \n",
-+ dma->callback);
-+ }
-+ }
-+ /*
-+ * Total number of buffers in the queue is 0.
-+ */
-+ else {
-+ /*
-+ * No buffers to transfer, or old buffers to mark as used,
-+ * so Disable the channel
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2P_ENABLE;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Must read the control register back after a write.
-+ */
-+ read_back = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Indicate that this channel is in the pause by
-+ * starvation state by setting the pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+ }
-+ }
-+ /*
-+ * Next Frame Buffer Interrupt. If there's a new buffer program it
-+ * Check if this is the last buffer in the transfer,
-+ * and if it is, disable the NFB int to prevent being
-+ * interrupted for another buffer when we know there won't be
-+ * another.
-+ */
-+ if (dma_int == NFB) {
-+ DPRINTK("5 ");
-+
-+ if (dma->total_buffers) {
-+ DPRINTK("6 ");
-+ /*
-+ * The iCurrentBuffer has already been transfered. so add the
-+ * byte count from the current buffer to the total byte count.
-+ */
-+ dma->total_bytes = dma->total_bytes +
-+ dma->buffer_queue[dma->current_buffer].size;
-+
-+ /*
-+ * Mark the Current Buffer as used.
-+ */
-+ dma->buffer_queue[dma->current_buffer].used = TRUE;
-+
-+ /*
-+ * Increment the used buffer counter
-+ */
-+ dma->used_buffers++;
-+
-+ DPRINTK("#%d", dma->current_buffer);
-+
-+ if ((dma->buffer_queue[(dma->current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].last)
-+ || (dma->new_buffers == 0)
-+ || (dma->xfer_enable == FALSE)) {
-+ DPRINTK("7 ");
-+
-+ /*
-+ * This is the last Buffer in this transaction, so disable
-+ * the NFB interrupt. We shouldn't get an NFB int when the
-+ * FSM moves to the ON state where it would typically get the
-+ * NFB int indicating a new buffer can be programmed.
-+ * Instead, once in the ON state, the DMA will just proceed
-+ * to complet the transfer of the current buffer, move the
-+ * FSB directly to the STALL state where a STALL interrupt
-+ * will be generated.
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2P_NFBINTEN;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * The current buffer has been transferred, so increment
-+ * the current buffer counter to reflect this.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ DPRINTK("End of NFB handling. \n");
-+ DPRINTK("STATUS - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CONTROL));
-+ DPRINTK("REMAIN - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_REMAIN));
-+ DPRINTK("PPALLOC - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_PPALLOC));
-+ DPRINTK("BASE0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE0));
-+ DPRINTK("MAXCNT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT0));
-+ DPRINTK("CURRENT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT0));
-+ DPRINTK("BASE1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE1));
-+ DPRINTK("MAXCNT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT1));
-+ DPRINTK("CURRENT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT1));
-+
-+ DPRINTK
-+ ("Buffer buf_id source size last used \n");
-+ for (loop = 0; loop < 32; loop++) {
-+ DPRINTK
-+ ("%d 0x%x 0x%x 0x%x %d %d \n",
-+ loop,
-+ dma->buffer_queue[loop].buf_id,
-+ dma->buffer_queue[loop].source,
-+ dma->buffer_queue[loop].size,
-+ dma->buffer_queue[loop].last,
-+ dma->buffer_queue[loop].used);
-+ }
-+ DPRINTK
-+ ("pause 0x%x 0x%x 0x%x %d %d \n",
-+ dma->pause_buf.buf_id,
-+ dma->pause_buf.source, dma->pause_buf.size,
-+ dma->pause_buf.last, dma->pause_buf.used);
-+
-+ DPRINTK("Pause - %d \n", dma->pause);
-+ DPRINTK("xfer_enable - %d \n",
-+ dma->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n",
-+ dma->total_bytes);
-+ DPRINTK("total buffer - %d \n",
-+ dma->total_buffers);
-+ DPRINTK("new buffers - %d \n",
-+ dma->new_buffers);
-+ DPRINTK("current buffer - %d \n",
-+ dma->current_buffer);
-+ DPRINTK("last buffer - %d \n",
-+ dma->last_buffer);
-+ DPRINTK("used buffers - %d \n",
-+ dma->used_buffers);
-+ DPRINTK("callback addr - 0x%x \n",
-+ dma->callback);
-+
-+ } else if (dma->new_buffers) {
-+ DPRINTK("8 ");
-+ /*
-+ * we have a new buffer, so increment the current buffer to
-+ * point to the next buffer, which is already programmed into
-+ * the DMA. Next time around, it'll be pointing to the
-+ * current buffer.
-+ */
-+ dma->current_buffer =
-+ (dma->current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ /*
-+ * we know we have a new buffer to program as the next
-+ * buffer, so check which set of MAXCNT and BASE registers
-+ * to program.
-+ */
-+ if (readl(M2P_reg_base + M2P_OFFSET_STATUS) &
-+ STATUS_M2P_NEXTBUFFER) {
-+ /*
-+ * Set the MAXCNT1 register with the buffer size
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2P_reg_base + M2P_OFFSET_MAXCNT1);
-+
-+ /*
-+ * Set the BASE1 register with the buffer base address
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2P_reg_base + M2P_OFFSET_BASE1);
-+ } else {
-+ /*
-+ * Set the MAXCNT0 register with the buffer size
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ size,
-+ M2P_reg_base + M2P_OFFSET_MAXCNT0);
-+
-+ /*
-+ * Set the BASE0 register with the buffer base address
-+ */
-+ writel(dma->
-+ buffer_queue[(dma->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].
-+ source,
-+ M2P_reg_base + M2P_OFFSET_BASE0);
-+ }
-+
-+ /*
-+ * Decrement the new buffers counter
-+ */
-+ dma->new_buffers--;
-+ }
-+ }
-+ /*
-+ * Total number of buffers is 0 - really we should never get here,
-+ * but just in case.
-+ */
-+ else {
-+ DPRINTK("9 \n");
-+
-+ /*
-+ * No new buffers to transfer, so Disable the channel
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2P_ENABLE;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+ }
-+ }
-+ /*
-+ * Channel Error Interrupt, or perhipheral interrupt, specific to the
-+ * memory to/from peripheral channels.
-+ */
-+ if (dma_int == CHERROR) {
-+ /*
-+ * just clear the interrupt, it's really up to the peripheral
-+ * driver to determine if any further action is necessary.
-+ */
-+ uiINTERRUPT =
-+ readl(M2P_reg_base + M2P_OFFSET_INTERRUPT);
-+ uiINTERRUPT &= ~INTERRUPT_M2P_CHERRORINT;
-+ writel(uiINTERRUPT, M2P_reg_base + M2P_OFFSET_INTERRUPT);
-+ }
-+
-+ /*
-+ * Make sure the interrupt was valid, and if it was, then check
-+ * if a callback function was installed for this DMA channel. If a
-+ * callback was installed call it.
-+ */
-+ if ((dma_int != UNDEF_INT) && dma->callback) {
-+ dma->callback(dma_int, dma->device, dma->user_data);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep9312_dma_open_m2p(int device)
-+ *
-+ * Description: This function will attempt to open a M2P/P2M DMA channel.
-+ * If the open is successful, the channel number is returned,
-+ * otherwise a negative number is returned.
-+ *
-+ * Parameters:
-+ * device: device for which the dma channel is requested.
-+ *
-+ ****************************************************************************/
-+static int dma_open_m2p(int device)
-+{
-+ int channel = -1;
-+ unsigned int loop;
-+ unsigned int M2P_reg_base;
-+ unsigned int uiPWRCNT;
-+
-+ DPRINTK("DMA Open M2P with hw dev %d\n", device);
-+
-+ /*
-+ * Lock the dma channel list.
-+ */
-+ spin_lock(&dma_list_lock);
-+ DPRINTK("1\n");
-+ /*
-+ * Verify that the device requesting DMA isn't already using a DMA channel
-+ */
-+ if (device >= 10) {
-+ loop = 1; /* Rx transfer requested */
-+ } else {
-+ loop = 0; /* Tx transfer requested */
-+ }
-+
-+ for (; loop < 10; loop = loop + 2) {
-+ /*
-+ * Before checking for a matching device, check that the
-+ * channel is in use, otherwise the device field is
-+ * invalid.
-+ */
-+ if (dma_chan[loop].ref_count) {
-+ if (device == dma_chan[loop].device) {
-+ DPRINTK("DMA Open M2P - Error\n");
-+ /*
-+ * Fail.
-+ */
-+ return (-1);
-+ }
-+ }
-+ }
-+
-+ /*
-+ * Get a DMA channel instance for the given hardware device.
-+ * If this is a TX look for even numbered channels, else look for
-+ * odd numbered channels
-+ */
-+ if (device >= 10) {
-+ loop = 1; /* Rx transfer requested */
-+ } else {
-+ loop = 0; /* Tx transfer requested */
-+ }
-+
-+ for (; loop < 10; loop = loop + 2) {
-+ if (!dma_chan[loop].ref_count) {
-+ /*
-+ * Capture the channel and increment the reference count.
-+ */
-+ channel = loop;
-+ dma_chan[channel].ref_count++;
-+ break;
-+ }
-+ }
-+
-+ /*
-+ * Unlock the dma channel list.
-+ */
-+ spin_unlock(&dma_list_lock);
-+
-+ /*
-+ * See if we got a valid channel.
-+ */
-+ if (channel < 0) {
-+ /*
-+ * Fail.
-+ */
-+ return (-1);
-+ }
-+
-+ /*
-+ * Point regs to the correct dma channel register base.
-+ */
-+ M2P_reg_base = dma_chan[channel].reg_base;
-+
-+ /*
-+ * Turn on the clock for the specified DMA channel
-+ * TODO: need to use the correct register name for the
-+ * power control register.
-+ */
-+ uiPWRCNT = readl(SYSCON_PWRCNT);
-+ switch (channel) {
-+ case 0:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH0;
-+ break;
-+ }
-+
-+ case 1:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH1;
-+ break;
-+ }
-+
-+ case 2:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH2;
-+ break;
-+ }
-+
-+ case 3:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH3;
-+ break;
-+ }
-+
-+ case 4:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH4;
-+ break;
-+ }
-+
-+ case 5:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH5;
-+ break;
-+ }
-+
-+ case 6:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH6;
-+ break;
-+ }
-+
-+ case 7:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH7;
-+ break;
-+ }
-+ case 8:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH8;
-+ break;
-+ }
-+ case 9:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2PCH9;
-+ break;
-+ }
-+
-+ default:
-+ {
-+ return (-1);
-+ }
-+ }
-+ writel(uiPWRCNT, SYSCON_PWRCNT);
-+
-+ /*
-+ * Clear out the control register before any further setup.
-+ */
-+ writel(0, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Setup the peripheral port value in the DMA channel registers.
-+ */
-+ if (device < 10) {
-+ writel((unsigned int)device,
-+ M2P_reg_base + M2P_OFFSET_PPALLOC);
-+ } else {
-+ writel((unsigned int)(device - 10),
-+ M2P_reg_base + M2P_OFFSET_PPALLOC);
-+ }
-+
-+ /*
-+ * Let's hold on to the value of the Hw device for comparison later.
-+ */
-+ dma_chan[channel].device = device;
-+
-+ /*
-+ * Success.
-+ */
-+ return (channel);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * dma_open_m2m(int device)
-+ *
-+ * Description: This function will attempt to open a M2M DMA channel.
-+ * If the open is successful, the channel number is returned,
-+ * otherwise a negative number is returned.
-+ *
-+ * Parameters:
-+ * device: device for which the dma channel is requested.
-+ *
-+ ****************************************************************************/
-+static int dma_open_m2m(int device)
-+{
-+ int channel = -1;
-+ unsigned int loop;
-+ unsigned int M2M_reg_base;
-+ unsigned int uiPWRCNT, uiCONTROL;
-+
-+ DPRINTK("DMA Open M2M with hw dev %d\n", device);
-+
-+ /*
-+ * Lock the dma channel list.
-+ */
-+ spin_lock(&dma_list_lock);
-+ DPRINTK("1\n");
-+
-+ /*
-+ * Check if this device is already allocated a channel.
-+ * TODO: can one M2M device be allocated multiple channels?
-+ */
-+ for (loop = DMA_MEMORY; loop < UNDEF; loop++) {
-+ /*
-+ * Before checking for a matching device, check that the
-+ * channel is in use, otherwise the device field is
-+ * invalid.
-+ */
-+ if (dma_chan[loop].ref_count) {
-+ if (device == dma_chan[loop].device) {
-+ DPRINTK
-+ ("Error - dma_open_m2m - already allocated channel\n");
-+
-+ /*
-+ * Unlock the dma channel list.
-+ */
-+ spin_unlock(&dma_list_lock);
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-1);
-+ }
-+ }
-+ }
-+
-+ /*
-+ * Get a DMA channel instance for the given hardware device.
-+ */
-+ for (loop = 10; loop < 12; loop++) {
-+ if (!dma_chan[loop].ref_count) {
-+ /*
-+ * Capture the channel and increment the reference count.
-+ */
-+ channel = loop;
-+ dma_chan[channel].ref_count++;
-+ break;
-+ }
-+ }
-+
-+ /*
-+ * Unlock the dma channel list.
-+ */
-+ spin_unlock(&dma_list_lock);
-+
-+ /*
-+ * See if we got a valid channel.
-+ */
-+ if (channel < 0) {
-+ /*
-+ * Fail.
-+ */
-+ return (-1);
-+ }
-+
-+ /*
-+ * Point regs to the correct dma channel register base.
-+ */
-+ M2M_reg_base = dma_chan[channel].reg_base;
-+
-+ /*
-+ * Turn on the clock for the specified DMA channel
-+ * TODO: need to use the correct register name for the
-+ * power control register.
-+ */
-+ uiPWRCNT = readl(SYSCON_PWRCNT);
-+ switch (channel) {
-+ case 10:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2MCH0;
-+ break;
-+ }
-+
-+ case 11:
-+ {
-+ uiPWRCNT |= SYSCON_PWRCNT_DMA_M2MCH1;
-+ break;
-+ }
-+
-+ default:
-+ {
-+ return (-1);
-+ }
-+ }
-+ writel(uiPWRCNT, SYSCON_PWRCNT);
-+
-+ DPRINTK("DMA Open - power control: 0x%x \n",
-+ readl(SYSCON_PWRCNT));
-+
-+ /*
-+ * Clear out the control register before any further setup.
-+ */
-+ writel(0, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Setup the transfer mode and the request source selection within
-+ * the DMA M2M channel registers.
-+ */
-+ switch (device) {
-+ case DMA_MEMORY:
-+ {
-+ /*
-+ * Clear TM field, set RSS field to 0
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_TM_MASK | CONTROL_M2M_RSS_MASK);
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ case DMA_IDE:
-+ {
-+ /*
-+ * Set RSS field to 3, Set NO_HDSK, Set PW field to 1
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_RSS_MASK | CONTROL_M2M_PW_MASK);
-+ uiCONTROL |=
-+ (3 << CONTROL_M2M_RSS_SHIFT) | CONTROL_M2M_NO_HDSK |
-+ (2 << CONTROL_M2M_PW_SHIFT);
-+
-+ uiCONTROL &= ~(CONTROL_M2M_ETDP_MASK);
-+ uiCONTROL &= ~(CONTROL_M2M_DACKP);
-+ uiCONTROL &= ~(CONTROL_M2M_DREQP_MASK);
-+
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ case DMARx_SSP:
-+ {
-+ /*
-+ * Set RSS field to 1, Set NO_HDSK, Set TM field to 2
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_RSS_MASK | CONTROL_M2M_TM_MASK);
-+ uiCONTROL |=
-+ (1 << CONTROL_M2M_RSS_SHIFT) | CONTROL_M2M_NO_HDSK |
-+ (2 << CONTROL_M2M_TM_SHIFT);
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ case DMATx_SSP:
-+ {
-+ /*
-+ * Set RSS field to 2, Set NO_HDSK, Set TM field to 1
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_RSS_MASK | CONTROL_M2M_TM_MASK);
-+ uiCONTROL |=
-+ (2 << CONTROL_M2M_RSS_SHIFT) | CONTROL_M2M_NO_HDSK |
-+ (1 << CONTROL_M2M_TM_SHIFT);
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ case DMATx_EXT_DREQ:
-+ {
-+ /*
-+ * Set TM field to 2, set RSS field to 0
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_RSS_MASK | CONTROL_M2M_TM_MASK);
-+ uiCONTROL |= 1 << CONTROL_M2M_TM_SHIFT;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ case DMARx_EXT_DREQ:
-+ {
-+
-+ /*
-+ * Set TM field to 2, set RSS field to 0
-+ */
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &=
-+ ~(CONTROL_M2M_RSS_MASK | CONTROL_M2M_TM_MASK);
-+ uiCONTROL |= 2 << CONTROL_M2M_TM_SHIFT;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ break;
-+ }
-+
-+ default:
-+ {
-+ return -1;
-+ }
-+ }
-+
-+ /*
-+ * Let's hold on to the value of the Hw device for comparison later.
-+ */
-+ dma_chan[channel].device = device;
-+
-+ /*
-+ * Success.
-+ */
-+ return (channel);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int dma_config_m2m(ep93xx_dma_t * dma, unsigned int flags_m2m,
-+ * dma_callback callback, unsigned int user_data)
-+ *
-+ * Description: Configure the DMA channel and install a callback function.
-+ * This function will have to be called for every transfer
-+ *
-+ * dma: Pointer to the dma instance data for the M2M channel to
-+ * configure.
-+ * flags_m2m Flags used to configure an M2M dma channel and determine
-+ * if a callback function and user_data information are included
-+ * in this call.
-+ * callback function pointer which is called near the end of the
-+ * dma channel's irq handler.
-+ * user_data defined by the calling driver.
-+ *
-+ ****************************************************************************/
-+static int
-+dma_config_m2m(ep93xx_dma_t * dma, unsigned int flags_m2m,
-+ dma_callback callback, unsigned int user_data)
-+{
-+ unsigned long flags;
-+ unsigned int M2M_reg_base, uiCONTROL;
-+
-+ /*
-+ * Make sure the channel is disabled before configuring the channel.
-+ *
-+ * TODO: Is this correct?? Making a big change here...
-+ */
-+ /* if(!dma->pause || (!dma->pause && dma->xfer_enable)) */
-+ if (dma->xfer_enable) {
-+ /*
-+ * DMA channel is not paused, so we can't configure it.
-+ */
-+ DPRINTK("DMA channel not paused, so can't configure! \n");
-+ return (-1);
-+ }
-+
-+ /*
-+ * Mask interrupts.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * Setup a pointer into the dma channel's register set.
-+ */
-+ M2M_reg_base = dma->reg_base;
-+
-+ /*
-+ * By default we enable the stall interrupt.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2M_STALLINTEN;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * By default we enable the done interrupt.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_DONEINTEN;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Set up the transfer control fields based on values passed in
-+ * the flags_m2m field.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ if (flags_m2m & DESTINATION_HOLD) {
-+ uiCONTROL |= CONTROL_M2M_DAH;
-+ } else {
-+ uiCONTROL &= ~CONTROL_M2M_DAH;
-+ }
-+
-+ if (flags_m2m & SOURCE_HOLD) {
-+ uiCONTROL |= CONTROL_M2M_SAH;
-+ } else {
-+ uiCONTROL &= ~CONTROL_M2M_SAH;
-+ }
-+
-+ uiCONTROL &= ~CONTROL_M2M_TM_MASK;
-+ uiCONTROL |=
-+ (((flags_m2m & TRANSFER_MODE_MASK) >> TRANSFER_MODE_SHIFT) <<
-+ CONTROL_M2M_TM_SHIFT) & CONTROL_M2M_TM_MASK;
-+
-+ uiCONTROL &= ~CONTROL_M2M_PWSC_MASK;
-+ uiCONTROL |= (((flags_m2m & WAIT_STATES_MASK) >> WAIT_STATES_SHIFT) <<
-+ CONTROL_M2M_PWSC_SHIFT) & CONTROL_M2M_PWSC_MASK;
-+
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Save the callback function in the dma instance for this channel.
-+ */
-+ dma->callback = callback;
-+
-+ /*
-+ * Save the user data in the the dma instance for this channel.
-+ */
-+ dma->user_data = user_data;
-+
-+ /*
-+ * Put the dma instance into the pause state by setting the
-+ * pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int dma_start(int handle, unsigned int channels, unsigned int * handles)
-+ *
-+ * Description: Initiate a transfer on up to 3 channels.
-+ *
-+ * handle: handle for the channel to initiate transfer on.
-+ * channels: number of channels to initiate transfers on.
-+ * handles: pointer to an array of handles, one for each channel which
-+ * is to be started.
-+ *
-+ ****************************************************************************/
-+static int dma_start_m2m(int channel, ep93xx_dma_t * dma)
-+{
-+ unsigned long flags;
-+ unsigned int M2M_reg_base = dma->reg_base;
-+ unsigned int uiCONTROL;
-+
-+ /*
-+ * Mask interrupts while we get this started.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * Make sure the channel has at least one buffer in the queue.
-+ */
-+ if (dma->new_buffers < 1) {
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ DPRINTK("DMA Start: Channel starved.\n");
-+
-+ /*
-+ * This channel does not have enough buffers queued up,
-+ * so enter the pause by starvation state.
-+ */
-+ dma->xfer_enable = TRUE;
-+ dma->pause = TRUE;
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+ }
-+
-+ /*
-+ * Clear any pending interrupts.
-+ */
-+ writel(0x0, M2M_reg_base + M2M_OFFSET_INTERRUPT);
-+
-+ /*
-+ * Set up one or both buffer descriptors with values from the next one or
-+ * two buffers in the queue. By default enable the next frame buffer
-+ * interrupt on the channel.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_NFBINTEN;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * enable the stall interrupt.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2M_STALLINTEN;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Update the dma channel instance transfer state.
-+ */
-+ dma->xfer_enable = TRUE;
-+ dma->pause = FALSE;
-+
-+ /*
-+ * Decrement the new buffers counter.
-+ */
-+ dma->new_buffers--;
-+
-+ /*
-+ * Program up the first buffer descriptor with a source and destination
-+ * and a byte count.
-+ */
-+ writel(dma->buffer_queue[dma->current_buffer].source,
-+ M2M_reg_base + M2M_OFFSET_SAR_BASE0);
-+
-+ writel(dma->buffer_queue[dma->current_buffer].dest,
-+ M2M_reg_base + M2M_OFFSET_DAR_BASE0);
-+
-+ writel(dma->buffer_queue[dma->current_buffer].size,
-+ M2M_reg_base + M2M_OFFSET_BCR0);
-+
-+ /*
-+ * Now we enable the channel. This initiates the transfer.
-+ */
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+
-+ /*
-+ * Before restoring irqs set up the second buffer descriptor
-+ * with a second buffer if we have a second buffer.
-+ */
-+ /* if(dma->new_buffers)
-+ {
-+ outl( dma->buffer_queue[(dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS].source,
-+ M2M_reg_base+M2M_OFFSET_SAR_BASE1 );
-+
-+ outl( dma->buffer_queue[(dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS].dest,
-+ M2M_reg_base+M2M_OFFSET_DAR_BASE1 );
-+
-+ outl( dma->buffer_queue[(dma->current_buffer + 1) %
-+ MAX_EP93XX_DMA_BUFFERS].size,
-+ M2M_reg_base+M2M_OFFSET_BCR1 );
-+ } */
-+
-+ /*
-+ * If this is a memory to memory transfer, we need to s/w trigger the
-+ * transfer by setting the start bit within the control register.
-+ */
-+ if (dma->device == DMA_MEMORY) {
-+ uiCONTROL =
-+ readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2M_START;
-+ writel(uiCONTROL,
-+ M2M_reg_base + M2M_OFFSET_CONTROL);
-+ }
-+
-+ DPRINTK("DMA - It's been started!!");
-+ DPRINTK("STATUS - 0x%x \n", readl(M2M_reg_base + M2M_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n", readl(M2M_reg_base + M2M_CONTROL.Value));
-+ DPRINTK("REMAIN - 0x%x \n", readl(M2M_reg_base + M2M_REMAIN.Value));
-+ DPRINTK("PPALLOC - 0x%x \n", readl(M2M_reg_base + M2M_PPALLOC.Value));
-+ DPRINTK("BASE0 - 0x%x \n", readl(M2M_reg_base + M2M_BASE0.Value));
-+ DPRINTK("MAXCNT0 - 0x%x \n", readl(M2M_reg_base + M2M_MAXCNT0.Value));
-+ DPRINTK("CURRENT0 - 0x%x \n", readl(M2M_reg_base + M2M_CURRENT0.Value));
-+ DPRINTK("BASE1 - 0x%x \n", readl(M2M_reg_base + M2M_BASE1.Value));
-+ DPRINTK("MAXCNT1 - 0x%x \n", readl(M2M_reg_base + M2M_MAXCNT1.Value));
-+ DPRINTK("CURRENT1 - 0x%x \n", readl(M2M_reg_base + M2M_CURRENT1.Value));
-+
-+ DPRINTK("Pause - %d \n", dma_pointers[0]->pause);
-+ DPRINTK("xfer_enable - %d \n", dma_pointers[0]->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n", dma_pointers[0]->total_bytes);
-+ DPRINTK("total buffer - %d \n", dma_pointers[0]->total_buffers);
-+ DPRINTK("new buffers - %d \n", dma_pointers[0]->new_buffers);
-+ DPRINTK("current buffer - %d \n", dma_pointers[0]->current_buffer);
-+ DPRINTK("last buffer - %d \n", dma_pointers[0]->last_buffer);
-+ DPRINTK("used buffers - %d \n", dma_pointers[0]->used_buffers);
-+
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * DMA interface functions
-+ *
-+ ****************************************************************************/
-+
-+/*****************************************************************************
-+ *
-+ * int dma_init(int handle, unsigned int flags_m2p, unsigned int flags_m2m,
-+ * dma_callback callback, unsigned int user_data)
-+ *
-+ * Description: Configure the DMA channel and install a callback function.
-+ *
-+ * handle: Handle unique the each instance of the dma interface, used
-+ * to verify this call.
-+ * flags_m2p Flags used to configure an M2P/P2M dma channel and determine
-+ * if a callback function and user_data information are included
-+ * in this call. This field should be NULL if handle represents
-+ * an M2M channel.
-+ * flags_m2m Flags used to configure an M2M dma channel and determine
-+ * if a callback function and user_data information are included
-+ * in this call. This field should be NULL if handle represents
-+ * an M2P/P2M channel.
-+ * callback function pointer which is called near the end of the
-+ * dma channel's irq handler.
-+ * user_data defined by the calling driver.
-+ *
-+ ****************************************************************************/
-+int
-+ep93xx_dma_config(int handle, unsigned int flags_m2p, unsigned int flags_m2m,
-+ dma_callback callback, unsigned int user_data)
-+{
-+ int channel;
-+ ep93xx_dma_t *dma;
-+ unsigned long flags;
-+ unsigned int M2P_reg_base, uiCONTROL;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Config: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA Config \n");
-+
-+ dma = &dma_chan[channel];
-+
-+ local_irq_save(flags);
-+
-+ /*
-+ * Check if the channel is currently transferring.
-+ */
-+ if (dma->xfer_enable) {
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Already transferring, invalid command.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ /*
-+ * Check if this is an m2m function.
-+ */
-+ if (channel >= 10) {
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Call another function to handle m2m config.
-+ */
-+ return (dma_config_m2m(dma, flags_m2m, callback, user_data));
-+ }
-+
-+ /*
-+ * Setup a pointer into the dma channel's register set.
-+ */
-+ M2P_reg_base = dma->reg_base;
-+
-+ /*
-+ * By default we enable the stall interrupt.
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2P_STALLINTEN;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Configure the channel for an error from the peripheral.
-+ */
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ if (flags_m2p && CHANNEL_ERROR_INT_ENABLE)
-+ uiCONTROL |= CONTROL_M2P_CHERRORINTEN;
-+ else
-+ uiCONTROL &= ~CONTROL_M2P_CHERRORINTEN;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ if (flags_m2p && EP93XX_DMA_ABORT)
-+ uiCONTROL |= CONTROL_M2P_ABRT;
-+ else
-+ uiCONTROL &= ~CONTROL_M2P_ABRT;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ if (flags_m2p && IGNORE_CHANNEL_ERROR)
-+ uiCONTROL |= CONTROL_M2P_ICE;
-+ else
-+ uiCONTROL &= ~CONTROL_M2P_ICE;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Save the callback function in the dma instance for this channel.
-+ */
-+ dma->callback = callback;
-+
-+ /*
-+ * Save the user data in the the dma instance for this channel.
-+ */
-+ dma->user_data = user_data;
-+
-+ /*
-+ * Put the dma instance into the pause state by setting the
-+ * pause bit to true.
-+ */
-+ dma->pause = TRUE;
-+
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int dma_start(int handle, unsigned int channels, unsigned int * handles)
-+ *
-+ * Description: Initiate a transfer on up to 3 channels.
-+ *
-+ * handle: handle for the channel to initiate transfer on.
-+ * channels: number of channels to initiate transfers on.
-+ * handles: pointer to an array of handles, one for each channel which
-+ * is to be started.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_start(int handle, unsigned int channels, unsigned int *handles)
-+{
-+ ep93xx_dma_t *dma_pointers[3];
-+ unsigned int M2P_reg_bases[3];
-+ unsigned int loop, uiCONTROL;
-+ unsigned long flags;
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Start: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ if (channels < 1) {
-+ printk(KERN_ERR "DMA Start: Invalid parameter.\n");
-+
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA Start \n");
-+
-+ /*
-+ * Mask off registers.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * Check if this is a start multiple.
-+ */
-+ if (channels > 1) {
-+ DPRINTK
-+ ("DMA ERROR: Start, multiple start not supported yet \n");
-+ return (-1);
-+ }
-+ /*
-+ * Only one channel
-+ */
-+ else {
-+ /*
-+ * Check if this channel is already transferring.
-+ */
-+ if (dma_chan[channel].xfer_enable && !dma_chan[channel].pause) {
-+ printk(KERN_ERR
-+ "DMA Start: Invalid command for channel %d.\n",
-+ channel);
-+ DPRINTK("DMA Start: Invalid command for channel %d.\n",
-+ channel);
-+
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * This channel is already transferring, so return an error.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ /*
-+ * If this is an M2M channel, call a different function.
-+ */
-+ if (channel >= 10) {
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Call the m2m start function. Only start one channel.
-+ */
-+ return (dma_start_m2m(channel, &dma_chan[channel]));
-+ }
-+
-+ /*
-+ * Make sure the channel has at least one buffer in the queue.
-+ */
-+ if (dma_chan[channel].new_buffers < 1) {
-+ DPRINTK("DMA Start: Channel starved.\n");
-+
-+ /*
-+ * This channel does not have enough buffers queued up,
-+ * so enter the pause by starvation state.
-+ */
-+ dma_chan[channel].xfer_enable = TRUE;
-+ dma_chan[channel].pause = TRUE;
-+
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+ }
-+
-+ /*
-+ * Set up a dma instance pointer for this dma channel.
-+ */
-+ dma_pointers[0] = &dma_chan[channel];
-+
-+ /*
-+ * Set up a pointer to the register set for this channel.
-+ */
-+ M2P_reg_bases[0] = dma_pointers[0]->reg_base;
-+ }
-+
-+ /*
-+ * Setup both MAXCNT registers with values from the next two buffers
-+ * in the queue, and enable the next frame buffer interrupt on the channel.
-+ */
-+ for (loop = 0; loop < channels; loop++) {
-+ /*
-+ * By default we enable the next frame buffer interrupt.
-+ */
-+ uiCONTROL = readl(M2P_reg_bases[loop] + M2P_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2P_NFBINTEN;
-+ writel(uiCONTROL, M2P_reg_bases[loop] + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Check if we need to restore a paused transfer.
-+ */
-+ if (dma_pointers[loop]->pause_buf.buf_id != -1) {
-+ writel(dma_pointers[loop]->pause_buf.size,
-+ M2P_reg_bases[loop] + M2P_OFFSET_MAXCNT0);
-+ } else {
-+ writel(dma_pointers[loop]->
-+ buffer_queue[dma_pointers[loop]->current_buffer].
-+ size,
-+ M2P_reg_bases[loop] + M2P_OFFSET_MAXCNT0);
-+ }
-+ }
-+
-+ for (loop = 0; loop < channels; loop++) {
-+ /*
-+ * Enable the specified dma channels.
-+ */
-+ uiCONTROL =
-+ readl(M2P_reg_bases[loop] + M2P_OFFSET_CONTROL);
-+ uiCONTROL |= CONTROL_M2P_ENABLE;
-+ writel(uiCONTROL,
-+ M2P_reg_bases[loop] + M2P_OFFSET_CONTROL);
-+
-+ /*
-+ * Update the dma channel instance transfer state.
-+ */
-+ dma_pointers[loop]->xfer_enable = TRUE;
-+ dma_pointers[loop]->pause = FALSE;
-+
-+ if (dma_pointers[loop]->pause_buf.buf_id == -1) {
-+ dma_pointers[loop]->new_buffers--;
-+ }
-+ }
-+
-+ /*
-+ * Program up the BASE0 registers for all specified channels, this
-+ * will initiate transfers on all specified channels.
-+ */
-+ for (loop = 0; loop < channels; loop++) {
-+ /*
-+ * Check if we need to restore a paused transfer.
-+ */
-+ if (dma_pointers[loop]->pause_buf.buf_id != -1) {
-+ writel(dma_pointers[loop]->pause_buf.source,
-+ M2P_reg_bases[loop] + M2P_OFFSET_BASE0);
-+
-+ /*
-+ * Set the pause buffer to NULL
-+ */
-+ dma_pointers[loop]->pause_buf.buf_id = -1;
-+ dma_pointers[loop]->pause_buf.size = 0;
-+ } else {
-+ writel(dma_pointers[loop]->
-+ buffer_queue[dma_pointers[loop]->current_buffer].
-+ source,
-+ M2P_reg_bases[loop] + M2P_OFFSET_BASE0);
-+ }
-+ }
-+
-+ /*
-+ * Before restoring irqs setup the second MAXCNT/BASE
-+ * register with a second buffer.
-+ */
-+ for (loop = 0; loop < channels; loop++) {
-+ if (dma_pointers[loop]->new_buffers) {
-+ writel(dma_pointers[loop]->
-+ buffer_queue[(dma_pointers[loop]->
-+ current_buffer +
-+ 1) % MAX_EP93XX_DMA_BUFFERS].size,
-+ M2P_reg_bases[loop] + M2P_OFFSET_MAXCNT1);
-+ writel(dma_pointers[loop]->
-+ buffer_queue[(dma_pointers[loop]->
-+ current_buffer +
-+ 1) %
-+ MAX_EP93XX_DMA_BUFFERS].source,
-+ M2P_reg_bases[loop] + M2P_OFFSET_BASE1);
-+ }
-+ }
-+
-+/*
-+ DPRINTK("DMA - It's been started!!");
-+ DPRINTK("STATUS - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_STATUS)));
-+ DPRINTK("CONTROL - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_CONTROL)));
-+ DPRINTK("REMAIN - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_REMAIN)));
-+ DPRINTK("PPALLOC - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_PPALLOC)));
-+ DPRINTK("BASE0 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_BASE0)));
-+ DPRINTK("MAXCNT0 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_MAXCNT0)));
-+ DPRINTK("CURRENT0 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_CURRENT0)));
-+ DPRINTK("BASE1 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_BASE1)));
-+ DPRINTK("MAXCNT1 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_MAXCNT1)));
-+ DPRINTK("CURRENT1 - 0x%x \n", readl(M2P_reg_base+M2P_OFFSET_CURRENT1)));
-+
-+ DPRINTK("Pause - %d \n", dma_pointers[0]->pause);
-+ DPRINTK("xfer_enable - %d \n", dma_pointers[0]->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n", dma_pointers[0]->total_bytes);
-+ DPRINTK("total buffer - %d \n", dma_pointers[0]->total_buffers);
-+ DPRINTK("new buffers - %d \n", dma_pointers[0]->new_buffers);
-+ DPRINTK("current buffer - %d \n", dma_pointers[0]->current_buffer);
-+ DPRINTK("last buffer - %d \n", dma_pointers[0]->last_buffer);
-+ DPRINTK("used buffers - %d \n", dma_pointers[0]->used_buffers);
-+*/
-+ /*
-+ * Unmask irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_add_buffer(int handle, unsigned int * address,
-+ * unsigned int size, unsigned int last)
-+ *
-+ * Description: Add a buffer entry to the DMA buffer queue.
-+ *
-+ * handle: handle for the channel to add this buffer to.
-+ * address: Pointer to an integer which is the start address of the
-+ * buffer which is to be added to the queue.
-+ * size: size of the buffer in bytes.
-+ * last: 1 if this is the last buffer in this stream, 0 otherwise.
-+ *
-+ ****************************************************************************/
-+int
-+ep93xx_dma_add_buffer(int handle, unsigned int source, unsigned int dest,
-+ unsigned int size, unsigned int last, unsigned int buf_id)
-+{
-+ unsigned long flags;
-+ ep93xx_dma_t *dma;
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Add Buffer: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ /*
-+ * Get a pointer to the dma instance.
-+ */
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Mask interrupts and hold on to the original state.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * If the buffer queue is full, last_buffer is the same as current_buffer and
-+ * we're not tranfering, or last_buffer is pointing to a used buffer, then exit.
-+ * TODO: do I need to do any more checks?
-+ */
-+ if (dma->total_buffers >= MAX_EP93XX_DMA_BUFFERS) {
-+ /*
-+ * Restore the state of the irqs
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-1);
-+ }
-+
-+ /*
-+ * Add this buffer to the queue
-+ */
-+ dma->buffer_queue[dma->last_buffer].source = source;
-+ dma->buffer_queue[dma->last_buffer].dest = dest;
-+ dma->buffer_queue[dma->last_buffer].size = size;
-+ dma->buffer_queue[dma->last_buffer].last = last;
-+ dma->buffer_queue[dma->last_buffer].buf_id = buf_id;
-+
-+ /*
-+ * Reset the used field of the buffer structure.
-+ */
-+ dma->buffer_queue[dma->last_buffer].used = FALSE;
-+
-+ /*
-+ * Increment the End Item Pointer.
-+ */
-+ dma->last_buffer = (dma->last_buffer + 1) % MAX_EP93XX_DMA_BUFFERS;
-+
-+ /*
-+ * Increment the new buffers counter and the total buffers counter
-+ */
-+ dma->new_buffers++;
-+ dma->total_buffers++;
-+
-+ /*
-+ * restore the interrupt state.
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Check if the channel was starved into a stopped state.
-+ */
-+ if (dma->pause && dma->xfer_enable) {
-+ if (dma->new_buffers >= 1) {
-+ DPRINTK
-+ ("DMA - calling start from add after starve. \n");
-+
-+ /*
-+ * The channel was starved into a stopped state, and we've got
-+ * 2 new buffers, so start tranferring again.
-+ */
-+ ep93xx_dma_start(handle, 1, NULL);
-+ }
-+ }
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_remove_buffer(int handle, unsigned int * address,
-+ * unsigned int * size)
-+ *
-+ * Description: Remove a buffer entry from the DMA buffer queue. If
-+ * buffer was removed successfully, return 0, otherwise
-+ * return -1.
-+ *
-+ * handle: handle for the channel to remove a buffer from.
-+ * address: Pointer to an integer which is filled in with the start
-+ * address of the removed buffer.
-+ * size: Pointer to an integer which is filled in with the size in
-+ * bytes of the removed buffer.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_remove_buffer(int handle, unsigned int *buf_id)
-+{
-+ unsigned int test;
-+ unsigned int loop;
-+ int return_val = -1;
-+ unsigned long flags;
-+ ep93xx_dma_t *dma;
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Remove Buffer: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Mask interrupts and hold on to the original state.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * Make sure there are used buffers to be returned.
-+ */
-+ if (dma->used_buffers) {
-+ test = dma->last_buffer;
-+
-+ for (loop = 0; loop < MAX_EP93XX_DMA_BUFFERS; loop++) {
-+ if (dma->buffer_queue[test].used
-+ && (dma->buffer_queue[test].buf_id != -1)) {
-+ /*DPRINTK("buffer %d used \n", test); */
-+
-+ /*
-+ * This is a used buffer, fill in the buf_id pointer
-+ * with the buf_id for this buffer.
-+ */
-+ *buf_id = dma->buffer_queue[test].buf_id;
-+
-+ /*
-+ * Reset this buffer structure
-+ */
-+ dma->buffer_queue[test].buf_id = -1;
-+
-+ /*
-+ * Decrement the used buffer counter, and the total buffer counter.
-+ */
-+ dma->used_buffers--;
-+ dma->total_buffers--;
-+
-+ /*
-+ * Successful removal of a buffer, so set the return
-+ * value to 0, then exit this loop.
-+ */
-+ return_val = 0;
-+ break;
-+ }
-+
-+ /*
-+ * This buffer isn't used, let's see if the next one is.
-+ */
-+ test = (test + 1) % MAX_EP93XX_DMA_BUFFERS;
-+ }
-+ }
-+
-+ /*
-+ * Restore interrupts.
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (return_val);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_pause(int handle, unsigned int channels,
-+ * unsigned int * handles)
-+ *
-+ * Description: Disable any ongoing transfer for the given channel, retaining
-+ * the state of the current buffer transaction so that upon
-+ * resume, the dma will continue where it left off.
-+ *
-+ * handle: Handle for the channel to be paused. If this is a pause for
-+ * for multiple channels, handle is a valid handle for one of
-+ * the channels to be paused.
-+ * channels: number of channel to pause transfers on.
-+ * handles: Pointer to an array of handles, one for each channel which
-+ * to be paused. If this pause is intended only for one
-+ * channel, this field should be set to NULL.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_pause(int handle, unsigned int channels, unsigned int *handles)
-+{
-+ unsigned long flags;
-+ ep93xx_dma_t *dma;
-+ int channel;
-+ unsigned int M2M_reg_base, M2P_reg_base;
-+
-+ DPRINTK("ep93xx_dma_pause \n");
-+
-+ /*
-+ * Mask interrupts and hold on to the original state.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ /*
-+ * restore interrupts.
-+ */
-+ local_irq_restore(flags);
-+
-+ printk(KERN_ERR "DMA Pause: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA %d: pause \n", channel);
-+
-+ /*
-+ * Set up a pointer to the dma instance data.
-+ */
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Set a pointer to the dma channel registers.
-+ */
-+ if (channel < 10) {
-+ M2P_reg_base = dma->reg_base;
-+ } else {
-+ M2M_reg_base = dma->reg_base;
-+ }
-+
-+ /*
-+ * Check if we're already paused.
-+ */
-+ if (dma->pause) {
-+ /*
-+ * We're paused, but are we stopped?
-+ */
-+ if (dma->xfer_enable) {
-+ /*
-+ * Put the channel in the stopped state.
-+ */
-+ dma->xfer_enable = FALSE;
-+ }
-+
-+ DPRINTK("DMA Pause - already paused.");
-+ } else {
-+ /*
-+ * Put the channel into the stopped state.
-+ */
-+ dma->xfer_enable = FALSE;
-+ dma->pause = TRUE;
-+ }
-+
-+ /*
-+ * restore interrupts.
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Already paused, so exit.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * void ep93xx_dma_flush(int handle)
-+ *
-+ * Description: Flushes all queued buffers and transfers in progress
-+ * for the given channel. Return the buffer entries
-+ * to the calling function.
-+ *
-+ * handle: handle for the channel for which the flush is intended.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_flush(int handle)
-+{
-+ unsigned int loop;
-+ unsigned long flags;
-+ ep93xx_dma_t *dma;
-+ int channel;
-+ unsigned int M2P_reg_base;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Flush: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA %d: flush \n", channel);
-+
-+ /*
-+ * Set up a pointer to the dma instance data for this channel
-+ */
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Mask interrupts and hold on to the original state.
-+ */
-+ local_irq_save(flags);
-+
-+ for (loop = 0; loop < MAX_EP93XX_DMA_BUFFERS; loop++) {
-+ dma->buffer_queue[loop].buf_id = -1;
-+ }
-+
-+ /*
-+ * Set the Current and Last item to zero.
-+ */
-+ dma->current_buffer = 0;
-+ dma->last_buffer = 0;
-+
-+ /*
-+ * Reset the Buffer counters
-+ */
-+ dma->used_buffers = 0;
-+ dma->new_buffers = 0;
-+ dma->total_buffers = 0;
-+
-+ /*
-+ * reset the Total bytes counter.
-+ */
-+ dma->total_bytes = 0;
-+
-+ M2P_reg_base = dma_chan[channel].reg_base;
-+
-+ /*
-+ * restore interrupts.
-+ */
-+ local_irq_restore(flags);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_queue_full(int handle)
-+ *
-+ * Description: Query to determine if the DMA queue of buffers for
-+ * a given channel is full.
-+ * 0 = queue is full
-+ * 1 = queue is not full
-+ *
-+ * handle: handle for the channel to query.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_queue_full(int handle)
-+{
-+ int list_full = 0;
-+ unsigned long flags;
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Queue Full: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA %d: queue full \n", channel);
-+
-+ /*
-+ * Mask interrupts and hold on to the original state.
-+ */
-+ local_irq_save(flags);
-+
-+ /*
-+ * If the last item is equal to the used item then
-+ * the queue is full.
-+ */
-+ if (dma_chan[channel].total_buffers < MAX_EP93XX_DMA_BUFFERS) {
-+ list_full = FALSE;
-+ } else {
-+ list_full = TRUE;
-+ }
-+
-+ /*
-+ * restore interrupts.
-+ */
-+ local_irq_restore(flags);
-+
-+ return (list_full);
-+}
-+
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_get_position()
-+ *
-+ * Description: Takes two integer pointers and fills them with the start
-+ * and current address of the buffer currently transferring
-+ * on the specified DMA channel.
-+ *
-+ * handle handle for the channel to query.
-+ * *buf_id buffer id for the current buffer transferring on the
-+ * dma channel.
-+ * *total total bytes transferred on the channel. Only counts
-+ * whole buffers transferred.
-+ * *current_frac number of bytes transferred so far in the current buffer.
-+ ****************************************************************************/
-+int
-+ep93xx_dma_get_position(int handle, unsigned int * buf_id,
-+ unsigned int * total, unsigned int * current_frac )
-+{
-+ int channel;
-+ ep93xx_dma_t * dma;
-+ unsigned int buf_id1, total1, current_frac1, buf_id2, total2;
-+ unsigned int Status, NextBuffer, StateIsBufNext, M2P_reg_base=0;
-+ unsigned int pause1, pause2;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle. See if this is a
-+ * valid handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Get Position: Invalid dma handle.\n");
-+ return(-EINVAL);
-+ }
-+
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * If DMA moves to a new buffer in the middle of us grabbing the
-+ * buffer info, then do it over again.
-+ */
-+ do{
-+ buf_id1 = dma->buffer_queue[dma->current_buffer].buf_id;
-+ total1 = dma->total_bytes;
-+ pause1 = dma->pause;
-+
-+ if (channel < 10) {
-+ /* M2P */
-+ M2P_reg_base = dma->reg_base;
-+
-+ Status = inl(M2P_reg_base+M2P_OFFSET_STATUS);
-+
-+ NextBuffer = ((Status & STATUS_M2P_NEXTBUFFER) != 0);
-+
-+ StateIsBufNext = ((Status & STATUS_M2P_CURRENT_MASK) ==
-+ STATUS_M2P_DMA_BUF_NEXT);
-+
-+ if( NextBuffer ^ StateIsBufNext )
-+ current_frac1 = inl(M2P_reg_base+M2P_OFFSET_CURRENT1) -
-+ inl(M2P_reg_base+M2P_OFFSET_BASE1);
-+ else
-+ current_frac1 = inl(M2P_reg_base+M2P_OFFSET_CURRENT0) -
-+ inl(M2P_reg_base+M2P_OFFSET_BASE0);
-+
-+ } else {
-+ /* M2M - TODO implement this for M2M */
-+ current_frac1 = 0;
-+ }
-+
-+ buf_id2 = dma->buffer_queue[dma->current_buffer].buf_id;
-+ total2 = dma->total_bytes;
-+ pause2 = dma->pause;
-+
-+ } while ( (buf_id1 != buf_id2) || (total1 != total2) || (pause1 != pause2) );
-+
-+ if (pause1)
-+ current_frac1 = 0;
-+
-+ if (buf_id)
-+ *buf_id = buf_id1;
-+
-+ if (total)
-+ *total = total1;
-+
-+ if (current_frac)
-+ *current_frac = current_frac1;
-+
-+ /*
-+ * Success.
-+ */
-+ return(0);
-+}
-+
-+/* changed for AC97 port from Virgo 1-4-3 */
-+#if 0
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_get_position(int handle, unsigned int * buf_id,
-+ unsigned int * total)
-+ *
-+ * Description: Takes two integer pointers and fills them with the start
-+ * and current address of the buffer currently transferring
-+ * on the specified DMA channel.
-+ *
-+ * handle: handle for the channel to query.
-+ * buf_id: pointer which is filled in with the buffer id for the
-+ * current buffer transferring on the dma channel.
-+ * buffer being transferred.
-+ * total : pointer which is filled in with the total bytes
-+ * transferred on the channel.
-+ ****************************************************************************/
-+int
-+ep93xx_dma_get_position(int handle, unsigned int *buf_id, unsigned int *total)
-+{
-+ int channel;
-+ ep93xx_dma_t *dma;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Get Position: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * TODO: should irqs be disabled here?
-+ */
-+
-+ *buf_id = dma->buffer_queue[dma->current_buffer].buf_id;
-+
-+ *total = dma->total_bytes;
-+
-+ DPRINTK("DMA buf_id %d, total %d\n", *buf_id, *total);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+#endif
-+
-+
-+
-+/*****************************************************************************
-+ *
-+ * int ep93xx_dma_get_total(int handle)
-+ *
-+ * Description: Returns the total number of bytes transferred on the
-+ * specified channel since the channel was requested.
-+ *
-+ * handle: handle for the channel to query.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_get_total(int handle)
-+{
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Get Total: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ DPRINTK("DMA %d: total: %d \n", channel, dma_chan[channel].total_bytes);
-+
-+ /*
-+ * Return the total number of bytes transferred on this channel since
-+ * it was requested.
-+ */
-+ return (dma_chan[channel].total_bytes);
-+}
-+
-+/*****************************************************************************
-+ * ep93xx_dma_request
-+ *
-+ * Description: This function will allocate a DMA channel for a particular
-+ * hardware peripheral. Before initiating a transfer on the allocated
-+ * channel, the channel must be set up and buffers have to queued up.
-+ *
-+ * handle: pointer to an integer which is filled in with a unique
-+ * handle for this instance of the dma interface.
-+ * device_id string with the device name, primarily used by /proc.
-+ * device hardware device ID for which the requested dma channel will
-+ * transfer data.
-+ *
-+ ****************************************************************************/
-+int
-+ep93xx_dma_request(int *handle, const char *device_id, ep93xx_dma_dev_t device)
-+{
-+ ep93xx_dma_t *dma = NULL;
-+ int channel;
-+ unsigned int error = 0;
-+ unsigned int loop;
-+ unsigned int M2P_reg_base;
-+
-+ /*
-+ * Check if the device requesting a DMA channel is a valid device.
-+ */
-+ if ((device >= UNDEF) || (device < 0)) {
-+ /*
-+ * Invalid device, so return an error.
-+ */
-+ return (-ENODEV);
-+ }
-+
-+ /*
-+ * We've got a valid hardware device requesting a DMA channel.
-+ * Now check if the device should open an M2P or M2M channel
-+ */
-+ if (device < 20) {
-+ channel = dma_open_m2p(device);
-+ } else {
-+ channel = dma_open_m2m(device);
-+ }
-+
-+ /*
-+ * Check if we successfully opened a DMA channel
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR
-+ "%s: Could not open dma channel for this device.\n",
-+ device_id);
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EBUSY);
-+ }
-+
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Request the appropriate IRQ for the specified channel
-+ */
-+ if (channel < 10) {
-+ error = request_irq(dma->irq, dma_m2p_irq_handler, SA_INTERRUPT,
-+ device_id, (void *)dma);
-+ } else {
-+ error =
-+ request_irq(dma->irq, &dma_m2m_irq_handler, SA_INTERRUPT,
-+ device_id, (void *)dma);
-+ }
-+
-+ /*
-+ * Check for any errors during the irq request
-+ */
-+ if (error) {
-+ printk(KERN_ERR
-+ "%s: unable to request IRQ %d for DMA channel\n",
-+ device_id, dma->irq);
-+ /*
-+ * Fail.
-+ */
-+ return (error);
-+ }
-+
-+ /*
-+ * Generate a valid handle and exit.
-+ *
-+ * Increment the last valid handle.
-+ * Check for wraparound (unlikely, but we like to be complete).
-+ */
-+ dma->last_valid_handle++;
-+
-+ if ((dma->last_valid_handle & DMA_HANDLE_SPECIFIER_MASK) !=
-+ (channel << 28)) {
-+ /*
-+ * If we wrapped around start over.
-+ */
-+ dma->last_valid_handle = (channel << 28) + 1;
-+ }
-+
-+ /*
-+ * Fill in the handle pointer with a valid handle for
-+ * this dma channel instance.
-+ */
-+ *handle = dma->last_valid_handle;
-+
-+ DPRINTK("Handle for channel %d: 0x%x\n", channel, *handle);
-+
-+ /*
-+ * Save the device ID and device name.
-+ */
-+ dma->device = device;
-+ dma->device_id = device_id;
-+
-+ /*
-+ * Init all fields within the dma instance.
-+ */
-+ for (loop = 0; loop < MAX_EP93XX_DMA_BUFFERS; loop++) {
-+ dma->buffer_queue[loop].buf_id = -1;
-+ }
-+
-+ /*
-+ * Initialize all buffer queue variables.
-+ */
-+ dma->current_buffer = 0;
-+ dma->last_buffer = 0;
-+
-+ dma->new_buffers = 0;
-+ dma->used_buffers = 0;
-+ dma->total_buffers = 0;
-+
-+ /*
-+ * Initialize the total bytes variable
-+ */
-+ dma->total_bytes = 0;
-+
-+ /*
-+ * Initialize the transfer and pause state variables to 0.
-+ */
-+ dma->xfer_enable = 0;
-+
-+ dma->pause = 0;
-+
-+ /*
-+ * Initialize the pause buffer structure.
-+ */
-+ dma->pause_buf.buf_id = -1;
-+
-+ /*
-+ * Initialize the callback function and user data fields.
-+ */
-+ dma->callback = NULL;
-+
-+ /*
-+ * User data used as a parameter for the Callback function. The user
-+ * sets up the data and sends it with the callback function.
-+ */
-+ dma->user_data = 0;
-+
-+ M2P_reg_base = dma_chan[channel].reg_base;
-+
-+ /*
-+ * Debugging message.
-+ */
-+ DPRINTK("Successfully requested dma channel %d\n", channel);
-+ DPRINTK("STATUS - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_STATUS));
-+ DPRINTK("CONTROL - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CONTROL));
-+ DPRINTK("REMAIN - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_REMAIN));
-+ DPRINTK("PPALLOC - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_PPALLOC));
-+ DPRINTK("BASE0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE0));
-+ DPRINTK("MAXCNT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT0));
-+ DPRINTK("CURRENT0 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT0));
-+ DPRINTK("BASE1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_BASE1));
-+ DPRINTK("MAXCNT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_MAXCNT1));
-+ DPRINTK("CURRENT1 - 0x%x \n", readl(M2P_reg_base + M2P_OFFSET_CURRENT1));
-+
-+ DPRINTK("Buffer source size last used \n");
-+ for (loop = 0; loop < 5; loop++) {
-+ DPRINTK("%d 0x%x 0x%x %d %d \n",
-+ loop, dma->buffer_queue[loop].source,
-+ dma->buffer_queue[loop].size,
-+ dma->buffer_queue[loop].last,
-+ dma->buffer_queue[loop].used);
-+ }
-+ DPRINTK("pause 0x%x 0x%x %d %d \n",
-+ dma->pause_buf.source, dma->pause_buf.size,
-+ dma->pause_buf.last, dma->pause_buf.used);
-+
-+ DPRINTK("Pause - %d \n", dma->pause);
-+ DPRINTK("xfer_enable - %d \n", dma->xfer_enable);
-+ DPRINTK("total bytes - 0x%x \n", dma->total_bytes);
-+ DPRINTK("total buffer - %d \n", dma->total_buffers);
-+ DPRINTK("new buffers - %d \n", dma->new_buffers);
-+ DPRINTK("current buffer - %d \n", dma->current_buffer);
-+ DPRINTK("last buffer - %d \n", dma->last_buffer);
-+ DPRINTK("used buffers - %d \n", dma->used_buffers);
-+
-+ DPRINTK("CURRENT1 - 0x%x \n",
-+ readl(M2P_reg_base + M2P_OFFSET_CURRENT1));
-+ DPRINTK("VIC0IRQSTATUS - 0x%x, VIC0INTENABLE - 0x%x \n",
-+ *(unsigned int *)(VIC0IRQSTATUS),
-+ *(unsigned int *)(VIC0INTENABLE));
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_dma_free
-+ *
-+ * Description: This function will free the dma channel for future requests.
-+ *
-+ * handle: handle for the channel to be freed.
-+ *
-+ ****************************************************************************/
-+int ep93xx_dma_free(int handle)
-+{
-+ ep93xx_dma_t *dma;
-+ unsigned int M2M_reg_base, M2P_reg_base, uiCONTROL;
-+ int channel;
-+
-+ /*
-+ * Get the DMA hw channel # from the handle.
-+ */
-+ channel = dma_get_channel_from_handle(handle);
-+
-+ /*
-+ * See if this is a valid handle.
-+ */
-+ if (channel < 0) {
-+ printk(KERN_ERR "DMA Free: Invalid dma handle.\n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return (-EINVAL);
-+ }
-+
-+ /*
-+ * Get a pointer to the dma instance.
-+ */
-+ dma = &dma_chan[channel];
-+
-+ /*
-+ * Disable the dma channel
-+ */
-+ if (channel < 10) {
-+ /*
-+ * M2P channel
-+ */
-+ M2P_reg_base = dma->reg_base;
-+
-+ uiCONTROL = readl(M2P_reg_base + M2P_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2P_ENABLE;
-+ writel(uiCONTROL, M2P_reg_base + M2P_OFFSET_CONTROL);
-+ } else {
-+ /*
-+ * M2M channel
-+ */
-+ M2M_reg_base = dma->reg_base;
-+
-+ uiCONTROL = readl(M2M_reg_base + M2M_OFFSET_CONTROL);
-+ uiCONTROL &= ~CONTROL_M2M_ENABLE;
-+ writel(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
-+ }
-+
-+ /*
-+ * Free the interrupt servicing this dma channel
-+ */
-+ free_irq(dma->irq, (void *)dma);
-+
-+ /*
-+ * Decrement the reference count for this instance of the dma interface
-+ */
-+ dma->ref_count--;
-+
-+ /*
-+ * Set the transfer and pause state variables to 0
-+ * (unititialized state).
-+ */
-+ dma->xfer_enable = 0;
-+ dma->pause = 0;
-+
-+ /*
-+ * Debugging message.
-+ */
-+ DPRINTK("Successfully freed dma channel %d\n", channel);
-+
-+ /*
-+ * Success.
-+ */
-+ return (0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_dma_init(void)
-+ *
-+ * Description: This function is called during system initialization to
-+ * setup the interrupt number and register set base address for each DMA
-+ * channel.
-+ *
-+ ****************************************************************************/
-+static int __init ep93xx_dma_init(void)
-+{
-+ int channel;
-+
-+ /*
-+ * Init some values in each dma instance.
-+ */
-+ for (channel = 0; channel < MAX_EP93XX_DMA_CHANNELS; channel++) {
-+ /*
-+ * IRQ for the specified dma channel.
-+ */
-+ dma_chan[channel].irq = IRQ_DMAM2P0 + channel;
-+
-+ /*
-+ * Initial value of the dma channel handle.
-+ */
-+ dma_chan[channel].last_valid_handle = channel << 28;
-+
-+ /*
-+ * Give the instance a pointer to the dma channel register
-+ * base.
-+ */
-+ if (channel < 10) {
-+ dma_chan[channel].reg_base = DMAM2PChannelBase[channel];
-+ } else {
-+ dma_chan[channel].reg_base =
-+ DMAM2MChannelBase[channel - 10];
-+ }
-+
-+ /*
-+ * Initialize the reference count for this channel.
-+ */
-+ dma_chan[channel].ref_count = 0;
-+ }
-+
-+ DPRINTK("DMA Interface intitialization complete\n");
-+
-+ /*
-+ * Success
-+ */
-+ return 0;
-+}
-+
-+__initcall(ep93xx_dma_init);
-+
-+EXPORT_SYMBOL(ep93xx_dma_add_buffer);
-+EXPORT_SYMBOL(ep93xx_dma_config);
-+EXPORT_SYMBOL(ep93xx_dma_flush);
-+EXPORT_SYMBOL(ep93xx_dma_free);
-+EXPORT_SYMBOL(ep93xx_dma_get_position);
-+EXPORT_SYMBOL(ep93xx_dma_get_total);
-+EXPORT_SYMBOL(ep93xx_dma_init);
-+EXPORT_SYMBOL(ep93xx_dma_pause);
-+EXPORT_SYMBOL(ep93xx_dma_queue_full);
-+EXPORT_SYMBOL(ep93xx_dma_remove_buffer);
-+EXPORT_SYMBOL(ep93xx_dma_request);
-+EXPORT_SYMBOL(ep93xx_dma_start);
-+
-diff --git a/arch/arm/mach-ep93xx/dma_ep93xx.h b/arch/arm/mach-ep93xx/dma_ep93xx.h
-new file mode 100644
-index 0000000..3ec0b0d
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/dma_ep93xx.h
-@@ -0,0 +1,194 @@
-+/*****************************************************************************
-+ *
-+ * arch/arm/mach-ep93xx/dma_ep93xx.h
-+ *
-+ * DESCRIPTION: 93XX DMA controller API private defintions.
-+ *
-+ * Copyright Cirrus Logic Corporation, 2003. All rights reserved
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ ****************************************************************************/
-+#ifndef _EP93XX_DMA_H_
-+#define _EP93XX_DMA_H_
-+
-+#define MAX_EP93XX_DMA_BUFFERS 32
-+
-+#ifndef TRUE
-+#define TRUE 1
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE 0
-+#endif
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+/*****************************************************************************
-+ *
-+ * DMA buffer structure type.
-+ *
-+ ****************************************************************************/
-+typedef struct ep93xx_dma_buffer_s {
-+ unsigned int source; /* buffer physical source address. */
-+ unsigned int dest; /* buffer physical destination address, */
-+ /* only used with the 2 M2M channels. */
-+ unsigned int size; /* buffer size in bytes */
-+ unsigned int last; /* 1 if this is the last buffer */
-+ /* in this transaction. If 1, */
-+ /* disable the NFBint so we aren't */
-+ /* interrupted for another buffer */
-+ /* when we know there won't be another. */
-+ unsigned int used; /* This field is set to 1 by the DMA */
-+ /* interface after the buffer is transferred */
-+ int buf_id; /* unique identifyer specified by the */
-+ /* the driver which requested the dma */
-+} ep93xx_dma_buffer_t;
-+
-+typedef ep93xx_dma_buffer_t *ep93xx_dma_buffer_p;
-+
-+/*****************************************************************************
-+ *
-+ * Instance definition for the DMA interface.
-+ *
-+ ****************************************************************************/
-+typedef struct ep7312_dma_s {
-+ /*
-+ * This 1 when the instance is in use, and 0 when it's not.
-+ */
-+ unsigned int ref_count;
-+
-+ /*
-+ * This is the last valid handle for this instance. When giving out a
-+ * new handle this will be incremented and given out.
-+ */
-+ int last_valid_handle;
-+
-+ /*
-+ * device specifies one of the 20 DMA hardware ports this
-+ * DMA channel will service.
-+ */
-+ ep93xx_dma_dev_t device;
-+
-+ /*
-+ * DMABufferQueue is the queue of buffer structure pointers which the
-+ * dma channel will use to setup transfers.
-+ */
-+ ep93xx_dma_buffer_t buffer_queue[MAX_EP93XX_DMA_BUFFERS];
-+
-+ /*
-+ * currnt_buffer : This is the buffer currently being transfered on
-+ * this channel.
-+ * last_buffer : This is the last buffer for this transfer.
-+ * Note: current_buffer + 1 is already programmed into the dma
-+ * channel as the next buffer to transfer. Don't write
-+ * over either entry.
-+ */
-+ int current_buffer;
-+ int last_buffer;
-+
-+ /*
-+ * The following 3 fields are buffer counters.
-+ *
-+ * iNewBuffers: Buffers in the queue which have not been transfered.
-+ * iUsedBuffers: Buffers in the queue which have have been tranferred,
-+ * and are waiting to be returned.
-+ * iTotalBuffers: Total number of buffers in the queue.
-+ */
-+ int new_buffers;
-+ int used_buffers;
-+ int total_buffers;
-+
-+ /*
-+ * uiTotalBytes has the total bytes transfered on the channel since the
-+ * last flush. This value does not include the bytes tranfered in the
-+ * current buffer. A byte count is only added after a complete buffer
-+ * is tranfered.
-+ */
-+ unsigned int total_bytes;
-+
-+ /*
-+ * Interrupt number for this channel
-+ */
-+ unsigned int irq;
-+
-+ /*
-+ * Indicates whether or not the channel is currently enabled to transfer
-+ * data.
-+ */
-+ unsigned int xfer_enable;
-+
-+ /*
-+ * pause indicates if the dma channel was paused by calling the pause
-+ * ioctl.
-+ */
-+ unsigned int pause;
-+
-+ /*
-+ * buffer structure used during a pause to capture the current
-+ * address and remaining bytes for the buffer actively being transferred
-+ * on the channel. This buffer will be used to reprogram the dma
-+ * channel upon a resume.
-+ */
-+ ep93xx_dma_buffer_t pause_buf;
-+
-+ /*
-+ * DMACallback is a function pointer which the calling application can
-+ * use install a function to. this fuction can be used to notify the
-+ * calling application of an interrupt.
-+ */
-+ dma_callback callback;
-+
-+ /*
-+ * User data used as a parameter for the Callback function. The user
-+ * sets up the data and sends it with the callback function.
-+ */
-+ unsigned int user_data;
-+
-+ /*
-+ * A string representation of the device attached to the channel.
-+ */
-+ const char *device_id;
-+
-+ /*
-+ * The register base address for this dma channel.
-+ */
-+ unsigned int reg_base;
-+
-+} ep93xx_dma_t;
-+
-+/*****************************************************************************
-+ *
-+ * DMA macros
-+ *
-+ ****************************************************************************/
-+#define DMA_HANDLE_SPECIFIER_MASK 0xF0000000
-+#define DMA_CH0_HANDLE_SPECIFIER 0x00000000
-+#define DMA_CH1_HANDLE_SPECIFIER 0x10000000
-+#define DMA_CH2_HANDLE_SPECIFIER 0x20000000
-+#define DMA_CH3_HANDLE_SPECIFIER 0x30000000
-+#define DMA_CH4_HANDLE_SPECIFIER 0x40000000
-+#define DMA_CH5_HANDLE_SPECIFIER 0x50000000
-+#define DMA_CH6_HANDLE_SPECIFIER 0x60000000
-+#define DMA_CH7_HANDLE_SPECIFIER 0x70000000
-+#define DMA_CH8_HANDLE_SPECIFIER 0x80000000
-+#define DMA_CH9_HANDLE_SPECIFIER 0x90000000
-+#define DMA_CH10_HANDLE_SPECIFIER 0xA0000000
-+#define DMA_CH11_HANDLE_SPECIFIER 0xB0000000
-+
-+#endif
-+
-diff --git a/arch/arm/mach-ep93xx/ep93xx.c b/arch/arm/mach-ep93xx/ep93xx.c
-new file mode 100644
-index 0000000..a565f14
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/ep93xx.c
-@@ -0,0 +1,571 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/ep93xx.c
-+ *
-+ * Copyright (C) 2000-2003 Deep Blue Solutions Ltd
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ * Copyright (C) 2005 Michael Burian
-+ *
-+ * 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/device.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/irq.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/hardware/amba.h>
-+#include <asm/mach/time.h>
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+static __init void check_model(void)
-+{
-+ unsigned long x;
-+ char *model;
-+ char *rev;
-+
-+ printk(KERN_INFO "CPU model: ");
-+
-+ x = readl(USRFLG);
-+ switch (x) {
-+ case 0:
-+ model = "15";
-+ break;
-+ case 2:
-+ model = "12";
-+ break;
-+ case 4:
-+ model = "01";
-+ break;
-+ default:
-+ printk("(unknown model %ld) ", x);
-+ model = "xx";
-+ break;
-+ }
-+
-+ x = readl(SYSCON_SYSCFG) >> 28;
-+ switch (x) {
-+ case 0:
-+ rev = "A";
-+ break;
-+ case 1:
-+ rev = "B";
-+ break;
-+ case 2:
-+ rev = "C";
-+ break;
-+ case 3:
-+ rev = "D0";
-+ break;
-+ case 4:
-+ rev = "D1";
-+ break;
-+ case 5:
-+ rev = "E";
-+ break;
-+ default:
-+ printk("(unknown revision %ld) ", x);
-+ rev = "unknown";
-+ break;
-+ }
-+
-+ printk("Cirrus Logic EP93%s, silicon rev %s\n", model, rev);
-+}
-+
-+static struct amba_device dma_device = {
-+ .dev = {
-+ .bus_id = "0x80000000:dma",
-+ },
-+ .res = {
-+ .start = DMA_BASE,
-+ .end = DMA_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80000000,
-+};
-+
-+static struct amba_device mac_device = {
-+ .dev = {
-+ .bus_id = "0x80010000:mac",
-+ },
-+ .res = {
-+ .start = MAC_BASE,
-+ .end = MAC_BASE + SZ_64K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80010000,
-+};
-+
-+static struct amba_device usb_device = {
-+ .dev = {
-+ .bus_id = "0x80020000:usb",
-+ .coherent_dma_mask = 0xffffffff,
-+ },
-+ .res = {
-+ .start = USB_BASE,
-+ .end = USB_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {IRQ_USH, NO_IRQ},
-+ .periphid = 0x80020000,
-+};
-+
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+static struct amba_device raster_device = {
-+ .dev = {
-+ .bus_id = "0x80030000:raster",
-+ },
-+ .res = {
-+ .start = RASTER_BASE,
-+ .end = RASTER_BASE + SZ_8K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80030000,
-+};
-+#endif
-+
-+static struct amba_device sdram_device = {
-+ .dev = {
-+ .bus_id = "0x80060000:sdram",
-+ },
-+ .res = {
-+ .start = SDRAM_BASE,
-+ .end = SDRAM_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80060000,
-+};
-+
-+static struct amba_device smc_device = {
-+ .dev = {
-+ .bus_id = "0x80080000:smc",
-+ },
-+ .res = {
-+ .start = SMC_BASE,
-+ .end = SMC_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80080000,
-+};
-+
-+static struct amba_device boot_device = {
-+ .dev = {
-+ .bus_id = "0x80090000:boot",
-+ },
-+ .res = {
-+ .start = BOOT_BASE,
-+ .end = BOOT_BASE + SZ_16K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80090000,
-+};
-+
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+static struct amba_device ide_device = {
-+ .dev = {
-+ .bus_id = "0x800a0000:ide",
-+ },
-+ .res = {
-+ .start = IDE_BASE,
-+ .end = IDE_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x800a0000,
-+};
-+#endif
-+
-+static struct amba_device vic1_device = {
-+ .dev = {
-+ .bus_id = "0x800b0000:vic1",
-+ },
-+ .res = {
-+ .start = VIC0_BASE,
-+ .end = VIC0_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x800b0000,
-+};
-+
-+static struct amba_device vic2_device = {
-+ .dev = {
-+ .bus_id = "0x800c0000:vic2",
-+ },
-+ .res = {
-+ .start = VIC1_BASE,
-+ .end = VIC1_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x800c0000,
-+};
-+
-+static struct amba_device timer_device = {
-+ .dev = {
-+ .bus_id = "0x80810000:timer",
-+ },
-+ .res = {
-+ .start = TIMERS_BASE,
-+ .end = TIMERS_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80810000,
-+};
-+
-+static struct amba_device i2s_device = {
-+ .dev = {
-+ .bus_id = "0x80820000:i2s",
-+ },
-+ .res = {
-+ .start = I2S_BASE,
-+ .end = I2S_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80820000,
-+};
-+
-+static struct amba_device security_device = {
-+ .dev = {
-+ .bus_id = "0x80830000:security",
-+ },
-+ .res = {
-+ .start = SECURITY_BASE,
-+ .end = SECURITY_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80830000,
-+};
-+
-+static struct amba_device gpio_device = {
-+ .dev = {
-+ .bus_id = "0x80840000:gpio",
-+ },
-+ .res = {
-+ .start = GPIO_BASE,
-+ .end = GPIO_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80840000,
-+};
-+
-+static struct amba_device ac97_device = {
-+ .dev = {
-+ .bus_id = "0x80880000:ac97",
-+ },
-+ .res = {
-+ .start = AC97_BASE,
-+ .end = AC97_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80880000,
-+};
-+
-+static struct amba_device ssp_device = {
-+ .dev = {
-+ .bus_id = "0x808a0000:ssp",
-+ },
-+ .res = {
-+ .start = SSP_BASE,
-+ .end = SSP_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x808a0000,
-+};
-+
-+static struct amba_device irda_device = {
-+ .dev = {
-+ .bus_id = "0x808b0000:irda",
-+ },
-+ .res = {
-+ .start = IRDA_BASE,
-+ .end = IRDA_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x808b0000,
-+};
-+
-+static struct amba_device uart1_device = {
-+ .dev = {
-+ .bus_id = "0x808c0000:uart1",
-+ },
-+ .res = {
-+ .start = UART1_BASE,
-+ .end = UART1_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {IRQ_UART1, NO_IRQ},
-+ .periphid = 0x808c0000,
-+};
-+
-+static struct amba_device uart2_device = {
-+ .dev = {
-+ .bus_id = "0x808d0000:uart2",
-+ },
-+ .res = {
-+ .start = UART2_BASE,
-+ .end = UART2_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {IRQ_UART2, NO_IRQ},
-+ .periphid = 0x808d0000,
-+};
-+
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+static struct amba_device uart3_device = {
-+ .dev = {
-+ .bus_id = "0x808e0000:uart3",
-+ },
-+ .res = {
-+ .start = UART3_BASE,
-+ .end = UART3_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {IRQ_UART3, NO_IRQ},
-+ .periphid = 0x808e0000,
-+};
-+
-+static struct amba_device key_device = {
-+ .dev = {
-+ .bus_id = "0x808f0000:key",
-+ },
-+ .res = {
-+ .start = KEY_BASE,
-+ .end = KEY_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x808f0000,
-+};
-+
-+static struct amba_device touch_device = {
-+ .dev = {
-+ .bus_id = "0x80900000:touch",
-+ },
-+ .res = {
-+ .start = TOUCH_BASE,
-+ .end = TOUCH_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80900000,
-+};
-+
-+static struct amba_device pwm_device = {
-+ .dev = {
-+ .bus_id = "0x80910000:pwm",
-+ },
-+ .res = {
-+ .start = PWM_BASE,
-+ .end = PWM_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80910000,
-+};
-+#endif
-+
-+static struct amba_device rtc_device = {
-+ .dev = {
-+ .bus_id = "0x80920000:rtc",
-+ },
-+ .res = {
-+ .start = RTC_BASE,
-+ .end = RTC_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {IRQ_RTC, NO_IRQ},
-+ .periphid = 0x80920000,
-+};
-+
-+static struct amba_device syscon_device = {
-+ .dev = {
-+ .bus_id = "0x80930000:syscon",
-+ },
-+ .res = {
-+ .start = SYSCON_BASE,
-+ .end = SYSCON_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80930000,
-+};
-+
-+static struct amba_device watchdog_device = {
-+ .dev = {
-+ .bus_id = "0x80940000:watchdog",
-+ },
-+ .res = {
-+ .start = WATCHDOG_BASE,
-+ .end = WATCHDOG_BASE + SZ_4K - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ .irq = {NO_IRQ, NO_IRQ},
-+ .periphid = 0x80940000,
-+};
-+
-+static struct amba_device *amba_devs[] __initdata = {
-+ /* AHB devices */
-+ &dma_device,
-+ &mac_device,
-+ &usb_device,
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+ &raster_device,
-+#endif
-+ &sdram_device,
-+ &smc_device,
-+ &boot_device,
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+ &ide_device,
-+#endif
-+ &vic1_device,
-+ &vic2_device,
-+
-+ /* APB devices */
-+ &timer_device,
-+ &i2s_device,
-+ &security_device,
-+ &gpio_device,
-+ &ac97_device,
-+ &ssp_device,
-+ &irda_device,
-+ &uart1_device,
-+ &uart2_device,
-+#if defined(CONFIG_ARCH_EP9312) || defined (CONFIG_ARCH_EP9315)
-+ &uart3_device,
-+ &key_device,
-+ &touch_device,
-+ &pwm_device,
-+#endif
-+ &rtc_device,
-+ &syscon_device,
-+ &watchdog_device,
-+};
-+
-+static int __init ep93xx_init(void)
-+{
-+ int i;
-+
-+ check_model();
-+
-+ for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
-+ struct amba_device *d = amba_devs[i];
-+ amba_device_register(d, &iomem_resource);
-+ }
-+
-+ return 0;
-+}
-+
-+arch_initcall(ep93xx_init);
-+
-+#define TIMER_INTERVAL (508 * mSEC_10 / 1000)
-+#define TICKS2USECS(x) ((x) * 1000 / 508)
-+
-+static unsigned long timer_reload;
-+
-+/*
-+ * Returns number of ms since last clock interrupt. Note that interrupts
-+ * will have been disabled by do_gettimeoffset()
-+ */
-+static unsigned long ep93xx_gettimeoffset(void)
-+{
-+ unsigned long ticks1, ticks2, status;
-+
-+ /*
-+ * Get the current number of ticks. Note that there is a race
-+ * condition between us reading the timer and checking for
-+ * an interrupt. We get around this by ensuring that the
-+ * counter has not reloaded between our two reads.
-+ */
-+ ticks2 = readl(TIMER1VALUE) & 0xffff;
-+ do {
-+ ticks1 = ticks2;
-+ status = readl(VIC0RAWINTR);
-+ ticks2 = readl(TIMER1VALUE) & 0xffff;
-+ } while (ticks2 > ticks1);
-+
-+ /*
-+ * Number of ticks since last interrupt.
-+ */
-+ ticks1 = timer_reload - ticks2;
-+
-+ /*
-+ * Interrupt pending? If so, we've reloaded once already.
-+ */
-+ if (status & (1 << IRQ_TIMER1))
-+ ticks1 += timer_reload;
-+
-+ return TICKS2USECS(ticks1);
-+}
-+
-+/*
-+ * IRQ handler for the timer
-+ */
-+static irqreturn_t
-+ep93xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ /* ...clear the interrupt */
-+ writel(1, TIMER1CLEAR);
-+
-+ timer_tick(regs);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static struct irqaction ep93xx_timer_irq = {
-+ .name = "timer",
-+ .flags = SA_INTERRUPT,
-+ .handler = ep93xx_timer_interrupt
-+};
-+
-+/*
-+ * Set up timer interrupt
-+ */
-+static void __init __ep93xx_init_timer(unsigned long reload, unsigned int ctrl)
-+{
-+ unsigned int timer_ctrl = 0x80 | 0x40 | 0x08; /* periodic at 508 kHz */
-+
-+ timer_reload = reload;
-+ timer_ctrl |= ctrl;
-+
-+ /*
-+ * Initialise to a known state (all timers off)
-+ */
-+
-+ writel(0, TIMER1CONTROL);
-+ writel(0, TIMER2CONTROL);
-+ writel(0, TIMER3CONTROL);
-+
-+ writel(timer_reload, TIMER1LOAD);
-+ writel(timer_reload, TIMER1VALUE);
-+ writel(timer_ctrl, TIMER1CONTROL);
-+
-+ setup_irq(IRQ_TIMER1, &ep93xx_timer_irq);
-+}
-+
-+static void __init ep93xx_init_timer(void)
-+{
-+ /* 10 ms interval on a 508 kHz clock */
-+ __ep93xx_init_timer(5080, 0);
-+}
-+
-+struct sys_timer ep93xx_timer = {
-+ .init = ep93xx_init_timer,
-+ .offset = ep93xx_gettimeoffset,
-+};
-diff --git a/arch/arm/mach-ep93xx/ep93xx_gpio_irq.h b/arch/arm/mach-ep93xx/ep93xx_gpio_irq.h
-new file mode 100644
-index 0000000..d396e96
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/ep93xx_gpio_irq.h
-@@ -0,0 +1,41 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/ep93xx_gpio_irq.h
-+ *
-+ * Copyright (C) 2004 Contec Steuerungstechnik & Automation GmbH
-+ * Manfred Gruber <manfred.gruber@contec.at>
-+ *
-+ * 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
-+ */
-+
-+/*
-+ * configuration struct for GPIO IRQs
-+ *
-+ * enable = 1 --> this EGIO is a irq
-+ * enable = 0 --> this EGIO is a GPIO
-+ * flags can be IRQT_RISING
-+ * IRQT_FALLING
-+ * IRQT_LOW
-+ * IRQT_HIGH
-+ * IRQT_PROBE
-+ *
-+ * On IRQT_PROBE nothing is done in setup irq code
-+ */
-+
-+struct ep93xx_egpio_irq
-+{
-+ unsigned int enable;
-+ unsigned int flags;
-+};
-+
-diff --git a/arch/arm/mach-ep93xx/irq.c b/arch/arm/mach-ep93xx/irq.c
-new file mode 100644
-index 0000000..578c783
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/irq.c
-@@ -0,0 +1,601 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/irq.c
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * (c) Copyright 2001 LynuxWorks, Inc., San Jose, CA. All rights reserved.
-+ *
-+ * Copyright (C) 2002-2003 Cirrus Logic, Inc.
-+ *
-+ * Demux IRQ 59 by
-+ * Copyright (C) 2004 Contec Steuerungstechnik & Automation GmbH
-+ * Manfred Gruber <manfred.gruber@contec.at>
-+ *
-+ * 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
-+ *
-+ *
-+ * Modified by Stefano Lena <stefano.lena@dave-tech.it>, DAVE s.r.l.
-+ * for Cirrus Logic EP93xx series
-+ *
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/timer.h>
-+#include <linux/init.h>
-+
-+#include <asm/irq.h>
-+
-+#include <asm/arch/irqs.h>
-+
-+#include <asm/mach/irq.h>
-+#include <asm/io.h>
-+#include <asm/arch/hardware.h>
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+#include <asm/arch/regmap.h>
-+#include <linux/errno.h>
-+#include "ep93xx_gpio_irq.h"
-+extern struct ep93xx_egpio_irq egpio_irqs[];
-+
-+/* GPIO Port A/B debug messages */
-+/* #define DEBUG_GPIO */
-+#ifdef DEBUG_GPIO
-+#define IRQDBG(args...) printk(args)
-+#else
-+#define IRQDBG(args...) do {} while(0)
-+#endif
-+#endif
-+/********************************************************************
-+ * Interrupt functions are defined as machine specific here.
-+ *
-+ * Note:
-+ * 1. Only normal interrupts are defined here.
-+ * FIQs are a separate class of interrupts and would
-+ * be slowed down if handled like normal interrupts.
-+ *
-+ * 2. TBD Invalid interrupt numbers are not checked.
-+ * Some interrupt inputs are tied to GND, which means
-+ * they will immediately activate when unmasked.
-+ * Which may be useful for some devices.
-+ *
-+ * 3. TBD Edge triggered interrupts are not specially
-+ * handled. The architecture should provide a way to
-+ * set up the edge trigger features and then a way to
-+ * control the acknowledge to the interrupt.
-+ *
-+ ************************************************************************/
-+
-+ /********************************************************************
-+ * demux interrupt handler for GPIO Port A and B on ep93xx
-+ *
-+ * Note:
-+ That IRQs from 64 to 79 defined as GPIO_IRQ0 - GPIO_IRQ15
-+ * GPIO IRQs on port F are as the are defined as IRQ_GPIOX
-+ * which are NOT handled in demux interrupt handler !!!!!
-+ *
-+ * Default in mach-xy file a struct ep93xx_egpio_irq
-+ * can be set up, there you can configure which gpio
-+ * of Port A/B should be used as interrupt on startup.
-+ * Setting up this IRQs in your driver direct not on startup
-+ * you have to do a set_irq_type(GPIO_IRQX, flags) before
-+ * calling request irq. Possible Flags are:
-+ * IRQT_RISING, IRQT_FALLING, IRQT_LOW, IRQT_HIGH, IRQT_PROBE, IRQ_DB, IRQ_NOTDB
-+ * On IRQT_PROBE nothing is done.
-+ ************************************************************************/
-+
-+ /********************************************************************
-+ * TODO:
-+ *
-+ * Configure ack, mask, unsmask to use the right
-+ * Port F GPIO registers.
-+ *
-+************************************************************************/
-+
-+static void ep93xx_vic1_mask(unsigned int irq)
-+{
-+ writel((1 << irq), VIC0INTENCLEAR);
-+}
-+
-+static void ep93xx_vic1_unmask(unsigned int irq)
-+{
-+ writel((1 << irq), VIC0INTENABLE);
-+}
-+
-+static struct irqchip vic1_chip = {
-+ .ack = ep93xx_vic1_mask,
-+ .mask = ep93xx_vic1_mask,
-+ .unmask = ep93xx_vic1_unmask,
-+};
-+
-+static void ep93xx_vic2_mask(unsigned int irq)
-+{
-+ writel((1 << (irq - 32)), VIC1INTENCLEAR);
-+}
-+
-+static void ep93xx_vic2_unmask(unsigned int irq)
-+{
-+ writel((1 << (irq - 32)), VIC1INTENABLE);
-+}
-+
-+static struct irqchip vic2_chip = {
-+ .ack = ep93xx_vic2_mask,
-+ .mask = ep93xx_vic2_mask,
-+ .unmask = ep93xx_vic2_unmask,
-+};
-+
-+static void ep93xx_rtc_ack(unsigned int irq)
-+{
-+}
-+
-+static struct irqchip rtc_chip = {
-+ .ack = ep93xx_rtc_ack,
-+ .mask = ep93xx_vic2_mask,
-+ .unmask = ep93xx_vic2_unmask,
-+};
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+/*
-+ * ack EGPIO irq's
-+ * Ack only for edge triggered int's valid
-+ */
-+static void inline ep93xx_ack_gpio_irq(u32 irq)
-+{
-+ u32 irq_status;
-+ u32 bit = IRQ_TO_BIT(irq);
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ /* Port A */
-+ if(bit & 0xFF) {
-+ irq_status = readl(GPIO_INTSTATUSA);
-+ if(irq_status & bit)
-+ writel(bit, GPIO_AEOI);
-+ }
-+
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ irq_status = readl(GPIO_INTSTATUSB);
-+ if(irq_status & (bit >> 8))
-+ writel((bit >> 8), GPIO_BEOI);
-+
-+ }
-+}
-+
-+/*
-+ * unmask EGPIO irq's (enable)
-+ */
-+static void inline ep93xx_unmask_gpio_irq(u32 irq)
-+{
-+ u32 irq_status;
-+ u32 bit = IRQ_TO_BIT(irq);
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ /* Port A */
-+ if(bit & 0xFF) {
-+ irq_status = readl(GPIO_AINTEN);
-+ irq_status |= bit;
-+ writel(irq_status, GPIO_AINTEN);
-+ }
-+
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ irq_status = readl(GPIO_BINTEN);
-+ irq_status |= (bit >> 8);
-+ writel(irq_status, GPIO_BINTEN);
-+ }
-+}
-+
-+/*
-+ * Enable debounce on EGPIO IRQ
-+ */
-+
-+static void ep93xx_debounce_enable(u32 irq)
-+{
-+ u32 db_status;
-+ u32 bit = IRQ_TO_BIT(irq);
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ /* Port A */
-+ if (bit & 0xFF) {
-+ db_status = readl(GPIO_ADB);
-+ db_status |= bit ;
-+ writel(db_status, GPIO_ADB);
-+ }
-+
-+ /* Port B */
-+ if (bit & 0xFF00 ) {
-+ db_status = readl(GPIO_BDB);
-+ db_status |= (bit >> 8) ;
-+ writel(db_status, GPIO_BDB);
-+ }
-+
-+}
-+
-+/*
-+ * Disable debounce on EGPIO IRQ
-+ */
-+static void ep93xx_debounce_disable(u32 irq)
-+{
-+ u32 db_status;
-+ u32 bit = IRQ_TO_BIT(irq);
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ /* Port A */
-+ if (bit & 0xFF) {
-+ db_status = readl(GPIO_ADB);
-+ db_status &= ~bit ;
-+ writel(db_status, GPIO_ADB);
-+ }
-+
-+ /* Port B */
-+ if (bit & 0xFF00 ) {
-+ db_status = readl(GPIO_BDB);
-+ db_status &= ~(bit >> 8) ;
-+ writel(db_status, GPIO_BDB);
-+ }
-+
-+}
-+
-+/*
-+ * mask EGPIO irq's (disable)
-+ */
-+static void inline ep93xx_mask_gpio_irq(u32 irq)
-+{
-+ u32 irq_status;
-+ u32 bit = IRQ_TO_BIT(irq);
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ /* Port A */
-+ if(bit & 0xFF) {
-+ irq_status = readl(GPIO_AINTEN);
-+ irq_status &= ~bit;
-+ writel(irq_status, GPIO_AINTEN);
-+ }
-+
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ irq_status = readl(GPIO_BINTEN);
-+ irq_status &= ~(bit >> 8);
-+ writel(irq_status, GPIO_BINTEN);
-+ }
-+}
-+
-+
-+
-+/*
-+ * make a EGPIO to a irq input
-+ */
-+static int ep93xx_make_egio_to_irq(u32 bit,u32 irq)
-+{
-+ u32 irq_value;
-+ int ret;
-+
-+ IRQDBG("%s irq: %d bit 0x%x\n",__FUNCTION__, irq, bit);
-+
-+ if(bit & 0xFF) {
-+ /* Set direction to input for EGPIOA */
-+ irq_value = readl(GPIO_PADDR);
-+ irq_value &= ~bit;
-+ if((ret = writel(irq_value, GPIO_PADDR)) != irq_value) {
-+ printk("%s irq: %d cannot set direction register(GPIO_PADDR) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret);
-+ return -EFAULT;
-+ }
-+ }
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ /* Set direction to input for EGPIOB */
-+ irq_value = readl(GPIO_PBDDR);
-+ irq_value &= ~(bit >> 8);
-+ if((ret = writel(irq_value, GPIO_PBDDR)) != irq_value) {
-+ printk("%s irq: %d cannot set direction register(GPIO_PBDDR) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret);
-+ return -EFAULT;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * make a EGPIO edge/level sensitive
-+ */
-+static int ep93xx_make_egio_sensitive(u32 bit, unsigned int flags,u32 irq)
-+{
-+ u32 irq_value;
-+ int ret;
-+
-+ /* PORT A */
-+ if(bit & 0xFF) {
-+ /* Enable edge/level sensitive IRQ on EGPIO PORT A */
-+ irq_value = readl(GPIO_AINTTYPE1);
-+ if(flags && 1)
-+ irq_value |= bit;
-+ else
-+ irq_value &= ~bit;
-+ if((ret = writel(irq_value, GPIO_AINTTYPE1)) != irq_value) {
-+ printk("%s irq: %d cannot set IRQ parameter(GPIO_AINTYPE1) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret);
-+ return -EFAULT;
-+ }
-+ }
-+
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ /* Enable edge/level sensitive IRQ on EGPIO PORT B */
-+ irq_value = readl(GPIO_BINTTYPE1);
-+ if(flags && 1)
-+ irq_value |= (bit >> 8);
-+ else
-+ irq_value &= ~(bit >> 8);
-+ if((ret = writel(irq_value, GPIO_BINTTYPE1)) != irq_value) {
-+ /* printk("%s irq: %d cannot set IRQ parameter(GPIO_BINTYPE1) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret); */
-+ return -EFAULT;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * make a EGPIO high/low sensitive
-+ */
-+static int ep93xx_make_egio_high_low_sensitive(u32 bit, unsigned int flags,u32 irq)
-+{
-+ u32 irq_value;
-+ int ret;
-+
-+ /* PORT A */
-+ if(bit & 0xFF) {
-+ /* Enable high/low sensitive IRQ on EGPIO PORT A */
-+ irq_value = readl(GPIO_AINTTYPE2);
-+ if(flags && 1)
-+ irq_value |= bit;
-+ else
-+ irq_value &= ~bit;
-+ if((ret = writel(irq_value, GPIO_AINTTYPE2)) != irq_value) {
-+ printk("%s irq: %d cannot set IRQ parameter(GPIO_AINTTYPE2) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret);
-+ return -EFAULT;
-+ }
-+ }
-+
-+ /* Port B */
-+ if(bit & 0xFF00) {
-+ /* Enable high/low sensitive IRQ on EGPIO PORT B */
-+ irq_value = readl(GPIO_BINTTYPE2);
-+ if(flags && 1)
-+ irq_value |= (bit >> 8);
-+ else
-+ irq_value &= ~(bit >> 8);
-+ if((ret = writel(irq_value, GPIO_BINTTYPE2)) != irq_value)
-+ {
-+ printk("%s irq: %d cannot set IRQ parameter(GPIO_BINTYPE2) value 0x%x written 0x%x\n",__FUNCTION__,irq,irq_value,ret);
-+ return -EFAULT;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+
-+
-+/*
-+ * type of GPIO irq's
-+ */
-+static int ep93xx_gpio_demux_handler_type(unsigned int irq, unsigned int flags)
-+{
-+ u32 bit = IRQ_TO_BIT(irq);
-+ unsigned int debounce = 0;
-+
-+ IRQDBG("%s irq: %d\n",__FUNCTION__,irq);
-+
-+ /*if (flags == IRQT_PROBE)
-+ return 0;*/
-+
-+ if ((flags & __IRQT_RISEDGE) | (flags & __IRQT_FALEDGE) | (flags & __IRQT_LOWLVL) | (flags & __IRQT_HIGHLVL) | (flags & IRQT_DB) | (flags & IRQT_NOTDB)) {
-+ if(0 != ep93xx_make_egio_to_irq(bit,irq)) {
-+ printk("%s irq: %d cannot set direction register GPIO_PXDDR\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ } else {
-+ if ((flags & IRQT_DB) | (flags & IRQT_NOTDB)) { /* To use switch structure extract debounce
-+ flags from flags variable */
-+ debounce = (flags & IRQT_DB) | (flags & IRQT_NOTDB);
-+ flags &= ~debounce;
-+ }
-+ if((flags & __IRQT_RISEDGE) | (flags & __IRQT_FALEDGE)) {
-+ /* Configure for edge IRQ */
-+ if(0 == ep93xx_make_egio_sensitive(bit, 1,irq)) {
-+ switch(flags) {
-+ case __IRQT_RISEDGE:
-+ if(0 != ep93xx_make_egio_high_low_sensitive(bit, 1,irq)) {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE2\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+ break;
-+ case __IRQT_FALEDGE:
-+ if(0 != ep93xx_make_egio_high_low_sensitive(bit, 0,irq)) {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE2\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+ break;
-+ }
-+
-+ /* Now we set IRQ handler for edge */
-+ /* set_irq_handler(irq, do_edge_IRQ); */
-+ } else {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE1\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+
-+ } else {
-+ if((flags & __IRQT_LOWLVL) | (flags & __IRQT_HIGHLVL)) {
-+ /* Configure for level IRQ */
-+ if(0 == ep93xx_make_egio_sensitive(bit, 0,irq)) {
-+ switch(flags)
-+ {
-+ case __IRQT_HIGHLVL:
-+ if(0 != ep93xx_make_egio_high_low_sensitive(bit, 1,irq))
-+ {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE2\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+ break;
-+ case __IRQT_LOWLVL:
-+ if(0 != ep93xx_make_egio_high_low_sensitive(bit, 0,irq))
-+ {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE2\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+ break;
-+ }
-+
-+ /* Now we set IRQ handler level sensitive */
-+ /* set_irq_handler(irq, do_level_IRQ); */
-+ } else {
-+ printk("%s irq: %d cannot set sensitive register GPIO_XINTYPE1\n",__FUNCTION__,irq);
-+ return -EINVAL;
-+ }
-+
-+ }
-+ }
-+ }
-+ /* For debounce flags handling */
-+ if ((debounce & IRQT_DB) | (debounce & IRQT_NOTDB)) {
-+ switch(debounce)
-+ {
-+ case IRQT_DB:
-+ ep93xx_debounce_enable(irq);
-+ break;
-+ case IRQT_NOTDB:
-+ ep93xx_debounce_disable(irq);
-+ break;
-+ }
-+ }
-+ } else {
-+ printk("ep93xx_type_gpio_irq: IRQ:%d no flags defined\n",irq);
-+ return -EINVAL;
-+ }
-+return 0;
-+}
-+
-+/*
-+ * GPIO call handler
-+ */
-+static void ep93xx_gpio_handler(unsigned int mask, unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
-+{
-+ IRQDBG("%s irq: %d\n",__FUNCTION__,irq);
-+
-+ desc = irq_desc + irq;
-+
-+ while (mask) {
-+ if (mask & 1) {
-+ IRQDBG("handling irq %d\n", irq);
-+ desc->handle(irq, desc, regs);
-+ }
-+ irq++;
-+ desc++;
-+ mask >>= 1;
-+ }
-+
-+}
-+
-+/*
-+ * GPIO dmux handler
-+ */
-+static void ep93xx_gpio_demux_handler(unsigned int irq_gpio, struct irqdesc *desc, struct pt_regs *regs)
-+{
-+ unsigned int mask;
-+ unsigned int irq = IRQ_CHAINED_GPIO(0);
-+
-+ /*
-+ * Mask the parent IRQ.
-+ */
-+ ep93xx_vic2_mask(irq_gpio);
-+
-+ mask = readl(GPIO_INTSTATUSA) | (readl(GPIO_INTSTATUSB) << 8);
-+
-+ irq = IRQ_CHAINED_GPIO(0);
-+ IRQDBG("%s mask: 0x%x irq: %d\n",__FUNCTION__,mask,irq);
-+ ep93xx_gpio_handler(mask, irq, desc, regs);
-+
-+ /*
-+ * Unmask the parent IRQ
-+ */
-+ ep93xx_vic2_unmask(irq_gpio);
-+}
-+
-+
-+static struct irqchip ep93xx_gpio_irq = {
-+ .ack = ep93xx_ack_gpio_irq,
-+ .mask = ep93xx_mask_gpio_irq,
-+ .unmask = ep93xx_unmask_gpio_irq,
-+ .set_type = ep93xx_gpio_demux_handler_type,
-+};
-+
-+#endif
-+
-+
-+void __init ep93xx_init_irq(void)
-+{
-+ unsigned int i;
-+
-+ /* Interrupt bits 0 and 1 are unused */
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+ for (i = 2; i < NR_GLBL_IRQS; i++) {
-+#else
-+ for (i = 2; i < NR_IRQS; i++) {
-+#endif
-+ if(i < 32){
-+ /* Interrupts below 32 belong to VIC1 */
-+ set_irq_handler(i, do_level_IRQ);
-+ set_irq_chip(i, &vic1_chip);
-+ set_irq_flags(i, IRQF_VALID);
-+
-+ } else {
-+ if (i == IRQ_1HZ) {
-+ /* 1 Hz int is edge trigered, and not ackable */
-+ set_irq_handler(i, do_edge_IRQ);
-+ set_irq_chip(i, &rtc_chip);
-+ set_irq_flags(i, IRQF_VALID | IRQF_NOAUTOEN);
-+ } else {
-+ /* Interrupt 32 and above belong to VIC2 */
-+ set_irq_handler(i, do_level_IRQ);
-+ set_irq_chip(i, &vic2_chip);
-+ set_irq_flags(i, IRQF_VALID);
-+ }
-+ }
-+ }
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+ for (i = IRQ_CHAINED_GPIO(0) ; i <= IRQ_CHAINED_GPIO(15); i++) {
-+
-+ IRQDBG("%s irq: %d init \n",__FUNCTION__, i);
-+
-+ /* GPIO Interrupt is demux to 16 IRQs */
-+ set_irq_chip(i, &ep93xx_gpio_irq);
-+ set_irq_flags(i, IRQF_VALID);
-+
-+ if(egpio_irqs[i - NR_GLBL_IRQS].enable == 1) {
-+ set_irq_handler(i, do_level_IRQ);
-+ set_irq_type(i, egpio_irqs[i - NR_GLBL_IRQS].flags);
-+ } else {
-+ set_irq_handler(i, do_edge_IRQ);
-+ }
-+ }
-+ set_irq_chained_handler(IRQ_GPIO, ep93xx_gpio_demux_handler);
-+#endif
-+}
-diff --git a/arch/arm/mach-ep93xx/mach-acc.c b/arch/arm/mach-ep93xx/mach-acc.c
-new file mode 100644
-index 0000000..aa002ac
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-acc.c
-@@ -0,0 +1,67 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/acc.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ * Copyright (C) 2004 Klaus Fetscher
-+ *
-+ * 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/kernel.h>
-+#include <linux/init.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+
-+#include <asm/arch/platform.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc acc_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init acc_map_io(void)
-+{
-+ iotable_init(acc_io_desc, ARRAY_SIZE(acc_io_desc));
-+}
-+
-+static void __init acc_init(void)
-+{
-+}
-+
-+MACHINE_START(ACC, "acc")
-+ /* Maintainer HiFish */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = acc_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = acc_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-adssphere.c b/arch/arm/mach-ep93xx/mach-adssphere.c
-new file mode 100644
-index 0000000..2cbf5ca
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-adssphere.c
-@@ -0,0 +1,281 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/adssphere.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ * Copyright (C) 2005 Robert Whaley, ADS
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/platform_device.h>
-+#include <linux/fb.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/arch/adssphere.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc adssphere_io_desc[] __initdata =
-+{
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+ { ADSSPHERE_BASE_VIRT, ADSSPHERE_BASE_PHYS, SZ_1M, MT_DEVICE },
-+};
-+
-+static void __init adssphere_map_io(void)
-+{
-+ iotable_init(adssphere_io_desc, ARRAY_SIZE(adssphere_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 4,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_32M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .id = 0,
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN)
-+
-+void adssphere_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ break;
-+
-+ case led_idle_end:
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ break;
-+
-+ case led_red_off:
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SOUND_EP93XX_AC97
-+void adssphere_audio_power(int on)
-+{
-+ unsigned int tmp;
-+
-+ tmp = readb(ADSSPHERE_CR1);
-+ if (on) {
-+ tmp |= ADSSPHERE_CR1_AMP_ON;
-+ tmp &= ~ADSSPHERE_CR1_CDC_ON;
-+ } else {
-+ tmp &= ~ADSSPHERE_CR1_AMP_ON;
-+ tmp |= ADSSPHERE_CR1_CDC_ON;
-+ }
-+ writeb(tmp, ADSSPHERE_CR1);
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_FB_EP93XX
-+void adssphere_blank(int blank_mode)
-+{
-+ unsigned int tmp;
-+
-+ switch (blank_mode) {
-+ case FB_BLANK_UNBLANK:
-+ case FB_BLANK_NORMAL:
-+ /* turn on backlight via enable and pwm */
-+ /* enable fb signals */
-+ tmp = readl(ADSSPHERE_CR1);
-+ tmp &= ~ADSSPHERE_CR1_PNL_ON;
-+ tmp |= ADSSPHERE_CR1_PNL_EN | ADSSPHERE_CR1_BL_ON;
-+ writel(tmp, ADSSPHERE_CR1);
-+
-+ writel(100, PWM0_TC);
-+ writel(99, PWM0_DC);
-+ writel(1, PWM0_EN);
-+
-+ break;
-+
-+
-+ case FB_BLANK_VSYNC_SUSPEND:
-+ case FB_BLANK_HSYNC_SUSPEND:
-+ case FB_BLANK_POWERDOWN:
-+
-+ /* disable fb signals */
-+ /* turn off backlight via enable and pwm */
-+ tmp = readl(ADSSPHERE_CR1);
-+ tmp |= ADSSPHERE_CR1_PNL_ON;
-+ tmp &= ~(ADSSPHERE_CR1_PNL_EN | ADSSPHERE_CR1_BL_ON);
-+ writel(tmp, ADSSPHERE_CR1);
-+
-+ writel(0, PWM0_EN);
-+
-+ break;
-+ }
-+}
-+#endif
-+
-+static void __init adssphere_init (void)
-+{
-+#if 0
-+ printk("physmap_configure\n");
-+ physmap_configure(0x60000000, 0x02000000, 4, NULL);
-+#endif
-+ printk("platform_device_register\n");
-+ platform_device_register(&cfi_flash_device);
-+#ifdef CONFIG_LEDS
-+ leds_event = adssphere_leds_event;
-+#endif
-+ leds_event(led_start);
-+#ifdef CONFIG_SOUND_EP93XX_AC97
-+ adssphere_audio_power(1);
-+#endif
-+}
-+
-+MACHINE_START(ADSSPHERE, "adssphere")
-+ /* Maintainer: Applied Data Systems */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = adssphere_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = adssphere_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-+
-diff --git a/arch/arm/mach-ep93xx/mach-dma03.c b/arch/arm/mach-ep93xx/mach-dma03.c
-new file mode 100644
-index 0000000..2223f80
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-dma03.c
-@@ -0,0 +1,343 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/mach-dma03.c
-+ * Copyright (C) 2005 Michael Burian
-+ *
-+ * based on arch/arm/mach-ep93xx/mach-edb9315.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#ifdef CONFIG_SERIAL_8250
-+#include <linux/serial_8250.h>
-+#endif
-+
-+#ifdef CONFIG_PARPORT_PC
-+#include <linux/parport.h>
-+#endif
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+#ifdef CONFIG_SERIAL_8250
-+#include <asm/serial.h>
-+#endif
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+#include "ep93xx_gpio_irq.h"
-+#endif
-+
-+
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc dma03_io_desc[] __initdata = {
-+ {EP93XX_AHB_BASE, __phys_to_pfn(io_v2p(EP93XX_AHB_BASE)), SZ_1M, MT_DEVICE},
-+ {EP93XX_APB_BASE, __phys_to_pfn(io_v2p(EP93XX_APB_BASE)), SZ_8M, MT_DEVICE},
-+#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_PARPORT_PC)
-+ { 0xD0000000, __phys_to_pfn(0x70000000), SZ_4K, MT_DEVICE }, /* 2x UARTS, LPT; 16C552 */
-+#endif
-+};
-+
-+static void __init dma03_map_io(void)
-+{
-+ iotable_init(dma03_io_desc, ARRAY_SIZE(dma03_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 4,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_32M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void dma03_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+/* GPIO irq description
-+ * IRQs are set up in arch/arm/mach-ep93xx/irq.c
-+ * flags can be IRQT_RISING
-+ * IRQT_FALLING
-+ * IRQT_LOW
-+ * IRQT_HIGH
-+ * IRQT_PROBE
-+ *
-+ * On IRQT_PROBE nothing is done in setup irq code
-+ */
-+
-+/* For IRQ Demux */
-+
-+#define DISABLED 0
-+#define ENABLED 1
-+struct ep93xx_egpio_irq egpio_irqs[] __initdata =
-+{
-+ /* EGPIO IRQ 0 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 1 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 2 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 3 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 4 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 5 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 6 */
-+ { ENABLED, IRQT_HIGH }, /* OKI ML9620 CAN controller can0 */
-+ /* EGPIO IRQ 7 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 8 */
-+ { ENABLED, IRQT_HIGH }, /* 16C552 serial UART 1 */
-+ /* EGPIO IRQ 9 */
-+ { ENABLED, IRQT_HIGH }, /* 16C552 serial UART 2 */
-+ /* EGPIO IRQ 10 */
-+ { ENABLED, IRQT_RISING }, /* 16C552 parallel port 1 */
-+ /* EGPIO IRQ 11 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 12 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 13 */
-+ { ENABLED, IRQT_HIGH }, /* OKI ML9620 CAN controller can1 */
-+ /* EGPIO IRQ 14 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 15 */
-+ { DISABLED, IRQT_PROBE },
-+};
-+#endif
-+
-+#ifdef CONFIG_SERIAL_8250
-+static struct plat_serial8250_port serial_platform_data[] = {
-+ {
-+ .mapbase = 0x70000008,
-+ .irq = GPIO_IRQ8,
-+ .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
-+ .iotype = UPIO_MEM,
-+ .regshift = 0,
-+ .uartclk = BASE_BAUD*16,
-+ } , {
-+ .mapbase = 0x70000010,
-+ .irq = GPIO_IRQ9,
-+ .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
-+ .iotype = UPIO_MEM,
-+ .regshift = 0,
-+ .uartclk = BASE_BAUD*16,
-+ }, { },
-+};
-+
-+static struct platform_device serial_device = {
-+ .name = "serial8250",
-+ .id = PLAT8250_DEV_PLATFORM,
-+ .dev = {
-+ .platform_data = serial_platform_data,
-+ },
-+};
-+#endif
-+
-+static struct platform_device *devices[] __initdata = {
-+ &cfi_flash_device,
-+#ifdef CONFIG_SERIAL_8250
-+ &serial_device,
-+#endif
-+};
-+
-+static void __init dma03_init(void)
-+{
-+ struct parport *port;
-+ physmap_configure(0x60000000, 0x02000000, 4, NULL);
-+ platform_add_devices(devices, ARRAY_SIZE(devices));
-+
-+#ifdef CONFIG_PARPORT_PC
-+ port = parport_pc_probe_port(0xD0000020, 0, GPIO_IRQ10, 0, NULL);
-+// How to register that beast without crashing?
-+// if(port)
-+// port = parport_register_port(0xD0000020, GPIO_IRQ10, 0, NULL); // note that passing NULL as fops arg is a bad idea(tm)
-+// if(port)
-+// parport_announce_port(port);
-+#endif
-+
-+#ifdef CONFIG_LEDS
-+ leds_event = dma03_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+MACHINE_START(DMA03, "dma03")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = dma03_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = dma03_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-edb9301.c b/arch/arm/mach-ep93xx/mach-edb9301.c
-new file mode 100644
-index 0000000..68004e2
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-edb9301.c
-@@ -0,0 +1,219 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/edb9301.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc edb9301_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init edb9301_map_io(void)
-+{
-+ iotable_init(edb9301_io_desc, ARRAY_SIZE(edb9301_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 2,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_16M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void edb9301_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init edb9301_init(void)
-+{
-+ physmap_configure(0x60000000, 0x01000000, 2, NULL);
-+ platform_device_register(&cfi_flash_device);
-+#ifdef CONFIG_LEDS
-+ leds_event = edb9301_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+MACHINE_START(EDB9301, "edb9301")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = edb9301_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = edb9301_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-edb9302.c b/arch/arm/mach-ep93xx/mach-edb9302.c
-new file mode 100644
-index 0000000..ac74a1e
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-edb9302.c
-@@ -0,0 +1,362 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/edb9302.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+#include <asm/arch/mach-edb9302.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc edb9302_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init edb9302_map_io(void)
-+{
-+ iotable_init(edb9302_io_desc, ARRAY_SIZE(edb9302_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 2,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_16M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+/* SSP hackery */
-+
-+static void ssp_cs_flash(struct ssp_slave *s, int enable)
-+{
-+ unsigned long x = readl(GPIO_PADR);
-+ if (enable)
-+ x &= ~0x80;
-+ else
-+ x |= 0x80;
-+ writel(x, GPIO_PADR);
-+}
-+
-+struct ep93xx_ssp_slave ep93xx_ssp_flash = {
-+ {
-+ LIST_HEAD_INIT(ep93xx_ssp_flash.slave.list),
-+ NULL,
-+ 0,
-+ 0,
-+ 8,
-+ 1,
-+ ssp_cs_flash},
-+ ((0 << SSPCR0_SCR_SHIFT) | (SSPCR0_FRF_MOTOROLA << SSPCR0_FRF_SHIFT) |
-+ SSPCR0_SPO | SSPCR0_SPH | (SSPCR0_DSS_8BIT << SSPCR0_DSS_SHIFT)),
-+ (SSPC1_SSE | SSPC1_RORIE),
-+ 2
-+};
-+
-+EXPORT_SYMBOL(ep93xx_ssp_flash);
-+
-+static void ssp_cs_codec(struct ssp_slave *s, int enable)
-+{
-+ unsigned long x = readl(GPIO_PADR);
-+ if (enable)
-+ x &= ~0x40;
-+ else
-+ x |= 0x40;
-+ writel(x, GPIO_PADR);
-+}
-+
-+struct ep93xx_ssp_slave ep93xx_ssp_codec = {
-+ {
-+ LIST_HEAD_INIT(ep93xx_ssp_codec.slave.list),
-+ NULL,
-+ 0,
-+ 0,
-+ 8,
-+ 1,
-+ ssp_cs_codec},
-+ ((31 << SSPCR0_SCR_SHIFT) | (SSPCR0_FRF_TI << SSPCR0_FRF_SHIFT) |
-+ (SSPCR0_DSS_8BIT << SSPCR0_DSS_SHIFT)),
-+ (SSPC1_SSE | SSPC1_RORIE),
-+ 48
-+};
-+
-+EXPORT_SYMBOL(ep93xx_ssp_codec);
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void edb9302_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init edb9302_init_gpio(void)
-+{
-+ /* port A */
-+ /* EGPIO0-7 */
-+ writel(0xc2, GPIO_PADDR);
-+ writel(0xc0, GPIO_PADR);
-+
-+ /* port B */
-+ /* EGPIO8-15 */
-+ writel(0x00, GPIO_PBDDR);
-+ writel(0x00, GPIO_PBDR);
-+
-+ /* port C */
-+ /* GPIO0 */
-+ writel(0x00, GPIO_PCDDR);
-+ writel(0x00, GPIO_PCDR);
-+
-+ /* port E */
-+ /* RDLED, GRLED */
-+ writel(0x03, GPIO_PEDDR);
-+ writel(0x03, GPIO_PEDR);
-+
-+ /* port F */
-+ /* GPIO5, GPIO6, GPIO7 */
-+ writel(0x00, GPIO_PFDDR);
-+ writel(0x00, GPIO_PFDR);
-+
-+ /* port G */
-+ /* EECLK, EEDAT */
-+ writel(0x00, GPIO_PGDDR);
-+ writel(0x00, GPIO_PGDR);
-+
-+ /* port H */
-+ /* GPIO1, GPIO2, GPIO3, GPIO4 */
-+ writel(0x00, GPIO_PHDDR);
-+ writel(0x00, GPIO_PHDR);
-+}
-+
-+/* looks like this might be more generic than just edb9302... */
-+int ssp_do_asymmetric(struct ep93xx_ssp_slave *ss, void *tx, int tlen, void *rx,
-+ int rlen)
-+{
-+ struct ssp_slave *s = (struct ssp_slave *)ss;
-+ int err;
-+
-+ if ((err = ssp_start(s)) < 0)
-+ goto out1;
-+
-+ ssp_select(s);
-+
-+ if ((err = ssp_post(s, tlen, tx, NULL)) < 0)
-+ goto out2;
-+
-+ ssp_wait(s);
-+
-+ if ((err = ssp_post(s, rlen, NULL, rx)) < 0)
-+ goto out2;
-+
-+ ssp_wait(s);
-+
-+ out2:
-+ ssp_deselect(s);
-+ ssp_finish(s);
-+ out1:
-+ return err;
-+}
-+
-+/* start poking at the Atmel AT25F1024 flash chip */
-+void poke_flash(void)
-+{
-+ unsigned char rdsr[1] = { 0x05 };
-+ unsigned char rdid[1] = { 0x15 };
-+ unsigned char rsp[10];
-+
-+ ssp_do_asymmetric(&ep93xx_ssp_flash, rdsr, 1, rsp, 1);
-+ printk(KERN_WARNING "RDSR returns %02x\n", rsp[0]);
-+
-+ ssp_do_asymmetric(&ep93xx_ssp_flash, rdid, 1, rsp, 2);
-+ printk(KERN_WARNING "RDID returns %02x:%02x\n", rsp[0], rsp[1]);
-+}
-+
-+static void __init edb9302_init(void)
-+{
-+ physmap_configure(0x60000000, 0x01000000, 2, NULL);
-+ platform_device_register(&cfi_flash_device);
-+ edb9302_init_gpio();
-+#ifdef CONFIG_LEDS
-+ leds_event = edb9302_leds_event;
-+#endif
-+ leds_event(led_start);
-+ if (ssp_add_slave(&ep93xx_ssp_master, &ep93xx_ssp_flash.slave) < 0)
-+ printk(KERN_ERR "EDB9302: unable to add flash slave\n");
-+ if (ssp_add_slave(&ep93xx_ssp_master, &ep93xx_ssp_codec.slave) < 0)
-+ printk(KERN_ERR "EDB9302: unable to add codec slave\n");
-+}
-+
-+MACHINE_START(EDB9302, "edb9302")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = edb9302_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = edb9302_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-edb9312.c b/arch/arm/mach-ep93xx/mach-edb9312.c
-new file mode 100644
-index 0000000..e67b673
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-edb9312.c
-@@ -0,0 +1,219 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/edb9312.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc edb9312_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init edb9312_map_io(void)
-+{
-+ iotable_init(edb9312_io_desc, ARRAY_SIZE(edb9312_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 4,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_32M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void edb9312_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init edb9312_init(void)
-+{
-+ physmap_configure(0x60000000, 0x02000000, 4, NULL);
-+ platform_device_register(&cfi_flash_device);
-+#ifdef CONFIG_LEDS
-+ leds_event = edb9312_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+MACHINE_START(EDB9312, "edb9312")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = edb9312_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = edb9312_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-edb9315.c b/arch/arm/mach-ep93xx/mach-edb9315.c
-new file mode 100644
-index 0000000..14c680a
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-edb9315.c
-@@ -0,0 +1,219 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/edb9315.c
-+ *
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc edb9315_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init edb9315_map_io(void)
-+{
-+ iotable_init(edb9315_io_desc, ARRAY_SIZE(edb9315_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 4,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_32M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void edb9315_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init edb9315_init(void)
-+{
-+ physmap_configure(0x60000000, 0x02000000, 4, NULL);
-+ platform_device_register(&cfi_flash_device);
-+#ifdef CONFIG_LEDS
-+ leds_event = edb9315_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+MACHINE_START(EDB9315, "edb9315")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = edb9315_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = edb9315_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-ttml.c b/arch/arm/mach-ep93xx/mach-ttml.c
-new file mode 100644
-index 0000000..872dd01
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-ttml.c
-@@ -0,0 +1,369 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/mach-ttml.c
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+#include <asm/arch/mach-ttml.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc ttml_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init ttml_map_io(void)
-+{
-+ iotable_init(ttml_io_desc, ARRAY_SIZE(ttml_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 2,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_16M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+
-+/* SSP hackery */
-+
-+static void ssp_cs_timicro(struct ssp_slave *s, int enable)
-+{
-+ unsigned long x = readl(GPIO_PBDR);
-+ if (enable)
-+ x &= ~0x10;
-+ else
-+ x |= 0x10;
-+ writel(x, GPIO_PBDR);
-+}
-+
-+struct ep93xx_ssp_slave ep93xx_ssp_micro = {
-+ {
-+ LIST_HEAD_INIT(ep93xx_ssp_micro.slave.list),
-+ NULL,
-+ 0,
-+ 0,
-+ 8,
-+ 1,
-+ ssp_cs_timicro},
-+ ((31 << SSPCR0_SCR_SHIFT) | (SSPCR0_FRF_TI << SSPCR0_FRF_SHIFT) |
-+ (SSPCR0_DSS_8BIT << SSPCR0_DSS_SHIFT)),
-+ (SSPC1_SSE | SSPC1_RORIE),
-+ 48
-+};
-+
-+EXPORT_SYMBOL(ep93xx_ssp_micro);
-+
-+static void ssp_cs_expansion(struct ssp_slave *s, int enable)
-+{
-+ unsigned long x = readl(GPIO_PBDR);
-+ if (enable)
-+ x &= ~0x20;
-+ else
-+ x |= 0x20;
-+ writel(x, GPIO_PBDR);
-+}
-+
-+struct ep93xx_ssp_slave ep93xx_ssp_expansion = {
-+ {
-+ LIST_HEAD_INIT(ep93xx_ssp_expansion.slave.list),
-+ NULL,
-+ 0,
-+ 0,
-+ 8,
-+ 1,
-+ ssp_cs_expansion},
-+ 0,
-+ 0,
-+ 0
-+};
-+
-+EXPORT_SYMBOL(ep93xx_ssp_expansion);
-+
-+/**
-+ * ssp_do_ttml - perform a single SSP transaction to the TTML micro
-+ * @s: the slave
-+ * @len: the number of words to transfer
-+ * @tx: a buffer of @len words to clock out to slave
-+ * @rx: a buffer of @len words to clock in from slave
-+ *
-+ * Use the SSP transaction interface to drive the TTML micro. The
-+ * first byte back from the micro is the length of the reply, excluding
-+ * the len and the csum bytes. @rlen and @rx had better be bigger
-+ * than any reply the micro might generate.
-+ */
-+int ssp_do_ttml(struct ep93xx_ssp_slave *ss, void *tx, int tlen, void *rx,
-+ int rlen)
-+{
-+ struct ssp_slave *s = (struct ssp_slave *)ss;
-+ int len;
-+ int err;
-+
-+ if ((err = ssp_start(s)) < 0)
-+ goto out1;
-+
-+ ssp_select(s);
-+
-+ if ((err = ssp_post(s, tlen, tx, NULL)) < 0)
-+ goto out2;
-+
-+ ssp_wait(s);
-+
-+ if ((err = ssp_post(s, 1, NULL, rx)) < 0)
-+ goto out2;
-+
-+ ssp_wait(s);
-+
-+ {
-+ char *b = rx;
-+ len = ((b[0] >> 4) & 0x07) + 2;
-+ }
-+
-+ if (len > rlen) {
-+ printk(KERN_WARNING "SSP: rx buffer truncated\n");
-+ len = rlen;
-+ }
-+
-+ if ((err = ssp_post(s, len - 1, NULL, rx + 1)) < 0)
-+ goto out2;
-+
-+ err = ssp_wait(s);
-+
-+ out2:
-+ ssp_deselect(s);
-+ out1:
-+ ssp_finish(s);
-+ return err;
-+}
-+
-+EXPORT_SYMBOL(ssp_do_ttml);
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void ttml_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init ttml_init_gpio(void)
-+{
-+ /* port A */
-+ writel(0x00, GPIO_PADDR);
-+
-+ /* port B */
-+ writel(0xf1, GPIO_PBDDR);
-+ writel(0xf1, GPIO_PBDR);
-+
-+ /* port C */
-+ writel(0x01, GPIO_PCDDR);
-+ writel(0x01, GPIO_PCDR);
-+
-+ /* port E */
-+ writel(0x03, GPIO_PEDDR);
-+ writel(0x03, GPIO_PEDR);
-+
-+ /* port F */
-+ writel(0x00, GPIO_PFDDR);
-+ writel(0x00, GPIO_PFDR);
-+
-+ /* port G */
-+ writel(0x00, GPIO_PGDDR);
-+ writel(0x00, GPIO_PGDR);
-+
-+ /* port H */
-+ writel(0x04, GPIO_PHDDR);
-+ writel(0x00, GPIO_PHDR);
-+}
-+
-+static void __init ttml_init(void)
-+{
-+ physmap_configure(0x60000000, 0x01000000, 2, NULL);
-+ platform_device_register(&cfi_flash_device);
-+ ttml_init_gpio();
-+#ifdef CONFIG_LEDS
-+ leds_event = ttml_leds_event;
-+#endif
-+ leds_event(led_start);
-+
-+ if (ssp_add_slave(&ep93xx_ssp_master, &ep93xx_ssp_micro.slave) < 0)
-+ printk(KERN_ERR "EP93XX: unable to add micro slave\n");
-+
-+ if (ssp_add_slave(&ep93xx_ssp_master, &ep93xx_ssp_expansion.slave) < 0)
-+ printk(KERN_ERR "EP93XX: unable to add expansion slave\n");
-+
-+}
-+
-+MACHINE_START(EDB9301, "ttml")
-+ /* Maintainer: Michael Burian */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = ttml_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = ttml_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-zefeerdzb.c b/arch/arm/mach-ep93xx/mach-zefeerdzb.c
-new file mode 100644
-index 0000000..c224ca1
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-zefeerdzb.c
-@@ -0,0 +1,237 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/zefeerdzb.c
-+ *
-+ * Copyright (C) 2004, 2005 DAVE Srl <www.dave-tech.it>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc zefeerdzb_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init zefeerdzb_map_io(void)
-+{
-+ iotable_init(zefeerdzb_io_desc, ARRAY_SIZE(zefeerdzb_io_desc));
-+}
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void zefeerdzb_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init zefeerdzb_init(void)
-+{
-+ /*
-+ physmap_configure(0x60000000, 0x01000000, 2, NULL);
-+ platform_device_register(&cfi_flash_device);
-+ */
-+
-+#ifdef CONFIG_LEDS
-+ leds_event = zefeerdzb_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+#include "ep93xx_gpio_irq.h"
-+#endif
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+/* GPIO irq description
-+ * IRQs are set up in arch/arm/mach-ep93xx/irq.c
-+ * flags can be IRQT_RISING
-+ * IRQT_FALLING
-+ * IRQT_LOW
-+ * IRQT_HIGH
-+ * IRQT_PROBE
-+ *
-+ * On IRQT_PROBE nothing is done in setup irq code
-+ */
-+
-+/* For IRQ Demux */
-+
-+#define DISABLED 0
-+#define ENABLED 1
-+struct ep93xx_egpio_irq egpio_irqs[] __initdata =
-+{
-+ /* EGPIO IRQ 0 */
-+ { DISABLED , IRQT_PROBE },
-+ /* EGPIO IRQ 1 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 2 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 3 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 4 */
-+ { ENABLED, IRQT_LOW }, /* CAN 0 GPIO IRQ */
-+ /* EGPIO IRQ 5 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 6 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 7 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 8 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 9 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 10 */
-+ { ENABLED, IRQT_LOW }, /* CAN 1 GPIO IRQ */
-+ /* EGPIO IRQ 11 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 12 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 13 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 14 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 15 */
-+ { DISABLED, IRQT_PROBE },
-+};
-+#endif
-+
-+MACHINE_START(ZEFEERDZB, "Zefeer DZB")
-+ /* Maintainer: DAVE Srl <www.dave-tech.it> */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = zefeerdzb_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = zefeerdzb_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/mach-zefeerdzq.c b/arch/arm/mach-ep93xx/mach-zefeerdzq.c
-new file mode 100644
-index 0000000..4cae7a7
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/mach-zefeerdzq.c
-@@ -0,0 +1,279 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/zefeerdzq.c
-+ *
-+ * Copyright (C) 2004, 2005 DAVE Srl <www.dave-tech.it>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/device.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/memory.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/sizes.h>
-+#include <asm/leds.h>
-+#include <asm/system.h>
-+
-+#include <asm/arch/platform.h>
-+#include <asm/arch/regmap.h>
-+
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
-+
-+extern void ep93xx_init_irq(void);
-+
-+/* break this up into individual register blocks and map them in
-+ the associated device drivers */
-+
-+static struct map_desc zefeerdzq_io_desc[] __initdata = {
-+ { EP93XX_AHB_BASE, io_v2p(EP93XX_AHB_BASE), SZ_1M, MT_DEVICE },
-+ { EP93XX_APB_BASE, io_v2p(EP93XX_APB_BASE), SZ_8M, MT_DEVICE },
-+};
-+
-+static void __init zefeerdzq_map_io(void)
-+{
-+ iotable_init(zefeerdzq_io_desc, ARRAY_SIZE(zefeerdzq_io_desc));
-+}
-+
-+/*
-+ * Flash handling.
-+ */
-+
-+/*
-+static int flash_init(void)
-+{
-+ return 0;
-+}
-+
-+static void flash_exit(void)
-+{
-+}
-+
-+static void flash_set_vpp(int on)
-+{
-+}
-+
-+static struct flash_platform_data flash_data = {
-+ .map_name = "cfi_probe",
-+ .width = 4,
-+ .init = flash_init,
-+ .exit = flash_exit,
-+ .set_vpp = flash_set_vpp,
-+};
-+
-+static struct resource cfi_flash_resource = {
-+ .start = 0x60000000,
-+ .end = 0x60000000 + SZ_32M - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device cfi_flash_device = {
-+ .name = "ZefeerDZQ Boot Flash",
-+ .dev = {
-+ .platform_data = &flash_data,
-+ },
-+ .num_resources = 1,
-+ .resource = &cfi_flash_resource,
-+};
-+*/
-+
-+#ifdef CONFIG_LEDS
-+
-+#define LED_STATE_ENABLED 1
-+#define LED_STATE_CLAIMED 2
-+
-+static unsigned int led_state;
-+static unsigned int hw_led_state;
-+
-+#define LED_RED 2
-+#define LED_GREEN 1
-+#define LED_MASK (LED_GREEN | LED_RED)
-+
-+void zefeerdzq_leds_event(led_event_t evt)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ switch (evt) {
-+ case led_start:
-+ led_state = LED_STATE_ENABLED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_stop:
-+ led_state &= ~LED_STATE_ENABLED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_claim:
-+ led_state |= LED_STATE_CLAIMED;
-+ hw_led_state = LED_RED | LED_GREEN;
-+ break;
-+
-+ case led_release:
-+ led_state &= ~LED_STATE_CLAIMED;
-+ hw_led_state = 0;
-+ break;
-+
-+ case led_timer:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state ^= LED_GREEN;
-+ break;
-+
-+ case led_idle_start:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ case led_idle_end:
-+ if (!(led_state & LED_STATE_CLAIMED))
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_halted:
-+ break;
-+
-+ case led_green_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_GREEN;
-+ break;
-+
-+ case led_green_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_GREEN;
-+ break;
-+
-+ case led_amber_on:
-+ break;
-+
-+ case led_amber_off:
-+ break;
-+
-+ case led_red_on:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state |= LED_RED;
-+ break;
-+
-+ case led_red_off:
-+ if (led_state & LED_STATE_CLAIMED)
-+ hw_led_state &= ~LED_RED;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ writel(0x03, GPIO_PEDDR);
-+
-+ if (led_state & LED_STATE_ENABLED)
-+ writel(hw_led_state, GPIO_PEDR);
-+
-+ local_irq_restore(flags);
-+}
-+
-+#endif
-+
-+static void __init zefeerdzq_init(void)
-+{
-+ /*
-+ physmap_configure(0x60000000, 0x01000000, 2, NULL);
-+ platform_device_register(&cfi_flash_device);
-+ */
-+
-+#ifdef CONFIG_LEDS
-+ leds_event = zefeerdzq_leds_event;
-+#endif
-+ leds_event(led_start);
-+}
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+#include "ep93xx_gpio_irq.h"
-+#endif
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+/* GPIO irq description
-+ * IRQs are set up in arch/arm/mach-ep93xx/irq.c
-+ * flags can be IRQT_RISING
-+ * IRQT_FALLING
-+ * IRQT_LOW
-+ * IRQT_HIGH
-+ * IRQT_PROBE
-+ *
-+ * On IRQT_PROBE nothing is done in setup irq code
-+ */
-+
-+/* For IRQ Demux */
-+
-+#define DISABLED 0
-+#define ENABLED 1
-+struct ep93xx_egpio_irq egpio_irqs[] __initdata =
-+{
-+ /* EGPIO IRQ 0 */
-+ { DISABLED , IRQT_PROBE },
-+ /* EGPIO IRQ 1 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 2 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 3 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 4 */
-+ { ENABLED, IRQT_LOW }, /* CAN 0 GPIO IRQ */
-+ /* EGPIO IRQ 5 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 6 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 7 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 8 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 9 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 10 */
-+ { ENABLED, IRQT_LOW }, /* CAN 1 GPIO IRQ */
-+ /* EGPIO IRQ 11 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 12 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 13 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 14 */
-+ { DISABLED, IRQT_PROBE },
-+ /* EGPIO IRQ 15 */
-+ { DISABLED, IRQT_PROBE },
-+};
-+#endif
-+
-+MACHINE_START(ZEFEERDZQ, "Zefeer DZQ")
-+ /* Maintainer: DAVE Srl <www.dave-tech.it> */
-+ .phys_ram = SDRAM_START,
-+ .phys_io = 0x80000000,
-+ .io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
-+ .boot_params = (SDRAM_START + 0x00000100),
-+
-+ .map_io = zefeerdzq_map_io,
-+ .init_irq = ep93xx_init_irq,
-+ .init_machine = zefeerdzq_init,
-+ .timer = &ep93xx_timer,
-+MACHINE_END
-diff --git a/arch/arm/mach-ep93xx/ssp-cirrus.c b/arch/arm/mach-ep93xx/ssp-cirrus.c
-new file mode 100644
-index 0000000..853c6c4
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/ssp-cirrus.c
-@@ -0,0 +1,646 @@
-+/*
-+ * FILE: ssp.c
-+ *
-+ * DESCRIPTION: SSP Interface Driver Module implementation
-+ *
-+ * Copyright Cirrus Logic Corporation, 2001-2003. All rights reserved
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License 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
-+ */
-+
-+/*
-+ * This driver provides a way to read and write devices on the SSP
-+ * interface.
-+ *
-+ * For Tx devices, EGPIO7 is used as an address pin:
-+ * I2S Codec CS4228 = EGPIO7 == 1
-+ * Serial Flash AT25F1024 = EGPIO7 == 0
-+ */
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/irq.h>
-+#include <asm/semaphore.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/ssp-cirrus.h>
-+
-+#undef DEBUG
-+/* #define DEBUG 1 */
-+#ifdef DEBUG
-+#define DPRINTK( x... ) printk( ##x )
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+#define EP93XX_KEY_TIMER_PERIOD_MSEC 20
-+
-+static int SSP_Open(enum SSPDeviceType Device, SSPDataCallback Callback);
-+static int SSP_Close(int Handle);
-+static int SSP_Read(int Handle, unsigned int Addr, unsigned int *pValue);
-+static int SSP_Write(int Handle, unsigned int Addr, unsigned int Value);
-+static int CheckHandle(int Handle);
-+
-+static void SetSSPtoPS2(void);
-+static void SetSSPtoI2S(void);
-+static int ReadIntoBuffer(void);
-+
-+static int SSP_Write_I2SCodec(int Handle, unsigned int RegAddr,
-+ unsigned int RegValue);
-+
-+/*
-+ * Key buffer...
-+ */
-+#define KEYBUF_SIZE 256
-+static unsigned int uiKeyBuffer[KEYBUF_SIZE];
-+
-+static spinlock_t ssp_spinlock = SPIN_LOCK_UNLOCKED;
-+
-+enum SSPmodes {
-+ SSP_MODE_UNKNOWN = 0,
-+ SSP_MODE_PS2,
-+ SSP_MODE_I2S,
-+ SSP_MODE_FLASH,
-+};
-+
-+static struct timer_list g_KbdTimer;
-+static enum SSPmodes gSSPmode = SSP_MODE_UNKNOWN;
-+static SSPDataCallback gKeyCallback = NULL;
-+static int gHookedInterrupt = 0;
-+
-+/*
-+ * Keep the last valid handle for SSP for kbd, i2s, and flash
-+ */
-+static int iLastValidHandle = -1;
-+static int KeyboardHandle = 0;
-+static int I2SHandle = 0;
-+static int FlashHandle = 0;
-+
-+#define SSP_DEVICE_MASK 0xf0000000
-+#define SSP_DEVICE_SHIFT 28
-+
-+SSP_DRIVER_API SSPinstance = {
-+ SSP_Open,
-+ SSP_Read,
-+ SSP_Write,
-+ SSP_Close,
-+};
-+
-+/*
-+ * The only instance of this driver.
-+ */
-+SSP_DRIVER_API *SSPDriver = &SSPinstance;
-+
-+/**
-+ * SSPIrqHandler - get all of the keys out of the SPI FIFO.
-+ */
-+irqreturn_t SSPIrqHandler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ /*
-+ * Get key codes from SSP and send them to the keyboard callback.
-+ */
-+ ReadIntoBuffer();
-+
-+ /*
-+ * Clear the interrupt.
-+ */
-+ writel(0, SSPIIR);
-+ return IRQ_HANDLED;
-+}
-+
-+/**
-+ * TimerRoutine
-+ *
-+ * This function is called periodically to make sure that no keys are stuck in
-+ * the SPI FIFO. This is necessary because the SPI only interrupts on half
-+ * full FIFO which can leave up to one keyboard event in the FIFO until another
-+ * key is pressed.
-+ */
-+static void TimerRoutine(unsigned long Data)
-+{
-+ int keycount;
-+
-+ /*
-+ * Get key codes from SSP and send them to the keyboard callback.
-+ */
-+ keycount = ReadIntoBuffer();
-+
-+ /*
-+ * If no keys were received, call the Data callback anyway so it can
-+ * check for stuck keys.
-+ */
-+ if ((keycount == 0) && gKeyCallback)
-+ gKeyCallback(-1);
-+
-+ /*
-+ * Reschedule our timer in another 20 mSec.
-+ */
-+ g_KbdTimer.expires =
-+ jiffies + MSECS_TO_JIFFIES(EP93XX_KEY_TIMER_PERIOD_MSEC);
-+ add_timer(&g_KbdTimer);
-+}
-+
-+/**
-+ * HookInterrupt
-+ *
-+ * Requests SSP interrupt, sets up interrupt handler, sets up keyboard polling
-+ * timer.
-+ */
-+static int HookInterrupt(void)
-+{
-+ if (gHookedInterrupt) {
-+ printk(KERN_ERR "SSP driver interrupt already hooked\n");
-+ return -1;
-+ }
-+
-+ if (request_irq
-+ (IRQ_SSPRX, SSPIrqHandler, SA_INTERRUPT, "ep93xxsspd", NULL)) {
-+ printk(KERN_ERR "SSP driver failed to get IRQ handler\n");
-+ return -1;
-+ }
-+
-+ gHookedInterrupt = 1;
-+
-+ /*
-+ * Initialize the timer that we will use to poll the SPI.
-+ */
-+ init_timer(&g_KbdTimer);
-+ g_KbdTimer.function = TimerRoutine;
-+ g_KbdTimer.data = 1;
-+ g_KbdTimer.expires =
-+ jiffies + MSECS_TO_JIFFIES(EP93XX_KEY_TIMER_PERIOD_MSEC);
-+
-+ add_timer(&g_KbdTimer);
-+
-+ return 0;
-+}
-+
-+static int SSP_Open(enum SSPDeviceType Device, SSPDataCallback Callback)
-+{
-+ int Handle;
-+
-+ /*
-+ * Generate a handle and pass it back.
-+ *
-+ * Increment the last valid handle.
-+ * Check for wraparound (unlikely, but we like to be complete).
-+ */
-+ iLastValidHandle++;
-+
-+ /*
-+ * If we wrapped around start over. Unlikely.
-+ */
-+ if ((iLastValidHandle & ~SSP_DEVICE_MASK) == 0)
-+ iLastValidHandle = 1;
-+
-+ Handle = iLastValidHandle | (Device << SSP_DEVICE_SHIFT);
-+
-+ switch (Device) {
-+ case PS2_KEYBOARD:
-+ {
-+ DPRINTK("SSP_Open - PS2_KEYBOARD\n");
-+ if (KeyboardHandle)
-+ return -1;
-+
-+ DPRINTK("Handle:%08x Callback:%08x -- Success\n",
-+ Handle, (unsigned int)Callback);
-+
-+ KeyboardHandle = Handle;
-+ /* Hook the interrupt if we have not yet. */
-+ HookInterrupt();
-+ SetSSPtoPS2();
-+ gKeyCallback = Callback;
-+
-+ break;
-+ }
-+ case I2S_CODEC:
-+ {
-+ DPRINTK("SSP_Open - I2S_CODEC\n");
-+ if (I2SHandle)
-+ return -1;
-+
-+ DPRINTK("Handle:%08x Callback:%08x -- Success\n",
-+ Handle, (unsigned int)Callback);
-+
-+ I2SHandle = Handle;
-+ break;
-+ }
-+ case SERIAL_FLASH:
-+ {
-+ DPRINTK("SSP_Open - SERIAL_FLASH\n");
-+ if (FlashHandle)
-+ return -1;
-+
-+ DPRINTK("Handle:%08x Callback:%08x -- Success\n",
-+ Handle, (unsigned int)Callback);
-+
-+ FlashHandle = Handle;
-+ break;
-+ }
-+ default:
-+ {
-+ return -1;
-+ }
-+ }
-+
-+ return Handle;
-+}
-+
-+/**
-+ * SSP_Close
-+ *
-+ * Release that Handle!
-+ */
-+static int SSP_Close(int Handle)
-+{
-+ /*
-+ * Find out which device this API was called for.
-+ */
-+ switch (CheckHandle(Handle)) {
-+ case PS2_KEYBOARD:
-+ {
-+ DPRINTK("SSP_Open - PS2_KEYBOARD\n");
-+ del_timer(&g_KbdTimer);
-+ free_irq(IRQ_SSPRX, NULL);
-+ gKeyCallback = NULL;
-+ KeyboardHandle = 0;
-+ gHookedInterrupt = 0;
-+ break;
-+ }
-+ case I2S_CODEC:
-+ {
-+ DPRINTK("SSP_Open - I2S_CODEC\n");
-+ I2SHandle = 0;
-+ break;
-+ }
-+ case SERIAL_FLASH:
-+ {
-+ DPRINTK("SSP_Open - SERIAL_FLASH\n");
-+ FlashHandle = 0;
-+ break;
-+ }
-+ default:
-+ {
-+ return -1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+static int SSP_Read(int Handle, unsigned int Addr, unsigned int *pValue)
-+{
-+ DPRINTK("SSP_Read\n");
-+ return 0;
-+}
-+
-+static int SSP_Write(int Handle, unsigned int Addr, unsigned int Value)
-+{
-+ int iRet = 0;
-+ /* DPRINTK("SSP_Write - Handle:0x%08x Addr:0x%08x Value:0x%08x\n",
-+ Handle, Addr, Value ); */
-+
-+ /*
-+ * Find out which device this API was called for.
-+ */
-+ switch (CheckHandle(Handle)) {
-+ case PS2_KEYBOARD:
-+ {
-+ break;
-+ }
-+ case I2S_CODEC:
-+ {
-+ iRet = SSP_Write_I2SCodec(Handle, Addr, Value);
-+ break;
-+ }
-+ case SERIAL_FLASH:
-+ {
-+ break;
-+ }
-+ default:
-+ {
-+ return -1;
-+ }
-+ }
-+
-+ return iRet;
-+}
-+
-+static void SetSSPtoPS2(void)
-+{
-+ unsigned int uiRegTemp;
-+
-+ if (gSSPmode == SSP_MODE_PS2)
-+ return;
-+
-+ /*
-+ * Disable the SSP, disable interrupts
-+ */
-+ writel(0, SSPCR1);
-+
-+ /*
-+ * It takes almost a millisecond for a key to come in so
-+ * make sure we have completed all transactions.
-+ */
-+ mdelay(1);
-+
-+ /*
-+ * Set EGPIO7 to disable EEPROM device on EDB9312.
-+ */
-+ uiRegTemp = readl(GPIO_PADDR);
-+ writel(uiRegTemp | 0x80, GPIO_PADDR);
-+
-+ uiRegTemp = readl(GPIO_PADR);
-+ writel(uiRegTemp | 0x80, GPIO_PADR);
-+
-+ /*
-+ * Still haven't enabled the keyboard. So anything in
-+ * the rx fifo is garbage. Time to take out the trash.
-+ */
-+ while (readl(SSPSR) & SSPSR_RNE) {
-+ uiRegTemp = readl(SSPDR);
-+ }
-+
-+ /*
-+ * SPICR0_SPO - SCLKOUT Polarity
-+ * SPICR0_SPH - SCLKOUT Phase
-+ * Motorola format, 11 bit, one start, 8 data, one bit for
-+ * parity, one stop bit.
-+ */
-+ writel((SSPCR0_FRF_MOTOROLA | SSPCR0_SPH | SSPCR0_SPO |
-+ SSPCR0_DSS_11BIT), SSPCR0);
-+ /*
-+ * Configure the device as a slave, Clear FIFO overrun interrupts,
-+ * enable interrupts and reset the device.
-+ */
-+ writel((SSPC1_MS | SSPC1_RIE | SSPC1_SOD), SSPCR1);
-+ writel(0, SSPIIR);
-+ writel((SSPC1_MS | SSPC1_RIE | SSPC1_SOD | SSPC1_SSE),
-+ SSPCR1);
-+
-+ /*
-+ * Configure EGPIO pins 12 and 14 as outputs because they are used
-+ * as buffer enables for the SPI interface to the ps2 keyboard.
-+ * Clear EGPIO pins 12 and 14, this will enable the SPI keyboard.
-+ */
-+ uiRegTemp = readl(GPIO_PBDDR);
-+ writel(uiRegTemp | 0x50, GPIO_PBDDR);
-+
-+ uiRegTemp = readl(GPIO_PBDR);
-+ writel(uiRegTemp & ~0x50, GPIO_PBDR);
-+
-+ gSSPmode = SSP_MODE_PS2;
-+}
-+
-+static void SetSSPtoI2S(void)
-+{
-+ unsigned int uiRegTemp;
-+
-+ if (gSSPmode == SSP_MODE_I2S)
-+ return;
-+
-+ /*
-+ * Disable recieve interrupts.
-+ */
-+ writel((SSPC1_MS | SSPC1_SSE), SSPCR1);
-+
-+ /*
-+ * Set GPIO pins 12 and 14, this will bring the clock line low
-+ * which signals to the keyboard to buffer keystrokes.
-+ * Note that EGPIO 14 is the clock line and EGPIO 12 is data line.
-+ */
-+ uiRegTemp = readl(GPIO_PBDR);
-+ writel(0x50 | uiRegTemp, GPIO_PBDR);
-+
-+ /*
-+ * It takes almost a millisecond for an partial keystrokes to come in.
-+ * Delay to make sure we have completed all transactions.
-+ */
-+ mdelay(1);
-+
-+ /*
-+ * Anything we just recieved is garbage. Time to take out the trash.
-+ */
-+ while (readl(SSPSR) & SSPSR_RNE) {
-+ uiRegTemp = readl(SSPDR);
-+ }
-+
-+ /*
-+ * Disable the SSP and disable interrupts
-+ */
-+ writel(0, SSPCR1);
-+
-+ /*
-+ * Clock will be 14.7 MHz divided by 4.
-+ */
-+ writel(2, SSPCPSR);
-+
-+ /*
-+ * Configure EGPIO7 as an output and set it. This selects
-+ * I2S codec as the device on the SSP output instead of
-+ * the serial flash.
-+ */
-+ uiRegTemp = readl(GPIO_PADDR);
-+ writel(uiRegTemp | 0x80, GPIO_PADDR);
-+
-+ uiRegTemp = readl(GPIO_PADR);
-+ writel(uiRegTemp | 0x80, GPIO_PADR);
-+
-+ /*
-+ * Motorola format, 8 bit.
-+ */
-+ writel((SSPCR0_SPO | SSPCR0_SPH | SSPCR0_FRF_MOTOROLA |
-+ SSPCR0_DSS_8BIT), SSPCR0);
-+
-+ /*
-+ * Configure the device as master, reenable the device.
-+ */
-+ writel(SSPC1_SSE, SSPCR1);
-+
-+ gSSPmode = SSP_MODE_I2S;
-+
-+ udelay(10);
-+}
-+
-+/**
-+ * CheckHandle
-+ *
-+ * If Handle is valid, returns 0. Otherwise it returns -1.
-+ */
-+static int CheckHandle(int Handle)
-+{
-+ int iRet;
-+
-+ if ((Handle != KeyboardHandle) &&
-+ (Handle != I2SHandle) && (Handle != FlashHandle)) {
-+ DPRINTK("OOPS! Invalid SSP Handle!\n");
-+ return -1;
-+ }
-+
-+ /*
-+ * Get the SSP driver instance number from the handle.
-+ */
-+ iRet = (((int)Handle & SSP_DEVICE_MASK) >> SSP_DEVICE_SHIFT);
-+
-+#if 0
-+ switch (iRet) {
-+ case PS2_KEYBOARD:
-+ DPRINTK("CheckHandle - valid - Keyboard\n");
-+ break;
-+
-+ case I2S_CODEC:
-+ DPRINTK("CheckHandle - valid - I2S\n");
-+ break;
-+
-+ case SERIAL_FLASH:
-+ DPRINTK("CheckHandle - valid - Keyboard\n");
-+ break;
-+ }
-+#endif
-+
-+ return iRet;
-+}
-+
-+/**
-+ * ReadIntoBuffer
-+ *
-+ * Drains the SSP rx fifo into a buffer here. If we overflow this buffer
-+ * then something's wrong.
-+ */
-+static int ReadIntoBuffer(void)
-+{
-+ unsigned int count, index, saved_count, uiRegTemp;
-+
-+ count = 0;
-+ index = 0;
-+
-+ if (gSSPmode != SSP_MODE_PS2)
-+ return 0;
-+
-+ /*
-+ * This spinlock will prevent I2S from grabbing the SSP to do a
-+ * write while we are using the SSP for PS2.
-+ *
-+ * There is a slight chance that we are in the beginning phase
-+ * of doing an I2S write but the mode flag hadn't yet switched
-+ * to I2S. If that happens we will end up waiting on I2S to
-+ * finish a write. Not great.
-+ */
-+ spin_lock(&ssp_spinlock);
-+
-+ while (readl(SSPSR) & SSPSR_RNE) {
-+ /*
-+ * Read in the value from the SPI controller into
-+ * the partial key buffer.
-+ */
-+ uiKeyBuffer[count] = readl(SSPDR);
-+ if (((uiKeyBuffer[count] & 0x3fc) != 0x3e0) &&
-+ ((uiKeyBuffer[count] & 0x3fc) != 0x3c0)) {
-+ /*
-+ * Set GPIO pins 12 and 14, this will bring the clock line low
-+ * which signals to the keyboard to buffer keystrokes.
-+ * Note that EGPIO 14 is the clock line and EGPIO 12 is data line.
-+ */
-+ uiRegTemp = readl(GPIO_PBDR);
-+ writel(0x50 | uiRegTemp, GPIO_PBDR);
-+
-+ writel(0, SSPCR1);
-+ writel((SSPC1_MS | SSPC1_RIE | SSPC1_SSE),
-+ SSPCR1);
-+
-+ /*
-+ * Clear EGPIO pins 12 and 14, this will enable the SPI keyboard.
-+ */
-+ uiRegTemp = readl(GPIO_PBDR);
-+ writel(uiRegTemp & ~0x50, GPIO_PBDR);
-+
-+ count++;
-+ break;
-+ }
-+ count++;
-+ }
-+
-+ saved_count = count;
-+ index = 0;
-+ while (count) {
-+ /*
-+ * No callback, dump data.
-+ */
-+ if (gKeyCallback)
-+ gKeyCallback(uiKeyBuffer[index++]);
-+
-+ count--;
-+ }
-+
-+ spin_unlock(&ssp_spinlock);
-+
-+ return saved_count;
-+}
-+
-+/**
-+ * SSP_Write_I2SCodec
-+ *
-+ */
-+static int SSP_Write_I2SCodec
-+ (int Handle, unsigned int RegAddr, unsigned int RegValue) {
-+ enum SSPmodes saved_mode;
-+
-+ DPRINTK("SSP_Write_I2SCodec\n");
-+
-+ spin_lock(&ssp_spinlock);
-+
-+ /*
-+ * Save the SSP mode. Switch to I2S mode if we're not
-+ * already in I2S mode.
-+ */
-+ saved_mode = gSSPmode;
-+ SetSSPtoI2S();
-+
-+ /*
-+ * Let TX fifo clear out. Poll the Transmit Fifo Empty bit.
-+ */
-+ while (!(readl(SSPSR) & SSPSR_TFE)) ;
-+
-+ /*
-+ * Write the data out to the tx fifo.
-+ */
-+ writel(0x20, SSPDR); /* chip address for CS4228 */
-+ writel((RegAddr & 0xff), SSPDR);
-+ writel((RegValue & 0xff), SSPDR);
-+
-+ /*
-+ * Let TX fifo clear out. Poll the Transmit Fifo Empty bit.
-+ */
-+ while (!(readl(SSPSR) & SSPSR_TFE)) ;
-+
-+ /*
-+ * Delay to let stuff make it out of the SR before doing
-+ * anthing else to the SSP. It takes 6.8 uSec to do a
-+ * I2S codec register write.
-+ */
-+ udelay(10);
-+
-+ /*
-+ * If we were in PS2 mode, switch back to PS2 mode.
-+ * If we weren't in PS2 mode, that means we didn't compile in
-+ * the PS2 keyboard support, so no need to switch to PS2 mode.
-+ */
-+ if (saved_mode == SSP_MODE_PS2)
-+ SetSSPtoPS2();
-+
-+ spin_unlock(&ssp_spinlock);
-+
-+ return 0;
-+}
-diff --git a/arch/arm/mach-ep93xx/ssp.c b/arch/arm/mach-ep93xx/ssp.c
-new file mode 100644
-index 0000000..4e1b973
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/ssp.c
-@@ -0,0 +1,246 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/ssp.c
-+ *
-+ * Generic SSP driver. This provides shared access to the SSP
-+ * interface operating in master mode.
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi.
-+ * Copyright (C) 2004 Siconix, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+
-+#include <asm/arch/ssp.h>
-+
-+/* ================================================================
-+ Front End Interface
-+ ================================================================ */
-+
-+/***
-+ * ssp_add_slave - register an ssp_slave with an ssp_master
-+ * @m: the master
-+ * @s: the slave
-+ *
-+ * Grabs the frontend lock and adds slave to list.
-+ */
-+int ssp_add_slave(struct ssp_master *m, struct ssp_slave *s)
-+{
-+ if (s->master != NULL)
-+ return -EBUSY;
-+ down(&m->sem);
-+ list_add(&s->list, &m->slave);
-+ s->master = m;
-+ up(&m->sem);
-+ return 0;
-+}
-+
-+EXPORT_SYMBOL(ssp_add_slave);
-+
-+/***
-+ * ssp_remove_slave - de-register an ssp_slave from its master
-+ * @m: the master
-+ * @s: the slave
-+ *
-+ * Grabs the frontend lock and removes slave from list.
-+ */
-+void ssp_remove_slave(struct ssp_master *m, struct ssp_slave *s)
-+{
-+ if (s->master != m)
-+ return;
-+ down(&m->sem);
-+ list_del(&s->list);
-+ s->master = NULL;
-+ up(&m->sem);
-+}
-+
-+EXPORT_SYMBOL(ssp_remove_slave);
-+
-+/***
-+ * ssp_do - perform a single SSP transaction on the slave
-+ * @s: the slave
-+ * @len: the number of words to transfer
-+ * @tx: a buffer of @len words to clock out to slave
-+ * @rx: a buffer of @len words to clock in from slave
-+ *
-+ * Grabs the frontend lock, configures the ssp master as required
-+ * by the slave, asserts the slave devices chip select line, and
-+ * schedules the backend to perform the transfer.
-+ *
-+ * Once the backend signals completion, the chip select is negated
-+ * and the frontend lock is released.
-+ *
-+ * The backend will transfer @len * @s->nbytes from @tx and
-+ * into @rx. Make sure your buffers are big enough! If @tx
-+ * or @rx are null, then null data will be clocked in and/or out.
-+ */
-+int ssp_do(struct ssp_slave *s, int len, void *tx, void *rx)
-+{
-+ int err;
-+
-+ if ((err = ssp_start(s)) < 0)
-+ goto out1;
-+
-+ ssp_select(s);
-+
-+ if ((err = ssp_post(s, len, tx, rx)) < 0)
-+ goto out2;
-+
-+ err = ssp_wait(s);
-+
-+ out2:
-+ ssp_deselect(s);
-+ ssp_finish(s);
-+ out1:
-+ return err;
-+}
-+
-+EXPORT_SYMBOL(ssp_do);
-+
-+/* ================================================================
-+ Transaction Interface
-+ ================================================================ */
-+
-+static int __ssp_txn_start(struct ssp_slave *s);
-+
-+/***
-+ * ssp_start - Grab and configure the SSP bus (blocking)
-+ * @s: the slave
-+ *
-+ * This call will grab and initialize the SSP bus, blocking
-+ * until the bus is ready.
-+ */
-+int ssp_start(struct ssp_slave *s)
-+{
-+ down(&s->master->sem);
-+ return __ssp_txn_start(s);
-+}
-+
-+EXPORT_SYMBOL(ssp_start);
-+
-+/***
-+ * ssp_trystart - Grab and configure the SSP bus (non-blocking)
-+ * @s: the slave
-+ *
-+ * This call will grab and initialize the SSP bus, returning
-+ * with an error if the bus is not free.
-+ */
-+int ssp_trystart(struct ssp_slave *s)
-+{
-+ if (!down_trylock(&s->master->sem))
-+ return -EBUSY;
-+ return __ssp_txn_start(s);
-+}
-+
-+EXPORT_SYMBOL(ssp_trystart);
-+
-+static int __ssp_txn_start(struct ssp_slave *s)
-+{
-+ return s->master->ops->configure(s);
-+}
-+
-+/***
-+ * ssp_select - assert the slave CS line
-+ * @s: the slave
-+ *
-+ * assert the device-specific CS line
-+ */
-+void ssp_select(struct ssp_slave *s)
-+{
-+ s->chip_select(s, 1);
-+}
-+
-+EXPORT_SYMBOL(ssp_select);
-+
-+/***
-+ * ssp_post - start the backend for the slave's master
-+ * @s: the slave
-+ *
-+ * Start the backend data transfer for this master.
-+ */
-+int ssp_post(struct ssp_slave *s, int len, void *tx, void *rx)
-+{
-+ struct ssp_transfer *t;
-+
-+ t = &s->master->transfer;
-+
-+ t->size = s->nbytes;
-+ t->len = len;
-+ t->rlen = len;
-+ t->tx = tx;
-+ t->rx = rx;
-+ t->c = &s->master->completion;
-+ init_completion(t->c);
-+
-+ return s->master->ops->enable(t);
-+}
-+
-+EXPORT_SYMBOL(ssp_post);
-+
-+/***
-+ * ssp_wait - block until the SP transfer is complete
-+ * @s: the slave
-+ *
-+ * block until the SP transfer is complete.
-+ */
-+int ssp_wait(struct ssp_slave *s)
-+{
-+ wait_for_completion(&s->master->completion);
-+ return s->master->ops->disable();
-+}
-+
-+EXPORT_SYMBOL(ssp_wait);
-+
-+/***
-+ * ssp_deselect - assert the slave CS line
-+ * @s: the slave
-+ *
-+ * negate the device-specific CS line
-+ */
-+void ssp_deselect(struct ssp_slave *s)
-+{
-+ s->chip_select(s, 0);
-+}
-+
-+EXPORT_SYMBOL(ssp_deselect);
-+
-+/***
-+ * ssp_finish - release the ssp bus
-+ * @s: the slave
-+ *
-+ * Releases the frontend lock.
-+ */
-+void ssp_finish(struct ssp_slave *s)
-+{
-+ up(&s->master->sem);
-+}
-+
-+EXPORT_SYMBOL(ssp_finish);
-+
-+/* ================================================================
-+ Module Stuff
-+ ================================================================ */
-+
-+int __init ssp_init(void)
-+{
-+ printk(KERN_INFO "Generic SSP Support version 0.1\n");
-+ return 0;
-+}
-+
-+void __exit ssp_exit(void)
-+{
-+}
-+
-+module_init(ssp_init);
-+module_exit(ssp_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi");
-+MODULE_DESCRIPTION("Generic SSP driver");
-+MODULE_LICENSE("GPL");
-diff --git a/arch/arm/mach-ep93xx/ssp2.c b/arch/arm/mach-ep93xx/ssp2.c
-new file mode 100644
-index 0000000..6a4ff10
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/ssp2.c
-@@ -0,0 +1,354 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/ssp.c
-+ *
-+ * EP93xx SSP driver. This provides shared access to the SSP
-+ * interface operating in master mode.
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi.
-+ * Copyright (C) 2004 Siconix, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <linux/spinlock.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/hardware.h>
-+
-+#include <asm/arch/ssp.h>
-+#include <asm/arch/ssp2.h>
-+
-+/* print out all chars tx, rx, and dropped */
-+#define _(x...) /* printk(KERN_WARNING x); printk("\n") */
-+
-+/* the current transfer */
-+static struct ssp_transfer *transfer;
-+
-+/* stupid SSP gives rx int only when rx fifo > half full :-P */
-+static void do_rx_poll(void *x);
-+static DECLARE_WORK(work, do_rx_poll, NULL);
-+
-+/* also implement a timeout in the worker, to prevent hard lockups
-+ if something goes south... */
-+static int timeout;
-+
-+/* serialize the rx irq and the work poller routines */
-+static spinlock_t spinlock = SPIN_LOCK_UNLOCKED;
-+
-+/* ----------------- Hardware Control --------------------- */
-+
-+/* send a word */
-+static __inline__ void x_ssp_send(__u16 dat)
-+{
-+ writel(dat, SSPDR);
-+ _("\ttx %08x", dat);
-+}
-+
-+/* send a word to clock the recv */
-+static __inline__ void x_ssp_clock(void)
-+{
-+ writel(0, SSPDR);
-+ _("\tt- --------");
-+}
-+
-+/* recv a word */
-+static __inline__ __u16 x_ssp_recv(void)
-+{
-+ unsigned long dat = readl(SSPDR);
-+ _("\trx %08lx", dat);
-+ return dat & 0xffff;
-+}
-+
-+/* discard a word */
-+static __inline__ void x_ssp_discard(void)
-+{
-+#if 1
-+ unsigned long dat = readl(SSPDR);
-+ _("\tr- %08lx (discard)", dat);
-+#else
-+ (void)readl(SSPDR);
-+ _("\tr- --------");
-+#endif
-+}
-+
-+/* are there chars in the rx fifo? */
-+static __inline__ int x_ssp_available(void)
-+{
-+ return (readl(SSPSR) & SSPSR_RNE) ? 1 : 0;
-+}
-+
-+/* is there room in the tx fifo? */
-+static __inline__ int x_ssp_has_room(void)
-+{
-+ return (readl(SSPSR) & SSPSR_TNF) ? 1 : 0;
-+}
-+
-+/* is the transmitter busy? */
-+static __inline__ int x_ssp_busy(void)
-+{
-+ return (readl(SSPSR) & SSPSR_BSY) ? 1 : 0;
-+}
-+
-+/* flush the RX and TX fifos */
-+static void x_ssp_flush(void)
-+{
-+ do {
-+ while (x_ssp_available())
-+ x_ssp_discard();
-+ } while (x_ssp_busy());
-+
-+ /* just in case there is a race... in any event, this should be harmless */
-+ x_ssp_discard();
-+}
-+
-+/* set up all regs as required by the slave */
-+static void x_ssp_configure(struct ep93xx_ssp_slave *s)
-+{
-+ writel(s->cr1, SSPCR1);
-+ writel(s->cr0, SSPCR0);
-+ writel(s->cpsr, SSPCPSR);
-+ writel(s->cr1 & ~SSPC1_SSE, SSPCR1);
-+ writel(s->cr1, SSPCR1);
-+}
-+
-+/* enable chip select and all ints */
-+static __inline__ void x_ssp_enable(void)
-+{
-+ unsigned long x = readl(SSPCR1);
-+ writel(x | SSPC1_TIE | SSPC1_RIE | SSPC1_RORIE, SSPCR1);
-+}
-+
-+/* disable chip select and all ints */
-+static __inline__ void x_ssp_disable(void)
-+{
-+ unsigned long x = readl(SSPCR1);
-+ writel(x & ~(SSPC1_TIE | SSPC1_RIE | SSPC1_RORIE), SSPCR1);
-+}
-+
-+/* disable tx int */
-+static __inline__ void x_ssp_stop_tx(void)
-+{
-+ unsigned long x = readl(SSPCR1);
-+ writel(x & ~SSPC1_TIE, SSPCR1);
-+}
-+
-+/* ---------------------- Master Methods ------------------------- */
-+
-+static int ep93xx_ssp_configure(struct ssp_slave *ss)
-+{
-+ struct ep93xx_ssp_slave *s = (struct ep93xx_ssp_slave *)ss;
-+ _("SSP transfer");
-+ x_ssp_configure(s);
-+ return 0;
-+}
-+
-+static int ep93xx_ssp_enable(struct ssp_transfer *t)
-+{
-+ _("{");
-+ transfer = t;
-+ timeout = 0;
-+ schedule_delayed_work(&work, 1);
-+ x_ssp_enable();
-+ return 0;
-+}
-+
-+static int ep93xx_ssp_disable(void)
-+{
-+ x_ssp_disable();
-+ cancel_delayed_work(&work);
-+ transfer = NULL;
-+ _("}");
-+ return 0;
-+}
-+
-+static struct ssp_master_ops my_ops = {
-+ .configure = ep93xx_ssp_configure,
-+ .enable = ep93xx_ssp_enable,
-+ .disable = ep93xx_ssp_disable,
-+};
-+
-+/* ----------------- Registration Stuff FIXME ------------- */
-+
-+#include <linux/completion.h>
-+#include <asm/types.h>
-+#include <asm/semaphore.h>
-+
-+struct ssp_master ep93xx_ssp_master = {
-+ __MUTEX_INITIALIZER(ep93xx_ssp_master.sem),
-+ COMPLETION_INITIALIZER(ep93xx_ssp_master.completion),
-+ LIST_HEAD_INIT(ep93xx_ssp_master.slave),
-+ {
-+ 0,
-+ 0,
-+ 0,
-+ NULL,
-+ NULL,
-+ NULL},
-+ &my_ops
-+};
-+
-+EXPORT_SYMBOL(ep93xx_ssp_master);
-+
-+/* -------------------- Bottom Half ----------------------- */
-+
-+static void do_tx(void)
-+{
-+ if (transfer == NULL) {
-+ printk(KERN_WARNING "Null tx transfer...\n");
-+ return;
-+ }
-+
-+ while (transfer->len != 0) {
-+
-+ if (!x_ssp_has_room())
-+ return;
-+
-+ if (transfer->tx == NULL) {
-+ x_ssp_clock();
-+
-+ } else if (transfer->size == 1) {
-+ __u8 *t = transfer->tx;
-+ x_ssp_send(*t);
-+ transfer->tx += 1;
-+
-+ } else if (transfer->size == 2) {
-+ __u16 *t = transfer->tx;
-+ x_ssp_send(*t);
-+ transfer->tx += 2;
-+
-+ } else if (transfer->size == 4) {
-+ __u32 *t = transfer->tx;
-+ x_ssp_send(*t);
-+ transfer->tx += 4;
-+ }
-+
-+ transfer->len--;
-+ }
-+
-+ x_ssp_stop_tx();
-+}
-+
-+static void __do_rx(void)
-+{
-+ if (transfer == NULL) {
-+ printk(KERN_WARNING "Null rx transfer...\n");
-+ return;
-+ }
-+
-+ while (transfer->rlen != 0) {
-+
-+ if (!x_ssp_available())
-+ return;
-+
-+ if (transfer->rx == NULL) {
-+ x_ssp_discard();
-+
-+ } else if (transfer->size == 1) {
-+ __u8 *t = transfer->rx;
-+ *t = x_ssp_recv();
-+ transfer->rx += 1;
-+
-+ } else if (transfer->size == 2) {
-+ __u16 *t = transfer->rx;
-+ *t = x_ssp_recv();
-+ transfer->rx += 2;
-+
-+ } else if (transfer->size == 4) {
-+ __u32 *t = transfer->rx;
-+ *t = x_ssp_recv();
-+ transfer->rx += 4;
-+ }
-+
-+ transfer->rlen--;
-+ timeout = 0;
-+ }
-+
-+ complete(transfer->c);
-+}
-+
-+static void do_rx(void)
-+{
-+ unsigned long flags;
-+ spin_lock_irqsave(&spinlock, flags);
-+ __do_rx();
-+ spin_unlock_irqrestore(&spinlock, flags);
-+}
-+
-+static void do_rx_poll(void *x)
-+{
-+ unsigned long flags;
-+ spin_lock_irqsave(&spinlock, flags);
-+ __do_rx();
-+ timeout++;
-+ if (timeout == 100) {
-+ x_ssp_disable();
-+ complete(transfer->c);
-+ } else {
-+ schedule_delayed_work(&work, 1);
-+ }
-+ spin_unlock_irqrestore(&spinlock, flags);
-+}
-+
-+static irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ unsigned int status = readl(SSPIIR);
-+
-+ if (transfer == NULL) {
-+ printk(KERN_WARNING "SSP: no active transfer\n");
-+ x_ssp_flush();
-+ x_ssp_disable();
-+ }
-+
-+ if (status & SSPIIR_RORIS)
-+ printk(KERN_WARNING "SSP: receiver overrun\n");
-+
-+ if (status & SSPIIR_TIS)
-+ do_tx();
-+
-+ if (status & SSPIIR_RIS)
-+ do_rx();
-+
-+ writel(0, SSPICR);
-+
-+ return status ? IRQ_HANDLED : IRQ_NONE;
-+}
-+
-+/* -------------------- Module Stuff ---------------------- */
-+
-+int __init ep93xx_ssp_init(void)
-+{
-+ int i;
-+
-+ if (readl(SYSCON_DEVCFG) & SYSCON_DEVCFG_I2SonSSP)
-+ return -ENODEV;
-+
-+ i = request_irq(IRQ_SSP, irq_handler, 0, "SSP", NULL);
-+
-+ if (i)
-+ printk(KERN_ERR
-+ "EP93XX: unable to grab SSP interrupt, error %d\n", i);
-+
-+ printk(KERN_INFO "EP93xx SSP driver version 0.1\n");
-+ return 0;
-+}
-+
-+void __exit ep93xx_ssp_exit(void)
-+{
-+ free_irq(IRQ_SSP, NULL);
-+}
-+
-+module_init(ep93xx_ssp_init);
-+module_exit(ep93xx_ssp_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi");
-+MODULE_DESCRIPTION("EP93xx SSP driver");
-+MODULE_LICENSE("GPL");
-diff --git a/arch/arm/mach-ep93xx/time.c b/arch/arm/mach-ep93xx/time.c
-new file mode 100644
-index 0000000..459a179
---- /dev/null
-+++ b/arch/arm/mach-ep93xx/time.c
-@@ -0,0 +1,40 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/time.c
-+ *
-+ * Copyright (C) 2000-2001 Deep Blue Solutions
-+ *
-+ * (c) Copyright 2001 LynuxWorks, Inc., San Jose, CA. All rights reserved.
-+ * Copyright (C) 2002-2003 Cirrus Logic, Inc.
-+ *
-+ * 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/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/init.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+
-+extern int (*set_rtc) (void);
-+
-+static int ep93xx_set_rtc(void)
-+{
-+ writel(xtime.tv_sec, RTCLR);
-+ return 1;
-+}
-+
-+static int ep93xx_rtc_init(void)
-+{
-+ writel(0, RTCCR);
-+ writel(0, RTCEOI);
-+
-+ writel(xtime.tv_sec, RTCDR);
-+
-+ set_rtc = ep93xx_set_rtc;
-+
-+ return 0;
-+}
-+
-+__initcall(ep93xx_rtc_init);
-diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
-index e84fdde..85c90bf 100644
---- a/arch/arm/mm/Kconfig
-+++ b/arch/arm/mm/Kconfig
-@@ -62,8 +62,8 @@ config CPU_ARM720T
- # ARM920T
- config CPU_ARM920T
- bool "Support ARM920T processor" if !ARCH_S3C2410
-- depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000
-- default y if ARCH_S3C2410
-+ depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX || ARCH_AAEC2000 || ARCH_EP93XX
-+ default y if ARCH_S3C2410 || ARCH_EP93XX
- select CPU_32v4
- select CPU_ABRT_EV4T
- select CPU_CACHE_V4WT
-diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
-index 8b276ee..cc8aedb 100644
---- a/arch/arm/mm/init.c
-+++ b/arch/arm/mm/init.c
-@@ -212,6 +212,10 @@ static __init void reserve_node_zero(pg_
- if (machine_is_integrator() || machine_is_cintegrator())
- res_size = __pa(swapper_pg_dir) - PHYS_OFFSET;
-
-+ /* TBD vector table and initial stack below pg_dir */
-+ if (machine_is_edb9301() || machine_is_edb9312() || machine_is_edb9315() || machine_is_acc())
-+ res_size = __pa(swapper_pg_dir) - PHYS_OFFSET;
-+
- /*
- * These should likewise go elsewhere. They pre-reserve the
- * screen memory region at the start of main system memory.
-diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
-index 84e68cd..c4a267b 100644
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -4,6 +4,16 @@
-
- menu "Character devices"
-
-+config TTML_DEVICES
-+ tristate "TTML TripDawg system devices"
-+ depends on MACH_TTML
-+ default m
-+ ---help---
-+ If you say y or m here, you will get several character devices
-+ which allow you to use the LEDs, buzzer, speedometer, and so
-+ on. These devices are mapped into the 10,{240-254} range, which
-+ is reserved for local devices.
-+
- config VT
- bool "Virtual terminal" if EMBEDDED
- select INPUT
-@@ -762,6 +772,26 @@ config EFI_RTC
- bool "EFI Real Time Clock Services"
- depends on IA64
-
-+config EP93XX_RTC
-+ bool "Cirrus EP93xx Real Time Clock support"
-+ depends on ARCH_EP93XX
-+ help
-+ Provides EFI and legacy RTC support on the Cirrus EP93xx family of
-+ devices via the /dev/rtc character node (10/135).
-+
-+config DS1337_RTC
-+ tristate "Dallas Semiconductor DS1337 Real Time Clock /dev/rtc interface"
-+ depends on I2C && EXPERIMENTAL && !EP93XX_RTC
-+ select SENSORS_DS1337
-+ help
-+ Say Y here you have got a DS1337 real time clock on your I2C bus.
-+ This here is just an interface to access it via the /dev/rtc
-+ character node (10/135). All the hard work will be done
-+ in the I2C driver (drivers/i2c/chips/ds1337.c).
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called ds1337glue.
-+
- config DS1302
- tristate "DS1302 RTC support"
- depends on M32R && (PLAT_M32700UT || PLAT_OPSPUT)
-@@ -893,6 +923,8 @@ source "drivers/char/drm/Kconfig"
-
- source "drivers/char/pcmcia/Kconfig"
-
-+source "drivers/char/can/Kconfig"
-+
- config MWAVE
- tristate "ACP Modem (Mwave) support"
- depends on X86
-diff --git a/drivers/char/Makefile b/drivers/char/Makefile
-index 4aeae68..579570d 100644
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -9,6 +9,7 @@ FONTMAPFILE = cp437.uni
-
- obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o
-
-+obj-$(CONFIG_TTML_DEVICES) += ttml.o
- obj-$(CONFIG_LEGACY_PTYS) += pty.o
- obj-$(CONFIG_UNIX98_PTYS) += pty.o
- obj-y += misc.o
-@@ -65,6 +66,8 @@ obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o
- obj-$(CONFIG_DS1302) += ds1302.o
- obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o
- obj-$(CONFIG_RTC_VR41XX) += vr41xx_rtc.o
-+obj-$(CONFIG_EP93XX_RTC) += ep93xx-rtc.o
-+obj-$(CONFIG_DS1337_RTC) += ds1337glue.o
- ifeq ($(CONFIG_GENERIC_NVRAM),y)
- obj-$(CONFIG_NVRAM) += generic_nvram.o
- else
-@@ -119,3 +122,6 @@ $(obj)/defkeymap.c $(obj)/qtronixmap.c:
- rm $@.tmp
-
- endif
-+
-+obj-$(CONFIG_CAN_BUS) += can/
-+
-diff --git a/drivers/char/can/Kconfig b/drivers/char/can/Kconfig
-new file mode 100644
-index 0000000..9834c66
---- /dev/null
-+++ b/drivers/char/can/Kconfig
-@@ -0,0 +1,46 @@
-+#
-+# CAN bus character devices configuration
-+#
-+
-+menu "CAN bus devices"
-+
-+config CAN_BUS
-+ bool "CAN bus character devices"
-+ help
-+ If you say y here, you will get support for CAN bus
-+ character device drivers.
-+
-+config OKI_CAN_ML9620
-+ tristate "OKI ML9620 CAN BUS"
-+ depends on CAN_BUS
-+ help
-+ If you say y or m here, you will get support for OKI ML9620
-+ character device based CAN driver for one CAN bus.
-+
-+choice
-+ prompt "OKI ML9620 configuration"
-+ depends on OKI_CAN_ML9620
-+ help
-+ Specific configuration for OKI ML9620 configuration.
-+
-+config OKI_CAN_ML9620_MICRO9
-+ bool "OKI ML9620 Contec Hypercontrol Micro9 configuration"
-+ depends on OKI_CAN_ML9620
-+ help
-+ Select this if you have Contec Hypercontrol Micro9 board.
-+
-+config OKI_CAN_ML9620_GASSNER
-+ bool "OKI ML9620 Gassner configuration"
-+ help
-+ Select this if you want to have Gassner specific changes.
-+
-+endchoice
-+
-+config OKI_CAN_ML9620_2DEV
-+ bool "OKI ML9620 CAN BUS 2nd DEVICE"
-+ depends on OKI_CAN_ML9620
-+ help
-+ If you say y here, you will get support for a second
-+ OKI ML9620 CAN bus.
-+
-+endmenu
-diff --git a/drivers/char/can/Makefile b/drivers/char/can/Makefile
-new file mode 100644
-index 0000000..f9bcf2a
---- /dev/null
-+++ b/drivers/char/can/Makefile
-@@ -0,0 +1,4 @@
-+#
-+# Makefile for CAN BUS character devices
-+#
-+obj-$(CONFIG_OKI_CAN_ML9620) += oki_ml9620.o
-diff --git a/drivers/char/can/oki_ml9620.c b/drivers/char/can/oki_ml9620.c
-new file mode 100644
-index 0000000..d60cca4
---- /dev/null
-+++ b/drivers/char/can/oki_ml9620.c
-@@ -0,0 +1,1006 @@
-+/*
-+ * drivers/char/can/oki_ml9620_core.c
-+ *
-+ * OKI ML9620 CAN Controler driver
-+ *
-+ * Author: Manfred Gruber <manfred.gruber@contec.at>
-+ *
-+ * Copyright 2004 (c) Manfred Gruber
-+ * Copyright 2004 (c) Contec Steuerungstechnik & Automation Ges.m.b.H
-+ * Kufstein/Austria www.contec.at
-+ *
-+ * This driver was written for Contec Hypercontrol Micro9 Board:
-+ * 1. CAN Controller is on Hypercontrol Micro9 CPU board
-+ * 2. CAN Controller is on Hypercontrol Micro9 Eval board
-+ *
-+ * Contec uses this driver on their Hypercontrol Micro9 boards based on
-+ * Cirrus Logic EP93XX, we have changed Adr-/Databus timing to use OKI ML9620.
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ *
-+ */
-+
-+/*Versions:
-+ - 0.01 Inital version Only worked CAN1
-+ - 0.02 CAN1/CAN2 worked, EVAL-board and CPU-BOARD Micro9
-+ - 0.03 changes from Michael Burian to correct:
-+ errors, functions, adr/databus-problems - thanks a lot Michael
-+ changed to correct name oki_ml9620_X and put in drivers/char/can/
-+ deleted some wrong statements
-+ - 0.04 Michael Burian: read/write expect/return count in bytes now, cleanups
-+ - 0.05 Michael Burian: use mux'd IRQs for both devices now
-+ - 0.06 Michael Burian: only queue messages when /dev/can[01] is open
-+ - 0.07 Michael Burian: implement non-blocking read
-+ - 0.08 Michael Burian: replace completion with waitq, implement poll support
-+*/
-+
-+/*Todo:
-+ - Baudrate over /proc configure
-+ - remove potential infinite loop in write / make write return immediately
-+ (no longer wait for hardware, do this in background)
-+ - implement fsync to allow waiting till hardware has written, if desired
-+ - implement poll for write
-+ - implement buffered write
-+ - use kfifo for buffering read
-+ - use kfifo for buffering write
-+ - look for a more elegant solution for
-+*/
-+
-+/* Enable for debugging */
-+/*#define OKI_DEBUG */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/signal.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/major.h>
-+#include <linux/config.h>
-+#include <linux/moduleparam.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/stddef.h> /* offsetof(), etc. */
-+#include <linux/completion.h>
-+#include <linux/poll.h>
-+#include <linux/can/oki_ml9620_ctrl.h>
-+#include <asm/segment.h>
-+#include <asm/hardware.h>
-+#include <asm/bitops.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/arch/regmap.h>
-+#include "oki_ml9620.h"
-+
-+/* fops */
-+static int oki_read(struct file *file, char *buf, size_t count,loff_t *ppos);
-+static int oki_write(struct file *file, const char *buf, size_t count,loff_t *ppos);
-+static int oki_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
-+static int oki_open(struct inode *inode, struct file *file);
-+static int oki_release(struct inode *inode, struct file *file);
-+static unsigned int oki_poll(struct file *file, poll_table *wait);
-+
-+/* IRQ */
-+static irqreturn_t oki_irqhandler(int irq, void *dev_id, struct pt_regs *regs);
-+
-+/* CAN */
-+static void hw_init(struct can_device *c);
-+static int set_baudrate(struct can_device *c, int baud);
-+static int check_status(struct can_device *c);
-+static int activate(struct can_device *c, unsigned char new_status);
-+static void store_data_in_buffer(struct can_device *c, struct can_msg *data);
-+
-+void store_data_in_buffer(struct can_device *c, struct can_msg *data)
-+{
-+ /* No need to fill up the queue when nobody cares. */
-+ if (atomic_read(&c->can_opened))
-+ return;
-+
-+ DBG_OKI(KERN_INFO, "DATA Stored: ID 0x%x dlc 0x%x rtr 0x%x ext 0x%x DATA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",data->id,data->dlc,data->rtr,data->ext,data->data[0],data->data[1],data->data[2],data->data[3],data->data[4],data->data[5],data->data[6],data->data[7]);
-+
-+ if (memcpy(&c->tail->msg, data, sizeof(struct can_msg)) != NULL) {
-+ c->tail->next = kmalloc(sizeof(struct recbuf), GFP_KERNEL);
-+ if (c->tail->next != NULL) {
-+ c->tail->next->prev = c->tail;
-+ c->tail = c->tail->next;
-+ /* up sema to allow read */
-+ wake_up_interruptible(&c->rx_waitq);
-+ return;
-+ }
-+ }
-+}
-+
-+int set_baudrate(struct can_device *c, int baud)
-+{
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+ int index = 0;
-+
-+ /* unlock hardware */
-+ c->reg.cancont = readb(v + CANCONT);
-+ c->reg.cancont |= CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ c->reg.cancont = readb(v + CANCONT);
-+ c->reg.cancont |= CONT_FLAG_CCE;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ DBG_OUT(KERN_DEBUG, ": /dev/can%d set_baudrate %dkb\n", c->minor, baud);
-+
-+ /* Lookuptable baudrate => Timing array index */
-+ switch (baud){
-+ case 10: index = 0; break;
-+ case 20: index = 1; break;
-+ case 50: index = 2; break;
-+ case 100: index = 3; break;
-+ case 125: index = 4; break;
-+ case 250: index = 5; break;
-+ case 500: index = 6; break;
-+ case 800: index = 7; break;
-+ case 1000: index = 8; break;
-+ default: index = 4; break;
-+ }
-+
-+ /* set baudrate */
-+ c->reg.canbitt[0] = bd_tbl[index].btiming0;
-+ c->reg.canbitt[1] = bd_tbl[index].btiming1;
-+ c->reg.canbpre = bd_tbl[index].bpre;
-+ writeb(c->reg.canbitt[0], v + CANBITT0);
-+ writeb(c->reg.canbitt[1], v + CANBITT1);
-+ writeb(c->reg.canbpre, v + CANBPRE);
-+
-+ /* lock hardware */
-+ c->reg.cancont = readb(v + CANCONT);
-+ c->reg.cancont &= ~CONT_FLAG_CCE;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ c->reg.cancont = readb(v + CANCONT);
-+ c->reg.cancont &= ~CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ return baud;
-+}
-+
-+void hw_init(struct can_device *c)
-+{
-+ unsigned char i;
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+
-+ spin_lock_init(&c->can_lock);
-+
-+ c->reg.cancont |= CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ /* All Messages disabled with MsgVal = 0 */
-+ c->reg.if1id[3] = 0x00;
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+
-+ /* set, so that ID Register will get transfered */
-+ c->reg.if1cmask = 0x38;
-+ writeb(c->reg.if1cmask, v + IF1CMASK);
-+
-+ for (i = 1; i < (NUM_MSG + 1); i++) {
-+ while ((c->reg.if1busy = readb(v + IF1BUSY)) & 0x80) ;
-+ c->reg.if1creq = i;
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+ }
-+
-+ for (i = CAN_STD_RX_BUFFER_START; i < (CAN_STD_RX_BUFFER_END + 1); i++) {
-+ c->reg.if1id[3] = 0x80;
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+
-+ c->reg.if1id[2] = 0x00;
-+ writeb(c->reg.if1id[2], v + IF1ID2);
-+
-+ /*c->reg.if1mask[3] = 0x00; */
-+ c->reg.if1mask[3] = 0x20;
-+ writeb(c->reg.if1mask[3], v + IF1MASK3);
-+
-+ c->reg.if1mask[2] = 0x00;
-+ writeb(c->reg.if1mask[2], v + IF1MASK2);
-+
-+ /* Transfer Controll u. ID bits */
-+ c->reg.if1cmask = 0xF8;
-+ writeb(c->reg.if1cmask, v + IF1CMASK);
-+
-+ if (i == CAN_STD_RX_BUFFER_END) {
-+ c->reg.if1mcont[0] = 0x80; /* FIFO END */
-+ writeb(c->reg.if1mcont[0], v + IF1MCONT0);
-+ } else {
-+ c->reg.if1mcont[0] = 0x00;
-+ writeb(c->reg.if1mcont[0], v + IF1MCONT0);
-+ }
-+
-+ c->reg.if1mcont[1] = 0x14; /* this MsgObj trig. Int on Rx */
-+ writeb(c->reg.if1mcont[1], v + IF1MCONT1);
-+
-+ c->reg.if1creq = i;
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+
-+ while ((c->reg.if1busy = readb(v + IF1BUSY) & 0x80)) ;
-+ }
-+
-+ /* Extended Frames */
-+ c->reg.if1id[3] = 0xC0;
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+
-+ c->reg.if1id[2] = 0x00;
-+ writeb(c->reg.if1id[2], v + IF1ID2);
-+
-+ c->reg.if1id[1] = 0x00;
-+ writeb(c->reg.if1id[1], v + IF1ID1);
-+
-+ c->reg.if1id[0] = 0x00;
-+ writeb(c->reg.if1id[0], v + IF1ID0);
-+
-+ c->reg.if1mask[3] = 0x00;
-+ writeb(c->reg.if1mask[3], v + IF1MASK3);
-+
-+ c->reg.if1mask[2] = 0x00;
-+ writeb(c->reg.if1mask[2], v + IF1MASK2);
-+
-+ c->reg.if1mask[1] = 0x00;
-+ writeb(c->reg.if1mask[1], v + IF1MASK1);
-+
-+ c->reg.if1mask[0] = 0x00;
-+ writeb(c->reg.if1mask[0], v + IF1MASK0);
-+
-+ /* Transfer Control and ID bits */
-+ c->reg.if1cmask = 0xF8;
-+ writeb(c->reg.if1cmask, v + IF1CMASK);
-+
-+ c->reg.if1mcont[0] = 0x80; /* EOB = 1 */
-+ writeb(c->reg.if1mcont[0], v + IF1MCONT0);
-+
-+ c->reg.if1mcont[1] = 0x14; /* this MsgObj trig. Int on Rx */
-+ writeb(c->reg.if1mcont[1], v + IF1MCONT1);
-+
-+ c->reg.if1creq = CAN_EXT_RX_BUFFER;
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+
-+ /* Wait till everything has been written */
-+ while ((c->reg.if1busy = readb(v + IF1BUSY) & 0x80)) ;
-+
-+ c->reg.cancont = readl(v + CANCONT);
-+ c->reg.cancont |= CONT_FLAG_IE + CONT_FLAG_SIE + CONT_FLAG_EIE;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ /*End Init */
-+ c->reg.cancont = readb(v + CANCONT);
-+ c->reg.cancont &= ~CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+
-+ /* store baudrate default 125 kBit/sec */
-+ c->baudrate = (unsigned short)set_baudrate(c, 125);
-+
-+ /* reset overrun counter */
-+ c->overrun = 0;
-+}
-+
-+static irqreturn_t oki_irqhandler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ unsigned short int_type = 0;
-+ unsigned short i;
-+ unsigned char stat_reg, k;
-+ struct can_msg msg;
-+ struct can_device *c = dev_id;
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+ int minor = c->minor;
-+ unsigned long flags;
-+ int irq_count = 0;
-+
-+ spin_lock_irqsave(&c->can_lock, flags);
-+
-+ /*
-+ * read can interrupt register1,
-+ * we only want to detect if it is a status interrupt!
-+ */
-+ int_type += (readb(v + CANINT1) << 8);
-+
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ 0x%x occured, virt addr:0x%08x\n",minor,int_type,v);
-+
-+ /* STATUS IRQ */
-+ if (int_type & 0x8000) {
-+ c->reg.canstat = stat_reg = readb(v + CANSTAT);
-+ c->reg.canstat = 0x00;
-+ writeb(c->reg.canstat, v + CANSTAT);
-+
-+ DBG_OKI(KERN_ERR, "/dev/can%d IRQ is STATUS IRQ BSTAT is 0x%x\n",minor,stat_reg);
-+
-+ /*if ((stat_reg & 0xE0) == 0xE0) */
-+ /* changed back to get bus off state */
-+ if ((stat_reg & 0x80) == 0x80) {
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ is BUS OFF\n",minor);
-+ /* set "Bus off" flag */
-+ c->status |= CAN_STS_BUS_OFF;
-+ /* clear flag */
-+ c->status &= ~CAN_STS_TXOK;
-+
-+ c->last_error_code = 10;
-+ } else {
-+ /* clear "Bus off" flag */
-+ c->status &= ~CAN_STS_BUS_OFF;
-+ }
-+
-+ if ((stat_reg & 0x60) == 0x60) {
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ is STATUS CAN_STS_WARNING %x \n",minor,(stat_reg & 0x7));
-+ c->last_error_code = (stat_reg & 0x7);
-+ /* set WARNING flag */
-+ c->status |= CAN_STS_WARNING;
-+ } else {
-+ /* clear WARNING flag */
-+ c->status &= ~CAN_STS_WARNING;
-+ }
-+
-+ /* TXOK */
-+ if ((stat_reg & 0x08) == 0x08) {
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ is STATUS TXOK\n",minor);
-+
-+ /* clear error */
-+ c->last_error_code_write = 0;
-+ /* clear error --> no error */
-+ c->last_error_code = 0;
-+ /* clear error var for debug */
-+ c->last_error_code_debug = 0;
-+ }
-+
-+ /* ROK */
-+ if ((stat_reg & 0x10) == 0x10) {
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ is STATUS IRQ RXOK\n",minor);
-+
-+ /* clear error --> no error */
-+ c->last_error_code = 0;
-+ /* clear error var for debug */
-+ c->last_error_code_debug = 0;
-+ }
-+
-+ if((c->last_error_code >= 1 && c->last_error_code <= 7) || c->last_error_code == 10){
-+ if(c->last_error_code < 10 && ((stat_reg & 0x80) == 0x80) && (c->last_error_code != c->last_error_code_debug)){
-+ c->last_error_code_debug = 10;
-+ DBG_OUT(KERN_ERR, ": /dev/can%d Error BUS OFF, do ioctl STATUS\n",minor);
-+
-+ }
-+
-+ if (c->last_error_code != c->last_error_code_debug) {
-+ c->last_error_code_debug = c->last_error_code;
-+ DBG_OUT(KERN_ERR, ": /dev/can%d %s\n",minor,err[c->last_error_code]);
-+ }
-+
-+ if (c->last_error_code > 0) {
-+ /* switch off controller, warning state is higher than 1 */
-+ /* so CAN message has a form error or was not */
-+ /* acknwledged by other devices or we are in bus off state */
-+ activate(c, CAN_STS_CNTRL_OFF);
-+ }
-+ goto out;
-+ }
-+
-+ DBG_OKI(KERN_ERR, ": /dev/can%d IRQ is STATUS IRQ END \n",minor);
-+ }
-+
-+ /* read next IRQ */
-+ /* only read can interrupt register0, we don't want detect a status interrupt here! */
-+ int_type = readb(v + CANINT0);
-+
-+ while (int_type && (irq_count++ < OKI_CAN_MAX_IRQS)) {
-+ switch (int_type) {
-+ case CAN_TX_BUFFER:
-+ case CAN_RTX_BUFFER:
-+
-+ DBG_OKI(KERN_ERR, "/dev/can%d IRQ is CAN_TX_BUFFER/CAN_RTX_BUFFER IRQ 0x%x\n",minor,int_type);
-+ while ((c->reg.if1busy = readb(v + IF1BUSY)) & 0x80) ;
-+
-+ /* Clear Int Pnd */
-+ c->reg.if1cmask = 0x08;
-+ writeb(c->reg.if1cmask, v + IF1CMASK);
-+
-+ c->reg.if1creq = (unsigned char)int_type;
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+
-+ CAN_DEBUG(IF1CMASK,"CAN_TX_BUFFER/CAN_RTX_BUFFER IF1CMASK");
-+ CAN_DEBUG(IF1CREQ,"CAN_TX_BUFFER/CAN_RTX_BUFFER IF1CREQ");
-+
-+ /* Wait till everything has been written */
-+ while ((c->reg.if1busy = readb(v + IF1BUSY)) & 0x80) ;
-+ c->status |= CAN_STS_TXOK;
-+ c->tx_in_progress = 0;
-+ DBG_OKI(KERN_ERR, "/dev/can%d IRQ is CAN_TX_BUFFER/CAN_RTX_BUFFER IRQ 0x%x END\n",minor,int_type);
-+ break;
-+ case CAN_STD_RX_BUFFER_START:
-+ case 2:
-+ case 3:
-+ case 4:
-+ case 5:
-+ case 6:
-+ case 7:
-+ case 8:
-+ case 9:
-+ case 10:
-+ case 11:
-+ case CAN_STD_RX_BUFFER_END:
-+ DBG_OKI(KERN_ERR, "/dev/can%d IRQ is CAN_STD_RX_BUFFER_START/CAN_STD_RX_BUFFER_END IRQ 0x%x\n",minor,int_type);
-+ do {
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80);
-+ /* Get all unsigned chars */
-+ c->reg.if2cmask = 0x3F;
-+ writeb(c->reg.if2cmask, v + IF2CMASK);
-+ c->reg.if2creq = (unsigned char)int_type;
-+ writeb(c->reg.if2creq, v + IF2CREQ);
-+
-+ /* Wait till everything has been written */
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80);
-+ /* is NewData set? */
-+ if ((c->reg.if2mcont[1] = readb(v + IF2MCONT1)) & 0x80) {
-+ /* Extended Frame? */
-+ if ((c->reg.if2id[3] = readb(v + IF2ID3)) & 0x40)
-+ msg.ext = 1;
-+ else
-+ msg.ext = 0;
-+
-+ msg.dlc = ((c->reg.if2mcont[0] = readb(v + IF2MCONT0)) & 0x0F);
-+ msg.id = (((c->reg.if2id[3] = readb(v + IF2ID3)) & 0x1F) << 6);
-+ msg.id += ((c->reg.if2id[2] = readb(v + IF2ID2)) >> 2);
-+
-+ k = (unsigned char)((msg.dlc <= 8) ? (msg.dlc) : 8);
-+ for (i = 0; i < k; i++)
-+ msg.data[i] = c->reg.if2data[i] = readb(v + IF2DATA0 +i);
-+
-+ /* Is MsgLost set? */
-+ if ((c->reg.if2mcont[1] = readb(v + IF2MCONT1)) & 0x40)
-+ c->status |= CAN_STS_OVERRUN;
-+ else
-+ c->status &= ~CAN_STS_OVERRUN;
-+ /* is DIR set? */
-+ if ((c->reg.if2id[3] = readb(v + IF2ID3)) & 0x20)
-+ msg.rtr = 1;
-+ else
-+ msg.rtr = 0;
-+ /* clear MsgLst */
-+ c->reg.if2mcont[1] &= 0xBF;
-+ writeb(c->reg.if2mcont[1], v + IF2MCONT1);
-+ c->reg.if2cmask = 0x10;
-+ writeb(c->reg.if2cmask, v + IF2CMASK);
-+ c->reg.if2creq = (unsigned char)int_type;
-+ writeb(c->reg.if2creq, v + IF2CREQ);
-+
-+ /* Wait till everything has been written */
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80);
-+
-+ /* Store Data */
-+ store_data_in_buffer(c,&msg);
-+ } else {
-+ /* exit while loop */
-+ break;
-+ }
-+ int_type++;
-+ }
-+ while (int_type <= CAN_STD_RX_BUFFER_END);
-+ DBG_OKI(KERN_ERR, " /dev/can%d IRQ is CAN_STD_RX_BUFFER_START/CAN_STD_RX_BUFFER_END IRQ 0x%x\n",minor,int_type);
-+ break;
-+ /* Extended Frames */
-+ case CAN_EXT_RX_BUFFER:
-+ DBG_OKI(KERN_ERR, " /dev/can%d IRQ is CAN_EXT_RX_BUFFER IRQ 0x%x\n",minor,int_type);
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80);
-+ /* Get all unsigned chars */
-+ c->reg.if2cmask = 0x3F;
-+ writeb(c->reg.if2cmask, v + IF2CMASK);
-+ c->reg.if2creq = (unsigned char)int_type;
-+ writeb(c->reg.if2creq, v + IF2CREQ);
-+ /* Wait till everything has been written */
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80) ;
-+ /* is NewData set? */
-+ if ((c->reg.if2mcont[1] = readb(v + IF2MCONT1)) & 0x80) {
-+ /* Extended Frame? */
-+ if ((c->reg.if2id[3] = readb(v + IF2ID3)) & 0x40)
-+ msg.ext = 1;
-+ else
-+ msg.ext = 0;
-+
-+ msg.dlc = ((c->reg.if2mcont[0] = readb(v + IF2MCONT0)) & 0x0F);
-+ msg.id = c->reg.if2id[0] = readb(v + IF2ID0);
-+ msg.id += ((c->reg.if2id[1] = readb(v + IF2ID1)) << 8);
-+ msg.id += ((c->reg.if2id[2] = readb(v + IF2ID2)) << 16);
-+ msg.id += (((c->reg.if2id[3] = readb(v + IF2ID2)) & 0x1F) << 24);
-+
-+ k = (unsigned char)((msg.dlc <= 8) ? (msg.dlc) : 8);
-+ for (i = 0; i < k; i++)
-+ msg.data[i] = c->reg.if2data[i] = readb(v + IF2DATA0 + i);
-+ /* Is MsgLost set? */
-+ if ((c->reg.if2mcont[1] = readb(v + IF2MCONT1)) & 0x40)
-+ c->status |= CAN_STS_OVERRUN;
-+ else
-+ c->status &= ~CAN_STS_OVERRUN;
-+
-+ /* clear MsgLst */
-+ c->reg.if2mcont[1] &= 0xBF;
-+ writeb(c->reg.if2mcont[1], v + IF2MCONT1);
-+ c->reg.if2cmask = 0x10;
-+ writeb(c->reg.if2cmask, v + IF2CMASK);
-+ c->reg.if2creq = (unsigned char)int_type;
-+ writeb(c->reg.if2creq, v + IF2CREQ);
-+
-+ /* Wait till everything has been written */
-+ while ((c->reg.if2busy = readb(v + IF2BUSY)) & 0x80);
-+ /* Store Data */
-+ store_data_in_buffer(c, &msg);
-+ }
-+ DBG_OKI(KERN_ERR, " /dev/can%d IRQ is CAN_EXT_RX_BUFFER IRQ 0x%x\n",minor,int_type);
-+ break;
-+ default:
-+ DBG_OKI(KERN_ERR, " /dev/can%d IRQ is default 0x%x\n",minor,int_type);
-+ goto out;
-+ break;
-+ }
-+ /* read next IRQ */
-+ /* only read can interrupt register0, we don't want detect a status interrupt here! */
-+ int_type = readb(v + CANINT0);
-+ } /* while */
-+out:
-+ spin_unlock_irqrestore(&c->can_lock, flags);
-+ return IRQ_HANDLED;
-+}
-+
-+static struct file_operations oki_fops = {
-+ .owner = THIS_MODULE,
-+ .read = oki_read,
-+ .write = oki_write,
-+ .ioctl = oki_ioctl,
-+ .open = oki_open,
-+ .release = oki_release,
-+ .poll = oki_poll,
-+};
-+
-+int oki_read(struct file *file, char *buf, size_t count, loff_t * ppos)
-+{
-+ unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
-+ struct can_device *c = info_can[minor];
-+ int ret = 0;
-+ int i, tmp;
-+
-+ if (count < sizeof(struct can_msg))
-+ return -EINVAL;
-+
-+ if ((c->head == c->tail) && (file->f_flags & O_NONBLOCK))
-+ return -EAGAIN;
-+
-+ ret = wait_event_interruptible(c->rx_waitq, c->head != c->tail);
-+ if (ret)
-+ return -ERESTARTSYS;
-+
-+ for (i = 0; i < (count / sizeof(struct can_msg)); i++) {
-+ if (c->head == c->tail)
-+ break;
-+
-+ tmp = copy_to_user(buf, &c->head->msg, sizeof(struct can_msg));
-+ if (tmp > 0) {
-+ printk("copy_to_user could not copy %d bytes", ret);
-+ ret = -EIO;
-+ } else {
-+ buf += sizeof(struct can_msg);
-+ ret += sizeof(struct can_msg);
-+ }
-+
-+ c->head = c->head->next;
-+ kfree(c->head->prev);
-+ }
-+
-+ return ret;
-+}
-+
-+int oki_write(struct file *file, const char *buf, size_t count, loff_t * ppos)
-+{
-+ unsigned char i; /* counter, temp var */
-+ unsigned char k; /* counter */
-+ unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
-+ struct can_device *c = info_can[minor];
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+ struct can_msg tmp;
-+ struct can_msg *txbuf = &tmp;
-+
-+ if (!buf || !count)
-+ return 0;
-+
-+ /* be stricter than in read here, require multiples of whole msgs */
-+ if (count % sizeof(struct can_msg)) {
-+ printk("count must be N * sizeof(struct can_msg)!\n");
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * This can be removed as soon as we have implemented support for
-+ * writing multiple messages
-+ */
-+ if (count != sizeof(struct can_msg)) {
-+ printk("FIXME: support writing multiple messages at once!\n");
-+ return -EINVAL;
-+ }
-+
-+ if (0 != copy_from_user(txbuf, buf, count)) {
-+ printk("%s: Error: copy from user failed!\n", __FUNCTION__);
-+ return -EIO;
-+ }
-+
-+ DBG_OKI(KERN_ERR, ": WRITE minor %d\n", c->minor);
-+ DBG_OKI(KERN_ERR, ": WRITE virt 0x%x\n", c->virt_addr_can);
-+ DBG_OKI(KERN_ERR, ": WRITE id %d\n", txbuf->id);
-+ DBG_OKI(KERN_ERR, ": WRITE dlc %d\n", txbuf->dlc);
-+ DBG_OKI(KERN_ERR, ": WRITE rtr %d\n", txbuf->rtr);
-+ DBG_OKI(KERN_ERR, ": WRITE ext %d\n", txbuf->ext);
-+ for (i = 0; i < 8; i++)
-+ DBG_OKI(KERN_ERR, ": WRITE data[%d] %d\n", i, txbuf->data[i]);
-+
-+ c->reg.cancont = readb(v + CANCONT);
-+
-+ CAN_DEBUG(CANCONT, "CANCONT");
-+
-+ if ((c->reg.cancont & CONT_FLAG_INIT) == CONT_FLAG_INIT) {
-+ if (c->last_error_code_write < 1) {
-+ c->last_error_code_write = 1;
-+ DBG_OUT(KERN_ERR, ": /dev/can%d not initalised or switched off, do ioctl: COMMAND CAN_STS_CNTRL_ON \n",minor );
-+ }
-+ return -EAGAIN;
-+ }
-+
-+ /* Check the status, so we can handle warning and bus off state */
-+ check_status(c);
-+
-+ if (c->status == CAN_STS_WARNING) {
-+ if (c->last_error_code_write < 2) {
-+ c->last_error_code_write = 2;
-+ DBG_OUT(KERN_ERR, ": /dev/can%d is in WARNING State, do ioctl STATUS\n",minor );
-+ }
-+ return -EAGAIN;
-+ }
-+
-+ if (c->status == CAN_STS_BUS_OFF) {
-+ if (c->last_error_code_write < 3) {
-+ c->last_error_code_write = 3;
-+ DBG_OUT(KERN_ERR, ": /dev/can%d is in BUS OFF State, do ioctl STATUS\n",minor );
-+ }
-+ return -EAGAIN;
-+ }
-+
-+ c->status &= ~CAN_STS_TXOK;
-+
-+ /* Wait till everything has been written */
-+ if (c->tx_in_progress) {
-+ DBG_OKI(KERN_ERR, ": WRITE CAN%d BUSY\n", minor);
-+ return -EBUSY;
-+ } else {
-+ c->tx_in_progress = 1;
-+ CAN_DEBUG(IF1BUSY, " WRITE 2 for while IF1BUSY");
-+ while ((c->reg.if1busy = readb(v + IF1BUSY)) & 0x80) ;
-+
-+ /* set, so that ID Register will get transfered */
-+ c->reg.if1cmask = 0xB7;
-+ writeb(c->reg.if1cmask, v + IF1CMASK);
-+ CAN_DEBUG(IF1CMASK, " WRITE 3 for while IF1CMASK");
-+ }
-+
-+ if (txbuf->ext == 0) {
-+ /* DIR and WR */
-+ c->reg.if1id[3] = 0xA0;
-+ c->reg.if1id[3] |= (unsigned char)((txbuf->id >> 6) & 0x1F);
-+ DBG_OKI(KERN_ERR, "WRITE c->reg.if1id[3] 0x%x\n",c->reg.if1id[3]);
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+ CAN_DEBUG(IF1ID3, " WRITE 4 IF1ID3");
-+ c->reg.if1id[2] = (unsigned char)((txbuf->id << 2) & 0xFC);
-+ DBG_OKI(KERN_ERR, "WRITE c->reg.if1id[2] 0x%x\n",c->reg.if1id[2]);
-+ writeb(c->reg.if1id[2], v + IF1ID2);
-+ CAN_DEBUG(IF1ID2, "WRITE 4 IF1ID2");
-+ } else {
-+ /* extended Frame */
-+ c->reg.if1id[3] = 0xE0;
-+ c->reg.if1id[3] += (unsigned char)((txbuf->id >> 24) & 0x1F);
-+ c->reg.if1id[2] = (unsigned char)((txbuf->id >> 16) & 0xFF);
-+ c->reg.if1id[1] = (unsigned char)((txbuf->id >> 8) & 0xFF);
-+ c->reg.if1id[0] = (unsigned char)(txbuf->id & 0xFF);
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+ CAN_DEBUG(IF1ID3, "WRITE 4 IF1ID3");
-+ writeb(c->reg.if1id[2], v + IF1ID2);
-+ CAN_DEBUG(IF1ID2, "WRITE 4 IF1ID2");
-+ writeb(c->reg.if1id[1], v + IF1ID1);
-+ CAN_DEBUG(IF1ID1, "WRITE 4 IF1ID1");
-+ writeb(c->reg.if1id[0], v + IF1ID0);
-+ CAN_DEBUG(IF1ID1, "WRITE 4 IF1ID1");
-+ }
-+
-+ k = (unsigned char)(((txbuf->dlc) <= 8) ? (txbuf->dlc) : 8);
-+ for (i = 0; i < k; i++) {
-+ c->reg.if1data[i] = txbuf->data[i];
-+ writeb(c->reg.if1data[i], v + IF1DATA0 + i);
-+ DBG_OKI(KERN_ERR, ": WRITE in for data[%d] %d\n",i,txbuf->data[i]);
-+ CAN_DEBUG(IF1DATA0 + i, "WRITE 4 IF1DATA0 + i");
-+ }
-+ /* End of Buffer (EOB) */
-+
-+ c->reg.if1mcont[0] = 0x80 + (txbuf->dlc & 0x0F);
-+ DBG_OKI(KERN_ERR, ": WRITE 5 if1mcont[0] 0x%x\n", c->reg.if1mcont[0]);
-+ writeb(c->reg.if1mcont[0], v + IF1MCONT0);
-+ CAN_DEBUG(IF1MCONT0, "WRITE 5 IF1MCONT0");
-+
-+ if (txbuf->rtr == 1) {
-+ c->reg.if1id[3] &= 0xDF;
-+ DBG_OKI(KERN_ERR, ": WRITE 6 if1id[3] 0x%x\n", c->reg.if1id[3]);
-+ writeb(c->reg.if1id[3], v + IF1ID3);
-+ CAN_DEBUG(IF1ID3, "WRITE 6 IF1ID3");
-+ /* TXIE, TXRqst and RXIE */
-+ c->reg.if1mcont[1] = 0x0D;
-+ DBG_OKI(KERN_ERR, ": WRITE 6 if1mcont[1] 0x%x\n",c->reg.if1mcont[1]);
-+ writeb(c->reg.if1mcont[1], v + IF1MCONT1);
-+ CAN_DEBUG(IF1MCONT1, "WRITE 6 IF1MCONT1");
-+ c->reg.if1creq = CAN_RTX_BUFFER;
-+ DBG_OKI(KERN_ERR, ": WRITE 6 if1creq 0x%x\n", c->reg.if1creq);
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+ CAN_DEBUG(IF1CREQ, "WRITE 6 IF1CREQ");
-+ } else {
-+ c->reg.if1mcont[1] = 0x09;
-+ DBG_OKI(KERN_ERR, ": WRITE 6 if1mcont[1] 0x%x\n",c->reg.if1mcont[1]);
-+ writeb(c->reg.if1mcont[1], v + IF1MCONT1);
-+ CAN_DEBUG(IF1MCONT1, "WRITE 6 IF1MCONT1");
-+ c->reg.if1creq = CAN_TX_BUFFER;
-+ DBG_OKI(KERN_ERR, ": WRITE 6 if1creq 0x%x\n", c->reg.if1creq);
-+ writeb(c->reg.if1creq, v + IF1CREQ);
-+ CAN_DEBUG(IF1CREQ, "WRITE 6 IF1CREQ");
-+ }
-+ return count;
-+}
-+
-+int oki_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+{
-+ unsigned int minor = iminor(inode);
-+ struct can_device *c = info_can[minor]; /* better ideas than using globals anyone? */
-+ int ret = -ENOIOCTLCMD;
-+ int new_options = 0;
-+ void __user *argp = (void __user *)arg;
-+ int __user *p = argp;
-+ int cntr_ret;
-+
-+ switch (cmd) {
-+ case COMMAND:
-+ {
-+ if (get_user(new_options, p) != 0)
-+ return -EFAULT;
-+
-+ DBG_OKI(KERN_ERR, ": IOCTL COMMAND WITH %d\n", new_options);
-+ cntr_ret = activate(c, new_options);
-+ if ((ret = put_user(cntr_ret, (int __user *)argp)) == 0)
-+ return 0;
-+ else
-+ return ret;
-+
-+ break;
-+ }
-+ case CONFIG:
-+ {
-+ if (get_user(new_options, p) != 0)
-+ return -EFAULT;
-+
-+ cntr_ret = set_baudrate(c, new_options);
-+ if ((ret = put_user(cntr_ret, (int __user *)argp)) == 0)
-+ return 0;
-+ else
-+ return ret;
-+
-+ break;
-+ }
-+ case SEND:
-+ break;
-+ case RECEIVE:
-+ break;
-+ case STATUS:
-+ {
-+ int cntr_ret;
-+ /* Check status */
-+ cntr_ret = check_status(c);
-+ if ((ret = put_user(cntr_ret, (int __user *)argp)) == 0)
-+ return 0;
-+ else
-+ return ret;
-+ break;
-+ }
-+ default:
-+ return -ENOIOCTLCMD;
-+ break;
-+ }
-+
-+ return -ENOIOCTLCMD;
-+}
-+
-+static unsigned int oki_poll(struct file *file, poll_table * wait)
-+{
-+ unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
-+ struct can_device *c = info_can[minor];
-+ unsigned int mask = 0;
-+
-+ poll_wait(file, &c->rx_waitq, wait);
-+ if (c->head != c->tail)
-+ mask |= POLLIN | POLLRDNORM;
-+ return mask;
-+}
-+
-+int check_status(struct can_device *c)
-+{
-+ int stat_reg;
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+
-+ stat_reg = readb(v + CANSTAT);
-+ DBG_OKI(KERN_DEBUG, "check_status canstat 0x%x\n", stat_reg);
-+
-+ /* Bus is in "Error Passive" state */
-+ if ((stat_reg & 0x20) == 0) {
-+ c->status &= ~CAN_STS_WARNING;
-+ c->status &= ~CAN_STS_BUS_OFF;
-+ }
-+
-+ if ((stat_reg & 0x60) == 0x60) {
-+ if (c->last_error_code != (stat_reg & 0x7)) {
-+ c->last_error_code = (stat_reg & 0x7);
-+ }
-+ c->status |= CAN_STS_WARNING;
-+ }
-+
-+ if ((stat_reg & 0x80) == 0x80) {
-+ if (c->last_error_code < 10) {
-+ c->last_error_code = 10;
-+ }
-+ c->status |= CAN_STS_BUS_OFF;
-+ }
-+
-+ /* clear overrun */
-+ c->status &= ~CAN_STS_OVERRUN;
-+ return c->status;
-+}
-+
-+int activate(struct can_device *c, unsigned char new_status)
-+{
-+ unsigned long v = (unsigned long)c->virt_addr_can;
-+
-+ switch (new_status) {
-+ case CAN_STS_CNTRL_OFF:
-+ do {
-+ c->reg.cancont |= CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+ }
-+ while (!((c->reg.cancont = readb(v + CANCONT)) & CONT_FLAG_INIT));
-+
-+ c->status |= CAN_STS_RESET;
-+
-+ DBG_OKI(KERN_DEBUG, " /dev/can%d activate CAN_STS_CNTRL_OFF CANCONT 0x%x\n",c->minor,c->reg.cancont);
-+ break;
-+ case CAN_STS_CNTRL_ON:
-+ do {
-+ c->reg.cancont &= ~CONT_FLAG_INIT;
-+ writeb(c->reg.cancont, v + CANCONT);
-+ }
-+ while (((c->reg.cancont = readb(v + CANCONT)) & CONT_FLAG_INIT));
-+
-+ c->status &= ~CAN_STS_RESET;
-+
-+ DBG_OKI(KERN_DEBUG, " /dev/can%d activate CAN_STS_CNTRL_ON CANCONT 0x%x\n",c->minor,c->reg.cancont);
-+ break;
-+ case CAN_STS_CNTRL_SLEEP:
-+ break;
-+ case CAN_STS_CNTRL_AWAKE:
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return c->status;
-+}
-+
-+int oki_open(struct inode *inode, struct file *file)
-+{
-+ unsigned int minor = iminor(inode);
-+ struct can_device *c = info_can[minor]; /* better ideas than using globals anyone? */
-+
-+ if (!atomic_dec_and_test(&c->can_opened)) {
-+ DBG_OUT(KERN_ERR, ": /dev/can%d already opened.\n", minor);
-+ atomic_inc(&c->can_opened);
-+ return -EBUSY;
-+ }
-+ return 0;
-+}
-+
-+int oki_release(struct inode *inode, struct file *file)
-+{
-+ unsigned int minor = iminor(inode);
-+ struct can_device *c = info_can[minor]; /* better ideas than using globals anyone? */
-+
-+ atomic_dec(&c->can_opened);
-+ if (!atomic_inc_and_test(&c->can_opened)) {
-+ DBG_OUT(KERN_ERR, ": /dev/can%d open, busy.\n", minor);
-+ return -EBUSY;
-+ }
-+
-+ atomic_inc(&c->can_opened);
-+ return 0;
-+}
-+
-+int can_register(struct can_device *c)
-+{
-+ atomic_set(&c->can_opened, 1);
-+
-+ /* map memory */
-+ c->virt_addr_can = ioremap(c->phys_addr_can, c->phys_size_can);
-+ if (!c->virt_addr_can) {
-+ DBG_OUT(KERN_ERR, ": Unable to remap /dev/can%d memory.\n", c->minor);
-+ return -ENOMEM;
-+ }
-+
-+ DBG_OUT(KERN_INFO, ": remap /dev/can%d memory physical 0x%x to virtual 0x%x.\n",c->minor,c->phys_addr_can,c->virt_addr_can);
-+
-+ /* Message buffers */
-+ c->tail = kzalloc(sizeof(struct recbuf), GFP_KERNEL);
-+ c->head = c->tail;
-+
-+ /* CAN init */
-+ hw_init(c);
-+
-+ /* waitq init */
-+ init_waitqueue_head(&c->rx_waitq);
-+
-+ /* Install IRQ handler */
-+ if(0 != request_irq(c->irq, oki_irqhandler, c->irq_flags, "OKI_CAN", (void *)c)){
-+ DBG_OUT(KERN_ERR, ": /dev/can%d cannot install IRQ-handler\n",c->minor);
-+ return -ENOMEM;
-+ }
-+
-+ DBG_OUT(KERN_INFO, ": /dev/can%d IRQ-handler installed.\n", c->minor);
-+
-+ return 0;
-+}
-+
-+int __init oki_init(void)
-+{
-+ can_register(info_can[0]);
-+#ifdef CONFIG_OKI_CAN_ML9620_2DEV
-+ can_register(info_can[1]);
-+#endif
-+
-+ /* Register char device */
-+ if (register_chrdev(OKI_CAN_CHAR_MAJOR, OKI_CAN_DEVICE_NAME, &oki_fops)) {
-+ DBG_OUT(KERN_ERR, "Can't allocate major number %d for CAN driver.\n",OKI_CAN_CHAR_MAJOR);
-+ return -EIO;
-+ }
-+
-+ DBG_OUT(KERN_INFO, ": Version: " OKI_CAN_VERSION " registered successfully.\n");
-+ /*DBG_OUT(KERN_INFO, "Installed %d IRQ handlers for %d CAN devices.\n",irq_nr,can_dev); */
-+
-+ printk(KERN_INFO "Contec Steuerungstechnik und Automation Ges.m.b.H\n");
-+ printk(KERN_INFO "Waldeck 1 / 6330 Kufstein / Austria\n");
-+
-+ return 0;
-+}
-+
-+module_init(oki_init);
-+
-+void unregister_can(struct can_device *c)
-+{
-+ DBG_OUT(KERN_INFO, ": unregister /dev/can%d .\n", c->minor);
-+ free_irq(c->irq, (void *)c);
-+
-+ if (c->virt_addr_can != NULL) {
-+ iounmap(c->virt_addr_can);
-+ } else {
-+ DBG_OUT(KERN_ERR, ": /dev/can%d was not mapped, skipping iounmap!\n", c->minor);
-+ }
-+}
-+
-+void __exit oki_exit(void)
-+{
-+ unregister_can(info_can[0]);
-+#ifdef CONFIG_OKI_CAN_ML9620_2DEV
-+ unregister_can(info_can[1]);
-+#endif
-+ unregister_chrdev(OKI_CAN_CHAR_MAJOR, OKI_CAN_DEVICE_NAME);
-+}
-+
-+module_exit(oki_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Manfred Gruber <manfred.gruber@contec.at>");
-+MODULE_DESCRIPTION("OKI ML9620 CAN Driver");
-diff --git a/drivers/char/can/oki_ml9620.h b/drivers/char/can/oki_ml9620.h
-new file mode 100644
-index 0000000..f8ece1e
---- /dev/null
-+++ b/drivers/char/can/oki_ml9620.h
-@@ -0,0 +1,397 @@
-+/*
-+ * drivers/char/can/oki_ml9620_core.h
-+ *
-+ * OKI ML9620 CAN Controler driver
-+ *
-+ * Author: Manfred Gruber <manfred.gruber@contec.at>
-+ *
-+ * Copyright 2004 (c) Manfred Gruber
-+ * Copyright 2004 (c) Contec Steuerungstechnik & Automation Ges.m.b.H
-+ * Kufstein/Austria www.contec.at
-+ *
-+ * This driver was written for Contec Hypercontrol Micro9 Board:
-+ * 1. CAN Controller is on Hypercontrol Micro9 CPU board
-+ * 2. CAN Controller is on Hypercontrol Micro9 Eval board
-+ *
-+ * Contec uses this driver on their Hypercontrol Micro9 boards based on
-+ * Cirrus Logic EP93XX,we have changed Adr-/Databus timinig to use OKI ML9620.
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ *
-+ */
-+
-+#ifndef _OKI_ML9620_CORE_H_
-+#define _OKI_ML9620_CORE_H_
-+
-+#include <linux/can/oki_ml9620_ctrl.h>
-+#include <linux/kernel.h>
-+
-+#define OKI_CAN_CHAR_MAJOR 91
-+#define OKI_CAN_DEVICE_NAME "oki_ml9260"
-+#define OKI_CAN_VERSION "0.08"
-+
-+#define OKI_CAN_MAX_IRQS 20
-+#define PHYS_SIZE_CAN 0x00000100
-+
-+/* Contec */
-+#ifdef CONFIG_OKI_CAN_ML9620_MICRO9
-+#define CAN_CLOCK_8MHZ
-+#define PHYS_ADDR_CAN0 0x20000000
-+#define PHYS_ADDR_CAN1 0x21000000
-+#define IRQ_CAN0 GPIO_IRQ4
-+#define IRQ_CAN1 GPIO_IRQ10
-+#ifdef CONFIG_GENERIC_HARDIRQS
-+#define IRQ_FLAGS_CAN0 (SA_INTERRUPT)
-+#define IRQ_FLAGS_CAN1 (SA_INTERRUPT)
-+#else
-+#define IRQ_FLAGS_CAN0 (SA_INTERRUPT | SA_SHIRQ)
-+#define IRQ_FLAGS_CAN1 (SA_INTERRUPT | SA_SHIRQ)
-+#endif
-+#endif /* CONFIG_OKI_CAN_ML9620_MICRO9 */
-+
-+/* Gassner */
-+#ifdef CONFIG_OKI_CAN_ML9620_GASSNER
-+#define CAN_CLOCK_8MHZ
-+#define PHYS_ADDR_CAN0 0x10000000
-+#define PHYS_ADDR_CAN1 0x30000000
-+#define IRQ_CAN0 GPIO_IRQ6 /* Line EGPIO6 (multiplexed) */
-+#define IRQ_CAN1 GPIO_IRQ13 /* Line EGPIO13 (multiplexed) */
-+#define IRQ_FLAGS_CAN0 (SA_INTERRUPT | SA_SHIRQ)
-+#define IRQ_FLAGS_CAN1 (SA_INTERRUPT | SA_SHIRQ)
-+#endif /* CONFIG_OKI_CAN_ML9620_GASSNER */
-+
-+char *err[7] = {
-+ "Warning 1, Stuff Error",
-+ "Warning 2, Form Error",
-+ "Warning 3, ACK Error",
-+ "Warning 4, Bits 1 Error",
-+ "Warning 5, Bits 0 Error",
-+ "Warning 6, CRC Error",
-+ "Warning 7, MCU has produced this Error",
-+};
-+
-+#define DRIVER_MAX_MINOR 2
-+
-+struct CANML9620REG {
-+ unsigned char cancont;
-+ unsigned char reserve1;
-+ unsigned char canstat;
-+ unsigned char reserve2;
-+ unsigned char cantxerrc;
-+ unsigned char canrxerrc;
-+ unsigned char canbitt[2];
-+ unsigned char canint[2];
-+ unsigned char canopt;
-+ unsigned char reserve3;
-+ unsigned char canbpre;
-+ unsigned char reserve4[3];
-+
-+ unsigned char if1creq;
-+ unsigned char if1busy;
-+ unsigned char if1cmask;
-+ unsigned char reserve5;
-+ unsigned char if1mask[4];
-+ unsigned char if1id[4];
-+ unsigned char if1mcont[2];
-+ unsigned char if1data[8];
-+ unsigned char reserve6[26];
-+
-+ unsigned char if2creq;
-+ unsigned char if2busy;
-+ unsigned char if2cmask;
-+ unsigned char reserve7;
-+ unsigned char if2mask[4];
-+ unsigned char if2id[4];
-+ unsigned char if2mcont[2];
-+ unsigned char if2data[8];
-+ unsigned char reserve8[42];
-+
-+ unsigned char cantreq[4];
-+ unsigned char reserve9[12];
-+
-+ unsigned char canndata[4];
-+ unsigned char reserve10[12];
-+
-+ unsigned char canipend[4];
-+ unsigned char reserve11[12];
-+
-+ unsigned char canmval[4];
-+ unsigned char reserve12[12];
-+
-+ unsigned char canstby;
-+ unsigned char reserve13[12];
-+};
-+
-+#define CANCONT 0x0
-+#define RESERVE1 0x1
-+#define CANSTAT 0x2
-+#define RESERVE2 0x3
-+#define CANTXERRC 0x4
-+#define CANRXERRC 0x5
-+#define CANBITT0 0x6
-+#define CANBITT1 0x7
-+#define CANINT0 0x8
-+#define CANINT1 0x9
-+#define CANOPT 0xA
-+
-+#define CANBPRE 0xC
-+
-+#define IF1CREQ 0x10
-+#define IF1BUSY 0x11
-+#define IF1CMASK 0x12
-+
-+#define IF1MASK0 0x14
-+#define IF1MASK1 0x15
-+#define IF1MASK2 0x16
-+#define IF1MASK3 0x17
-+
-+#define IF1ID0 0x18
-+#define IF1ID1 0x19
-+#define IF1ID2 0x1A
-+#define IF1ID3 0x1B
-+
-+#define IF1MCONT0 0x1C
-+#define IF1MCONT1 0x1D
-+
-+#define IF1DATA0 0x1E
-+#define IF1DATA1 0x1F
-+#define IF1DATA2 0x20
-+#define IF1DATA3 0x21
-+#define IF1DATA4 0x22
-+#define IF1DATA5 0x23
-+#define IF1DATA6 0x24
-+#define IF1DATA7 0x25
-+
-+#define IF2CREQ 0x40
-+#define IF2BUSY 0x41
-+#define IF2CMASK 0x42
-+
-+#define IF2MASK0 0x44
-+#define IF2MASK1 0x45
-+#define IF2MASK2 0x46
-+#define IF2MASK3 0x47
-+
-+#define IF2ID0 0x48
-+#define IF2ID1 0x49
-+#define IF2ID2 0x4A
-+#define IF2ID3 0x4B
-+
-+#define IF2MCONT0 0x4C
-+#define IF2MCONT1 0x4D
-+
-+#define IF2DATA0 0x4E
-+#define IF2DATA1 0x4F
-+#define IF2DATA2 0x50
-+#define IF2DATA3 0x51
-+#define IF2DATA4 0x52
-+#define IF2DATA5 0x53
-+#define IF2DATA6 0x54
-+#define IF2DATA7 0x55
-+
-+#define CANTREQ0 0x80
-+#define CANTREQ1 0x81
-+#define CANTREQ2 0x82
-+#define CANTREQ3 0x83
-+
-+#define CANNDATA0 0x90
-+#define CANNDATA1 0x91
-+#define CANNDATA2 0x92
-+#define CANNDATA3 0x93
-+
-+#define CANIPEND0 0xA0
-+#define CANIPEND1 0xA1
-+#define CANIPEND2 0xA2
-+#define CANIPEND3 0xA3
-+
-+#define CANMVAL0 0xB0
-+#define CANMVAL1 0xB1
-+#define CANMVAL2 0xB2
-+#define CANMVAL3 0xB3
-+
-+#define CANSTBY 0xC0
-+struct recbuf {
-+ struct can_msg msg;
-+ struct recbuf *next;
-+ struct recbuf *prev;
-+};
-+
-+struct can_device {
-+ /* Phys addresses and size */
-+ unsigned long phys_addr_can;
-+ unsigned long phys_size_can;
-+ /* IRQ */
-+ unsigned int irq;
-+ unsigned long irq_flags;
-+
-+ /* Device node */
-+ int minor;
-+
-+ /* waitqueue for read, poll */
-+ wait_queue_head_t rx_waitq;
-+
-+ atomic_t can_opened;
-+
-+ struct recbuf *tail;
-+ struct recbuf *head;
-+
-+ /* Virt addresses size */
-+ unsigned char __iomem *virt_addr_can;
-+
-+ /* CAN-Baustein */
-+ struct CANML9620REG reg;
-+ unsigned short baudrate; /* baudrate */
-+ unsigned short overrun; /* overrun counter */
-+ struct can_msg msg; /* CAN message buffer */
-+ int status; /* actual CAN status */
-+ int last_error_code_write;
-+ unsigned char tx_in_progress;
-+ unsigned char last_error_code; /* LEC */
-+ unsigned char last_error_code_debug; /* LEC when printed out */
-+ spinlock_t can_lock;
-+};
-+
-+/* Global Device Struct can0 */
-+static struct can_device info_can0 = {
-+ .phys_addr_can = PHYS_ADDR_CAN0,
-+ .phys_size_can = PHYS_SIZE_CAN,
-+ .irq = IRQ_CAN0,
-+ .minor = 0,
-+ .irq_flags = IRQ_FLAGS_CAN0,
-+ .can_opened = ATOMIC_INIT(1),
-+ .status = CAN_STS_NORMAL,
-+};
-+
-+/* Global Device Struct can1 */
-+static struct can_device info_can1 = {
-+ .phys_addr_can = PHYS_ADDR_CAN1,
-+ .phys_size_can = PHYS_SIZE_CAN,
-+ .irq = IRQ_CAN1,
-+ .irq_flags = IRQ_FLAGS_CAN1,
-+ .minor = 1,
-+ .can_opened = ATOMIC_INIT(1),
-+ .status = CAN_STS_NORMAL,
-+};
-+
-+static struct can_device *info_can[] = { &info_can0, &info_can1 };
-+
-+#define NUM_MSG 32
-+
-+#define CONT_FLAG_INIT 0x01
-+#define CONT_FLAG_IE 0x02
-+#define CONT_FLAG_SIE 0x04
-+#define CONT_FLAG_EIE 0x08
-+#define CONT_FLAG_CCE 0x40
-+
-+/* message buffers */
-+
-+#define CAN_STD_RX_BUFFER_START 1 /* CAN standard receive buffer */
-+#define CAN_STD_RX_BUFFER_END 12 /* CAN standard receive buffer */
-+#define CAN_EXT_RX_BUFFER 13 /* CAN extended receive buffer */
-+
-+#define CAN_TX_BUFFER 14 /* CAN transmit buffer */
-+#define CAN_RTX_BUFFER 15 /* CAN remote frame transmit buffer */
-+
-+struct ML9620BDRATE {
-+ unsigned char btiming0;
-+ unsigned char btiming1;
-+ unsigned char bpre;
-+};
-+
-+const struct ML9620BDRATE bd_tbl[9] = {
-+#ifdef CAN_CLOCK_16MHZ
-+/* for 16 Mhz Quarz */
-+/* bus timing 0 | bus timing 1 */
-+/* SJW PRESCALER | SAM TSEG1 TSEG2 */
-+ {0x23, 0x1C}, /* 10K bit/s */
-+ {0x31, 0x1C}, /* 20K bit/s */
-+ {0x13, 0x1C}, /* 50K bit/s */
-+ {0x09, 0x1C}, /* 100K bit/s */
-+ {0x07, 0x1C}, /* 125K bit/s */
-+ {0x03, 0x1C}, /* 250K bit/s */
-+ {0x01, 0x1C}, /* 500K bit/s */
-+ {0x01, 0x16}, /* 800K bit/s */
-+ {0x01, 0x14} /* 1M bit/s */
-+#endif
-+#ifdef CAN_CLOCK_8MHZ
-+/* for 8 Mhz Quarz */
-+/* bus timing 0 | bus timing 1 */
-+/* SJW PRESCALER | SAM TSEG1 TSEG2 | CANBRPE */
-+ {0x31, 0x1C, 0x01}, /* 10K bit/s */
-+ {0x18, 0x1C, 0x00}, /* 20K bit/s */
-+ {0x09, 0x1C, 0x00}, /* 50K bit/s */
-+ {0x04, 0x1C, 0x00}, /* 100K bit/s */
-+ {0x03, 0x1C, 0x00}, /* 125K bit/s */
-+ {0x01, 0x1C, 0x00}, /* 250K bit/s */
-+ {0x00, 0x1C, 0x00}, /* 500K bit/s */
-+ {0x00, 0x16, 0x00}, /* 800K bit/s */
-+ {0x00, 0x14, 0x00} /* 1M bit/s */
-+#endif
-+};
-+
-+/* DEBUG STUFF */
-+
-+#ifdef OKI_DEBUG
-+#define CAN_DEBUG(REG,string) \
-+{ \
-+ DBG_OUT(KERN_ERR, " %s 0x%x\n",string,readb(v+REG)); \
-+}
-+#else
-+#define CAN_DEBUG(REG,string)
-+#endif
-+
-+#ifdef OKI_DEBUG
-+#define DBG_OKI DBG_OUT
-+#else
-+#define DBG_OKI(...)
-+#endif
-+
-+int drv_dbg = 7;
-+
-+void DBG_OUT(const char *type, const char *dbg_msg, ...)
-+{
-+ va_list ap;
-+ char buf[1024];
-+ int len;
-+ unsigned int level;
-+
-+ va_start(ap, dbg_msg);
-+ len = vsprintf(buf, dbg_msg, ap);
-+ va_end(ap);
-+ buf[len] = '\0';
-+
-+ if (0 == sscanf(type, "<%i>", &level))
-+ printk(KERN_ALERT "%s", buf);
-+
-+ if (level > drv_dbg)
-+ return;
-+
-+ switch (level) {
-+ case 0:
-+ printk(KERN_EMERG OKI_CAN_DEVICE_NAME "EMERG: %s", buf);
-+ break;
-+ case 1:
-+ printk(KERN_ALERT OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 2:
-+ printk(KERN_CRIT OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 3:
-+ printk(KERN_ERR OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 4:
-+ printk(KERN_WARNING OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 5:
-+ printk(KERN_NOTICE OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 6:
-+ printk(KERN_INFO OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ case 7:
-+ printk(KERN_DEBUG OKI_CAN_DEVICE_NAME "%s", buf);
-+ break;
-+ }
-+}
-+#endif /* _OKI_ML9620_CORE_H_ */
-diff --git a/drivers/char/ds1337glue.c b/drivers/char/ds1337glue.c
-new file mode 100644
-index 0000000..c7d168b
---- /dev/null
-+++ b/drivers/char/ds1337glue.c
-@@ -0,0 +1,69 @@
-+/*
-+ * linux/arch/arm/mach-ep93xx/ds1337glue.c
-+ *
-+ * Copyright (C) 2005 Michael Burian
-+ *
-+ * 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.
-+ *
-+ * /dev/rtc interface for Dallas Semiconductor DS133[79]RTC I2C driver
-+ *
-+ * Also see "drivers/i2c/chips/ds1337.c"
-+ *
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/rtc.h>
-+#include <linux/miscdevice.h>
-+#include <linux/poll.h>
-+
-+#include <asm/rtc.h>
-+
-+/* FIXME BEGIN: include this from "ds1337.h" as soon as there exists one */
-+#warning FIXME: no official ds1337 interface available, hardcoding defaults.
-+#define DS1337_GET_DATE 0
-+#define DS1337_SET_DATE 1
-+extern int ds1337_do_command(int bus, int cmd, void *arg);
-+/* FIXME END */
-+
-+static int rtc_read_time(struct rtc_time *tm)
-+{
-+ return ds1337_do_command(0, DS1337_GET_DATE, (void*)(tm));
-+}
-+
-+static int rtc_set_time(struct rtc_time *tm)
-+{
-+ return ds1337_do_command(0, DS1337_SET_DATE, (void*)(tm));
-+}
-+
-+static struct rtc_ops dma03_rtc_ops = {
-+ .owner = THIS_MODULE,
-+ .read_time = rtc_read_time,
-+ .set_time = rtc_set_time,
-+};
-+
-+static int __init rtc_interface_init(void)
-+{
-+ int err;
-+ printk(KERN_INFO "registering /dev/rtc interface for DS133[79]\n");
-+
-+ err = register_rtc(&dma03_rtc_ops);
-+ if(err)
-+ printk(KERN_ERR "could not register DS1337 /dev/rtc interface:"
-+ " error=%d!\n",err);
-+
-+ return err;
-+}
-+
-+static void __exit rtc_interface_exit(void)
-+{
-+ unregister_rtc(&dma03_rtc_ops);
-+}
-+
-+MODULE_AUTHOR("Michael Burian");
-+MODULE_DESCRIPTION("/dev/rtc interface for ds1337.c");
-+MODULE_LICENSE("GPL");
-+
-+module_init(rtc_interface_init);
-+module_exit(rtc_interface_exit);
-diff --git a/drivers/char/ep93xx-rtc.c b/drivers/char/ep93xx-rtc.c
-new file mode 100644
-index 0000000..399d0b0
---- /dev/null
-+++ b/drivers/char/ep93xx-rtc.c
-@@ -0,0 +1,376 @@
-+/*
-+ * Real Time Clock for Cirrus EP93xx
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * Support for realtime clock device on the Cirrus
-+ * EP93xx family of devices.
-+ *
-+ * Based on rtc.c, and other rtc drivers.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/errno.h>
-+#include <linux/module.h>
-+#include <linux/sysctl.h>
-+#include <linux/rtc.h>
-+#include <linux/poll.h>
-+#include <linux/miscdevice.h>
-+
-+#include <asm/io.h>
-+#include <asm/arch/regmap.h>
-+
-+#define RTC_VERSION "0.01"
-+
-+#define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */
-+
-+extern spinlock_t rtc_lock; /* seems to be only present in older rtc header? */
-+static spinlock_t rtc_task_lock = SPIN_LOCK_UNLOCKED;
-+static rtc_task_t *rtc_callback = NULL;
-+static unsigned long rtc_status = 0;
-+static unsigned long rtc_irq_data = 0;
-+static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);
-+
-+/*
-+ * the 1 Hz real time interrupt
-+ */
-+
-+irqreturn_t interrupt_1hz(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ static unsigned long x = 0;
-+ static int i = 0;
-+
-+ rtc_irq_data += 0x100;
-+ rtc_irq_data &= ~0xff;
-+
-+ wake_up_interruptible(&rtc_wait);
-+
-+ printk(KERN_ERR);
-+ printk(" delta: %04ld", jiffies - x);
-+ printk(" data: %08x", readl(RTCDR));
-+ printk(" match: %08x", readl(RTCMR));
-+ printk(" stat: %08x", readl(RTCSTAT));
-+ printk(" load: %08x", readl(RTCLR));
-+ printk(" ctrl: %08x", readl(RTCCR));
-+ printk(" comp: %08x", readl(RTCSCOMP));
-+ printk("\n");
-+
-+ x = jiffies;
-+ i++;
-+
-+ if ((i & 0x7) == 0) {
-+ writel(i << 5, RTCLR);
-+ printk(KERN_ERR "NEW LOAD VALUE: %08x\n", i << 5);
-+ }
-+
-+ writel(0, RTCEOI);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * the RTC match interrupt
-+ */
-+
-+irqreturn_t interrupt_match(int irq, void *dev_id, struct pt_regs * regs)
-+{
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * the bulk of the usr interface is done here
-+ */
-+
-+static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
-+{
-+ return -ENOSYS;
-+}
-+
-+/*
-+ * file operations for character device node
-+ */
-+
-+static ssize_t rtc_read(struct file *file, char __user * buf, size_t count,
-+ loff_t * ppos)
-+{
-+ unsigned long data;
-+ ssize_t retval;
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ if (count < sizeof(unsigned int))
-+ return -EINVAL;
-+
-+ add_wait_queue(&rtc_wait, &wait);
-+
-+ do {
-+ __set_current_state(TASK_INTERRUPTIBLE);
-+
-+ spin_lock_irq(&rtc_lock);
-+ data = rtc_irq_data;
-+ rtc_irq_data = 0;
-+ spin_unlock_irq(&rtc_lock);
-+
-+ if (data != 0)
-+ break;
-+
-+ if (file->f_flags & O_NONBLOCK) {
-+ retval = -EAGAIN;
-+ goto out;
-+ }
-+
-+ if (signal_pending(current)) {
-+ retval = -ERESTARTSYS;
-+ goto out;
-+ }
-+
-+ schedule();
-+ } while (1);
-+
-+ if (count < sizeof(unsigned long))
-+ retval =
-+ put_user(data, (unsigned int __user *)buf) ? : sizeof(int);
-+ else
-+ retval =
-+ put_user(data,
-+ (unsigned long __user *)buf) ? : sizeof(long);
-+
-+ out:
-+ current->state = TASK_RUNNING;
-+ remove_wait_queue(&rtc_wait, &wait);
-+
-+ return retval;
-+}
-+
-+static unsigned int rtc_poll(struct file *file, poll_table * wait)
-+{
-+ return -ENOSYS;
-+}
-+
-+static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ return rtc_do_ioctl(cmd, arg, 0);
-+}
-+
-+static int rtc_open(struct inode *inode, struct file *file)
-+{
-+ spin_lock_irq(&rtc_lock);
-+
-+ if (rtc_status & RTC_IS_OPEN) {
-+ spin_unlock_irq(&rtc_lock);
-+ return -EBUSY;
-+ }
-+
-+ rtc_status |= RTC_IS_OPEN;
-+ rtc_irq_data = 0;
-+ enable_irq(IRQ_1HZ);
-+
-+ spin_unlock_irq(&rtc_lock);
-+ return 0;
-+}
-+
-+static int rtc_release(struct inode *inode, struct file *file)
-+{
-+ spin_lock_irq(&rtc_lock);
-+
-+ disable_irq(IRQ_1HZ);
-+ rtc_irq_data = 0;
-+ rtc_status &= ~RTC_IS_OPEN;
-+
-+ spin_unlock_irq(&rtc_lock);
-+
-+ return 0;
-+}
-+
-+static int rtc_fasync(int fd, struct file *filp, int on)
-+{
-+ return -ENOSYS;
-+}
-+
-+static struct file_operations rtc_fops = {
-+ .owner = THIS_MODULE,
-+ .llseek = no_llseek,
-+ .read = rtc_read,
-+ .poll = rtc_poll,
-+ .ioctl = rtc_ioctl,
-+ .open = rtc_open,
-+ .release = rtc_release,
-+ .fasync = rtc_fasync,
-+};
-+
-+static struct miscdevice rtc_dev = {
-+ RTC_MINOR,
-+ "rtc",
-+ &rtc_fops
-+};
-+
-+/*
-+ * sysctl-tuning infrastructure.
-+ */
-+
-+int no_proc(ctl_table * table, int write, struct file *filp,
-+ void __user * buffer, size_t * lenp, loff_t * ppos)
-+{
-+ return -ENOSYS;
-+}
-+
-+static ctl_table rtc_table[] = {
-+ {
-+ .ctl_name = 1,
-+ .procname = "max-user-freq",
-+ .data = NULL,
-+ .maxlen = sizeof(int),
-+ .mode = 0644,
-+ .proc_handler = &no_proc,
-+ },
-+ {.ctl_name = 0}
-+};
-+
-+static ctl_table rtc_root[] = {
-+ {
-+ .ctl_name = 1,
-+ .procname = "rtc",
-+ .maxlen = 0,
-+ .mode = 0555,
-+ .child = rtc_table,
-+ },
-+ {.ctl_name = 0}
-+};
-+
-+static ctl_table dev_root[] = {
-+ {
-+ .ctl_name = CTL_DEV,
-+ .procname = "dev",
-+ .maxlen = 0,
-+ .mode = 0555,
-+ .child = rtc_root,
-+ },
-+ {.ctl_name = 0}
-+};
-+
-+static struct ctl_table_header *sysctl_header;
-+
-+static int __init init_sysctl(void)
-+{
-+ sysctl_header = register_sysctl_table(dev_root, 0);
-+ return 0;
-+}
-+
-+static void __exit cleanup_sysctl(void)
-+{
-+ unregister_sysctl_table(sysctl_header);
-+}
-+
-+/*
-+ * Public functions from rtc.h
-+ */
-+
-+EXPORT_SYMBOL(rtc_register);
-+EXPORT_SYMBOL(rtc_unregister);
-+EXPORT_SYMBOL(rtc_control);
-+
-+int rtc_register(rtc_task_t * task)
-+{
-+ if (task == NULL || task->func == NULL)
-+ return -EINVAL;
-+
-+ spin_lock_irq(&rtc_lock);
-+
-+ if (rtc_status & RTC_IS_OPEN) {
-+ spin_unlock_irq(&rtc_lock);
-+ return -EBUSY;
-+ }
-+
-+ spin_lock(&rtc_task_lock);
-+
-+ if (rtc_callback) {
-+ spin_unlock(&rtc_task_lock);
-+ spin_unlock_irq(&rtc_lock);
-+ return -EBUSY;
-+ }
-+
-+ rtc_status |= RTC_IS_OPEN;
-+ rtc_callback = task;
-+
-+ spin_unlock(&rtc_task_lock);
-+ spin_unlock_irq(&rtc_lock);
-+
-+ return 0;
-+}
-+
-+int rtc_unregister(rtc_task_t * task)
-+{
-+ spin_lock_irq(&rtc_lock);
-+ spin_lock(&rtc_task_lock);
-+
-+ if (rtc_callback != task) {
-+ spin_unlock(&rtc_task_lock);
-+ spin_unlock_irq(&rtc_lock);
-+ return -ENXIO;
-+ }
-+
-+ /* disable PIE/AIE/UIE interrupts */
-+
-+ rtc_status &= ~RTC_IS_OPEN;
-+ rtc_callback = NULL;
-+
-+ spin_unlock(&rtc_task_lock);
-+ spin_unlock_irq(&rtc_lock);
-+
-+ return 0;
-+}
-+
-+int rtc_control(rtc_task_t * task, unsigned int cmd, unsigned long arg)
-+{
-+ spin_lock_irq(&rtc_task_lock);
-+
-+ if (rtc_callback != task) {
-+ spin_unlock_irq(&rtc_task_lock);
-+ return -ENXIO;
-+ }
-+
-+ spin_unlock_irq(&rtc_task_lock);
-+
-+ return rtc_do_ioctl(cmd, arg, 1);
-+}
-+
-+void rtc_get_rtc_time(struct rtc_time *rtc_tm)
-+{
-+}
-+
-+/*
-+ * Module init/exit
-+ */
-+
-+static int __init rtc_init(void)
-+{
-+ if (request_irq(IRQ_1HZ, interrupt_1hz, SA_INTERRUPT, "rtc-1hz", NULL)) {
-+ printk(KERN_ERR "rtc: IRQ %d is not free.\n", IRQ_1HZ);
-+ return -EIO;
-+ }
-+
-+ if (misc_register(&rtc_dev)) {
-+ free_irq(IRQ_1HZ, NULL);
-+ return -ENODEV;
-+ }
-+
-+ init_sysctl();
-+
-+ printk(KERN_INFO "Real Time Clock Driver v" RTC_VERSION "\n");
-+ return 0;
-+}
-+
-+static void __exit rtc_exit(void)
-+{
-+ cleanup_sysctl();
-+ misc_deregister(&rtc_dev);
-+ free_irq(IRQ_1HZ, NULL);
-+}
-+
-+module_init(rtc_init);
-+module_exit(rtc_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/char/ttml.c b/drivers/char/ttml.c
-new file mode 100644
-index 0000000..ba2cb8e
---- /dev/null
-+++ b/drivers/char/ttml.c
-@@ -0,0 +1,643 @@
-+/*
-+ * linux/drivers/char/ttml.c
-+ *
-+ * TTML TripDawg system devices.
-+ *
-+ * Copyright 2004, Ray Lehtiniemi
-+ * Copyright 2004, Siconix, Inc
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/config.h>
-+
-+#include <linux/spinlock.h>
-+#include <linux/fs.h>
-+#include <linux/device.h>
-+#include <linux/cdev.h>
-+#include <linux/major.h>
-+#include <linux/init.h>
-+#include <linux/errno.h>
-+#include <linux/poll.h>
-+#include <linux/ttml.h>
-+#include <linux/timer.h>
-+#include <linux/slab.h>
-+
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+
-+#include <asm/arch/regmap.h>
-+#include <asm/arch/ssp.h>
-+#include <asm/arch/ssp2.h>
-+#include <asm/arch/mach-ttml.h>
-+
-+/* device open/release stuff */
-+static DECLARE_MUTEX(mutex);
-+static struct cdev ttml_cdev;
-+static struct class *ttml_class;
-+static int is_open[MAX_TTML_MINORS];
-+
-+#define minor_get(minor) is_open[(minor)-TTML_MINOR_LED] = 1
-+#define minor_put(minor) is_open[(minor)-TTML_MINOR_LED] = 0
-+#define minor_busy(minor) (is_open[(minor)-TTML_MINOR_LED] != 0)
-+
-+static struct {
-+ int minor;
-+ char *name;
-+} devlist[] = {
-+ {
-+ TTML_MINOR_LED, "led"}, {
-+ TTML_MINOR_BUZZER, "buzzer"}, {
-+ TTML_MINOR_SPEEDO, "speedo"}, {
-+ TTML_MINOR_GPIO, "gpio"}, {
-+ TTML_MINOR_BUTTON, "button"}, {
-+TTML_MINOR_WD, "wd"},};
-+
-+/* button and gpio event handling */
-+static kmem_cache_t *event_cachep;
-+static spinlock_t event_lock = SPIN_LOCK_UNLOCKED;
-+static LIST_HEAD(button_events);
-+static LIST_HEAD(gpio_events);
-+static DECLARE_WAIT_QUEUE_HEAD(button_wait);
-+static DECLARE_WAIT_QUEUE_HEAD(gpio_wait);
-+
-+enum ttml_events {
-+ TTML_BUTTON_PRESS,
-+ TTML_BUTTON_RELEASE,
-+ TTML_PTO_RISE,
-+ TTML_PTO_FALL,
-+ TTML_IGNITION_RISE,
-+ TTML_IGNITION_FALL,
-+ TTML_SPARE_RISE,
-+ TTML_SPARE_FALL,
-+};
-+
-+struct ttml_event {
-+ struct list_head l;
-+ struct timeval t;
-+ enum ttml_events e;
-+};
-+
-+/* Button and GPIO event monitoring timer */
-+
-+static struct timer_list monitor_timer;
-+static void handle_timer(unsigned long);
-+
-+static void setup_timer(void)
-+{
-+ monitor_timer.expires = jiffies + 1;
-+ monitor_timer.data = 0;
-+ monitor_timer.function = handle_timer;
-+ add_timer(&monitor_timer);
-+}
-+
-+static void handle_timer_button(void)
-+{
-+ static int state = 0;
-+ int portf = readl(GPIO_PFDR);
-+ int new = (portf & 0x04) ? 0 : 1;
-+
-+ if (state ^ new) {
-+ struct ttml_event *b =
-+ kmem_cache_alloc(event_cachep, GFP_KERNEL);
-+ if (b != NULL) {
-+ do_gettimeofday(&b->t);
-+ b->t.tv_usec |=
-+ ((new ? TTML_BUTTON_PRESS : TTML_BUTTON_RELEASE) <<
-+ 24);
-+ list_add(&b->l, &button_events);
-+ wake_up_interruptible(&button_wait);
-+ }
-+ state = new;
-+ }
-+}
-+
-+static void handle_timer_pto(void)
-+{
-+ static int state = 0;
-+ int portf = readl(GPIO_PFDR);
-+ int new = (portf & 0x08) ? 1 : 0;
-+
-+ if (state ^ new) {
-+ struct ttml_event *b =
-+ kmem_cache_alloc(event_cachep, GFP_KERNEL);
-+ if (b != NULL) {
-+ do_gettimeofday(&b->t);
-+ b->t.tv_usec |=
-+ ((new ? TTML_PTO_RISE : TTML_PTO_FALL) << 24);
-+ list_add(&b->l, &gpio_events);
-+ wake_up_interruptible(&gpio_wait);
-+ }
-+ state = new;
-+ }
-+}
-+
-+static void handle_timer_ignition(void)
-+{
-+ static int state = 0;
-+ int portf = readl(GPIO_PFDR);
-+ int new = (portf & 0x02) ? 1 : 0;
-+
-+ if (state ^ new) {
-+ struct ttml_event *b =
-+ kmem_cache_alloc(event_cachep, GFP_KERNEL);
-+ if (b != NULL) {
-+ do_gettimeofday(&b->t);
-+ b->t.tv_usec |=
-+ ((new ? TTML_IGNITION_RISE : TTML_IGNITION_FALL) <<
-+ 24);
-+ list_add(&b->l, &gpio_events);
-+ wake_up_interruptible(&gpio_wait);
-+ }
-+ state = new;
-+ }
-+}
-+
-+static void handle_timer_spare(void)
-+{
-+ static int state = 0;
-+ int porta = readl(GPIO_PADR);
-+ int new = (porta & 0x08) ? 1 : 0;
-+
-+ if (state ^ new) {
-+ struct ttml_event *b =
-+ kmem_cache_alloc(event_cachep, GFP_KERNEL);
-+ if (b != NULL) {
-+ do_gettimeofday(&b->t);
-+ b->t.tv_usec |=
-+ ((new ? TTML_SPARE_RISE : TTML_SPARE_FALL) << 24);
-+ list_add(&b->l, &gpio_events);
-+ wake_up_interruptible(&gpio_wait);
-+ }
-+ state = new;
-+ }
-+}
-+
-+static void handle_timer(unsigned long foo)
-+{
-+ handle_timer_button();
-+ handle_timer_pto();
-+ handle_timer_ignition();
-+ handle_timer_spare();
-+ setup_timer();
-+}
-+
-+static int ttml_read_gpio(struct file *filp, char __user * buf, size_t size,
-+ loff_t * off);
-+static int ttml_read_button(struct file *filp, char __user * buf, size_t size,
-+ loff_t * off);
-+static unsigned int ttml_poll_gpio(struct file *filp,
-+ struct poll_table_struct *poll);
-+static unsigned int ttml_poll_button(struct file *filp,
-+ struct poll_table_struct *poll);
-+static int ttml_ioctl(struct inode *inode, struct file *filp,
-+ unsigned int command, unsigned long arg);
-+static int ttml_open(struct inode *inode, struct file *filp);
-+static int ttml_release(struct inode *inode, struct file *filp);
-+
-+static struct file_operations ttml_fops = {
-+ .owner = THIS_MODULE,
-+ .ioctl = ttml_ioctl,
-+ .open = ttml_open,
-+ .release = ttml_release,
-+};
-+
-+static struct file_operations ttml_fops_gpio = {
-+ .owner = THIS_MODULE,
-+ .read = ttml_read_gpio,
-+ .poll = ttml_poll_gpio,
-+ .ioctl = ttml_ioctl,
-+ .open = ttml_open,
-+ .release = ttml_release,
-+};
-+
-+static struct file_operations ttml_fops_button = {
-+ .owner = THIS_MODULE,
-+ .read = ttml_read_button,
-+ .poll = ttml_poll_button,
-+ .ioctl = ttml_ioctl,
-+ .open = ttml_open,
-+ .release = ttml_release,
-+};
-+
-+static int do_get_led(void __user * arg)
-+{
-+ struct ttml_ioctl_led a;
-+ int porte = readl(GPIO_PEDR);
-+ int portb = readl(GPIO_PBDR);
-+
-+ a.blue = (portb & 0x01) ? 1 : 0;
-+ a.red = (porte & 0x02) ? 1 : 0;
-+ a.yellow = (porte & 0x01) ? 1 : 0;
-+
-+ return (copy_to_user(arg, &a, sizeof(a)) == sizeof(a)) ? -EIO : 0;
-+}
-+
-+static int do_get_buzzer(void __user * arg)
-+{
-+ struct ttml_ioctl_buzzer a;
-+
-+ a.buzzer1 = 0; /* FIXME */
-+
-+ return (copy_to_user(arg, &a, sizeof(a)) == sizeof(a)) ? -EIO : 0;
-+}
-+
-+static int do_get_speedo(void __user * arg)
-+{
-+ struct ttml_ioctl_speedo a;
-+ unsigned char msg[3] = { 0xaa, 0x82, 0xd7 };
-+ unsigned char reply[10];
-+ int err;
-+
-+ err = ssp_do_ttml(&ep93xx_ssp_micro, msg, 3, reply, 10);
-+
-+ if (err != 0)
-+ return err;
-+
-+ a.instant = 0; /* FIXME */
-+ a.average = (reply[1] << 8) | (reply[2]);
-+
-+ return (copy_to_user(arg, &a, sizeof(a)) == sizeof(a)) ? -EIO : 0;
-+}
-+
-+static int do_get_gpio(void __user * arg)
-+{
-+ struct ttml_ioctl_gpio a;
-+ int porta = readl(GPIO_PADR);
-+ int portf = readl(GPIO_PFDR);
-+
-+ a.pto = (portf & 0x08) ? 0 : 1;
-+ a.ignition = (portf & 0x02) ? 0 : 1;
-+ a.spare = (porta & 0x08) ? 0 : 1;
-+
-+ return (copy_to_user(arg, &a, sizeof(a)) == sizeof(a)) ? -EIO : 0;
-+}
-+
-+static int do_get_button(void __user * arg)
-+{
-+ struct ttml_ioctl_button a;
-+ int portf = readl(GPIO_PFDR);
-+
-+ a.button1 = (portf & 0x04) ? 0 : 1;
-+
-+ return (copy_to_user(arg, &a, sizeof(a)) == sizeof(a)) ? -EIO : 0;
-+}
-+
-+static int do_set_led(void __user * arg)
-+{
-+ struct ttml_ioctl_led a;
-+ int porte = readl(GPIO_PEDR);
-+ int portb = readl(GPIO_PBDR);
-+
-+ if (copy_from_user(&a, arg, sizeof(a)))
-+ return -EIO;
-+
-+ if (a.yellow)
-+ porte |= 0x01;
-+ else
-+ porte &= ~0x01;
-+
-+ if (a.red)
-+ porte |= 0x02;
-+ else
-+ porte &= ~0x02;
-+
-+ if (a.blue)
-+ portb |= 0x01;
-+ else
-+ portb &= ~0x01;
-+
-+ writel(porte, GPIO_PEDR);
-+ writel(portb, GPIO_PBDR);
-+
-+ return 0;
-+}
-+
-+static int do_set_buzzer(void __user * arg)
-+{
-+ struct ttml_ioctl_buzzer a;
-+ unsigned char msg0[4] = { 0xaa, 0x93, 0x00, 0xc6 };
-+ unsigned char msg1[4] = { 0xaa, 0x93, 0x01, 0xc7 };
-+ unsigned char reply[10];
-+ int err = 0;
-+
-+ if (copy_from_user(&a, arg, sizeof(a)))
-+ return -EIO;
-+
-+ if (a.buzzer1)
-+ err = ssp_do_ttml(&ep93xx_ssp_micro, msg1, 4, reply, 10);
-+ else
-+ err = ssp_do_ttml(&ep93xx_ssp_micro, msg0, 4, reply, 10);
-+
-+ return err;
-+}
-+
-+static int ttml_read_gpio(struct file *filp, char __user * buf, size_t size,
-+ loff_t * off)
-+{
-+ DECLARE_WAITQUEUE(wait, current);
-+ struct ttml_event *g = NULL;
-+ int retval = -EINVAL;
-+
-+ if (size != sizeof(struct timeval))
-+ return -EINVAL;
-+
-+ add_wait_queue(&gpio_wait, &wait);
-+
-+ while (1) {
-+ unsigned long flags;
-+
-+ __set_current_state(TASK_INTERRUPTIBLE);
-+
-+ spin_lock_irqsave(&event_lock, flags);
-+ if (!list_empty(&gpio_events))
-+ list_for_each_entry(g, &gpio_events, l) {
-+ list_del(&g->l);
-+ break;
-+ }
-+
-+ spin_unlock_irqrestore(&event_lock, flags);
-+
-+ if (g != NULL)
-+ break;
-+
-+ if (filp->f_flags & O_NONBLOCK) {
-+ retval = -EAGAIN;
-+ goto out;
-+ }
-+
-+ if (signal_pending(current)) {
-+ retval = -ERESTARTSYS;
-+ goto out;
-+ }
-+
-+ schedule();
-+
-+ };
-+
-+ if (copy_to_user(buf, &g->t, sizeof(struct timeval)))
-+ retval = -EFAULT;
-+ else
-+ retval = sizeof(struct timeval);
-+
-+ kmem_cache_free(event_cachep, g);
-+
-+ out:
-+ current->state = TASK_RUNNING;
-+ remove_wait_queue(&gpio_wait, &wait);
-+
-+ return retval;
-+}
-+
-+static unsigned int ttml_poll_gpio(struct file *filp,
-+ struct poll_table_struct *poll)
-+{
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ poll_wait(filp, &gpio_wait, poll);
-+
-+ spin_lock_irqsave(&event_lock, flags);
-+ if (!list_empty(&gpio_events))
-+ retval = (POLLIN | POLLRDNORM);
-+ spin_unlock_irqrestore(&event_lock, flags);
-+
-+ return retval;
-+}
-+
-+static int ttml_read_button(struct file *filp, char __user * buf, size_t size,
-+ loff_t * off)
-+{
-+ DECLARE_WAITQUEUE(wait, current);
-+ struct ttml_event *b = NULL;
-+ int retval = -EINVAL;
-+
-+ if (size != sizeof(struct timeval))
-+ return -EINVAL;
-+
-+ add_wait_queue(&button_wait, &wait);
-+
-+ while (1) {
-+ unsigned long flags;
-+
-+ __set_current_state(TASK_INTERRUPTIBLE);
-+
-+ spin_lock_irqsave(&event_lock, flags);
-+ if (!list_empty(&button_events)) {
-+ list_for_each_entry(b, &button_events, l) {
-+ list_del(&b->l);
-+ break;
-+ }
-+ }
-+ spin_unlock_irqrestore(&event_lock, flags);
-+
-+ if (b != NULL)
-+ break;
-+
-+ if (filp->f_flags & O_NONBLOCK) {
-+ retval = -EAGAIN;
-+ goto out;
-+ }
-+
-+ if (signal_pending(current)) {
-+ retval = -ERESTARTSYS;
-+ goto out;
-+ }
-+
-+ schedule();
-+
-+ };
-+
-+ if (copy_to_user(buf, &b->t, sizeof(struct timeval)))
-+ retval = -EFAULT;
-+ else
-+ retval = sizeof(struct timeval);
-+
-+ kmem_cache_free(event_cachep, b);
-+
-+ out:
-+ current->state = TASK_RUNNING;
-+ remove_wait_queue(&button_wait, &wait);
-+
-+ return retval;
-+}
-+
-+static unsigned int ttml_poll_button(struct file *filp,
-+ struct poll_table_struct *poll)
-+{
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ poll_wait(filp, &button_wait, poll);
-+
-+ spin_lock_irqsave(&event_lock, flags);
-+ if (!list_empty(&button_events))
-+ retval = (POLLIN | POLLRDNORM);
-+ spin_unlock_irqrestore(&event_lock, flags);
-+
-+ return retval;
-+}
-+
-+static int ttml_ioctl(struct inode *inode, struct file *filp,
-+ unsigned int command, unsigned long arg)
-+{
-+ void __user *p = (void __user *)arg;
-+ const int minor = iminor(inode);
-+ int err = -ENOSYS;
-+
-+ switch (command) {
-+ case TTML_GET_LED:
-+ if (minor == TTML_MINOR_LED)
-+ err = do_get_led(p);
-+ break;
-+ case TTML_GET_BUZZER:
-+ if (minor == TTML_MINOR_BUZZER)
-+ err = do_get_buzzer(p);
-+ break;
-+ case TTML_GET_SPEEDO:
-+ if (minor == TTML_MINOR_SPEEDO)
-+ err = do_get_speedo(p);
-+ break;
-+ case TTML_GET_GPIO:
-+ if (minor == TTML_MINOR_GPIO)
-+ err = do_get_gpio(p);
-+ break;
-+ case TTML_GET_BUTTON:
-+ if (minor == TTML_MINOR_BUTTON)
-+ err = do_get_button(p);
-+ break;
-+ case TTML_SET_LED:
-+ if (minor == TTML_MINOR_LED)
-+ err = do_set_led(p);
-+ break;
-+ case TTML_SET_BUZZER:
-+ if (minor == TTML_MINOR_BUZZER)
-+ err = do_set_buzzer(p);
-+ break;
-+ }
-+
-+ return err;
-+}
-+
-+static int ttml_open(struct inode *inode, struct file *filp)
-+{
-+ const int minor = iminor(inode);
-+ int err = -EBUSY;
-+
-+ if (minor == TTML_MINOR_WD) {
-+ unsigned char msg[3] = { 0xaa, 0x82, 0xd7 };
-+ unsigned char reply[10];
-+ ssp_do_ttml(&ep93xx_ssp_micro, msg, 3, reply, 10);
-+ }
-+
-+ down(&mutex);
-+ if (minor_busy(minor))
-+ goto err;
-+ minor_get(minor);
-+ if (minor == TTML_MINOR_GPIO)
-+ filp->f_op = &ttml_fops_gpio;
-+ if (minor == TTML_MINOR_BUTTON)
-+ filp->f_op = &ttml_fops_button;
-+ err = 0;
-+
-+ err:
-+ up(&mutex);
-+ return err;
-+}
-+
-+static int ttml_release(struct inode *inode, struct file *filp)
-+{
-+ down(&mutex);
-+ minor_put(iminor(inode));
-+ up(&mutex);
-+ return 0;
-+}
-+
-+static int __init ttml_init(void)
-+{
-+ dev_t dev = MKDEV(TTML_MAJOR, 240);
-+ int err = -EIO;
-+ int i;
-+
-+ err = -ENOMEM;
-+ event_cachep = kmem_cache_create("ttml_event",
-+ sizeof(struct ttml_event),
-+ 0, 0, NULL, NULL);
-+ if (event_cachep == NULL)
-+ goto err;
-+
-+ err = -EIO;
-+ if (register_chrdev_region(dev, MAX_TTML_MINORS, "ttml"))
-+ goto err_uncache;
-+
-+ cdev_init(&ttml_cdev, &ttml_fops);
-+
-+ if (cdev_add(&ttml_cdev, dev, MAX_TTML_MINORS)) {
-+ kobject_put(&ttml_cdev.kobj);
-+ goto err_unreg;
-+ }
-+
-+ ttml_class = class_create(THIS_MODULE, "ttml");
-+
-+ if (IS_ERR(ttml_class)) {
-+ err = PTR_ERR(ttml_class);
-+ cdev_del(&ttml_cdev);
-+ goto err_unreg;
-+ }
-+
-+ for (i = 0; i < ARRAY_SIZE(devlist); i++)
-+ class_device_create(ttml_class,
-+ MKDEV(TTML_MAJOR, devlist[i].minor),
-+ NULL, "%s", devlist[i].name);
-+
-+ init_timer(&monitor_timer);
-+ setup_timer();
-+
-+ printk(KERN_INFO "TTML system devices version 0.1\n");
-+ return 0;
-+
-+ err_unreg:
-+ unregister_chrdev_region(dev, MAX_TTML_MINORS);
-+ err_uncache:
-+ kmem_cache_destroy(event_cachep);
-+ err:
-+ printk(KERN_WARNING "unable to register ttml devices\n");
-+ return err;
-+}
-+
-+static void __exit ttml_exit(void)
-+{
-+ struct ttml_event *b;
-+ int i;
-+
-+ /* stop our button polling timer */
-+ del_timer_sync(&monitor_timer);
-+
-+ /* delete any events captured but not yet read */
-+ list_for_each_entry(b, &button_events, l) {
-+ list_del(&b->l);
-+ kmem_cache_free(event_cachep, b);
-+ }
-+
-+ list_for_each_entry(b, &gpio_events, l) {
-+ list_del(&b->l);
-+ kmem_cache_free(event_cachep, b);
-+ }
-+
-+ /* free up the event cache */
-+ kmem_cache_destroy(event_cachep);
-+
-+ /* clean up the device */
-+ for (i = 0; i < ARRAY_SIZE(devlist); i++)
-+ class_device_destroy(ttml_class,
-+ MKDEV(TTML_MAJOR, devlist[i].minor));
-+ class_destroy(ttml_class);
-+ cdev_del(&ttml_cdev);
-+ unregister_chrdev_region(MKDEV(TTML_MAJOR, 240), MAX_TTML_MINORS);
-+}
-+
-+module_init(ttml_init);
-+module_exit(ttml_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi");
-+MODULE_DESCRIPTION("TTML system devices");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig
-index 344001b..b5a7a90 100644
---- a/drivers/char/watchdog/Kconfig
-+++ b/drivers/char/watchdog/Kconfig
-@@ -148,6 +148,17 @@ config MPCORE_WATCHDOG
- To compile this driver as a module, choose M here: the
- module will be called mpcore_wdt.
-
-+config EP93XX_WATCHDOG
-+ tristate "EP93xx Watchdog"
-+ depends on WATCHDOG && ARCH_EP93XX
-+ help
-+ Say Y here if to include support for the watchdog timer
-+ in the Cirrus EP93xx family of devices. This driver can
-+ be built as a module by choosing M. The module will
-+ be called ep93xx_wdt.
-+
-+ Say N if you are unsure.
-+
- # X86 (i386 + ia64 + x86_64) Architecture
-
- config ACQUIRE_WDT
-diff --git a/drivers/char/watchdog/Makefile b/drivers/char/watchdog/Makefile
-index cfd0a39..061671b 100644
---- a/drivers/char/watchdog/Makefile
-+++ b/drivers/char/watchdog/Makefile
-@@ -25,6 +25,7 @@ obj-$(CONFIG_USBPCWATCHDOG) += pcwd_usb.
- # ARM Architecture
- obj-$(CONFIG_21285_WATCHDOG) += wdt285.o
- obj-$(CONFIG_977_WATCHDOG) += wdt977.o
-+obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o
- obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o
- obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
- obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
-diff --git a/drivers/char/watchdog/ep93xx_wdt.c b/drivers/char/watchdog/ep93xx_wdt.c
-new file mode 100644
-index 0000000..a2a7a49
---- /dev/null
-+++ b/drivers/char/watchdog/ep93xx_wdt.c
-@@ -0,0 +1,210 @@
-+/*
-+ * drivers/watchdog/ep93xx_wdt.c
-+ *
-+ * Watchdog driver for Cirrus EP93xx family of devices.
-+ *
-+ * Author: Ray Lehtiniemi <rayl@mail.com>
-+ *
-+ * Copyright 2004 (c) Ray Lehtiniemi
-+ * Based on ep93xx driver.
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ */
-+
-+/*
-+ Todo:
-+
-+ - test last rst from watchdog status
-+ - test module loading
-+ - test nowayout
-+ - test all ioctl, add missing ones
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/watchdog.h>
-+#include <linux/init.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/bitops.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/arch/regmap.h>
-+
-+#define WD_VERSION "0.01"
-+
-+#ifdef CONFIG_WATCHDOG_NOWAYOUT
-+static int nowayout = 1;
-+#else
-+static int nowayout = 0;
-+#endif
-+
-+static unsigned long wdt_status;
-+static unsigned long boot_status;
-+
-+#define WDT_IN_USE 0
-+#define WDT_OK_TO_CLOSE 1
-+
-+static void wdt_enable(void)
-+{
-+ writel(0xaaaa, WATCHDOG);
-+}
-+
-+static void wdt_disable(void)
-+{
-+ writel(0xaa55, WATCHDOG);
-+}
-+
-+static void wdt_ping(void)
-+{
-+ writel(0x5555, WATCHDOG);
-+}
-+
-+static int ep93xx_wdt_open(struct inode *inode, struct file *file)
-+{
-+ if (test_and_set_bit(WDT_IN_USE, &wdt_status))
-+ return -EBUSY;
-+
-+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+ wdt_enable();
-+
-+ return 0;
-+}
-+
-+static ssize_t
-+ep93xx_wdt_write(struct file *file, const char __user * data, size_t len,
-+ loff_t * ppos)
-+{
-+ /* Can't seek (pwrite) on this device */
-+ if (*ppos != file->f_pos)
-+ return -ESPIPE;
-+
-+ if (len) {
-+ if (!nowayout) {
-+ size_t i;
-+
-+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+ for (i = 0; i != len; i++) {
-+ char c;
-+
-+ if (get_user(c, data + i))
-+ return -EFAULT;
-+
-+ if (c == 'V')
-+ set_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+ else
-+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+ }
-+ }
-+ wdt_ping();
-+ }
-+
-+ return len;
-+}
-+
-+static struct watchdog_info ident = {
-+ .options = WDIOF_CARDRESET | WDIOF_MAGICCLOSE,
-+ .identity = "EP93xx Watchdog",
-+};
-+
-+static int
-+ep93xx_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ int ret = -ENOIOCTLCMD;
-+
-+ switch (cmd) {
-+ case WDIOC_GETSUPPORT:
-+ ret = copy_to_user((struct watchdog_info __user *)arg, &ident,
-+ sizeof(ident)) ? -EFAULT : 0;
-+ break;
-+
-+ case WDIOC_GETSTATUS:
-+ ret = put_user(0, (int __user *)arg);
-+ break;
-+
-+ case WDIOC_GETBOOTSTATUS:
-+ ret = put_user(boot_status, (int __user *)arg);
-+ break;
-+
-+ case WDIOC_GETTIMEOUT:
-+ /* actually, it is 0.250 seconds.... */
-+ ret = put_user(1, (int __user *)arg);
-+ break;
-+
-+ case WDIOC_KEEPALIVE:
-+ wdt_ping();
-+ ret = 0;
-+ break;
-+ }
-+ return ret;
-+}
-+
-+static int ep93xx_wdt_release(struct inode *inode, struct file *file)
-+{
-+ if (test_bit(WDT_OK_TO_CLOSE, &wdt_status))
-+ wdt_disable();
-+ else
-+ printk(KERN_CRIT "WATCHDOG: Device closed unexpectedly - "
-+ "timer will not stop\n");
-+
-+ clear_bit(WDT_IN_USE, &wdt_status);
-+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+ return 0;
-+}
-+
-+static struct file_operations ep93xx_wdt_fops = {
-+ .owner = THIS_MODULE,
-+ .write = ep93xx_wdt_write,
-+ .ioctl = ep93xx_wdt_ioctl,
-+ .open = ep93xx_wdt_open,
-+ .release = ep93xx_wdt_release,
-+};
-+
-+static struct miscdevice ep93xx_wdt_miscdev = {
-+ .minor = WATCHDOG_MINOR,
-+ .name = "EP93xx Watchdog",
-+ .fops = &ep93xx_wdt_fops,
-+};
-+
-+static int __init ep93xx_wdt_init(void)
-+{
-+ int ret;
-+
-+ ret = misc_register(&ep93xx_wdt_miscdev);
-+
-+ boot_status = readl(WATCHDOG) & 0x01 ? 1 : 0;
-+
-+ printk("EP93xx Watchdog: Version " WD_VERSION "%s\n",
-+ (readl(WATCHDOG) & 0x08) ? " (nCS1 disable detected)"
-+ : "");
-+
-+ return ret;
-+}
-+
-+static void __exit ep93xx_wdt_exit(void)
-+{
-+ misc_deregister(&ep93xx_wdt_miscdev);
-+}
-+
-+module_init(ep93xx_wdt_init);
-+module_exit(ep93xx_wdt_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi <rayl@mail.com>");
-+MODULE_DESCRIPTION("EP93xx Watchdog");
-+
-+module_param(nowayout, int, 0);
-+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
-+
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
-diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
-index 4010fe9..895dfa8 100644
---- a/drivers/i2c/busses/Kconfig
-+++ b/drivers/i2c/busses/Kconfig
-@@ -95,6 +95,19 @@ config I2C_ELEKTOR
- This support is also available as a module. If so, the module
- will be called i2c-elektor.
-
-+config I2C_EP93XX
-+ tristate "Cirrus EP93XX interface"
-+ depends on I2C && ARCH_EP93XX
-+ select I2C_ALGOBIT
-+ help
-+ This supports the Cirrus EP93xx CPU family I2C bus. Choose this
-+ if you want to access I2C devices connected to EECLK and EEDAT pins
-+ of your EP93XX.
-+
-+ This support is also available as a module. If so, the module
-+ will be called i2c-ep93xx.
-+
-+
- config I2C_HYDRA
- tristate "CHRP Apple Hydra Mac I/O I2C interface"
- depends on I2C && PCI && PPC_CHRP && EXPERIMENTAL
-diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
-index f1df00f..fbb35f7 100644
---- a/drivers/i2c/busses/Makefile
-+++ b/drivers/i2c/busses/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_I2C_AMD756_S4882) += i2c-am
- obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o
- obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
- obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o
-+obj-$(CONFIG_I2C_EP93XX) += i2c-ep93xx.o
- obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o
- obj-$(CONFIG_I2C_I801) += i2c-i801.o
- obj-$(CONFIG_I2C_I810) += i2c-i810.o
-diff --git a/drivers/i2c/busses/i2c-ep93xx.c b/drivers/i2c/busses/i2c-ep93xx.c
-new file mode 100644
-index 0000000..1477bf3
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-ep93xx.c
-@@ -0,0 +1,180 @@
-+/* ------------------------------------------------------------------------ *
-+ * i2c-ep933xx.c I2C bus glue for Cirrus EP93xx *
-+ * ------------------------------------------------------------------------ *
-+
-+ Copyright (C) 2004 Michael Burian
-+
-+ Based on i2c-parport-light.c
-+ Copyright (C) 2003-2004 Jean Delvare <khali@linux-fr.org>
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ * ------------------------------------------------------------------------ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/delay.h>
-+#include <linux/i2c.h>
-+#include <linux/i2c-algo-bit.h>
-+#include <asm/io.h>
-+#include <asm/arch/regmap.h>
-+
-+/* 1/(2*clockfrequency) */
-+#define EE_DELAY_USEC 50
-+#define GPIOG_EECLK 1
-+#define GPIOG_EEDAT 2
-+
-+/* ----- I2C algorithm call-back functions and structures ----------------- */
-+
-+static void ep93xx_setscl(void *data, int state)
-+{
-+ unsigned int val, dir;
-+
-+ val = readl(GPIO_PGDR);
-+ dir = readl(GPIO_PGDDR);
-+
-+ /* Configure the clock line as output. */
-+ dir |= GPIOG_EECLK;
-+ writel(dir, GPIO_PGDDR);
-+
-+ /* Set clock line to state */
-+ if (state)
-+ val |= GPIOG_EECLK;
-+ else
-+ val &= ~GPIOG_EECLK;
-+
-+ writel(val, GPIO_PGDR);
-+}
-+
-+static void ep93xx_setsda(void *data, int state)
-+{
-+ unsigned int val, dir;
-+ val = readl(GPIO_PGDR);
-+ dir = readl(GPIO_PGDDR);
-+
-+ /* Configure the data line as output. */
-+ dir |= GPIOG_EEDAT;
-+ writel(dir, GPIO_PGDDR);
-+
-+ /* Set data line to state */
-+ if (state)
-+ val |= GPIOG_EEDAT;
-+ else
-+ val &= ~GPIOG_EEDAT;
-+
-+ writel(val, GPIO_PGDR);
-+}
-+
-+static int ep93xx_getscl(void *data)
-+{
-+ unsigned int val, dir;
-+ val = readl(GPIO_PGDR);
-+ dir = readl(GPIO_PGDDR);
-+
-+ /* Configure the clock line as input */
-+ dir &= ~GPIOG_EECLK;
-+ writel(dir, GPIO_PGDDR);
-+
-+ /* Return state of the clock line */
-+ return (readl(GPIO_PGDR) & GPIOG_EECLK) ? 1 : 0;
-+}
-+
-+static int ep93xx_getsda(void *data)
-+{
-+ unsigned int val, dir;
-+ val = readl(GPIO_PGDR);
-+ dir = readl(GPIO_PGDDR);
-+
-+ /* Configure the data line as input */
-+ dir &= ~GPIOG_EEDAT;
-+ writel(dir, GPIO_PGDDR);
-+
-+ /* Return state of the data line */
-+ return (readl(GPIO_PGDR) & GPIOG_EEDAT) ? 1 : 0;
-+}
-+
-+static struct i2c_algo_bit_data ep93xx_algo_data = {
-+ .setsda = ep93xx_setsda,
-+ .setscl = ep93xx_setscl,
-+ .getsda = ep93xx_getsda,
-+ .getscl = ep93xx_getscl,
-+ .udelay = EE_DELAY_USEC,
-+ .mdelay = EE_DELAY_USEC * 1000,
-+ .timeout = HZ,
-+};
-+
-+/* ----- I2c structure ---------------------------------------------------- */
-+
-+static struct i2c_adapter ep93xx_adapter = {
-+ .owner = THIS_MODULE,
-+ .class = I2C_CLASS_HWMON,
-+ .id = I2C_HW_B_LP,
-+ .algo_data = &ep93xx_algo_data,
-+ .name = "EP93XX I2C interface",
-+};
-+
-+/* ----- Module loading, unloading and information ------------------------ */
-+
-+static int __init i2c_ep93xx_init(void)
-+{
-+ unsigned long uiVal, uiDDR;
-+
-+ /* Read the current value of the GPIO data and data direction registers. */
-+ uiVal = readl(GPIO_PGDR);
-+ uiDDR = readl(GPIO_PGDDR);
-+
-+ /* If the GPIO pins have not been configured since reset, the data
-+ * and clock lines will be set as inputs and with data value of 0.
-+ * External pullup resisters are pulling them high.
-+ * Set them both high before configuring them as outputs. */
-+ uiVal |= (GPIOG_EEDAT | GPIOG_EECLK);
-+ writel(uiVal, GPIO_PGDR);
-+
-+ /* Delay to meet the EE Interface timing specification. */
-+ udelay(EE_DELAY_USEC);
-+
-+ /* Configure the EE data and clock lines as outputs. */
-+ writel(0x3, GPIO_EEDRIVE); /* use open drain outputs! */
-+ uiDDR |= (GPIOG_EEDAT | GPIOG_EECLK);
-+ writel(uiDDR, GPIO_PGDDR);
-+
-+ /* Delay to meet the EE Interface timing specification. */
-+ udelay(EE_DELAY_USEC);
-+
-+ /* Reset hardware to a sane state (SCL and SDA high) */
-+ ep93xx_setsda(NULL, 1);
-+ ep93xx_setscl(NULL, 1);
-+
-+ if (i2c_bit_add_bus(&ep93xx_adapter) < 0) {
-+ printk(KERN_ERR "i2c-ep93xx: Unable to register with I2C\n");
-+ return -ENODEV;
-+ }
-+
-+ return 0;
-+}
-+
-+static void __exit i2c_ep93xx_exit(void)
-+{
-+ i2c_bit_del_bus(&ep93xx_adapter);
-+}
-+
-+MODULE_AUTHOR("Michael Burian");
-+MODULE_DESCRIPTION("I2C bus glue for Cirrus EP93xx processors");
-+MODULE_LICENSE("GPL");
-+
-+module_init(i2c_ep93xx_init);
-+module_exit(i2c_ep93xx_exit);
-diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
-index f9fae28..45f9286 100644
---- a/drivers/i2c/chips/Kconfig
-+++ b/drivers/i2c/chips/Kconfig
-@@ -25,6 +25,18 @@ config SENSORS_DS1374
- This driver can also be built as a module. If so, the module
- will be called ds1374.
-
-+config SENSORS_DS1307
-+ tristate "Dallas Semiconductor DS1307 RTC"
-+ depends on I2C && EXPERIMENTAL
-+ help
-+ If you say yes here you get support for the Dallas Semiconductor
-+ DS1307 RTC. Usually only embedded devices will need this.
-+
-+ Only say yes here if your sure you have such a chip.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called ds1307.
-+
- config SENSORS_EEPROM
- tristate "EEPROM reader"
- depends on I2C && EXPERIMENTAL
-diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
-index 46178b5..90be351 100644
---- a/drivers/i2c/chips/Makefile
-+++ b/drivers/i2c/chips/Makefile
-@@ -3,6 +3,7 @@
- #
-
- obj-$(CONFIG_SENSORS_DS1337) += ds1337.o
-+obj-$(CONFIG_SENSORS_DS1307) += ds1307.o
- obj-$(CONFIG_SENSORS_DS1374) += ds1374.o
- obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
- obj-$(CONFIG_SENSORS_MAX6875) += max6875.o
-diff --git a/drivers/i2c/chips/ds1307.c b/drivers/i2c/chips/ds1307.c
-new file mode 100644
-index 0000000..76ea8b8
---- /dev/null
-+++ b/drivers/i2c/chips/ds1307.c
-@@ -0,0 +1,651 @@
-+/*
-+ * ds1307.c
-+ *
-+ * Device driver for Dallas Semiconductor's Real Time Controller DS1307.
-+ *
-+ * Copyright (C) 2002 Intrinsyc Software Inc.
-+ *
-+ * 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/config.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+
-+#include <linux/kernel.h>
-+#include <linux/poll.h>
-+#include <linux/i2c.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/rtc.h>
-+#include <linux/string.h>
-+#include <linux/miscdevice.h>
-+#include <linux/proc_fs.h>
-+
-+#include "ds1307.h"
-+
-+#undef DEBUG
-+#ifdef DEBUG
-+static unsigned int rtc_debug = DEBUG;
-+#define DPRINTK(i,x...) do { if (rtc_debug > (i)) printk(x); } while (0)
-+#else
-+#define rtc_debug 0 /* gcc will remove all the debug code for us */
-+#define DPRINTK(i,x...) do { } while (0)
-+#endif
-+
-+static unsigned short slave_address = DS1307_I2C_SLAVE_ADDR;
-+
-+struct i2c_driver ds1307_driver;
-+struct i2c_client *ds1307_i2c_client = 0;
-+
-+static unsigned short ignore[] = { I2C_CLIENT_END };
-+static unsigned short normal_addr[] = { DS1307_I2C_SLAVE_ADDR, I2C_CLIENT_END };
-+
-+static struct i2c_client_address_data addr_data = {
-+ normal_i2c: normal_addr,
-+ probe: ignore,
-+ ignore: ignore,
-+ force: ignore,
-+};
-+
-+static int ds1307_rtc_ioctl( struct inode *, struct file *, unsigned int, unsigned long);
-+static int ds1307_rtc_open(struct inode *inode, struct file *file);
-+static int ds1307_rtc_release(struct inode *inode, struct file *file);
-+
-+static struct file_operations rtc_fops = {
-+ owner: THIS_MODULE,
-+ ioctl: ds1307_rtc_ioctl,
-+ open: ds1307_rtc_open,
-+ release: ds1307_rtc_release,
-+};
-+
-+static struct miscdevice ds1307_rtc_miscdev = {
-+ RTC_MINOR,
-+ "rtc",
-+ &rtc_fops
-+};
-+
-+static int ds1307_probe(struct i2c_adapter *adap);
-+static int ds1307_detach(struct i2c_client *client);
-+static int ds1307_command(struct i2c_client *client, unsigned int cmd, void *arg);
-+
-+struct i2c_driver ds1307_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "DS1307",
-+ .id = I2C_DRIVERID_DS1307,
-+ .flags = I2C_DF_NOTIFY,
-+ .attach_adapter = ds1307_probe,
-+ .detach_client = ds1307_detach,
-+ .command = ds1307_command,
-+};
-+
-+static spinlock_t ds1307_rtc_lock = SPIN_LOCK_UNLOCKED;
-+
-+static int
-+ds1307_readram( char *buf, int len)
-+{
-+ unsigned long flags;
-+ unsigned char ad[1] = { 0 };
-+ int ret;
-+ struct i2c_msg msgs[2] = {
-+ { ds1307_i2c_client->addr , 0, 1, ad },
-+ { ds1307_i2c_client->addr , I2C_M_RD, len, buf } };
-+
-+ spin_lock_irqsave(&ds1307_rtc_lock, flags);
-+ ret = i2c_transfer(ds1307_i2c_client->adapter, msgs, 2);
-+ spin_unlock_irqrestore(&ds1307_rtc_lock,flags);
-+
-+ return ret;
-+}
-+
-+static void
-+ds1307_dumpram( void)
-+{
-+ unsigned char buf[DS1307_RAM_SIZE];
-+ int ret;
-+
-+ ret = ds1307_readram( buf, DS1307_RAM_SIZE);
-+
-+ if( ret > 0)
-+ {
-+ int i;
-+ for( i=0; i<DS1307_RAM_SIZE; i++)
-+ {
-+ printk ("%02X ", buf[i]);
-+ if( (i%8) == 7) printk ("\n");
-+ }
-+ printk ("\n");
-+ }
-+}
-+
-+static void
-+ds1307_enable_clock( int enable)
-+{
-+ unsigned char buf[2], ad[1] = { 0 };
-+ struct i2c_msg msgs[2] = {
-+ { ds1307_i2c_client->addr , 0, 1, ad },
-+ { ds1307_i2c_client->addr , I2C_M_RD, 1, buf }
-+ };
-+ unsigned char ctrl_info;
-+ int ret;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ if (enable)
-+ ctrl_info = SQW_ENABLE | RATE_32768HZ;
-+ else
-+ ctrl_info = SQW_DISABLE;
-+ ret = ds1307_command(ds1307_i2c_client, DS1307_SETCTRL, &ctrl_info);
-+ DPRINTK(2, "%s: set ctrl rtn'd %d\n", __FUNCTION__, ret);
-+
-+ /* read addr 0 (Clock-Halt bit and second counter */
-+ ret = i2c_transfer(ds1307_i2c_client->adapter, msgs, 2);
-+ DPRINTK(2, "%s: %s msg xfer rtn'd %d\n", __FUNCTION__, enable ? "enable" : "disable", ret);
-+
-+ if (enable)
-+ buf[1] = buf[0] & ~CLOCK_HALT; /* clear Clock-Halt bit */
-+ else
-+ buf[1] = buf[0] | CLOCK_HALT; /* set Clock-Halt bit */
-+ buf[0] = 0; /* control register address on DS1307 */
-+
-+ ret = i2c_master_send(ds1307_i2c_client, (char *)buf, 2);
-+ DPRINTK(2, "%s: master send rtn'd %d\n", __FUNCTION__, ret);
-+}
-+
-+static int
-+ds1307_get_datetime(struct i2c_client *client, struct rtc_time *dt);
-+
-+static int
-+ds1307_attach(struct i2c_adapter *adap, int addr, int kind)
-+{
-+ struct i2c_client *c;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ c = (struct i2c_client *)kmalloc(sizeof(*c), GFP_KERNEL);
-+ if (!c)
-+ return -ENOMEM;
-+ memset(c, 0, sizeof(*c));
-+
-+ strcpy(c->name, "DS1307");
-+ c->flags = 0;
-+ c->addr = addr;
-+ c->adapter = adap;
-+ c->driver = &ds1307_driver;
-+
-+ ds1307_i2c_client = c;
-+ ds1307_enable_clock(1);
-+
-+#define DS1307_SET_TIME_ON_BOOT
-+#ifdef DS1307_SET_TIME_ON_BOOT
-+ {
-+ struct rtc_time dt;
-+ ds1307_get_datetime(c, &dt);
-+ xtime.tv_sec = mktime(dt.tm_year + 1900,
-+ dt.tm_mon + 1, /* tm_mon starts from 0 */
-+ dt.tm_mday,
-+ dt.tm_hour,
-+ dt.tm_min,
-+ dt.tm_sec);
-+ }
-+#endif
-+
-+ return i2c_attach_client(c);
-+}
-+
-+static int
-+ds1307_probe(struct i2c_adapter *adap)
-+{
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ return i2c_probe(adap, &addr_data, ds1307_attach);
-+}
-+
-+static int
-+ds1307_detach(struct i2c_client *client)
-+{
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ i2c_detach_client(client);
-+ ds1307_enable_clock(0);
-+
-+ return 0;
-+}
-+
-+static void
-+ds1307_convert_to_time( struct rtc_time *dt, char *buf)
-+{
-+ dt->tm_sec = BCD_TO_BIN(buf[0]);
-+ dt->tm_min = BCD_TO_BIN(buf[1]);
-+
-+ if ( TWELVE_HOUR_MODE(buf[2]) )
-+ {
-+ dt->tm_hour = HOURS_12(buf[2]);
-+ if (HOURS_AP(buf[2])) /* PM */
-+ {
-+ dt->tm_hour += 12;
-+ }
-+ }
-+ else /* 24-hour-mode */
-+ {
-+ dt->tm_hour = HOURS_24(buf[2]);
-+ }
-+
-+ dt->tm_mday = BCD_TO_BIN(buf[4]);
-+ /* dt->tm_mon is zero-based */
-+ dt->tm_mon = BCD_TO_BIN(buf[5]) - 1;
-+ /* year is 1900 + dt->tm_year */
-+ dt->tm_year = BCD_TO_BIN(buf[6]) + 100;
-+
-+ if (rtc_debug > 1)
-+ {
-+ printk("ds1307_get_datetime: year = %d\n", dt->tm_year);
-+ printk("ds1307_get_datetime: mon = %d\n", dt->tm_mon);
-+ printk("ds1307_get_datetime: mday = %d\n", dt->tm_mday);
-+ printk("ds1307_get_datetime: hour = %d\n", dt->tm_hour);
-+ printk("ds1307_get_datetime: min = %d\n", dt->tm_min);
-+ printk("ds1307_get_datetime: sec = %d\n", dt->tm_sec);
-+ }
-+}
-+
-+static int
-+ds1307_get_datetime(struct i2c_client *client, struct rtc_time *dt)
-+{
-+ unsigned char buf[7], addr[1] = { 0 };
-+ struct i2c_msg msgs[2] = {
-+ { 0, 0, 1, addr },
-+ { 0, I2C_M_RD, 7, buf }
-+ };
-+ int ret = -EIO;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ if (client) {
-+
-+ msgs[0].addr = client->addr;
-+ msgs[1].addr = client->addr;
-+
-+ memset(buf, 0, sizeof(buf));
-+
-+ ret = i2c_transfer(client->adapter, msgs, 2);
-+
-+ if (ret == 2) {
-+ ds1307_convert_to_time( dt, buf);
-+ ret = 0;
-+ } else {
-+ DPRINTK(0, "%s: i2c_transfer() returned %d\n", __FUNCTION__, ret);
-+ }
-+ }
-+ return ret;
-+}
-+
-+static int
-+ds1307_set_datetime(struct i2c_client *client, struct rtc_time *dt, int datetoo)
-+{
-+ unsigned char buf[8];
-+ int ret, len = 4;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ if (!client) return -EIO;
-+
-+ if (rtc_debug > 1)
-+ {
-+ printk("ds1307_set_datetime: tm_year = %d\n", dt->tm_year);
-+ printk("ds1307_set_datetime: tm_mon = %d\n", dt->tm_mon);
-+ printk("ds1307_set_datetime: tm_mday = %d\n", dt->tm_mday);
-+ printk("ds1307_set_datetime: tm_hour = %d\n", dt->tm_hour);
-+ printk("ds1307_set_datetime: tm_min = %d\n", dt->tm_min);
-+ printk("ds1307_set_datetime: tm_sec = %d\n", dt->tm_sec);
-+ }
-+
-+ buf[0] = 0; /* register address on DS1307 */
-+ buf[1] = (BIN_TO_BCD(dt->tm_sec));
-+ buf[2] = (BIN_TO_BCD(dt->tm_min));
-+ buf[3] = (BIN_TO_BCD(dt->tm_hour));
-+
-+ if (datetoo) {
-+ len = 8;
-+ /* we skip buf[4] as we don't use day-of-week. */
-+ buf[5] = (BIN_TO_BCD(dt->tm_mday));
-+ buf[6] = (BIN_TO_BCD(dt->tm_mon + 1));
-+ /* The year only ranges from 0-99, we are being passed an offset from 1900,
-+ * and the chip calulates leap years based on 2000, thus we adjust by 100.
-+ */
-+ buf[7] = (BIN_TO_BCD(dt->tm_year - 100));
-+ }
-+ ret = i2c_master_send(client, (char *)buf, len);
-+ if (ret == len)
-+ ret = 0;
-+ else
-+ DPRINTK(0, "%s: i2c_master_send() returned %d\n", __FUNCTION__, ret);
-+
-+ return ret;
-+}
-+
-+static int
-+ds1307_get_ctrl(struct i2c_client *client, unsigned char *ctrl)
-+{
-+ unsigned char addr[1] = { 7 }; /* control register address on DS1307 */
-+ struct i2c_msg msgs[2] = {
-+ { 0, 0, 1, addr },
-+ { 0, I2C_M_RD, 1, ctrl }
-+ };
-+ int ret = -EIO;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ if (client) {
-+
-+ msgs[0].addr = client->addr;
-+ msgs[1].addr = client->addr;
-+
-+ *ctrl = 0;
-+
-+ ret = i2c_transfer(client->adapter, msgs, 2);
-+
-+ if (ret == 2) {
-+ DPRINTK(2, "%s: info %d\n", __FUNCTION__, *ctrl);
-+ ret = 0;
-+ } else {
-+ DPRINTK(0, "%s: i2c_transfer() returned %d\n", __FUNCTION__, ret);
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static int
-+ds1307_set_ctrl(struct i2c_client *client, unsigned char *cinfo)
-+{
-+ unsigned char buf[2];
-+ int ret;
-+
-+ buf[0] = 7; /* control register address on DS1307 */
-+ buf[1] = *cinfo;
-+
-+ DPRINTK(2, "%s: info %d\n", __FUNCTION__, buf[1]);
-+
-+ ret = i2c_master_send(client, (char *)buf, 2);
-+
-+ return ret;
-+}
-+
-+static int
-+ds1307_read_mem(struct i2c_client *client, struct rtc_mem *mem)
-+{
-+ unsigned char addr[1];
-+ struct i2c_msg msgs[2] = {
-+ { client->addr, 0, 1, addr },
-+ { client->addr, I2C_M_RD, mem->nr, mem->data }
-+ };
-+
-+ if ( (mem->loc < DS1307_RAM_ADDR_START) ||
-+ ((mem->loc + mem->nr -1) > DS1307_RAM_ADDR_END) )
-+ return -EINVAL;
-+
-+ addr[0] = mem->loc;
-+
-+ return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO;
-+}
-+
-+static int
-+ds1307_write_mem(struct i2c_client *client, struct rtc_mem *mem)
-+{
-+ unsigned char addr[1];
-+ struct i2c_msg msgs[2] = {
-+ { client->addr, 0, 1, addr },
-+ { client->addr, 0, mem->nr, mem->data }
-+ };
-+
-+ if ( (mem->loc < DS1307_RAM_ADDR_START) ||
-+ ((mem->loc + mem->nr -1) > DS1307_RAM_ADDR_END) )
-+ return -EINVAL;
-+
-+ addr[0] = mem->loc;
-+
-+ return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO;
-+}
-+
-+static int
-+ds1307_command(struct i2c_client *client, unsigned int cmd, void *arg)
-+{
-+ DPRINTK(1, "%s: cmd %d\n", __FUNCTION__, cmd);
-+
-+ switch (cmd) {
-+ case DS1307_GETDATETIME:
-+ return ds1307_get_datetime(client, arg);
-+
-+ case DS1307_SETTIME:
-+ return ds1307_set_datetime(client, arg, 0);
-+
-+ case DS1307_SETDATETIME:
-+ return ds1307_set_datetime(client, arg, 1);
-+
-+ case DS1307_GETCTRL:
-+ return ds1307_get_ctrl(client, arg);
-+
-+ case DS1307_SETCTRL:
-+ return ds1307_set_ctrl(client, arg);
-+
-+ case DS1307_MEM_READ:
-+ return ds1307_read_mem(client, arg);
-+
-+ case DS1307_MEM_WRITE:
-+ return ds1307_write_mem(client, arg);
-+
-+ default:
-+ return -EINVAL;
-+ }
-+}
-+
-+static int
-+ds1307_rtc_open(struct inode *inode, struct file *file)
-+{
-+ return 0;
-+}
-+
-+static int
-+ds1307_rtc_release(struct inode *inode, struct file *file)
-+{
-+ return 0;
-+}
-+
-+static int
-+ds1307_rtc_ioctl( struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ unsigned long flags;
-+ struct rtc_time wtime;
-+ int status = 0;
-+
-+ DPRINTK(2, "%s: cmd %c %x\n", __FUNCTION__, (char)(cmd>>8)&0xff, cmd&0xff);
-+
-+ switch (cmd) {
-+ default:
-+ case RTC_UIE_ON:
-+ case RTC_UIE_OFF:
-+ case RTC_PIE_ON:
-+ case RTC_PIE_OFF:
-+ case RTC_AIE_ON:
-+ case RTC_AIE_OFF:
-+ case RTC_ALM_SET:
-+ case RTC_ALM_READ:
-+ case RTC_IRQP_READ:
-+ case RTC_IRQP_SET:
-+ case RTC_EPOCH_READ:
-+ case RTC_EPOCH_SET:
-+ case RTC_WKALM_SET:
-+ case RTC_WKALM_RD:
-+ status = -EINVAL;
-+ break;
-+
-+ case RTC_RD_TIME:
-+ spin_lock_irqsave(&ds1307_rtc_lock, flags);
-+ ds1307_command( ds1307_i2c_client, DS1307_GETDATETIME, &wtime);
-+ spin_unlock_irqrestore(&ds1307_rtc_lock,flags);
-+
-+ if( copy_to_user((void *)arg, &wtime, sizeof (struct rtc_time)))
-+ status = -EFAULT;
-+ break;
-+
-+ case RTC_SET_TIME:
-+ if (!capable(CAP_SYS_TIME))
-+ {
-+ status = -EACCES;
-+ break;
-+ }
-+
-+ if (copy_from_user(&wtime, (struct rtc_time *)arg, sizeof(struct rtc_time)) )
-+ {
-+ status = -EFAULT;
-+ break;
-+ }
-+
-+ spin_lock_irqsave(&ds1307_rtc_lock, flags);
-+ ds1307_command( ds1307_i2c_client, DS1307_SETDATETIME, &wtime);
-+ spin_unlock_irqrestore(&ds1307_rtc_lock,flags);
-+ break;
-+ }
-+
-+ return status;
-+}
-+
-+static char *
-+ds1307_mon2str( unsigned int mon)
-+{
-+ char *mon2str[12] = {
-+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-+ };
-+ if( mon > 11) return "error";
-+ else return mon2str[ mon];
-+}
-+
-+static int ds1307_rtc_proc_output( char *buf)
-+{
-+#define CHECK(ctrl,bit) ((ctrl & bit) ? "yes" : "no")
-+ unsigned char ram[DS1307_RAM_SIZE];
-+ int ret;
-+
-+ char *p = buf;
-+
-+ ret = ds1307_readram( ram, DS1307_RAM_SIZE);
-+ if( ret > 0)
-+ {
-+ int i;
-+ struct rtc_time dt;
-+ char text[9];
-+
-+ p += sprintf(p, "DS1307 (64x8 Serial Real Time Clock)\n");
-+
-+ ds1307_convert_to_time( &dt, ram);
-+ p += sprintf(p, "Date/Time : %02d-%s-%04d %02d:%02d:%02d\n",
-+ dt.tm_mday, ds1307_mon2str(dt.tm_mon), dt.tm_year + 1900,
-+ dt.tm_hour, dt.tm_min, dt.tm_sec);
-+
-+ p += sprintf(p, "Clock halted : %s\n", CHECK(ram[0],0x80));
-+ p += sprintf(p, "24h mode : %s\n", CHECK(ram[2],0x40));
-+ p += sprintf(p, "Square wave enabled : %s\n", CHECK(ram[7],0x10));
-+ p += sprintf(p, "Freq : ");
-+
-+ switch( ram[7] & 0x03)
-+ {
-+ case RATE_1HZ:
-+ p += sprintf(p, "1Hz\n");
-+ break;
-+ case RATE_4096HZ:
-+ p += sprintf(p, "4.096kHz\n");
-+ break;
-+ case RATE_8192HZ:
-+ p += sprintf(p, "8.192kHz\n");
-+ break;
-+ case RATE_32768HZ:
-+ default:
-+ p += sprintf(p, "32.768kHz\n");
-+ break;
-+
-+ }
-+
-+ p += sprintf(p, "RAM dump:\n");
-+ text[8]='\0';
-+ for( i=0; i<DS1307_RAM_SIZE; i++)
-+ {
-+ p += sprintf(p, "%02X ", ram[i]);
-+
-+ if( (ram[i] < 32) || (ram[i]>126)) ram[i]='.';
-+ text[i%8] = ram[i];
-+ if( (i%8) == 7) p += sprintf(p, "%s\n",text);
-+ }
-+ p += sprintf(p, "\n");
-+ }
-+ else
-+ {
-+ p += sprintf(p, "Failed to read RTC memory!\n");
-+ }
-+
-+ return p - buf;
-+}
-+
-+static int ds1307_rtc_read_proc(char *page, char **start, off_t off,
-+ int count, int *eof, void *data)
-+{
-+ int len = ds1307_rtc_proc_output (page);
-+ if (len <= off+count) *eof = 1;
-+ *start = page + off;
-+ len -= off;
-+ if (len>count) len = count;
-+ if (len<0) len = 0;
-+ return len;
-+}
-+
-+static __init int ds1307_init(void)
-+{
-+ int retval=0;
-+
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+
-+ if (slave_address != 0xffff)
-+ {
-+ DPRINTK(2, "%s: slave address is %#x\n", __FUNCTION__, slave_address);
-+ normal_addr[0] = slave_address;
-+ }
-+
-+ if (normal_addr[0] == 0xffff)
-+ {
-+ printk(KERN_ERR"I2C: Invalid slave address for DS1307 RTC (%#x)\n",
-+ normal_addr[0]);
-+ return -EINVAL;
-+ }
-+
-+ retval = i2c_add_driver(&ds1307_driver);
-+
-+ if (retval==0)
-+ {
-+ misc_register (&ds1307_rtc_miscdev);
-+ create_proc_read_entry (PROC_DS1307_NAME, 0, 0, ds1307_rtc_read_proc, NULL);
-+ printk("I2C: DS1307 RTC driver successfully loaded\n");
-+ if (rtc_debug > 2) ds1307_dumpram();
-+ }
-+ return retval;
-+}
-+
-+static __exit void ds1307_exit(void)
-+{
-+ DPRINTK(1, "%s()\n", __FUNCTION__);
-+ remove_proc_entry (PROC_DS1307_NAME, NULL);
-+ misc_deregister(&ds1307_rtc_miscdev);
-+ i2c_del_driver(&ds1307_driver);
-+}
-+
-+module_init(ds1307_init);
-+module_exit(ds1307_exit);
-+
-+MODULE_PARM (slave_address, "i");
-+MODULE_PARM_DESC (slave_address, "I2C slave address for DS1307 RTC.");
-+
-+MODULE_AUTHOR ("Intrinsyc Software Inc.");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/i2c/chips/ds1307.h b/drivers/i2c/chips/ds1307.h
-new file mode 100644
-index 0000000..bf8cc20
---- /dev/null
-+++ b/drivers/i2c/chips/ds1307.h
-@@ -0,0 +1,54 @@
-+/*
-+ * ds1307.h
-+ *
-+ * Copyright (C) 2002 Intrinsyc Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ */
-+#ifndef DS1307_H
-+#define DS1307_H
-+
-+#define DS1307_I2C_SLAVE_ADDR 0x68
-+
-+#define DS1307_RAM_ADDR_START 0x08
-+#define DS1307_RAM_ADDR_END 0x3F
-+#define DS1307_RAM_SIZE 0x40
-+
-+#define PROC_DS1307_NAME "driver/ds1307"
-+
-+struct rtc_mem {
-+ unsigned int loc;
-+ unsigned int nr;
-+ unsigned char *data;
-+};
-+
-+#define DS1307_GETDATETIME 0
-+#define DS1307_SETTIME 1
-+#define DS1307_SETDATETIME 2
-+#define DS1307_GETCTRL 3
-+#define DS1307_SETCTRL 4
-+#define DS1307_MEM_READ 5
-+#define DS1307_MEM_WRITE 6
-+
-+#define SQW_ENABLE 0x10 /* Square Wave Enable */
-+#define SQW_DISABLE 0x00 /* Square Wave disable */
-+
-+#define RATE_32768HZ 0x03 /* Rate Select 32.768KHz */
-+#define RATE_8192HZ 0x02 /* Rate Select 8.192KHz */
-+#define RATE_4096HZ 0x01 /* Rate Select 4.096KHz */
-+#define RATE_1HZ 0x00 /* Rate Select 1Hz */
-+
-+#define CLOCK_HALT 0x80 /* Clock Halt */
-+
-+#define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)
-+#define BIN_TO_BCD(val) ((((val)/10)<<4) + (val)%10)
-+
-+#define TWELVE_HOUR_MODE(n) (((n)>>6)&1)
-+#define HOURS_AP(n) (((n)>>5)&1)
-+#define HOURS_12(n) BCD_TO_BIN((n)&0x1F)
-+#define HOURS_24(n) BCD_TO_BIN((n)&0x3F)
-+
-+#endif
-diff --git a/drivers/i2c/chips/ds1337.c b/drivers/i2c/chips/ds1337.c
-index 02682fb..6a28f08 100644
---- a/drivers/i2c/chips/ds1337.c
-+++ b/drivers/i2c/chips/ds1337.c
-@@ -338,12 +338,37 @@ exit:
- static void ds1337_init_client(struct i2c_client *client)
- {
- s32 val;
-+ u8 status, control;
-+
-+ /* On some boards, the RTC isn't configured by boot firmware.
-+ * Handle that case by starting/configuring the RTC now.
-+ */
-+ status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
-+ control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
-+
-+ if ((status & 0x80) || (control & 0x80)) {
-+ /* RTC not running */
-+ u8 buf[16];
-+ struct i2c_msg msg[1];
-+
-+ dev_dbg(&client->dev, "%s: RTC not running!\n", __FUNCTION__);
-+
-+ /* Initialize all, including STATUS and CONTROL to zero */
-+ memset(buf, 0, sizeof(buf));
-+ msg[0].addr = client->addr;
-+ msg[0].flags = 0;
-+ msg[0].len = sizeof(buf);
-+ msg[0].buf = &buf[0];
-+
-+ i2c_transfer(client->adapter, msg, 1);
-+ } else {
-+ /* Running: ensure that device is set in 24-hour mode */
-+ val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR);
-+ if ((val >= 0) && (val & (1 << 6)))
-+ i2c_smbus_write_byte_data(client, DS1337_REG_HOUR,
-+ val & 0x3f);
-+ }
-
-- /* Ensure that device is set in 24-hour mode */
-- val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR);
-- if ((val >= 0) && (val & (1 << 6)))
-- i2c_smbus_write_byte_data(client, DS1337_REG_HOUR,
-- val & 0x3f);
- }
-
- static int ds1337_detach_client(struct i2c_client *client)
-diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
-index 1c81174..e0fcc08 100644
---- a/drivers/ide/Kconfig
-+++ b/drivers/ide/Kconfig
-@@ -314,6 +314,18 @@ config BLK_DEV_CMD640_ENHANCED
- and your BIOS does not already do this for you, then say Y here.
- Otherwise say N.
-
-+config BLK_DEV_EP93XX
-+ bool "EP93xx support"
-+ depends on (ARCH_EP9312 || ARCH_EP9315)
-+ help
-+ If you want IDE support for your EP93xx based board say Y here.
-+
-+config BLK_DEV_IDEDMA_EP93XX
-+ bool "EP93xx DMA support"
-+ depends on BLK_DEV_EP93XX && EP93XX_DMA
-+ help
-+ If you want DMA support for your EP93xx based board say Y here.
-+
- config BLK_DEV_IDEPNP
- bool "PNP EIDE support"
- depends on PNP
-@@ -813,7 +825,7 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
- depends BLK_DEV_IDE_AU1XXX
-
- config IDE_ARM
-- def_bool ARM && (ARCH_A5K || ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
-+ def_bool ARM && (ARCH_A5K || ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK || BLK_DEV_EP93XX)
-
- config BLK_DEV_IDE_ICSIDE
- tristate "ICS IDE interface support"
-@@ -1047,7 +1059,7 @@ config BLK_DEV_UMC8672
- endif
-
- config BLK_DEV_IDEDMA
-- def_bool BLK_DEV_IDEDMA_PCI || BLK_DEV_IDEDMA_PMAC || BLK_DEV_IDEDMA_ICS || BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-+ def_bool BLK_DEV_IDEDMA_PCI || BLK_DEV_IDEDMA_PMAC || BLK_DEV_IDEDMA_ICS || BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA || BLK_DEV_IDEDMA_EP93XX
-
- config IDEDMA_IVB
- bool "IGNORE word93 Validation BITS"
-diff --git a/drivers/ide/arm/Makefile b/drivers/ide/arm/Makefile
-index 6a78f07..cf0f91a 100644
---- a/drivers/ide/arm/Makefile
-+++ b/drivers/ide/arm/Makefile
-@@ -2,5 +2,6 @@
- obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
- obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
- obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
-+obj-$(CONFIG_BLK_DEV_EP93XX) += ide-ep93xx.o
-
- EXTRA_CFLAGS := -Idrivers/ide
-diff --git a/drivers/ide/arm/ide-ep93xx.c b/drivers/ide/arm/ide-ep93xx.c
-new file mode 100644
-index 0000000..75fbbf5
---- /dev/null
-+++ b/drivers/ide/arm/ide-ep93xx.c
-@@ -0,0 +1,1957 @@
-+/*****************************************************************************
-+ *
-+ * drivers/ide/ide-ep93xx.c
-+ *
-+ * Copyright (c) 2003 Cirrus Logic, Inc.
-+ *
-+ * Some code based in whole or in part on:
-+ *
-+ * linux/drivers/ide/ide-dma.c Version 4.13 May 21, 2003
-+ *
-+ * Copyright (c) 1999-2000 Andre Hedrick <andre@linux-ide.org>
-+ * May be copied or modified under the terms of the GNU General Public License
-+ *
-+ * Portions Copyright Red Hat 2003
-+ *
-+ * Special Thanks to Mark for his Six years of work.
-+ *
-+ * Copyright (c) 1995-1998 Mark Lord
-+ * May be copied or modified under the terms of the GNU General Public License
-+ *
-+ *
-+ * Some code taken from the PowerMac implentation
-+ *
-+ * Copyright (C) 1998-2001 Paul Mackerras & Ben. Herrenschmidt
-+ *
-+ * 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
-+ *
-+ * ***************************************************************************
-+ *
-+ * Cirrus Logic's EP93XX architecture specific ide driver. This driver
-+ * supports the following ide transfer modes:
-+ * PIO modes 0 - 4
-+ * MDMA modes 0 - 2
-+ * UDMA modes 0 - 4
-+ *
-+ * 2/17/04 - TO - Initial DMA support. Only UDMA on ATA hard drives for now.
-+ *
-+ ****************************************************************************/
-+#include <linux/ide.h>
-+#include <linux/delay.h>
-+#include <asm/io.h>
-+#include <asm/ide.h>
-+#include <asm/io.h>
-+
-+#include <asm/arch/ide.h>
-+
-+#include <asm/arch/dma.h>
-+#include <asm/hardware.h>
-+
-+/*****************************************************************************
-+ *
-+ * Debugging macros
-+ *
-+ ****************************************************************************/
-+#undef DEBUG
-+ /* #define DEBUG 1 */
-+#ifdef DEBUG
-+#define DPRINTK( x... ) printk( ##x )
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+/*
-+ * IDE control register mask used when setting the CS0n, CS1n and DA bits
-+ * in this register.
-+ */
-+#define IDECR_REG_MASK (IDECtrl_CS0n | IDECtrl_CS1n | IDECtrl_DA_MASK)
-+
-+/*****************************************************************************
-+ *
-+ * Functions and macros for handling dma transfers.
-+ *
-+ ****************************************************************************/
-+#ifdef CONFIG_BLK_DEV_IDEDMA_EP93XX
-+
-+/*****************************************************************************
-+ *
-+ * Our Physical Region Descriptor (PRD) table should be large enough
-+ * to handle the biggest I/O request we are likely to see. Since requests
-+ * can have no more than 256 sectors, and since the typical blocksize is
-+ * two or more sectors, we could get by with a limit of 128 entries here for
-+ * the usual worst case. Most requests seem to include some contiguous blocks,
-+ * further reducing the number of table entries required.
-+ *
-+ * The driver reverts to PIO mode for individual requests that exceed
-+ * this limit (possible with 512 byte blocksizes, eg. MSDOS f/s), so handling
-+ * 100% of all crazy scenarios here is not necessary.
-+ *
-+ * As it turns out though, we must allocate a full 4KB page for this,
-+ * so the two PRD tables (ide0 & ide1) will each get half of that,
-+ * allowing each to have about 256 entries (8 bytes each) from this.
-+ *
-+ ****************************************************************************/
-+#define PRD_BYTES 8
-+#define PRD_ENTRIES (PAGE_SIZE / (2 * PRD_BYTES))
-+
-+/*****************************************************************************
-+ *
-+ * Global to keep track of the number of entries in the dma buffer
-+ * table for each transfer.
-+ *
-+ ****************************************************************************/
-+static int g_prd_count;
-+static unsigned int g_prd_total;
-+static unsigned int g_prd_returned;
-+static unsigned int g_dma_table_base;
-+
-+/*****************************************************************************
-+ *
-+ * Global to set during the dma callback function to indicate that from
-+ * the dma perspective, the transfer is complete.
-+ *
-+ ****************************************************************************/
-+static unsigned int g_done;
-+
-+/*****************************************************************************
-+ *
-+ * The following is directly from ide-dma.c.
-+ *
-+ ****************************************************************************/
-+struct drive_list_entry {
-+ const char *id_model;
-+ const char *id_firmware;
-+};
-+
-+static const struct
-+drive_list_entry drive_whitelist[] = {
-+ {"Micropolis 2112A", "ALL"},
-+ {"CONNER CTMA 4000", "ALL"},
-+ {"CONNER CTT8000-A", "ALL"},
-+ {"ST34342A", "ALL"},
-+ {NULL, NULL}
-+};
-+
-+static const struct
-+drive_list_entry drive_blacklist[] = {
-+ {"WDC AC11000H", "ALL"},
-+ {"WDC AC22100H", "ALL"},
-+ {"WDC AC32500H", "ALL"},
-+ {"WDC AC33100H", "ALL"},
-+ {"WDC AC31600H", "ALL"},
-+ {"WDC AC32100H", "24.09P07"},
-+ {"WDC AC23200L", "21.10N21"},
-+ {"Compaq CRD-8241B", "ALL"},
-+ {"CRD-8400B", "ALL"},
-+ {"CRD-8480B", "ALL"},
-+ {"CRD-8480C", "ALL"},
-+ {"CRD-8482B", "ALL"},
-+ {"CRD-84", "ALL"},
-+ {"SanDisk SDP3B", "ALL"},
-+ {"SanDisk SDP3B-64", "ALL"},
-+ {"SANYO CD-ROM CRD", "ALL"},
-+ {"HITACHI CDR-8", "ALL"},
-+ {"HITACHI CDR-8335", "ALL"},
-+ {"HITACHI CDR-8435", "ALL"},
-+ {"Toshiba CD-ROM XM-6202B", "ALL"},
-+ {"CD-532E-A", "ALL"},
-+ {"E-IDE CD-ROM CR-840", "ALL"},
-+ {"CD-ROM Drive/F5A", "ALL"},
-+ {"RICOH CD-R/RW MP7083A", "ALL"},
-+ {"WPI CDD-820", "ALL"},
-+ {"SAMSUNG CD-ROM SC-148C", "ALL"},
-+ {"SAMSUNG CD-ROM SC-148F", "ALL"},
-+ {"SAMSUNG CD-ROM SC", "ALL"},
-+ {"SanDisk SDP3B-64", "ALL"},
-+ {"SAMSUNG CD-ROM SN-124", "ALL"},
-+ {"PLEXTOR CD-R PX-W8432T", "ALL"},
-+ {"ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL"},
-+ {"_NEC DV5800A", "ALL"},
-+ {NULL, NULL}
-+};
-+
-+/*****************************************************************************
-+ *
-+ * This is directly from ide-dma.c
-+ *
-+ * in_drive_list - look for drive in black/white list
-+ * @id: drive identifier
-+ * @drive_table: list to inspect
-+ *
-+ * Look for a drive in the blacklist and the whitelist tables
-+ * Returns 1 if the drive is found in the table.
-+ *
-+ ****************************************************************************/
-+static int
-+in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
-+{
-+ for (; drive_table->id_model; drive_table++)
-+ if ((!strcmp(drive_table->id_model, id->model)) &&
-+ ((!strstr(drive_table->id_firmware, id->fw_rev)) ||
-+ (!strcmp(drive_table->id_firmware, "ALL"))))
-+ return 1;
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_intr() is the handler for disk read/write DMA interrupts
-+ *
-+ ****************************************************************************/
-+ide_startstop_t ep93xx_ide_dma_intr(ide_drive_t * drive)
-+{
-+ int i;
-+ byte stat, dma_stat;
-+
-+ DPRINTK("\n dma_intr \n");
-+
-+ /*
-+ * Disable the dma for this transfer and cleanup.
-+ */
-+ dma_stat = ep93xx_ide_dma_end(drive);
-+
-+ /*
-+ * Get status from the ide device.
-+ */
-+ stat = HWIF(drive)->INB(IDE_STATUS_REG);
-+
-+ if (OK_STAT(stat, DRIVE_READY, drive->bad_wstat | DRQ_STAT)) {
-+ if (!dma_stat) {
-+ struct request *rq = HWGROUP(drive)->rq;
-+
-+ for (i = rq->nr_sectors; i > 0;) {
-+ i -= rq->current_nr_sectors;
-+ DRIVER(drive)->end_request(drive, 1);
-+ }
-+
-+ return ide_stopped;
-+ }
-+
-+ printk("%s: dma_intr: bad DMA status (dma_stat=%x)\n",
-+ drive->name, dma_stat);
-+ }
-+
-+ return DRIVER(drive)->error(drive, __FUNCTION__, stat);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ide_build_sglist()
-+ *
-+ * Builds a table of buffers to be used by the dma. Each buffer consists
-+ * of a region of memory which is contiguous in virtual memory.
-+ *
-+ ****************************************************************************/
-+static int ide_build_sglist(ide_hwif_t * hwif, struct request *rq)
-+{
-+ struct buffer_head *buf_head;
-+ struct scatterlist *sg = hwif->sg_table;
-+ int nents = 0;
-+
-+ if (hwif->sg_dma_active)
-+ BUG();
-+
-+ DPRINTK("\nbuild_sglist: sg_table 0x%x, ", hwif->sg_table);
-+
-+ /*
-+ * Set up the direction of the command
-+ */
-+ if (rq->cmd == READ) {
-+ hwif->sg_dma_direction = EP93XX_DMA_FROMDEVICE;
-+ } else {
-+ hwif->sg_dma_direction = EP93XX_DMA_TODEVICE;
-+ }
-+
-+ /*
-+ * Get a pointer to the buffer head.
-+ */
-+ buf_head = rq->bh;
-+
-+ do {
-+ unsigned char *virt_addr = buf_head->b_data;
-+ unsigned int size = buf_head->b_size;
-+
-+ if (nents >= PRD_ENTRIES) {
-+ return 0;
-+ }
-+
-+ while ((buf_head = buf_head->b_reqnext) != NULL) {
-+ if ((virt_addr + size) !=
-+ (unsigned char *)buf_head->b_data) {
-+ break;
-+ }
-+
-+ size += buf_head->b_size;
-+ }
-+ memset(&sg[nents], 0, sizeof(*sg));
-+ sg[nents].address = virt_addr;
-+ sg[nents].length = size;
-+ nents++;
-+ } while (buf_head != NULL);
-+
-+ /*
-+ * This call to map_sg will return the number of entries
-+ * for which DMAable memory could be mapped.
-+ */
-+ return ep93xx_map_sg(sg, nents, hwif->sg_dma_direction);
-+}
-+
-+/****************************************************************************
-+ *
-+ * report_drive_dmaing()
-+ *
-+ ****************************************************************************/
-+int report_drive_dmaing(ide_drive_t * drive)
-+{
-+ struct hd_driveid *id = drive->id;
-+
-+ if ((id->field_valid & 4) && (eighty_ninty_three(drive)) &&
-+ (id->dma_ultra & (id->dma_ultra >> 14) & 3)) {
-+ if ((id->dma_ultra >> 15) & 1) {
-+ /*
-+ * UDMA enabled
-+ */
-+ printk(", UDMA(mode 7)");
-+ } else {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(133)");
-+ }
-+ } else if ((id->field_valid & 4) && (eighty_ninty_three(drive)) &&
-+ (id->dma_ultra & (id->dma_ultra >> 11) & 7)) {
-+ DPRINTK("\n report_drive_dmaing: %d \n", id->dma_ultra);
-+ if ((id->dma_ultra >> 13) & 1) {
-+ /*
-+ * UDMA enabled!
-+ */
-+ printk(", UDMA(100)");
-+ } else if ((id->dma_ultra >> 12) & 1) {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(66)");
-+ } else {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(44)");
-+ }
-+ } else if ((id->field_valid & 4) &&
-+ (id->dma_ultra & (id->dma_ultra >> 8) & 7)) {
-+ if ((id->dma_ultra >> 10) & 1) {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(33)");
-+ } else if ((id->dma_ultra >> 9) & 1) {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(25)");
-+ } else {
-+ /*
-+ * UDMA enabled.
-+ */
-+ printk(", UDMA(16)");
-+ }
-+ } else if (id->field_valid & 4) {
-+ /*
-+ * Can be enabled.
-+ */
-+ printk(", (U)DMA capable, but not enabled");
-+ } else {
-+ /*
-+ * maybe MDMA?
-+ */
-+ printk(", DMA");
-+ }
-+
-+ return 1;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ide_build_dmatable() prepares a dma request.
-+ * Returns 0 if all went okay, returns 1 otherwise.
-+ *
-+ ****************************************************************************/
-+int ide_build_dmatable(ide_drive_t * drive)
-+{
-+ unsigned int *table = HWIF(drive)->dmatable_cpu;
-+ unsigned int count = 0;
-+ int i;
-+ struct scatterlist *sg;
-+ unsigned int is_trm290_chipset = 0;
-+
-+ HWIF(drive)->sg_nents = i =
-+ ide_build_sglist(HWIF(drive), HWGROUP(drive)->rq);
-+
-+ if (!i)
-+ return 0;
-+
-+ sg = HWIF(drive)->sg_table;
-+
-+ while (i && sg_dma_len(sg)) {
-+ u32 cur_addr;
-+ u32 cur_len;
-+
-+ cur_addr = sg_dma_address(sg);
-+ cur_len = sg_dma_len(sg);
-+
-+ /* 1
-+ * Fill in the dma table, without crossing any 64kB boundaries.
-+ * Most hardware requires 16-bit alignment of all blocks,
-+ * but the trm290 requires 32-bit alignment.
-+ */
-+ while (cur_len) {
-+
-+ if (count++ >= PRD_ENTRIES) {
-+ printk("%s: DMA table too small\n",
-+ drive->name);
-+ goto use_pio_instead;
-+ } else {
-+ u32 xcount, bcount =
-+ 0x10000 - (cur_addr & 0xffff);
-+
-+ if (bcount > cur_len)
-+ bcount = cur_len;
-+ *table++ = cpu_to_le32(cur_addr);
-+ xcount = bcount & 0xffff;
-+ if (is_trm290_chipset)
-+ xcount = ((xcount >> 2) - 1) << 16;
-+ if (xcount == 0x0000) {
-+ /*
-+ * Most chipsets correctly interpret a length of 0x0000 as 64KB,
-+ * but at least one (e.g. CS5530) misinterprets it as zero (!).
-+ * So here we break the 64KB entry into two 32KB entries instead.
-+ */
-+ if (count++ >= PRD_ENTRIES) {
-+ printk
-+ ("%s: DMA table too small\n",
-+ drive->name);
-+ goto use_pio_instead;
-+ }
-+ *table++ = cpu_to_le32(0x8000);
-+ *table++ =
-+ cpu_to_le32(cur_addr + 0x8000);
-+ xcount = 0x8000;
-+ }
-+ *table++ = cpu_to_le32(xcount);
-+ cur_addr += bcount;
-+ cur_len -= bcount;
-+ }
-+ }
-+ sg++;
-+ i--;
-+ }
-+
-+ if (count) {
-+ if (!is_trm290_chipset)
-+ *--table |= cpu_to_le32(0x80000000);
-+ return count;
-+ }
-+ printk("%s: empty DMA table?\n", drive->name);
-+
-+ use_pio_instead:
-+ /*
-+ * Revert to PIO for this request.
-+ */
-+ HWIF(drive)->sg_dma_active = 0;
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ide_destroy_dmatable()
-+ *
-+ * Teardown mappings after DMA has completed.
-+ *
-+ ****************************************************************************/
-+void ide_destroy_dmatable(ide_drive_t * drive)
-+{
-+ /*
-+ * Restore the original dma table base address.
-+ */
-+ HWIF(drive)->dmatable_cpu = g_dma_table_base;
-+
-+ /*
-+ * Nothing much to do here.
-+ */
-+ HWIF(drive)->sg_dma_active = 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ide_release_dma()
-+ *
-+ * This function releases the memory allocated for the scatter gather list
-+ * and for the dma table, and frees the dma channel.
-+ *
-+ ****************************************************************************/
-+void ep93xx_ide_release_dma(ide_hwif_t * hwif)
-+{
-+ /*
-+ * Check if we have a valid dma handle.
-+ */
-+ if (hwif->hw.dma != NULL) {
-+ /*
-+ * Pause the DMA channel.
-+ */
-+ ep93xx_dma_pause(hwif->hw.dma, 1, 0);
-+
-+ /*
-+ * Flush the DMA channel
-+ */
-+ ep93xx_dma_flush(hwif->hw.dma);
-+ }
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_callback()
-+ *
-+ * Registered with the ep93xx dma driver and called at the end of the dma
-+ * interrupt handler, this function should process the dma buffers.
-+ *
-+ ****************************************************************************/
-+
-+static void
-+ep93xx_ide_callback(ep93xx_dma_int_t dma_int, ep93xx_dma_dev_t device,
-+ unsigned int user_data)
-+{
-+ ide_drive_t *drive = (ide_drive_t *) user_data;
-+ ide_hwif_t *hwif = HWIF(drive);
-+ unsigned int temp;
-+
-+ /*
-+ * Retrieve from the dma interface as many used buffers as are
-+ * available.
-+ */
-+ while (ep93xx_dma_remove_buffer(hwif->hw.dma, &temp) == 0) {
-+ g_prd_returned++;
-+
-+ }
-+
-+ /*
-+ * Add new buffers if we have any available.
-+ */
-+ while (g_prd_count) {
-+ /*
-+ * Check if this is a read or write operation.
-+ */
-+ if (hwif->sg_dma_direction == 2) {
-+ /*
-+ * Set up buffers for a read op.
-+ */
-+ temp =
-+ ep93xx_dma_add_buffer(hwif->hw.dma, hwif->dma_base,
-+ *hwif->dmatable_cpu++,
-+ *hwif->dmatable_cpu++, 0,
-+ g_prd_count);
-+ } else {
-+ /*
-+ * Set up buffers for a write op.
-+ */
-+ temp =
-+ ep93xx_dma_add_buffer(hwif->hw.dma,
-+ *hwif->dmatable_cpu++,
-+ hwif->dma_base,
-+ *hwif->dmatable_cpu++, 0,
-+ g_prd_count);
-+ }
-+
-+ /*
-+ * Add a buffer to the dma interface.
-+ */
-+ if (temp != 0) {
-+ /*
-+ * This buffer didn't make it into the dma
-+ * interface, so move the dma table pointer
-+ * to the start of the current entry.
-+ */
-+ hwif->dmatable_cpu -= 4;
-+ break;
-+ }
-+
-+ /*
-+ * Decrement the count of dmatable entries
-+ */
-+ g_prd_count--;
-+ }
-+
-+ /*
-+ * Check if the transfer is complete.
-+ */
-+ if (dma_int == DONE) {
-+ g_done = 1;
-+ }
-+
-+ if (g_prd_returned == g_prd_total) {
-+ g_done = 1;
-+ }
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_dma_timer_expiry()
-+ *
-+ *
-+ * dma_timer_expiry - handle a DMA timeout
-+ * @drive: Drive that timed out
-+ *
-+ * An IDE DMA transfer timed out. In the event of an error we ask
-+ * the driver to resolve the problem, if a DMA transfer is still
-+ * in progress we continue to wait (arguably we need to add a
-+ * secondary 'I dont care what the drive thinks' timeout here)
-+ * Finally if we have an interrupt we let it complete the I/O.
-+ * But only one time - we clear expiry and if it's still not
-+ * completed after WAIT_CMD, we error and retry in PIO.
-+ * This can occur if an interrupt is lost or due to hang or bugs.
-+ *
-+ *
-+ ****************************************************************************/
-+static int ep93xx_idedma_timer_expiry(ide_drive_t * drive)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+ u8 dev_stat = hwif->INB(IDE_ALTSTATUS_REG);
-+ u8 irq_stat = ep93xx_ide_regs->IDECR.Value & IDECtrl_INTRQ;
-+
-+ printk(KERN_WARNING
-+ "%s: dma_timer_expiry: dev status == 0x%02x, done= %d, irq= %d\n",
-+ drive->name, dev_stat, g_done, irq_stat);
-+
-+ /*
-+ * Check if the device is busy, or the dma engine is still working.
-+ */
-+ if ((dev_stat & 0x80) || !g_done) /* BUSY Stupid Early Timer !! */
-+ return (2 * WAIT_CMD);
-+
-+ /*
-+ * Clear the expiry handler in case we decide to wait more,
-+ * next time timer expires it is an error
-+ */
-+ HWGROUP(drive)->expiry = NULL;
-+
-+ /*
-+ * the device is not busy, so check if there's an error, or if the
-+ * interrupt is asserted.
-+ */
-+ if (dev_stat & 0x01) /* ERROR */
-+ return -1;
-+
-+ if (irq_stat || g_done) /* Got an Interrupt or the dma is done */
-+ return WAIT_CMD;
-+
-+ return 0; /* Unknown status -- reset the bus */
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_config_ide_dma()
-+ *
-+ * This function allocates dma-able memory and configures the ep93xx dma
-+ * interface for use with the ide interface. This only need be done
-+ * once for the interface. So, if this is the second drive, we don't have
-+ * much to do here.
-+ *
-+ ****************************************************************************/
-+static int ep93xx_config_ide_dma(ide_drive_t * drive)
-+{
-+ DPRINTK("ep93xx_config_ide_dma\n");
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_config_ide_device()
-+ *
-+ * This function sets up the ep93xx ide device for a dma transfer by first
-+ * probing to find the best dma mode supported by the device.
-+ *
-+ * Returns a 0 for success, and a 1 otherwise.
-+ *
-+ ****************************************************************************/
-+static unsigned int ep93xx_config_ide_device(ide_drive_t * drive)
-+{
-+ struct hd_driveid *id = drive->id;
-+ byte transfer = 0;
-+
-+ DPRINTK("%s: ep93xx_config_ide_device - dma on\n", HWIF(drive)->name);
-+
-+ /*
-+ * check if the device supports a udma mode.
-+ */
-+ if (transfer = (id->dma_ultra & 0x001F)) {
-+ DPRINTK("IDE: udma xfer support, transfer = %d \n", transfer);
-+
-+ /*
-+ * UDMA mode 4 support.
-+ */
-+ if (transfer & 0x10) {
-+ transfer = XFER_UDMA_4;
-+ }
-+ /*
-+ * UDMA mode 3 support.
-+ */
-+ else if (transfer & 0x08) {
-+ transfer = XFER_UDMA_3;
-+ }
-+ /*
-+ * UDMA mode 2.
-+ */
-+ else if (transfer & 0x04) {
-+ transfer = XFER_UDMA_2;
-+ }
-+ /*
-+ * UDMA mode 1.
-+ */
-+ else if (transfer & 0x02) {
-+ transfer = XFER_UDMA_1;
-+ }
-+ /*
-+ * UDMA mode 0.
-+ */
-+ else if (transfer & 0x01) {
-+ transfer = XFER_UDMA_0;
-+ }
-+ }
-+ /*
-+ * The device doesn't support a udma mode, so check if it
-+ * supports an mdma mode.
-+ */
-+ else if (transfer = (drive->id->dma_mword & 0x0007)) {
-+ DPRINTK("IDE: mdma support, transfer = %d \n", transfer);
-+
-+ /*
-+ * MDMA mode 2.
-+ */
-+ if (transfer & 0x04) {
-+ transfer = XFER_MW_DMA_2;
-+ }
-+ /*
-+ * MDMA mode 1.
-+ */
-+ else if (transfer & 0x02) {
-+ transfer = XFER_MW_DMA_1;
-+ }
-+ /*
-+ * MDMA mode 0.
-+ */
-+ else if (transfer & 0x01) {
-+ transfer = XFER_MW_DMA_0;
-+ }
-+ }
-+
-+ if (transfer == 0) {
-+ DPRINTK("IDE: config device failed \n");
-+
-+ /*
-+ * Fail.
-+ */
-+ return 1;
-+ }
-+
-+ if (ide_config_drive_speed(drive, transfer) == 0) {
-+ printk("%s: %s selected\n", drive->name,
-+ ide_xfer_verbose(transfer));
-+
-+ /*
-+ * Hold on to this value for use later.
-+ */
-+ drive->current_speed = transfer;
-+
-+ /*
-+ * Success, so turn on DMA.
-+ */
-+ return ep93xx_ide_dma_on(drive);
-+ } else {
-+ return ep93xx_ide_dma_off(drive);
-+ }
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_set_pio()
-+ *
-+ * Configures the ep93xx controller for a PIO mode transfer.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_set_pio(void)
-+{
-+ /*
-+ * Disable the interface.
-+ */
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 0;
-+
-+ /*
-+ * Enable PIO mode of operation.
-+ */
-+ ep93xx_ide_regs->IDECFG.Field.PIO = 1;
-+ ep93xx_ide_regs->IDECFG.Field.UDMA = 0;
-+ ep93xx_ide_regs->IDECFG.Field.MDMA = 0;
-+
-+ /*
-+ * Enable the IDE interface.
-+ */
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 1;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_rwproc()
-+ *
-+ * Initializes the ep93xx IDE controller interface with the transfer type,
-+ * transfer mode, and transfer direction.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_rwproc(ide_drive_t * drive, int action)
-+{
-+ unsigned int temp;
-+
-+ DPRINTK("\nep93xx_rwproc \n");
-+ /*
-+ * Configure the IDE controller for the specified transfer mode.
-+ */
-+ switch (drive->current_speed) {
-+ /*
-+ * Configure for an MDMA operation.
-+ */
-+ case XFER_MW_DMA_0:
-+ case XFER_MW_DMA_1:
-+ case XFER_MW_DMA_2:
-+ {
-+ DPRINTK("\n ep93xx set up for MDMA \n");
-+ ep93xx_ide_regs->IDECFG.Field.PIO = 0;
-+ ep93xx_ide_regs->IDECFG.Field.UDMA = 0;
-+ ep93xx_ide_regs->IDECFG.Field.MDMA = 1;
-+ ep93xx_ide_regs->IDECFG.Field.MODE =
-+ (0x3 & drive->current_speed);
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 1;
-+ ep93xx_ide_regs->IDEMDMAOP.Field.RWOP = action;
-+ ep93xx_ide_regs->IDEMDMAOP.Field.MEN = 1;
-+ break;
-+ }
-+
-+ /*
-+ * Configure for a UDMA operation.
-+ */
-+ case XFER_UDMA_0:
-+ case XFER_UDMA_1:
-+ case XFER_UDMA_2:
-+ case XFER_UDMA_3:
-+ case XFER_UDMA_4:
-+ {
-+ DPRINTK("\n ep93xx set up for UDMA \n");
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 0;
-+ ep93xx_ide_regs->IDEUDMAOP.Field.UEN = 0;
-+ ep93xx_ide_regs->IDECFG.Field.PIO = 0;
-+ ep93xx_ide_regs->IDECFG.Field.MDMA = 0;
-+ ep93xx_ide_regs->IDECFG.Field.UDMA = 0;
-+ ep93xx_ide_regs->IDECFG.Field.WST = 0;
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 1;
-+
-+ ep93xx_ide_regs->IDECFG.Field.MODE =
-+ (0x7 & drive->current_speed);
-+ ep93xx_ide_regs->IDECFG.Field.UDMA = 1;
-+ ep93xx_ide_regs->IDEUDMAOP.Field.RWOP = action;
-+ temp = ep93xx_ide_regs->IDEUDMAOP.Value;
-+ ep93xx_ide_regs->IDEUDMAOP.Field.UEN = 1;
-+ temp = ep93xx_ide_regs->IDEUDMAOP.Value;
-+
-+ DPRINTK("\nIDE Regs: config - 0x%x, udmaop - 0x%x \n",
-+ ep93xx_ide_regs->IDECFG.Value,
-+ ep93xx_ide_regs->IDEUDMAOP.Value);
-+
-+ break;;
-+ }
-+
-+ default:
-+ {
-+ break;
-+ }
-+ }
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_check()
-+ *
-+ * This function determines if the device supports dma transfers, and if it
-+ * does, then enables dma.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_check(ide_drive_t * drive)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+ struct hd_driveid *id = drive->id;
-+
-+ DPRINTK("%s: ep93xx_ide_dma_check \n", drive->name);
-+
-+ if (!id || !(id->capability & 1) || !hwif->autodma) {
-+ /*
-+ * Disable dma for this drive.
-+ */
-+ ep93xx_ide_dma_off(drive);
-+ }
-+
-+ /*
-+ * Consult the list of known "bad" drives
-+ */
-+ if (in_drive_list(id, drive_blacklist)) {
-+ printk("%s: Disabling DMA for %s (blacklisted)\n",
-+ drive->name, id->model);
-+
-+ /*
-+ * Disable dma for this drive.
-+ */
-+ ep93xx_ide_dma_off(drive);
-+ }
-+
-+ /*
-+ * Check if the drive supports multiword dma or udma modes.
-+ * If it does, then set the device up for that
-+ * type of dma transfer, and call ep93xx_ide_dma_on.
-+ */
-+ return ep93xx_config_ide_device(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_host_off()
-+ *
-+ * This function disables dma for the host.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_host_off(ide_drive_t * drive)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+
-+ /*
-+ * TODO: what's to be done here?
-+ */
-+ DPRINTK("%s: ep93xx_ide_dma_host_off() \n", drive->name);
-+
-+ /*
-+ * Release the dma channel and all memory allocated for dma
-+ * purposes.
-+ */
-+ ep93xx_ide_release_dma(hwif);
-+
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_off_quietly()
-+ *
-+ * This function, without announcing it, disables dma for the device.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_off_quietly(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_off_quietly: \n", drive->name);
-+
-+ /*
-+ * Clear the using_dma field to indicate that dma is disabled
-+ * for this drive.
-+ */
-+ drive->using_dma = 0;
-+
-+ /*
-+ * Disable dma on the host side.
-+ */
-+ ep93xx_ide_dma_host_off(drive);
-+
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_off()
-+ *
-+ * This function disables dma for the device.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_off(ide_drive_t * drive)
-+{
-+ printk("%s: DMA disabled\n", drive->name);
-+
-+ return ep93xx_ide_dma_off_quietly(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_on()
-+ *
-+ * This function enables dma for the device.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_on(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_on: \n", drive->name);
-+
-+ if (drive->using_dma) {
-+ DPRINTK("%s: ep93xx_ide_dma_on, already on! \n", drive->name);
-+ return 0;
-+ }
-+
-+ /*
-+ * Set the using_dma field to indicate that dma is enabled.
-+ */
-+ drive->using_dma = 1;
-+
-+ /*
-+ * Enable DMA on the host side.
-+ */
-+ return ep93xx_ide_dma_host_on(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_host_on()
-+ *
-+ * This function enables dma for the device.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_host_on(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_host_on: \n", drive->name);
-+
-+ /*
-+ * Enable the ep93xx dma interface for use with IDE.
-+ */
-+ return ep93xx_config_ide_dma(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_read()
-+ *
-+ * This function sets up a dma read operation.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_read(ide_drive_t * drive)
-+{
-+ unsigned int flags, result;
-+ ide_hwif_t *hwif = HWIF(drive);
-+
-+ DPRINTK("%s: ep93xx_ide_dma_read: \n", drive->name);
-+
-+ /*
-+ * Check if we are already transferring on this dma channel.
-+ */
-+ BUG_ON(hwif->sg_dma_active);
-+
-+ /*
-+ * Configure DMA M2M channel flags for a source address hold, h/w
-+ * initiated P2M transfer.
-+ */
-+ flags = (SOURCE_HOLD | TRANSFER_MODE_HW_P2M);
-+
-+ if (drive->current_speed & 0x20) {
-+ flags |= (WS_IDE_MDMA_READ_WRITE << WAIT_STATES_SHIFT);
-+
-+ /*
-+ * MDMA data register address.
-+ */
-+ hwif->dma_base = 0x800A001C;
-+ } else {
-+ flags |= (WS_IDE_UDMA_READ << WAIT_STATES_SHIFT);
-+
-+ /*
-+ * UDMA data register address.
-+ */
-+ hwif->dma_base = 0x800a0024;
-+ }
-+
-+ /*
-+ * Configure the dma interface for this IDE operation.
-+ */
-+ if (ep93xx_dma_config(hwif->hw.dma, 0, flags, ep93xx_ide_callback,
-+ (unsigned int)drive) != 0) {
-+ DPRINTK("%s: ep93xx_ide_dma_read: ERROR- dma config failed",
-+ drive->name);
-+
-+ /*
-+ * Fail.
-+ */
-+ return 1;
-+ }
-+
-+ /*
-+ * Build the table of dma-able buffers.
-+ */
-+ if (!(g_prd_count = ide_build_dmatable(drive))) {
-+ DPRINTK
-+ ("%s: ep93xx_ide_dma_read: ERROR- failed to build dma table",
-+ drive->name);
-+
-+ /*
-+ * Fail, try PIO instead of DMA
-+ */
-+ return 1;
-+ }
-+
-+ /*
-+ * Indicate that we're waiting for dma.
-+ */
-+ drive->waiting_for_dma = 1;
-+
-+ hwif->sg_dma_active = 1;
-+
-+ /*
-+ * test stuff
-+ */
-+ g_prd_total = g_prd_count;
-+ g_prd_returned = 0;
-+ g_dma_table_base = hwif->dmatable_cpu;
-+
-+ /*
-+ * Prepare the dma interface with some buffers from the
-+ * dma_table.
-+ */
-+ do {
-+ /*
-+ * Add a buffer to the dma interface.
-+ */
-+ result = ep93xx_dma_add_buffer(hwif->hw.dma, hwif->dma_base,
-+ *hwif->dmatable_cpu++,
-+ *hwif->dmatable_cpu++, 0,
-+ g_prd_count);
-+
-+ if (result != 0) {
-+ /*
-+ * This buffer didn't make it into the dma
-+ * interface, so move the dma table pointer
-+ * to the start of the current entry.
-+ */
-+ hwif->dmatable_cpu -= 4;
-+ break;
-+ }
-+
-+ /*
-+ * Decrement the count of dmatable entries
-+ */
-+ g_prd_count--;
-+
-+ } while (g_prd_count);
-+
-+ /*
-+ * Check if this is a disk or cd drive.
-+ */
-+ if (drive->media == ide_disk) {
-+ /*
-+ * Send the read command to the device.
-+ */
-+ ide_execute_command(drive, WIN_READDMA, &ep93xx_ide_dma_intr,
-+ 4 * WAIT_CMD, &ep93xx_idedma_timer_expiry);
-+
-+ }
-+
-+ /*
-+ * Configure the ep93xx ide controller for a dma read operation.
-+ */
-+ ep93xx_rwproc(drive, 0);
-+
-+ /*
-+ * initiate the dma transfer.
-+ */
-+ return ep93xx_ide_dma_begin(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_write()
-+ *
-+ * This function sets up a dma write operation.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_write(ide_drive_t * drive)
-+{
-+ unsigned int flags, result;
-+ ide_hwif_t *hwif = HWIF(drive);
-+
-+ DPRINTK("%s: ep93xx_ide_dma_write: \n", drive->name);
-+
-+ /*
-+ * Check if we are already transferring on this dma channel.
-+ */
-+ BUG_ON(hwif->sg_dma_active);
-+
-+ /*
-+ * Configure DMA M2M channel flags for a destination address
-+ * hold, h/w initiated M2P transfer.
-+ */
-+ flags = (DESTINATION_HOLD | TRANSFER_MODE_HW_M2P);
-+
-+ /*
-+ * Determine if we need the MDMA or UDMA data register.
-+ */
-+ if (drive->current_speed & 0x20) {
-+ flags |= (WS_IDE_MDMA_READ_WRITE << WAIT_STATES_SHIFT);
-+
-+ /*
-+ * MDMA data register address.
-+ */
-+ hwif->dma_base = 0x800A0018;
-+ } else {
-+ flags |= (WS_IDE_UDMA_WRITE << WAIT_STATES_SHIFT);
-+
-+ /*
-+ * UDMA data register address.
-+ */
-+ hwif->dma_base = 0x800a0020;
-+ }
-+
-+ /*
-+ * Configure the dma interface for this IDE operation.
-+ */
-+ if (ep93xx_dma_config(hwif->hw.dma, 0, flags, ep93xx_ide_callback,
-+ (unsigned int)drive) != 0) {
-+ return 1;
-+ }
-+
-+ /*
-+ * Build the table of dma-able buffers.
-+ */
-+ if (!(g_prd_count = ide_build_dmatable(drive))) {
-+ /*
-+ * Fail, try PIO instead of DMA
-+ */
-+ return 1;
-+ }
-+
-+ /*
-+ * Indicate that we're waiting for dma.
-+ */
-+ drive->waiting_for_dma = 1;
-+
-+ hwif->sg_dma_active = 1;
-+
-+ /*
-+ * test stuff
-+ */
-+ g_prd_total = g_prd_count;
-+ g_prd_returned = 0;
-+ g_dma_table_base = hwif->dmatable_cpu;
-+
-+ /*
-+ * Prepare the dma interface with some buffers from the
-+ * dma_table.
-+ */
-+ do {
-+ /*
-+ * Add a buffer to the dma interface.
-+ */
-+ result =
-+ ep93xx_dma_add_buffer(hwif->hw.dma, *hwif->dmatable_cpu++,
-+ hwif->dma_base, *hwif->dmatable_cpu++,
-+ 0, g_prd_count);
-+
-+ if (result != 0) {
-+ /*
-+ * This buffer didn't make it into the dma
-+ * interface, so move the dma table pointer
-+ * to the start of the current entry.
-+ */
-+ hwif->dmatable_cpu -= 4;
-+ break;
-+ }
-+
-+ /*
-+ * Decrement the count of dmatable entries
-+ */
-+ g_prd_count--;
-+
-+ } while (g_prd_count);
-+
-+ /*
-+ * Check if this is a disk or cd drive.
-+ */
-+ if (drive->media == ide_disk) {
-+ /*
-+ * Send the write dma command to the device.
-+ */
-+ ide_execute_command(drive, WIN_WRITEDMA, &ep93xx_ide_dma_intr,
-+ 4 * WAIT_CMD, &ep93xx_idedma_timer_expiry);
-+ }
-+
-+ /*
-+ * Configure the ep93xx ide controller for a dma read operation.
-+ */
-+ ep93xx_rwproc(drive, 1);
-+
-+ /*
-+ * initiate the dma transfer.
-+ */
-+ return ep93xx_ide_dma_begin(drive);
-+
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_begin()
-+ *
-+ * This function initiates a dma transfer.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_begin(ide_drive_t * drive)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+
-+ DPRINTK("%s: ep93xx_ide_dma_begin: \n", drive->name);
-+
-+ /* Note that this is done *after* the cmd has
-+ * been issued to the drive, as per the BM-IDE spec.
-+ * The Promise Ultra33 doesn't work correctly when
-+ * we do this part before issuing the drive cmd.
-+ */
-+ g_done = 0;
-+
-+ /*
-+ * Start the dma transfer.
-+ */
-+ ep93xx_dma_start(hwif->hw.dma, 1, NULL);
-+
-+ /*
-+ * TODO: not sure if we need to keep track of the end
-+ * of the transfer from the dma perspective, but
-+ * for now, let's do it.
-+ */
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_end()
-+ *
-+ * This function performs any tasks needed to cleanup after a dma transfer.
-+ * Returns 1 if an error occured, and 0 otherwise.
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_end(ide_drive_t * drive)
-+{
-+ unsigned char dev_stat;
-+ ide_hwif_t *hwif = HWIF(drive);
-+
-+ DPRINTK("%s: ep93xx_ide_dma_end: \n", drive->name);
-+
-+ /*
-+ * Indicate there's no dma transfer currently in progress.
-+ */
-+ drive->waiting_for_dma = 0;
-+
-+ /*
-+ * Put the dma interface into pause mode.
-+ */
-+ ep93xx_dma_pause(hwif->hw.dma, 1, 0);
-+ ep93xx_dma_flush(hwif->hw.dma);
-+
-+ /*
-+ * Enable PIO mode on the IDE interface.
-+ */
-+ ep93xx_set_pio();
-+
-+ /*
-+ * Read the ide device status register. This clears the interrupt.
-+ * TODO: should I read the alt status instead to prevent clearing
-+ * an asserted interrupt??
-+ */
-+ dev_stat = hwif->INB(IDE_STATUS_REG);
-+
-+ /*
-+ * Purge the contents of the dma table of buffer entries.
-+ */
-+ ide_destroy_dmatable(drive);
-+
-+ hwif->sg_dma_active = 0;
-+
-+ /*
-+ * If the error bit is set in the device status register,
-+ * return a positive value.
-+ */
-+ if (dev_stat & ERR_STAT) {
-+ printk("ide_dma_end: device error \n");
-+ return 1;
-+ } else {
-+ return 0;
-+ }
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_test_irq()
-+ *
-+ * This function checks if the IDE interrupt is asserted and returns a
-+ * 1 if it is, and 0 otherwise..
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_test_irq(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_test_irq: \n", drive->name);
-+
-+ if (!drive->waiting_for_dma)
-+ printk(KERN_WARNING "%s: (%s) called while not waiting\n",
-+ drive->name, __FUNCTION__);
-+
-+ /*
-+ * TODO: need to use the io macros to get this value.
-+ * Return the value of the IDE interrupt bit.
-+ */
-+ return (ep93xx_ide_regs->IDECR.Value & IDECtrl_INTRQ);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_bad_drive()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_bad_drive(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_bad_drive: \n", drive->name);
-+
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_good_drive()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_good_drive(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_good_drive: \n", drive->name);
-+
-+ /*
-+ * TODO: need to implement.
-+ */
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_count()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_count(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_count: \n", drive->name);
-+
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_verbose()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_verbose(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_verbose: \n", drive->name);
-+
-+ printk(", %s ", ide_xfer_verbose(drive->current_speed));
-+
-+ return 1;
-+
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_bad_timeout()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_timeout(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_timeout: \n", drive->name);
-+
-+ printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name);
-+ if (HWIF(drive)->ide_dma_test_irq(drive))
-+ return 0;
-+ return HWIF(drive)->ide_dma_end(drive);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_retune()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_retune(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_retune\n", drive->name);
-+ return 1;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_dma_lostirq()
-+ *
-+ ****************************************************************************/
-+int ep93xx_ide_dma_lostirq(ide_drive_t * drive)
-+{
-+ DPRINTK("%s: ep93xx_ide_dma_lostirq\n", drive->name);
-+ printk("%s: DMA interrupt recovery\n", drive->name);
-+
-+ return 1;
-+}
-+
-+#endif /* CONFIG_BLK_DEV_IDEDMA_EP93XX */
-+
-+/*****************************************************************************
-+ *
-+ * functions to set up the IDE control register and data register to read
-+ * or write a byte of data to/from the specified IDE device register.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_ide_outb(u8 b, unsigned long addr)
-+{
-+ unsigned int uiIDECR;
-+
-+ DPRINTK("ep93xx_ide_outb, addr:%02lx data: %04x\n", addr, b);
-+
-+ /*
-+ * Write the address out (CS0n, CS1n, DA) fields only.
-+ */
-+ uiIDECR = (readl(IDECtrl) & ~IDECR_REG_MASK) | (addr & IDECR_REG_MASK);
-+ writel(uiIDECR, IDECtrl);
-+
-+ writel((unsigned int)b, IDEDataOut);
-+
-+ /*
-+ * Toggle Write signal.
-+ */
-+ uiIDECR &= ~IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+ uiIDECR |= IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+}
-+
-+static void ep93xx_ide_outbsync(ide_drive_t * drive, u8 b, unsigned long addr)
-+{
-+ unsigned int uiIDECR;
-+
-+ DPRINTK("ep93xx_ide_outbsync, addr:%02lx data: %04x\n", addr, b);
-+
-+ /*
-+ * Write the address out (CS0n, CS1n, DA) fields only.
-+ */
-+ uiIDECR = (readl(IDECtrl) & ~IDECR_REG_MASK) | (addr & IDECR_REG_MASK);
-+ writel(uiIDECR, IDECtrl);
-+
-+ writel((unsigned int)b, IDEDataOut);
-+
-+ /*
-+ * Toggle Write signal.
-+ */
-+ uiIDECR &= ~IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+ uiIDECR |= IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+}
-+
-+static unsigned char ep93xx_ide_inb(unsigned long addr)
-+{
-+ unsigned int uiIDECR;
-+
-+ DPRINTK("ep93xx_ide_inb addr: %04lx ", addr);
-+
-+ /*
-+ * Write the address out (CS0n, CS1n, DA) fields only.
-+ */
-+ uiIDECR = (readl(IDECtrl) & ~IDECR_REG_MASK) | (addr & IDECR_REG_MASK);
-+ writel(uiIDECR, IDECtrl);
-+
-+ /*
-+ * Toggle Read signal.
-+ */
-+ uiIDECR &= ~IDECtrl_DIORn;
-+ writel(uiIDECR, IDECtrl);
-+ uiIDECR |= IDECtrl_DIORn;
-+ writel(uiIDECR, IDECtrl);
-+
-+ DPRINTK("data: %02x\n", readl(IDEDataIn));
-+ return (unsigned char)readl(IDEDataIn);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * functions to set up the IDE control register and data restister to read
-+ * or write 16 bits of data to/from the specified IDE device register.
-+ * These functions should only be used when reading/writing data to/from
-+ * the data register.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_ide_outw(u16 w, unsigned long addr)
-+{
-+ unsigned int uiIDECR;
-+
-+ DPRINTK("ep93xx_ide_outw addr: %04lx data: %04x\n", addr, w);
-+
-+ /*
-+ * Write the address out (CS0n, CS1n, DA) fields only.
-+ */
-+ uiIDECR = (readl(IDECtrl) & ~IDECR_REG_MASK) | (addr & IDECR_REG_MASK);
-+ writel(uiIDECR, IDECtrl);
-+
-+ writel((unsigned int)w, IDEDataOut);
-+
-+ /*
-+ * Toggle Write signal.
-+ */
-+ uiIDECR &= ~IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+ uiIDECR |= IDECtrl_DIOWn;
-+ writel(uiIDECR, IDECtrl);
-+}
-+
-+static u16 ep93xx_ide_inw(unsigned long addr)
-+{
-+ unsigned int uiIDECR;
-+
-+ DPRINTK("ep93xx_ide_inw addr: %04lx ", addr);
-+
-+ /*
-+ * Write the address out (CS0n, CS1n, DA) fields only.
-+ */
-+ uiIDECR = (readl(IDECtrl) & ~IDECR_REG_MASK) | (addr & IDECR_REG_MASK);
-+ writel(uiIDECR, IDECtrl);
-+
-+ /*
-+ * Toggle Read signal.
-+ */
-+ uiIDECR &= ~IDECtrl_DIORn;
-+ writel(uiIDECR, IDECtrl);
-+ uiIDECR |= IDECtrl_DIORn;
-+ writel(uiIDECR, IDECtrl);
-+
-+ DPRINTK("data: %04x\n", readl(IDEDataIn));
-+ return (unsigned short)readl(IDEDataIn);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * functions to read/write a block of data to/from the ide device using
-+ * PIO mode.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_ide_insw(unsigned long addr, void *buf, u32 count)
-+{
-+ unsigned short *data = (unsigned short *)buf;
-+ unsigned char status;
-+ DPRINTK("ep93xx_ide_insw\n");
-+
-+ /*
-+ * Read in data from the data register 16 bits at a time.
-+ */
-+ while (count) {
-+ /*
-+ * Read the status register.
-+ */
-+ status = ep93xx_ide_inb((STATUSREGISTER << 2) + 2);
-+
-+ /*
-+ * Check for the BSY to be clear and DRQ to be set.
-+ */
-+ if ((status & ATADRQ) && !(status & ATABSY)) {
-+ *data = ep93xx_ide_inw(addr);
-+ data++;
-+ count--;
-+ }
-+ }
-+}
-+
-+static void ep93xx_ide_outsw(unsigned long addr, void *buf, u32 count)
-+{
-+ unsigned short *data = (unsigned short *)buf;
-+ unsigned char status;
-+
-+ DPRINTK("ep93xx_ide_outsw\n");
-+
-+ /*
-+ * Write out data to the data register 16 bits at a time.
-+ */
-+ while (count) {
-+ /*
-+ * Read the status register.
-+ */
-+ status = ep93xx_ide_inb((STATUSREGISTER << 2) + 2);
-+
-+ /*
-+ * Check for the BSY to be clear and DRQ to be set.
-+ */
-+ if ((status & ATADRQ) && !(status & ATABSY)) {
-+ ep93xx_ide_outw(*data, addr);
-+ data++;
-+ count--;
-+ }
-+ }
-+}
-+
-+static void ep93xx_ide_outl(u32 l, unsigned long addr)
-+{
-+ printk("ep93xx_ide_outl\n");
-+}
-+
-+static u32 ep93xx_ide_inl(unsigned long addr)
-+{
-+ printk("ep93xx_ide_inl\n");
-+ return 0;
-+}
-+
-+static void ep93xx_ide_outsl(unsigned long addr, void *buf, u32 count)
-+{
-+ printk("ep93xx_ide_inl\n");
-+}
-+
-+static void ep93xx_ide_insl(unsigned long addr, void *buf, u32 count)
-+{
-+ printk("ep93xx_ide_inl\n");
-+}
-+
-+/*****************************************************************************
-+ *
-+ * Functions to read/write a block of data to/from the ide device using
-+ * PIO mode, using an ATAPI interface.
-+ *
-+ ****************************************************************************/
-+static void ep93xx_ide_insw_atapi(unsigned int addr, void *buf, int count)
-+{
-+ DPRINTK("ep93xx_ide_insw_atapi \n");
-+
-+ /*
-+ * Convert count from bytes to half words.
-+ */
-+ if (count % 2) {
-+ count = count / 2;
-+ count++;
-+ } else {
-+ count = count / 2;
-+ }
-+
-+ /*
-+ * Call the function which will read in the data.
-+ */
-+ ep93xx_ide_insw(addr, buf, count);
-+}
-+
-+static void ep93xx_ide_outsw_atapi(unsigned int addr, void *buf, int count)
-+{
-+ DPRINTK("ep93xx_ide_outsw_atapi \n");
-+
-+ /*
-+ * Convert count from bytes to half words.
-+ */
-+ if (count % 2) {
-+ count = count / 2;
-+ count++;
-+ } else {
-+ count = count / 2;
-+ }
-+
-+ /*
-+ * Call the function which will write out the data.
-+ */
-+ ep93xx_ide_outsw(addr, buf, count);
-+}
-+
-+void ep93xx_ata_input_data(ide_drive_t * drive, void *buffer, u32 count)
-+{
-+ DPRINTK("ep93xx_ata_input_data \n");
-+
-+ /*
-+ * Read in the specified number of half words from the ide interface.
-+ */
-+ ep93xx_ide_insw(IDE_DATA_REG, buffer, count << 1);
-+}
-+
-+void ep93xx_ata_output_data(ide_drive_t * drive, void *buffer, u32 count)
-+{
-+ DPRINTK("ep93xx_ata_output_data \n");
-+
-+ /*
-+ * write the specified number of half words from the ide interface
-+ * to the ide device.
-+ */
-+ ep93xx_ide_outsw(IDE_DATA_REG, buffer, count << 1);
-+}
-+
-+void ep93xx_atapi_input_bytes(ide_drive_t * drive, void *buffer, u32 count)
-+{
-+ DPRINTK("ep93xx_atapi_input_bytes \n");
-+
-+ /*
-+ * read in the specified number of bytes from the ide interface.
-+ */
-+ ep93xx_ide_insw_atapi(IDE_DATA_REG, buffer, count);
-+}
-+
-+void ep93xx_atapi_output_bytes(ide_drive_t * drive, void *buffer, u32 count)
-+{
-+ DPRINTK("ep93xx_atapi_output_bytes \n");
-+
-+ /*
-+ * Write the specified number of bytes from the ide interface
-+ * to the ide device.
-+ */
-+ ep93xx_ide_outsw_atapi(IDE_DATA_REG, buffer, count);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ep93xx_ide_init()
-+ *
-+ * This function sets up a pointer to the ep93xx specific ideproc funciton.
-+ *
-+ ****************************************************************************/
-+void ep93xx_ide_init(struct hwif_s *hwif)
-+{
-+
-+ DPRINTK("ep93xx_ide_init \n");
-+
-+ /*
-+ * Set up the HW interface function pointers with the ep93xx specific
-+ * function.
-+ */
-+ hwif->ata_input_data = ep93xx_ata_input_data;
-+ hwif->ata_output_data = ep93xx_ata_output_data;
-+ hwif->atapi_input_bytes = ep93xx_atapi_input_bytes;
-+ hwif->atapi_output_bytes = ep93xx_atapi_output_bytes;
-+
-+ hwif->OUTB = ep93xx_ide_outb;
-+ hwif->OUTBSYNC = ep93xx_ide_outbsync;
-+ hwif->OUTW = ep93xx_ide_outw;
-+ hwif->OUTL = ep93xx_ide_outl;
-+ hwif->OUTSW = ep93xx_ide_outsw;
-+ hwif->OUTSL = ep93xx_ide_outsl;
-+
-+ hwif->INB = ep93xx_ide_inb;
-+ hwif->INW = ep93xx_ide_inw;
-+ hwif->INL = ep93xx_ide_inl;
-+ hwif->INSW = ep93xx_ide_insw;
-+ hwif->INSL = ep93xx_ide_insl;
-+
-+#ifdef CONFIG_BLK_DEV_IDEDMA_EP93XX
-+
-+ DPRINTK("ep93xx_ide_init- dma enabled \n");
-+
-+ printk(" %s: SG-DMA", hwif->name);
-+
-+ /*
-+ * Allocate dma-able memory space, in one consistent chunk. The call
-+ * to alloc_consistent will return a virtual address and fill in a dma
-+ * physical address. (arch/arm/mm/consistent.c)
-+ *
-+ */
-+ hwif->dmatable_cpu = consistent_alloc(GFP_KERNEL | GFP_DMA,
-+ PRD_ENTRIES * PRD_BYTES,
-+ &hwif->dmatable_dma);
-+
-+ /*
-+ * Check if we allocated memory for dma
-+ */
-+ if (hwif->dmatable_cpu == NULL) {
-+ printk(" -- disabled, UNABLE TO ALLOCATE DMA TABLES\n");
-+ return;
-+ }
-+
-+ DPRINTK(" %s: EP93XX-DMA at 0x%x - 0x%x \n", hwif->name,
-+ hwif->dmatable_dma,
-+ (unsigned int)(hwif->dmatable_dma + (PRD_ENTRIES * PRD_BYTES)));
-+
-+ /*
-+ * Allocate memory for the scatterlist structures.
-+ */
-+ hwif->sg_table = kmalloc(sizeof(struct scatterlist) * PRD_ENTRIES,
-+ GFP_KERNEL);
-+
-+ /*
-+ * Check if we allocated the memory we expected to.
-+ */
-+ if (hwif->sg_table == NULL) {
-+ /*
-+ * Fail, so clean up.
-+ */
-+ consistent_free(hwif->dmatable_cpu, PRD_ENTRIES * PRD_BYTES,
-+ hwif->dmatable_dma);
-+ printk(" -- disabled, UNABLE TO ALLOCATE DMA TABLES\n");
-+ return;
-+ }
-+
-+ /*
-+ * Init the dma handle to 0. This field is used to hold a handle to the
-+ * dma instance.
-+ */
-+ hwif->hw.dma = NULL;
-+
-+ /*
-+ * Open an instance of the ep93xx dma interface.
-+ */
-+ if (ep93xx_dma_request(&hwif->hw.dma, hwif->name, DMA_IDE) != 0) {
-+ /*
-+ * Fail, so clean up.
-+ */
-+ consistent_free(hwif->dmatable_cpu, PRD_ENTRIES * PRD_BYTES,
-+ hwif->dmatable_dma);
-+ kfree(hwif->sg_table);
-+ printk(" -- disabled, unable to allocate DMA channel.\n");
-+ }
-+
-+ /*
-+ * Now that we've got a dma channel allocated, set up the rest of the
-+ * dma specific stuff.
-+ */
-+ else {
-+ DPRINTK("\n ide init- dma channel allocated: %d \n",
-+ hwif->hw.dma);
-+
-+ /*
-+ * Enable dma support for atapi devices.
-+ */
-+ hwif->atapi_dma = 1;
-+
-+ /*
-+ * TODO: how are these used?
-+ */
-+ hwif->mwdma_mask = 7; /* MW0..2 */
-+ hwif->ultra_mask = 7; /* SW0..2 */
-+
-+ hwif->speedproc = NULL;
-+ hwif->autodma = 1;
-+
-+ hwif->ide_dma_check = ep93xx_ide_dma_check;
-+ hwif->ide_dma_host_off = ep93xx_ide_dma_host_off;
-+ hwif->ide_dma_off_quietly = ep93xx_ide_dma_off_quietly;
-+ hwif->ide_dma_off = ep93xx_ide_dma_off;
-+ hwif->ide_dma_host_on = ep93xx_ide_dma_host_on;
-+ hwif->ide_dma_on = ep93xx_ide_dma_on;
-+ hwif->ide_dma_read = ep93xx_ide_dma_read;
-+ hwif->ide_dma_write = ep93xx_ide_dma_write;
-+ hwif->ide_dma_count = ep93xx_ide_dma_count;
-+ hwif->ide_dma_begin = ep93xx_ide_dma_begin;
-+ hwif->ide_dma_end = ep93xx_ide_dma_end;
-+ hwif->ide_dma_test_irq = ep93xx_ide_dma_test_irq;
-+ hwif->ide_dma_verbose = ep93xx_ide_dma_verbose;
-+ hwif->ide_dma_timeout = ep93xx_ide_dma_timeout;
-+ hwif->ide_dma_lostirq = ep93xx_ide_dma_lostirq;
-+
-+ printk(" capable%s\n", hwif->autodma ? ", auto-enable" : "");
-+ }
-+
-+#endif
-+}
-diff --git a/drivers/ide/arm/ide_arm.c b/drivers/ide/arm/ide_arm.c
-index 23488c4..cc411c2 100644
---- a/drivers/ide/arm/ide_arm.c
-+++ b/drivers/ide/arm/ide_arm.c
-@@ -20,6 +20,15 @@
- # define IDE_ARM_HOST (1)
- #endif
-
-+/* FIXME: Part 1 of dirty hack to get IDE working for EP93XX Processor */
-+#ifdef CONFIG_BLK_DEV_EP93XX
-+#include <asm/arch/ide.h>
-+#ifndef IRQ_HARDDISK
-+# define IRQ_HARDDISK -1
-+#endif
-+#endif
-+/* END OF HACK */
-+
- #ifdef CONFIG_ARCH_CLPS7500
- # include <asm/arch/hardware.h>
- #
-@@ -36,8 +45,15 @@ void __init ide_arm_init(void)
- hw_regs_t hw;
-
- memset(&hw, 0, sizeof(hw));
-+
-+/* FIXME: Part 2 of dirty hack to get IDE working for EP93XX Processor */
-+#ifdef CONFIG_BLK_DEV_EP93XX
-+ old_ide_init_default_hwifs();
-+#else
- ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
- hw.irq = IDE_ARM_IRQ;
- ide_register_hw(&hw, NULL);
-+#endif
- }
-+
- }
-diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
-index 4a91774..68c06fa 100644
---- a/drivers/input/keyboard/Kconfig
-+++ b/drivers/input/keyboard/Kconfig
-@@ -193,4 +193,38 @@ config KEYBOARD_HIL
- This driver implements support for HIL-keyboards attached
- to your machine, so normally you should say Y here.
-
-+config KEYBOARD_EP93XX
-+ tristate "EP93xx Keyboard support"
-+ depends on ARCH_EP93XX && INPUT && INPUT_KEYBOARD
-+ default y
-+ help
-+ This is support for the Cirrus EP93xx Keyboards. Say yes here if you
-+ have such a CPU, and choose some drivers below.
-+
-+config KEYBOARD_EP93XX_SPI
-+ bool "EP93xx PS2 Keyboard support"
-+ depends on KEYBOARD_EP93XX
-+ help
-+ Say Y here if you want support for a PS2 keyboard connected via SPI.
-+
-+config KEYBOARD_EP93XX_8X8
-+ bool "EP93xx 8x8 keypad matrix support"
-+ depends on KEYBOARD_EP93XX
-+ help
-+ Say Y here if you have a 8x8 keypad connected to your EP93xx.
-+ You might want to generate a custom keymap for it.
-+ If you do not have such a keypad, say N.
-+
-+config KEYBOARD_EP93XX_8X8_CYCLING
-+ bool "EP93xx 8x8 keypad matrix keycode cycling support"
-+ depends on KEYBOARD_EP93XX_8X8
-+ help
-+ Key cycling feature - assign more than one keycode per key.
-+ If you press such a key more than twice per second, alternative
-+ keycodes will be cycled through.
-+ This should result in a behavoir similar to some mobile phones.
-+ You might want to generate a custom keymap for this feature, too.
-+ See the sourcecode for known limitations.
-+ Say N unless you really need it.
-+
- endif
-diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
-index 9ce0b87..7ac6fca 100644
---- a/drivers/input/keyboard/Makefile
-+++ b/drivers/input/keyboard/Makefile
-@@ -17,4 +17,6 @@ obj-$(CONFIG_KEYBOARD_CORGI) += corgikb
- obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o
- obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
- obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
-+obj-$(CONFIG_KEYBOARD_EP93XX_8X8) += ep93xx_kbd_8x8.o
-+obj-$(CONFIG_KEYBOARD_EP93XX_SPI) += ep93xx_spi_kbd.o
-
-diff --git a/drivers/input/keyboard/ep93xx_kbd_8x8.c b/drivers/input/keyboard/ep93xx_kbd_8x8.c
-new file mode 100644
-index 0000000..d772381
---- /dev/null
-+++ b/drivers/input/keyboard/ep93xx_kbd_8x8.c
-@@ -0,0 +1,482 @@
-+/******************************************************************************
-+ *
-+ * File: linux/drivers/input/keyboard/ep93xx_kbd_8x8.c
-+ *
-+ * Purpose: Support for Cirrus EP93xx architecture core keyboard scanner.
-+ *
-+ *
-+ * History: 2005-08-10 Michael Burian added "cycling keys" support
-+ * 2004-05-28 Michael Burian ported to 2.6.6
-+ *
-+ * 010406 Norman Farquhar at LynuxWorks
-+ *
-+ * Initial version
-+ * - Will scan keyboard and feed keyboard.c, which translates
-+ * to input codes and puts them into tty console queue.
-+ * - Raw mode tbd
-+ * - keymaps other than default not supported
-+ * - does not support standby mode yet
-+ *
-+ * Limitations:
-+ * 1. The EP93xx is limited to supporting small keyboards
-+ * and cannot handle full PC style keyboards and key usage:
-+ * a) 64 key limit: 8x8 key matrix
-+ * b) limited to 2 keys down MAXIMUM,
-+ * which makes it impossible to support SHIFT+SHIFT+KEY
-+ * states like shift-control or control-alt keys.
-+ * 2. This means the default keyboard, 83key CherryG84-4001QAU/02,
-+ * will have some dead keys.
-+ *
-+ *
-+ * (c) Copyright 2001 LynuxWorks, Inc., San Jose, CA. All rights reserved.
-+ *
-+ *=============================================================================
-+ * Overview of EP93xx Scan Keyboard driver
-+ *=============================================================================
-+ *
-+ * The EP93xx scanned keyboard driver is a low-level hardware driver which
-+ * supports the core logic scanned keyboard controller block of the
-+ * EP93xx. These machines are embedded systems and this keyboard driver
-+ * can support small keyboards.
-+ *
-+ * The keyboard driver does not have a normal device driver interface
-+ * and instead interfaces to the keyboard.c driver through function calls.
-+ * Note that not all interface function calls are implemented at this time.
-+ * (see /asm/arch/keyboard.h for function definitions):
-+ *
-+ * ep93xxkbd_init
-+ * initializes the scan keyboard hw.
-+ *
-+ * handle_scancode
-+ * when scan controller generates interrupt, handler
-+ * used to pass scan codes to queue in keyboard.c with this function call.
-+ *
-+ * UPDATE: Now this is inplemented right here and just used as a
-+ * wrapper for the input layer
-+ *
-+ * Note that key scan codes will be delivered by this driver on both
-+ * key down and key up events, using a coding similar to PC XT keyboard.
-+ *
-+ * Note however that scan compatibility and key code compatibility
-+ * to PC standard are not required by Linux, and are not guaranteed.
-+ *
-+ ******************************************************************************/
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/input.h>
-+#include <linux/init.h>
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/arch/keyboard.h>
-+#include <asm/hardware.h>
-+
-+#ifdef CONFIG_KEYBOARD_EP93XX_8X8_CYCLING
-+#include "ep93xx_kbd_8x8_keymap-cycling.h"
-+#else
-+#include "ep93xx_kbd_8x8_keymap.h"
-+#endif
-+
-+#define EP93XX_KEYMAP_SIZE (8*8)
-+
-+/* #define DEBUG */
-+
-+#define KEYREG_KEY1_MASK 0x0000003F
-+#define KEYREG_KEY1_SHIFT 0
-+#define KEYREG_KEY2_MASK 0x00000Fc0
-+#define KEYREG_KEY2_SHIFT 6
-+
-+#define KEYREG_KEY1ROW_MASK 0x00000007
-+#define KEYREG_KEY1ROW_SHIFT 0
-+#define KEYREG_KEY1COL_MASK 0x00000038
-+#define KEYREG_KEY1COL_SHIFT 3
-+
-+#define KEYREG_KEY2ROW_MASK 0x000001c0
-+#define KEYREG_KEY2ROW_SHIFT 6
-+#define KEYREG_KEY2COL_MASK 0x00000E00
-+#define KEYREG_KEY2COL_SHIFT 9
-+
-+#define KEYREG_1KEY 0x00001000
-+#define KEYREG_2KEYS 0x00002000
-+#define KEYREG_INT 0x00004000
-+#define KEYREG_K 0x00008000
-+
-+#define SCANINIT_DIS3KY 0x00008000
-+
-+static struct input_dev *dev;
-+
-+#ifdef CONFIG_KEYBOARD_EP93XX_8X8_CYCLING
-+struct last_key_event {
-+ unsigned long jiffies;
-+ unsigned char scancode;
-+};
-+
-+static struct last_key_event lke;
-+
-+/**
-+ * handle_scancode - wrapper
-+ *
-+ * We need to do two things here:
-+ * 1. wrap old style (2.4.x) to 2.6.x input subsystem
-+ * 2. also implement the key cycling feature here.
-+ * CYCLING FEATURE:
-+ * If the same key is pressed withing 500ms, we send a delete
-+ * character to delete the former key, and use the keycode from the next layer
-+ * instead. This should result "mobile phone" like behavior.
-+ * KNOWN BUG:
-+ * This will mess up anything that depends on single keystrokes
-+ * (raw mode, non canonical mode, hotkeys, ...)
-+ * TODO 1:
-+ * A possible fix would be to delay till we know for sure what key it is
-+ * and send just that key, but in that case the user would have to type
-+ * blindly. :(
-+ * TODO 2:
-+ * A possible enhancement to the fix would be to provide some kind of preview
-+ * with an additional character device and write some userspace app to display
-+ * it in a seperate dialog.
-+ *
-+ */
-+static void handle_scancode(unsigned char scancode, int down)
-+{
-+ unsigned char row = (scancode & 0xF) - 1;
-+ unsigned char col = ((scancode & 0x70) >> 4);
-+ unsigned char index = row * 8 + col;
-+ static int layer = 0;
-+
-+ /*
-+ * straight forward processing in case of:
-+ * "up" events
-+ * repeated keypress events that happen after more than 500ms
-+ * after different key has been pressed ( ignore up/down! )
-+ * there are no alternative keycodes available
-+ */
-+ if (!down || time_before(lke.jiffies + msecs_to_jiffies(500), jiffies)
-+ || (lke.scancode & 0x7f) != (scancode &0x7F) ||
-+ (keycode[1][index] == KEY_RESERVED) ) {
-+ /* no cycling: process straightforward */
-+ input_report_key(dev, keycode[0][index], down);
-+ input_sync(dev);
-+
-+ /* end cycling on all but up events */
-+ if(down)
-+ layer=0;
-+ } else {
-+ /*
-+ * cycling mode:
-+ *
-+ * if we have an alternative keycode available:
-+ * 1. pretend the former key was wrong (and delete it)
-+ * 2. replace with the keycode from the next layer
-+ */
-+
-+ /* suppress real "up" events, as we fake immediate "up" here */
-+ if (!down)
-+ return;
-+
-+ /* switch to next layer, with wraparound */
-+ if(++layer >= 16)
-+ layer = 0;
-+
-+ /* if alternative keycodes are available */
-+ if (keycode[layer][index] != KEY_RESERVED) {
-+ /* pretend former key was wrong and delete it */
-+ input_report_key(dev, KEY_BACKSPACE, 1);
-+ input_report_key(dev, KEY_BACKSPACE, 0);
-+ } else {
-+ /* no more valid keycodes? => switch to layer 0 */
-+ layer=0;
-+ return;
-+ }
-+
-+ /* send alternative keycode */
-+ input_report_key(dev, keycode[layer][index], 1);
-+ input_report_key(dev, keycode[layer][index], 0);
-+ input_sync(dev);
-+
-+
-+ }
-+ lke.scancode = scancode;
-+ lke.jiffies = jiffies;
-+}
-+#else
-+/**
-+ * handle_scancode - wrapper
-+ *
-+ * wrap old style (2.4.x) to 2.6.x input subsystem
-+ */
-+static void handle_scancode(unsigned char scancode, int down)
-+{
-+ /* printk("handle_scancode(scancode=%04X, down=%d); %02X ", scancode, down, scancode &0x7f); */
-+
-+ unsigned char row = (scancode & 0xF) - 1;
-+ unsigned char col = ((scancode & 0x70) >> 4);
-+ unsigned char index = row * 8 + col;
-+
-+ input_report_key(dev, keycode[index], down);
-+ input_sync(dev);
-+
-+ /* printk("index=%02X\n", index); */
-+}
-+#endif
-+
-+static irqreturn_t ep93xxkbd_irq_handler(int irq, void *dev_id,
-+ struct pt_regs *regs)
-+{
-+ unsigned int keystat, key1, key2;
-+ static unsigned int lastkeystat = 0, lastkey1 = 0, lastkey2 = 0;
-+
-+ /* Note: IRQ_KEY automatically disabled before entry, */
-+ /* and reenabled after exit by Linux interrupt code. */
-+
-+ /* Reading status clears keyboard interrupt */
-+
-+ keystat = readl(KEY_REG) &
-+ (KEYREG_KEY1COL_MASK | KEYREG_KEY1ROW_MASK |
-+ KEYREG_KEY2COL_MASK | KEYREG_KEY2ROW_MASK |
-+ KEYREG_1KEY | KEYREG_2KEYS);
-+
-+#ifdef DEBUG /* DEBUGGING */
-+ if (keystat == lastkeystat)
-+ printk("ep93xx_scan_keyb: spurious interrupt, stat %x\n",
-+ keystat);
-+ else
-+ printk("ep93xx_scan_keyb: interrupt, stat %x\n", keystat);
-+#endif
-+ if (keystat & KEYREG_1KEY)
-+ key1 =
-+ KEYCODE((keystat & KEYREG_KEY1ROW_MASK) >>
-+ KEYREG_KEY1ROW_SHIFT,
-+ (keystat & KEYREG_KEY1COL_MASK) >>
-+ KEYREG_KEY1COL_SHIFT);
-+ else
-+ key1 = 0; /* invalid */
-+
-+ if (keystat & KEYREG_2KEYS)
-+ key2 =
-+ KEYCODE((keystat & KEYREG_KEY2ROW_MASK) >>
-+ KEYREG_KEY2ROW_SHIFT,
-+ (keystat & KEYREG_KEY2COL_MASK) >>
-+ KEYREG_KEY2COL_SHIFT);
-+ else
-+ key2 = 0; /* invalid */
-+
-+ /*
-+ * This 'monster' decision tree is used to decide what to report
-+ * when last key state has changed to current key state.
-+ * This may involve up to 4 keys changing state simultaneously:
-+ * lastkey1, lastkey2 going up and key1, key2 going down.
-+ *
-+ * We use keyboard scanner hardware guarantees to simplify the logic:
-+ * key1 < key2 if both are valid
-+ * key1 is valid if key2 is valid
-+ *
-+ * handle_scancode called with down and up scancodes
-+ * scancode = keycode when down
-+ * scancode = keycode|KBUP when up
-+ *
-+ * Note that if more than one keys change state in the same scan period,
-+ * then we really do NOT know the order in which the key events occurred.
-+ * Our default behavior is to always report key up events before key down
-+ * events. However, multiple key up events or multiple key down events
-+ * will be reported in no special order.
-+ */
-+ if (!(lastkeystat & (KEYREG_1KEY | KEYREG_2KEYS))) { /* No keys down lasttime */
-+ if (key1)
-+ handle_scancode(key1, 1);
-+ if (key2)
-+ handle_scancode(key2, 1);
-+ } else if (lastkey1 == key1) { /* means key still down */
-+ /* no change for key1 or lastkey1, both valid */
-+ if (lastkey2 != key2) {
-+ /* lastkey2 went up if valid, key2 went down if valid */
-+ if (lastkey2)
-+ handle_scancode(lastkey2 | KBUP, 0);
-+ if (key2)
-+ handle_scancode(key2, 1);
-+ }
-+ /* else no change for all keys */
-+ } else if (key1)
-+ { /* key1 valid and */
-+ /* lastkey1 valid (because NOT no keys lasttime) */
-+ if (lastkey1 == key2) {
-+ /* no change for lastkey1 or key2 */
-+ /* lastkey2 went up if valid, key1 went down */
-+ if (lastkey2)
-+ handle_scancode(lastkey2 | KBUP, 0);
-+ handle_scancode(key1, 1);
-+
-+ } else {
-+ /* we know: lastkey1 valid and went up, key1 valid */
-+ handle_scancode(lastkey1 | KBUP, 0);
-+
-+ if (lastkey2 == key1) {
-+ /* no change for lastkey2 or key1 */
-+ /* key2 went down if valid */
-+ if (key2)
-+ handle_scancode(key2, 1);
-+
-+ } else {
-+ if (lastkey2 != key2) {
-+ /* lastkey2 went up if valid */
-+ /* key2 went down if valid */
-+ if (lastkey2)
-+ handle_scancode(lastkey2 | KBUP,
-+ 0);
-+ if (key2)
-+ handle_scancode(key2, 1);
-+ }
-+ /* else no change for lastkey2 or key2 */
-+
-+ /* key1 valid and went down */
-+ handle_scancode(key1, 1);
-+ }
-+ }
-+ } else {
-+ /* key1 not valid and */
-+ /* lastkey1 valid (because NOT no keys lasttime) */
-+
-+ /* key1 not valid means both key1, key2 not valid */
-+ /* so lastkey1 went up and lastkey2 went up if valid */
-+ handle_scancode(lastkey1 | KBUP, 0);
-+ if (lastkey2)
-+ handle_scancode(lastkey2 | KBUP, 0);
-+ }
-+
-+ lastkeystat = keystat;
-+ lastkey1 = key1;
-+ lastkey2 = key2;
-+ return IRQ_HANDLED;
-+}
-+
-+int __init ep93xxkbd_init(void)
-+{
-+ int i = 3;
-+ unsigned int uiTemp;
-+ int error = 0;
-+
-+ dev = input_allocate_device();
-+ if (!dev) {
-+ printk(KERN_ERR "ep93xx_kbd_8x8: not enough memory for input device\n");
-+ return -ENOMEM;
-+ }
-+
-+ dev->name = "Cirrus EP93xx 8x8 keypad matrix driver";
-+ dev->phys = "input0";
-+ dev->id.bustype = BUS_HOST;
-+ dev->evbit[0] = BIT(EV_KEY);
-+
-+ printk("%s\n", dev->name);
-+
-+ /* Make sure scanner enabled, active and that */
-+ /* Keyboard ROW/COL interface enabled. */
-+
-+ uiTemp = readl(SYSCON_DEVCFG);
-+
-+ uiTemp &= ~(SYSCON_DEVCFG_KEYS | SYSCON_DEVCFG_GONK);
-+
-+ SysconSetLocked(SYSCON_DEVCFG, ep93xx_SYSCON_DEVCFG(uiTemp));
-+
-+ /* SYSCON locked automatically now after RSTCR written */
-+
-+ /* Enable Keyboard Clock and select clock rate
-+ *
-+ * TBD Boot ROM has already inited KTDIV = 0x20018004
-+ * TBD Measured default 64usec scan period with scope.
-+
-+ * Assume that GPIO registers do not impact row,col pins since
-+ * they are assigned to keyboard scanner.
-+
-+ * Setup Keyboard Scanner
-+ *
-+ * Note that we change the scanner parameters on the fly
-+ * while it is running, which is okay. No need to disable
-+ * scanner while tweaking these.
-+ *
-+ * TBD Keyboard scan rate will change as master clocks/dividers change
-+ *
-+ * For now, this gives us measured rate of about 480Hz row scan rate,
-+ * which implies 60Hz full kbd scan rate. Together with debounce
-+ * count of 3, means debounce period = 3/60Hz = 50ms>30ms recommended,
-+ * so okay.
-+ */
-+ writel((0x00FC00FA | SCANINIT_DIS3KY), SCANINIT);
-+
-+ /*TBD If too much capacitance on keyboard */
-+ /* writel( (0x00FC0020 | SCBACK | SCDIS3KEY), SCANINIT ); */
-+
-+ uiTemp = readl(SYSCON_KTDIV) | SYSCON_KTDIV_KEN;
-+
-+ SysconSetLocked(SYSCON_KTDIV, uiTemp);
-+
-+ error =
-+ request_irq(IRQ_KEY, ep93xxkbd_irq_handler, 0,
-+ "ep93xx_keypad_handler",
-+ (void *)(ep93xxkbd_irq_handler));
-+ if (error) {
-+ printk("Error: %s could not allocate IRQ%d\n", dev->name, IRQ_KEY);
-+ return error;
-+ }
-+ /* Note: request_irq has just enabled IRQ_KEY for us. */
-+
-+ /* Warning: We have initialized last key status to indicate
-+ * all keys up which may not be the current hardware state.
-+ *
-+ * TBD If this is important to detect, to alert user
-+ * TBD to a possibly faulty keyboard, then we could
-+ * TBD manually scan the keyboard to verify all keys up.
-+ *
-+
-+ * Three common cases here:
-+ * 1. All keys up. This is normal, expected status of keyboard.
-+ * 2. All keys up, although at some time ago during initialization
-+ * a key was momentarily pressed, causing the hardware to latch it.
-+ * 3. Some key is being held down now.
-+ *
-+ * Reading status clears any pending keyboard interrupt.
-+ */
-+
-+ i = readl(KEY_REG);
-+
-+ /*
-+ * We believe this will have the following impact on common cases:
-+ *
-+ * 1. No impact.
-+ * 2. Momentary presses will be cleared out so they do not
-+ * bother us. Although we get a spurious key up immediately because
-+ * the keyboard hardware will see change from last
-+ * latched status and current status, higher level keyboard driver
-+ * should ignore.
-+ * 3. Key being held will generate a new pending key down
-+ * event which is acceptable.
-+ *
-+ * Now keyboard is active and will generate interrupts
-+ * on key presses. Driver only needs to handle interrupts.
-+ * There are NO driver ioctl or deinit functions in lowlevel.
-+ */
-+
-+#ifdef CONFIG_KEYBOARD_EP93XX_8X8_CYCLING
-+ for (i = 0; i < EP93XX_KEYMAP_SIZE * 16; i++)
-+ set_bit(keycode[i/EP93XX_KEYMAP_SIZE][i%EP93XX_KEYMAP_SIZE], dev->keybit);
-+#else
-+ for (i = 0; i < EP93XX_KEYMAP_SIZE; i++)
-+ set_bit(keycode[i], dev->keybit);
-+#endif
-+
-+ input_register_device(dev);
-+
-+ return 0;
-+}
-+
-+static void __exit ep93xxkbd_cleanup(void)
-+{
-+ writel(0x000000AA, SYSCON_SWLOCK); /* unlock SYSCON Software Lock */
-+ writel(readl(SYSCON_KTDIV) & 0xFFFF7FFF, SYSCON_KTDIV); /* disable Key Matrix Clock KEN */
-+ free_irq(IRQ_KEY, NULL);
-+ input_unregister_device(dev);
-+}
-+
-+module_init(ep93xxkbd_init);
-+module_exit(ep93xxkbd_cleanup);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/input/keyboard/ep93xx_kbd_8x8_keymap-cycling.h b/drivers/input/keyboard/ep93xx_kbd_8x8_keymap-cycling.h
-new file mode 100644
-index 0000000..31fd4db
---- /dev/null
-+++ b/drivers/input/keyboard/ep93xx_kbd_8x8_keymap-cycling.h
-@@ -0,0 +1,146 @@
-+static unsigned char keycode[16][0x40] =
-+{{
-+ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, 0, 0,
-+ KEY_ESC, KEY_BACKSPACE, KEY_7, KEY_8, KEY_9, 0, 0, 0,
-+ KEY_PROG1, KEY_PROG2, KEY_4, KEY_5, KEY_6, 0, 0, 0,
-+ KEY_MENU, KEY_0, KEY_1, KEY_2, KEY_3, 0, 0, 0,
-+ KEY_LEFTSHIFT, KEY_UP, KEY_TAB, 0, 0, 0, 0, 0,
-+ KEY_LEFT, KEY_LEFTALT, KEY_RIGHT, 0, 0, 0, 0, 0,
-+ KEY_LEFTCTRL, KEY_DOWN, KEY_ENTER, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, KEY_A, KEY_D, KEY_G, 0, 0, 0,
-+ 0, 0, KEY_J, KEY_M, KEY_P, 0, 0, 0,
-+ 0, KEY_DOT, KEY_S, KEY_V, KEY_Y, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, KEY_B, KEY_E, KEY_H, 0, 0, 0,
-+ 0, 0, KEY_K, KEY_N, KEY_Q, 0, 0, 0,
-+ 0, KEY_COMMA, KEY_T, KEY_W, KEY_Z, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, KEY_C, KEY_F, KEY_I, 0, 0, 0,
-+ 0, 0, KEY_L, KEY_O, KEY_R, 0, 0, 0,
-+ 0, KEY_SLASH, KEY_U, KEY_X, KEY_SPACE, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_KPASTERISK, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_KPPLUS, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_KPMINUS, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_EQUAL, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_SEMICOLON, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_APOSTROPHE, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_KPLEFTPAREN, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_KPRIGHTPAREN, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_LEFTBRACE, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, KEY_RIGHTBRACE, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ }, {
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+}};
-diff --git a/drivers/input/keyboard/ep93xx_kbd_8x8_keymap.h b/drivers/input/keyboard/ep93xx_kbd_8x8_keymap.h
-new file mode 100644
-index 0000000..65dca77
---- /dev/null
-+++ b/drivers/input/keyboard/ep93xx_kbd_8x8_keymap.h
-@@ -0,0 +1,11 @@
-+static unsigned char keycode[0x40] =
-+{
-+ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, 0, 0,
-+ KEY_ESC, KEY_BACKSPACE, KEY_7, KEY_8, KEY_9, 0, 0, 0,
-+ KEY_PROG1, KEY_PROG2, KEY_4, KEY_5, KEY_6, 0, 0, 0,
-+ KEY_MENU, KEY_0, KEY_1, KEY_2, KEY_3, 0, 0, 0,
-+ KEY_LEFTSHIFT, KEY_UP, KEY_TAB, 0, 0, 0, 0, 0,
-+ KEY_LEFT, KEY_LEFTALT, KEY_RIGHT, 0, 0, 0, 0, 0,
-+ KEY_LEFTCTRL, KEY_DOWN, KEY_ENTER, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0,
-+};
-diff --git a/drivers/input/keyboard/ep93xx_spi_kbd.c b/drivers/input/keyboard/ep93xx_spi_kbd.c
-new file mode 100644
-index 0000000..b6ad607
---- /dev/null
-+++ b/drivers/input/keyboard/ep93xx_spi_kbd.c
-@@ -0,0 +1,407 @@
-+/******************************************************************************
-+ *
-+ * File: linux/drivers/char/ep93xx_spi_kbd.c
-+ *
-+ * Purpose: Support for SPI Keyboard for a Cirrus Logic EP93xx
-+ *
-+ * History:
-+ *
-+ * Limitations:
-+ * Break and Print Screen keys not handled yet!
-+ *
-+ *
-+ * Copyright 2003 Cirrus Logic Inc.
-+ * 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
-+ *
-+ ******************************************************************************/
-+
-+/*
-+ * FIXME: There are more parity problems than there ought to be.
-+ * TODO: Track down
-+ * WHERE: grep for "BAD_PARITY"
-+ *
-+ * WORKAROUND: Do not press too many keys and do not type too fast
-+ * type key another time if it got lost
-+ *
-+ * WORKAROUND2: Use USB Keyboards or 8x8 matrix keypad instead
-+ *
-+ * FIXME2: Keymap should be done properly
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/module.h>
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/ssp-cirrus.h>
-+
-+#include "ep93xx_spi_kbd.h"
-+
-+#define EP93XX_MAX_KEY_DOWN_COUNT 6
-+
-+void DataCallback(unsigned int Data);
-+static int g_SSP_Handle;
-+static struct input_dev *ep93xxkbd_dev;
-+
-+#undef UART_HACK_DEBUG
-+/* #define UART_HACK_DEBUG 1 */
-+
-+#if defined(UART_HACK_DEBUG) && defined(CONFIG_DEBUG_LL)
-+char szBuf[256];
-+#define DPRINTK( x... ) \
-+ sprintf( szBuf, ##x ); \
-+ printascii( szBuf );
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+struct key_down_tracker_t {
-+ unsigned char scancode;
-+ unsigned char count;
-+};
-+
-+/*
-+ * In the interest of efficiency, let's only allow 5 keys to be down
-+ * at a time, maximum. So if anybody is having a temper tantrum on
-+ * their keyboard, they may get stuck keys, but that's to be expected.
-+ */
-+
-+#define MAX_KEYS_DOWN 8
-+static struct key_down_tracker_t KeyTracker[MAX_KEYS_DOWN];
-+
-+static unsigned char SPI2KScan(unsigned int uiSPIValue, int *pValid);
-+static void InitSniffer(void);
-+static void KeySniffer(unsigned char scancode, int down);
-+static void Check4StuckKeys(void);
-+
-+/**
-+ * handle_scancode - wrapper
-+ *
-+ * wrap old style (2.4.x) to 2.6.x input subsystem
-+ */
-+static void handle_scancode(unsigned char scancode, int down)
-+{
-+ DPRINTK("handle_scancode(scancode=%04X, down=%d); %02X ", scancode,
-+ down, scancode & 0x7f);
-+
-+ if (scancode > KSCAN_TABLE_SIZE)
-+ scancode &= ~EXTENDED_KEY;
-+
-+ input_report_key(ep93xxkbd_dev, KScanCodeToVKeyTable[scancode], down);
-+ input_sync(ep93xxkbd_dev);
-+
-+ DPRINTK("(virtual) scancode=%02X\n", scancode);
-+}
-+
-+/**
-+ * InitSniffer
-+ *
-+ * Clear our struct to indicate that no keys are down now.
-+ * If somebody boots this thing while holding down keys, then they'll
-+ * get what they deserve.
-+ *
-+ */
-+static void InitSniffer(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < MAX_KEYS_DOWN; i++) {
-+ KeyTracker[i].count = 0;
-+ KeyTracker[i].scancode = 0;
-+ }
-+}
-+
-+/**
-+ * KeySniffer
-+ *
-+ * To prevent stuck keys, keep track of what keys are down. This information
-+ * is used by Check4StuckKeys().
-+ */
-+static void KeySniffer(unsigned char scancode, int down)
-+{
-+ int i;
-+
-+ /*
-+ * There are certain keys that will definately get held down
-+ * and we can't interfere with that.
-+ */
-+ switch (scancode) {
-+ case 0x12: /* left shift */
-+ case 0x59: /* right shift */
-+ case 0x14: /* left ctrl */
-+ case 0x94: /* right ctrl */
-+ case 0x11: /* left alt */
-+ case 0x91: /* right alt */
-+ case 0x58: /* caps lock */
-+ case 0x77: /* Num lock */
-+ /* printk("Snuff - %02x, %d\n", scancode, down); */
-+ handle_scancode(scancode, down);
-+ return;
-+
-+ default:
-+ break;
-+ }
-+
-+ /* printk("Sniff - %02x, %d\n", scancode, down ); */
-+
-+ /*
-+ * Go thru our array, looking for the key. If it already
-+ * is recorded, update its count.
-+ * Also look for empty cells in the array in case we
-+ * need one.
-+ */
-+ for (i = 0; i < MAX_KEYS_DOWN; i++) {
-+ /* If this is a key up in our list then we are done. */
-+ if (down == 0) {
-+ if (KeyTracker[i].scancode == scancode) {
-+ KeyTracker[i].count = 0;
-+ KeyTracker[i].scancode = 0;
-+ handle_scancode(scancode, down);
-+ break;
-+ }
-+ }
-+ /* Hey here's an unused cell. Save its index. */
-+ else if (KeyTracker[i].count == 0) {
-+ KeyTracker[i].scancode = scancode;
-+ KeyTracker[i].count = 1;
-+ handle_scancode(scancode, down);
-+ break;
-+ }
-+ }
-+}
-+
-+/**
-+ * Check4StuckKeys
-+ *
-+ * When a key is held down longer than 1/2 sec, it start repeating
-+ * 10 times a second. What we do is watch how long each key is
-+ * held down. If longer than X where X is less than 1/2 second
-+ * then we assume it is stuck and issue the key up. If we were
-+ * wrong and the key really is being held down, no problem because
-+ * the keyboard is about to start sending it to us repeatedly
-+ * anyway.
-+ */
-+static void Check4StuckKeys(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < MAX_KEYS_DOWN; i++) {
-+ if (KeyTracker[i].count) {
-+ KeyTracker[i].count++;
-+ if (KeyTracker[i].count >= EP93XX_MAX_KEY_DOWN_COUNT) {
-+ handle_scancode(KeyTracker[i].scancode, 0);
-+ KeyTracker[i].count = 0;
-+ KeyTracker[i].scancode = 0;
-+ }
-+ }
-+ }
-+}
-+
-+/**
-+ * HandleKeyPress
-+ *
-+ * Checks if there are any keys in the FIFO and processes them if there are.
-+ */
-+void HandleKeyPress(unsigned int Data)
-+{
-+ static unsigned char ucKScan[4] = { 0, 0, 0, 0 };
-+ static unsigned int ulNum = 0;
-+ int bParityValid;
-+
-+ /*
-+ * No keys to decode, but the timer went off and is calling us
-+ * to check for stuck keys.
-+ */
-+ if (Data == -1) {
-+ Check4StuckKeys();
-+ return;
-+ }
-+ /*
-+ * Read in the value from the SPI controller.
-+ */
-+ ucKScan[ulNum++] = SPI2KScan(Data, &bParityValid);
-+
-+ /*
-+ * Bad parity? We should read the rest of the fifo and
-+ * throw it away, because it will all be bad. Then the
-+ * SSP will be reset when we close the SSP driver and
-+ * all will be good again.
-+ */
-+ if (!bParityValid) {
-+ /* printk("_BAD_PARITY_"); */
-+ ulNum = 0;
-+ }
-+ /* If we have one character in the array, do the following. */
-+ if (ulNum == 1) {
-+ /*
-+ * If it is a simple key without the extended scan code perform
-+ * following.
-+ */
-+ if (ucKScan[0] < KSCAN_TABLE_SIZE) {
-+ DPRINTK("1:Dn %02x\n", ucKScan[0]);
-+ KeySniffer(ucKScan[0], 1);
-+ ulNum = 0;
-+ }
-+ /*
-+ * I don't know what type of character this is so erase the
-+ * keys stored in the buffer and continue.
-+ */
-+ else if ((ucKScan[0] != 0xF0) && (ucKScan[0] != 0xE0)) {
-+ DPRINTK("1:oops - %02x\n", ucKScan[0]);
-+ ulNum = 0;
-+ }
-+ } else if (ulNum == 2) {
-+ /*
-+ * 0xF0 means that a key has been released.
-+ */
-+ if (ucKScan[0] == 0xF0) {
-+ /*
-+ * If it is a simple key without the extended scan code
-+ * perform the following.
-+ */
-+ if (ucKScan[1] < KSCAN_TABLE_SIZE) {
-+ DPRINTK("2:Up %02x %02x\n", ucKScan[0],
-+ ucKScan[1]);
-+ KeySniffer(ucKScan[1], 0);
-+ ulNum = 0;
-+ }
-+ /*
-+ * If it a extended kscan continue to get the next byte.
-+ */
-+ else if (ucKScan[1] != 0xE0) {
-+ DPRINTK("2:oops - %02x %02x\n", ucKScan[0],
-+ ucKScan[1]);
-+ ulNum = 0;
-+ }
-+ }
-+ /*
-+ * Find out what extended code it is.
-+ */
-+ else if (ucKScan[0] == 0xE0 && ucKScan[1] != 0xF0) {
-+ DPRINTK("2:Dn %02x %02x\n", ucKScan[0], ucKScan[1]);
-+ KeySniffer(EXTENDED_KEY | ucKScan[1], 1);
-+ ulNum = 0;
-+ }
-+ }
-+ /* This means that an extended code key has been released. */
-+ else if (ulNum == 3) {
-+ /* 0xF0 means that a key has been released. */
-+ if (ucKScan[0] == 0xE0 && ucKScan[1] == 0xF0) {
-+ DPRINTK("3:Up %02x %02x %02x",
-+ ucKScan[0], ucKScan[1], ucKScan[2]);
-+ KeySniffer(EXTENDED_KEY | ucKScan[2], 0);
-+ } else {
-+ DPRINTK("3:oops - %02x %02x %02x\n",
-+ ucKScan[0], ucKScan[1], ucKScan[2]);
-+ }
-+ ulNum = 0;
-+ }
-+}
-+
-+/**
-+ * SPI2KScan - Get a character from the spi port if it is available.
-+ *
-+ * Below is a picture of the spi signal from the PS2.
-+ *
-+ * CK HHllllHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHHHLLLHllll
-+ * DA HHHllllll000000111111222222333333444444555555666666777777ppppppssssssLLLLHHH
-+ * ^ ^
-+ * start bit important bit
-+ *
-+ * where: l = 8042 driving the line
-+ * L = KEYBOARD driving the line
-+ * 1..7 data
-+ * = Parity 8042 driving
-+ * s = stop 8042 driving
-+ * = PARITY KEYBOARD driving the line
-+ * S = STOP KEYBOARD driving the line
-+ *
-+ * In our design the value comes high bit first and is inverted. So we must
-+ * convert it to low byte first and then inverted it back.
-+ *
-+ */
-+static unsigned char SPI2KScan(unsigned int uiSPIValue, int *pValid)
-+{
-+ unsigned char ucKScan = 0;
-+ unsigned int uiParity = 0;
-+ unsigned int uiCount = 0;
-+
-+ for (uiCount = 1; uiCount < 10; uiCount++) {
-+ uiParity += (uiSPIValue >> uiCount) & 0x1;
-+ }
-+
-+ if (!(uiParity & 0x1) && (uiSPIValue & 0x401) == 0x400) {
-+ *pValid = 1;
-+
-+ /* Invert the pattern. */
-+ uiSPIValue = ~uiSPIValue;
-+
-+ /* Read in the value from the motorola spi file */
-+ ucKScan = (unsigned char)((uiSPIValue & 0x004) << 5);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x008) << 3);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x010) << 1);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x020) >> 1);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x040) >> 3);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x080) >> 5);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x100) >> 7);
-+ ucKScan |= (unsigned char)((uiSPIValue & 0x200) >> 9);
-+ } else {
-+ *pValid = 0;
-+ }
-+
-+ return ucKScan;
-+}
-+
-+int __init EP93XXSpiKbdInit(void)
-+{
-+ int i;
-+
-+ ep93xxkbd_dev = input_allocate_device();
-+ if (!ep93xxkbd_dev) {
-+ printk(KERN_ERR "ep93xxkbd: not enough memory for input device\n");
-+ return -ENOMEM;
-+ }
-+
-+ ep93xxkbd_dev->name = "Cirrus EP93xx PS/2 keyboard driver";
-+ printk("%s\n", ep93xxkbd_dev->name);
-+
-+ ep93xxkbd_dev->evbit[0] = BIT(EV_KEY);
-+
-+ for (i = 0; i < KSCAN_TABLE_SIZE; i++)
-+ set_bit(KScanCodeToVKeyTable[i], ep93xxkbd_dev->keybit);
-+
-+ input_register_device(ep93xxkbd_dev);
-+
-+ /* Open SSP driver for Keyboard input. */
-+ g_SSP_Handle = SSPDriver->Open(PS2_KEYBOARD, HandleKeyPress);
-+
-+ InitSniffer();
-+
-+ DPRINTK("Leaving EP93XXSpiKbdInit()\n");
-+
-+ return 0;
-+}
-+
-+void __exit EP93XXSpiKbdCleanup(void)
-+{
-+ SSPDriver->Close(g_SSP_Handle);
-+ input_unregister_device(ep93xxkbd_dev);
-+}
-+
-+module_init(EP93XXSpiKbdInit);
-+module_exit(EP93XXSpiKbdCleanup);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/input/keyboard/ep93xx_spi_kbd.h b/drivers/input/keyboard/ep93xx_spi_kbd.h
-new file mode 100644
-index 0000000..7f4bd90
---- /dev/null
-+++ b/drivers/input/keyboard/ep93xx_spi_kbd.h
-@@ -0,0 +1,147 @@
-+/*
-+ * ep93xx_spi_kbd.h Keymap definitions (to be cleaned up)
-+ */
-+
-+#define KSCAN_TABLE_SIZE 0x88
-+
-+#define EXTENDED_KEY 0x80
-+
-+/* This table is used to map the scan code to the Linux default keymap. */
-+static unsigned int const KScanCodeToVKeyTable[KSCAN_TABLE_SIZE] = {
-+ KEY_RESERVED, /* Scan Code 0x0 */
-+ KEY_F9, /* Scan Code 0x1 */
-+ KEY_RESERVED, /* Scan Code 0x2 */
-+ KEY_F5, /* Scan Code 0x3 */
-+ KEY_F3, /* Scan Code 0x4 */
-+ KEY_F1, /* Scan Code 0x5 */
-+ KEY_F2, /* Scan Code 0x6 */
-+ KEY_F12, /* Scan Code 0x7 */
-+ KEY_RESERVED, /* Scan Code 0x8 */
-+ KEY_F10, /* Scan Code 0x9 */
-+ KEY_F8, /* Scan Code 0xA */
-+ KEY_F6, /* Scan Code 0xB */
-+ KEY_F4, /* Scan Code 0xC */
-+ KEY_TAB, /* Scan Code 0xD Tab */
-+ KEY_GRAVE, /* Scan Code 0xE ' */
-+ KEY_RESERVED, /* Scan Code 0xF */
-+ KEY_RESERVED, /* Scan Code 0x10 */
-+ KEY_LEFTALT, /* Scan Code 0x11 Left Menu */
-+ KEY_LEFTSHIFT, /* Scan Code 0x12 Left Shift */
-+ KEY_RESERVED, /* Scan Code 0x13 */
-+ KEY_LEFTCTRL, /* Scan Code 0x14 */
-+ KEY_Q, /* Scan Code 0x15 */
-+ KEY_1, /* Scan Code 0x16 */
-+ KEY_RESERVED, /* Scan Code 0x17 */
-+ KEY_RESERVED, /* Scan Code 0x18 */
-+ KEY_RESERVED, /* Scan Code 0x19 */
-+ KEY_Z, /* Scan Code 0x1A */
-+ KEY_S, /* Scan Code 0x1B */
-+ KEY_A, /* Scan Code 0x1C */
-+ KEY_W, /* Scan Code 0x1D */
-+ KEY_2, /* Scan Code 0x1E */
-+ KEY_RESERVED, /* Scan Code 0x1F */
-+ KEY_RESERVED, /* Scan Code 0x20 */
-+ KEY_C, /* Scan Code 0x21 */
-+ KEY_X, /* Scan Code 0x22 */
-+ KEY_D, /* Scan Code 0x23 */
-+ KEY_E, /* Scan Code 0x24 */
-+ KEY_4, /* Scan Code 0x25 */
-+ KEY_3, /* Scan Code 0x26 */
-+ KEY_RESERVED, /* Scan Code 0x27 */
-+ KEY_RESERVED, /* Scan Code 0x28 */
-+ KEY_SPACE, /* Scan Code 0x29 Space */
-+ KEY_V, /* Scan Code 0x2A */
-+ KEY_F, /* Scan Code 0x2B */
-+ KEY_T, /* Scan Code 0x2C */
-+ KEY_R, /* Scan Code 0x2D */
-+ KEY_5, /* Scan Code 0x2E */
-+ KEY_RESERVED, /* Scan Code 0x2F */
-+ KEY_RESERVED, /* Scan Code 0x30 */
-+ KEY_N, /* Scan Code 0x31 */
-+ KEY_B, /* Scan Code 0x32 B */
-+ KEY_H, /* Scan Code 0x33 */
-+ KEY_G, /* Scan Code 0x34 */
-+ KEY_Y, /* Scan Code 0x35 */
-+ KEY_6, /* Scan Code 0x36 */
-+ KEY_RESERVED, /* Scan Code 0x37 */
-+ KEY_RESERVED, /* Scan Code 0x38 */
-+ KEY_RESERVED, /* Scan Code 0x39 */
-+ KEY_M, /* Scan Code 0x3A */
-+ KEY_J, /* Scan Code 0x3B */
-+ KEY_U, /* Scan Code 0x3C */
-+ KEY_7, /* Scan Code 0x3D */
-+ KEY_8, /* Scan Code 0x3E */
-+ KEY_RESERVED, /* Scan Code 0x3F */
-+ KEY_RESERVED, /* Scan Code 0x40 */
-+ KEY_COMMA, /* Scan Code 0x41 */
-+ KEY_K, /* Scan Code 0x42 */
-+ KEY_I, /* Scan Code 0x43 */
-+ KEY_O, /* Scan Code 0x44 */
-+ KEY_0, /* Scan Code 0x45 */
-+ KEY_9, /* Scan Code 0x46 */
-+ KEY_RESERVED, /* Scan Code 0x47 */
-+ KEY_RESERVED, /* Scan Code 0x48 */
-+ KEY_DOT, /* Scan Code 0x49 */
-+ KEY_SLASH, /* Scan Code 0x4A */
-+ KEY_L, /* Scan Code 0x4B */
-+ KEY_SEMICOLON, /* Scan Code 0x4C */
-+ KEY_P, /* Scan Code 0x4D */
-+ KEY_MINUS, /* Scan Code 0x4E */
-+ KEY_RESERVED, /* Scan Code 0x4F */
-+ KEY_RESERVED, /* Scan Code 0x50 */
-+ KEY_RESERVED, /* Scan Code 0x51 */
-+ KEY_APOSTROPHE, /* Scan Code 0x52 */
-+ KEY_RESERVED, /* Scan Code 0x53 */
-+ KEY_LEFTBRACE, /* Scan Code 0x54 */
-+ KEY_EQUAL, /* Scan Code 0x55 */
-+ KEY_BACKSPACE, /* Scan Code 0x56 */
-+ KEY_RESERVED, /* Scan Code 0x57 */
-+ KEY_CAPSLOCK, /* Scan Code 0x58 Caps Lock */
-+ KEY_RIGHTSHIFT, /* Scan Code 0x59 Right Shift */
-+ KEY_ENTER, /* Scan Code 0x5A */
-+ KEY_RIGHTBRACE, /* Scan Code 0x5B */
-+ KEY_RESERVED, /* Scan Code 0x5C */
-+ KEY_BACKSLASH, /* Scan Code 0x5D */
-+ KEY_RESERVED, /* Scan Code 0x5E */
-+ KEY_RESERVED, /* Scan Code 0x5F */
-+ KEY_RESERVED, /* Scan Code 0x60 */
-+ KEY_BACKSLASH, /* Scan Code 0x61 ?? VK_BSLH, */
-+ KEY_RESERVED, /* Scan Code 0x62 */
-+ KEY_RESERVED, /* Scan Code 0x63 */
-+ KEY_RESERVED, /* Scan Code 0x64 */
-+ KEY_RESERVED, /* Scan Code 0x65 */
-+ KEY_BACKSPACE, /* Scan Code 0x66 ?? VK_BKSP, */
-+ KEY_RESERVED, /* Scan Code 0x67 */
-+ KEY_RESERVED, /* Scan Code 0x68 */
-+ KEY_KP1, /* Scan Code 0x69 */
-+ KEY_RESERVED, /* Scan Code 0x6A */
-+ KEY_KP4, /* Scan Code 0x6B */
-+ KEY_KP7, /* Scan Code 0x6C */
-+ KEY_RESERVED, /* Scan Code 0x6D */
-+ KEY_RESERVED, /* Scan Code 0x6E */
-+ KEY_RESERVED, /* Scan Code 0x6F */
-+ KEY_KP0, /* Scan Code 0x70 */
-+ KEY_KPDOT, /* Scan Code 0x71 DECIMAL?? */
-+ KEY_KP2, /* Scan Code 0x72 */
-+ KEY_KP5, /* Scan Code 0x73 */
-+ KEY_KP6, /* Scan Code 0x74 */
-+ KEY_KP8, /* Scan Code 0x75 */
-+ KEY_ESC, /* Scan Code 0x76 */
-+ KEY_NUMLOCK, /* Scan Code 0x77 */
-+ KEY_F11, /* Scan Code 0x78 */
-+ KEY_KPPLUS, /* Scan Code 0x79 */
-+ KEY_KP3, /* Scan Code 0x7A */
-+ KEY_KPMINUS, /* Scan Code 0x7B */
-+ KEY_KPASTERISK, /* Scan Code 0x7C */
-+ KEY_KP9, /* Scan Code 0x7D */
-+ KEY_SCROLLLOCK, /* Scan Code 0x7E */
-+ KEY_RESERVED, /* Scan Code 0x7F */
-+ KEY_RESERVED, /* Scan Code 0x80 */
-+ KEY_RESERVED, /* Scan Code 0x81 */
-+ KEY_RESERVED, /* Scan Code 0x82 */
-+ KEY_F7, /* Scan Code 0x83 */
-+ KEY_RESERVED, /* Scan Code 0x84 */
-+ KEY_RESERVED, /* Scan Code 0x85 */
-+ KEY_RESERVED, /* Scan Code 0x86 */
-+ KEY_RESERVED /* Scan Code 0x87 */
-+};
-diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
-index 21d55ed..5453395 100644
---- a/drivers/input/touchscreen/Kconfig
-+++ b/drivers/input/touchscreen/Kconfig
-@@ -95,4 +95,15 @@ config TOUCHSCREEN_HP600
- To compile this driver as a module, choose M here: the
- module will be called hp680_ts_input.
-
-+config TOUCHSCREEN_EP93XX
-+ tristate "EP93xx touchscreen"
-+ depends on ARCH_EP93XX
-+ help
-+ Say Y here if you have a touchscreen connected to your EP93xx CPU.
-+
-+ If unsure, say N.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called ep93xx_ts.
-+
- endif
-diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
-index 6842869..f8e6eb4 100644
---- a/drivers/input/touchscreen/Makefile
-+++ b/drivers/input/touchscreen/Makefile
-@@ -11,3 +11,4 @@ obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o
- obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o
- obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o
- obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o
-+obj-$(CONFIG_TOUCHSCREEN_EP93XX) += ep93xx_ts.o
-diff --git a/drivers/input/touchscreen/ep93xx_ts.c b/drivers/input/touchscreen/ep93xx_ts.c
-new file mode 100644
-index 0000000..fc4622e
---- /dev/null
-+++ b/drivers/input/touchscreen/ep93xx_ts.c
-@@ -0,0 +1,748 @@
-+/*
-+ * linux/drivers/char/ep93xx_ts.c
-+ *
-+ * Copyright (C) 2003-2004 Cirrus Corp.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/delay.h>
-+#include <linux/sched.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/timer.h>
-+#include <linux/input.h>
-+#include <linux/pci.h>
-+
-+#include <asm/irq.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+
-+/*
-+ * To customize for a new touchscreen, there are various macros that
-+ * have to be set. If you allow UART_HACK_DEBUG to be defined, you
-+ * will get real time ts data scrolling up your serial terminal
-+ * screen that will help you empirically determine good values for these.
-+ *
-+ *
-+ * These are used as trigger levels to know when we have pen up/down
-+ *
-+ * The rules:
-+ * 1. TS_HEAVY_INV_PRESSURE < TS_LIGHT_INV_PRESSURE because these
-+ * are Inverse pressure.
-+ * 2. Any touch lighter than TS_LIGHT_INV_PRESSURE is a pen up.
-+ * 3. Any touch heavier than TS_HEAVY_INV_PRESSURE is a pen down.
-+ */
-+#define TS_HEAVY_INV_PRESSURE (0x1000 - pressure_max)
-+#define TS_LIGHT_INV_PRESSURE (0x1000 - pressure_min)
-+
-+/*
-+ * If the x, y, or inverse pressure changes more than these values
-+ * between two succeeding points, the point is not reported.
-+ */
-+#define TS_MAX_VALID_PRESSURE_CHANGE (pressure_jitter)
-+#define TS_MAX_VALID_XY_CHANGE (xy_jitter)
-+
-+/* old defaults */
-+#if 0
-+#define TS_X_MIN 0
-+#define TS_Y_MIN 0
-+#define TS_X_MAX 0xfff
-+#define TS_Y_MAX 0xfff
-+#endif
-+
-+/* "improved" defaults */
-+#define TS_X_MIN 0x2d9
-+#define TS_Y_MIN 0xd0a
-+#define TS_X_MAX 0xd42
-+#define TS_Y_MAX 0x2e0
-+
-+static uint16_t pressure_min = 0x001;
-+static uint16_t pressure_max = 0x010;
-+static uint16_t pressure_jitter = 0x300;
-+static uint16_t xy_jitter = 0x100;
-+module_param(pressure_min, ushort, 0);
-+module_param(pressure_max, ushort, 0);
-+module_param(pressure_jitter, ushort, 0);
-+module_param(xy_jitter, ushort, 0);
-+MODULE_PARM_DESC(pressure_min, "Minimum pressure (0 - 4095)");
-+MODULE_PARM_DESC(pressure_max, "Maximum pressure (0 - 4095)");
-+MODULE_PARM_DESC(pressure_jitter, "Minimum pressure jitter (0 - 4095)");
-+MODULE_PARM_DESC(xy_jitter, "Minimum X-Y jitter (0 - 4095)");
-+
-+/* This is the minimum Z1 Value that is valid. */
-+#define MIN_Z1_VALUE 0x50
-+
-+/*
-+ * Settling delay for taking each ADC measurement. Increase this
-+ * if ts is jittery.
-+ */
-+#define EP93XX_TS_ADC_DELAY_USEC 2000
-+
-+/* Delay between TS points. */
-+
-+#define EP93XX_TS_PER_POINT_DELAY_USEC 10000
-+
-+/*-----------------------------------------------------------------------------
-+ * Debug messaging thru the UARTs
-+ *-----------------------------------------------------------------------------
-+ *
-+ * Hello there! Are you trying to get this driver to work with a new
-+ * touschscreen? Turn this on and you will get useful info coming
-+ * out of your serial port.
-+ */
-+
-+/* #define PRINT_CALIBRATION_FACTORS */
-+#ifdef PRINT_CALIBRATION_FACTORS
-+#define UART_HACK_DEBUG 1
-+int iMaxX = 0, iMaxY = 0, iMinX = 0xfff, iMinY = 0xfff;
-+#endif
-+
-+/*
-+ * For debugging, let's spew messages out serial port 1 or 3 at 57,600 baud.
-+ */
-+#undef UART_HACK_DEBUG
-+#if defined(UART_HACK_DEBUG) && defined (CONFIG_DEBUG_LL)
-+static char szBuf[256];
-+void UARTWriteString(char *msg);
-+extern void printascii(const char *msg);
-+#define DPRINTK( x... ) \
-+ sprintf( szBuf, ##x ); \
-+ printascii( szBuf );
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+#define TSSETUP_DEFAULT ( TSSETUP_NSMP_32 | TSSETUP_DEV_64 | \
-+ ((128<<TSSETUP_SDLY_SHIFT) & TSSETUP_SDLY_MASK) | \
-+ ((128<<TSSETUP_DLY_SHIFT) & TSSETUP_DLY_MASK) )
-+
-+#define TSSETUP2_DEFAULT (TSSETUP2_NSIGND)
-+
-+static unsigned int guiLastX, guiLastY;
-+static unsigned int guiLastInvPressure;
-+static int bCurrentPenDown;
-+static DECLARE_MUTEX(open_sem);
-+
-+enum ts_mode_t {
-+ TS_MODE_UN_INITIALIZED,
-+ TS_MODE_HARDWARE_SCAN,
-+ TS_MODE_SOFT_SCAN
-+};
-+
-+static enum ts_mode_t gScanningMode;
-+
-+enum ts_states_t {
-+ TS_STATE_STOPPED = 0,
-+ TS_STATE_Z1,
-+ TS_STATE_Z2,
-+ TS_STATE_Y,
-+ TS_STATE_X,
-+ TS_STATE_DONE
-+};
-+
-+struct ts_struct_t {
-+ unsigned int uiX;
-+ unsigned int uiY;
-+ unsigned int uiZ1;
-+ unsigned int uiZ2;
-+ enum ts_states_t state;
-+};
-+
-+static struct ts_struct_t sTouch;
-+
-+/*
-+ * From the spec, here's how to set up the touch screen's switch registers.
-+ */
-+struct SwitchStructType {
-+ unsigned int uiDetect;
-+ unsigned int uiDischarge;
-+ unsigned int uiXSample;
-+ unsigned int uiYSample;
-+ unsigned int uiSwitchZ1;
-+ unsigned int uiSwitchZ2;
-+};
-+
-+/*
-+ * Here's the switch settings for a 4-wire touchscreen. See the spec
-+ * for how to handle a 4, 7, or 8-wire.
-+ */
-+const static struct SwitchStructType sSwitchSettings =
-+/* s28en=0
-+ * TSDetect TSDischarge TSXSample TSYSample SwitchZ1 SwitchZ2
-+ */
-+{ 0x00403604, 0x0007fe04, 0x00081604, 0x00104601, 0x00101601, 0x00101608 };
-+
-+static void ep93xx_ts_set_direct(unsigned int uiADCSwitch);
-+static irqreturn_t ep93xx_ts_isr(int irq, void *dev_id, struct pt_regs *regs);
-+static irqreturn_t ep93xx_timer2_isr(int irq, void *dev_id,
-+ struct pt_regs *regs);
-+static void ep93xx_hw_setup(void);
-+static void ep93xx_hw_shutdown(void);
-+static unsigned int CalculateInvPressure(void);
-+static unsigned int ADCGetData(unsigned int uiSamples, unsigned int uiMaxDiff);
-+static void TS_Soft_Scan_Mode(void);
-+static void TS_Hardware_Scan_Mode(void);
-+static void ProcessPointData(struct input_dev *dev);
-+static void Set_Timer2_uSec(unsigned int Delay_mSec);
-+static void Stop_Timer2(void);
-+
-+static irqreturn_t ep93xx_ts_isr(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ DPRINTK("isr\n");
-+
-+ /*
-+ * Note that we don't clear the interrupt here. The interrupt
-+ * gets cleared in TS_Soft_Scan_Mode when the TS ENABLE
-+ * bit is cleared.
-+ *
-+
-+ *
-+ * Set the ts to manual polling mode and schedule a callback.
-+ * That way we can return from the isr in a reasonable amount of
-+ * time and process the touch in the callback after a brief delay.
-+ */
-+ TS_Soft_Scan_Mode();
-+ return IRQ_HANDLED;
-+}
-+
-+static int ep93xx_ts_open(struct input_dev *dev)
-+{
-+ int err;
-+
-+ if (down_trylock(&open_sem))
-+ return -EBUSY;
-+
-+ err =
-+ request_irq(IRQ_TOUCH, ep93xx_ts_isr, SA_INTERRUPT, "ep93xx_ts",
-+ dev);
-+ if (err) {
-+ printk(KERN_WARNING
-+ "ep93xx_ts: failed to get touchscreen IRQ\n");
-+ return err;
-+ }
-+
-+ err = request_irq(IRQ_TIMER2, ep93xx_timer2_isr,
-+ SA_INTERRUPT, "ep93xx_timer2", dev);
-+ if (err) {
-+ printk(KERN_WARNING "ep93xx_ts: failed to get timer2 IRQ\n");
-+ free_irq(IRQ_TOUCH, dev);
-+ return err;
-+ }
-+
-+ ep93xx_hw_setup();
-+
-+ return 0;
-+}
-+
-+static void ep93xx_ts_close(struct input_dev *dev)
-+{
-+ Stop_Timer2();
-+
-+ ep93xx_hw_shutdown();
-+
-+ free_irq(IRQ_TIMER2, dev);
-+ free_irq(IRQ_TOUCH, dev);
-+
-+ up(&open_sem);
-+}
-+
-+static void ep93xx_hw_setup(void)
-+{
-+ unsigned int uiKTDIV, uiTSXYMaxMin;
-+
-+ /*
-+ * Set the TSEN bit in KTDIV so that we are enabling the clock
-+ * for the touchscreen.
-+ */
-+ uiKTDIV = readl(SYSCON_KTDIV);
-+ uiKTDIV |= SYSCON_KTDIV_TSEN;
-+ SysconSetLocked(SYSCON_KTDIV, uiKTDIV);
-+
-+ writel(TSSETUP_DEFAULT, TSSetup);
-+ writel(TSSETUP2_DEFAULT, TSSetup2);
-+
-+ /* Set the the touch settings. */
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiDischarge, TSDirect);
-+
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiDischarge, TSDischarge);
-+
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiSwitchZ1, TSXSample);
-+
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiSwitchZ2, TSYSample);
-+
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiDetect, TSDetect);
-+
-+ /*
-+ * X,YMin set to 0x40 = have to drag that many pixels for a new irq.
-+ * X,YMax set to 0x40 = 1024 pixels is the maximum movement within the
-+ * time scan limit.
-+ */
-+ uiTSXYMaxMin = (50 << TSMAXMIN_XMIN_SHIFT) & TSMAXMIN_XMIN_MASK;
-+ uiTSXYMaxMin |= (50 << TSMAXMIN_YMIN_SHIFT) & TSMAXMIN_YMIN_MASK;
-+ uiTSXYMaxMin |= (0xff << TSMAXMIN_XMAX_SHIFT) & TSMAXMIN_XMAX_MASK;
-+ uiTSXYMaxMin |= (0xff << TSMAXMIN_YMAX_SHIFT) & TSMAXMIN_YMAX_MASK;
-+ writel(uiTSXYMaxMin, TSXYMaxMin);
-+
-+ bCurrentPenDown = 0;
-+ guiLastX = 0;
-+ guiLastY = 0;
-+ guiLastInvPressure = 0xffffff;
-+
-+ /* Enable the touch screen scanning engine. */
-+
-+ TS_Hardware_Scan_Mode();
-+
-+}
-+
-+static void ep93xx_hw_shutdown(void)
-+{
-+ unsigned int uiKTDIV;
-+
-+ DPRINTK("ep93xx_hw_shutdown\n");
-+
-+ sTouch.state = TS_STATE_STOPPED;
-+ Stop_Timer2();
-+
-+ /*
-+ * Disable the scanning engine.
-+ */
-+ writel(0, TSSetup);
-+ writel(0, TSSetup2);
-+
-+ /*
-+ * Clear the TSEN bit in KTDIV so that we are disabling the clock
-+ * for the touchscreen.
-+ */
-+ uiKTDIV = readl(SYSCON_KTDIV);
-+ uiKTDIV &= ~SYSCON_KTDIV_TSEN;
-+ SysconSetLocked(SYSCON_KTDIV, uiKTDIV);
-+
-+}
-+
-+static irqreturn_t ep93xx_timer2_isr(int irq, void *dev_id,
-+ struct pt_regs *regs)
-+{
-+ DPRINTK("%d", (int)sTouch.state);
-+
-+ switch (sTouch.state) {
-+ case TS_STATE_STOPPED:
-+ TS_Hardware_Scan_Mode();
-+ break;
-+
-+ /*
-+ * Get the Z1 value for pressure measurement and set up
-+ * the switch register for getting the Z2 measurement.
-+ */
-+ case TS_STATE_Z1:
-+ Set_Timer2_uSec(EP93XX_TS_ADC_DELAY_USEC);
-+ sTouch.uiZ1 = ADCGetData(2, 200);
-+ ep93xx_ts_set_direct(sSwitchSettings.uiSwitchZ2);
-+ sTouch.state = TS_STATE_Z2;
-+ break;
-+
-+ /*
-+ * Get the Z2 value for pressure measurement and set up
-+ * the switch register for getting the Y measurement.
-+ */
-+ case TS_STATE_Z2:
-+ sTouch.uiZ2 = ADCGetData(2, 200);
-+ ep93xx_ts_set_direct(sSwitchSettings.uiYSample);
-+ sTouch.state = TS_STATE_Y;
-+ break;
-+
-+ /*
-+ * Get the Y value and set up the switch register for
-+ * getting the X measurement.
-+ */
-+ case TS_STATE_Y:
-+ sTouch.uiY = ADCGetData(4, 20);
-+ ep93xx_ts_set_direct(sSwitchSettings.uiXSample);
-+ sTouch.state = TS_STATE_X;
-+ break;
-+
-+ /*
-+ * Read the X value. This is the last of the 4 adc values
-+ * we need so we continue on to process the data.
-+ */
-+ case TS_STATE_X:
-+ Stop_Timer2();
-+
-+ sTouch.uiX = ADCGetData(4, 20);
-+
-+ writel(0xaa, TSSWLock);
-+ writel(sSwitchSettings.uiDischarge, TSDirect);
-+
-+ sTouch.state = TS_STATE_DONE;
-+
-+ /* Process this set of ADC readings. */
-+ ProcessPointData(dev_id);
-+
-+ break;
-+
-+ /* Shouldn't get here. But if we do, we can recover... */
-+ case TS_STATE_DONE:
-+ TS_Hardware_Scan_Mode();
-+ break;
-+ }
-+
-+ /* Clear the timer2 interrupt. */
-+ writel(1, TIMER2CLEAR);
-+ return IRQ_HANDLED;
-+
-+}
-+
-+/*---------------------------------------------------------------------
-+ * ProcessPointData
-+ *
-+ * This routine processes the ADC data into usable point data and then
-+ * puts the driver into hw or sw scanning mode before returning.
-+ *
-+ * We calculate inverse pressure (lower number = more pressure) then
-+ * do a hystheresis with the two pressure values 'light' and 'heavy'.
-+ *
-+ * If we are above the light, we have pen up.
-+ * If we are below the heavy we have pen down.
-+ * As long as the pressure stays below the light, pen stays down.
-+ * When we get above the light again, pen goes back up.
-+ *
-+ */
-+static void ProcessPointData(struct input_dev *dev)
-+{
-+ int bValidPoint = 0;
-+ unsigned int uiXDiff, uiYDiff, uiInvPressureDiff;
-+ unsigned int uiInvPressure;
-+
-+ /* Calculate the current pressure. */
-+ uiInvPressure = CalculateInvPressure();
-+
-+ DPRINTK(" X=0x%x, Y=0x%x, Z1=0x%x, Z2=0x%x, InvPressure=0x%x",
-+ sTouch.uiX, sTouch.uiY, sTouch.uiZ1, sTouch.uiZ2,
-+ uiInvPressure);
-+
-+ /*
-+ * If pen pressure is so light that it is greater than the 'max' setting
-+ * then we consider this to be a pen up.
-+ */
-+ if (uiInvPressure >= TS_LIGHT_INV_PRESSURE) {
-+ DPRINTK(" -- up \n");
-+ bCurrentPenDown = 0;
-+/* input_report_key(dev, BTN_TOUCH, 0); */
-+ input_report_abs(dev, ABS_PRESSURE, 0);
-+ input_sync(dev);
-+ TS_Hardware_Scan_Mode();
-+ return;
-+ }
-+ /*
-+ * Hystheresis:
-+ * If the pen pressure is hard enough to be less than the 'min' OR
-+ * the pen is already down and is still less than the 'max'...
-+ */
-+ if ((uiInvPressure < TS_HEAVY_INV_PRESSURE) ||
-+ (bCurrentPenDown && (uiInvPressure < TS_LIGHT_INV_PRESSURE))) {
-+ if (bCurrentPenDown) {
-+ /*
-+ * If pen was previously down, check the difference between
-+ * the last sample and this one... if the difference between
-+ * samples is too great, ignore the sample.
-+ */
-+ uiXDiff = abs(guiLastX - sTouch.uiX);
-+ uiYDiff = abs(guiLastY - sTouch.uiY);
-+ uiInvPressureDiff =
-+ abs(guiLastInvPressure - uiInvPressure);
-+
-+ if ((uiXDiff < TS_MAX_VALID_XY_CHANGE) &&
-+ (uiYDiff < TS_MAX_VALID_XY_CHANGE) &&
-+ (uiInvPressureDiff < TS_MAX_VALID_PRESSURE_CHANGE))
-+ {
-+ DPRINTK(" -- valid(two) \n");
-+ bValidPoint = 1;
-+ } else {
-+ DPRINTK(" -- INvalid(two) \n");
-+ }
-+ } else {
-+ DPRINTK(" -- valid \n");
-+ bValidPoint = 1;
-+ }
-+
-+ /*
-+ * If either the pen was put down or dragged make a note of it.
-+ */
-+ if (bValidPoint) {
-+ guiLastX = sTouch.uiX;
-+ guiLastY = sTouch.uiY;
-+ guiLastInvPressure = uiInvPressure;
-+ bCurrentPenDown = 1;
-+ input_report_abs(dev, ABS_X, sTouch.uiX);
-+ input_report_abs(dev, ABS_Y, sTouch.uiY);
-+/* input_report_key(dev, BTN_TOUCH, 1); */
-+ input_report_abs(dev, ABS_PRESSURE, 1);
-+ input_sync(dev);
-+ }
-+
-+ TS_Soft_Scan_Mode();
-+ return;
-+ }
-+
-+ DPRINTK(" -- fallout \n");
-+ TS_Hardware_Scan_Mode();
-+}
-+
-+static void ep93xx_ts_set_direct(unsigned int uiADCSwitch)
-+{
-+ unsigned int uiResult;
-+
-+ /* Set the switch settings in the direct register. */
-+ writel(0xaa, TSSWLock);
-+ writel(uiADCSwitch, TSDirect);
-+
-+ /* Read and throw away the first sample. */
-+ do {
-+ uiResult = readl(TSXYResult);
-+ } while (!(uiResult & TSXYRESULT_SDR));
-+
-+}
-+
-+static unsigned int ADCGetData(unsigned int uiSamples, unsigned int uiMaxDiff)
-+{
-+ unsigned int uiResult, uiValue, uiCount, uiLowest, uiHighest, uiSum,
-+ uiAve;
-+
-+ do {
-+ /* Initialize our values. */
-+ uiLowest = 0xfffffff;
-+ uiHighest = 0;
-+ uiSum = 0;
-+
-+ for (uiCount = 0; uiCount < uiSamples; uiCount++) {
-+ /* Read the touch screen four more times and average. */
-+ do {
-+ uiResult = readl(TSXYResult);
-+ } while (!(uiResult & TSXYRESULT_SDR));
-+
-+ uiValue =
-+ (uiResult & TSXYRESULT_AD_MASK) >>
-+ TSXYRESULT_AD_SHIFT;
-+ uiValue =
-+ ((uiValue >> 4) +
-+ ((1 +
-+ TSXYRESULT_X_MASK) >> 1)) & TSXYRESULT_X_MASK;
-+
-+ /* Add up the values. */
-+ uiSum += uiValue;
-+
-+ /* Get the lowest and highest values. */
-+ if (uiValue < uiLowest)
-+ uiLowest = uiValue;
-+
-+ if (uiValue > uiHighest)
-+ uiHighest = uiValue;
-+
-+ }
-+
-+ } while ((uiHighest - uiLowest) > uiMaxDiff);
-+
-+ /* Calculate the Average value. */
-+ uiAve = uiSum / uiSamples;
-+
-+ return uiAve;
-+}
-+
-+/**
-+ * CalculateInvPressure
-+ *
-+ * Is the Touch Valid. Touch is not valid if the X or Y value is not
-+ * in range and the pressure is not enough.
-+ *
-+ * Touch resistance can be measured by the following formula:
-+ *
-+ * Rx * X * Z2
-+ * Rtouch = --------- * (-- - 1)
-+ * 4096 Z1
-+ *
-+ * This is simplified in the ration of Rtouch to Rx. The lower the value, the
-+ * higher the pressure.
-+ *
-+ * Z2
-+ * InvPressure = X * (-- - 1)
-+ * Z1
-+ */
-+static unsigned int CalculateInvPressure(void)
-+{
-+ unsigned int uiInvPressure;
-+
-+ /* Check to see if the point is valid. */
-+ if (sTouch.uiZ1 < MIN_Z1_VALUE)
-+ uiInvPressure = 0x10000;
-+
-+ /* Can omit the pressure calculation if you need to get rid of the division. */
-+ else {
-+ uiInvPressure =
-+ ((sTouch.uiX * sTouch.uiZ2) / sTouch.uiZ1) - sTouch.uiX;
-+ }
-+
-+ return uiInvPressure;
-+}
-+
-+/**
-+ * TS_Hardware_Scan_Mode
-+ * Enables the ep93xx ts scanning engine so that when the pen goes down
-+ * we will get an interrupt.
-+ */
-+static void TS_Hardware_Scan_Mode(void)
-+{
-+ unsigned int uiDevCfg;
-+
-+ DPRINTK("S\n");
-+
-+ /* Disable the soft scanning engine. */
-+ sTouch.state = TS_STATE_STOPPED;
-+ Stop_Timer2();
-+
-+ /*
-+ * Clear the TIN (Touchscreen INactive) bit so we can go to
-+ * automatic scanning mode.
-+ */
-+ uiDevCfg = readl(SYSCON_DEVCFG);
-+ SysconSetLocked(SYSCON_DEVCFG,
-+ ep93xx_SYSCON_DEVCFG(uiDevCfg & ~SYSCON_DEVCFG_TIN));
-+
-+ /*
-+ * Enable the touch screen scanning state machine by setting
-+ * the ENABLE bit.
-+ */
-+ writel((TSSETUP_DEFAULT | TSSETUP_ENABLE), TSSetup);
-+
-+ /* Set the flag to show that we are in interrupt mode. */
-+ gScanningMode = TS_MODE_HARDWARE_SCAN;
-+
-+ /* Initialize TSSetup2 register. */
-+ writel(TSSETUP2_DEFAULT, TSSetup2);
-+
-+}
-+
-+/**
-+ * TS_Soft_Scan_Mode - Set the touch screen to manual polling mode.
-+ */
-+static void TS_Soft_Scan_Mode(void)
-+{
-+ unsigned int uiDevCfg;
-+
-+ DPRINTK("M\n");
-+
-+ if (gScanningMode != TS_MODE_SOFT_SCAN) {
-+ /*
-+ * Disable the touch screen scanning state machine by clearing
-+ * the ENABLE bit.
-+ */
-+ writel(TSSETUP_DEFAULT, TSSetup);
-+
-+ /* Set the TIN bit so we can do manual touchscreen polling. */
-+ uiDevCfg = readl(SYSCON_DEVCFG);
-+ SysconSetLocked(SYSCON_DEVCFG,
-+ ep93xx_SYSCON_DEVCFG(uiDevCfg |
-+ SYSCON_DEVCFG_TIN));
-+ }
-+ /* Set the switch register up for the first ADC reading */
-+ ep93xx_ts_set_direct(sSwitchSettings.uiSwitchZ1);
-+
-+ /*
-+ * Initialize our software state machine to know which ADC
-+ * reading to take
-+ */
-+ sTouch.state = TS_STATE_Z1;
-+
-+ /*
-+ * Set the timer so after a mSec or two settling delay it will
-+ * take the first ADC reading.
-+ */
-+ Set_Timer2_uSec(EP93XX_TS_PER_POINT_DELAY_USEC);
-+
-+ /* Note that we are in sw scanning mode not hw scanning mode. */
-+ gScanningMode = TS_MODE_SOFT_SCAN;
-+
-+}
-+
-+static void Set_Timer2_uSec(unsigned int uiDelay_uSec)
-+{
-+ unsigned int uiClockTicks;
-+
-+ /*
-+ * Stop timer 2
-+ */
-+ writel(0, TIMER2CONTROL);
-+
-+ uiClockTicks = ((uiDelay_uSec * 508) + 999) / 1000;
-+ writel(uiClockTicks, TIMER2LOAD);
-+ writel(uiClockTicks, TIMER2VALUE);
-+
-+ /*
-+ * Set up Timer 2 for 508 kHz clock and periodic mode.
-+ */
-+ writel(0xC8, TIMER2CONTROL);
-+
-+}
-+
-+static void Stop_Timer2(void)
-+{
-+ writel(0, TIMER2CONTROL);
-+}
-+
-+static struct input_dev *ep93xx_ts_dev;
-+
-+static int __init ep93xx_ts_init(void)
-+{
-+ ep93xx_ts_dev = input_allocate_device();
-+ if (!ep93xx_ts_dev) {
-+ printk(KERN_ERR "ep93xx_ts_dev: not enough memory for input device\n");
-+ return -ENOMEM;
-+ }
-+
-+ ep93xx_ts_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
-+ ep93xx_ts_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
-+ ep93xx_ts_dev->keybit[LONG(BTN_RAW)] = BIT(BTN_RAW);
-+
-+ /* untested, I haven't got a touchscreen (yet) :( */
-+ input_set_abs_params(ep93xx_ts_dev, ABS_X, 0, 4095, 0, 0);
-+ input_set_abs_params(ep93xx_ts_dev, ABS_Y, 0, 4095, 0, 0);
-+ input_set_abs_params(ep93xx_ts_dev, ABS_PRESSURE, 0, 1, 0, 0);
-+
-+ ep93xx_ts_dev->open = ep93xx_ts_open;
-+ ep93xx_ts_dev->close = ep93xx_ts_close;
-+ ep93xx_ts_dev->name = "Cirrus Logic EP93xx Touchscreen";
-+ ep93xx_ts_dev->phys = "ep93xx_ts/input0";
-+ ep93xx_ts_dev->id.bustype = BUS_HOST;
-+ ep93xx_ts_dev->id.vendor = PCI_VENDOR_ID_CIRRUS;
-+ ep93xx_ts_dev->id.product = 0x9300;
-+
-+ input_set_abs_params(ep93xx_ts_dev, ABS_X, TS_X_MIN, TS_X_MAX, 0, 0);
-+ input_set_abs_params(ep93xx_ts_dev, ABS_Y, TS_Y_MIN, TS_Y_MAX, 0, 0);
-+ input_register_device(ep93xx_ts_dev);
-+
-+ sTouch.state = TS_STATE_STOPPED;
-+ gScanningMode = TS_MODE_UN_INITIALIZED;
-+
-+ printk(KERN_NOTICE
-+ "EP93xx touchscreen driver configured for 4-wire operation\n");
-+ return 0;
-+}
-+
-+static void __exit ep93xx_ts_exit(void)
-+{
-+ input_unregister_device(ep93xx_ts_dev);
-+}
-+
-+module_init(ep93xx_ts_init);
-+module_exit(ep93xx_ts_exit);
-+
-+MODULE_DESCRIPTION("Cirrus EP93xx touchscreen driver");
-+MODULE_SUPPORTED_DEVICE("touchscreen/ep93xx");
-diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
-index b9b77cf..4e0e427 100644
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -137,6 +137,13 @@ config MTD_MAINSTONE
- This provides a driver for the on-board flash of the Intel
- 'Mainstone PXA27x evaluation board.
-
-+config MTD_ADSFLASH
-+ tristate "CFI Flash device mapped on ADS"
-+ depends on ARM && MTD_CFI && MACH_ADSSPHERE && MTD_PARTITIONS
-+ help
-+ This enables access to on-board flash memory on ADS platforms that
-+ have an Intel XScale PXA2xx CPU.
-+
- config MTD_OCTAGON
- tristate "JEDEC Flash device mapped on Octagon 5066 SBC"
- depends on X86 && MTD_JEDEC && MTD_COMPLEX_MAPPINGS
-@@ -639,5 +646,19 @@ config MTD_PLATRAM
-
- This selection automatically selects the map_ram driver.
-
-+config MTD_ZEFEERDZB
-+ tristate "Map driver for DAVE Srl ZefeerDZB processor module"
-+ depends on (MTD_CFI && MACH_ZEFEERDZB)
-+ select MTD_PARTITIONS
-+ help
-+ Map driver for DAVE Srl ZefeerDZB processor module.
-+
-+config MTD_ZEFEERDZQ
-+ tristate "Map driver for DAVE Srl ZefeerDZQ processor module"
-+ depends on (MTD_CFI && MACH_ZEFEERDZQ)
-+ select MTD_PARTITIONS
-+ help
-+ Map driver for DAVE Srl ZefeerDZQ processor module.
-+
- endmenu
-
-diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
-index 2f7e254..a821568 100644
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -22,6 +22,7 @@ obj-$(CONFIG_MTD_AMD76XROM) += amd76xrom
- obj-$(CONFIG_MTD_ICHXROM) += ichxrom.o
- obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o
- obj-$(CONFIG_MTD_LUBBOCK) += lubbock-flash.o
-+obj-$(CONFIG_MTD_ADSFLASH) += ads-flash.o
- obj-$(CONFIG_MTD_MAINSTONE) += mainstone-flash.o
- obj-$(CONFIG_MTD_MBX860) += mbx860.o
- obj-$(CONFIG_MTD_CEIVA) += ceiva.o
-@@ -72,3 +73,5 @@ obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
- obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o
- obj-$(CONFIG_MTD_MTX1) += mtx-1_flash.o
- obj-$(CONFIG_MTD_TQM834x) += tqm834x.o
-+obj-$(CONFIG_MTD_ZEFEERDZB) += zefeerdzb.o
-+obj-$(CONFIG_MTD_ZEFEERDZQ) += zefeerdzq.o
-diff --git a/drivers/mtd/maps/ads-flash.c b/drivers/mtd/maps/ads-flash.c
-new file mode 100644
-index 0000000..2428e9c
---- /dev/null
-+++ b/drivers/mtd/maps/ads-flash.c
-@@ -0,0 +1,221 @@
-+/*
-+ * Map driver for the ADS PXA Boards.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/device.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+
-+#ifdef CONFIG_MACH_ADSVIX
-+#define NUM_CHIPS 1
-+#else
-+#define NUM_CHIPS 2
-+#endif
-+
-+#ifdef CONFIG_PXA27x
-+#define WINDOW_ADDR 0
-+#elif defined(CONFIG_ARCH_EP93XX)
-+#define WINDOW_ADDR 0x60000000
-+#else
-+#define WINDOW_ADDR 0x04000000
-+#endif
-+
-+#define WINDOW_SIZE (NUM_CHIPS * 32*1024*1024)
-+#define BLOCKSIZE (NUM_CHIPS * 0x20000)
-+#define BANKWIDTH (NUM_CHIPS * 2)
-+
-+static void pxa_map_inval_cache(struct map_info *map, unsigned long from, ssize_t len)
-+{
-+ consistent_sync((char *)map->cached + from, len, DMA_FROM_DEVICE);
-+}
-+
-+static struct map_info pxa_map = {
-+ .name = "pxa",
-+ .size = WINDOW_SIZE,
-+ .phys = WINDOW_ADDR,
-+ .virt = 0,
-+ .cached = (void *)NULL,
-+ .bankwidth = BANKWIDTH,
-+ .inval_cache = pxa_map_inval_cache,
-+};
-+
-+static struct mtd_partition ads_partitions[] = {
-+ {
-+ name: "boot",
-+ size: BLOCKSIZE,
-+ offset: 0,
-+ }, {
-+ name: "bootvars",
-+ size: BLOCKSIZE,
-+ offset: MTDPART_OFS_APPEND,
-+ }, {
-+ name: "zImage",
-+ size: 0x00180000,
-+ offset: MTDPART_OFS_APPEND,
-+ }, {
-+ name: "ramdisk.gz",
-+ size: 0x00500000,
-+ offset: MTDPART_OFS_APPEND,
-+ }, {
-+ name: "flashfs1",
-+ size: MTDPART_SIZ_FULL,
-+ offset: MTDPART_OFS_APPEND
-+ }
-+};
-+
-+unsigned char ads_flash_serial_id[32+2] = {0};
-+
-+static struct mtd_info *mymtd = NULL;
-+static struct mtd_partition *parsed_parts = NULL;
-+static int num_parts = 0;
-+static const char *probes[] = {
-+#ifdef CONFIG_MTD_CMDLINE_PARTS
-+ "cmdlinepart",
-+#endif
-+#ifdef CONFIG_MTD_REDBOOT_PARTS
-+ "RedBoot",
-+#endif
-+ NULL };
-+
-+// This implementation supports 1 or 2 chips.
-+static void ads_get_flash_serial_id(int chips)
-+{
-+ map_word val;
-+ unsigned int addr = 0x81 << chips;
-+ unsigned int mask = chips == 1 ? 0xffff : 0xffffffff;
-+ unsigned int tmp[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-+ int i;
-+
-+ /* read array mode */
-+ // *(__u32 *)pxa_map.virt = 0x00FF00FF;
-+ // *(__u16 *)pxa_map.virt = 0x00ff;
-+ val.x[0] = 0x00ff00ff & mask;
-+ map_write(&pxa_map, val, 0);
-+
-+ /* read id mode */
-+ // *(__u32 *)pxa_map.virt = 0x00900090;
-+ // *(__u16 *)pxa_map.virt = 0x0090;
-+ val.x[0] = 0x00900090 & mask;
-+ map_write(&pxa_map, val, 0);
-+
-+ for (i=0; i<8; i++) {
-+ // tmp[i] = 0x0000ffff & *(__u32 *)(pxa_map.virt + addr);
-+ // tmp[i] = *(__u16 *)(pxa_map.virt + addr);
-+ val = map_read(&pxa_map, addr);
-+ tmp[i] = val.x[0] & 0xffff;
-+ addr += BANKWIDTH;
-+ }
-+
-+ /* back to read array mode */
-+ // *(__u32 *)pxa_map.virt = 0x00FF00FF;
-+ // *(__u16 *)pxa_map.virt = 0x00ff;
-+ val.x[0] = 0x00ff00ff & mask;
-+ map_write(&pxa_map, val, 0);
-+
-+ sprintf(ads_flash_serial_id, "%04x%04x%04x%04x.%04x%04x%04x%04x",
-+ tmp[7], tmp[6], tmp[5], tmp[4], tmp[3], tmp[2], tmp[1], tmp[0]);
-+
-+}
-+
-+static int __init init_pxa_flash(void)
-+{
-+ struct mtd_partition *parts;
-+ char *part_type;
-+ int rtn;
-+
-+ printk(KERN_NOTICE "Probing PXA flash at physical address 0x%08x\n", WINDOW_ADDR);
-+ pxa_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
-+ if (!pxa_map.virt) {
-+ printk(KERN_ERR "Failed to ioremap flash\n");
-+ return -EIO;
-+ }
-+
-+ pxa_map.cached = __ioremap(WINDOW_ADDR, WINDOW_SIZE, L_PTE_CACHEABLE, 1);
-+ if (!pxa_map.cached)
-+ printk(KERN_WARNING "Failed to ioremap cached flash\n");
-+
-+ simple_map_init(&pxa_map);
-+
-+ mymtd = do_map_probe("cfi_probe", &pxa_map);
-+ if (!mymtd) {
-+ if (pxa_map.cached)
-+ iounmap((void *)pxa_map.cached);
-+ if (pxa_map.virt)
-+ iounmap((void *)pxa_map.virt);
-+ return -ENXIO;
-+ }
-+
-+#ifdef CONFIG_MTD_CMDLINE_PARTS
-+ pxa_map.name = "pxa";
-+ rtn = parse_mtd_partitions(mymtd, probes, &parsed_parts, 0);
-+ if (rtn <= 0) {
-+ pxa_map.name = "sa1100";
-+ rtn = parse_mtd_partitions(mymtd, probes, &parsed_parts, 0);
-+ }
-+ if (rtn > 0) {
-+ num_parts = rtn;
-+ parts = parsed_parts;
-+ part_type = "command line";
-+ goto add_parts;
-+ }
-+#endif
-+ num_parts = ARRAY_SIZE(ads_partitions);
-+ parts = ads_partitions;
-+ part_type = "static";
-+add_parts:
-+ if (num_parts) {
-+ printk(KERN_NOTICE "Using %s partition definition\n", part_type);
-+ add_mtd_partitions(mymtd, parts, num_parts);
-+#if 0
-+ if (mymtd->unlock) {
-+ int i;
-+ for (i = 0; i < num_parts; i++) {
-+ // unlock partition
-+ mymtd->unlock(mymtd, parts[num_parts - 1].offset,
-+ parts[num_parts - 1].size);
-+ }
-+ }
-+#endif
-+ }
-+ else {
-+ add_mtd_device(mymtd);
-+ }
-+
-+ ads_get_flash_serial_id(NUM_CHIPS);
-+
-+ return 0;
-+}
-+
-+static void __exit cleanup_pxa_flash(void)
-+{
-+ if (mymtd) {
-+ if (num_parts)
-+ del_mtd_partitions(mymtd);
-+ else
-+ del_mtd_device(mymtd);
-+ map_destroy(mymtd);
-+ if (parsed_parts)
-+ kfree(parsed_parts);
-+ }
-+ if (pxa_map.cached)
-+ iounmap((void *)pxa_map.cached);
-+ if (pxa_map.virt)
-+ iounmap((void *)pxa_map.virt);
-+}
-+
-+module_init(init_pxa_flash);
-+module_exit(cleanup_pxa_flash);
-+
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/mtd/maps/zefeerdzb.c b/drivers/mtd/maps/zefeerdzb.c
-new file mode 100644
-index 0000000..bb47bc6
---- /dev/null
-+++ b/drivers/mtd/maps/zefeerdzb.c
-@@ -0,0 +1,134 @@
-+/*
-+ * $Id: zefeerdzb.c,v 1.8 2004/07/12 21:59:44 dwmw2 Exp $
-+ *
-+ * drivers/mtd/maps/zefeerdzb.c
-+ *
-+ * FLASH map for the DAVE Srl ZefeerDZB processor module.
-+ *
-+ *
-+ * 2004 (c) DAVE Srl. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+
-+#include <asm/io.h>
-+
-+#if 0
-+/* Support for ZELK <= 0.9.5 */
-+#define WINDOW_ADDR 0x60000000
-+#else
-+#define WINDOW_ADDR 0x00000000
-+#endif
-+#define WINDOW_SIZE 0x00400000
-+
-+/* 128 kB U-Boot */
-+#define ZEFEERDZB_PART0_OF 0
-+#define ZEFEERDZB_PART0_SZ 0x20000
-+/* 128 kB U-Boot env #1 */
-+#define ZEFEERDZB_PART1_OF ZEFEERDZB_PART0_OF + ZEFEERDZB_PART0_SZ
-+#define ZEFEERDZB_PART1_SZ 0x20000
-+/* 128 kB U-Boot env #2 */
-+#define ZEFEERDZB_PART2_OF ZEFEERDZB_PART1_OF + ZEFEERDZB_PART1_SZ
-+#define ZEFEERDZB_PART2_SZ 0x20000
-+/* Linux kernel */
-+#define ZEFEERDZB_PART3_OF ZEFEERDZB_PART2_OF + ZEFEERDZB_PART2_SZ
-+#define ZEFEERDZB_PART3_SZ (0x200000 - ZEFEERDZB_PART2_SZ - ZEFEERDZB_PART1_SZ - ZEFEERDZB_PART0_SZ)
-+/* spare */
-+#define ZEFEERDZB_PART4_OF ZEFEERDZB_PART3_OF + ZEFEERDZB_PART3_SZ
-+#define ZEFEERDZB_PART4_SZ (0x400000 - ZEFEERDZB_PART3_SZ - ZEFEERDZB_PART2_SZ - ZEFEERDZB_PART1_SZ - ZEFEERDZB_PART0_SZ)
-+
-+static struct mtd_partition zefeerdzb_flash_partitions[] = {
-+ {
-+ .name = "U-Boot",
-+ .offset = ZEFEERDZB_PART0_OF,
-+ .size = ZEFEERDZB_PART0_SZ,
-+ .mask_flags = MTD_WRITEABLE /* force read-only */
-+ },
-+ {
-+ .name = "U-Boot environment #1",
-+ .offset = ZEFEERDZB_PART1_OF,
-+ .size = ZEFEERDZB_PART1_SZ,
-+ },
-+ {
-+ .name = "U-Boot environment #2",
-+ .offset = ZEFEERDZB_PART2_OF,
-+ .size = ZEFEERDZB_PART2_SZ,
-+ },
-+ {
-+ .name = "Linux kernel",
-+ .offset = ZEFEERDZB_PART3_OF,
-+ .size = ZEFEERDZB_PART3_SZ,
-+ },
-+ {
-+ .name = "spare 1",
-+ .offset = ZEFEERDZB_PART4_OF,
-+ .size = ZEFEERDZB_PART4_SZ,
-+ }
-+};
-+
-+struct map_info zefeerdzb_flash_map = {
-+ .name = "DAVE Srl ZefeerDZB",
-+ .size = WINDOW_SIZE,
-+ .bankwidth = 2,
-+ .phys = WINDOW_ADDR,
-+};
-+
-+#define NUM_ZEFEERDZB_FLASH_PARTITIONS \
-+ (sizeof(zefeerdzb_flash_partitions)/sizeof(zefeerdzb_flash_partitions[0]))
-+
-+static struct mtd_info *zefeerdzb_mtd;
-+
-+int __init init_zefeerdzb_flash(void)
-+{
-+ printk(KERN_NOTICE "zefeerdzb: flash mapping: %x at %x\n",
-+ WINDOW_SIZE, WINDOW_ADDR);
-+
-+ zefeerdzb_flash_map.virt =
-+ (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);
-+
-+ if (!zefeerdzb_flash_map.virt) {
-+ printk("init_zefeerdzb_flash: failed to ioremap\n");
-+ return -EIO;
-+ }
-+ simple_map_init(&zefeerdzb_flash_map);
-+
-+ zefeerdzb_mtd = do_map_probe("cfi_probe", &zefeerdzb_flash_map);
-+
-+ if (zefeerdzb_mtd) {
-+ zefeerdzb_mtd->owner = THIS_MODULE;
-+ return add_mtd_partitions(zefeerdzb_mtd,
-+ zefeerdzb_flash_partitions,
-+ NUM_ZEFEERDZB_FLASH_PARTITIONS);
-+ }
-+
-+ return -ENXIO;
-+}
-+
-+static void __exit cleanup_zefeerdzb_flash(void)
-+{
-+ if (zefeerdzb_mtd) {
-+ del_mtd_partitions(zefeerdzb_mtd);
-+ /* moved iounmap after map_destroy - armin */
-+ map_destroy(zefeerdzb_mtd);
-+ iounmap((void *)zefeerdzb_flash_map.virt);
-+ }
-+}
-+
-+module_init(init_zefeerdzb_flash);
-+module_exit(cleanup_zefeerdzb_flash);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("DAVE Srl <info@dave-tech.it>");
-+MODULE_DESCRIPTION
-+ ("MTD map driver for the DAVE Srl ZefeerDZB processor module");
-diff --git a/drivers/mtd/maps/zefeerdzq.c b/drivers/mtd/maps/zefeerdzq.c
-new file mode 100644
-index 0000000..dc0e402
---- /dev/null
-+++ b/drivers/mtd/maps/zefeerdzq.c
-@@ -0,0 +1,142 @@
-+/*
-+ * $Id: zefeerdzq.c,v 1.8 2004/07/12 21:59:44 dwmw2 Exp $
-+ *
-+ * drivers/mtd/maps/zefeerdzq.c
-+ *
-+ * FLASH map for the DAVE Srl ZefeerDZQ processor module.
-+ *
-+ *
-+ * 2004 (c) DAVE Srl. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+
-+#include <asm/io.h>
-+
-+#if 0
-+/* Support for ZELK <= 0.9.5 */
-+#define WINDOW_ADDR 0x60000000
-+#else
-+#define WINDOW_ADDR 0x00000000
-+#endif
-+#define WINDOW_SIZE 0x01000000
-+
-+/* 128 kB U-Boot */
-+#define ZEFEERDZQ_PART0_OF 0
-+#define ZEFEERDZQ_PART0_SZ 0x20000
-+/* 128 kB U-Boot env #1 */
-+#define ZEFEERDZQ_PART1_OF ZEFEERDZQ_PART0_OF + ZEFEERDZQ_PART0_SZ
-+#define ZEFEERDZQ_PART1_SZ 0x20000
-+/* 128 kB U-Boot env #2 */
-+#define ZEFEERDZQ_PART2_OF ZEFEERDZQ_PART1_OF + ZEFEERDZQ_PART1_SZ
-+#define ZEFEERDZQ_PART2_SZ 0x20000
-+/* Linux kernel */
-+#define ZEFEERDZQ_PART3_OF ZEFEERDZQ_PART2_OF + ZEFEERDZQ_PART2_SZ
-+#define ZEFEERDZQ_PART3_SZ (0x200000 - ZEFEERDZQ_PART2_SZ - ZEFEERDZQ_PART1_SZ - ZEFEERDZQ_PART0_SZ)
-+/* ramdisk */
-+#define ZEFEERDZQ_PART4_OF ZEFEERDZQ_PART3_OF + ZEFEERDZQ_PART3_SZ
-+#define ZEFEERDZQ_PART4_SZ (0x400000 - ZEFEERDZQ_PART3_SZ - ZEFEERDZQ_PART2_SZ - ZEFEERDZQ_PART1_SZ - ZEFEERDZQ_PART0_SZ)
-+/* spare */
-+#define ZEFEERDZQ_PART5_OF ZEFEERDZQ_PART4_OF + ZEFEERDZQ_PART4_SZ
-+#define ZEFEERDZQ_PART5_SZ (WINDOW_SIZE - ZEFEERDZQ_PART4_SZ - ZEFEERDZQ_PART3_SZ - ZEFEERDZQ_PART2_SZ - ZEFEERDZQ_PART1_SZ - ZEFEERDZQ_PART0_SZ)
-+
-+static struct mtd_partition zefeerdzq_flash_partitions[] = {
-+ {
-+ .name = "U-Boot",
-+ .offset = ZEFEERDZQ_PART0_OF,
-+ .size = ZEFEERDZQ_PART0_SZ,
-+ .mask_flags = MTD_WRITEABLE /* force read-only */
-+ },
-+ {
-+ .name = "U-Boot environment #1",
-+ .offset = ZEFEERDZQ_PART1_OF,
-+ .size = ZEFEERDZQ_PART1_SZ,
-+ },
-+ {
-+ .name = "U-Boot environment #2",
-+ .offset = ZEFEERDZQ_PART2_OF,
-+ .size = ZEFEERDZQ_PART2_SZ,
-+ },
-+ {
-+ .name = "Linux kernel",
-+ .offset = ZEFEERDZQ_PART3_OF,
-+ .size = ZEFEERDZQ_PART3_SZ,
-+ },
-+ {
-+ .name = "spare 1",
-+ .offset = ZEFEERDZQ_PART4_OF,
-+ .size = ZEFEERDZQ_PART4_SZ,
-+ },
-+ {
-+ .name = "spare 2",
-+ .offset = ZEFEERDZQ_PART5_OF,
-+ .size = ZEFEERDZQ_PART5_SZ,
-+ }
-+};
-+
-+struct map_info zefeerdzq_flash_map = {
-+ .name = "DAVE Srl ZefeerDZQ",
-+ .size = WINDOW_SIZE,
-+ .bankwidth = 2,
-+ .phys = WINDOW_ADDR,
-+};
-+
-+#define NUM_ZEFEERDZQ_FLASH_PARTITIONS \
-+ (sizeof(zefeerdzq_flash_partitions)/sizeof(zefeerdzq_flash_partitions[0]))
-+
-+static struct mtd_info *zefeerdzq_mtd;
-+
-+int __init init_zefeerdzq_flash(void)
-+{
-+ printk(KERN_NOTICE "zefeerdzq: flash mapping: %x at %x\n",
-+ WINDOW_SIZE, WINDOW_ADDR);
-+
-+ zefeerdzq_flash_map.virt =
-+ (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);
-+
-+ if (!zefeerdzq_flash_map.virt) {
-+ printk("init_zefeerdzq_flash: failed to ioremap\n");
-+ return -EIO;
-+ }
-+ simple_map_init(&zefeerdzq_flash_map);
-+
-+ zefeerdzq_mtd = do_map_probe("cfi_probe", &zefeerdzq_flash_map);
-+
-+ if (zefeerdzq_mtd) {
-+ zefeerdzq_mtd->owner = THIS_MODULE;
-+ return add_mtd_partitions(zefeerdzq_mtd,
-+ zefeerdzq_flash_partitions,
-+ NUM_ZEFEERDZQ_FLASH_PARTITIONS);
-+ }
-+
-+ return -ENXIO;
-+}
-+
-+static void __exit cleanup_zefeerdzq_flash(void)
-+{
-+ if (zefeerdzq_mtd) {
-+ del_mtd_partitions(zefeerdzq_mtd);
-+ /* moved iounmap after map_destroy - armin */
-+ map_destroy(zefeerdzq_mtd);
-+ iounmap((void *)zefeerdzq_flash_map.virt);
-+ }
-+}
-+
-+module_init(init_zefeerdzq_flash);
-+module_exit(cleanup_zefeerdzq_flash);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("DAVE Srl <info@dave-tech.it>");
-+MODULE_DESCRIPTION
-+ ("MTD map driver for the DAVE Srl ZefeerDZQ processor module");
-diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
-index 1fc4c13..8e79d32 100644
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -109,6 +109,12 @@ config MTD_NAND_S3C2410_HWECC
- currently not be able to switch to software, as there is no
- implementation for ECC method used by the S3C2410
-
-+config MTD_NAND_ZEFEEREVB
-+ tristate "NAND Flash device on ZefeerEVB (L/H) board"
-+ depends on (MACH_ZEFEERDZA || MACH_ZEFEERDZB || MACH_ZEFEERDZG || MACH_ZEFEERDZN || MACH_ZEFEERDZQ) && MTD_NAND
-+ help
-+ This enables the NAND flash driver on the ZefeerEVB Board (L or H version).
-+
- config MTD_NAND_DISKONCHIP
- tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)"
- depends on MTD_NAND && EXPERIMENTAL
-diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
-index 4174202..bee7760 100644
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -18,5 +18,6 @@ obj-$(CONFIG_MTD_NAND_H1900) += h1910.o
- obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o
- obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o
- obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o
-+obj-$(CONFIG_MTD_NAND_ZEFEEREVB) += zefeerevb.o
-
- nand-objs = nand_base.o nand_bbt.o
-diff --git a/drivers/mtd/nand/zefeerevb.c b/drivers/mtd/nand/zefeerevb.c
-new file mode 100644
-index 0000000..b67e958
---- /dev/null
-+++ b/drivers/mtd/nand/zefeerevb.c
-@@ -0,0 +1,280 @@
-+/*
-+ * drivers/mtd/nand/zefeerevb.c
-+ *
-+ * Copyright (C) 2004 DAVE Srl (info@dave-tech.it)
-+ *
-+ *
-+ *
-+ * $Id: zefeerevb.c,v 1.4 2004/10/05 13:50:20 gleixner Exp $
-+ *
-+ * 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.
-+ *
-+ * Overview:
-+ * This is a device driver for the NAND flash devices found on the
-+ * ZefeerEVB board (Samsung K9F5608U0B 32MB).
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/mtd/partitions.h>
-+#include <asm/arch/regmap.h>
-+#include <asm/arch/zefeerevb.h>
-+#include <asm/io.h>
-+
-+#define USE_READY_BUSY_PIN
-+/* see datasheets (tR) */
-+#define NAND_BIG_DELAY_US 25
-+#define NAND_SMALL_DELAY_US 10
-+
-+/* handy sizes */
-+#define SZ_4M 0x00400000
-+#define NAND_SMALL_SIZE 0x02000000
-+#define NAND_EVB_MTD_NAME "zefeerevb-nand"
-+
-+/* Macros to perform I/O operations */
-+#define MACRO_NAND_DISABLE_CE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) | NAND_EVB_nCE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_ENABLE_CE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) & ~NAND_EVB_nCE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_CTL_CLRALE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) & ~NAND_EVB_ALE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_CTL_SETALE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) | NAND_EVB_ALE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_CTL_CLRCLE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) & ~NAND_EVB_CLE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_CTL_SETCLE(nandptr) do \
-+{ \
-+ writel(readl((volatile unsigned*)GPIO_PADR) | NAND_EVB_CLE_GPIO_PIN, (volatile unsigned*)GPIO_PADR); \
-+} while(0)
-+
-+#define MACRO_NAND_WAIT_READY(nand) \
-+while ( !(readl((volatile unsigned*)GPIO_PADR) & NAND_EVB_RB_GPIO_PIN); )
-+
-+/*
-+ * MTD structure for ZefeerEVB board
-+ */
-+static struct mtd_info *zefeerevb_mtd = NULL;
-+
-+/*
-+ * Module stuff
-+ */
-+static int zefeerevb_fio_pbase = ZEFEEREVB_NAND_PADDR;
-+
-+#ifdef MODULE
-+MODULE_PARM(zefeerevb_fio_pbase, "i");
-+__setup("zefeerevb_fio_pbase=", zefeerevb_fio_pbase);
-+#endif
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+/*
-+ * Define static partitions for flash devices
-+ */
-+static struct mtd_partition partition_info_evb[] = {
-+ {name:"ZefeerEVB Nand Flash",
-+ offset:0,
-+ size:32 * 1024 * 1024}
-+};
-+
-+#define NUM_PARTITIONS 1
-+
-+extern int parse_cmdline_partitions(struct mtd_info *master,
-+ struct mtd_partition **pparts,
-+ const char *mtd_id);
-+#endif
-+
-+static void zefeerevb_hwcontrol(struct mtd_info *mtdinfo, int cmd)
-+{
-+ switch (cmd) {
-+
-+ case NAND_CTL_SETCLE:
-+ MACRO_NAND_CTL_SETCLE((unsigned long)0);
-+ break;
-+ case NAND_CTL_CLRCLE:
-+ MACRO_NAND_CTL_CLRCLE((unsigned long)0);
-+ break;
-+ case NAND_CTL_SETALE:
-+ MACRO_NAND_CTL_SETALE((unsigned long)0);
-+ break;
-+ case NAND_CTL_CLRALE:
-+ MACRO_NAND_CTL_CLRALE((unsigned long)0);
-+ break;
-+ case NAND_CTL_SETNCE:
-+ MACRO_NAND_ENABLE_CE((unsigned long)0);
-+ break;
-+ case NAND_CTL_CLRNCE:
-+ MACRO_NAND_DISABLE_CE((unsigned long)0);
-+ break;
-+ }
-+}
-+
-+#ifdef USE_READY_BUSY_PIN
-+/*
-+ * read device ready pin
-+ */
-+static int zefeerevb_device_ready(struct mtd_info *minfo)
-+{
-+ return (readl((volatile unsigned *)GPIO_PADR) &
-+ NAND_EVB_RB_GPIO_PIN);
-+}
-+#endif
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+const char *part_probes_evb[] = { "cmdlinepart", NULL };
-+#endif
-+
-+/*
-+ * Main initialization routine
-+ */
-+static int __init zefeerevb_init(void)
-+{
-+ struct nand_chip *this;
-+ const char *part_type = 0;
-+ int mtd_parts_nb = 0;
-+ struct mtd_partition *mtd_parts = 0;
-+ void __iomem *zefeerevb_fio_base;
-+ u32 tmp;
-+
-+ /* Init I/O pins */
-+ MACRO_NAND_DISABLE_CE(0);
-+ MACRO_NAND_CTL_CLRALE(0);
-+ MACRO_NAND_CTL_CLRCLE(0);
-+
-+ tmp = (u32) readl(GPIO_PADDR);
-+ tmp |=
-+ (NAND_EVB_nCE_GPIO_PIN | NAND_EVB_CLE_GPIO_PIN |
-+ NAND_EVB_ALE_GPIO_PIN);
-+#ifdef USE_READY_BUSY_PIN
-+ tmp &= ~NAND_EVB_RB_GPIO_PIN;
-+#endif
-+ writel(tmp, GPIO_PADDR);
-+
-+ /* Init I/O pins */
-+ MACRO_NAND_DISABLE_CE(0);
-+ MACRO_NAND_CTL_CLRALE(0);
-+ MACRO_NAND_CTL_CLRCLE(0);
-+
-+ /* Set up chip select */
-+ writel((0 << 30) | (0 << 28) | (0 << 27) | (0 << 26) | (0 << 11) |
-+ (1 << 10) | (4 << 5) | (6 << 0), SMCBCR2);
-+
-+ /* Allocate memory for MTD device structure and private data */
-+ zefeerevb_mtd = kmalloc(sizeof(struct mtd_info) +
-+ sizeof(struct nand_chip), GFP_KERNEL);
-+ if (!zefeerevb_mtd) {
-+ printk
-+ ("Unable to allocate ZefeerEVB NAND MTD device structure.\n");
-+ return -ENOMEM;
-+ }
-+
-+ /* map physical address */
-+ zefeerevb_fio_base =
-+ (void __iomem *)ioremap(zefeerevb_fio_pbase, SZ_4M);
-+ if (!zefeerevb_fio_base) {
-+ printk("ioremap ZefeerEVB NAND flash failed\n");
-+ kfree(zefeerevb_mtd);
-+ return -EIO;
-+ }
-+
-+ /* Get pointer to private data */
-+ this = (struct nand_chip *)(&zefeerevb_mtd[1]);
-+
-+ /* Initialize structures */
-+ memset((char *)zefeerevb_mtd, 0, sizeof(struct mtd_info));
-+ memset((char *)this, 0, sizeof(struct nand_chip));
-+
-+ /* Link the private data with the MTD structure */
-+ zefeerevb_mtd->priv = this;
-+
-+ /* insert callbacks */
-+ this->IO_ADDR_R = (void __iomem *)zefeerevb_fio_base;
-+ this->IO_ADDR_W = (void __iomem *)zefeerevb_fio_base;
-+ this->hwcontrol = zefeerevb_hwcontrol;
-+#ifdef USE_READY_BUSY_PIN
-+ this->dev_ready = zefeerevb_device_ready;
-+#endif
-+ this->chip_delay = NAND_SMALL_DELAY_US;
-+
-+ /* ECC mode */
-+ this->eccmode = NAND_ECC_SOFT;
-+
-+ /* Scan to find existence of the device */
-+ if (nand_scan(zefeerevb_mtd, 1)) {
-+ iounmap((void *)zefeerevb_fio_base);
-+ kfree(zefeerevb_mtd);
-+ return -ENXIO;
-+ }
-+#ifdef CONFIG_MTD_PARTITIONS
-+ zefeerevb_mtd->name = NAND_EVB_MTD_NAME;
-+ mtd_parts_nb =
-+ parse_mtd_partitions(zefeerevb_mtd, part_probes_evb, &mtd_parts, 0);
-+ if (mtd_parts_nb > 0)
-+ part_type = "command line";
-+ else
-+ mtd_parts_nb = 0;
-+#endif
-+ if (mtd_parts_nb == 0) {
-+#ifdef CONFIG_MTD_PARTITIONS
-+ mtd_parts = partition_info_evb;
-+ mtd_parts_nb = NUM_PARTITIONS;
-+#endif
-+ part_type = "static";
-+ }
-+
-+ /* Register the partitions */
-+ printk(KERN_NOTICE "Using %s partition definition\n", part_type);
-+ add_mtd_partitions(zefeerevb_mtd, mtd_parts, mtd_parts_nb);
-+
-+ /* Return happy */
-+ return 0;
-+}
-+
-+module_init(zefeerevb_init);
-+
-+#ifdef MODULE
-+/*
-+ * Clean up routine
-+ */
-+static void __exit zefeerevb_cleanup(void)
-+{
-+ struct nand_chip *this;
-+
-+ /* Release resources, unregister device(s) */
-+ nand_release(zefeer_mtd);
-+ nand_release(zefeerevb_mtd);
-+
-+ /* Release iomaps */
-+ this = (struct nand_chip *)&zefeer_mtd[1];
-+ iounmap((void *)this->zefeer_fio_base;
-+ this = (struct nand_chip *)&zefeerevb_mtd[1];
-+ iounmap((void *)this->zefeerevb_fio_base;
-+ /* Free the MTD device structure */
-+ kfree(zefeer_mtd);
-+ kfree(zefeerevb_mtd);
-+ }
-+
-+ module_exit(zefeerevb_cleanup);
-+#endif
-+ MODULE_LICENSE("GPL");
-+ MODULE_AUTHOR("DAVE Srl <support-zefeer@dave-tech.it>");
-+ MODULE_DESCRIPTION
-+ ("MTD map driver for DAVE Srl ZefeerEVB (L/H) board");
-diff --git a/drivers/net/arm/Kconfig b/drivers/net/arm/Kconfig
-index 470364d..12afe1d 100644
---- a/drivers/net/arm/Kconfig
-+++ b/drivers/net/arm/Kconfig
-@@ -44,3 +44,13 @@ config ARM_ETHER00
- will generate a suitable hw address based on the board serial
- number (MTD support is required for this). Otherwise you will
- need to set a suitable hw address using ifconfig.
-+
-+config EP93XX_ETHERNET
-+ tristate "EP93xx Ethernet support"
-+ depends on NET_ETHERNET && ARM && ARCH_EP93XX
-+ select CRC32
-+ select MII
-+ help
-+ This is a driver for the ethernet hardware included in EP93xx CPUs.
-+ Say Y if you are building a kernel for EP93xx based devices.
-+
-diff --git a/drivers/net/arm/Makefile b/drivers/net/arm/Makefile
-index b0d7068..c1539da 100644
---- a/drivers/net/arm/Makefile
-+++ b/drivers/net/arm/Makefile
-@@ -8,3 +8,4 @@ obj-$(CONFIG_ARM_ETHER00) += ether00.o
- obj-$(CONFIG_ARM_ETHERH) += etherh.o
- obj-$(CONFIG_ARM_ETHER3) += ether3.o
- obj-$(CONFIG_ARM_ETHER1) += ether1.o
-+obj-$(CONFIG_EP93XX_ETHERNET) += ep93xx_eth.o
-diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c
-new file mode 100644
-index 0000000..e314549
---- /dev/null
-+++ b/drivers/net/arm/ep93xx_eth.c
-@@ -0,0 +1,1412 @@
-+/*
-+ * ep93xx_eth.c
-+ * Ethernet Device Driver for Cirrus Logic EP93xx.
-+ *
-+ * Copyright (C) 2003 by Cirrus Logic www.cirrus.com
-+ * This software may be used and distributed according to the terms
-+ * of the GNU Public License.
-+ *
-+ * This driver was written based on skeleton.c by Donald Becker and
-+ * smc9194.c by Erik Stahlman.
-+ *
-+ * Getting a MAC address:
-+ *
-+ * Former versions of this driver got their MAC from I2C EEPROM or even used
-+ * hardcoded ones. Unfortunately I had to remove the board dependant I2C stuff,
-+ * and use a random generated MAC instead of the hardcoded one. Good news is
-+ * the there is support for setting the MAC from userspace now. (see below)
-+ *
-+ * first consider some potential problems if you use this random generated MAC:
-+ *
-+ * you can no longer count on it to be really unique
-+ * identifying a particular board over network will be difficult
-+ * DHCP servers can no longer use the MAC for assigning static IPs
-+ * DHCP servers with long leasetimes quickly run out of leases
-+ * ...
-+ *
-+ * So how can you set a valid MAC from userspace then?
-+ *
-+ * Let's say you've just bought your OUI from IEEE and it's "aa:bb:cc"
-+ * Now you'd like to assign the MAC for your EP93xx board with serial #5
-+ * MAC = OUI<<24 + serial number = aa:bb:cc:00:00:05
-+ *
-+ * ifconfig eth0 hw ether aa:bb:cc:00:00:05 # first set the MAC
-+ * ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up # then set the IP
-+ *
-+ * Apart from hardcoding this lines in your startup scripts you could also use
-+ * some userspace utility to read (and set) the MAC from eeprom, flash, ...
-+ *
-+ * History:
-+ * 07/19/01 0.1 Sungwook Kim initial release
-+ * 10/16/01 0.2 Sungwook Kim add workaround for ignorance of Tx request
-+ * while sending frame
-+ * add some error stuations handling
-+ *
-+ * 03/25/03 Melody Lee Modified for EP93xx
-+ *
-+ * 2004/2005 Michael Burian porting to linux-2.6
-+ * 2005-10-12 Michael Burian fix problems when setting MAC with ifconfig
-+ * 2005-10-30 Michael Burian cleanups, ethtool support
-+ */
-+
-+/* TODO:
-+ * 1. try if it's possible to use skbuff directly for RX/TX (avoid memcpy)
-+ * 2. use kzalloc instead of kmalloc+memset
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/fcntl.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <linux/in.h>
-+#include <linux/delay.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/mii.h>
-+#include <linux/crc32.h>
-+#include <linux/random.h>
-+#include <linux/ethtool.h>
-+
-+#include <asm/system.h>
-+#include <asm/bitops.h>
-+#include <asm/io.h>
-+#include <asm/dma.h>
-+#include <asm/irq.h>
-+#include <asm/arch/hardware.h>
-+
-+#include "ep93xx_eth.h"
-+
-+#define DRV_NAME "ep93xx_eth"
-+#define DRV_VERSION "2.8"
-+#define DRV_DATE "2005-11-08"
-+
-+static const char *version = DRV_NAME ": version " DRV_VERSION " " DRV_DATE \
-+ " Cirrus Logic\n";
-+
-+/* total number of device instance, 0 means the 1st instance. */
-+static int num_of_instance;
-+static struct net_device * ep93xx_etherdev;
-+
-+/*
-+ * A List of default device port configuration for auto probing.
-+ * At this time, the CPU has only one Ethernet device,
-+ * but better to support multiple device configuration.
-+ * Keep in mind that the array must end in zero.
-+ */
-+
-+/* We get the MAC_BASE from include/asm-arm/arch-ep93xx/regmap.h */
-+static struct {
-+ unsigned int base_addr; /* base address, (0:end mark) */
-+ int irq; /* IRQ number, (0:auto detect) */
-+} port_list[] __initdata = {
-+ {
-+ MAC_BASE, 39}, {
-+ 0 /* end mark */ , 0}
-+};
-+
-+/*
-+ * Some definitions belong to the operation of this driver.
-+ * You should understand how it affect to driver before any modification.
-+ */
-+
-+/* Interrupt Sources in Use */
-+#define DEF_INT_SRC (IntEn_TxSQIE|IntEn_RxEOFIE|IntEn_RxEOBIE|IntEn_RxHDRIE)
-+
-+/*
-+ * Length of Device Queue in number of entries
-+ * (must be less than or equal to 255)
-+ */
-+
-+/* length of Rx Descriptor Queue (4 or bigger) Must be power of 2. */
-+#define LQRXD 64
-+#define LQRXS LQRXD /* length of Rx Status Queue */
-+
-+/* length of Tx Descriptor Queue (4 or bigger) Must be power of 2. */
-+#define LQTXD 8
-+#define LQTXS LQTXD /* length of Tx Status Queue */
-+
-+/* Tx Queue fill-up level control */
-+#define LVL_TXSTOP LQTXD - 2 /* level to ask the stack to stop Tx */
-+#define LVL_TXRESUME 2 /* level to ask the stack to resume Tx */
-+
-+/* Rx Buffer length in byte */
-+#define LRXB (1518+2+16) /* length of Rx buf, must be 4-byte aligned */
-+#define LTXB LRXB
-+
-+#define EP93XX_DEF_MSG (NETIF_MSG_DRV | \
-+ NETIF_MSG_PROBE | \
-+ NETIF_MSG_LINK | \
-+ NETIF_MSG_RX_ERR | \
-+ NETIF_MSG_TX_ERR | \
-+ NETIF_MSG_HW)
-+
-+#define DBG(lvl,msg,args...) do { printk(lvl"%s:%d: %s(): " msg, __FILE__, \
-+ __LINE__, __FUNCTION__, ## args); } while (0)
-+
-+/*
-+ * Custom Data Structures
-+ */
-+
-+/*
-+ * the information about the buffer passed to device.
-+ * there are matching bufdsc informations
-+ * for each Tx/Rx Descriptor Queue entry to trace
-+ * the buffer within those queues.
-+ */
-+struct bufdsc {
-+ /* virtual address representing the buffer passed to device */
-+ void *vaddr;
-+ /* free routine */
-+ int (*free_rout) (void *buf);
-+};
-+
-+/* device private information */
-+struct ep93xx_priv {
-+ /* static device information */
-+ int id; /* device instance ID */
-+ /* pointers to various queues (virtual address) */
-+ struct rx_dsc *rdq; /* Rx Descriptor Queue */
-+ struct rx_sts *rsq; /* Rx Status Queue */
-+ struct tx_dsc *tdq; /* Tx Descriptor Queue */
-+ struct tx_sts *tsq; /* Tx Status Queue */
-+ unsigned char *rxbuf; /* base of Rx Buffer pool */
-+ unsigned char *txbuf; /* base of Tx Buffer pool */
-+ struct bufdsc *rxbd; /* Rx Buffers info */
-+ struct bufdsc *txbd; /* Tx Buffers info */
-+ /* physical addresses of the same queues */
-+ dma_addr_t p_qbase; /* base */
-+ dma_addr_t p_rdq; /* Rx Descriptor Queue */
-+ dma_addr_t p_rsq; /* Rx Status Queue */
-+ dma_addr_t p_tdq; /* Tx Descriptor Queue */
-+ dma_addr_t p_tsq; /* Tx Status Queue */
-+ dma_addr_t p_rxbuf; /* Rx Buffer pool */
-+ dma_addr_t p_txbuf; /* Tx Buffer pool */
-+ /* MII Bus ID of Ethernet PHY */
-+ struct mii_if_info mii;
-+ /* lock for mii when using ioctls */
-+ spinlock_t mii_lock;
-+ /* dynamic information, subject to clear when device open */
-+ struct net_device_stats stats; /* statistic data */
-+ /* next processing index of device queues */
-+ int idx_rdq;
-+ int idx_rsq;
-+ int idx_tdqhead;
-+ int idx_tdqtail;
-+ int idx_tsq;
-+ void __iomem *base_addr; /* base address */
-+ u32 msg_enable;
-+ int regs_len;
-+};
-+
-+/*
-+ * Internal Routines
-+ */
-+
-+static inline unsigned int next_index(unsigned int idx_cur, unsigned int len)
-+{
-+ return (idx_cur + 1) % len; /* next array index */
-+}
-+
-+static inline u32 _rdl(struct net_device *dev, u32 reg)
-+{
-+ return readl(((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrl(struct net_device *dev, u32 val, u32 reg)
-+{
-+ writel(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrw(struct net_device *dev, u16 val, u32 reg)
-+{
-+ writew(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+static inline void _wrb(struct net_device *dev, u8 val, u32 reg)
-+{
-+ writeb(val, ((struct ep93xx_priv *)(netdev_priv(dev)))->base_addr + reg);
-+}
-+
-+/**
-+ * wait_on_reg()
-+ */
-+static int wait_on_reg(struct net_device *dev, int reg, unsigned long mask, unsigned long expect)
-+{
-+ int i, dt;
-+
-+ for (i = 0; i < 10000; i++) {
-+ dt = _rdl(dev, reg);
-+ dt = (dt ^ expect) & mask;
-+ if (0 == dt)
-+ break;
-+ }
-+ return dt;
-+}
-+
-+/**
-+ * mdio_write()
-+ */
-+static void mdio_write(struct net_device *dev, int idPhy, int reg, int dt)
-+{
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ _wrl(dev, dt, REG_MIIData);
-+ _wrl(dev, MIICmd_OP_WR | ((idPhy & 0x1f) << 5) | ((reg & 0x1f) << 0), REG_MIICmd);
-+}
-+
-+/**
-+ * mdio_read()
-+ */
-+static int mdio_read(struct net_device *dev, int idPhy, int reg)
-+{
-+ int dt;
-+
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ _wrl(dev, MIICmd_OP_RD | ((idPhy & 0x1f) << 5) | ((reg & 0x1f) << 0), REG_MIICmd);
-+
-+ wait_on_reg(dev, REG_MIISts, MIISts_Busy, ~MIISts_Busy);
-+ dt = _rdl(dev, REG_MIIData);
-+
-+ return dt & 0xffff;
-+}
-+
-+/**
-+ * phy_init()
-+ */
-+static void phy_init(struct net_device *dev)
-+{
-+
-+ u32 oldval;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ oldval = _rdl(dev, REG_SelfCTL);
-+
-+ /* Set MDC clock to be divided by 8 and disable PreambleSuppress bit */
-+ _wrl(dev, 0x0e00, REG_SelfCTL);
-+
-+ if (mii_link_ok(&(priv->mii)))
-+ mii_check_media(&(priv->mii), netif_msg_link(priv), 1);
-+
-+ /* restore the old value */
-+ _wrl(dev, oldval, REG_SelfCTL);
-+}
-+
-+/**
-+ * devQue_start()
-+ *
-+ * make descriptor queues active
-+ * allocate queue entries if needed
-+ * and set device registers up to make it operational
-+ * assume device has been initialized
-+ */
-+static int devQue_start(struct net_device *dev)
-+{
-+ int err;
-+ int i;
-+ void *buf;
-+ u32 phy_addr;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* turn off device bus mastering */
-+ _wrl(dev, BMCtl_RxDis | BMCtl_TxDis | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+ err = wait_on_reg(dev, REG_BMSts, BMSts_TxAct, ~BMSts_TxAct);
-+ err |= wait_on_reg(dev, REG_BMSts, BMSts_RxAct, ~BMSts_RxAct);
-+ if (err && netif_msg_hw(priv))
-+ DBG(KERN_ERR, "%s: BM does not stop\n", dev->name);
-+
-+ /* Tx Status Queue */
-+ memset(priv->tsq, 0, sizeof(priv->tsq[0]) * LQTXS);
-+ priv->idx_tsq = 0;
-+ _wrl(dev, priv->p_tsq, REG_TxSBA);
-+ _wrl(dev, priv->p_tsq, REG_TxSCA);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSBL);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSCL);
-+
-+ /* Tx Descriptor Queue */
-+ memset(priv->tdq, 0, sizeof(priv->tdq[0]) * LQTXD);
-+ priv->idx_tdqhead = priv->idx_tdqtail = 0;
-+ _wrl(dev, priv->p_tdq, REG_TxDBA);
-+ _wrl(dev, priv->p_tdq, REG_TxDCA);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDBL);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDCL);
-+
-+ /* Rx Status Queue */
-+ memset(priv->rsq, 0, sizeof(priv->rsq[0]) * LQRXS);
-+ priv->idx_rsq = 0;
-+ _wrl(dev, priv->p_rsq, REG_RxSBA);
-+ _wrl(dev, priv->p_rsq, REG_RxSCA);
-+ _wrw(dev, sizeof(priv->rsq[0]) * LQRXS, REG_RxSBL);
-+ _wrw(dev, sizeof(priv->rsq[0]) * LQRXS, REG_RxSCL);
-+
-+ /* Rx Descriptor Queue */
-+ memset(priv->rdq, 0, sizeof(priv->rdq[0]) * LQRXD);
-+ phy_addr = priv->p_rxbuf;
-+ for (i = 0; i < LQRXD; i++) {
-+ priv->rdq[i].bi = i; /* index */
-+ priv->rdq[i].ba = phy_addr; /* physical address */
-+ priv->rdq[i].bl = LRXB; /* length */
-+ phy_addr += LRXB;
-+ }
-+ priv->idx_rdq = 0;
-+ _wrl(dev, priv->p_rdq, REG_RxDBA);
-+ _wrl(dev, priv->p_rdq, REG_RxDCA);
-+ _wrw(dev, sizeof(priv->rdq[0]) * LQRXD, REG_RxDBL);
-+ _wrw(dev, sizeof(priv->rdq[0]) * LQRXD, REG_RxDCL);
-+
-+ /* init Rx Buffer Descriptors */
-+ buf = priv->rxbuf;
-+ for (i = 0; i < LQRXD; i++) {
-+ priv->rxbd[i].vaddr = buf;
-+ priv->rxbd[i].free_rout = NULL;
-+ buf += LRXB;
-+ }
-+
-+ /* init Tx Buffer Descriptors */
-+ memset(priv->txbd, 0x0, sizeof(*priv->txbd) * LQTXD);
-+
-+ buf = priv->txbuf;
-+ for (i = 0; i < LQTXD; i++) {
-+ priv->txbd[i].vaddr = buf;
-+ priv->txbd[i].free_rout = NULL;
-+ buf += LTXB;
-+ }
-+
-+ /* turn on device bus mastering */
-+ _wrl(dev, BMCtl_TxEn | BMCtl_RxEn | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+ err = wait_on_reg(dev, REG_BMSts, BMSts_TxAct | BMSts_TxAct, BMSts_TxAct | BMSts_TxAct);
-+ if (err && netif_msg_hw(priv))
-+ DBG(KERN_ERR, "%s: BM does not start\n", dev->name);
-+
-+ /* Enqueue whole entries; this must be done after BM activation */
-+ _wrl(dev, LQRXS, REG_RxSEQ); /* Rx Status Queue */
-+ _wrl(dev, LQRXD, REG_RxDEQ); /* Rx Desc. queue */
-+
-+ return 0;
-+}
-+
-+/**
-+ * devQue_init()
-+ * init device descriptor queues at system level
-+ * device access is not recommended at this point
-+ *
-+ */
-+static int devQue_init(struct net_device *dev)
-+{
-+ void *buf;
-+ void *tmp;
-+ int size, size2;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* verify device Tx/Rx Descriptor/Status Queue data size */
-+ if (8 != sizeof(struct rx_dsc)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof rx_dsc != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (8 != sizeof(struct rx_sts)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof rx_sts != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (8 != sizeof(struct tx_dsc)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof tx_dsc != 8 bytes!\n");
-+ return -ENOMEM;
-+ } else if (4 != sizeof(struct tx_sts)) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "sizeof tx_sts != 4 bytes!\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ allocate kernel memory for whole queues
-+ best if non-cached memory block due to DMA access by the device
-+ if CPU doesn't have bus snooping
-+ */
-+ size = sizeof(struct rx_dsc) * (LQRXD + 1) +
-+ sizeof(struct rx_sts) * (LQRXS + 1) +
-+ sizeof(struct tx_dsc) * (LQTXD + 1) +
-+ sizeof(struct tx_sts) * (LQTXS + 1) + sizeof(unsigned long) * 4;
-+
-+ buf = tmp = dma_alloc_coherent(NULL, size, &priv->p_qbase, GFP_KERNEL | GFP_DMA);
-+ if (!buf) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for queue\n");
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ * assign memory to each queue
-+ */
-+ priv->rdq = buf;
-+ buf = buf + sizeof(struct rx_dsc) * (LQRXD + 1);
-+ priv->rsq = buf;
-+ buf = buf + sizeof(struct rx_sts) * (LQRXS + 1);
-+ priv->tdq = buf;
-+ buf = buf + sizeof(struct tx_dsc) * (LQTXD + 1);
-+ priv->tsq = buf;
-+ buf = buf + sizeof(struct tx_sts) * (LQTXS + 1);
-+
-+ /*
-+ * store physical address of each queue
-+ */
-+ priv->p_rdq = priv->p_qbase;
-+ priv->p_rsq = priv->p_rdq + ((u32) priv->rsq - (u32) priv->rdq);
-+ priv->p_tdq = priv->p_rdq + ((u32) priv->tdq - (u32) priv->rdq);
-+ priv->p_tsq = priv->p_rdq + ((u32) priv->tsq - (u32) priv->rdq);
-+
-+ /*
-+ * init queue entries
-+ */
-+ memset(priv->rdq, 0, sizeof(struct rx_dsc) * LQRXD);
-+ memset(priv->rsq, 0, sizeof(struct rx_sts) * LQRXS);
-+ memset(priv->tdq, 0, sizeof(struct tx_dsc) * LQTXD);
-+ memset(priv->tsq, 0, sizeof(struct tx_sts) * LQTXS);
-+
-+ /* Allocate Rx Buffer
-+ (We might need to copy from Rx buf to skbuff in whatever case,
-+ because device bus master requires 32bit aligned Rx buffer address
-+ but Linux network stack requires odd 16bit aligned Rx buf address) */
-+ priv->rxbuf = dma_alloc_coherent(NULL, LRXB * LQRXD, &priv->p_rxbuf, GFP_KERNEL | GFP_DMA);
-+
-+ if (!priv->rxbuf) {
-+ priv->rxbuf = NULL;
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for RxBuf\n");
-+ goto err_free_qbase_1;
-+ }
-+
-+ /* Allocate Tx Buffer */
-+ priv->txbuf = dma_alloc_coherent(NULL, LTXB * LQTXD, &priv->p_txbuf, GFP_KERNEL | GFP_DMA);
-+
-+ if (!priv->txbuf) {
-+ priv->txbuf = NULL;
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for TxBuf\n");
-+ goto err_free_rxbuf_2;
-+ }
-+
-+ /*
-+ * allocate kernel memory for buffer descriptors
-+ */
-+ size2 = sizeof(struct bufdsc) * (LQRXD + LQTXD);
-+ buf = kmalloc(size2, GFP_KERNEL);
-+ if (!buf) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "no memory for buf desc\n");
-+ goto err_free_txbuf_3;
-+ }
-+ memset(buf, 0x0, size2); /* clear with 0 */
-+ priv->rxbd = buf;
-+ priv->txbd = buf + sizeof(struct bufdsc) * LQRXD;
-+
-+ return 0;
-+
-+err_free_txbuf_3:
-+ dma_free_coherent(NULL, LTXB * LQTXD, priv->txbuf, priv->p_txbuf);
-+err_free_rxbuf_2:
-+ dma_free_coherent(NULL, LRXB * LQRXD, priv->rxbuf, priv->p_rxbuf);
-+err_free_qbase_1:
-+ dma_free_coherent(NULL, size, tmp, priv->p_qbase);
-+ return -ENOMEM;
-+}
-+
-+/**
-+ * devQue_cleanup()
-+ * Release queue, Tx buffers and Rx buffers memory
-+ * Only call after unregister_netdev
-+ */
-+static void devQue_cleanup(struct net_device *dev)
-+{
-+ int size;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* descriptor queues size */
-+ size = sizeof(struct rx_dsc) * (LQRXD + 1) +
-+ sizeof(struct rx_sts) * (LQRXS + 1) +
-+ sizeof(struct tx_dsc) * (LQTXD + 1) +
-+ sizeof(struct tx_sts) * (LQTXS + 1) + sizeof(unsigned long) * 4;
-+
-+ dma_free_coherent(NULL, size, priv->rdq, priv->p_qbase);
-+ dma_free_coherent(NULL, LTXB * LQTXD, priv->txbuf, priv->p_txbuf);
-+ dma_free_coherent(NULL, LRXB * LQRXD, priv->rxbuf, priv->p_rxbuf);
-+ kfree(priv->rxbd);
-+
-+}
-+
-+/**
-+ * set_multicast_tbl()
-+ */
-+static void set_multicast_tbl(struct net_device *dev, u8 *buf)
-+{
-+ int i;
-+ unsigned char position;
-+ struct dev_mc_list *cur_addr;
-+
-+ memset(buf, 0x00, 8);
-+
-+ cur_addr = dev->mc_list;
-+ for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) {
-+
-+ if (!cur_addr)
-+ break;
-+ if (!(*cur_addr->dmi_addr & 1))
-+ continue; /* make sure multicast addr */
-+ position = ether_crc_le(6, cur_addr->dmi_addr) >> 26;
-+ buf[position >> 3] |= 1 << (position & 0x07);
-+ }
-+}
-+
-+/**
-+ * ind_addr_wr()
-+ */
-+static int ind_addr_wr(struct net_device *dev, int afp, char *buf)
-+{
-+ u32 rxctl;
-+ int i, len;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ afp &= 0x07;
-+ if (4 == afp || 5 == afp) {
-+ if (netif_msg_hw(priv))
-+ DBG(KERN_ERR, "invalid afp value\n");
-+ return -1;
-+ }
-+ len = (AFP_AFP_HASH == afp) ? 8 : 6;
-+
-+ rxctl = _rdl(dev, REG_RxCTL); /* turn Rx off */
-+ _wrl(dev, ~RxCTL_SRxON & rxctl, REG_RxCTL);
-+ _wrl(dev, afp, REG_AFP); /* load new address pattern */
-+ for (i = 0; i < len; i++)
-+ _wrb(dev, buf[i], REG_IndAD + i);
-+ _wrl(dev, rxctl, REG_RxCTL); /* turn Rx back */
-+
-+ return 0;
-+}
-+
-+/**
-+ * rx_ctl()
-+ */
-+static int rx_ctl(struct net_device *dev, int sw)
-+{
-+ unsigned long tmp = _rdl(dev, REG_RxCTL);
-+
-+ /*
-+ * Workaround for MAC lost 60-byte-long frames:
-+ * must enable Runt_CRC_Accept bit
-+ */
-+ if (sw)
-+ _wrl(dev, tmp | RxCTL_SRxON | RxCTL_RCRCA, REG_RxCTL);
-+ else
-+ _wrl(dev, tmp & ~RxCTL_SRxON, REG_RxCTL);
-+
-+ return 0;
-+}
-+
-+/**
-+ * chk_tx_lvl()
-+ */
-+static void chk_tx_lvl(struct net_device *dev)
-+{
-+ int filled;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* check Tx Descriptor Queue fill-up level */
-+ filled = priv->idx_tdqhead - priv->idx_tdqtail;
-+ if (filled < 0)
-+ filled += LQTXD;
-+
-+ if (filled <= (LVL_TXRESUME + 1))
-+ netif_wake_queue(dev);
-+}
-+
-+/**
-+ * cleanup_tx()
-+ */
-+static void cleanup_tx(struct net_device *dev)
-+{
-+ struct tx_sts *txsts;
-+ int idxsts, bi;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /*
-+ * process Tx Status Queue (no need to limit processing of TxStatus
-+ * Queue because each queue entry consist of 1 dword)
-+ */
-+ while (priv->tsq[priv->idx_tsq].flags & TXSTS_TXFP) {
-+ idxsts = priv->idx_tsq;
-+ priv->idx_tsq = next_index(priv->idx_tsq, LQTXS);
-+ txsts = &priv->tsq[idxsts];
-+ if (!(txsts->flags & TXSTS_TXFP)) { /* empty? */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "QueTxSts is empty\n");
-+ return;
-+ }
-+ txsts->flags &= ~TXSTS_TXFP; /* mark processed */
-+
-+ bi = txsts->bi & TXSTS_BI; /* buffer index */
-+
-+ /* statistics collection */
-+ if (txsts->flags & TXSTS_TXWE) { /* Sent without error */
-+ priv->stats.tx_packets++;
-+ priv->stats.tx_bytes += ((struct tx_dsc *)(priv->txbd[bi].vaddr))->bl_af & TXDSC_BL;
-+ } else { /* Tx failed due to error */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "Tx failed QueTxSts");
-+ priv->stats.tx_errors++;
-+ if (txsts->flags & TXSTS_LCRS)
-+ priv->stats.tx_carrier_errors++;
-+ if (txsts->flags & TXSTS_TXU)
-+ priv->stats.tx_fifo_errors++;
-+ if (txsts->flags & TXSTS_ECOLL)
-+ priv->stats.collisions++;
-+ }
-+
-+ /* free Tx buffer */
-+ if (priv->txbd[bi].free_rout) {
-+ (*priv->txbd[bi].free_rout)(priv->txbd[bi].vaddr);
-+ priv->txbd[bi].free_rout = NULL;
-+ }
-+
-+ /* ahead Tx Descriptor Queue tail index */
-+ priv->idx_tdqtail = next_index(priv->idx_tdqtail, LQTXD);
-+ }
-+}
-+
-+/**
-+ * restart_tx()
-+ */
-+static int restart_tx(struct net_device *dev)
-+{
-+ int i;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* disable int */
-+
-+ /* turn off master INT control */
-+ _wrl(dev, _rdl(dev, REG_GIntMsk) & ~GIntMsk_IntEn, REG_GIntMsk);
-+
-+ /* stop Tx and disable Tx DMA */
-+ _wrl(dev, _rdl(dev, REG_TxCTL) & ~TxCTL_STxON, REG_TxCTL);
-+ _wrl(dev, _rdl(dev, REG_BMCtl) | BMCtl_TxDis, REG_BMCtl);
-+
-+ /* reset Tx DMA */
-+ _wrl(dev, BMCtl_TxChR | _rdl(dev, REG_BMCtl), REG_BMCtl);
-+
-+ /* release Tx buffers */
-+ for (i = 0; i < LQTXD; i++) {
-+ if (priv->txbd[i].free_rout) {
-+ priv->txbd[i].free_rout(priv->txbd[i].vaddr);
-+ priv->txbd[i].free_rout = NULL;
-+ }
-+ priv->stats.tx_dropped++;
-+ }
-+
-+ /* init Tx Queues and flush cache */
-+ memset(priv->tsq, 0, sizeof(priv->tsq[0]) * LQTXS);
-+
-+ /* init variables */
-+ priv->idx_tsq = priv->idx_tdqhead = priv->idx_tdqtail = 0;
-+
-+ /* init registers */
-+ wait_on_reg(dev, REG_BMSts, BMCtl_TxChR, ~BMCtl_TxChR);
-+ _wrl(dev, priv->p_tsq, REG_TxSBA);
-+ _wrl(dev, priv->p_tsq, REG_TxSCA);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSBL);
-+ _wrw(dev, sizeof(priv->tsq[0]) * LQTXS, REG_TxSCL);
-+ _wrl(dev, priv->p_tdq, REG_TxDBA);
-+ _wrl(dev, priv->p_tdq, REG_TxDCA);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDBL);
-+ _wrw(dev, sizeof(priv->tdq[0]) * LQTXD, REG_TxDCL);
-+
-+ /* start Tx and enable Tx DMA */
-+ _wrl(dev, _rdl(dev, REG_TxCTL) | TxCTL_STxON, REG_TxCTL);
-+ _wrl(dev, _rdl(dev, REG_BMCtl) | BMCtl_TxEn, REG_BMCtl);
-+
-+ /* enable int again */
-+ _wrl(dev, _rdl(dev, REG_GIntMsk) | GIntMsk_IntEn, REG_GIntMsk);
-+
-+ return 0;
-+}
-+
-+/**
-+ * reset()
-+ */
-+static void reset(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ /* soft reset command */
-+ _wrb(dev, SelfCTL_RESET, REG_SelfCTL);
-+ if (wait_on_reg(dev, REG_SelfCTL, SelfCTL_RESET, ~SelfCTL_RESET))
-+ if (netif_msg_drv(priv))
-+ DBG(KERN_WARNING, "Soft Reset does not self-clear\n");
-+}
-+
-+/**
-+ * eth_shutdown()- closes down the Ethernet module
-+ *
-+ * Make sure to:
-+ * 1. disable all interrupt mask
-+ * 2. disable Rx
-+ * 3. disable Tx
-+ *
-+ * TODO:
-+ * (1) maybe utilize power down mode.
-+ * Why not yet? Because while the chip will go into power down mode,
-+ * the manual says that it will wake up in response to any I/O requests
-+ * in the register space. Empirical results do not show this working.
-+ */
-+static int eth_shutdown(struct net_device *dev)
-+{
-+ reset(dev);
-+ return 0;
-+}
-+
-+/**
-+ * eth_init() - Reset and initialize the device.
-+ *
-+ * Device should be initialized enough to function in polling mode.
-+ * Tx and Rx must be disabled and no INT generation.
-+ */
-+static int eth_init(struct net_device *dev)
-+{
-+ /* reset device */
-+ reset(dev);
-+
-+ /* init PHY */
-+ phy_init(dev);
-+
-+ /* init MAC */
-+
-+ /*i Set MDC clock to be divided by 8 and enable PreambleSuppress bit */
-+ _wrl(dev, 0x0f00, REG_SelfCTL);
-+ /* mask Interrupt */
-+ _wrl(dev, 0x00, REG_GIntMsk);
-+ /* no Rx on at this point */
-+ _wrl(dev, RxCTL_BA | RxCTL_IA0, REG_RxCTL);
-+ _wrl(dev, 0x00, REG_TxCTL);
-+ _wrl(dev, 0x00, REG_GT);
-+ _wrl(dev, 0x00, REG_BMCtl);
-+ /* Buffer Threshold */
-+ _wrl(dev, (0x80 << 16) | (0x40 << 0), REG_RxBTH);
-+ _wrl(dev, (0x80 << 16) | (0x40 << 0), REG_TxBTH);
-+ /* Status Threshold */
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_RxSTH);
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_TxSTH);
-+ /* Descriptor Threshold */
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_RxDTH);
-+ _wrl(dev, (4 << 16) | (2 << 0), REG_TxDTH);
-+ /* Max Frame Length & Tx Start Threshold */
-+ _wrl(dev, ((1518 + 1) << 16) | (944 << 0), REG_MaxFL);
-+
-+ _rdl(dev, REG_TxCollCnt); /* clear Tx Collision Count */
-+ _rdl(dev, REG_RxMissCnt); /* clear Rx Miss Counter */
-+ _rdl(dev, REG_RxRntCnt); /* clear Rx Runt Counter */
-+
-+ /* clear Pending INT */
-+ _rdl(dev, REG_IntStsC);
-+ /* Tx on */
-+ _wrl(dev, TxCTL_STxON | _rdl(dev, REG_TxCTL), REG_TxCTL);
-+
-+ /* Set MAC address */
-+ ind_addr_wr(dev, AFP_AFP_IA0, &dev->dev_addr[0]);
-+
-+ /* init queue */
-+ devQue_start(dev);
-+
-+ return 0;
-+}
-+
-+/**
-+ * rx_isr() - Receive Interrupt Service Routine
-+ */
-+static void rx_isr(struct net_device *dev)
-+{
-+ struct rx_sts *rxsts;
-+ /* index of Rx Status Queue Head from device (next put point) */
-+ int idx_rsqhead;
-+ int idxsts;
-+ int cnt_sts_processed, cnt_desc_processed;
-+ char *dest;
-+ struct sk_buff *skb;
-+ int len;
-+ unsigned int dt;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* get Current Rx Status Queue pointer */
-+ dt = _rdl(dev, REG_RxSCA);
-+
-+ /* convert to array index */
-+ idx_rsqhead = (dt - priv->p_rsq) / sizeof(priv->rsq[0]);
-+ if (!(0 <= idx_rsqhead && idx_rsqhead < LQRXS)) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, " invalid REG_RxSCA\n");
-+ return;
-+ }
-+
-+ /* process Rx (limit to idx_rsqhead due to cache) */
-+ cnt_sts_processed = cnt_desc_processed = 0;
-+ while (idx_rsqhead != priv->idx_rsq) {
-+ idxsts = priv->idx_rsq;
-+ priv->idx_rsq = next_index(priv->idx_rsq, LQRXS);
-+ rxsts = &priv->rsq[idxsts];
-+ if (!(rxsts->w1 & RXSTS_RFP)) { /* empty? */
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "QueRxSts empty\n");
-+ return;
-+ }
-+ rxsts->w1 &= ~RXSTS_RFP; /* mark processed */
-+
-+ cnt_sts_processed++;
-+
-+ if (!(rxsts->w1 & RXSTS_EOB)) /* buffer has no data */
-+ continue;
-+
-+ if ((rxsts->bi & RXSTS_BI) != priv->idx_rdq) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "unmatching idx_rdq\n");
-+ continue;
-+ }
-+ priv->idx_rdq = next_index(priv->idx_rdq, LQRXD);
-+ cnt_desc_processed++;
-+
-+ /* received a frame with error */
-+ if (!((rxsts->w1 & RXSTS_EOF) && (rxsts->w1 & RXSTS_RWE))) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_WARNING, "Rx error RxSts\n");
-+ priv->stats.rx_errors++;
-+ if (rxsts->w1 & RXSTS_OE)
-+ priv->stats.rx_fifo_errors++;
-+ if (rxsts->w1 & RXSTS_FE)
-+ priv->stats.rx_frame_errors++;
-+ if ((rxsts->w1 & RXSTS_RUNT) || (rxsts->w1 & RXSTS_EDATA))
-+ priv->stats.rx_length_errors++;
-+ if (rxsts->w1 & RXSTS_CRCE)
-+ priv->stats.rx_crc_errors++;
-+ continue;
-+ }
-+
-+ len = rxsts->fl;
-+
-+ /* alloc buffer for protocal stack */
-+ skb = dev_alloc_skb(len + 5);
-+ if (NULL == skb) {
-+ if (netif_msg_rx_err(priv))
-+ DBG(KERN_ERR, "Low Memory, Rx dropped\n");
-+ priv->stats.rx_dropped++;
-+ continue;
-+ }
-+
-+ /* odd 16 bit alignment to make protocal stack happy */
-+ skb_reserve(skb, 2);
-+ skb->dev = dev;
-+ dest = skb_put(skb, len);
-+ memcpy(dest, priv->rxbd[(rxsts->bi & RXSTS_BI)].vaddr, len);
-+ skb->protocol = eth_type_trans(skb, dev);
-+ /* pass Rx packet to system */
-+ netif_rx(skb);
-+ dev->last_rx = jiffies;
-+ priv->stats.rx_packets++;
-+ priv->stats.rx_bytes += len;
-+ if (RXSTS_AM == (rxsts->w1 & RXSTS_AM))
-+ priv->stats.multicast++;
-+ }
-+
-+ /* enqueue */
-+ _wrl(dev, cnt_sts_processed, REG_RxSEQ);
-+ _wrl(dev, cnt_desc_processed, REG_RxDEQ);
-+}
-+
-+/**
-+ * tx_isr() - Transmit Interrupt Service Routine
-+ */
-+static int tx_isr(struct net_device *dev)
-+{
-+ cleanup_tx(dev);
-+ chk_tx_lvl(dev); /* resume Tx if it was stopped */
-+ return 0;
-+}
-+
-+/**
-+ * ep93xx_isr()
-+ */
-+static irqreturn_t ep93xx_isr(int irq, void *dev_id, struct pt_regs *pRegs)
-+{
-+ struct net_device *dev = dev_id;
-+ int lpCnt;
-+ u32 intS;
-+
-+ lpCnt = 0;
-+ do {
-+ /* get INT status and then clear */
-+ intS = _rdl(dev, REG_IntStsC);
-+
-+ if (!intS)
-+ break; /* no INT */
-+ if (IntSts_RxSQ & intS)
-+ rx_isr(dev); /* Rx INT */
-+ if (IntSts_TxSQ & intS)
-+ tx_isr(dev); /* Tx INT */
-+ } while (lpCnt++ < 64); /* limit loop to serve other interrupts too */
-+ return IRQ_HANDLED;
-+}
-+
-+/* Exposed Driver Routines to the Outside World */
-+
-+/**
-+ * ep93xx_get_stats()
-+ */
-+static struct net_device_stats *ep93xx_get_stats(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return &priv->stats;
-+}
-+
-+/**
-+ * ep93xx_set_multicast_list()
-+ */
-+static void ep93xx_set_multicast_list(struct net_device *dev)
-+{
-+ u8 tbl[8 + 1];
-+
-+ if (IFF_PROMISC & dev->flags) {
-+ _wrl(dev, RxCTL_PA | _rdl(dev, REG_RxCTL), REG_RxCTL);
-+
-+ } else if (IFF_ALLMULTI & dev->flags) { /* receive all multicast addr */
-+ _wrl(dev, RxCTL_MA | (~RxCTL_PA & _rdl(dev, REG_RxCTL)), REG_RxCTL);
-+ memset(tbl, 0xff, 8);
-+ ind_addr_wr(dev, AFP_AFP_HASH, &tbl[0]);
-+
-+ } else if (dev->mc_count) { /* set H/W multicasting filter */
-+ _wrl(dev, RxCTL_MA | (~RxCTL_PA & _rdl(dev, REG_RxCTL)), REG_RxCTL);
-+ set_multicast_tbl(dev, &tbl[0]);
-+ ind_addr_wr(dev, AFP_AFP_HASH, &tbl[0]);
-+
-+ } else { /* no multicasting */
-+ _wrl(dev, ~(RxCTL_PA | RxCTL_MA) & _rdl(dev, REG_RxCTL), REG_RxCTL);
-+ }
-+}
-+
-+/**
-+ * ep93xx_tx_timeout()
-+ */
-+static void ep93xx_tx_timeout(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ /* If we get here, some higher level has decided we are broken.
-+ There should really be a "kick me" function call instead. */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_WARNING, "transmit timed out\n");
-+
-+ phy_init(dev);
-+
-+ /* kick Tx engine */
-+ restart_tx(dev);
-+
-+ /* ask the Network Stack to resume Tx if there is room available */
-+ chk_tx_lvl(dev);
-+}
-+
-+/**
-+ * ep93xx_start_xmit()
-+ */
-+static int ep93xx_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+/* @swk check H/W defect of Tx Underrun Error caused by certain frame length */
-+ struct tx_dsc *txdsc;
-+ int idx_tdqhd;
-+ int filled;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ idx_tdqhd = priv->idx_tdqhead;
-+ txdsc = &priv->tdq[idx_tdqhd];
-+
-+ /* check Tx Descriptor Queue fill-up level */
-+ filled = idx_tdqhd - priv->idx_tdqtail;
-+ if (filled < 0)
-+ filled += LQTXD;
-+ filled += 1;
-+
-+ /* check Queue level */
-+ if (LVL_TXSTOP <= filled) {
-+ netif_stop_queue(dev); /* no more Tx allowed */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_INFO, "%s: Tx STOP requested\n", dev->name);
-+ if (LVL_TXSTOP < filled) {
-+ /* this situation can not be happen */
-+ if (netif_msg_tx_err(priv))
-+ DBG(KERN_ERR, "%s: Tx Request while stopped\n", dev->name);
-+ return NETDEV_TX_BUSY;
-+ }
-+ }
-+
-+ /* fill up Tx Descriptor Queue entry */
-+ if (skb->len < ETH_ZLEN) {
-+ txdsc->bl_af = ETH_ZLEN & TXDSC_BL; /* also clears AF! */
-+ skb = skb_padto(skb, ETH_ZLEN);
-+ if (skb == NULL)
-+ return NETDEV_TX_OK;
-+ } else {
-+ txdsc->bl_af = skb->len & TXDSC_BL; /* also clears AF! */
-+ }
-+ txdsc->ba = priv->p_txbuf + (idx_tdqhd * LTXB);
-+ txdsc->bi_eof = (idx_tdqhd & TXDSC_BI) | TXDSC_EOF;
-+
-+ dev->trans_start = jiffies;
-+
-+ /* copy data to Tx buffer */
-+ memcpy(priv->txbd[idx_tdqhd].vaddr, skb->data, skb->len);
-+ priv->txbd[idx_tdqhd].free_rout = NULL;
-+
-+ /* Free the data buffer passed by upper layer */
-+ dev_kfree_skb_any(skb);
-+
-+ /* ahead Tx Desc Queue */
-+ priv->idx_tdqhead = next_index(priv->idx_tdqhead, LQTXD);
-+ wmb();
-+
-+ /* Enqueue a Tx Descriptor to the device */
-+ _wrl(dev, 1, REG_TxDEQ);
-+
-+ if (netif_msg_tx_queued(priv))
-+ DBG(KERN_DEBUG, "%s: Tx packet queued\n", dev->name);
-+
-+ return NETDEV_TX_OK;
-+}
-+
-+/**
-+ * ep93xx_close()
-+ *
-+ * this makes the board clean up everything that it can
-+ * and not talk to the outside world. Caused by
-+ *. an 'ifconfig ethX down'
-+ */
-+static int ep93xx_close(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ free_irq(dev->irq, dev);
-+
-+ netif_stop_queue(dev);
-+ eth_shutdown(dev);
-+
-+ if (netif_msg_ifdown(priv))
-+ DBG(KERN_INFO, "%s: ep93xx_close()\n", dev->name);
-+
-+ return 0;
-+}
-+
-+/**
-+ * ep93xx_open() - Open and Initialize the board
-+ *
-+ * Set up everything, reset the card, etc ..
-+ */
-+static int ep93xx_open(struct net_device *dev)
-+{
-+ int status;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ /* clear dynamic device info */
-+ memset(&priv->stats, 0, sizeof(priv->stats));
-+ priv->idx_rdq = 0;
-+ priv->idx_rsq = 0;
-+ priv->idx_tdqhead = 0;
-+ priv->idx_tdqtail = 0;
-+ priv->idx_tsq = 0;
-+
-+ /* reset/init device */
-+ status = eth_init(dev);
-+ if (status != 0) {
-+ return -EAGAIN;
-+ }
-+
-+ /* turn on INT, turn on Rx */
-+ status = request_irq(dev->irq, &ep93xx_isr, 0, DRV_NAME, dev);
-+ if (status) {
-+ if (netif_msg_ifup(priv))
-+ DBG(KERN_ERR, "%s: unable to get IRQ\n", dev->name);
-+ return status;
-+ }
-+
-+ /* Enable interrupt driven operation. Also turn on Rx but no Tx. */
-+ /* setup Interrupt sources */
-+ _wrl(dev, DEF_INT_SRC, REG_IntEn);
-+ /* turn on INT */
-+ _wrl(dev, GIntMsk_IntEn, REG_GIntMsk);
-+ /* turn on Rx */
-+ rx_ctl(dev, 1);
-+
-+ /* link to upper layer */
-+ netif_start_queue(dev);
-+
-+ if (netif_msg_ifup(priv))
-+ DBG(KERN_INFO, "%s: irq=%d\n", dev->name, dev->irq);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ int rc;
-+
-+ if (!netif_running(dev))
-+ return -EINVAL;
-+
-+ spin_lock_irq(&priv->mii_lock);
-+ rc = generic_mii_ioctl(&priv->mii, if_mii(rq), cmd, NULL);
-+ spin_unlock_irq(&priv->mii_lock);
-+
-+ return rc;
-+}
-+
-+/*
-+ * Ethtool support
-+ */
-+
-+static void ep93xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-+{
-+ strcpy(info->driver, DRV_NAME);
-+ strcpy(info->version, DRV_VERSION);
-+}
-+
-+static int ep93xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ spin_lock_irq(&priv->mii_lock);
-+ mii_ethtool_gset(&priv->mii, cmd);
-+ spin_unlock_irq(&priv->mii_lock);
-+ return 0;
-+}
-+
-+static int ep93xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ int rc;
-+ spin_lock_irq(&priv->mii_lock);
-+ rc = mii_ethtool_sset(&priv->mii, cmd);
-+ spin_unlock_irq(&priv->mii_lock);
-+ return rc;
-+}
-+
-+static int ep93xx_nway_reset(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return mii_nway_restart(&priv->mii);
-+}
-+
-+static u32 ep93xx_get_link(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return mii_link_ok(&priv->mii);
-+}
-+
-+static u32 ep93xx_get_msglevel(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return priv->msg_enable;
-+}
-+
-+static void ep93xx_set_msglevel(struct net_device *dev, u32 datum)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ priv->msg_enable = datum;
-+}
-+
-+static void ep93xx_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ spin_lock_irq(&priv->mii_lock);
-+ memcpy_fromio(regbuf, priv->base_addr, regs->len);
-+ spin_unlock_irq(&priv->mii_lock);
-+}
-+
-+static int ep93xx_get_regs_len(struct net_device *dev)
-+{
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+ return priv->regs_len;
-+}
-+
-+static struct ethtool_ops ep93xx_ethtool_ops = {
-+ .get_drvinfo = ep93xx_get_drvinfo,
-+ .get_settings = ep93xx_get_settings,
-+ .set_settings = ep93xx_set_settings,
-+ .get_regs = ep93xx_get_regs,
-+ .get_regs_len = ep93xx_get_regs_len,
-+ .nway_reset = ep93xx_nway_reset,
-+ .get_link = ep93xx_get_link,
-+ .get_msglevel = ep93xx_get_msglevel,
-+ .set_msglevel = ep93xx_set_msglevel,
-+};
-+
-+/**
-+ * driver_init() - Logical driver initialization for an individual device
-+ *
-+ * Minimum device H/W access at this point
-+ *
-+ * Task:
-+ * Initialize the structure if needed
-+ * print out my vanity message if not done so already
-+ * print out what type of hardware is detected
-+ * print out the ethernet address
-+ * find the IRQ
-+ * set up my private data
-+ * configure the dev structure with my subroutines
-+ * actually GRAB the irq.
-+ * GRAB the region
-+ *
-+ */
-+static int __init driver_init(struct net_device *dev, u32 baseA, int irq)
-+{
-+ int i;
-+ struct resource *res;
-+ struct sockaddr sa;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ if (0 == num_of_instance)
-+ printk("%s", version);
-+
-+ /* skip probing for a second one, we _know_ that it does not exist */
-+ if (1 == num_of_instance)
-+ return -ENODEV;
-+
-+ memset(dev->priv, 0x00, sizeof(struct ep93xx_priv));
-+
-+ /* device instance ID */
-+ priv->id = num_of_instance;
-+
-+ /* mii stuff */
-+ spin_lock_init(&priv->mii_lock);
-+ priv->mii.dev = dev;
-+ priv->mii.mdio_read = mdio_read;
-+ priv->mii.mdio_write = mdio_write;
-+ priv->mii.phy_id_mask = 0x1f;
-+ priv->mii.reg_num_mask = 0x1f;
-+ priv->msg_enable = EP93XX_DEF_MSG;
-+ priv->regs_len = DEV_REG_SPACE;
-+
-+ priv->base_addr = (void *)(baseA);
-+
-+ dev->irq = irq;
-+
-+ res = request_mem_region(baseA, DEV_REG_SPACE, DRV_NAME);
-+ if (res == NULL) {
-+ if (netif_msg_probe(priv))
-+ DBG(KERN_ERR, "request_mem_region failed!\n");
-+ goto err_free_priv_1;
-+ }
-+
-+ dev->open = &ep93xx_open;
-+ dev->stop = &ep93xx_close;
-+ dev->do_ioctl = &ep93xx_ioctl;
-+ dev->hard_start_xmit = &ep93xx_start_xmit;
-+ dev->tx_timeout = &ep93xx_tx_timeout;
-+ dev->watchdog_timeo = HZ * 5;
-+ dev->get_stats = &ep93xx_get_stats;
-+ dev->set_multicast_list = &ep93xx_set_multicast_list;
-+ dev->ethtool_ops = &ep93xx_ethtool_ops;
-+
-+ ether_setup(dev);
-+
-+ if (devQue_init(dev))
-+ goto err_free_bd_memregion_irq_2;
-+
-+ reset(dev);
-+
-+ /*
-+ * use a random MAC for now -
-+ * don't forget to set a valid MAC later on with ifconfig
-+ */
-+ sa.sa_family = AF_INET;
-+ random_ether_addr(sa.sa_data);
-+ dev->set_mac_address(dev, &sa);
-+
-+ if (netif_msg_probe(priv)) {
-+ printk(KERN_INFO DRV_NAME ": #%d at 0x%p IRQ:%d\n", priv->id, priv->base_addr, dev->irq);
-+ printk(KERN_INFO DRV_NAME ": using random number");
-+ for (i = 0; i < 6; i++)
-+ printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
-+
-+ printk(" as MAC, don't forget to assign a valid MAC later!\n");
-+ }
-+ num_of_instance++;
-+ return 0;
-+
-+err_free_bd_memregion_irq_2:
-+ kfree(priv->rxbd);
-+ disable_irq(dev->irq);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+err_free_priv_1:
-+ kfree(dev->priv);
-+ return -EAGAIN;
-+}
-+
-+/**
-+ * ep93xx_probe - probe for ep93xx device
-+ *
-+ * Probe for the one (and only) ethernet device found on
-+ * EP93xx SOC CPU.
-+ */
-+static int __init ep93xx_probe(void)
-+{
-+ int err;
-+ struct ep93xx_priv *priv;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct ep93xx_priv));
-+
-+ if (!dev)
-+ return -ENODEV;
-+
-+ priv = netdev_priv(dev);
-+
-+ SET_MODULE_OWNER(dev);
-+
-+ sprintf(dev->name, "eth0");
-+
-+ priv->base_addr = (void *)(port_list[0].base_addr);
-+
-+ dev->irq = port_list[0].irq;
-+
-+ err = driver_init(dev, (u32)priv->base_addr, dev->irq);
-+ if (err)
-+ goto err_free_netdev;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto err_free_memregion_irq_1;
-+
-+ ep93xx_etherdev = dev;
-+ disable_irq(dev->irq);
-+ return 0;
-+
-+err_free_memregion_irq_1:
-+ kfree(priv->rxbd);
-+ disable_irq(dev->irq);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+err_free_netdev:
-+ free_netdev(dev);
-+ return err;
-+}
-+
-+static void __exit ep93xx_exit(void)
-+{
-+ struct net_device *dev = ep93xx_etherdev;
-+ struct ep93xx_priv *priv = netdev_priv(dev);
-+
-+ if (dev) {
-+ unregister_netdev(dev);
-+ devQue_cleanup(dev);
-+ free_irq(dev->irq, dev);
-+ release_mem_region((u32)priv->base_addr, DEV_REG_SPACE);
-+ free_netdev(dev);
-+ }
-+}
-+
-+module_init(ep93xx_probe);
-+module_exit(ep93xx_exit);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/net/arm/ep93xx_eth.h b/drivers/net/arm/ep93xx_eth.h
-new file mode 100644
-index 0000000..1752eaf
---- /dev/null
-+++ b/drivers/net/arm/ep93xx_eth.h
-@@ -0,0 +1,355 @@
-+/*
-+ * ep93xx_eth.h
-+ * : header file of Ethernet Device Driver for Cirrus Logic EP93xx.
-+ *
-+ * Copyright (C) 2003 by Cirrus Logic www.cirrus.com
-+ * This software may be used and distributed according to the terms
-+ * of the GNU Public License.
-+ *
-+ * This file contains device related information like register info
-+ * and register access method macros for the Ethernet device
-+ * embedded within Cirrus Logic's EP93xx SOC chip.
-+ *
-+ * Information contained in this file was obtained from
-+ * the EP9312 Manual Revision 0.12 and 0.14 from Cirrus Logic.
-+ *
-+ * History
-+ * 05/18/01 Sungwook Kim Initial release
-+ * 03/25/2003 Melody Modified for EP92xx
-+ */
-+
-+#ifndef _EP93xx_ETH_H_
-+#define _EP93xx_ETH_H_
-+
-+/*
-+ * Definition of the registers.
-+ * For details, refer to the datasheet .
-+ *
-+ * Basically, most registers are 32 bits width register.
-+ * But some are 16 bits and some are 6 or 8 bytes long.
-+ */
-+
-+#define REG_RxCTL 0x0000 /*offset to Receiver Control Reg */
-+#define RxCTL_PauseA (1<<20)
-+#define RxCTL_RxFCE1 (1<<19)
-+#define RxCTL_RxFCE0 (1<<18)
-+#define RxCTL_BCRC (1<<17)
-+#define RxCTL_SRxON (1<<16)
-+#define RxCTL_RCRCA (1<<13)
-+#define RxCTL_RA (1<<12)
-+#define RxCTL_PA (1<<11)
-+#define RxCTL_BA (1<<10)
-+#define RxCTL_MA (1<<9)
-+#define RxCTL_IAHA (1<<8)
-+#define RxCTL_IA3 (1<<3)
-+#define RxCTL_IA2 (1<<2)
-+#define RxCTL_IA1 (1<<1)
-+#define RxCTL_IA0 (1<<0)
-+
-+#define REG_TxCTL 0x0004 /*offset to Transmit Control Reg */
-+#define TxCTL_DefDis (1<<7)
-+#define TxCTL_MBE (1<<6)
-+#define TxCTL_ICRC (1<<5)
-+#define TxCTL_TxPD (1<<5)
-+#define TxCTL_OColl (1<<3)
-+#define TxCTL_SP (1<<2)
-+#define TxCTL_PB (1<<1)
-+#define TxCTL_STxON (1<<0)
-+
-+#define REG_TestCTL 0x0008 /*Test Control Reg, R/W */
-+#define TestCTL_MACF (1<<7)
-+#define TestCTL_MFDX (1<<6)
-+#define TestCTL_DB (1<<5)
-+#define TestCTL_MIIF (1<<4)
-+
-+#define REG_MIICmd 0x0010 /*offset to MII Command Reg, R/W */
-+#define MIICmd_OP (0x03<<14)
-+#define MIICmd_OP_RD (2<<14)
-+#define MIICmd_OP_WR (1<<14)
-+#define MIICmd_PHYAD (0x1f<<5)
-+#define MIICmd_REGAD (0x1f<<0)
-+
-+#define REG_MIIData 0x0014 /*offset to MII Data Reg, R/W */
-+#define MIIData_MIIData (0xffff<<0)
-+
-+#define REG_MIISts 0x0018 /*offset to MII Status Reg, R */
-+#define MIISts_Busy (1<<0)
-+
-+#define REG_SelfCTL 0x0020 /*offset to Self Control Reg */
-+#define SelfCTL_RWP (1<<7) /*Remote Wake Pin */
-+#define SelfCTL_GPO0 (1<<5)
-+#define SelfCTL_PUWE (1<<4)
-+#define SelfCTL_PDWE (1<<3)
-+#define SelfCTL_MIIL (1<<2)
-+#define SelfCTL_RESET (1<<0)
-+
-+#define REG_IntEn 0x0024 /*Interrupt Enable Reg, R/W */
-+#define IntEn_RWIE (1<<30)
-+#define IntEn_RxMIE (1<<29)
-+#define IntEn_RxBIE (1<<28)
-+#define IntEn_RxSQIE (1<<27)
-+#define IntEn_TxLEIE (1<<26)
-+#define IntEn_ECIE (1<<25)
-+#define IntEn_TxUHIE (1<<24)
-+#define IntEn_MOIE (1<<18)
-+#define IntEn_TxCOIE (1<<17)
-+#define IntEn_RxROIE (1<<16)
-+#define IntEn_MIIIE (1<<12)
-+#define IntEn_PHYSIE (1<<11)
-+#define IntEn_TIE (1<<10)
-+#define IntEn_SWIE (1<<8)
-+#define IntEn_TxSQIE (1<<3)
-+#define IntEn_RxEOFIE (1<<2)
-+#define IntEn_RxEOBIE (1<<1)
-+#define IntEn_RxHDRIE (1<<0)
-+
-+#define REG_IntStsP 0x0028 /*offset to Interrupt Status Preserve Reg, R/W */
-+#define REG_IntStsC 0x002c /*offset to Interrupt Status Clear Reg, R */
-+#define IntSts_RWI (1<<30)
-+#define IntSts_RxMI (1<<29)
-+#define IntSts_RxBI (1<<28)
-+#define IntSts_RxSQI (1<<27)
-+#define IntSts_TxLEI (1<<26)
-+#define IntSts_ECI (1<<25)
-+#define IntSts_TxUHI (1<<24)
-+#define IntSts_MOI (1<<18)
-+#define IntSts_TxCOI (1<<17)
-+#define IntSts_RxROI (1<<16)
-+#define IntSts_MIII (1<<12)
-+#define IntSts_PHYSI (1<<11)
-+#define IntSts_TI (1<<10)
-+#define IntSts_AHBE (1<<9)
-+#define IntSts_SWI (1<<8)
-+#define IntSts_OTHER (1<<4)
-+#define IntSts_TxSQ (1<<3)
-+#define IntSts_RxSQ (1<<2)
-+
-+#define REG_GT 0x0040 /*offset to General Timer Reg */
-+#define GT_GTC (0xffff<<16)
-+#define GT_GTP (0xffff<<0)
-+
-+#define REG_FCT 0x0044 /*offset to Flow Control Timer Reg */
-+#define FCT_FCT (0x00ffffff<<0)
-+
-+#define REG_FCF 0x0048 /*offset to Flow Control Format Reg */
-+#define FCF_MACCT (0xffff<<16)
-+#define FCF_TPT (0xffff<<0)
-+
-+#define REG_AFP 0x004c /*offset to Address Filter Pointer Reg */
-+#define AFP_AFP (0x07<<0) /*Address Filter Pointer
-+ (bank control for REG_IndAD) */
-+#define AFP_AFP_IA0 0 /*Primary Individual Address (MAC Addr) */
-+#define AFP_AFP_IA1 1 /*Individual Address 1 */
-+#define AFP_AFP_IA2 2 /*Individual Address 2 */
-+#define AFP_AFP_IA3 3 /*Individual Address 3 */
-+#define AFP_AFP_DTxP 6 /*Destination Address of Tx Pause Frame */
-+#define AFP_AFP_HASH 7 /*Hash Table */
-+
-+#define REG_IndAD 0x0050 /*offset to Individual Address Reg,
-+ n bytes, R/W */
-+
-+#define REG_GIntSts 0x0060 /*offset to Global Interrupt
-+ Status Reg (writing 1 will clear) */
-+#define REG_GIntROS 0x0068 /*offset to Global Interrupt
-+ Status Read Only Reg */
-+#define GIntSts_INT (1<<15) /*Global Interrupt Request Status */
-+
-+#define REG_GIntMsk 0x0064 /*offset to Global Interrupt Mask Reg */
-+#define GIntMsk_IntEn (1<<15) /*Global Interrupt Enable */
-+
-+#define REG_GIntFrc 0x006c /*offset to Global Interrupt Force Reg */
-+#define GIntFrc_INT (1<<15) /*Force to set GIntSts */
-+
-+#define REG_TxCollCnt 0x0070 /*Transmit Collision Count Reg, R */
-+#define REG_RxMissCnt 0x0074 /*Receive Miss Count Reg, R */
-+#define REG_RxRntCnt 0x0078 /*Receive Runt Count Reg, R */
-+
-+#define REG_BMCtl 0x0080 /*offset to Bus Master Control Reg, R/W */
-+#define BMCtl_MT (1<<13)
-+#define BMCtl_TT (1<<12)
-+#define BMCtl_UnH (1<<11)
-+#define BMCtl_TxChR (1<<10)
-+#define BMCtl_TxDis (1<<9)
-+#define BMCtl_TxEn (1<<8)
-+#define BMCtl_EH2 (1<<6)
-+#define BMCtl_EH1 (1<<5)
-+#define BMCtl_EEOB (1<<4)
-+#define BMCtl_RxChR (1<<2)
-+#define BMCtl_RxDis (1<<1)
-+#define BMCtl_RxEn (1<<0)
-+
-+#define REG_BMSts 0x0084 /*offset to Bus Master Status Reg, R */
-+#define BMSts_TxAct (1<<7)
-+#define BMSts_TP (1<<4)
-+#define BMSts_RxAct (1<<3)
-+#define BMSts_QID (0x07<<0)
-+#define BMSts_QID_RxDt (0<<0)
-+#define BMSts_QID_TxDt (1<<0)
-+#define BMSts_QID_RxSts (2<<0)
-+#define BMSts_QID_TxSts (3<<0)
-+#define BMSts_QID_RxDesc (4<<0)
-+#define BMSts_QID_TxDesc (5<<0)
-+
-+#define REG_RBCA 0x0088 /*offset to Receive Buffer
-+ Current Address Reg, R */
-+#define REG_TBCA 0x008c /*offset to Transmit Buffer
-+ Current Address Reg, R */
-+
-+#define REG_RxDBA 0x0090 /*offset to Receive Descriptor Queue
-+ Base Address Reg, R/W */
-+#define REG_RxDBL 0x0094 /*offset to Receive Descriptor Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_RxDCL 0x0096 /*offset to Receive Descriptor Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_RxDCA 0x0098 /*offset to Receive Descriptor Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxDEQ 0x009c /*offset to Receive Descriptor
-+ Enqueue Reg, R/W */
-+#define RxDEQ_RDV (0xffff<<16) /*R 16bit; Receive Descriptor Value */
-+#define RxDEQ_RDI (0xff<<0) /*W 8bit; Receive Descriptor Increment */
-+
-+#define REG_RxSBA 0x00a0 /*offset to Receive Status Queue
-+ Base Address Reg, R/W */
-+#define REG_RxSBL 0x00a4 /*offset to Receive Status Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_RxSCL 0x00a6 /*offset to Receive Status Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_RxSCA 0x00a8 /*offset to Receive Status Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxSEQ 0x00ac /*offset to Receive Status Queue
-+ Current Address Reg, R/W */
-+#define RxSEQ_RSV (0xffff<<16)
-+#define RxSEQ_RSI (0xff<<0)
-+
-+#define REG_TxDBA 0x00b0 /*offset to Transmit Descriptor Queue
-+ Base Address Reg, R/W */
-+#define REG_TxDBL 0x00b4 /*offset to Transmit Descriptor Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_TxDCL 0x00b6 /*offset to Transmit Descriptor Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_TxDCA 0x00b8 /*offset to Transmit Descriptor Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_TxDEQ 0x00bc /*offset to Transmit Descriptor Queue
-+ Current Address Reg, R/W */
-+#define TxDEQ_TDV (0xffff<<16)
-+#define TxDEQ_TDI (0xff<<0)
-+
-+#define REG_TxSBA 0x00c0 /*offset to Transmit Status Queue
-+ Base Address Reg, R/W */
-+#define REG_TxSBL 0x00c4 /*offset to Transmit Status Queue
-+ Base Length Reg, R/W, 16bits */
-+#define REG_TxSCL 0x00c6 /*offset to Transmit Status Queue
-+ Current Length Reg, R/W, 16bits */
-+#define REG_TxSCA 0x00c8 /*offset to Transmit Status Queue
-+ Current Address Reg, R/W */
-+
-+#define REG_RxBTH 0x00d0 /*offset to Receive Buffer
-+ Threshold Reg, R/W */
-+#define RxBTH_RDHT (0x03ff<<16)
-+#define RxBTH_RDST (0x03ff<<0)
-+
-+#define REG_TxBTH 0x00d4 /*offset to Transmit Buffer
-+ Threshold Reg, R/W */
-+#define TxBTH_TDHT (0x03ff<<16)
-+#define TxBTH_TDST (0x03ff<<0)
-+
-+#define REG_RxSTH 0x00d8 /*offset to Receive Status
-+ Threshold Reg, R/W */
-+#define RxSTH_RSHT (0x003f<<16)
-+#define RxSTH_RSST (0x003f<<0)
-+
-+#define REG_TxSTH 0x00dc /*offset to Transmit Status
-+ Threshold Reg, R/W */
-+#define TxSTH_TSHT (0x003f<<16)
-+#define TxSTH_TSST (0x003f<<0)
-+
-+#define REG_RxDTH 0x00e0 /*offset to Receive Descriptor
-+ Threshold Reg, R/W */
-+#define RxDTH_RDHT (0x003f<<16)
-+#define RxDTH_RDST (0x003f<<0)
-+
-+#define REG_TxDTH 0x00e4 /*offset to Transmit Descriptor
-+ Threshold Reg, R/W */
-+#define TxDTH_TDHT (0x003f<<16)
-+#define TxDTH_TDST (0x003f<<0)
-+
-+#define REG_MaxFL 0x00e8 /*offset to Max Frame Length Reg, R/W */
-+#define MaxFL_MFL (0x07ff<<16)
-+#define MaxFL_TST (0x07ff<<0)
-+
-+#define REG_RxHL 0x00ec /*offset to Receive Header Length Reg, R/W */
-+#define RxHL_RHL2 (0x07ff<<16)
-+#define RxHL_RHL1 (0x03ff<<0)
-+
-+#define REG_MACCFG0 0x0100 /*offset to Test Reg #0, R/W */
-+#define MACCFG0_DbgSel (1<<7)
-+#define MACCFG0_LCKEN (1<<6)
-+#define MACCFG0_LRATE (1<<5)
-+#define MACCFG0_RXERR (1<<4)
-+#define MACCFG0_BIT33 (1<<2)
-+#define MACCFG0_PMEEN (1<<1)
-+#define MACCFG0_PMEST (1<<0)
-+
-+#define REG_MACCFG1 0x0104 /*offset to Test Reg #1, R/W */
-+#define REG_MACCFG2 0x0108 /*offset to Test Reg #2, R */
-+#define REG_MACCFG3 0x010c /*offset to Test Reg #3, R */
-+
-+/*---------------------------------------------------------------
-+ * Definition of Descriptor/Status Queue Entry
-+ *-------------------------------------------------------------*/
-+struct rx_dsc {
-+ __be32 ba;
-+ __be16 bl;
-+ __be16 bi; /* let nsof flag be part of bi */
-+};
-+
-+#define RXSTS_RFP 0x80000000
-+#define RXSTS_RWE 0x40000000
-+#define RXSTS_EOF 0x20000000
-+#define RXSTS_EOB 0x10000000
-+#define RXSTS_AM 0x00C00000
-+#define RXSTS_OE 0x00100000
-+#define RXSTS_FE 0x00080000
-+#define RXSTS_RUNT 0x00040000
-+#define RXSTS_EDATA 0x00020000
-+#define RXSTS_CRCE 0x00010000
-+
-+#define RXSTS_BI 0x7FFF
-+struct rx_sts { /* Receive Status Queue Entry */
-+ __be32 w1;
-+ __be16 fl;
-+ __be16 bi; /* bi and rfp2 */
-+};
-+
-+#define TXDSC_BL 0x0FFF
-+#define TXDSC_AF 0x8000
-+#define TXDSC_BI 0x7FFF
-+#define TXDSC_EOF 0x8000
-+struct tx_dsc { /* Transmit Descriptor Queue Entry */
-+ __be32 ba; /*b31-0: physical Buffer Address */
-+ __be16 bl_af; /* Buffer Length, Abort Frame */
-+ __be16 bi_eof; /* Buffer Index, End Of Frame */
-+};
-+
-+#define TXSTS_BI 0x7fff
-+#define TXSTS_TXFP 0x80
-+#define TXSTS_TXWE 0x40
-+#define TXSTS_LCRS 0x10
-+#define TXSTS_TXU 0x02
-+#define TXSTS_ECOLL 0x01
-+
-+struct tx_sts {
-+ __be16 bi;
-+ u8 ncoll;
-+ u8 flags;
-+};
-+
-+/*
-+ * Size of device registers occupied in memory/IO address map
-+ */
-+#define DEV_REG_SPACE 0x00010000
-+
-+#endif /* _EP93xx_ETH_H_ */
-diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
-index 309eb55..b7e03e3 100644
---- a/drivers/pcmcia/Kconfig
-+++ b/drivers/pcmcia/Kconfig
-@@ -198,6 +198,19 @@ config PCMCIA_PXA2XX
- help
- Say Y here to include support for the PXA2xx PCMCIA controller
-
-+config PCMCIA_EP93XX
-+ tristate "EP93xx support"
-+ depends on ARM && ARCH_EP93XX && PCMCIA
-+ help
-+ Say Y here to include support for the EP93xx PCMCIA controller
-+
-+config PCMCIA_ZEFEEREVBH
-+ bool "ZefeerEVB-H support"
-+ depends on ARM && ARCH_EP93XX && PCMCIA && PCMCIA_EP93XX && MACH_ZEFEERDZQ
-+ help
-+ Say Y here to include support for the PCMCIA interface on
-+ ZefeerEVB-H board
-+
- config PCMCIA_PROBE
- bool
- default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X
-diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
-index bcecf51..5878b5a 100644
---- a/drivers/pcmcia/Makefile
-+++ b/drivers/pcmcia/Makefile
-@@ -30,6 +30,7 @@ obj-$(CONFIG_HD64465_PCMCIA) += hd6446
- obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o
- obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o
- obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o pxa2xx_cs.o
-+obj-$(CONFIG_PCMCIA_EP93XX) += ep93xx_core.o ep93xx_cs.o
- obj-$(CONFIG_M32R_PCC) += m32r_pcc.o
- obj-$(CONFIG_M32R_CFC) += m32r_cfc.o
- obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ss.o
-@@ -39,6 +40,7 @@ obj-$(CONFIG_OMAP_CF) += omap_cf.o
-
- sa11xx_core-y += soc_common.o sa11xx_base.o
- pxa2xx_core-y += soc_common.o pxa2xx_base.o
-+ep93xx_core-y += soc_common.o ep93xx_base.o
-
- au1x00_ss-y += au1000_generic.o
- au1x00_ss-$(CONFIG_MIPS_PB1000) += au1000_pb1x00.o
-@@ -69,3 +71,7 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa
- pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o
- pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o
-
-+ep93xx_cs-$(CONFIG_MACH_ADSSPHERE) += ep93xx_adssphere.o
-+ep93xx_cs-$(CONFIG_MACH_EDB9315) += ep93xx_edb9315.o
-+ep93xx_cs-$(CONFIG_MACH_DMA03) += ep93xx_edb9315.o
-+ep93xx_cs-$(CONFIG_PCMCIA_ZEFEEREVBH) += ep93xx_zefeerevbh.o
-diff --git a/drivers/pcmcia/ep93xx_adssphere.c b/drivers/pcmcia/ep93xx_adssphere.c
-new file mode 100644
-index 0000000..8e1a181
---- /dev/null
-+++ b/drivers/pcmcia/ep93xx_adssphere.c
-@@ -0,0 +1,190 @@
-+/*
-+ * linux/drivers/pcmcia/ep93xx_adssphere.c
-+ *
-+ * Adapted from pxa27x_mainstone.c
-+ *
-+ * Robert Whaley 2005 rwhaley@applieddata.net
-+ *
-+ * Adssphere PCMCIA specific routines.
-+ *
-+ * Created: May 12, 2004
-+ * Author: Nicolas Pitre
-+ * Copyright: MontaVista Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/device.h>
-+
-+#include <pcmcia/ss.h>
-+
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+
-+#include <asm/arch/adssphere.h>
-+
-+#include "soc_common.h"
-+
-+static struct pcmcia_irqs irqs[] = {
-+ { 0, IRQ_GPIO1, "CF CD1" },
-+ { 0, IRQ_GPIO2, "CF CD2" },
-+ { 0, IRQ_GPIO3, "CF STSCHG/BVD1" },
-+ { 0, IRQ_GPIO4, "CF SPKR/BVD2" },
-+};
-+
-+
-+static int adssphere_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
-+{
-+ int rtn;
-+
-+ if (skt->nr != 0)
-+ return -ENXIO;
-+
-+ skt->irq = IRQ_GPIO6;
-+
-+ rtn = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+
-+ /* enable GPIO6 as interrupt */
-+ writel(0x40, GPIO_INTEN);
-+
-+ /* enable GPIO1-4 and 6 as interrupt */
-+ /* Note: 1-4 need to be edge triggered, but
-+ then the irq vectors need to hit GPIOxEIO
-+ which they don't currently do - no big deal
-+ since CD and BVD are polled anyway */
-+ /* writel(0x5e, GPIO_INTEN); */
-+
-+ return rtn;
-+}
-+
-+static void adssphere_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-+{
-+ soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+}
-+
-+static void adssphere_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
-+ struct pcmcia_state *state)
-+{
-+ unsigned long status;
-+
-+ status = inl(GPIO_PFDR);
-+
-+ state->detect = (status & PCMCIA_DETECT) ? 0 : 1;
-+ state->ready = (status & PCMCIA_READY) ? 1 : 0;
-+ state->bvd1 = (status & PCMCIA_BVD1) ? 1 : 0;
-+ state->bvd2 = (status & PCMCIA_BVD2) ? 1 : 0;
-+ state->vs_3v = (status & PCMCIA_VS_3V) ? 0 : 1;
-+ state->vs_Xv = (status & PCMCIA_VS_XV) ? 0 : 1;
-+ state->wrprot = (status & PCMCIA_WRPROT) ? 0 : 1;
-+
-+// printk("%s: nr: %d, status: %#x, state: %#x\n", __FUNCTION__, skt->nr, status, *((unsigned char *) state));
-+}
-+
-+static int adssphere_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
-+ const socket_state_t *state)
-+{
-+ unsigned long clrbits = 0, setbits = 0, cr0;
-+ int ret = 0;
-+
-+ switch (state->Vcc) {
-+ case 0: {
-+ clrbits = ADSSPHERE_CR0_CF_33 | ADSSPHERE_CR0_CF_50;
-+ setbits = 0;
-+ break;
-+ }
-+ case 33: {
-+ clrbits = ADSSPHERE_CR0_CF_50;
-+ setbits = ADSSPHERE_CR0_CF_33;
-+ break;
-+ }
-+ case 50: {
-+ clrbits = ADSSPHERE_CR0_CF_33;
-+ setbits = ADSSPHERE_CR0_CF_50;
-+ break;
-+ }
-+ default:
-+ printk(KERN_ERR "%s(): bad Vcc %u\n",
-+ __FUNCTION__, state->Vcc);
-+ ret = -1;
-+ }
-+
-+ if (!ret && skt->nr == 0) {
-+ cr0 = inl(ADSSPHERE_CR0);
-+ cr0 &= ~clrbits;
-+ cr0 |= setbits;
-+ writel(cr0, ADSSPHERE_CR0);
-+
-+ if (state->flags & SS_RESET) {
-+ /* see EP93xx User's Guide */
-+ writel(0x15, PCMCIACNT);
-+ } else {
-+ /* CF mode - BIT1 for PCMCIA mode */
-+ writel(0x11, PCMCIACNT);
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static void adssphere_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static void adssphere_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static struct pcmcia_low_level adssphere_pcmcia_ops = {
-+ .owner = THIS_MODULE,
-+ .hw_init = adssphere_pcmcia_hw_init,
-+ .hw_shutdown = adssphere_pcmcia_hw_shutdown,
-+ .socket_state = adssphere_pcmcia_socket_state,
-+ .configure_socket = adssphere_pcmcia_configure_socket,
-+ .socket_init = adssphere_pcmcia_socket_init,
-+ .socket_suspend = adssphere_pcmcia_socket_suspend,
-+ .nr = 1,
-+};
-+
-+static struct platform_device *adssphere_pcmcia_device;
-+
-+static int __init adssphere_pcmcia_init(void)
-+{
-+ int ret;
-+
-+ adssphere_pcmcia_device = kmalloc(sizeof(*adssphere_pcmcia_device), GFP_KERNEL);
-+ if (!adssphere_pcmcia_device)
-+ return -ENOMEM;
-+ memset(adssphere_pcmcia_device, 0, sizeof(*adssphere_pcmcia_device));
-+ adssphere_pcmcia_device->name = "ep93xx-pcmcia";
-+ adssphere_pcmcia_device->dev.platform_data = &adssphere_pcmcia_ops;
-+
-+ ret = platform_device_register(adssphere_pcmcia_device);
-+ if (ret)
-+ kfree(adssphere_pcmcia_device);
-+
-+ return ret;
-+}
-+
-+static void __exit adssphere_pcmcia_exit(void)
-+{
-+ /*
-+ * This call is supposed to free our adssphere_pcmcia_device.
-+ * Unfortunately platform_device don't have a free method, and
-+ * we can't assume it's free of any reference at this point so we
-+ * can't free it either.
-+ */
-+ platform_device_unregister(adssphere_pcmcia_device);
-+}
-+
-+module_init(adssphere_pcmcia_init);
-+module_exit(adssphere_pcmcia_exit);
-+
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/pcmcia/ep93xx_base.c b/drivers/pcmcia/ep93xx_base.c
-new file mode 100644
-index 0000000..2377989
---- /dev/null
-+++ b/drivers/pcmcia/ep93xx_base.c
-@@ -0,0 +1,190 @@
-+/*======================================================================
-+
-+ Device driver for the PCMCIA control functionality of EP93xx
-+ microprocessors. Derived from pxa2xx_base.c
-+
-+ The contents of this file may be used under the
-+ terms of the GNU Public License version 2 (the "GPL")
-+
-+ (c) Ian Molton (spyro@f2s.com) 2003
-+ (c) Stefan Eletzhofer (stefan.eletzhofer@inquant.de) 2003,4
-+ (c) Robert Whaley (rwhaley@applieddata.net) 2005
-+
-+ derived from sa11xx_base.c
-+
-+ Portions created by John G. Dorsey are
-+ Copyright (C) 1999 John G. Dorsey.
-+
-+ ======================================================================*/
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/config.h>
-+#include <linux/ioport.h>
-+#include <linux/kernel.h>
-+#include <linux/spinlock.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/system.h>
-+
-+#include <pcmcia/cs_types.h>
-+#include <pcmcia/ss.h>
-+#include <pcmcia/bulkmem.h>
-+#include <pcmcia/cistpl.h>
-+
-+#include "cs_internal.h"
-+#include "soc_common.h"
-+
-+#define MIN(a,b) ((a)>(b) ? (b) : (a))
-+
-+#define MCXX_SETUP_MAX 0xff
-+#define MCXX_ASST_MAX 0xff
-+#define MCXX_HOLD_MAX 0x0f
-+
-+#define MCXX_SETUP_SHIFT 0
-+#define MCXX_ASST_SHIFT 16
-+#define MCXX_HOLD_SHIFT 8
-+
-+
-+
-+static inline u_int ep93xx_mcxx_hold(u_int pcmcia_cycle_ns,
-+ u_int hclk_10khz)
-+{
-+ u_int code = pcmcia_cycle_ns * hclk_10khz;
-+ return (code / 100000) + ((code % 100000) ? 1 : 0) - 1;
-+}
-+
-+static inline u_int ep93xx_mcxx_asst(u_int pcmcia_cycle_ns,
-+ u_int hclk_10khz)
-+{
-+ u_int code = pcmcia_cycle_ns * hclk_10khz;
-+ return (code / 100000) + ((code % 100000) ? 1 : 0) - 1;
-+}
-+
-+static inline u_int ep93xx_mcxx_setup(u_int pcmcia_cycle_ns,
-+ u_int hclk_10khz)
-+{
-+ u_int code = pcmcia_cycle_ns * hclk_10khz;
-+ return (code / 100000) + ((code % 100000) ? 1 : 0) - 1;
-+}
-+
-+static int ep93xx_pcmcia_set_mcmem( int sock, int speed, int clock )
-+{
-+ writel(PC16BITSWIDE
-+ | (MIN(ep93xx_mcxx_setup(speed, clock), MCXX_SETUP_MAX) << MCXX_SETUP_SHIFT)
-+ | (MIN(ep93xx_mcxx_asst(speed, clock), MCXX_ASST_MAX) << MCXX_ASST_SHIFT)
-+ | (MIN(ep93xx_mcxx_hold(speed, clock), MCXX_HOLD_MAX) << MCXX_HOLD_SHIFT),
-+ PC1COMMON);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_pcmcia_set_mcio( int sock, int speed, int clock )
-+{
-+ writel(PC16BITSWIDE
-+ | (MIN(ep93xx_mcxx_setup(speed, clock), MCXX_SETUP_MAX) << MCXX_SETUP_SHIFT)
-+ | (MIN(ep93xx_mcxx_asst(speed, clock), MCXX_ASST_MAX) << MCXX_ASST_SHIFT)
-+ | (MIN(ep93xx_mcxx_hold(speed, clock), MCXX_HOLD_MAX) << MCXX_HOLD_SHIFT),
-+ PC1IO);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_pcmcia_set_mcatt( int sock, int speed, int clock )
-+{
-+ writel(PC16BITSWIDE
-+ | (MIN(ep93xx_mcxx_setup(speed, clock), MCXX_SETUP_MAX) << MCXX_SETUP_SHIFT)
-+ | (MIN(ep93xx_mcxx_asst(speed, clock), MCXX_ASST_MAX) << MCXX_ASST_SHIFT)
-+ | (MIN(ep93xx_mcxx_hold(speed, clock), MCXX_HOLD_MAX) << MCXX_HOLD_SHIFT),
-+ PC1ATTRIB);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_pcmcia_set_mcxx(struct soc_pcmcia_socket *skt, unsigned int clk)
-+{
-+ struct soc_pcmcia_timing timing;
-+ int sock = skt->nr;
-+
-+ soc_common_pcmcia_get_timing(skt, &timing);
-+
-+ ep93xx_pcmcia_set_mcmem(sock, timing.mem, clk);
-+ ep93xx_pcmcia_set_mcatt(sock, timing.attr, clk);
-+ ep93xx_pcmcia_set_mcio(sock, timing.io, clk);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
-+{
-+ unsigned int hclk = 10000; /* for now just hard code hclk to 100Mhz (in 10khz units)*/
-+ return ep93xx_pcmcia_set_mcxx(skt, hclk);
-+}
-+
-+int ep93xx_drv_pcmcia_probe(struct device *dev)
-+{
-+ int ret;
-+ struct pcmcia_low_level *ops;
-+ int first, nr;
-+
-+ if (!dev || !dev->platform_data)
-+ return -ENODEV;
-+
-+ ops = (struct pcmcia_low_level *)dev->platform_data;
-+ first = ops->first;
-+ nr = ops->nr;
-+
-+ /* Provide our EP93xx specific timing routines. */
-+ ops->set_timing = ep93xx_pcmcia_set_timing;
-+
-+ ret = soc_common_drv_pcmcia_probe(dev, ops, first, nr);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL(ep93xx_drv_pcmcia_probe);
-+
-+static int ep93xx_drv_pcmcia_suspend(struct device *dev, u32 state, u32 level)
-+{
-+ int ret = 0;
-+ if (level == SUSPEND_SAVE_STATE)
-+ ret = pcmcia_socket_dev_suspend(dev, state);
-+ return ret;
-+}
-+
-+static int ep93xx_drv_pcmcia_resume(struct device *dev, u32 level)
-+{
-+ int ret = 0;
-+ if (level == RESUME_RESTORE_STATE)
-+ {
-+ ret = pcmcia_socket_dev_resume(dev);
-+ }
-+ return ret;
-+}
-+
-+static struct device_driver ep93xx_pcmcia_driver = {
-+ .probe = ep93xx_drv_pcmcia_probe,
-+ .remove = soc_common_drv_pcmcia_remove,
-+ .suspend = ep93xx_drv_pcmcia_suspend,
-+ .resume = ep93xx_drv_pcmcia_resume,
-+ .name = "ep93xx-pcmcia",
-+ .bus = &platform_bus_type,
-+};
-+
-+static int __init ep93xx_pcmcia_init(void)
-+{
-+ return driver_register(&ep93xx_pcmcia_driver);
-+}
-+
-+static void __exit ep93xx_pcmcia_exit(void)
-+{
-+ driver_unregister(&ep93xx_pcmcia_driver);
-+}
-+
-+module_init(ep93xx_pcmcia_init);
-+module_exit(ep93xx_pcmcia_exit);
-+
-+MODULE_AUTHOR("Robert Whaley (whaley@applieddata.net)");
-+MODULE_DESCRIPTION("Linux PCMCIA Card Services: EP93xx core socket driver");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/pcmcia/ep93xx_edb9315.c b/drivers/pcmcia/ep93xx_edb9315.c
-new file mode 100644
-index 0000000..519fc8d
---- /dev/null
-+++ b/drivers/pcmcia/ep93xx_edb9315.c
-@@ -0,0 +1,283 @@
-+/*
-+ * linux/drivers/pcmcia/ep93xx_edb9315.c
-+ *
-+ * Adapted from pxa27x_mainstone.c
-+ *
-+ * Edb9315 PCMCIA specific routines.
-+ *
-+ * Created: May 12, 2004
-+ * Author: Nicolas Pitre
-+ * Copyright: MontaVista Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/device.h>
-+
-+#include <pcmcia/ss.h>
-+
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+
-+#include <asm/arch/edb9315.h>
-+
-+#include "soc_common.h"
-+
-+static struct pcmcia_irqs irqs[] = {
-+ { 0, IRQ_GPIO1, "CF CD1" },
-+ { 0, IRQ_GPIO2, "CF CD2" },
-+ { 0, IRQ_GPIO3, "CF STSCHG/BVD1" },
-+ { 0, IRQ_GPIO4, "CF SPKR/BVD2" },
-+};
-+
-+
-+static int edb9315_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
-+{
-+ int rtn;
-+
-+ if (skt->nr == 0)
-+ return -ENXIO;
-+
-+ skt->irq = IRQ_GPIO6;
-+
-+ rtn = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+
-+ /* enable GPIO6 as interrupt */
-+ writel(0x40, GPIO_INTEN);
-+
-+ /* enable GPIO1-4 and 6 as interrupt */
-+ /* Note: 1-4 need to be edge triggered, but
-+ then the irq vectors need to hit GPIOxEIO
-+ which they don't currently do - no big deal
-+ since CD and BVD are polled anyway */
-+ /* writel(0x5e, GPIO_INTEN); */
-+
-+ return rtn;
-+}
-+
-+static void edb9315_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-+{
-+ soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+}
-+
-+static void edb9315_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
-+ struct pcmcia_state *state)
-+{
-+ unsigned long status;
-+
-+ status = inl(GPIO_PFDR);
-+
-+ state->detect = (status & PCMCIA_DETECT) ? 0 : 1;
-+ state->ready = (status & PCMCIA_READY) ? 1 : 0;
-+ state->bvd1 = (status & PCMCIA_BVD1) ? 1 : 0;
-+ state->bvd2 = (status & PCMCIA_BVD2) ? 1 : 0;
-+ state->vs_3v = (status & PCMCIA_VS_3V) ? 0 : 1;
-+ state->vs_Xv = (status & PCMCIA_VS_XV) ? 0 : 1;
-+ state->wrprot = (status & PCMCIA_WRPROT) ? 0 : 1;
-+
-+// printk("%s: nr: %d, status: %#x, state: %#x\n", __FUNCTION__, skt->nr, status, *((unsigned char *) state));
-+}
-+
-+/*
-+ * We bit-bang the pcmcia power controller using this function.
-+ */
-+static void ep93xx_bitbang( unsigned long ulNewEEValue )
-+{
-+ unsigned long ulGdata;
-+
-+ ulGdata = inl( GPIO_PGDR );
-+
-+ ulGdata &= ~(GPIOA_EECLK | GPIOA_EEDAT | GPIOA_SLA0);
-+
-+ ulNewEEValue &= (GPIOA_EECLK | GPIOA_EEDAT | GPIOA_SLA0);
-+
-+ ulGdata |= ulNewEEValue;
-+
-+ outl( ulGdata, GPIO_PGDR );
-+ ulGdata = inl( GPIO_PGDR ); // read to push write out wrapper
-+
-+ // Voltage controller's data sheet says minimum pulse width is
-+ // one microsecond.
-+ udelay(5);
-+}
-+
-+static int
-+ep93xx_set_voltage( u_short sock, u_char NewVcc )
-+{
-+ struct socket_info_t * skt = &socket_info[sock];
-+ unsigned long ulSwitchSettings, ulDataBit, ulGdirection;
-+ int i;
-+
-+ if (sock >= EP93XX_MAX_SOCK)
-+ return -EINVAL;
-+
-+ if( skt->Vcc == NewVcc ){
-+ DEBUG(3, "Power already set to %d\n", NewVcc );
-+ return 0;
-+ }
-+
-+ ulSwitchSettings = EE_ADDRESS | ENABLE;
-+ switch( NewVcc )
-+ {
-+ case 0:
-+ DEBUG(3, "Configure the socket for 0 Volts\n");
-+ ulSwitchSettings |= AVCC_0V;
-+ break;
-+
-+ case 50:
-+ ulSwitchSettings |= AVCC_5V;
-+ DEBUG(3, "Configure the socket for 5 Volts\n");
-+ break;
-+
-+ case 33:
-+ DEBUG(3, "Configure the socket for 3.3 Volts\n");
-+ ulSwitchSettings |= AVCC_33V;
-+ break;
-+
-+ default:
-+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__,
-+ NewVcc);
-+ return -1;
-+ }
-+
-+ //
-+ // Configure the proper GPIO pins as outputs.
-+ //
-+ ep93xx_bitbang( GPIOA_EECLK | GPIOA_EEDAT );
-+
-+ //
-+ // Read modify write the data direction register, set the
-+ // proper lines to be outputs.
-+ //
-+ ulGdirection = inl( GPIO_PGDDR );
-+ ulGdirection |= GPIOA_EECLK | GPIOA_EEDAT | GPIOA_SLA0;
-+ outl( ulGdirection, GPIO_PGDDR );
-+ ulGdirection = inl( GPIO_PGDDR ); // read to push write out wrapper
-+
-+ //
-+ // Clear all except EECLK
-+ // Lower the clock.
-+ //
-+ ep93xx_bitbang( GPIOA_EECLK );
-+ ep93xx_bitbang( 0 );
-+
-+ //
-+ // Serial shift the command word out to the voltage controller.
-+ //
-+ for( i=18 ; i>=0 ; --i )
-+ {
-+ if( (ulSwitchSettings >> i) & 0x1 )
-+ ulDataBit = GPIOA_EEDAT;
-+ else
-+ ulDataBit = 0;
-+
-+ //
-+ // Put the data on the bus and lower the clock.
-+ // Raise the clock to latch the data in.
-+ // Lower the clock again.
-+ //
-+ ep93xx_bitbang( ulDataBit );
-+ ep93xx_bitbang( ulDataBit | GPIOA_EECLK );
-+ ep93xx_bitbang( ulDataBit );
-+ }
-+
-+ //
-+ // Raise and lower the Latch.
-+ // Raise EECLK, delay, raise EEDAT, leave them that way.
-+ //
-+ ep93xx_bitbang( GPIOA_SLA0 );
-+ ep93xx_bitbang( 0 );
-+ ep93xx_bitbang( GPIOA_EECLK );
-+ ep93xx_bitbang( GPIOA_EECLK | GPIOA_EEDAT );
-+
-+ skt->Vcc = NewVcc;
-+
-+ DEBUG(3, "ep93xx_set_voltage - exit\n");
-+
-+ return 0;
-+}
-+
-+static int edb9315_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
-+ const socket_state_t *state)
-+{
-+ unsigned long clrbits = 0, setbits = 0, cr0;
-+ int ret = 0;
-+
-+ ep93xx_set_voltage(skt->nr, state->Vxx);
-+
-+ if (!ret && skt->nr == 0) {
-+
-+ if (state->flags & SS_RESET) {
-+ /* see EP93xx User's Guide */
-+ writel(0x15, PCMCIACNT);
-+ } else {
-+ /* CF mode - BIT1 for PCMCIA mode */
-+ writel(0x11, PCMCIACNT);
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static void edb9315_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static void edb9315_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static struct pcmcia_low_level edb9315_pcmcia_ops = {
-+ .owner = THIS_MODULE,
-+ .hw_init = edb9315_pcmcia_hw_init,
-+ .hw_shutdown = edb9315_pcmcia_hw_shutdown,
-+ .socket_state = edb9315_pcmcia_socket_state,
-+ .configure_socket = edb9315_pcmcia_configure_socket,
-+ .socket_init = edb9315_pcmcia_socket_init,
-+ .socket_suspend = edb9315_pcmcia_socket_suspend,
-+ .nr = 1,
-+};
-+
-+static struct platform_device *edb9315_pcmcia_device;
-+
-+static int __init edb9315_pcmcia_init(void)
-+{
-+ int ret;
-+
-+ edb9315_pcmcia_device = kmalloc(sizeof(*edb9315_pcmcia_device), GFP_KERNEL);
-+ if (!edb9315_pcmcia_device)
-+ return -ENOMEM;
-+ memset(edb9315_pcmcia_device, 0, sizeof(*edb9315_pcmcia_device));
-+ edb9315_pcmcia_device->name = "ep93xx-pcmcia";
-+ edb9315_pcmcia_device->dev.platform_data = &edb9315_pcmcia_ops;
-+
-+ ret = platform_device_register(edb9315_pcmcia_device);
-+ if (ret)
-+ kfree(edb9315_pcmcia_device);
-+
-+ return ret;
-+}
-+
-+static void __exit edb9315_pcmcia_exit(void)
-+{
-+ /*
-+ * This call is supposed to free our edb9315_pcmcia_device.
-+ * Unfortunately platform_device don't have a free method, and
-+ * we can't assume it's free of any reference at this point so we
-+ * can't free it either.
-+ */
-+ platform_device_unregister(edb9315_pcmcia_device);
-+}
-+
-+module_init(edb9315_pcmcia_init);
-+module_exit(edb9315_pcmcia_exit);
-+
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/pcmcia/ep93xx_zefeerevbh.c b/drivers/pcmcia/ep93xx_zefeerevbh.c
-new file mode 100644
-index 0000000..44d44ed
---- /dev/null
-+++ b/drivers/pcmcia/ep93xx_zefeerevbh.c
-@@ -0,0 +1,175 @@
-+/*
-+ * linux/drivers/pcmcia/ep93xx_zefeerevbh.c
-+ *
-+ * Adapted from ep93xx_zefeerevbh.c
-+ *
-+ *
-+ * ZefeerEVB-H PCMCIA specific routines.
-+ *
-+ * Copyright: DAVE Srl <www.dave-tech.it>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/device.h>
-+
-+#include <pcmcia/ss.h>
-+
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+
-+#include <asm/arch/zefeerevb.h>
-+
-+#include "soc_common.h"
-+
-+#if 0
-+#define DPRINTK(fmt, args...) printk( "[%s:] \n" fmt, __FUNCTION__, ## args)
-+#else
-+#define DPRINTK(fmt, args...)
-+#endif
-+
-+static struct pcmcia_irqs irqs[] = {
-+ { 0, IRQ_GPIO1, "CF CD1" },
-+ { 0, IRQ_GPIO2, "CF CD2" },
-+ { 0, IRQ_GPIO3, "CF STSCHG/BVD1" },
-+ { 0, IRQ_GPIO4, "CF SPKR/BVD2" },
-+};
-+
-+
-+static int zefeerevbh_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
-+{
-+ int rtn;
-+ unsigned long tmp;
-+
-+ if (skt->nr != 0)
-+ return -ENXIO;
-+
-+ /* Set interrupt lines as input */
-+ tmp = readl(GPIO_PFDDR);
-+ tmp = (tmp & (~((1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 6))));
-+ writel(tmp, GPIO_PFDDR);
-+
-+ skt->irq = IRQ_GPIO6;
-+
-+ rtn = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+
-+ /* enable GPIO6 as interrupt */
-+ writel(0x40, GPIO_INTEN);
-+
-+ /* enable GPIO1-4 and 6 as interrupt */
-+ /* Note: 1-4 need to be edge triggered, but
-+ then the irq vectors need to hit GPIOxEIO
-+ which they don't currently do - no big deal
-+ since CD and BVD are polled anyway */
-+ /* writel(0x5e, GPIO_INTEN); */
-+
-+ return rtn;
-+}
-+
-+static void zefeerevbh_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-+{
-+ soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
-+}
-+
-+static void zefeerevbh_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
-+ struct pcmcia_state *state)
-+{
-+ unsigned long status;
-+
-+ status = inl(GPIO_PFDR);
-+
-+ state->detect = (status & PCMCIA_DETECT) ? 0 : 1;
-+ state->ready = (status & PCMCIA_READY) ? 1 : 0;
-+ state->bvd1 = (status & PCMCIA_BVD1) ? 1 : 0;
-+ state->bvd2 = (status & PCMCIA_BVD2) ? 1 : 0;
-+ state->vs_3v = (status & PCMCIA_VS_3V) ? 0 : 1;
-+ state->vs_Xv = (status & PCMCIA_VS_XV) ? 0 : 1;
-+ state->wrprot = (status & PCMCIA_WRPROT) ? 0 : 1;
-+
-+ DPRINTK("%s: nr: %d, status: %#x, state: %#x\n", __FUNCTION__, skt->nr, status, *((unsigned char *) state));
-+}
-+
-+static int zefeerevbh_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
-+ const socket_state_t *state)
-+{
-+
-+ printk(KERN_INFO "[%s]: Vcc = %u, Vpp = %u\n", __FUNCTION__, state->Vcc, state->Vpp);
-+
-+ /* By default power handling is managed by external controller automatically */
-+
-+ if (skt->nr == 0) {
-+ if (state->flags & SS_RESET) {
-+ /* see EP93xx User's Guide */
-+ writel(0x15, PCMCIACNT);
-+ } else {
-+ /* CF mode - BIT1 for PCMCIA mode */
-+ writel(0x11, PCMCIACNT);
-+ }
-+ }
-+
-+
-+ return 0;
-+}
-+
-+static void zefeerevbh_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static void zefeerevbh_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
-+{
-+}
-+
-+static struct pcmcia_low_level zefeerevbh_pcmcia_ops = {
-+ .owner = THIS_MODULE,
-+ .hw_init = zefeerevbh_pcmcia_hw_init,
-+ .hw_shutdown = zefeerevbh_pcmcia_hw_shutdown,
-+ .socket_state = zefeerevbh_pcmcia_socket_state,
-+ .configure_socket = zefeerevbh_pcmcia_configure_socket,
-+ .socket_init = zefeerevbh_pcmcia_socket_init,
-+ .socket_suspend = zefeerevbh_pcmcia_socket_suspend,
-+ .nr = 1,
-+};
-+
-+static struct platform_device *zefeerevbh_pcmcia_device;
-+
-+static int __init zefeerevbh_pcmcia_init(void)
-+{
-+ int ret;
-+
-+ zefeerevbh_pcmcia_device = kmalloc(sizeof(*zefeerevbh_pcmcia_device), GFP_KERNEL);
-+ if (!zefeerevbh_pcmcia_device)
-+ return -ENOMEM;
-+ memset(zefeerevbh_pcmcia_device, 0, sizeof(*zefeerevbh_pcmcia_device));
-+ zefeerevbh_pcmcia_device->name = "ep93xx-pcmcia";
-+ zefeerevbh_pcmcia_device->dev.platform_data = &zefeerevbh_pcmcia_ops;
-+
-+ ret = platform_device_register(zefeerevbh_pcmcia_device);
-+ if (ret)
-+ kfree(zefeerevbh_pcmcia_device);
-+
-+ return ret;
-+}
-+
-+static void __exit zefeerevbh_pcmcia_exit(void)
-+{
-+ /*
-+ * This call is supposed to free our zefeerevbh_pcmcia_device.
-+ * Unfortunately platform_device don't have a free method, and
-+ * we can't assume it's free of any reference at this point so we
-+ * can't free it either.
-+ */
-+ platform_device_unregister(zefeerevbh_pcmcia_device);
-+}
-+
-+module_init(zefeerevbh_pcmcia_init);
-+module_exit(zefeerevbh_pcmcia_exit);
-+
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
-index 812bae6..15bfa5d 100644
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -289,6 +289,25 @@ config SERIAL_CLPS711X_CONSOLE
- your boot loader (lilo or loadlin) about how to pass options to the
- kernel at boot time.)
-
-+config SERIAL_EP93XX
-+ tristate "EP93XX serial port support"
-+ depends on ARM && ARCH_EP93XX
-+ select SERIAL_CORE
-+ help
-+ Support for the serial ports included in the EP93xx CPU SOC.
-+
-+config SERIAL_EP93XX_CONSOLE
-+ bool "Support for console on EP93XX serial port"
-+ depends on SERIAL_EP93XX=y
-+ select SERIAL_CORE_CONSOLE
-+ help
-+ Even if you say Y here, the currently visible virtual console
-+ (/dev/tty0) will still be used as the system console by default, but
-+ you can alter that using a kernel command line option such as
-+ "console=ttyCL1". (Try "man bootparam" or see the documentation of
-+ your boot loader (lilo or loadlin) about how to pass options to the
-+ kernel at boot time.)
-+
- config SERIAL_S3C2410
- tristate "Samsung S3C2410 Serial port support"
- depends on ARM && ARCH_S3C2410
-diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
-index d7c7c71..ef074dc 100644
---- a/drivers/serial/Makefile
-+++ b/drivers/serial/Makefile
-@@ -26,6 +26,7 @@ obj-$(CONFIG_SERIAL_8250_AU1X00) += 8250
- obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o
- obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o
- obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o
-+obj-$(CONFIG_SERIAL_EP93XX) += ep93xx.o
- obj-$(CONFIG_SERIAL_PXA) += pxa.o
- obj-$(CONFIG_SERIAL_SA1100) += sa1100.o
- obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o
-diff --git a/drivers/serial/ep93xx.c b/drivers/serial/ep93xx.c
-new file mode 100644
-index 0000000..60f91a6
---- /dev/null
-+++ b/drivers/serial/ep93xx.c
-@@ -0,0 +1,863 @@
-+/*
-+ * drivers/serial/ep93xx.c
-+ *
-+ * Driver for EP93xx serial ports
-+ *
-+ * Based on drivers/serial/amba-pl011.c
-+ *
-+ * Copyright 1999 ARM Limited
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd.
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * 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
-+ *
-+ * $Id: ep93xx.c,v 1.42 2002/07/28 10:03:28 rmk Exp $
-+ *
-+ */
-+
-+/* todo:
-+ * - correct major/minor numbers
-+ * - implement request/release/verify port
-+ * - from /dev/ttyAM0, 'stty -F /dev/ttyAM1 57600' not working right.
-+ * looks like it changes the divisor, but it gets changed back as
-+ * soon as you enter a char on /dev/ttyAM1.
-+ * - do not enable modem status ints unless HW is setup
-+ * - do not return modem status unless HW is setup
-+ * - figure out a nice way to handle CL0 HDLC/modem, CL1 SIR IrDA,
-+ * and CL2 HDLC/RS485
-+ * - UART DMA operation?
-+ * - handle icount fields rng and buf_overrun?
-+ */
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/tty.h>
-+#include <linux/device.h>
-+#include <linux/sysrq.h>
-+#include <linux/console.h>
-+#include <linux/serial.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/hardware/amba.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/clocks.h>
-+
-+#if defined(CONFIG_SERIAL_EP93XX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
-+#define SUPPORT_SYSRQ
-+#endif
-+
-+#include <linux/serial_core.h>
-+
-+#if defined(CONFIG_ARCH_EP9312) || defined(CONFIG_ARCH_EP9315)
-+#define UART_NR 3
-+#else
-+#define UART_NR 2
-+#endif
-+
-+#define SERIAL_EP93XX_MAJOR 204
-+#define SERIAL_EP93XX_MINOR 16
-+
-+#define ISR_PASS_LIMIT 256
-+
-+#define REG(port,name) ((port)->membase + (name) - EP93XX_APB_BASE - UART1_OFFSET)
-+
-+#define UARTDR(port) REG(port,UART1DR)
-+#define UARTCR(port) REG(port,UART1CR)
-+#define UARTFR(port) REG(port,UART1FR)
-+#define UARTRSR(port) REG(port,UART1RSR)
-+#define UARTECR(port) REG(port,UART1ECR)
-+#define UARTMCR(port) REG(port,UART1MCR)
-+#define UARTMSR(port) REG(port,UART1MSR)
-+#define UARTIIR(port) REG(port,UART1IIR)
-+#define UARTICR(port) REG(port,UART1ICR)
-+#define UARTLCH(port) REG(port,UART1CR_H)
-+#define UARTLCM(port) REG(port,UART1CR_M)
-+#define UARTLCL(port) REG(port,UART1CR_L)
-+
-+#define UARTRSR_CREAD 0x100
-+
-+static void enable_clocks(struct uart_port *port)
-+{
-+ unsigned int devcfg = readl(SYSCON_DEVCFG);
-+
-+ switch (port->line) {
-+ case 0:
-+ devcfg |= SYSCON_DEVCFG_U1EN;
-+ devcfg &= ~SYSCON_DEVCFG_MonG; /* handle this better... */
-+ break;
-+ case 1:
-+ devcfg |= SYSCON_DEVCFG_U2EN;
-+ break;
-+ case 2:
-+ devcfg |= SYSCON_DEVCFG_U3EN;
-+ break;
-+ }
-+
-+ SysconSetLocked(SYSCON_DEVCFG, ep93xx_SYSCON_DEVCFG(devcfg));
-+}
-+
-+static void disable_clocks(struct uart_port *port)
-+{
-+ unsigned int devcfg = readl(SYSCON_DEVCFG);
-+
-+ switch (port->line) {
-+ case 0:
-+ devcfg &= ~SYSCON_DEVCFG_U1EN;
-+ break;
-+ case 1:
-+ devcfg &= ~SYSCON_DEVCFG_U2EN;
-+ break;
-+ case 2:
-+ devcfg &= ~SYSCON_DEVCFG_U3EN;
-+ break;
-+ }
-+
-+ SysconSetLocked(SYSCON_DEVCFG, ep93xx_SYSCON_DEVCFG(devcfg));
-+}
-+
-+static int is_port_enabled(struct uart_port *port)
-+{
-+ unsigned int devcfg = readl(SYSCON_DEVCFG);
-+
-+ switch (port->line) {
-+ case 0:
-+ devcfg &= SYSCON_DEVCFG_U1EN;
-+ break;
-+ case 1:
-+ devcfg &= SYSCON_DEVCFG_U2EN;
-+ break;
-+ case 2:
-+ devcfg &= SYSCON_DEVCFG_U3EN;
-+ break;
-+ }
-+
-+ return devcfg ? 1 : 0;
-+}
-+
-+static void ep93xxuart_stop_tx(struct uart_port *port)
-+{
-+ unsigned long cr = readl(UARTCR(port));
-+ cr &= ~UARTCR_TIE;
-+ writel(cr, UARTCR(port));
-+}
-+
-+static void ep93xxuart_start_tx(struct uart_port *port)
-+{
-+ unsigned long cr = readl(UARTCR(port));
-+ cr |= UARTCR_TIE;
-+ writel(cr, UARTCR(port));
-+}
-+
-+static void ep93xxuart_stop_rx(struct uart_port *port)
-+{
-+ unsigned long cr = readl(UARTCR(port));
-+ cr &= ~(UARTCR_RIE | UARTCR_RTIE);
-+ writel(cr, UARTCR(port));
-+}
-+
-+static void ep93xxuart_enable_ms(struct uart_port *port)
-+{
-+ /* fixme: add an ms mask to a wrapper port struct */
-+ if (port->line == 0) {
-+ unsigned long cr = readl(UARTCR(port));
-+ cr |= UARTCR_MSIE;
-+ writel(cr, UARTCR(port));
-+ }
-+}
-+
-+#ifdef SUPPORT_SYSRQ
-+static void ep93xxuart_rx_chars(struct uart_port *port, struct pt_regs *regs)
-+#else
-+static void ep93xxuart_rx_chars(struct uart_port *port)
-+#endif
-+{
-+ struct tty_struct *tty = port->info->tty;
-+ unsigned long fifo, chr, stat, flg;
-+ unsigned int count = 256;
-+
-+ fifo = readl(UARTFR(port));
-+ while (((fifo & UARTFR_RXFE) == 0) && count--) {
-+
-+ if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-+ tty->flip.work.func((void *)tty);
-+ if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-+ printk(KERN_WARNING "TTY_DONT_FLIP set\n");
-+ return;
-+ }
-+ }
-+
-+ chr = readl(UARTDR(port));
-+ flg = TTY_NORMAL;
-+
-+ port->icount.rx++;
-+
-+ stat = readl(UARTRSR(port)) | UARTRSR_CREAD;
-+
-+ if (stat & (UARTRSR_FE | UARTRSR_PE | UARTRSR_OE | UARTRSR_BE)) {
-+
-+ writel(0, UARTECR(port));
-+
-+ if (stat & UARTRSR_BE) {
-+ stat &= ~(UARTRSR_PE | UARTRSR_FE);
-+ port->icount.brk++;
-+ if (uart_handle_break(port))
-+ goto ignore_char;
-+ } else if (stat & UARTRSR_PE) {
-+ port->icount.parity++;
-+ } else if (stat & UARTRSR_FE) {
-+ port->icount.frame++;
-+ }
-+
-+ if (stat & UARTRSR_OE)
-+ port->icount.overrun++;
-+
-+ stat &= port->read_status_mask;
-+
-+ if (stat & UARTRSR_BE)
-+ flg = TTY_BREAK;
-+ else if (stat & UARTRSR_PE)
-+ flg = TTY_PARITY;
-+ else if (stat & UARTRSR_FE)
-+ flg = TTY_FRAME;
-+ }
-+
-+ if (uart_handle_sysrq_char(port, chr, regs))
-+ goto ignore_char;
-+
-+ if ((stat & port->ignore_status_mask) == 0) {
-+ *tty->flip.flag_buf_ptr++ = flg;
-+ *tty->flip.char_buf_ptr++ = chr;
-+ tty->flip.count++;
-+ }
-+
-+ if ((stat & UARTRSR_OE) && tty->flip.count < TTY_FLIPBUF_SIZE) {
-+ *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
-+ *tty->flip.char_buf_ptr++ = 0;
-+ tty->flip.count++;
-+ }
-+
-+ ignore_char:
-+ fifo = readl(UARTFR(port));
-+ }
-+ tty_flip_buffer_push(tty);
-+}
-+
-+static void ep93xxuart_tx_chars(struct uart_port *port)
-+{
-+ struct circ_buf *xmit = &port->info->xmit;
-+ int count;
-+
-+ if (port->x_char) {
-+ writel(port->x_char, UARTDR(port));
-+ port->icount.tx++;
-+ port->x_char = 0;
-+ return;
-+ }
-+ if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
-+ ep93xxuart_stop_tx(port);
-+ return;
-+ }
-+
-+ count = port->fifosize >> 1;
-+ do {
-+ writel(xmit->buf[xmit->tail], UARTDR(port));
-+ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
-+ port->icount.tx++;
-+ if (uart_circ_empty(xmit))
-+ break;
-+ } while (--count > 0);
-+
-+ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-+ uart_write_wakeup(port);
-+
-+ if (uart_circ_empty(xmit))
-+ ep93xxuart_stop_tx(port);
-+}
-+
-+static void ep93xxuart_modem_status(struct uart_port *port)
-+{
-+ unsigned int status = readl(UARTFR(port));
-+
-+ writel(0, UARTICR(port));
-+
-+ if (status & UARTMSR_DDCD)
-+ uart_handle_dcd_change(port, status & UARTMSR_DCD);
-+
-+ if (status & UARTMSR_DDSR)
-+ port->icount.dsr++;
-+
-+ if (status & UARTMSR_DCTS)
-+ uart_handle_cts_change(port, status & UARTMSR_CTS);
-+
-+ if (status & (UARTMSR_DDCD | UARTMSR_DDSR | UARTMSR_DCTS))
-+ wake_up_interruptible(&port->info->delta_msr_wait);
-+}
-+
-+static irqreturn_t ep93xxuart_int(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ struct uart_port *port = dev_id;
-+ unsigned int pass_counter = ISR_PASS_LIMIT;
-+ int handled = 0;
-+ unsigned long iir;
-+
-+ spin_lock(&port->lock);
-+
-+ iir = readl(UARTIIR(port));
-+
-+ if (iir) {
-+ do {
-+ if (iir & (UARTIIR_RIS | UARTIIR_RTIS))
-+#ifdef SUPPORT_SYSRQ
-+ ep93xxuart_rx_chars(port, regs);
-+#else
-+ ep93xxuart_rx_chars(port);
-+#endif
-+ if (iir & UARTIIR_TIS)
-+ ep93xxuart_tx_chars(port);
-+ if (iir & UARTIIR_MIS)
-+ ep93xxuart_modem_status(port);
-+
-+ if (pass_counter-- == 0)
-+ break;
-+
-+ iir = readl(UARTIIR(port));
-+
-+ } while (iir &
-+ (UARTIIR_RIS | UARTIIR_RTIS | UARTIIR_TIS |
-+ UARTIIR_MIS));
-+ handled = 1;
-+ }
-+
-+ spin_unlock(&port->lock);
-+
-+ return IRQ_RETVAL(handled);
-+}
-+
-+static unsigned int ep93xxuart_tx_empty(struct uart_port *port)
-+{
-+ unsigned long status = readl(UARTFR(port));
-+ return status & UARTFR_TXFE ? 0 : TIOCSER_TEMT; /* FIXME: klaus used UARTFR_BUSY? */
-+}
-+
-+static unsigned int ep93xxuart_get_mctrl(struct uart_port *port)
-+{
-+ unsigned int result = 0;
-+
-+ /* fixme: use a wrapper struct w/ ms flags */
-+ if (port->line == 0) {
-+ unsigned int msr = readl(UARTMSR(port));
-+ if (msr & UARTMSR_CTS)
-+ result |= TIOCM_CTS;
-+ if (msr & UARTMSR_DSR)
-+ result |= TIOCM_DSR;
-+ if (msr & UARTMSR_RI)
-+ result |= TIOCM_RI;
-+ if (msr & UARTMSR_DCD)
-+ result |= TIOCM_CAR;
-+ }
-+ return result;
-+}
-+
-+static void ep93xxuart_set_mctrl(struct uart_port *port, unsigned int mctrl)
-+{
-+ unsigned long mcr;
-+
-+ if (port->line == 0) {
-+ mcr = readl(UARTMCR(port));
-+ if (mctrl & TIOCM_RTS)
-+ mcr |= UARTMCR_RTS;
-+ else
-+ mcr &= ~UARTMCR_RTS;
-+ if (mctrl & TIOCM_DTR)
-+ mcr |= UARTMCR_DTR;
-+ else
-+ mcr &= ~UARTMCR_DTR;
-+ if (mctrl & TIOCM_OUT1)
-+ mcr |= UARTMCR_OUT1;
-+ else
-+ mcr &= ~UARTMCR_OUT1;
-+ if (mctrl & TIOCM_OUT2)
-+ mcr |= UARTMCR_OUT2;
-+ else
-+ mcr &= ~UARTMCR_OUT2;
-+ writel(mcr, UARTMCR(port));
-+ }
-+}
-+
-+/* FIXME: klaus grabbed the &port->lock spinlock here.. */
-+static void ep93xxuart_break_ctl(struct uart_port *port, int break_state)
-+{
-+ unsigned long lch;
-+
-+ lch = readl(UARTLCH(port));
-+ if (break_state)
-+ lch |= UARTLCR_H_BRK;
-+ else
-+ lch &= ~UARTLCR_H_BRK;
-+ writel(lch, UARTLCH(port));
-+}
-+
-+static int ep93xxuart_startup(struct uart_port *port)
-+{
-+ unsigned int uartcr;
-+ int retval;
-+
-+ retval = request_irq(port->irq, ep93xxuart_int, 0, "ep93xxuart", port);
-+ if (retval)
-+ return retval;
-+
-+ enable_clocks(port);
-+
-+ uartcr = readl(UARTCR(port));
-+ uartcr |= UARTCR_UARTE | UARTCR_RIE | UARTCR_RTIE;
-+ uartcr &= ~0x6;
-+ writel(uartcr, UARTCR(port));
-+
-+ return 0;
-+}
-+
-+static void ep93xxuart_shutdown(struct uart_port *port)
-+{
-+ unsigned int uartcr;
-+ unsigned int linectl;
-+
-+ linectl = readl(UARTLCH(port));
-+ linectl &= ~(UARTLCR_H_FEN | UARTLCR_H_BRK);
-+ writel(linectl, UARTLCH(port));
-+
-+ uartcr = readl(UARTCR(port));
-+ uartcr &= ~(UARTCR_UARTE | UARTCR_RIE | UARTCR_RTIE | UARTCR_TIE);
-+ writel(uartcr, UARTCR(port));
-+
-+ disable_clocks(port);
-+
-+ free_irq(port->irq, port);
-+}
-+
-+static void
-+ep93xxuart_set_termios(struct uart_port *port, struct termios *termios,
-+ struct termios *old)
-+{
-+ unsigned int baud, quot;
-+ unsigned long flags;
-+ unsigned long lch;
-+
-+ /* wait for fifo to drain.. is this needed? upper level should handle it.. */
-+ if (is_port_enabled(port))
-+ do {
-+ flags = readl(UARTFR(port));
-+ } while (flags & UARTFR_BUSY);
-+
-+ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
-+ quot = uart_get_divisor(port, baud);
-+
-+ switch (termios->c_cflag & CSIZE) {
-+ case CS5:
-+ lch = UARTLCR_H_WLEN_5_DATA;
-+ break;
-+ case CS6:
-+ lch = UARTLCR_H_WLEN_6_DATA;
-+ break;
-+ case CS7:
-+ lch = UARTLCR_H_WLEN_7_DATA;
-+ break;
-+ default:
-+ lch = UARTLCR_H_WLEN_8_DATA;
-+ break;
-+ }
-+
-+ if (termios->c_cflag & CSTOPB)
-+ lch |= UARTLCR_H_STP2;
-+
-+ if (termios->c_cflag & PARENB) {
-+ lch |= UARTLCR_H_PEN;
-+ if (!(termios->c_cflag & PARODD))
-+ lch |= UARTLCR_H_EPS;
-+ }
-+
-+ if (port->fifosize > 1)
-+ lch |= UARTLCR_H_FEN;
-+
-+ spin_lock_irqsave(&port->lock, flags);
-+
-+ lch |= readl(UARTLCH(port)) & UARTLCR_H_BRK;
-+
-+ uart_update_timeout(port, termios->c_cflag, baud);
-+
-+ port->read_status_mask = UARTRSR_OE;
-+ if (termios->c_iflag & INPCK)
-+ port->read_status_mask |= UARTRSR_FE | UARTRSR_PE;
-+ if (termios->c_iflag & (BRKINT | PARMRK))
-+ port->read_status_mask |= UARTRSR_BE;
-+
-+ port->ignore_status_mask = 0;
-+ if (termios->c_iflag & IGNPAR)
-+ port->ignore_status_mask |= UARTRSR_FE | UARTRSR_PE;
-+ if (termios->c_iflag & IGNBRK) {
-+ port->ignore_status_mask |= UARTRSR_BE;
-+ if (termios->c_iflag & IGNPAR)
-+ port->ignore_status_mask |= UARTRSR_OE;
-+ }
-+ if ((termios->c_cflag & CREAD) == 0)
-+ port->ignore_status_mask |= UARTRSR_CREAD;
-+
-+ quot -= 1;
-+
-+ writel(quot & 0xff, UARTLCL(port));
-+ writel((quot >> 8) & 0xff, UARTLCM(port));
-+ writel(lch, UARTLCH(port));
-+
-+ spin_unlock_irqrestore(&port->lock, flags);
-+}
-+
-+static const char *ep93xxuart_type(struct uart_port *port)
-+{
-+ return port->type == PORT_EP93XX ? "uart-ep93xx" : NULL;
-+}
-+
-+static void ep93xxuart_release_port(struct uart_port *port)
-+{
-+ /* update when we break up static io_desc maps */
-+}
-+
-+static int ep93xxuart_request_port(struct uart_port *port)
-+{
-+ /* update when we break up static io_desc maps */
-+ return 0;
-+}
-+
-+static void ep93xxuart_config_port(struct uart_port *port, int flags)
-+{
-+ if (flags & UART_CONFIG_TYPE)
-+ if (ep93xxuart_request_port(port) == 0)
-+ port->type = PORT_EP93XX;
-+
-+ /* FIXME: handle UART_CONFIG_IRQ? */
-+}
-+
-+static int ep93xxuart_verify_port(struct uart_port *port,
-+ struct serial_struct *ser)
-+{
-+ if (ser->type != PORT_UNKNOWN && ser->type != PORT_EP93XX)
-+ return -EINVAL;
-+ if (ser->irq < 0 || ser->irq >= NR_IRQS)
-+ return -EINVAL;
-+ if (ser->baud_base < 9600)
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static struct uart_ops ep93xx_pops = {
-+ .tx_empty = ep93xxuart_tx_empty,
-+ .set_mctrl = ep93xxuart_set_mctrl,
-+ .get_mctrl = ep93xxuart_get_mctrl,
-+ .stop_tx = ep93xxuart_stop_tx,
-+ .start_tx = ep93xxuart_start_tx,
-+ .stop_rx = ep93xxuart_stop_rx,
-+ .enable_ms = ep93xxuart_enable_ms,
-+ .break_ctl = ep93xxuart_break_ctl,
-+ .startup = ep93xxuart_startup,
-+ .shutdown = ep93xxuart_shutdown,
-+ .set_termios = ep93xxuart_set_termios,
-+ .type = ep93xxuart_type,
-+ .release_port = ep93xxuart_release_port,
-+ .request_port = ep93xxuart_request_port,
-+ .config_port = ep93xxuart_config_port,
-+ .verify_port = ep93xxuart_verify_port,
-+};
-+
-+static struct uart_port ep93xx_ports[UART_NR] = {
-+ {
-+ .membase = (void *)UART1_BASE,
-+ .mapbase = UART1_BASE,
-+ .iotype = UPIO_MEM,
-+ .irq = IRQ_UART1,
-+ .uartclk = EP93XX_UART_CLK,
-+ .fifosize = 16,
-+ .ops = &ep93xx_pops,
-+ .flags = UPF_BOOT_AUTOCONF,
-+ },
-+ {
-+ .membase = (void *)UART2_BASE,
-+ .mapbase = UART2_BASE,
-+ .iotype = UPIO_MEM,
-+ .irq = IRQ_UART2,
-+ .uartclk = EP93XX_UART_CLK,
-+ .fifosize = 16,
-+ .ops = &ep93xx_pops,
-+ .line = 1,
-+ .flags = UPF_BOOT_AUTOCONF,
-+ },
-+#if UART_NR > 2
-+ {
-+ .membase = (void *)UART3_BASE,
-+ .mapbase = UART3_BASE,
-+ .iotype = UPIO_MEM,
-+ .irq = IRQ_UART3,
-+ .uartclk = EP93XX_UART_CLK,
-+ .fifosize = 16,
-+ .ops = &ep93xx_pops,
-+ .line = 2,
-+ .flags = UPF_BOOT_AUTOCONF,
-+ }
-+#endif
-+};
-+
-+#ifdef CONFIG_SERIAL_EP93XX_CONSOLE
-+/*
-+ * Print a string to the serial port trying not to disturb
-+ * any possible real use of the port...
-+ *
-+ * The console_lock must be held when we get here.
-+ *
-+ * Note that this is called with interrupts already disabled
-+ */
-+static void
-+ep93xxuart_console_write(struct console *co, const char *s, unsigned int count)
-+{
-+ struct uart_port *port = ep93xx_ports + co->index;
-+ unsigned long cr, cr2, fr;
-+ int i;
-+
-+ /*
-+ * Ensure that the port is enabled.
-+ */
-+ cr = readl(UARTCR(port));
-+ cr2 = cr & ~(UARTCR_RIE | UARTCR_RTIE | UARTCR_TIE | UARTCR_MSIE);
-+ writel((cr2 | UARTCR_UARTE), UARTCR(port));
-+
-+ /*
-+ * Now, do each character
-+ */
-+ for (i = 0; i < count; i++) {
-+ do {
-+ fr = readl(UARTFR(port));
-+ } while (fr & UARTFR_TXFF);
-+ writel(s[i], UARTDR(port));
-+ if (s[i] == '\n') {
-+ do {
-+ fr = readl(UARTFR(port));
-+ } while (fr & UARTFR_TXFF);
-+ writel('\r', UARTDR(port));
-+ }
-+ }
-+
-+ /*
-+ * Finally, wait for transmitter to become empty
-+ * and restore the uart state.
-+ */
-+ do {
-+ fr = readl(UARTFR(port));
-+ } while ((fr & UARTFR_TXFE) == 0);
-+
-+ writel(cr, UARTCR(port));
-+}
-+
-+static void __init
-+ep93xxuart_console_get_options(struct uart_port *port, int *baud,
-+ int *parity, int *bits)
-+{
-+ if (readl(UARTCR(port)) & UARTCR_UARTE) {
-+ unsigned long lch, quot;
-+
-+ lch = readl(UARTLCH(port));
-+
-+ *parity = 'n';
-+ if (lch & UARTLCR_H_PEN) {
-+ if (lch & UARTLCR_H_EPS)
-+ *parity = 'e';
-+ else
-+ *parity = 'o';
-+ }
-+
-+ if ((lch & UARTLCR_H_WLEN) == UARTLCR_H_WLEN_7_DATA)
-+ *bits = 7;
-+ else
-+ *bits = 8;
-+
-+ quot =
-+ ((readl(UARTLCM(port)) & 0xff) << 8) | (readl(UARTLCL(port))
-+ & 0xff);
-+
-+ *baud = port->uartclk / (16 * (quot + 1));
-+ }
-+}
-+
-+static int __init ep93xxuart_console_setup(struct console *co, char *options)
-+{
-+ struct uart_port *port;
-+ int baud = 57600;
-+ int bits = 8;
-+ int parity = 'n';
-+ int flow = 'n';
-+
-+ /*
-+ * Check whether an invalid uart number has been specified, and
-+ * if so, search for the first available port that does have
-+ * console support.
-+ */
-+ port = uart_get_console(ep93xx_ports, UART_NR, co);
-+
-+ /*
-+ * Temporary fix.
-+ */
-+ spin_lock_init(&port->lock);
-+
-+ if (options)
-+ uart_parse_options(options, &baud, &parity, &bits, &flow);
-+ else
-+ ep93xxuart_console_get_options(port, &baud, &parity, &bits);
-+
-+ return uart_set_options(port, co, baud, parity, bits, flow);
-+}
-+
-+extern struct uart_driver ep93xx_reg;
-+static struct console ep93xx_console = {
-+ .name = "ttyAM",
-+ .write = ep93xxuart_console_write,
-+ .device = uart_console_device,
-+ .setup = ep93xxuart_console_setup,
-+ .flags = CON_PRINTBUFFER,
-+ .index = -1,
-+ .data = &ep93xx_reg,
-+};
-+
-+static int __init ep93xxuart_console_init(void)
-+{
-+ register_console(&ep93xx_console);
-+ return 0;
-+}
-+
-+console_initcall(ep93xxuart_console_init);
-+
-+#define EP93XX_CONSOLE &ep93xx_console
-+#else
-+#define EP93XX_CONSOLE NULL
-+#endif
-+
-+static struct uart_driver ep93xx_reg = {
-+ .driver_name = "ttyAM",
-+ .dev_name = "ttyAM",
-+ .major = SERIAL_EP93XX_MAJOR,
-+ .minor = SERIAL_EP93XX_MINOR,
-+ .nr = UART_NR,
-+ .cons = EP93XX_CONSOLE,
-+};
-+
-+static int ep93xxuart_probe(struct amba_device *dev, void *id)
-+{
-+ int i;
-+
-+ for (i = 0; i < UART_NR; i++) {
-+ if (ep93xx_ports[i].membase != (void *)dev->res.start)
-+ continue;
-+
-+ ep93xx_ports[i].dev = &dev->dev;
-+ uart_add_one_port(&ep93xx_reg, &ep93xx_ports[i]);
-+ amba_set_drvdata(dev, &ep93xx_ports[i]);
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+static int ep93xxuart_remove(struct amba_device *dev)
-+{
-+ struct uart_port *p = amba_get_drvdata(dev);
-+
-+ if (p)
-+ uart_remove_one_port(&ep93xx_reg, p);
-+
-+ amba_set_drvdata(dev, NULL);
-+
-+ return 0;
-+}
-+
-+static int ep93xxuart_suspend(struct amba_device *dev, pm_message_t msg)
-+{
-+ struct uart_port *p = amba_get_drvdata(dev);
-+
-+ if (p)
-+ uart_suspend_port(&ep93xx_reg, p);
-+
-+ return 0;
-+}
-+
-+static int ep93xxuart_resume(struct amba_device *dev)
-+{
-+ struct uart_port *p = amba_get_drvdata(dev);
-+
-+ if (p)
-+ uart_resume_port(&ep93xx_reg, p);
-+
-+ return 0;
-+}
-+
-+static struct amba_id ep93xxuart_ids[] __initdata = {
-+ { /* UART1 */
-+ .id = 0x808c0000,
-+ .mask = 0xffff0000,
-+ },
-+ { /* UART2 */
-+ .id = 0x808d0000,
-+ .mask = 0xffff0000,
-+ },
-+ { /* UART3 */
-+ .id = 0x808e0000,
-+ .mask = 0xffff0000,
-+ },
-+ {0, 0},
-+};
-+
-+static struct amba_driver ep93xxuart_driver = {
-+ .drv = {
-+ .name = "uart-ep93xx",
-+ },
-+ .id_table = ep93xxuart_ids,
-+ .probe = ep93xxuart_probe,
-+ .remove = ep93xxuart_remove,
-+ .suspend = ep93xxuart_suspend,
-+ .resume = ep93xxuart_resume,
-+};
-+
-+static int __init ep93xxuart_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "Serial: EP93xx driver $Revision: 1.42 $\n");
-+
-+ ret = uart_register_driver(&ep93xx_reg);
-+ if (ret == 0) {
-+ ret = amba_driver_register(&ep93xxuart_driver);
-+ if (ret)
-+ uart_unregister_driver(&ep93xx_reg);
-+ }
-+
-+ return ret;
-+}
-+
-+static void __exit ep93xxuart_exit(void)
-+{
-+ amba_driver_unregister(&ep93xxuart_driver);
-+ uart_unregister_driver(&ep93xx_reg);
-+}
-+
-+module_init(ep93xxuart_init);
-+module_exit(ep93xxuart_exit);
-+
-+MODULE_AUTHOR("Ray Lehtiniemi");
-+MODULE_DESCRIPTION("EP93XX generic serial driver $Revision: 1.42 $");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
-index 85dacc9..e57292f 100644
---- a/drivers/usb/Kconfig
-+++ b/drivers/usb/Kconfig
-@@ -22,6 +22,7 @@ config USB_ARCH_HAS_OHCI
- default y if ARCH_LH7A404
- default y if ARCH_S3C2410
- default y if PXA27x
-+ default y if ARCH_EP93XX
- # PPC:
- default y if STB03xxx
- default y if PPC_MPC52xx
-diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c
-new file mode 100644
-index 0000000..8aec2fb
---- /dev/null
-+++ b/drivers/usb/host/ohci-ep93xx.c
-@@ -0,0 +1,248 @@
-+/*
-+ * OHCI HCD (Host Controller Driver) for USB.
-+ *
-+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
-+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
-+ * (C) Copyright 2002 Hewlett-Packard Company
-+ * (C) Copyright 2004 Ray Lehtiniemi
-+ *
-+ * EP93XX Bus Glue
-+ *
-+ * Written by Ray Lehtiniemi <rayl@mail.com>
-+ * Based on SA-1111 glue.
-+ *
-+ * This file is licenced under the GPL.
-+ */
-+
-+#include <asm/hardware.h>
-+#include <asm/hardware/amba.h>
-+
-+#ifndef CONFIG_ARCH_EP93XX
-+#error "This file is EP93xx bus glue. CONFIG_ARCH_EP93XX must be defined."
-+#endif
-+
-+extern int usb_disabled(void);
-+
-+
-+/*-------------------------------------------------------------------------*/
-+
-+static void ep93xx_start_hc(struct amba_device *dev)
-+{
-+ unsigned int pwrcnt;
-+
-+ printk(KERN_DEBUG __FILE__ ": starting EP93xx OHCI USB Controller\n");
-+
-+ pwrcnt = readl(SYSCON_PWRCNT);
-+ pwrcnt |= SYSCON_PWRCNT_USHEN;
-+ writel(pwrcnt, SYSCON_PWRCNT);
-+}
-+
-+static void ep93xx_stop_hc(struct amba_device *dev)
-+{
-+ unsigned int pwrcnt;
-+
-+ printk(KERN_DEBUG __FILE__ ": stopping EP93xx OHCI USB Controller\n");
-+
-+ pwrcnt = readl(SYSCON_PWRCNT);
-+ pwrcnt &= ~SYSCON_PWRCNT_USHEN;
-+ writel(pwrcnt, SYSCON_PWRCNT);
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+
-+#if 0
-+static void dump_hci_status(struct usb_hcd *hcd, const char *label)
-+{
-+ unsigned long status = sa1111_readl(hcd->regs + SA1111_USB_STATUS);
-+
-+ dbg("%s USB_STATUS = { %s%s%s%s%s}", label,
-+ ((status & USB_STATUS_IRQHCIRMTWKUP) ? "IRQHCIRMTWKUP " : ""),
-+ ((status & USB_STATUS_IRQHCIBUFFACC) ? "IRQHCIBUFFACC " : ""),
-+ ((status & USB_STATUS_NIRQHCIM) ? "" : "IRQHCIM "),
-+ ((status & USB_STATUS_NHCIMFCLR) ? "" : "HCIMFCLR "),
-+ ((status & USB_STATUS_USBPWRSENSE) ? "USBPWRSENSE " : ""));
-+}
-+#endif
-+
-+/*-------------------------------------------------------------------------*/
-+
-+void usb_hcd_ep93xx_remove(struct usb_hcd *, struct amba_device *);
-+
-+/* configure so an HC device and id are always provided */
-+/* always called with process context; sleeping is OK */
-+
-+/**
-+ * usb_hcd_ep93xx_probe - initialize ep93xx HCD
-+ * Context: !in_interrupt()
-+ *
-+ * Allocates basic resources for this USB host controller, and
-+ * then invokes the start() method for the HCD associated with it
-+ * through the hotplug entry's driver_data.
-+ *
-+ * Store this function in the HCD's struct pci_driver as probe().
-+ */
-+int usb_hcd_ep93xx_probe(const struct hc_driver *driver,
-+ struct amba_device *dev)
-+{
-+ int retval;
-+ struct usb_hcd *hcd;
-+
-+ hcd = usb_create_hcd(driver, &dev->dev, "ep93xx");
-+
-+ if (!hcd)
-+ return -ENOMEM;
-+
-+ hcd->rsrc_start = dev->res.start;
-+ hcd->rsrc_len = dev->res.end - dev->res.start + 1;
-+
-+ hcd->regs = (void __iomem *)dev->res.start;
-+
-+ ep93xx_start_hc(dev);
-+ ohci_hcd_init(hcd_to_ohci(hcd));
-+
-+ retval = usb_add_hcd(hcd, dev->irq[0], SA_INTERRUPT);
-+ if (retval == 0)
-+ return retval;
-+
-+ ep93xx_stop_hc(dev);
-+
-+ usb_put_hcd(hcd);
-+ return retval;
-+}
-+
-+/* may be called without controller electrically present */
-+/* may be called with controller, bus, and devices active */
-+
-+/**
-+ * usb_hcd_ep93xx_remove - shutdown processing for SA-1111-based HCDs
-+ * @dev: USB Host Controller being removed
-+ * Context: !in_interrupt()
-+ *
-+ * Reverses the effect of usb_hcd_ep93xx_probe(), first invoking
-+ * the HCD's stop() method. It is always called from a thread
-+ * context, normally "rmmod", "apmd", or something similar.
-+ *
-+ */
-+void usb_hcd_ep93xx_remove(struct usb_hcd *hcd, struct amba_device *dev)
-+{
-+ usb_remove_hcd(hcd);
-+ ep93xx_stop_hc(dev);
-+ usb_put_hcd(hcd);
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+
-+static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd)
-+{
-+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-+ int ret;
-+
-+ ohci_dbg(ohci, "ohci_ep93xx_start, ohci:%p", ohci);
-+
-+ if ((ret = ohci_init(ohci)) < 0)
-+ return ret;
-+
-+ if ((ret = ohci_run(ohci)) < 0) {
-+ err("can't start %s", hcd->self.bus_name);
-+ ohci_stop(hcd);
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+
-+static const struct hc_driver ohci_ep93xx_hc_driver = {
-+ .description = hcd_name,
-+ .product_desc = "EP93xx OHCI",
-+ .hcd_priv_size = sizeof(struct ohci_hcd),
-+
-+ /*
-+ * generic hardware linkage
-+ */
-+ .irq = ohci_irq,
-+ .flags = HCD_USB11,
-+
-+ /*
-+ * basic lifecycle operations
-+ */
-+ .start = ohci_ep93xx_start,
-+#ifdef CONFIG_PM
-+ /* suspend: ohci_ep93xx_suspend, -- tbd */
-+ /* resume: ohci_ep93xx_resume, -- tbd */
-+#endif
-+ .stop = ohci_stop,
-+
-+ /*
-+ * managing i/o requests and associated device resources
-+ */
-+ .urb_enqueue = ohci_urb_enqueue,
-+ .urb_dequeue = ohci_urb_dequeue,
-+ .endpoint_disable = ohci_endpoint_disable,
-+
-+ /*
-+ * scheduling support
-+ */
-+ .get_frame_number = ohci_get_frame,
-+
-+ /*
-+ * root hub support
-+ */
-+ .hub_status_data = ohci_hub_status_data,
-+ .hub_control = ohci_hub_control,
-+};
-+
-+/*-------------------------------------------------------------------------*/
-+
-+static int ep93xxohci_probe(struct amba_device *dev, void *id)
-+{
-+ int ret = -ENODEV;
-+
-+ if (usb_disabled())
-+ return -ENODEV;
-+
-+ ret = usb_hcd_ep93xx_probe(&ohci_ep93xx_hc_driver, dev);
-+
-+ return ret;
-+}
-+
-+static int ep93xxohci_remove(struct amba_device *dev)
-+{
-+ struct usb_hcd *hcd = amba_get_drvdata(dev);
-+
-+ usb_hcd_ep93xx_remove(hcd, dev);
-+
-+ return 0;
-+}
-+
-+static struct amba_id ep93xxohci_ids[] __initdata = {
-+ {
-+ .id = 0x80020000,
-+ .mask = 0xffff0000,
-+ },
-+ {0, 0},
-+};
-+
-+static struct amba_driver ep93xxohci_driver = {
-+ .drv = {
-+ .name = "ohci-ep93xx",
-+ },
-+ .id_table = ep93xxohci_ids,
-+ .probe = ep93xxohci_probe,
-+ .remove = ep93xxohci_remove,
-+};
-+
-+static int __init ep93xxohci_init(void)
-+{
-+ printk(KERN_INFO "USB: EP93xx driver $Revision: 1.42 $\n");
-+ return amba_driver_register(&ep93xxohci_driver);
-+}
-+
-+static void __exit ep93xxohci_cleanup(void)
-+{
-+ amba_driver_unregister(&ep93xxohci_driver);
-+}
-+
-+module_init(ep93xxohci_init);
-+module_exit(ep93xxohci_cleanup);
-diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
-index bf1d9ab..bb525a2 100644
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -909,6 +909,10 @@ MODULE_LICENSE ("GPL");
- #include "ohci-pxa27x.c"
- #endif
-
-+#ifdef CONFIG_ARCH_EP93XX
-+#include "ohci-ep93xx.c"
-+#endif
-+
- #ifdef CONFIG_SOC_AU1X00
- #include "ohci-au1xxx.c"
- #endif
-@@ -923,6 +927,7 @@ MODULE_LICENSE ("GPL");
- || defined(CONFIG_ARCH_OMAP) \
- || defined (CONFIG_ARCH_LH7A404) \
- || defined (CONFIG_PXA27x) \
-+ || defined (CONFIG_ARCH_EP93XX) \
- || defined (CONFIG_SOC_AU1X00) \
- || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
- )
-diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index cc8e3bf..1d46ab0 100644
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -172,6 +172,122 @@ config FB_CLPS711X
- Say Y to enable the Framebuffer driver for the CLPS7111 and
- EP7212 processors.
-
-+config FB_CX25871_I2C
-+ tristate "Conexant CX25871 video encoder"
-+ depends on I2C && EXPERIMENTAL
-+ help
-+
-+ ! ! ! B R O K E N B R O K E N B R O K E N ! ! !
-+
-+ If you say yes here you get support for the Conexant CX25871
-+ video encoder. Currently only EP93xx CPUs use this for some
-+ NTSC setup. This setup should be done in ep93xxfb.c instead.
-+ It is currently hardcoded here in cx25871, which is wrong, as
-+ it will happen anytime instead of exactly when it is needed.
-+ I've got no NTSC hardware, and no time to test this either.
-+
-+ Why I've written it then? Well I had to get I2C working and it
-+ helped me on my way there.
-+
-+ If nobody cares about NTSC support for EP93xx it will go away soon!
-+
-+ Only say Y if you have such a chip and are prepared to fix the remaining
-+ stuff yourself.
-+
-+ See ep93xxfb.[ch] and cx25871.c for details.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called cx25871.
-+
-+config FB_EP93XX
-+ bool "EP93XX Framebuffer support"
-+ depends on FB && ARM && (ARCH_EP9312 || ARCH_EP9315)
-+ select FB_CFB_FILLRECT
-+ select FB_CFB_COPYAREA
-+ select FB_CFB_IMAGEBLIT
-+ help
-+ Say Y here if you want support for the on EP93XX framebuffer.
-+
-+ You can also say M here to compile this as a module. However this
-+ is not recommended as loading the module without a display can
-+ be a problem. (Make sure you can login without display before you
-+ say M or N here).
-+
-+ The module will be called ep93xxfb.
-+choice
-+ prompt "Display Type"
-+ depends on FB_EP93XX
-+ help
-+ Choose the kind of display you want to attach to the EP93XX framebuffer.
-+
-+config FB_CRT_EP93XX
-+ bool "CRT Display"
-+
-+config FB_LCD_EP93XX
-+ bool "LCD Display"
-+ help
-+ Support for the Philips 640x480 Display on the EDB93XX evaluation board.
-+
-+config FB_LCD_EP93XX_SHARP
-+ bool "LCD Display 320x200 SHARP"
-+ help
-+ Support for the Sharp LQ057Q3DC02 320x200 Color TFT LCD.
-+
-+config FB_LCD_EP93XX_SHARP_LQ64D343
-+ bool "LCD Display 640x480 SHARP"
-+ help
-+ Support for the Sharp LQ64D343 640x480 Color TFT LCD.
-+
-+config FB_CX25871
-+ bool "NTSC Display"
-+ select FB_CX25871_I2C
-+
-+config FB_LCD_TX09D50VM1CCA
-+ bool "LCD Display 240x320 Hitachi TX09D50VM1CCA"
-+ help
-+ Support for the Hitachi TX09D50VM1CCA 240x320 Color TFT LCD.
-+
-+endchoice
-+
-+choice
-+ prompt "Display Color Depth"
-+ depends on FB_EP93XX
-+ default FB_EP93XX_8BPP
-+ help
-+ Choose the default color depth for you EP93xx display. Note that using
-+ other than 8BPP depths tends to be slow.
-+
-+config FB_EP93XX_8BPP
-+ bool "8bpp"
-+ help
-+ Use 8 bits per pixel (256 color).
-+ Benefits: fastest available mode
-+ Drawback: few colors available (might do for console work, though)
-+
-+config FB_EP93XX_16BPP_565
-+ bool "16bpp_565"
-+ help
-+ Use 16 bits per pixel. Weighting red:green:blue is 5:6:5 bits.
-+ Make sure your Xserver / Framebuffer based applications use exactly this
-+ weighting.
-+
-+config FB_EP93XX_24BPP
-+ bool "24bpp"
-+ help
-+ Use 24 bits per pixel. Weighting red:green:blue is 8:8:8 bits. Say Y here
-+ if you want lots of colors and do not care that much about performance.
-+
-+
-+
-+config FB_EP93XX_32BPP
-+ bool "32bpp"
-+ help
-+ Use 32 bits per pixel. Weighting transparent:red:green:blue is 8:8:8:8 bits.
-+ Note that transparency is seldom implemented so this one is just slower and
-+ consumes more memory than 24BPP.
-+endchoice
-+
-+
- config FB_SA1100
- bool "SA-1100 LCD support"
- depends on (FB = y) && ARM && ARCH_SA1100
-diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index aa434e7..82f680b 100644
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -99,6 +99,8 @@ obj-$(CONFIG_FB_S3C2410) += s3c2410fb.
- obj-$(CONFIG_FB_VESA) += vesafb.o
- obj-$(CONFIG_FB_VGA16) += vga16fb.o vgastate.o
- obj-$(CONFIG_FB_OF) += offb.o
-+obj-$(CONFIG_FB_EP93XX) += ep93xxfb.o
-+obj-$(CONFIG_FB_CX25871_I2C) += cx25871.o
-
- # the test framebuffer is last
- obj-$(CONFIG_FB_VIRTUAL) += vfb.o
-diff --git a/drivers/video/cx25871.c b/drivers/video/cx25871.c
-new file mode 100644
-index 0000000..816cbef
---- /dev/null
-+++ b/drivers/video/cx25871.c
-@@ -0,0 +1,200 @@
-+/*
-+ cx25871.c
-+
-+ Driver for the Conexant CX25871 VIDEO ENCODER
-+
-+ based on: ds1621.c
-+
-+
-+
-+
-+ BIG FAT WARNING: THIS IS EXPERIMENTAL AND UNTESTED CODE
-+
-+
-+
-+
-+
-+
-+ 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/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/delay.h>
-+#include <linux/slab.h>
-+#include <linux/i2c.h>
-+#include <asm/io.h>
-+
-+/*
-+ * assign an invalid (local use) id for now
-+ * TODO: get an official one!
-+ */
-+#define I2C_DRIVERID_EP93XX 0xffff
-+
-+/* Addresses to scan */
-+static unsigned short normal_i2c[] = { 0x44, I2C_CLIENT_END };
-+static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
-+
-+I2C_CLIENT_INSMOD;
-+
-+static int cx25871_attach_adapter(struct i2c_adapter *adapter);
-+static int cx25871_detect(struct i2c_adapter *adapter, int address, int kind);
-+static void cx25871_init_client(struct i2c_client *client);
-+static int cx25871_detach_client(struct i2c_client *client);
-+
-+/* This is the driver that will be inserted */
-+static struct i2c_driver cx25871_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "cx25871",
-+ .id = I2C_DRIVERID_EP93XX,
-+ .flags = I2C_DF_NOTIFY,
-+ .attach_adapter = cx25871_attach_adapter,
-+ .detach_client = cx25871_detach_client,
-+};
-+
-+static int cx25871_id = 0;
-+
-+/* Cleanup and introduce cx25871 specific data, if necessary */
-+struct cx25871_data {
-+ struct i2c_client client;
-+ struct semaphore update_lock;
-+ char valid; /* !=0 if following fields are valid */
-+ unsigned long last_updated; /* In jiffies */
-+};
-+
-+static int cx25871_read_value(struct i2c_client *client, u8 reg)
-+{
-+ return i2c_smbus_read_byte_data(client, reg);
-+}
-+
-+static int cx25871_write_value(struct i2c_client *client, u8 reg, u16 value)
-+{
-+ return i2c_smbus_write_byte_data(client, reg, value);
-+}
-+
-+static void cx25871_init_client(struct i2c_client *client)
-+{
-+ /*FIXME: This should be done in ep93xxfb.c, shouldn't it? */
-+
-+ int _todo__fix_this_ugly_hack_;
-+
-+ cx25871_write_value(client, 0xB8, 0);
-+ mdelay(1000);
-+ /* After auto-configuration, setup pseudo-master mode BUT with EN_BLANKO bit cleared */
-+ cx25871_write_value(client, 0xBA,
-+ CX25871_REGxBA_SLAVER | CX25871_REGxBA_DACOFF);
-+ cx25871_write_value(client, 0xC6, (CX25871_REGxC6_INMODE_MASK & 0x3));
-+ cx25871_write_value(client, 0xC4, CX25871_REGxC4_EN_OUT);
-+ cx25871_write_value(client, 0x32, 0);
-+ cx25871_write_value(client, 0xBA, CX25871_REGxBA_SLAVER);
-+}
-+
-+static int cx25871_attach_adapter(struct i2c_adapter *adapter)
-+{
-+ printk("cx25871_attach_adapter\n");
-+ return i2c_probe(adapter, &addr_data, cx25871_detect);
-+}
-+
-+/* This function is called by i2c_detect */
-+int cx25871_detect(struct i2c_adapter *adapter, int address, int kind)
-+{
-+ struct i2c_client *new_client;
-+ struct cx25871_data *data;
-+ int err = 0;
-+
-+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
-+ | I2C_FUNC_SMBUS_WRITE_BYTE))
-+ goto exit;
-+
-+ /* OK. For now, we presume we have a valid client. We now create the
-+ client structure, even though we cannot fill it completely yet.
-+ But it allows us to access cx25871_{read,write}_value. */
-+ if (!(data = kmalloc(sizeof(struct cx25871_data), GFP_KERNEL))) {
-+ err = -ENOMEM;
-+ goto exit;
-+ }
-+ memset(data, 0, sizeof(struct cx25871_data));
-+
-+ new_client = &data->client;
-+ i2c_set_clientdata(new_client, data);
-+ new_client->addr = address;
-+ new_client->adapter = adapter;
-+ new_client->driver = &cx25871_driver;
-+ new_client->flags = 0;
-+
-+ /* Fill in remaining client fields and put it into the global list */
-+ strlcpy(new_client->name, "cx25871", I2C_NAME_SIZE);
-+
-+ new_client->id = cx25871_id++;
-+ data->valid = 0;
-+ init_MUTEX(&data->update_lock);
-+
-+ /* Tell the I2C layer a new client has arrived */
-+ if ((err = i2c_attach_client(new_client)))
-+ goto exit_free;
-+ /* Initialize the EP93XX chip */
-+ cx25871_init_client(new_client);
-+
-+/* Register sysfs hooks */
-+#if 0
-+ device_create_file(&new_client->dev, &dev_attr_alarms);
-+ device_create_file(&new_client->dev, &dev_attr_temp1_input);
-+ device_create_file(&new_client->dev, &dev_attr_temp1_min);
-+ device_create_file(&new_client->dev, &dev_attr_temp1_max);
-+#endif
-+ return 0;
-+
-+/* OK, this is not exactly good programming practice, usually. But it is
-+ very code-efficient in this case. */
-+ exit_free:
-+ kfree(data);
-+ exit:
-+ return err;
-+}
-+
-+static int cx25871_detach_client(struct i2c_client *client)
-+{
-+ int err;
-+
-+ if ((err = i2c_detach_client(client))) {
-+ dev_err(&client->dev, "Client deregistration failed, "
-+ "client not detached.\n");
-+ return err;
-+ }
-+
-+ kfree(i2c_get_clientdata(client));
-+
-+ return 0;
-+}
-+
-+static int __init cx25871_init(void)
-+{
-+ printk("cx25871_init\n");
-+ return i2c_add_driver(&cx25871_driver);
-+}
-+
-+static void __exit cx25871_exit(void)
-+{
-+ i2c_del_driver(&cx25871_driver);
-+}
-+
-+MODULE_DESCRIPTION("Conexant CX25871 video encoder");
-+MODULE_LICENSE("GPL");
-+
-+module_init(cx25871_init);
-+module_exit(cx25871_exit);
-diff --git a/drivers/video/ep93xxfb.c b/drivers/video/ep93xxfb.c
-new file mode 100644
-index 0000000..475943a
---- /dev/null
-+++ b/drivers/video/ep93xxfb.c
-@@ -0,0 +1,787 @@
-+/******************************************************************************
-+ *
-+ * File: linux/drivers/video/ep93xxfb.c
-+ *
-+ * Purpose: Framebuffer driver for EP9312/EP9315 evaluation board.
-+ *
-+ * based on:
-+ * skeletonfb.c
-+ * ep93xxfb.c from Linux 2.4.21-rmk1-cirrus-1-3-0
-+ *
-+ *******************************************************************************/
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/errno.h>
-+#include <linux/delay.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+#include <linux/mm.h>
-+#include <linux/tty.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/fb.h>
-+#include <linux/device.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/mach-types.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+
-+#include "ep93xxfb.h"
-+
-+/*
-+#define DEBUG
-+#define USE_PRINTASCII
-+*/
-+
-+#ifdef DEBUG
-+# if defined(CONFIG_DEBUG_LL) && defined(USE_PRINTASCII)
-+extern void printascii(const char *);
-+# define DPRINTK(fmt, args...) {char str[256];sprintf(str, "%s: " fmt, __FUNCTION__ , ## args);printascii(str);}
-+# else
-+# define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args)
-+# endif
-+#else
-+# define DPRINTK(fmt, args...)
-+#endif
-+
-+static struct fb_info info;
-+static struct fb_fix_screeninfo ep93xxfb_fix;
-+static struct fb_var_screeninfo ep93xxfb_var;
-+static struct ep93xxfb_par ep93xxfb_par;
-+static unsigned int pseudo_palette[MAX_PALETTE_NUM_ENTRIES];
-+
-+int __init ep93xxfb_init(void);
-+static int ep93xxfb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+ unsigned blue, unsigned transp,
-+ struct fb_info *info);
-+static int ep93xxfb_blank(int blank_mode, struct fb_info *info);
-+int __init ep93xxfb_init(void);
-+static void __exit ep93xxfb_cleanup(void);
-+int __init ep93xxfb_setup(char *options);
-+
-+static struct fb_ops ep93xxfb_ops = {
-+ .owner = THIS_MODULE,
-+ .fb_setcolreg = ep93xxfb_setcolreg,
-+ .fb_blank = ep93xxfb_blank,
-+ .fb_fillrect = cfb_fillrect,
-+ .fb_copyarea = cfb_copyarea,
-+ .fb_imageblit = cfb_imageblit,
-+};
-+
-+/*
-+ * ep93xxfb_palette_write:
-+ * Encode palette data to 24bit palette format.
-+ * Write palette data to the master palette and inactive hw palette
-+ * switch palettes. And handle asynchronous palette switches.
-+ */
-+static inline void
-+ep93xxfb_palette_write(u_int regno, u_int red, u_int green,
-+ u_int blue, u_int trans)
-+{
-+ unsigned int cont, i, pal;
-+
-+ /* Only supports color LUT, not gray LUT
-+ *
-+ * TBD if not in 4 or 8bpp, then does LUT logic operate?
-+ * TBD or do we need to do nothing here?
-+ *
-+ * LCD: TBD RGB mapping may match spec p193.
-+ *
-+ * CRT: LUT RGB mapping is really R/G/B from high to low bits
-+ * because really determined by wiring to video DAC.
-+ * (disregard spec p 193 showing color LUT B/G/R order)
-+ * Here are the details:
-+ *
-+ * Shift mode 1 directs LUT bits 7-2 onto P5-P0,
-+ * LUT bits 15-10 onto P11-P6, and LUT bits 23-16
-+ * onto P17-P12.
-+ *
-+ * Board wired P17-12 to video DAC Red inputs,
-+ * P11-P6 wired to video DAC Green inputs, and
-+ * P5-P0 wired to video DAC Blue inputs.
-+ */
-+ pal = ((red & 0xFF00) << 8) | (green & 0xFF00) | ((blue & 0xFF00) >> 8);
-+
-+ pseudo_palette[regno] = pal;
-+
-+ /* Two cases here:
-+ * 1. If LUT switch is pending, then write inactive LUT and when
-+ * switch happens, this new palette entry will be active.
-+ * Race condition here between LUT switch and this write is okay
-+ * since we fix it below.
-+ *
-+ * 2. If LUT switch is not pending, then write here is incomplete
-+ * and whole palette will be written below.
-+ */
-+
-+ writel(pal, COLOR_LUT + (regno << 2));
-+
-+ cont = readl(LUTCONT);
-+
-+ if ((cont & LUTCONT_STAT && cont & LUTCONT_RAM1) ||
-+ (!(cont & LUTCONT_STAT) && !(cont & LUTCONT_RAM1))) {
-+ /* LUT switch is no longer pending
-+ *
-+ * We do not know if write to LUT above really went
-+ * to currently active LUT. So need to make sure that
-+ * data gets into inactive LUT and switch LUTs.
-+ *
-+ * But currently inactive LUT may be out of date
-+ * in more entries than just last write.
-+ * Need to update currently inactive LUT for all writes
-+ * which went to currently active LUT.
-+ * Fully update the LUT now, which is a simpler policy
-+ * than trying to track writes and do partial update of LUT.
-+ * (Worstcase impact: we update palette every frame)
-+ */
-+
-+ for (i = 0; i < 256; i++) // Update inactive LUT
-+ {
-+ writel(pseudo_palette[i],
-+ (COLOR_LUT + (i << 2)));
-+ }
-+ /* Switch active LUTs next frame */
-+ writel(cont ^ LUTCONT_RAM1, LUTCONT);
-+ }
-+}
-+
-+/**
-+ * xxxfb_setcolreg - Optional function. Sets a color register.
-+ * @regno: Which register in the CLUT we are programming
-+ * @red: The red value which can be up to 16 bits wide
-+ * @green: The green value which can be up to 16 bits wide
-+ * @blue: The blue value which can be up to 16 bits wide.
-+ * @transp: If supported the alpha value which can be up to 16 bits wide.
-+ * @info: frame buffer info structure
-+ *
-+ * Set a single color register. The values supplied have a 16 bit
-+ * magnitude which needs to be scaled in this function for the hardware.
-+ * Things to take into consideration are how many color registers, if
-+ * any, are supported with the current color visual. With truecolor mode
-+ * no color palettes are supported. Here a psuedo palette is created
-+ * which we store the value in pseudo_palette in struct fb_info. For
-+ * pseudocolor mode we have a limited color palette. To deal with this
-+ * we can program what color is displayed for a particular pixel value.
-+ * DirectColor is similar in that we can program each color field. If
-+ * we have a static colormap we don't need to implement this function.
-+ *
-+ * Returns negative errno on error, or zero on success.
-+ */
-+static int
-+ep93xxfb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
-+ unsigned transp, struct fb_info *info)
-+{
-+ if (regno >= MAX_PALETTE_NUM_ENTRIES) /* no. of hw registers */
-+ return 1;
-+ /*
-+ * Program hardware... do anything you want with transp
-+ */
-+
-+ /* grayscale works only partially under directcolor */
-+ if (info->var.grayscale) {
-+ /* grayscale = 0.30*R + 0.59*G + 0.11*B */
-+ red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
-+ }
-+
-+ /* Directcolor:
-+ * var->{color}.offset contains start of bitfield
-+ * var->{color}.length contains length of bitfield
-+ * {hardwarespecific} contains width of DAC
-+ * cmap[X] is programmed to (X << red.offset) | (X << green.offset) | (X << blue.offset)
-+ * RAMDAC[X] is programmed to (red, green, blue)
-+ *
-+ * Pseudocolor:
-+ * uses offset = 0 && length = DAC register width.
-+ * var->{color}.offset is 0
-+ * var->{color}.length contains widht of DAC
-+ * cmap is not used
-+ * DAC[X] is programmed to (red, green, blue)
-+ * Truecolor:
-+ * does not use RAMDAC (usually has 3 of them).
-+ * var->{color}.offset contains start of bitfield
-+ * var->{color}.length contains length of bitfield
-+ * cmap is programmed to (red << red.offset) | (green << green.offset) |
-+ * (blue << blue.offset) | (transp << transp.offset)
-+ * RAMDAC does not exist
-+ */
-+#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
-+
-+ switch (info->fix.visual) {
-+ case FB_VISUAL_PSEUDOCOLOR:
-+ /* Feed the dual 256x24 hardware LUT */
-+ ep93xxfb_palette_write(regno, red, green, blue, transp);
-+ break;
-+ case FB_VISUAL_TRUECOLOR:
-+ /* Truecolor has hardware independent palette */
-+ if (regno >= 16)
-+ return 1;
-+
-+ red = CNVT_TOHW(red, info->var.red.length);
-+ green = CNVT_TOHW(green, info->var.green.length);
-+ blue = CNVT_TOHW(blue, info->var.blue.length);
-+ transp = CNVT_TOHW(transp, info->var.transp.length);
-+ ((u32 *) (info->pseudo_palette))[regno] =
-+ (red << info->var.red.offset) |
-+ (green << info->var.green.offset) |
-+ (blue << info->var.blue.offset) |
-+ (transp << info->var.transp.offset);
-+ break;
-+ case FB_VISUAL_DIRECTCOLOR:
-+ /* example here assumes 8 bit DAC. Might be different
-+ * for your hardware */
-+ red = CNVT_TOHW(red, 8);
-+ green = CNVT_TOHW(green, 8);
-+ blue = CNVT_TOHW(blue, 8);
-+ /* hey, there is bug in transp handling... */
-+ transp = CNVT_TOHW(transp, 8);
-+ break;
-+ }
-+#undef CNVT_TOHW
-+
-+ return 0;
-+}
-+
-+/**
-+ * xxxfb_blank - NOT a required function. Blanks the display.
-+ * @blank_mode: the blank mode we want.
-+ * @info: frame buffer structure that represents a single frame buffer
-+ *
-+ * Blank the screen if blank_mode != 0, else unblank. Return 0 if
-+ * blanking succeeded, != 0 if un-/blanking failed due to e.g. a
-+ * video mode which doesn't support it. Implements VESA suspend
-+ * and powerdown modes on hardware that supports disabling hsync/vsync:
-+ * blank_mode == 2: suspend vsync
-+ * blank_mode == 3: suspend hsync
-+ * blank_mode == 4: powerdown
-+ *
-+ * Returns negative errno on error, or zero on success.
-+ *
-+ */
-+static int ep93xxfb_blank(int blank_mode, struct fb_info *info)
-+{
-+#ifdef CONFIG_MACH_ADSSPHERE
-+ void adssphere_blank(int blank_mode);
-+
-+ adssphere_blank(blank_mode);
-+#endif
-+
-+ return 1;
-+}
-+
-+static struct device ep93xxfb_device = {
-+ .bus_id = "ep93xxfb",
-+ .coherent_dma_mask = 0xffffffff,
-+};
-+
-+/*
-+ * ep9312fb_map_video_memory():
-+ * Allocates the DRAM memory for the frame buffer. This buffer is
-+ * remapped into a non-cached, non-buffered, memory region to
-+ * allow palette and pixel writes to occur without flushing the
-+ * cache. Once this area is remapped, all virtual memory
-+ * access to the video memory should occur at the new region.
-+ */
-+static int
-+__init ep9312fb_map_video_memory(void)
-+{
-+ dma_addr_t handle;
-+
-+ ep93xxfb_par.dev = &ep93xxfb_device;
-+
-+ ep93xxfb_par.v_screen_base = dma_alloc_writecombine(ep93xxfb_par.dev,
-+ FB_MAPPED_MEM_SIZE,
-+ &handle,
-+ GFP_KERNEL);
-+
-+ if (ep93xxfb_par.v_screen_base == NULL) {
-+ printk(KERN_ERR "ep93xxfb: unable to allocate screen memory\n");
-+ return -ENOMEM;
-+ }
-+
-+ info.screen_base = ep93xxfb_par.v_screen_base;
-+ info.fix.smem_start = (unsigned int)ep93xxfb_par.p_screen_base = handle;
-+ info.fix.smem_len = FB_MAPPED_MEM_SIZE;
-+
-+ return 0;
-+}
-+
-+static int ep93xxfb_probe_configuration(void)
-+{
-+ int xres, yres, bpp, pixelmode, total;
-+ unsigned char lookup_bpp[] = {-1, -1, 8, -1, 16, -1, 24, 32};
-+
-+ pixelmode = readl(PIXELMODE);
-+
-+ bpp = lookup_bpp[PIXELMODE_P_MASK & pixelmode];
-+
-+ if (bpp < 0) return 0;
-+
-+ yres = readl(SCRNLINES);
-+
-+ if (yres == 0) return 0;
-+
-+ xres = (32 * readl(VLINESTEP)) / bpp;
-+
-+ if (xres == 0) return 0;
-+
-+ info.node = -1;
-+ info.flags = FBINFO_FLAG_DEFAULT;
-+
-+ info.fix = ep93xxfb_fix;
-+ info.var = ep93xxfb_var;
-+ info.fbops = &ep93xxfb_ops;
-+ info.pseudo_palette = pseudo_palette;
-+
-+ info.monspecs = monspecs;
-+
-+ strcpy(info.fix.id, "Cirrus EP93xx");
-+ info.fix.type = FB_TYPE_PACKED_PIXELS;
-+ info.fix.xpanstep = 0;
-+ info.fix.ypanstep = 0;
-+ info.fix.ywrapstep = 0;
-+ info.fix.accel = FB_ACCEL_NONE;
-+
-+ info.var.xres = xres;
-+ info.var.yres = yres;
-+ info.var.xres_virtual = xres;
-+ info.var.yres_virtual = yres;
-+ info.var.bits_per_pixel = bpp;
-+ info.var.activate = FB_ACTIVATE_NOW;
-+ info.var.height = -1;
-+ info.var.width = -1;
-+
-+ switch (bpp) {
-+ case 8:
-+ info.var.red.length = 8;
-+ info.var.green.length = 8;
-+ info.var.blue.length = 8;
-+
-+ info.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ ep93xxfb_par.bits_per_pixel = 8;
-+ break;
-+ case 16:
-+ info.var.red.length = 5;
-+ info.var.green.length = 6;
-+ info.var.blue.length = 5;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 11;
-+ info.var.green.offset = 5;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+ info.pseudo_palette = ep93xxfb_par.palette;
-+
-+ ep93xxfb_par.bits_per_pixel = 16;
-+ break;
-+ case 24:
-+ info.var.red.length = 8;
-+ info.var.blue.length = 8;
-+ info.var.green.length = 8;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 16;
-+ info.var.green.offset = 8;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ ep93xxfb_par.bits_per_pixel = 24;
-+ break;
-+ case 32:
-+ info.var.red.length = 8;
-+ info.var.blue.length = 8;
-+ info.var.green.length = 8;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 16;
-+ info.var.green.offset = 8;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ ep93xxfb_par.bits_per_pixel = 32;
-+ break;
-+ }
-+
-+ total = readl(HCLKSTOTAL);
-+ info.var.hsync_len = (0x7ff & readl(HSYNCSTRTSTOP)) - ((0x07ff0000 & readl(HSYNCSTRTSTOP)) >> 16);
-+ info.var.right_margin = ((0x07ff0000 & readl(HSYNCSTRTSTOP)) >> 16) - (0x7ff & readl(HACTIVESTRTSTOP));
-+ info.var.left_margin = total - info.var.hsync_len - info.var.right_margin - xres + 1;
-+
-+ total = readl(VLINESTOTAL);
-+ info.var.vsync_len = (0x7ff & readl(VSYNCSTRTSTOP)) - ((0x07ff0000 & readl(VSYNCSTRTSTOP)) >> 16);
-+ info.var.upper_margin = total - (0x7ff & readl(VSYNCSTRTSTOP));
-+ info.var.lower_margin = ((0x07ff0000 & readl(VSYNCSTRTSTOP)) >> 16) - yres + 1;
-+
-+ info.var.sync = 0;
-+
-+ info.var.vmode = FB_VMODE_NONINTERLACED;
-+
-+ info.fix.line_length = info.var.xres_virtual * info.var.bits_per_pixel / 8; // stride in bytes
-+
-+ info.par = &TimingValues[NULL_MODE];
-+
-+ ep93xxfb_par.screen_size = FB_MAX_MEM_SIZE;
-+ ep93xxfb_par.palette_size = MAX_PALETTE_NUM_ENTRIES;
-+ ep93xxfb_par.montype = 1; //TBD why not 0 since single entry?
-+ ep93xxfb_par.currcon = 0; //TBD is this right?
-+
-+ return 1;
-+}
-+
-+static void
-+__init ep93xxfb_init_fbinfo(void)
-+{
-+ info.node = -1;
-+ info.flags = FBINFO_FLAG_DEFAULT;
-+
-+ info.fix = ep93xxfb_fix;
-+ info.var = ep93xxfb_var;
-+ info.fbops = &ep93xxfb_ops;
-+ info.pseudo_palette = pseudo_palette;
-+ info.par = &ep93xxfb_par;
-+
-+ info.monspecs = monspecs;
-+
-+ strcpy(info.fix.id, "Cirrus EP93xx");
-+ info.fix.type = FB_TYPE_PACKED_PIXELS;
-+ info.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ info.fix.xpanstep = 0;
-+ info.fix.ypanstep = 0;
-+ info.fix.ywrapstep = 0;
-+ info.fix.accel = FB_ACCEL_NONE;
-+
-+ info.var.xres = TimingValues[DEFAULT_MODE].HRes;
-+ info.var.yres = TimingValues[DEFAULT_MODE].VRes;
-+ info.var.xres_virtual = TimingValues[DEFAULT_MODE].HRes;
-+ info.var.yres_virtual = TimingValues[DEFAULT_MODE].VRes;
-+ info.var.bits_per_pixel = 32;
-+ info.var.red.length = 8;
-+ info.var.green.length = 8;
-+ info.var.blue.length = 8;
-+ info.var.activate = FB_ACTIVATE_NOW;
-+ info.var.height = -1;
-+ info.var.width = -1;
-+ info.var.vmode = FB_VMODE_NONINTERLACED;
-+
-+ /*
-+ * setup initial parameters
-+ */
-+ info.var.xres = TimingValues[DEFAULT_MODE].HRes;
-+ info.var.yres = TimingValues[DEFAULT_MODE].VRes;
-+
-+#ifdef CONFIG_FB_EP93XX_8BPP
-+ DPRINTK("Default framebuffer is 8bpp.");
-+ info.var.bits_per_pixel = 8;
-+
-+ info.var.red.length = 8;
-+ info.var.green.length = 8;
-+ info.var.blue.length = 8;
-+
-+ info.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ ep93xxfb_par.bits_per_pixel = 8;
-+#endif /* CONFIG_FB_EP93XX_8BPP */
-+#ifdef CONFIG_FB_EP93XX_16BPP_565
-+ DPRINTK("Default framebuffer is 16bpp 565.");
-+ info.var.bits_per_pixel = 16;
-+
-+ info.var.red.length = 5;
-+ info.var.green.length = 6;
-+ info.var.blue.length = 5;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 11;
-+ info.var.green.offset = 5;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+ info.pseudo_palette = ep93xxfb_par.palette;
-+
-+ ep93xxfb_par.bits_per_pixel = 16;
-+#endif /* CONFIG_FB_EP93XX_16BPP */
-+#ifdef CONFIG_FB_EP93XX_24BPP
-+ DPRINTK("Default framebuffer is 24bpp.");
-+ info.var.bits_per_pixel = 24;
-+
-+ info.var.red.length = 8;
-+ info.var.blue.length = 8;
-+ info.var.green.length = 8;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 16;
-+ info.var.green.offset = 8;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ ep93xxfb_par.bits_per_pixel = 24;
-+#endif /* CONFIG_FB_EP93XX_24BPP */
-+#ifdef CONFIG_FB_EP93XX_32BPP
-+ DPRINTK("Default framebuffer is 32bpp.");
-+ info.var.bits_per_pixel = 32;
-+
-+ info.var.red.length = 8;
-+ info.var.blue.length = 8;
-+ info.var.green.length = 8;
-+ info.var.transp.length = 0;
-+ info.var.red.offset = 16;
-+ info.var.green.offset = 8;
-+ info.var.blue.offset = 0;
-+ info.var.transp.offset = 0;
-+ info.fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ ep93xxfb_par.bits_per_pixel = 32;
-+#endif /* CONFIG_FB_EP93XX_32BPP */
-+
-+ info.var.activate = FB_ACTIVATE_NOW;
-+ info.var.height = -1; /*TBD unknown */
-+ info.var.width = -1; /*TBD unknown */
-+
-+ info.var.left_margin = TimingValues[DEFAULT_MODE].HFrontPorch;
-+ info.var.right_margin = TimingValues[DEFAULT_MODE].HBackPorch;
-+ info.var.upper_margin = TimingValues[DEFAULT_MODE].VFrontPorch;
-+ info.var.lower_margin = TimingValues[DEFAULT_MODE].VBackPorch;
-+ info.var.hsync_len = TimingValues[DEFAULT_MODE].HSyncWidth;
-+ info.var.vsync_len = TimingValues[DEFAULT_MODE].VSyncWidth;
-+ info.var.sync = 0;
-+ info.var.vmode = FB_VMODE_NONINTERLACED;
-+
-+ info.fix.line_length = info.var.xres_virtual * info.var.bits_per_pixel / 8; /* stride in bytes */
-+
-+ info.par = &TimingValues[DEFAULT_MODE];
-+
-+ ep93xxfb_par.screen_size = FB_MAX_MEM_SIZE;
-+ ep93xxfb_par.palette_size = MAX_PALETTE_NUM_ENTRIES;
-+ ep93xxfb_par.montype = 1; /*TBD why not 0 since single entry? */
-+ ep93xxfb_par.currcon = 0; /*TBD is this right? */
-+}
-+
-+static int
-+ep93xxfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
-+{
-+ u_long flags, ulVIDEOATTRIBS;
-+ unsigned int total, uiDevCfg, uiBMAR;
-+#ifdef CONFIG_FB_LCD_EP93XX
-+ unsigned int uiPADDR, uiPADR;
-+#endif
-+ struct DisplayTimingValues *pTimingValues;
-+
-+ switch (var->bits_per_pixel) {
-+ case 4:
-+ ep93xxfb_par.visual = FB_VISUAL_PSEUDOCOLOR;
-+ ep93xxfb_par.palette_size = 16;
-+ break;
-+ case 8:
-+ ep93xxfb_par.visual = FB_VISUAL_PSEUDOCOLOR;
-+ ep93xxfb_par.palette_size = 256;
-+ break;
-+ case 16:
-+ ep93xxfb_par.visual = FB_VISUAL_TRUECOLOR;
-+ ep93xxfb_par.palette_size = 16;
-+ break;
-+ case 24:
-+ ep93xxfb_par.visual = FB_VISUAL_TRUECOLOR;
-+ ep93xxfb_par.palette_size = 16;
-+ break;
-+ case 32:
-+ ep93xxfb_par.visual = FB_VISUAL_TRUECOLOR;
-+ ep93xxfb_par.palette_size = 16;
-+ break;
-+ default:
-+ printk("ERROR! Bad bpp %d\n", var->bits_per_pixel);
-+ return -EINVAL;
-+ }
-+
-+ if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_TEST)
-+ return 0;
-+ else if (((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) &&
-+ ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NXTOPEN))
-+ return -EINVAL;
-+
-+ pTimingValues = (struct DisplayTimingValues *)info->par;
-+
-+ /* Disable interrupts and save status */
-+ local_irq_save(flags);
-+
-+ printk("Configuring %dx%dx%dbpp\n", var->xres, var->yres,
-+ var->bits_per_pixel);
-+
-+ /* Disable the video and outputs while changing the video mode. */
-+ writel(0, VIDEOATTRIBS);
-+ if (pTimingValues->RasterConfigure) {
-+ pTimingValues->RasterConfigure((struct DisplayTimingValues *)info->par); /*pTimingValues); */
-+ } else {
-+ total = var->vsync_len + var->upper_margin + var->yres +
-+ var->lower_margin - 1;
-+
-+ RasterSetLocked(VLINESTOTAL, total);
-+
-+ RasterSetLocked(VSYNCSTRTSTOP, total - var->lower_margin +
-+ ((total -
-+ (var->lower_margin + var->vsync_len)) << 16));
-+
-+ RasterSetLocked(VACTIVESTRTSTOP, var->yres + (total << 16));
-+
-+ /* Reverse start/stop since N_VBLANK output
-+ * unblanked same as active
-+ */
-+ RasterSetLocked(VBLANKSTRTSTOP, var->yres + (total << 16));
-+
-+ RasterSetLocked(VCLKSTRTSTOP, total + (total << 16));
-+
-+ /* Now configure the Horizontal timings. */
-+ total = var->hsync_len + var->left_margin + var->xres +
-+ var->right_margin - 1;
-+
-+ RasterSetLocked(HCLKSTOTAL, total);
-+
-+ RasterSetLocked(HSYNCSTRTSTOP, total +
-+ ((total - var->hsync_len) << 16));
-+
-+ RasterSetLocked(HACTIVESTRTSTOP, total - var->hsync_len -
-+ var->left_margin +
-+ ((var->right_margin - 1) << 16));
-+
-+ RasterSetLocked(HBLANKSTRTSTOP, total - var->hsync_len -
-+ var->left_margin +
-+ ((var->right_margin - 1) << 16));
-+
-+ RasterSetLocked(HCLKSTRTSTOP, total + (total << 16));
-+
-+ RasterSetLocked(LINECARRY, 0);
-+
-+ RasterSetLocked(VIDEOATTRIBS,
-+ VIDEOATTRIBS_PCLKEN | VIDEOATTRIBS_SYNCEN |
-+ VIDEOATTRIBS_DATAEN);
-+ }
-+
-+ /* Configure the Frame Buffer size. */
-+ writel((unsigned int)ep93xxfb_par.p_screen_base, VIDSCRNPAGE);
-+ writel(var->yres, SCRNLINES);
-+
-+ /* Set up the Line size. */
-+ total = var->xres * var->bits_per_pixel / 32;
-+ writel((total - 1), LINELENGTH);
-+ writel(total, VLINESTEP);
-+
-+ switch (var->bits_per_pixel) {
-+ case 8:
-+ writel((0x8 | PIXELMODE_P_8BPP | PIXELMODE_C_LUT), PIXELMODE);
-+ break;
-+ case 16:
-+ writel(0x8 | PIXELMODE_P_16BPP |
-+ ((PIXELMODE_C_565) << (PIXELMODE_C_SHIFT)), PIXELMODE);
-+ break;
-+ case 24:
-+ writel(0x8 | PIXELMODE_P_24BPP |
-+ ((PIXELMODE_C_888) << (PIXELMODE_C_SHIFT)), PIXELMODE);
-+ break;
-+ case 32:
-+ writel(0x8 | PIXELMODE_P_32BPP |
-+ ((PIXELMODE_C_888) << (PIXELMODE_C_SHIFT)), PIXELMODE);
-+ break;
-+ default:
-+ printk("ERROR! Bad bpp %d\n", var->bits_per_pixel);
-+ return -EINVAL;
-+ }
-+
-+ uiDevCfg = readl(SYSCON_DEVCFG);
-+ SysconSetLocked(SYSCON_DEVCFG,
-+ ep93xx_SYSCON_DEVCFG(uiDevCfg | SYSCON_DEVCFG_RasOnP3));
-+
-+ if (pTimingValues->VDiv)
-+ SysconSetLocked(SYSCON_VIDDIV, pTimingValues->VDiv);
-+
-+ uiBMAR = readl(SYSCON_BMAR);
-+ writel((uiBMAR | 1), SYSCON_BMAR);
-+
-+ ulVIDEOATTRIBS = readl(VIDEOATTRIBS);
-+ RasterSetLocked(VIDEOATTRIBS, ulVIDEOATTRIBS | VIDEOATTRIBS_EN |
-+#if (defined(CONFIG_MACH_ZEFEERDZG) || defined(CONFIG_MACH_ZEFEERDZN) || defined(CONFIG_MACH_ZEFEERDZQ))
-+ (1 << VIDEOATTRIBS_SDSEL_SHIFT));
-+#else
-+ (3 << VIDEOATTRIBS_SDSEL_SHIFT));
-+#endif
-+
-+
-+#ifdef CONFIG_FB_LCD_EP93XX
-+ uiPADDR = readl(GPIO_PADDR) | 0x2;
-+ writel(uiPADDR, GPIO_PADDR);
-+
-+ uiPADR = readl(GPIO_PADR) | 0x2;
-+ writel(uiPADR, GPIO_PADR);
-+#endif
-+
-+ local_irq_restore(flags);
-+ return 0;
-+}
-+
-+int __init ep93xxfb_init(void)
-+{
-+ char *option = NULL;
-+ DPRINTK("ep93xxfb_init(void)\n");
-+
-+ /*
-+ * For kernel boot options (in 'video=xxxfb:<options>' format)
-+ */
-+
-+ fb_get_options("ep93xxfb", &option);
-+ ep93xxfb_setup(option);
-+
-+ /* init all the important stuff in info */
-+ if (!ep93xxfb_probe_configuration())
-+ ep93xxfb_init_fbinfo();
-+
-+ /* Allocate and map framebuffer memory in system DRAM */
-+ if (ep9312fb_map_video_memory() != 0)
-+ return -ENOMEM;
-+
-+ /* This has to been done !!! */
-+ fb_alloc_cmap(&info.cmap, MAX_PALETTE_NUM_ENTRIES, 0);
-+
-+ /* hard code, since we don't support modedb & friends yet */
-+ ep93xxfb_set_var(&info.var, -1, &info);
-+
-+ if (register_framebuffer(&info) < 0)
-+ return -EINVAL;
-+
-+ ep93xxfb_blank(FB_BLANK_UNBLANK, &info);
-+
-+ printk(KERN_INFO "fb%d: %s frame buffer device\n", info.node,
-+ info.fix.id);
-+
-+ printk(KERN_INFO
-+ "ep93xxfb: framebuffer at 0x%lx, mapped to 0x%p, size %dk\n",
-+ info.fix.smem_start, info.screen_base, info.fix.smem_len / 1024);
-+ printk(KERN_INFO
-+ "ep93xxfb: mode is %dx%dx%d, linelength=%d, pages=%d\n",
-+ ep93xxfb_var.xres, ep93xxfb_var.yres,
-+ ep93xxfb_var.bits_per_pixel, info.fix.line_length,
-+ screen_info.pages);
-+
-+ return 0;
-+}
-+
-+static void __exit ep93xxfb_cleanup(void)
-+{
-+ DPRINTK("ep93xxfb_cleanup(void)\n");
-+ unregister_framebuffer(&info);
-+}
-+
-+int __init ep93xxfb_setup(char *options)
-+{
-+ DPRINTK("ep93xxfb_setup(char *options=\"%s\")\n", options);
-+ /* TODO: Parse user speficied options (`video=ep93xxfb:') */
-+ return 0;
-+}
-+
-+module_init(ep93xxfb_init);
-+module_exit(ep93xxfb_cleanup);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michael Burian");
-diff --git a/drivers/video/ep93xxfb.h b/drivers/video/ep93xxfb.h
-new file mode 100644
-index 0000000..dec4857
---- /dev/null
-+++ b/drivers/video/ep93xxfb.h
-@@ -0,0 +1,287 @@
-+/*
-+ * ep93xxfb.h Cirrus Logic EP93xx Framebuffer header
-+ */
-+
-+/*
-+ * TODO:
-+ * Still lot's of messy stuff here that belongs elsewhere.
-+ *
-+ * I'd say that each display / display family get an own header file
-+ * maybe even the whole ep93xx stuff should get an own directory, just like ati
-+ * It also could not hurt to test the NTSC stuff, which already was split into cx25871.c
-+ * but not tested to work so far.
-+ *
-+ * Display initialisation should become human readable, it should be changed
-+ * to reflect what's going on in hardware.
-+ *
-+ * This means we should say which PLL, prescaler, divider, ... is used instead
-+ * of just saying VDIV = 0x0000c207, same goes for all the other hardcoded values.
-+ *
-+ * How will we handle higher clocked EP93xx once they are available?
-+ *
-+ */
-+
-+#define RasterSetLocked(registername,value) \
-+ { \
-+ writel( 0xAA, REALITI_SWLOCK ); \
-+ writel( value, registername); \
-+ }
-+
-+static void InitializeCX25871For640x480NTSC(void);
-+
-+struct ep93xxfb_par {
-+ struct device *dev;
-+ dma_addr_t p_screen_base;
-+ unsigned char *v_screen_base;
-+ unsigned long screen_size;
-+ unsigned int palette_size;
-+ unsigned int xres;
-+ unsigned int yres;
-+ unsigned int bits_per_pixel;
-+ signed int montype;
-+ unsigned int currcon;
-+ unsigned int visual;
-+ u16 palette[16]; /* Funky 16 table lookup used by "optional" Parameter. */
-+};
-+
-+#define MAX_PALETTE_NUM_ENTRIES 256
-+#define MAX_CRT_XRES 640
-+#define MAX_CRT_YRES 480
-+#define MAX_BPP 32
-+#define FB_MAX_MEM_SIZE ((MAX_CRT_XRES * MAX_CRT_YRES * MAX_BPP)/8)
-+#define FB_MAPPED_MEM_SIZE (PAGE_ALIGN(FB_MAX_MEM_SIZE + PAGE_SIZE))
-+
-+#define EP93XX_NAME "EP93XX"
-+#define NR_MONTYPES 1
-+
-+/* Fake monspecs to fill in fbinfo structure */
-+static struct fb_monspecs monspecs __initdata = {
-+ {30000, 70000, 50, 65, 0} /* Generic */
-+};
-+
-+#if defined (CONFIG_FB_LCD_EP93XX)
-+#define DEFAULT_MODE 1
-+#elif defined (CONFIG_FB_LCD_EP93XX_SHARP_LQ64D343)
-+#define DEFAULT_MODE 2
-+#elif defined (CONFIG_FB_CX25871)
-+#define DEFAULT_MODE 3
-+#elif defined (CONFIG_FB_CRT_EP93XX)
-+#define DEFAULT_MODE 0
-+#elif defined (CONFIG_FB_LCD_EP93XX_SHARP)
-+#define DEFAULT_MODE 5
-+#define CONFIG_FB_LCD_EP93XX 1 /*hack!!! FIXME: put whole display support into different files */
-+#elif defined (CONFIG_FB_LCD_TX09D50VM1CCA)
-+#define DEFAULT_MODE 6
-+#else
-+#error What Display Setting was that!!!
-+#endif
-+
-+struct DisplayTimingValues {
-+ const char *Name;
-+ unsigned long DisplayID;
-+ int (*RasterConfigure) (struct DisplayTimingValues * pTimingValues);
-+ unsigned short Refresh;
-+ unsigned long VDiv;
-+
-+ unsigned short HRes;
-+ unsigned short HFrontPorch;
-+ unsigned short HBackPorch;
-+ unsigned short HSyncWidth;
-+ unsigned short HTotalClocks;
-+
-+ unsigned short VRes;
-+ unsigned short VFrontPorch;
-+ unsigned short VBackPorch;
-+ unsigned short VSyncWidth;
-+ unsigned short VTotalClocks;
-+};
-+
-+typedef int (*fRasterConfigure) (struct DisplayTimingValues *);
-+
-+enum DisplayType {
-+ CRT_GENERIC,
-+ Philips_LB064V02A1,
-+ CX25871,
-+ Sharp
-+};
-+
-+static int Conexant_CX25871(struct DisplayTimingValues *pTimingValues);
-+static int NecLCD(struct DisplayTimingValues *pTimingValues);
-+
-+#define TIMING_VALUES(NAME, DISPID, FUNC, REFRESH, VDIV, \
-+ HRES, HFP, HBP, HSYNC, VRES, VFP, VBP, VSYNC) \
-+{ \
-+ Name:NAME, \
-+ DISPID, FUNC, REFRESH, VDIV, \
-+ HRES, HFP, HBP, HSYNC, (HRES + HFP + HBP + HSYNC), \
-+ VRES, VFP, VBP, VSYNC, (VRES + VFP + VBP + VSYNC) \
-+}
-+
-+/* TODO:
-+ *
-+ * This is a big, confusing mess right now.
-+ * We really should see if we can do it like Documentation/fb/modedb.txt
-+ * suggests.
-+ *
-+ * Fix it, probably by moving this into ep93xx_modes.c or something like that
-+ */
-+
-+static struct DisplayTimingValues TimingValues[] = {
-+ /* 640x480 Progressive Scan */
-+ TIMING_VALUES("CRT_GENERIC", CRT_GENERIC,
-+ (fRasterConfigure) NULL,
-+ 60, 0x0000c108, 640, 16, 48, 96, 480, 11, 31, 2),
-+ /* 640x480 Progressive Scan Philips LB064V02A1 on EDB9312 Board. */
-+
-+ /* Display can handle clocks from 22MHz(VDIV=0xc107)-28Mhz(VDIV=0xc106) */
-+ TIMING_VALUES("Philips LB064V02A1", Philips_LB064V02A1,
-+ 0,
-+ 68, 0x0000c106, 640, 16, 48, 96, 480, 11, 31, 2),
-+ /*fast refresh rate (26.7MHz) */
-+ /*68, 0x0000c106, 640, 16, 48, 96, 480, 11, 31, 2), */
-+ /*original setting (slowest refresh) (22.8MHz) */
-+ /*68, 0x0000c107, 640, 16, 48, 96, 480, 11, 31, 2), */
-+
-+ /* Sharp LQ64D343 LCD Panel */
-+ TIMING_VALUES("Sharp LQ64d343", CRT_GENERIC,
-+ (fRasterConfigure) NULL,
-+ 60, 0x0000c205, 640, 32, 32, 96, 480, 34, 34, 4),
-+ /* NEC LCD Panel */
-+ TIMING_VALUES("NEC", CRT_GENERIC,
-+ NecLCD,
-+ 60, 0x0000c204, 640, 32, 32, 96, 480, 34, 34, 4),
-+ /* 640x480 NTSC Support for Conexant CX25871 */
-+ TIMING_VALUES("Conexant CX25871", CX25871,
-+ Conexant_CX25871,
-+ 60, 0x0000c317, 640, 0, 0, 0, 480, 0, 0, 0),
-+ /* 320x240 Sharp LCD Panel */
-+ TIMING_VALUES("Sharp LQ057Q3DC02", CRT_GENERIC,
-+ (fRasterConfigure) NULL,
-+ 0, 0x0000c108, 320, 32, 32, 96, 240, 3, 3, 4),
-+ /*
-+ 240x320 Hitachi
-+
-+ Max pixel clock freq = 1/83ns ~= 12.048 MHz (VDiv = 0x0000c10a)
-+ Typ pixel clock freq = 5.33 MHz (VDiv = 0x0000c125)
-+ */
-+ TIMING_VALUES("Hitachi TX09D50VM1CCA", CRT_GENERIC,
-+ (fRasterConfigure)NULL,
-+ 0, 0x0000c125, 240, 16/*HFP*/, 12/*HBP*/, 5/*HSYNC*/, 320, 3/*VFP*/, 3/*VBP*/, 1/*VSYNC*/),
-+ /* NULL */
-+ TIMING_VALUES("Unknown", CRT_GENERIC,
-+ (fRasterConfigure) NULL,
-+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
-+
-+};
-+
-+#define NUM_TIMING_VALUES (sizeof(TimingValues)/sizeof(struct DisplayTimingValues))
-+
-+#define NULL_MODE (NUM_TIMING_VALUES-1)
-+
-+#define EE_DELAY_USEC 100
-+#define EE_READ_TIMEOUT 100
-+#define CX25871_DEV_ADDRESS 0x88
-+#define CX25871_REGx32_AUTO_CHK 0x80
-+#define CX25871_REGx32_DRVS_MASK 0x60
-+#define CX25871_REGx32_DRVS_SHIFT 5
-+#define CX25871_REGx32_SETUP_HOLD 0x10
-+#define CX25871_REGx32_INMODE_ 0x08
-+#define CX25871_REGx32_DATDLY_RE 0x04
-+#define CX25871_REGx32_OFFSET_RGB 0x02
-+#define CX25871_REGx32_CSC_SEL 0x01
-+
-+/* Register 0xBA */
-+#define CX25871_REGxBA_SRESET 0x80
-+#define CX25871_REGxBA_CHECK_STAT 0x40
-+#define CX25871_REGxBA_SLAVER 0x20
-+#define CX25871_REGxBA_DACOFF 0x10
-+#define CX25871_REGxBA_DACDISD 0x08
-+#define CX25871_REGxBA_DACDISC 0x04
-+#define CX25871_REGxBA_DACDISB 0x02
-+#define CX25871_REGxBA_DACDISA 0x01
-+
-+/* Register 0xC4 */
-+#define CX25871_REGxC4_ESTATUS_MASK 0xC0
-+#define CX25871_REGxC4_ESTATUS_SHIFT 6
-+#define CX25871_REGxC4_ECCF2 0x20
-+#define CX25871_REGxC4_ECCF1 0x10
-+#define CX25871_REGxC4_ECCGATE 0x08
-+#define CX25871_REGxC4_ECBAR 0x04
-+#define CX25871_REGxC4_DCHROMA 0x02
-+#define CX25871_REGxC4_EN_OUT 0x01
-+
-+/* Register 0xC6 */
-+#define CX25871_REGxC6_EN_BLANKO 0x80
-+#define CX25871_REGxC6_EN_DOT 0x40
-+#define CX25871_REGxC6_FIELDI 0x20
-+#define CX25871_REGxC6_VSYNCI 0x10
-+#define CX25871_REGxC6_HSYNCI 0x08
-+#define CX25871_REGxC6_INMODE_MASK 0x07
-+#define CX25871_REGxC6_INMODE_SHIFT 0
-+
-+#define GPIOG_EEDAT 2
-+#define GPIOG_EECLK 1
-+
-+static int Conexant_CX25871(struct DisplayTimingValues *pTimingValues)
-+{
-+ unsigned int uiTemp;
-+ InitializeCX25871For640x480NTSC();
-+
-+ RasterSetLocked(VIDEOATTRIBS, 0);
-+ uiTemp = readl(SYSCON_DEVCFG);
-+ SysconSetLocked(SYSCON_DEVCFG, (uiTemp | SYSCON_DEVCFG_EXVC));
-+
-+ RasterSetLocked(VLINESTOTAL, 0x0257);
-+ RasterSetLocked(VSYNCSTRTSTOP, 0x01FF022C); /* was 024c */
-+ RasterSetLocked(VBLANKSTRTSTOP, 0x000001E0);
-+ RasterSetLocked(VACTIVESTRTSTOP, 0x000001E0);
-+ RasterSetLocked(VCLKSTRTSTOP, 0x07FF01E0);
-+
-+ RasterSetLocked(HCLKSTOTAL, 0x30F);
-+ RasterSetLocked(HSYNCSTRTSTOP, 0x02c0030F);
-+ RasterSetLocked(HBLANKSTRTSTOP, 0x00000280);
-+ RasterSetLocked(HACTIVESTRTSTOP, 0x00000280);
-+ RasterSetLocked(HCLKSTRTSTOP, 0x07ff0280);
-+
-+ RasterSetLocked(LINECARRY, 0);
-+
-+ RasterSetLocked(VIDEOATTRIBS,
-+ VIDEOATTRIBS_DATAEN | VIDEOATTRIBS_SYNCEN);
-+
-+ return 0;
-+}
-+
-+static int NecLCD(struct DisplayTimingValues *pTimingValues)
-+{
-+ RasterSetLocked(VIDEOATTRIBS, 0);
-+
-+ RasterSetLocked(VLINESTOTAL, 0x020c);
-+ RasterSetLocked(VSYNCSTRTSTOP, 0x01fe0200); /* was 024c */
-+ RasterSetLocked(VBLANKSTRTSTOP, 0x0000000);
-+ RasterSetLocked(VACTIVESTRTSTOP, 0x020c01df);
-+ RasterSetLocked(VCLKSTRTSTOP, 0x020c020c);
-+
-+ RasterSetLocked(HCLKSTOTAL, 0x323);
-+ RasterSetLocked(HSYNCSTRTSTOP, 0x02c00321);
-+ RasterSetLocked(HBLANKSTRTSTOP, 0x00000);
-+ RasterSetLocked(HACTIVESTRTSTOP, 0x00100290);
-+ RasterSetLocked(HCLKSTRTSTOP, 0x03230323);
-+
-+ RasterSetLocked(LINECARRY, 0);
-+
-+ RasterSetLocked(VIDEOATTRIBS, VIDEOATTRIBS_INVCLK |
-+ VIDEOATTRIBS_PCLKEN | VIDEOATTRIBS_SYNCEN |
-+ VIDEOATTRIBS_DATAEN);
-+
-+ return 0;
-+}
-+
-+void InitializeCX25871For640x480NTSC(void)
-+{
-+/*
-+ * If you need this see cx25871.[ch] and grep for "should be done".
-+ * see if you can find a suitable and less messy way to do i2c stuff
-+ * also see our patch against 2.6.11.7-ep93xx
-+ */
-+ printk("ERROR: InitializeCX25871For640x480NTSC unimplemented!\n");
-+}
-diff --git a/include/asm-arm/arch-ep93xx/adssphere.h b/include/asm-arm/arch-ep93xx/adssphere.h
-new file mode 100644
-index 0000000..97874c1
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/adssphere.h
-@@ -0,0 +1,55 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/adssphere.h
-+ *
-+ * Copyright (C) 2005 Robert Whaley <rwhaley@applieddata.net>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef ASM_ARCH_ADSSPHERE_H
-+#define ASM_ARCH_ADSSPHERE_H
-+
-+#define ADSSPHERE_BASE_VIRT 0xe2000000
-+#define ADSSPHERE_BASE_PHYS 0xf0000000
-+
-+#define ADSSPHERE_CR0 (ADSSPHERE_BASE_VIRT+0x00)
-+#define ADSSPHERE_CR1 (ADSSPHERE_BASE_VIRT+0x04)
-+#define ADSSPHERE_SR (ADSSPHERE_BASE_VIRT+0x08)
-+#define ADSSPHERE_CAN_ADDR (ADSSPHERE_BASE_VIRT+0x0c)
-+#define ADSSPHERE_CAN_DATA (ADSSPHERE_BASE_VIRT+0x10)
-+#define ADSSPHERE_FW_FW_NUM (ADSSPHERE_BASE_VIRT+0x14)
-+#define ADSSPHERE_FW_FW_REV (ADSSPHERE_BASE_VIRT+0x18)
-+#define ADSSPHERE_FW_BD_REV (ADSSPHERE_BASE_VIRT+0x1c)
-+
-+#define ADSSPHERE_CR0_CF_33 0x01
-+#define ADSSPHERE_CR0_CF_50 0x02
-+#define ADSSPHERE_CR0_COMEN 0x04
-+#define ADSSPHERE_CR0_IRDA 0x08
-+#define ADSSPHERE_CR0_USB 0x10
-+#define ADSSPHERE_CR0_PWSAV 0x20
-+
-+#define ADSSPHERE_CR1_PNL_ON 0x01
-+#define ADSSPHERE_CR1_PNL_EN 0x04
-+#define ADSSPHERE_CR1_BL_ON 0x08
-+#define ADSSPHERE_CR1_AMP_ON 0x10
-+#define ADSSPHERE_CR1_CDC_ON 0x20
-+#define ADSSPHERE_CR1_BTL_ON 0x40
-+
-+#define ADSSPHERE_SR1_SW0 0x01
-+#define ADSSPHERE_SR1_SW1 0x02
-+#define ADSSPHERE_SR1_SW2 0x04
-+#define ADSSPHERE_SR1_SW3 0x08
-+#define ADSSPHERE_SR1_HP 0x10
-+
-+#endif /* ASM_ARCH_ADSSPHERE_H */
-diff --git a/include/asm-arm/arch-ep93xx/clocks.h b/include/asm-arm/arch-ep93xx/clocks.h
-new file mode 100644
-index 0000000..acc8023
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/clocks.h
-@@ -0,0 +1,160 @@
-+/*
-+ *
-+ * Filename: clocks.h
-+ *
-+ * Description: Header file for the clocks.
-+ *
-+ * Copyright(c) Cirrus Logic Corporation 2003, All Rights Reserved
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License 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>
-+#ifndef _H_CLOCKS
-+#define _H_CLOCKS
-+
-+/*
-+ * How this file works:
-+ * Choose your FCLOCK value this causes FDIV, HDIV, PDIV values to be set
-+ *
-+ * The Real FDIV, HDIV, and PDIV are set according to the following table.
-+ * Processor runs at (PLL1 speed/PLL Divide specified by FDIV)
-+ * AHB runs at (PLL1 speed/PLL Divide specified by HDIV)
-+ * APB runs at AHB/(2^PDIV)
-+ * ------------------------------------------------------------------
-+ * HDIV PLL Divide FDIV PLL Divide
-+ * 0 1 0 1
-+ * 1 2 1 2
-+ * 2 4 2 4
-+ * 3 5 3 8
-+ * 4 6 4 16
-+ * 5 8
-+ * 6 16
-+ * 7 32
-+ *
-+ */
-+
-+/* there is some confusion here about MACH vs. ARCH. clean it up
-+ once we get a nice clock management system going */
-+#ifdef CONFIG_ARCH_EP9301
-+#define FCLOCK 166
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+#ifdef CONFIG_MACH_EDB9302
-+#define FCLOCK 200
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+#if defined(CONFIG_MACH_EDB9312) || defined(CONFIG_MACH_EDB9315) || defined(CONFIG_MACH_ADSSPHERE)
-+#define FCLOCK 200
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+#if defined(CONFIG_MACH_DMA03)
-+#define FCLOCK 200
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+#ifdef CONFIG_MACH_ACC
-+#define EP93XX_UART_CLK 24576000
-+#endif
-+
-+#if defined(CONFIG_MACH_ZEFEERDZA)
-+#define FCLOCK 166
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+#if defined(CONFIG_MACH_ZEFEERDZB) || defined(CONFIG_MACH_ZEFEERDZG) || \
-+ defined(CONFIG_MACH_ZEFEERDZN) || defined(CONFIG_MACH_ZEFEERDZQ)
-+#define FCLOCK 200
-+#define EP93XX_UART_CLK 14745600
-+#endif
-+
-+/*
-+ * PLL1 Clock =442 Mhz
-+ *
-+ * FClock = 221 Mhz
-+ * HCLock = 73 Mhz
-+ * PClock = 46 Mhz
-+ */
-+#if (FCLOCK == 221)
-+#define FDIV 1
-+#define HDIV 5
-+#define PDIV 1
-+#define PRE_CLKSET1_VALUE 0x0080b3b6
-+#define PLL1_CLOCK 442368000
-+#endif /* (FCLOCK == 221) */
-+
-+/*
-+ * PLL1 Clock =400 Mhz
-+ *
-+ * FClock = 200 Mhz
-+ * HCLock = 100 Mhz
-+ * PClock = 50 Mhz
-+ *
-+ */
-+#if (FCLOCK == 200)
-+#define FDIV 1
-+#define HDIV 2
-+#define PDIV 1
-+#define PRE_CLKSET1_VALUE 0x0080a3d7
-+#define PLL1_CLOCK 399974400
-+#endif /* (FCLOCK == 200) */
-+
-+/*
-+ * PLL1 Clock =368 Mhz
-+ *
-+ * FClock = 184 Mhz
-+ * HCLock = 73 Mhz
-+ * PClock = 46 Mhz
-+ *
-+ */
-+#if (FCLOCK == 183)
-+#define FDIV 1
-+#define HDIV 4
-+#define PDIV 1
-+#define PRE_CLKSET1_VALUE 0x0080ab15
-+#define PLL1_CLOCK 368640000
-+#endif /* (FCLOCK == 183) */
-+
-+/*
-+ * PLL1 Clock =332 Mhz
-+ *
-+ * FClock = 166 Mhz
-+ * HCLock = 66 Mhz
-+ * PClock = 33 Mhz
-+ *
-+ */
-+#if (FCLOCK == 166)
-+#define FDIV 1
-+#define HDIV 3
-+#define PDIV 1
-+#define PRE_CLKSET1_VALUE 0x0080fa5a
-+#define PLL1_CLOCK 332049067
-+#endif /* (FCLOCK == 166) */
-+
-+#define CLKSET1_VALUE ( PRE_CLKSET1_VALUE | \
-+ ( PDIV << SYSCON_CLKSET1_PCLK_DIV_SHIFT ) | \
-+ ( HDIV << SYSCON_CLKSET1_HCLK_DIV_SHIFT ) | \
-+ ( FDIV << SYSCON_CLKSET1_FCLK_DIV_SHIFT ) )
-+
-+/*
-+ * Value for the PLL 2 register.
-+ */
-+#define CLKSET2_VALUE 0x300dc317
-+#define PLL2_CLOCK 192000000
-+
-+#endif /* _H_CLOCKS */
-diff --git a/include/asm-arm/arch-ep93xx/crunch.h b/include/asm-arm/arch-ep93xx/crunch.h
-new file mode 100644
-index 0000000..db9fb2e
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/crunch.h
-@@ -0,0 +1,48 @@
-+#ifndef __asm_crunch_h__
-+#define __asm_crunch_h__
-+
-+#define CRUNCH_INIT 0x00900000
-+#define CRUNCH_IRQ 58
-+
-+#ifndef __ASSEMBLY__
-+
-+/* enable the MaverickCrunch clock */
-+static inline void crunch_enable(void)
-+{
-+ int tmp, aa = 0xAA;
-+ int *lock = (int *)0xe09300c0;
-+ int *syscfg = (int *)0xe0930080;
-+
-+ asm volatile ("str %3, [%1]\n\t"
-+ "ldr %0, [%2]\n\t"
-+ "orr %0, %0, #(1 << 23)\n\t"
-+ "str %0, [%2]":"=r" (tmp)
-+ :"r"(lock), "r"(syscfg), "r"(aa)
-+ :"memory");
-+}
-+
-+/* disable the MaverickCrunch clock */
-+static inline void crunch_disable(void)
-+{
-+ int tmp, aa = 0xAA;
-+ int *lock = (int *)0xe09300c0;
-+ int *syscfg = (int *)0xe0930080;
-+
-+ asm volatile ("str %3, [%1]\n\t"
-+ "ldr %0, [%2]\n\t"
-+ "bic %0, %0, #(1 << 23)\n\t"
-+ "str %0, [%2]":"=r" (tmp)
-+ :"r"(lock), "r"(syscfg), "r"(aa)
-+ :"memory");
-+}
-+
-+unsigned int read_dspsc_low(void);
-+unsigned int read_dspsc_high(void);
-+void write_dspsc(unsigned int);
-+void save_fpu(struct task_struct *);
-+void restore_fpu(struct task_struct *);
-+int setup_crunch(void);
-+void crunch_init(void);
-+#endif
-+
-+#endif /* __asm_crunch_h__ */
-diff --git a/include/asm-arm/arch-ep93xx/cx25871.h b/include/asm-arm/arch-ep93xx/cx25871.h
-new file mode 100644
-index 0000000..9d68ed9
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/cx25871.h
-@@ -0,0 +1,69 @@
-+/*
-+ * Filename: cx25871.h
-+ *
-+ * Description: Regisister Definitions and function prototypes for
-+ * CX25871 NTSC/PAL encoder.
-+ *
-+ * Copyright(c) Cirrus Logic Corporation 2003, All Rights Reserved
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef _H_CX25871
-+#define _H_CX25871
-+
-+/* CS25871 Device Address. */
-+#define CX25871_DEV_ADDRESS 0x88
-+
-+/* Register 0x32 */
-+#define CX25871_REGx32_AUTO_CHK 0x80
-+#define CX25871_REGx32_DRVS_MASK 0x60
-+#define CX25871_REGx32_DRVS_SHIFT 5
-+#define CX25871_REGx32_SETUP_HOLD 0x10
-+#define CX25871_REGx32_INMODE_ 0x08
-+#define CX25871_REGx32_DATDLY_RE 0x04
-+#define CX25871_REGx32_OFFSET_RGB 0x02
-+#define CX25871_REGx32_CSC_SEL 0x01
-+
-+/* Register 0xBA */
-+#define CX25871_REGxBA_SRESET 0x80
-+#define CX25871_REGxBA_CHECK_STAT 0x40
-+#define CX25871_REGxBA_SLAVER 0x20
-+#define CX25871_REGxBA_DACOFF 0x10
-+#define CX25871_REGxBA_DACDISD 0x08
-+#define CX25871_REGxBA_DACDISC 0x04
-+#define CX25871_REGxBA_DACDISB 0x02
-+#define CX25871_REGxBA_DACDISA 0x01
-+
-+/* Register 0xC4 */
-+#define CX25871_REGxC4_ESTATUS_MASK 0xC0
-+#define CX25871_REGxC4_ESTATUS_SHIFT 6
-+#define CX25871_REGxC4_ECCF2 0x20
-+#define CX25871_REGxC4_ECCF1 0x10
-+#define CX25871_REGxC4_ECCGATE 0x08
-+#define CX25871_REGxC4_ECBAR 0x04
-+#define CX25871_REGxC4_DCHROMA 0x02
-+#define CX25871_REGxC4_EN_OUT 0x01
-+
-+/* Register 0xC6 */
-+#define CX25871_REGxC6_EN_BLANKO 0x80
-+#define CX25871_REGxC6_EN_DOT 0x40
-+#define CX25871_REGxC6_FIELDI 0x20
-+#define CX25871_REGxC6_VSYNCI 0x10
-+#define CX25871_REGxC6_HSYNCI 0x08
-+#define CX25871_REGxC6_INMODE_MASK 0x07
-+#define CX25871_REGxC6_INMODE_SHIFT 0
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/debug-macro.S b/include/asm-arm/arch-ep93xx/debug-macro.S
-new file mode 100644
-index 0000000..3d97614
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/debug-macro.S
-@@ -0,0 +1,56 @@
-+/* linux/include/asm-arm/arch-ep93xx/debug-macro.S
-+ *
-+ * Debugging macro include header
-+ *
-+ * Copyright (C) 1994-1999 Russell King
-+ * Moved from linux/arch/arm/kernel/debug.S by Ray Lehtiniemi
-+ *
-+ * 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.
-+ *
-+*/
-+
-+ .macro addruart,rx
-+ mrc p15, 0, \rx, c1, c0
-+ tst \rx, #1 @ MMU enabled?
-+ ldreq \rx, =IO_BASE_PHYS @ System peripherals (phys address)
-+ ldrne \rx, =IO_BASE_VIRT @ System peripherals (virt address)
-+ orr \rx,\rx,#0x008c0000 @ Advance to UART1Base
-+
-+ @ We probe for the active serial port here.
-+ @ We assume r1 can be clobbered.
-+
-+ @ see if UART1 is active
-+ ldr r1, [\rx, #0x14] @UART1Ctrl
-+ tst r1, #1
-+
-+ @ if UART1 is inactive advance to UART2
-+ addeq \rx, \rx, #0x00010000
-+ ldreq r1, [\rx, #0x14] @UART2Ctrl
-+ tsteq r1, #1
-+
-+ @ if UART2 is inactive advance to UART3
-+ addeq \rx, \rx, #0x00010000
-+ ldreq r1, [\rx, #0x14] @UART3Ctrl
-+ tsteq r1, #1
-+
-+ @ if all ports are inactive, then there is nothing we can do
-+ moveq pc, lr
-+ .endm
-+
-+ .macro senduart,rd,rx
-+ strb \rd, [\rx] @ UARTxData
-+ .endm
-+
-+ .macro waituart,rd,rx
-+1001: ldr \rd, [\rx, #0x18] @ UARTxFlag
-+ tst \rd, #0x20 @ TXFF = 0 when ok to transmit
-+ bne 1001b
-+ .endm
-+
-+ .macro busyuart,rd,rx
-+1001: ldr \rd, [\rx, #0x18] @ UARTxFlag
-+ tst \rd, #0x08 @ BUSY = 1 while transmitting
-+ bne 1001b
-+ .endm
-diff --git a/include/asm-arm/arch-ep93xx/dma.h b/include/asm-arm/arch-ep93xx/dma.h
-new file mode 100644
-index 0000000..d3b6493
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/dma.h
-@@ -0,0 +1,233 @@
-+/*****************************************************************************
-+ * linux/include/asm-arm/arch-ep93xx/dma.h
-+ *
-+ * Copyright (C) 2003 Cirrus Logic
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ ****************************************************************************/
-+#ifndef __ASM_ARCH_DMA_H
-+#define __ASM_ARCH_DMA_H
-+
-+#define MAX_DMA_ADDRESS 0xffffffff
-+
-+/*
-+ * Not using the regular generic DMA interface for ep93xx.
-+ */
-+#define MAX_DMA_CHANNELS 0
-+
-+/*
-+ * The ep93xx dma controller has 5 memory to peripheral (TX) channels, 5
-+ * peripheral to memory (RX) channels and 2 memory to memory channels.
-+ */
-+#define MAX_EP93XX_DMA_M2P_CHANNELS 10
-+#define MAX_EP93XX_DMA_M2M_CHANNELS 2
-+
-+/*
-+ * The generic arm linux api does not support the ep93xx dma model, therefore
-+ * we use a set of dma support functions written specifically for this dma
-+ * controller.
-+ */
-+#define MAX_EP93XX_DMA_CHANNELS (MAX_EP93XX_DMA_M2P_CHANNELS + MAX_EP93XX_DMA_M2M_CHANNELS)
-+
-+/*****************************************************************************
-+ *
-+ * Max DMA buffer size
-+ *
-+ ****************************************************************************/
-+#define DMA_MAX_BUFFER_BYTES 0xFFFF
-+
-+/*****************************************************************************
-+ *
-+ * typedefs
-+ *
-+ ****************************************************************************/
-+
-+/*****************************************************************************
-+ *
-+ * All devices which can use a DMA channel
-+ *
-+ * NOTE: There exist two types of DMA channels, those that transfer
-+ * between an internal peripheral and memory (M2P/P2M), and
-+ * those that transfer between an external peripheral and memory (M2M).
-+ * This becomes a bit confusing when you take into account the fact
-+ * that the M2M channels can also transfer between two specific
-+ * internal peripherals and memory.
-+ * The first 20 enumerated devices use the first type of channel (M2P/
-+ * P2M). The last six enumerations are specific to the M2M channels.
-+ *
-+ ****************************************************************************/
-+typedef enum {
-+ /*
-+ * Hardware device options for the 10 M2P/P2M DMA channels.
-+ */
-+ DMATx_I2S1 = 0x00000000, /* TX peripheral ports can be allocated an */
-+ DMATx_I2S2 = 0x00000001, /* even numbered DMA channel. */
-+ DMATx_AAC1 = 0x00000002,
-+ DMATx_AAC2 = 0x00000003,
-+ DMATx_AAC3 = 0x00000004,
-+ DMATx_I2S3 = 0x00000005,
-+ DMATx_UART1 = 0x00000006,
-+ DMATx_UART2 = 0x00000007,
-+ DMATx_UART3 = 0x00000008,
-+ DMATx_IRDA = 0x00000009,
-+ DMARx_I2S1 = 0x0000000A, /* RX perhipheral ports can be allocated an */
-+ DMARx_I2S2 = 0x0000000B, /* odd numbered DMA channel. */
-+ DMARx_AAC1 = 0x0000000C,
-+ DMARx_AAC2 = 0x0000000D,
-+ DMARx_AAC3 = 0x0000000E,
-+ DMARx_I2S3 = 0x0000000F,
-+ DMARx_UART1 = 0x00000010,
-+ DMARx_UART2 = 0x00000011,
-+ DMARx_UART3 = 0x00000012,
-+ DMARx_IRDA = 0x00000013,
-+
-+ /*
-+ * Device options for the 2 M2M DMA channels
-+ */
-+ DMA_MEMORY = 0x00000014,
-+ DMA_IDE = 0x00000015,
-+ DMARx_SSP = 0x00000016,
-+ DMATx_SSP = 0x00000017,
-+ DMATx_EXT_DREQ = 0x00000018,
-+ DMARx_EXT_DREQ = 0x00000019,
-+ UNDEF = 0x0000001A
-+} ep93xx_dma_dev_t;
-+
-+/*****************************************************************************
-+ *
-+ * Enumerated type used as a parameter for a callback function.
-+ * Indicates the type of interrupt.
-+ *
-+ ****************************************************************************/
-+typedef enum {
-+ /*
-+ * Common interrupts
-+ */
-+ STALL,
-+ NFB,
-+
-+ /*
-+ * Specific to M2P channels
-+ */
-+ CHERROR,
-+
-+ /*
-+ * Specific to M2M channels
-+ */
-+ DONE,
-+ UNDEF_INT
-+} ep93xx_dma_int_t;
-+
-+/*****************************************************************************
-+ *
-+ * Init flag bit defintions for M2P/P2M flags.
-+ *
-+ ****************************************************************************/
-+
-+/*
-+ * Channel error interrupt enable.
-+ */
-+#define CHANNEL_ERROR_INT_ENABLE 0x00000001
-+/*
-+ * Determines how the channel state machine behaves in the NEXT state and
-+ * in receipt of a peripheral error.
-+ * 0 -> NEXT -> ON (ignore the peripheral error.)
-+ * 1 -> NEXT -> STALL (effectively disable the channel.)
-+ */
-+#define EP93XX_DMA_ABORT 0x00000002
-+/*
-+ * Ignore channel error interrupt.
-+ */
-+#define IGNORE_CHANNEL_ERROR 0x00000004
-+
-+/*****************************************************************************
-+ *
-+ * Init flag bit defintions for M2M flags.
-+ *
-+ ****************************************************************************/
-+
-+/*
-+ * Destination address hold. This should be set for IDE write transfers
-+ */
-+#define DESTINATION_HOLD 0x0000001
-+/*
-+ * Source Address hold. This should be set for IDE read transfers
-+ */
-+#define SOURCE_HOLD 0x0000002
-+/*
-+ * Transfer mode.
-+ * 00 - s/w initiated M2M transfer
-+ * 01 - h/w initiated external peripheral transfer - memory to external
-+ * peripheral/IDE/SSP.
-+ * 10 - h/w initiated external peripheral transfer - external
-+ * peripheral/IDE/SSP to memory.
-+ * 11 - not used.
-+ */
-+#define TRANSFER_MODE_MASK 0x000000C
-+#define TRANSFER_MODE_SHIFT 2
-+#define TRANSFER_MODE_SW 0x0000000
-+#define TRANSFER_MODE_HW_M2P 0x0000004
-+#define TRANSFER_MODE_HW_P2M 0x0000008
-+/*
-+ * Peripheral wait states count. Latency in HCLK cycles needed by the
-+ * peripheral to de-assert its request line once the transfer is
-+ * finished.
-+ *
-+ * IDE Operation Wait States
-+ * -------------- ------------
-+ * IDE MDMA read 0
-+ * IDE MDMA write 0
-+ * IDE UDMA read 1
-+ * IDE UDMA write 2
-+ */
-+#define WAIT_STATES_MASK 0x00007F0
-+#define WAIT_STATES_SHIFT 4
-+#define WS_IDE_MDMA_READ_WRITE 0
-+#define WS_IDE_UDMA_READ 1
-+#define WS_IDE_UDMA_WRITE 2
-+
-+/*****************************************************************************
-+ *
-+ * Type definition for the callback function
-+ *
-+ ****************************************************************************/
-+typedef void (*dma_callback) (ep93xx_dma_int_t dma_int,
-+ ep93xx_dma_dev_t device, unsigned int user_data);
-+
-+/*****************************************************************************
-+ *
-+ * API function prototypes
-+ *
-+ ****************************************************************************/
-+extern int ep93xx_dma_request(int *handle, const char *device_id,
-+ ep93xx_dma_dev_t device);
-+extern int ep93xx_dma_free(int handle);
-+extern int ep93xx_dma_config(int handle, unsigned int flags_m2p,
-+ unsigned int flags_m2m,
-+ dma_callback callback, unsigned int user_data);
-+extern int ep93xx_dma_add_buffer(int handle, unsigned int source,
-+ unsigned int dest, unsigned int size,
-+ unsigned int last, unsigned int buf_id);
-+extern int ep93xx_dma_remove_buffer(int handle, unsigned int *buf_id);
-+extern int ep93xx_dma_start(int handle, unsigned int channels,
-+ unsigned int *handles);
-+extern int ep93xx_dma_pause(int handle, unsigned int channels,
-+ unsigned int *handles);
-+extern int ep93xx_dma_flush(int handle);
-+extern int ep93xx_dma_queue_full(int handle);
-+extern int ep93xx_dma_get_position(int handle, unsigned int * buf_id,
-+ unsigned int * total, unsigned int * current_frac);
-+#endif /* _ASM_ARCH_DMA_H */
-diff --git a/include/asm-arm/arch-ep93xx/entry-macro.S b/include/asm-arm/arch-ep93xx/entry-macro.S
-new file mode 100644
-index 0000000..cab811e
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/entry-macro.S
-@@ -0,0 +1,39 @@
-+/*
-+ * include/asm-arm/arch-ep93xx/entry-macro.S
-+ *
-+ * Low-level IRQ helper macros for EP93XX-based platforms
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ */
-+
-+ .macro disable_fiq
-+ .endm
-+
-+ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
-+ ldr \irqstat, =VIC0IRQSTATUS
-+ ldr \irqstat, [\irqstat, #0] @ get masked status
-+
-+ mov \irqnr, #0
-+1001: tst \irqstat, #1
-+ bne 1003f
-+ add \irqnr, \irqnr, #1
-+ mov \irqstat, \irqstat, lsr #1
-+ cmp \irqnr, #32
-+ bcc 1001b
-+ /* EQ will be set if we reach 32 */
-+
-+ ldr \irqstat, =VIC1IRQSTATUS
-+ ldr \irqstat, [\irqstat, #0] @ get masked status
-+
-+1002: tst \irqstat, #1
-+ bne 1003f
-+ add \irqnr, \irqnr, #1
-+ mov \irqstat, \irqstat, lsr #1
-+ cmp \irqnr, #64
-+ bcc 1002b
-+ /* EQ will be set if we reach 64 */
-+
-+1003:
-+ .endm
-diff --git a/include/asm-arm/arch-ep93xx/hardware.h b/include/asm-arm/arch-ep93xx/hardware.h
-new file mode 100644
-index 0000000..f390858
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/hardware.h
-@@ -0,0 +1,60 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/hardware.h
-+ *
-+ * Copyright (C) 2003 Cirrus Logic, Inc
-+ *
-+ * Copyright (C) 1999 ARM Limited.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef __ASM_ARCH_HARDWARE_H
-+#define __ASM_ARCH_HARDWARE_H
-+
-+#include <asm/arch/clocks.h>
-+#include <asm/arch/memory.h>
-+#include <asm/arch/regmap.h>
-+
-+/*
-+ * When adding your regs-*.h file here, please be careful to not have any
-+ * macros being doubly defined. You may need to comment out a section of
-+ * regmap.h to prevent that.
-+ */
-+#include <asm/arch/regs_ac97.h>
-+#include <asm/arch/regs_dma.h>
-+#include <asm/arch/regs_gpio.h>
-+#include <asm/arch/regs_ide.h>
-+#include <asm/arch/regs_i2s.h>
-+#include <asm/arch/regs_irda.h>
-+#include <asm/arch/regs_pcmcia.h>
-+#include <asm/arch/regs_raster.h>
-+#include <asm/arch/regs_spi.h>
-+#include <asm/arch/regs_syscon.h>
-+#include <asm/arch/regs_touch.h>
-+#include <asm/arch/regs_uart.h>
-+
-+#include <asm/arch/regs_hardcode.h>
-+
-+#include <asm/arch/cx25871.h>
-+
-+/*
-+ * Here's a safe way for calculating jiffies that won't break if the
-+ * value of HZ changes.
-+ */
-+#ifndef MSECS_TO_JIFFIES
-+#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000)
-+#endif
-+
-+#endif /* __ASM_ARCH_HARDWARE_H */
-diff --git a/include/asm-arm/arch-ep93xx/ide.h b/include/asm-arm/arch-ep93xx/ide.h
-new file mode 100644
-index 0000000..7eb7faa
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/ide.h
-@@ -0,0 +1,235 @@
-+/*****************************************************************************
-+ * linux/include/asm-arm/arch-ep93xx/ide.h
-+ *
-+ * IDE definitions for the EP93XX architecture
-+ *
-+ *
-+ * Copyright (c) 2003 Cirrus Logic, Inc., All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ ****************************************************************************/
-+#ifndef ASM_ARCH_IDE_H
-+#define ASM_ARCH_IDE_H
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/hardware.h>
-+#include <asm/scatterlist.h>
-+
-+/*
-+ * Maximum number of IDE interfaces for this architecture is 1.
-+ */
-+#ifdef CONFIG_BLK_DEV_EP93XX
-+#undef MAX_HWIFS
-+#define MAX_HWIFS 1
-+#endif
-+/*
-+ * Default PIO mode used for setting up DMA commands
-+ */
-+#define DEFAULT_PIO_MODE 4
-+
-+/*
-+ * ATA Command Register addresses.
-+ */
-+
-+#define DATAREGISTER 0x00
-+#define ERRORREGISTER 0x01
-+#define FEATURESREGISTER 0x01
-+#define SECTORCOUNTREGISTER 0x02
-+#define SECTORNUMBERREGISTER 0x03
-+#define CYLINDERLOWREGISTER 0x04
-+#define CYLINDERHIGHREGISTER 0x05
-+#define DEVICEHEADREGISTER 0x06
-+#define COMMANDREGISTER 0x07
-+#define STATUSREGISTER 0x07
-+
-+/*
-+ * ATA Control Register addresses.
-+ */
-+#define DEVICECONTROLREGISTER 0x06
-+#define ALTERNATESTATUSREGISTER 0x06
-+
-+/*
-+ * ATA Register Bit Masks
-+ */
-+#define ATASRST 0x04
-+#define ATAnIEN 0x02
-+#define ATADEV 0x10
-+#define ATAABRT 0x04
-+#define ATABSY 0x80
-+#define ATADRDY 0x40
-+#define ATADRQ 0x08
-+#define ATAERR 0x01
-+#define ATADEVFAULT 0x20
-+#define ATAWRITEFAULT 0x20
-+#define ATASERVICE 0x10
-+#define ATACORRECTED 0x04
-+#define ATAINDEX 0x02
-+
-+#ifdef CONFIG_BLK_DEV_IDEDMA_EP93XX
-+
-+#define EP93XX_DMA_TODEVICE 1
-+#define EP93XX_DMA_FROMDEVICE 2
-+
-+/****************************************************************************
-+ *
-+ * Map a set of buffers described by scatterlist in streaming
-+ * mode for DMA. This is the scather-gather version of the
-+ * above pci_map_single interface. Here the scatter gather list
-+ * elements are each tagged with the appropriate dma address
-+ * and length. They are obtained via sg_dma_{address,length}(SG).
-+ *
-+ * NOTE: An implementation may be able to use a smaller number of
-+ * DMA address/length pairs than there are SG table elements.
-+ * (for example via virtual mapping capabilities)
-+ * The routine returns the number of addr/length pairs actually
-+ * used, at most nents.
-+ *
-+ * Device ownership issues as mentioned above for pci_map_single are
-+ * the same here.
-+ *
-+ ****************************************************************************/
-+static inline int
-+ep93xx_map_sg(struct scatterlist *sg, unsigned int entries,
-+ unsigned int direction)
-+{
-+ unsigned int loop;
-+
-+ for (loop = 0; loop < entries; loop++, sg++) {
-+ consistent_sync(sg->__address, sg->length, direction);
-+ sg->dma_address = virt_to_bus(sg->__address);
-+ }
-+
-+ return entries;
-+}
-+
-+#endif /* CONFIG_BLK_DEV_IDEDMA_EP93XX */
-+
-+/*****************************************************************************
-+ *
-+ * Set up a hw structure for a specified data port, control port and IRQ.
-+ * This should follow whatever the default interface uses.
-+ *
-+ ****************************************************************************/
-+static __inline__ void
-+old_ide_init_hwif_ports(hw_regs_t * hw, int data_port, int ctrl_port, int *irq)
-+{
-+ unsigned long reg;
-+ int i;
-+ printk("ide_init_hwif_ports\n");
-+ printk("ide_init_hwif_ports(hw=%p data_port=%08x, ctrl_port=%08x \n",
-+ hw, data_port, ctrl_port);
-+
-+ /*
-+ * Set up the IDE interface for PIO transfers, using the default PIO
-+ * mode.
-+ */
-+ ep93xx_ide_regs->IDECFG.Field.PIO = 1;
-+ ep93xx_ide_regs->IDECFG.Field.MODE = DEFAULT_PIO_MODE;
-+ ep93xx_ide_regs->IDECFG.Field.WST = 0;
-+
-+ /*
-+ * Enable the IDE interface.
-+ */
-+ ep93xx_ide_regs->IDECFG.Field.IDEEN = 1;
-+
-+ /*
-+ * Set up the ide device command register offsets in the io_port array.
-+ * This offset includes the register offset and the bit settings for
-+ * CS0n and CS1n.
-+ */
-+ reg = (unsigned long)data_port;
-+ for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-+ hw->io_ports[i] = (reg << 2) + 2;
-+ reg += 1;
-+
-+ printk(" io_ports: %08lx\n", hw->io_ports[i]);
-+ }
-+
-+ /*
-+ * Set up the register offset for the device control registers.
-+ * This offset includes the register offset and the bit settings for
-+ * CS0n and CS1n.
-+ */
-+ reg = (unsigned long)ctrl_port;
-+ hw->io_ports[IDE_CONTROL_OFFSET] = (reg << 2) + 1;
-+ printk("-io_ports: %08lx\n", hw->io_ports[IDE_CONTROL_OFFSET]);
-+
-+ if (irq)
-+ *irq = 0;
-+
-+}
-+
-+extern void ep93xx_ide_init(struct hwif_s *hwif);
-+
-+/*****************************************************************************
-+ *
-+ * This registers the standard ports for this architecture with the IDE
-+ * driver.
-+ *
-+ ****************************************************************************/
-+static __inline__ void old_ide_init_default_hwifs(void)
-+{
-+ hw_regs_t hw;
-+
-+ struct hwif_s *hwif;
-+ unsigned int uiTemp;
-+
-+ /*
-+ * Make sure the GPIO on IDE bits in the DEVCFG register are not set.
-+ */
-+ uiTemp =
-+ readl(SYSCON_DEVCFG) & ~(SYSCON_DEVCFG_EonIDE |
-+ SYSCON_DEVCFG_GonIDE |
-+ SYSCON_DEVCFG_HonIDE);
-+
-+ SysconSetLocked(SYSCON_DEVCFG, uiTemp);
-+
-+ /*
-+ * Initialize the IDE interface
-+ */
-+ old_ide_init_hwif_ports(&hw, DATAREGISTER, DEVICECONTROLREGISTER, NULL);
-+
-+ /*
-+ * Get the interrupt.
-+ */
-+ hw.irq = IRQ_EIDE;
-+
-+ /*
-+ * This is the dma channel number assigned to this IDE interface. Until
-+ * dma is enabled for this interface, we set it to NO_DMA.
-+ */
-+ hw.dma = NO_DMA;
-+
-+ /*
-+ * Kernels > 2.6.15-rcX crash when leaving this uninitialized
-+ */
-+ hw.dev = NULL;
-+
-+ /*
-+ * Register the IDE interface, an ide_hwif_t pointer is passed in,
-+ * which will get filled in with the hwif pointer for this interface.
-+ */
-+ ide_register_hw(&hw, &hwif);
-+
-+ /*
-+ * Set up a pointer to the ep93xx ideproc function.
-+ */
-+ ep93xx_ide_init(hwif);
-+
-+ printk
-+ ("Cirrus Logic EP93XX IDE initialization - driver version 1.0, 5/21/03. \n");
-+}
-+#endif /* ASM_ARCH_IDE_H */
-diff --git a/include/asm-arm/arch-ep93xx/io.h b/include/asm-arm/arch-ep93xx/io.h
-new file mode 100644
-index 0000000..7e2e087
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/io.h
-@@ -0,0 +1,29 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/io.h
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef __ASM_ARM_ARCH_IO_H
-+#define __ASM_ARM_ARCH_IO_H
-+
-+#define IO_SPACE_LIMIT 0xffffffff
-+
-+#define __io(a) ((void __iomem *)(a))
-+#define __mem_pci(a) (a)
-+#define __mem_isa(a) (a)
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/irqs.h b/include/asm-arm/arch-ep93xx/irqs.h
-new file mode 100644
-index 0000000..7a58d27
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/irqs.h
-@@ -0,0 +1,150 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/irqs.h
-+ *
-+ * 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
-+ */
-+
-+/*
-+ * Linux IRQ interrupts definitions here.
-+ * TBD not worth the effort to put duplicate bit defines in platform.h
-+ *
-+ * Current IRQ implementation
-+ *
-+ * 1. Current implementation does not support vectored
-+ * interrupts. support for this feature may be
-+ * added later.
-+ * 2. FIQs are ignored. None are assigned.
-+ * 3. All interrupts are assigned to IRQs.
-+ * 5. IRQ numbers are same as interrupt bit numbers.
-+ *
-+ */
-+
-+/* First two interrupt bit assignments are unused. */
-+#define IRQ_RFU0 0
-+#define IRQ_RFU1 1
-+
-+#define IRQ_COMMRX 2
-+#define IRQ_COMMTX 3
-+
-+/* Renamed TCXOI to TIMERX for consistency */
-+#define IRQ_TIMER1 4
-+#define IRQ_TIMER2 5
-+
-+#define IRQ_AAC 6
-+
-+#define IRQ_DMAM2P0 7
-+#define IRQ_DMAM2P1 8
-+#define IRQ_DMAM2P2 9
-+#define IRQ_DMAM2P3 10
-+#define IRQ_DMAM2P4 11
-+#define IRQ_DMAM2P5 12
-+#define IRQ_DMAM2P6 13
-+#define IRQ_DMAM2P7 14
-+#define IRQ_DMAM2P8 15
-+#define IRQ_DMAM2P9 16
-+
-+#define IRQ_DMAM2M0 17
-+#define IRQ_DMAM2M1 18
-+
-+#define IRQ_GPIO0 19
-+#define IRQ_GPIO1 20
-+#define IRQ_GPIO2 21
-+#define IRQ_GPIO3 22
-+
-+#define IRQ_UARTRX1 23
-+#define IRQ_UARTTX1 24
-+#define IRQ_UARTRX2 25
-+#define IRQ_UARTTX2 26
-+#define IRQ_UARTRX3 27
-+#define IRQ_UARTTX3 28
-+
-+#define IRQ_KEY 29
-+#define IRQ_TOUCH 30
-+#define IRQ_GRAPHICS 31
-+
-+/* TODO - this was IRQ_INTX, may need to make changes in code */
-+#define IRQ_EXT0 32
-+#define IRQ_EXT1 33
-+#define IRQ_EXT2 34
-+
-+#define IRQ_64HZ 35
-+#define IRQ_WEINT 36
-+#define IRQ_RTC 37
-+
-+#define IRQ_IRDA 38
-+#define IRQ_MAC 39
-+
-+#define IRQ_EXT3 40
-+#define IRQ_EIDE IRQ_EXT3
-+
-+#define IRQ_PROG 41
-+#define IRQ_1HZ 42
-+#define IRQ_VSYNC 43
-+#define IRQ_VIDEOFIFO 44
-+
-+#define IRQ_SSPRX 45
-+#define IRQ_SSPTX 46
-+
-+#define IRQ_GPIO4 47
-+
-+#define IRQ_GPIO5 48
-+#define IRQ_GPIO6 49
-+#define IRQ_GPIO7 50
-+
-+#define IRQ_TIMER3 51
-+
-+#define IRQ_UART1 52
-+#define IRQ_SSP 53
-+
-+#define IRQ_UART2 54
-+#define IRQ_UART3 55
-+
-+#define IRQ_USH 56
-+#define IRQ_PME 57
-+#define IRQ_DSP 58
-+#define IRQ_GPIO 59
-+
-+#define IRQ_RFU60 60
-+#define IRQ_RFU61 61
-+#define IRQ_RFU62 62
-+#define IRQ_RFU63 63
-+
-+#ifdef CONFIG_ARCH_EP93XX_GPIO_IRQ
-+#define IRQ_TO_BIT(irq) (1 << ((irq - NR_GLBL_IRQS) % 16))
-+
-+#define NR_GLBL_IRQS 64
-+
-+#define GPIO_IRQ0 64
-+#define GPIO_IRQ1 65
-+#define GPIO_IRQ2 66
-+#define GPIO_IRQ3 67
-+#define GPIO_IRQ4 68
-+#define GPIO_IRQ5 69
-+#define GPIO_IRQ6 70
-+#define GPIO_IRQ7 71
-+#define GPIO_IRQ8 72
-+#define GPIO_IRQ9 73
-+#define GPIO_IRQ10 74
-+#define GPIO_IRQ11 75
-+#define GPIO_IRQ12 76
-+#define GPIO_IRQ13 77
-+#define GPIO_IRQ14 78
-+#define GPIO_IRQ15 79
-+
-+#define IRQ_CHAINED_GPIO(x) (NR_GLBL_IRQS + x)
-+#define NR_IRQS IRQ_CHAINED_GPIO(16) /* with GPIO IRQs EP9315 has 80 IRQs */
-+#else
-+#define NR_IRQS 64 /* without GPIO IRQs EP9315 has 64 IRQs */
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/keyboard.h b/include/asm-arm/arch-ep93xx/keyboard.h
-new file mode 100644
-index 0000000..685ff17
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/keyboard.h
-@@ -0,0 +1,54 @@
-+/*
-+ * linux/include/asm-arm/arch-integrator/keyboard.h
-+ *
-+ * Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * 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
-+ *
-+ * Keyboard driver definitions for the Integrator architecture
-+ */
-+#include <asm/irq.h>
-+
-+/* Scancode mapping is as follows:
-+ *
-+ * Scancode = keycode if key down event
-+ * Scancode = keycode|KBUP if key up event
-+ *
-+ * Valid keycodes are 1..0x7F and are defined by the table
-+ * in keymap_dave.map. Keycode 0 is reserved to mean invalid.
-+ *
-+ * Keycodes are computed from scanned key matrix as follows:
-+ */
-+
-+#define KEYCODE( row, col) ( ((row)<<4) + (col) + 1)
-+#define KBUP 0x80
-+#define NR_SCANCODES 128 /*TBD used? */
-+
-+#ifdef CONFIG_EP93XX_KBD_SCANNED
-+void __init ep93xx_scan_kbd_hw_init(void);
-+#define kbd_init_hw() ep93xx_scan_kbd_hw_init()
-+#elif defined CONFIG_EP93XX_KBD_SPI
-+void __init EP93XXSpiKbdInit(void);
-+#define kbd_init_hw() EP93XXSpiKbdInit()
-+#elif defined CONFIG_EP93XX_KBD_USB
-+void __init EP93XXUSBKbdInit(void);
-+#define kbd_init_hw() EP93XXUSBKbdInit()
-+#endif
-+
-+#ifdef kbd_sysrq_xlate
-+#undef kbd_sysrq_xlate
-+#define kbd_sysrq_xlate (1)
-+#endif
-+#define kbd_disable_irq() disable_irq( IRQ_KEY)
-+#define kbd_enable_irq() enable_irq( IRQ_KEY)
-diff --git a/include/asm-arm/arch-ep93xx/mach-edb9302.h b/include/asm-arm/arch-ep93xx/mach-edb9302.h
-new file mode 100644
-index 0000000..829883a
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/mach-edb9302.h
-@@ -0,0 +1,20 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/mach-edb9302.h
-+ *
-+ * Copyright 2004 Ray Lehtiniemi
-+ * Copyright 2004 Siconix, Inc.
-+ *
-+ * 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 __ASM_ARCH_MACHEDB9302_H
-+#define __ASM_ARCH_MACHEDB9302_H
-+
-+#include <asm/arch/ssp2.h>
-+
-+extern struct ep93xx_ssp_slave ep93xx_ssp_flash;
-+extern struct ep93xx_ssp_slave ep93xx_ssp_codec;
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/mach-ttml.h b/include/asm-arm/arch-ep93xx/mach-ttml.h
-new file mode 100644
-index 0000000..665873d
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/mach-ttml.h
-@@ -0,0 +1,23 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/mach-ttml.h
-+ *
-+ * Copyright 2004 Ray Lehtiniemi
-+ * Copyright 2004 Siconix, Inc.
-+ *
-+ * 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 __ASM_ARCH_MACHTTML_H
-+#define __ASM_ARCH_MACHTTML_H
-+
-+#include <asm/arch/ssp2.h>
-+
-+extern struct ep93xx_ssp_slave ep93xx_ssp_micro;
-+extern struct ep93xx_ssp_slave ep93xx_ssp_expansion;
-+
-+extern int ssp_do_ttml(struct ep93xx_ssp_slave *s, void *tx, int tlen, void *rx,
-+ int rlen);
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/memory.h b/include/asm-arm/arch-ep93xx/memory.h
-new file mode 100644
-index 0000000..57e266e
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/memory.h
-@@ -0,0 +1,256 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/memory.h
-+ *
-+ * ******************************************************
-+ * * CONFUSED? Read Documentation/IO-mapping.txt *
-+ * ******************************************************
-+ *
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ * Copyright (C) 2002-2003 Cirrus Logic Corp.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef __ASM_ARCH_MMU_H
-+#define __ASM_ARCH_MMU_H
-+
-+/*
-+ * For EP93xx, SDRAM can be discontiguous, in a set number of blocks
-+ * of equal size and (usually) equal spacing. The 9301 spacing isn't equal.
-+ *
-+ * SDRAM_START is the physical address of the start of SDRAM.
-+ * SDRAM_NUMBER_OF_BLOCKS = # of blocks of SDRAM.
-+ * Each block is of size SDRAM_BLOCK_SIZE and starts at a boundary
-+ * of SDRAM_BLOCK_START_BOUNDARY.
-+ *
-+ * So memory blocks are at:
-+ * SDRAM_START
-+ * SDRAM_START + SDRAM_BLOCK_START_BOUNDARY
-+ * SDRAM_START + (SDRAM_BLOCK_START_BOUNDARY * 2)
-+ * SDRAM_START + (SDRAM_BLOCK_START_BOUNDARY * 3)
-+ * so on
-+ */
-+
-+#ifndef CONFIG_DISCONTIGMEM
-+
-+/*
-+ * Single 32Meg block of physical memory physically located at 0 .
-+ */
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 1
-+#define SDRAM_BLOCK_SIZE 0x02000000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x00000000
-+
-+#else /* CONFIG_DISCONTIGMEM */
-+
-+#if defined(CONFIG_MACH_EDB9301)
-+/*
-+ * 4 8Meg blocks at 0x0n000000, n={0145}
-+ */
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 4
-+#define SDRAM_BLOCK_SIZE 0x00800000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x01000000
-+#endif
-+
-+#if defined(CONFIG_MACH_TTML)
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 1
-+#define SDRAM_BLOCK_SIZE 0x02000000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x02000000
-+#endif
-+
-+#if defined(CONFIG_MACH_EDB9302)
-+/*
-+ * 4 8Meg blocks at 0x0n000000, n={0145}
-+ */
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 4
-+#define SDRAM_BLOCK_SIZE 0x00800000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x01000000
-+#endif
-+
-+#if defined(CONFIG_MACH_EDB9312) || defined(CONFIG_MACH_EDB9315) || defined(CONFIG_MACH_ADSSPHERE)
-+/*
-+ * 2 32Meg blocks that are located physically at 0 and 64Meg.
-+ */
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 2
-+#define SDRAM_BLOCK_SIZE 0x02000000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x04000000
-+#endif
-+
-+#if defined(CONFIG_MACH_DMA03)
-+/*
-+ * 2 32Meg blocks that are located physically at 0 and 64Meg.
-+ */
-+#define SDRAM_START 0x00000000
-+#define SDRAM_NUMBER_OF_BLOCKS 2
-+#define SDRAM_BLOCK_SIZE 0x02000000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x04000000
-+#endif
-+
-+#if defined(CONFIG_MACH_ACC)
-+/*
-+ * 8 8Meg blocks that are located physically at 0xC0000000
-+ * total 64Meg.
-+ */
-+#define SDRAM_START 0xC0000000
-+#define SDRAM_NUMBER_OF_BLOCKS 8
-+#define SDRAM_BLOCK_SIZE 0x00800000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x01000000
-+#endif
-+
-+#if defined(CONFIG_MACH_ZEFEERDZB)
-+/*
-+ * 2 8Meg blocks
-+ */
-+#define SDRAM_START 0xD0000000
-+#define SDRAM_NUMBER_OF_BLOCKS 2
-+#define SDRAM_BLOCK_SIZE 0x00800000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x01000000
-+#endif
-+
-+#if defined(CONFIG_MACH_ZEFEERDZQ)
-+/*
-+ * 2 32Meg blocks
-+ */
-+#define SDRAM_START 0xD0000000
-+#define SDRAM_NUMBER_OF_BLOCKS 2
-+#define SDRAM_BLOCK_SIZE 0x02000000
-+#define SDRAM_BLOCK_START_BOUNDARY 0x04000000
-+#endif
-+
-+/*
-+ * Here we are assuming EP93xx is configured to have two 32MB SDRAM
-+ * areas with 32MB of empty space between them. So use 24 for the node
-+ * max shift to get 64MB node sizes.
-+ */
-+#define NODE_MAX_MEM_SHIFT 26
-+#define NODE_MAX_MEM_SIZE (1<<NODE_MAX_MEM_SHIFT)
-+
-+#endif /* CONFIG_DISCONTIGMEM */
-+
-+/*
-+ * MEM_SIZE and PHYS_OFFSET are used to set size of SDRAM for
-+ * initial page table in arch/arm/kernel/setup.c
-+ * For ep93xx, PHYS_OFFSET is set to be SDRAM_START.
-+ */
-+#define MEM_SIZE (SDRAM_BLOCK_SIZE)
-+
-+/*
-+ * If memory is not discontiguous, this is #defined in
-+ * arch/arm/mm/init.c to be 1.
-+ */
-+#ifdef CONFIG_DISCONTIGMEM
-+#define NR_NODES (SDRAM_NUMBER_OF_BLOCKS)
-+#endif
-+
-+/*
-+ * Where to load the ramdisk (virtual address, not physical) and how
-+ * big to make it. (used in arch/arm/kernel/setup.c
-+ * In both cases, when redboot loads the ramdisk image to 0x01000000,
-+ * the processor will find it because the linux map is funny.
-+ */
-+#ifdef CONFIG_ARCH_EP9301
-+#define RAMDISK_START_VIRT (0xC4000000)
-+#else
-+#define RAMDISK_START_VIRT (0xC1000000)
-+#endif
-+
-+/*
-+ * The ramdisk size comes from a make menuconfig option.
-+ */
-+#define RAMDISK_SIZE ((CONFIG_BLK_DEV_RAM_SIZE)<<10)
-+
-+/*
-+ * Task size: 2GB (from 0 to base of IO in virtual space)
-+ */
-+#define TASK_SIZE UL(0x7f000000)
-+
-+/*
-+ * This decides where the kernel will search for a free chunk of vm
-+ * space during mmap's.
-+ */
-+#define TASK_UNMAPPED_BASE (0x40000000)
-+
-+/*
-+ * Page offset: 3GB (start of kernel memory in virtual space)
-+ * Phys offset: 0 (start of kernel memory in physical space)
-+ */
-+#define PAGE_OFFSET UL(0xC0000000)
-+#define PHYS_OFFSET (SDRAM_START)
-+
-+/*
-+ * We take advantage of the fact that physical and virtual address can be the
-+ * same. The NUMA code is handling the large holes that might exist between
-+ * all memory banks.
-+ */
-+#define __virt_to_phys__is_a_macro
-+#define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET + PHYS_OFFSET)
-+
-+#define __phys_to_virt__is_a_macro
-+#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET - PHYS_OFFSET)
-+
-+/*
-+ * Virtual view <-> DMA view memory address translations
-+ * virt_to_bus: Used to translate the virtual address to an
-+ * address suitable to be passed to set_dma_addr
-+ * bus_to_virt: Used to convert an address for DMA operations
-+ * to an address that the kernel can use.
-+ */
-+#define __virt_to_bus__is_a_macro
-+#define __virt_to_bus(x) __virt_to_phys(x)
-+
-+#define __bus_to_virt__is_a_macro
-+#define __bus_to_virt(x) __phys_to_virt(x)
-+
-+/*
-+ * Note that this file is included by include/asm-arm/memory.h so
-+ * the macros in this file have to play nice with those.
-+ */
-+#ifdef CONFIG_DISCONTIGMEM
-+
-+/*
-+ * Given a kernel address, find the home node of the underlying memory.
-+ */
-+#define KVADDR_TO_NID(addr) \
-+ (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MAX_MEM_SHIFT)
-+
-+/*
-+ * Given a page frame number, convert it to a node id.
-+ */
-+#define PFN_TO_NID(pfn) \
-+ (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MAX_MEM_SHIFT - PAGE_SHIFT))
-+
-+/*
-+ * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
-+ * and returns the mem_map of that node.
-+ */
-+#define ADDR_TO_MAPBASE(kaddr) NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr)))
-+
-+#define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn))
-+
-+/*
-+ * Given a kaddr, LOCAL_MAR_NR finds the owning node of the memory
-+ * and returns the index corresponding to the appropriate page in the
-+ * node's mem_map.
-+ */
-+#define LOCAL_MAP_NR(kaddr) \
-+ (((unsigned long)(kaddr) & (NODE_MAX_MEM_SIZE - 1)) >> PAGE_SHIFT)
-+
-+#endif /* CONFIG_DISCONTIGMEM */
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/param.h b/include/asm-arm/arch-ep93xx/param.h
-new file mode 100644
-index 0000000..525face
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/param.h
-@@ -0,0 +1,21 @@
-+/*
-+ * linux/include/asm-arm/arch-integrator/param.h
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/* #define HZ 100 */
-diff --git a/include/asm-arm/arch-ep93xx/platform.h b/include/asm-arm/arch-ep93xx/platform.h
-new file mode 100644
-index 0000000..d92833d
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/platform.h
-@@ -0,0 +1,43 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/platform.h
-+ *
-+ * Copyright (C) 2002-2003 Cirrus Logic, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef ASM_ARCH_PLATFORM_H
-+#define ASM_ARCH_PLATFORM_H
-+
-+/*
-+ * Timer definitions
-+ *
-+ * Use timers 1, 2, and 3. Do not use timer 4.
-+ * Timers run at 508 kHz.
-+ */
-+
-+/*
-+ * These are useconds NOT ticks.
-+ */
-+#define mSEC_1 1000
-+#define mSEC_5 (mSEC_1 * 5)
-+#define mSEC_10 (mSEC_1 * 10)
-+#define mSEC_25 (mSEC_1 * 25)
-+#define SEC_1 (mSEC_1 * 1000)
-+
-+#ifndef __ASSEMBLY__
-+extern struct sys_timer ep93xx_timer;
-+#endif
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/regmap.h b/include/asm-arm/arch-ep93xx/regmap.h
-new file mode 100644
-index 0000000..7b3eeac
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regmap.h
-@@ -0,0 +1,1125 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/regmap.h
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ * Copyright (C) 2003 Cirrus Logic, Inc
-+ * Copyright (C) 1999 ARM Limited.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef __ASM_ARCH_REGMAP_H
-+#define __ASM_ARCH_REGMAP_H
-+
-+/*
-+ * Here's the rules:
-+ * - EP93xx register addresses in regmap.h are physical addresses.
-+ *
-+ * - io_p2v translates a physical address to a virtual one for the
-+ * EP93xx's register space only. Don't use it for actual memory.
-+ *
-+ */
-+
-+#define IO_BASE_VIRT 0xE0000000 /* Virtual address of IO */
-+#define IO_BASE_PHYS 0x80000000 /* Physical address of IO */
-+
-+/*
-+ * The HW_REG macro assumes that the param is a virtual address
-+ */
-+#define HW_REG(reg) ((unsigned int volatile *)reg)
-+
-+/*
-+ * Macro to get at IO space when running virtually.
-+ * (Translates a physical address to a virtual address)
-+ * First cast the pa to an unsigned int in case we are using this
-+ * on a macro that is already cast as a pointer.
-+ */
-+
-+#define io_p2v(x) ((x) - (IO_BASE_PHYS - IO_BASE_VIRT))
-+#define io_v2p(x) ((x) - (IO_BASE_VIRT - IO_BASE_PHYS))
-+
-+/******************************************************************/
-+/* EP93xx Memory Map and Register list */
-+/******************************************************************/
-+/* */
-+/* 0000_0000 - 0000_ffff: Internal ROM/nSDCE3/nCS0 */
-+/* 0001_0000 - 0fff_ffff: nSDCE3/nCS0 */
-+/* 1000_0000 - 1fff_ffff: nCS1 */
-+/* 2000_0000 - 2fff_ffff: nCS2 */
-+/* 3000_0000 - 3fff_ffff: nCS3 */
-+/* 4000_0000 - 4fff_ffff: Reserved */
-+/* 5000_0000 - 5fff_ffff: Reserved */
-+/* 6000_0000 - 6fff_ffff: nCS6 */
-+/* 7000_0000 - 7fff_ffff: nCS7 */
-+/* 8000_0000 - 800f_ffff: AHB Registers */
-+/* 8010_0000 - 807f_ffff: Reserved */
-+/* 8080_0000 - 8fff_ffff: APB Registers */
-+/* 9000_0000 - bfff_ffff: Not Used */
-+/* c000_0000 - cfff_ffff: nSDCE0 */
-+/* d000_0000 - dfff_ffff: nSDCE1 */
-+/* e000_0000 - efff_ffff: nSDCE2 */
-+/* f000_0000 - ffff_ffff: nCS0/nSDCE3 */
-+/* */
-+/******************************************************************/
-+
-+/******************************************************************/
-+/* EP93xx AHB Blocks */
-+/******************************************************************/
-+/* */
-+/* Start End Usage */
-+/* 8000_0000 8000_FFFF: DMA */
-+/* 8001_0000 8001_FFFF: Ethernet MAC */
-+/* 8002_0000 8002_FFFF: USB Host */
-+/* 8003_0000 8003_FFFF: Raster */
-+/* 8004_0000 8004_FFFF: Reserved */
-+/* 8005_0000 8005_FFFF: Reserved */
-+/* 8006_0000 8006_FFFF: SDRAM */
-+/* 8007_0000 8007_FFFF: Reserved */
-+/* 8008_0000 8008_FFFF: SMC */
-+/* 8009_0000 8009_FFFF: Boot ROM physical address */
-+/* 800A_0000 800A_FFFF: IDE */
-+/* 800B_0000 800B_FFFF: VIC1 */
-+/* 800C_0000 800C_FFFF: VIC2 */
-+/* 800D_0000 800F_FFFF: Reserved */
-+/* */
-+/******************************************************************/
-+
-+#define EP93XX_AHB_BASE (IO_BASE_VIRT)
-+
-+/* 8000_0000 - 8000_ffff: DMA */
-+#define DMA_OFFSET 0x000000
-+#define DMA_BASE (EP93XX_AHB_BASE|DMA_OFFSET)
-+#define DMAMP_TX_0_CONTROL (DMA_BASE+0x0000)
-+#define DMAMP_TX_0_INTERRUPT (DMA_BASE+0x0004)
-+#define DMAMP_TX_0_PPALLOC (DMA_BASE+0x0008)
-+#define DMAMP_TX_0_STATUS (DMA_BASE+0x000C)
-+#define DMAMP_TX_0_REMAIN (DMA_BASE+0x0014)
-+#define DMAMP_TX_0_MAXCNT0 (DMA_BASE+0x0020)
-+#define DMAMP_TX_0_BASE0 (DMA_BASE+0x0024)
-+#define DMAMP_TX_0_CURRENT0 (DMA_BASE+0x0028)
-+#define DMAMP_TX_0_MAXCNT1 (DMA_BASE+0x0030)
-+#define DMAMP_TX_0_BASE1 (DMA_BASE+0x0034)
-+#define DMAMP_TX_0_CURRENT1 (DMA_BASE+0x0038)
-+
-+#define DMAMP_RX_1_CONTROL (DMA_BASE+0x0040)
-+#define DMAMP_RX_1_INTERRUPT (DMA_BASE+0x0044)
-+#define DMAMP_RX_1_PPALLOC (DMA_BASE+0x0048)
-+#define DMAMP_RX_1_STATUS (DMA_BASE+0x004C)
-+#define DMAMP_RX_1_REMAIN (DMA_BASE+0x0054)
-+#define DMAMP_RX_1_MAXCNT0 (DMA_BASE+0x0060)
-+#define DMAMP_RX_1_BASE0 (DMA_BASE+0x0064)
-+#define DMAMP_RX_1_CURRENT0 (DMA_BASE+0x0068)
-+#define DMAMP_RX_1_MAXCNT1 (DMA_BASE+0x0070)
-+#define DMAMP_RX_1_BASE1 (DMA_BASE+0x0074)
-+#define DMAMP_RX_1_CURRENT1 (DMA_BASE+0x0078)
-+
-+#define DMAMP_TX_2_CONTROL (DMA_BASE+0x0080)
-+#define DMAMP_TX_2_INTERRUPT (DMA_BASE+0x0084)
-+#define DMAMP_TX_2_PPALLOC (DMA_BASE+0x0088)
-+#define DMAMP_TX_2_STATUS (DMA_BASE+0x008C)
-+#define DMAMP_TX_2_REMAIN (DMA_BASE+0x0094)
-+#define DMAMP_TX_2_MAXCNT0 (DMA_BASE+0x00A0)
-+#define DMAMP_TX_2_BASE0 (DMA_BASE+0x00A4)
-+#define DMAMP_TX_2_CURRENT0 (DMA_BASE+0x00A8)
-+#define DMAMP_TX_2_MAXCNT1 (DMA_BASE+0x00B0)
-+#define DMAMP_TX_2_BASE1 (DMA_BASE+0x00B4)
-+#define DMAMP_TX_2_CURRENT1 (DMA_BASE+0x00B8)
-+
-+#define DMAMP_RX_3_CONTROL (DMA_BASE+0x00C0)
-+#define DMAMP_RX_3_INTERRUPT (DMA_BASE+0x00C4)
-+#define DMAMP_RX_3_PPALLOC (DMA_BASE+0x00C8)
-+#define DMAMP_RX_3_STATUS (DMA_BASE+0x00CC)
-+#define DMAMP_RX_3_REMAIN (DMA_BASE+0x00D4)
-+#define DMAMP_RX_3_MAXCNT0 (DMA_BASE+0x00E0)
-+#define DMAMP_RX_3_BASE0 (DMA_BASE+0x00E4)
-+#define DMAMP_RX_3_CURRENT0 (DMA_BASE+0x00E8)
-+#define DMAMP_RX_3_MAXCNT1 (DMA_BASE+0x00F0)
-+#define DMAMP_RX_3_BASE1 (DMA_BASE+0x00F4)
-+#define DMAMP_RX_3_CURRENT1 (DMA_BASE+0x00F8)
-+
-+#define DMAMM_0_CONTROL (DMA_BASE+0x0100)
-+#define DMAMM_0_INTERRUPT (DMA_BASE+0x0104)
-+#define DMAMM_0_STATUS (DMA_BASE+0x010C)
-+#define DMAMM_0_BCR0 (DMA_BASE+0x0110)
-+#define DMAMM_0_BCR1 (DMA_BASE+0x0114)
-+#define DMAMM_0_SAR_BASE0 (DMA_BASE+0x0118)
-+#define DMAMM_0_SAR_BASE1 (DMA_BASE+0x011C)
-+#define DMAMM_0_SAR_CURRENT0 (DMA_BASE+0x0124)
-+#define DMAMM_0_SAR_CURRENT1 (DMA_BASE+0x0128)
-+#define DMAMM_0_DAR_BASE0 (DMA_BASE+0x012C)
-+#define DMAMM_0_DAR_BASE1 (DMA_BASE+0x0130)
-+#define DMAMM_0_DAR_CURRENT0 (DMA_BASE+0x0134)
-+#define DMAMM_0_DAR_CURRENT1 (DMA_BASE+0x013C)
-+
-+#define DMAMM_1_CONTROL (DMA_BASE+0x0140)
-+#define DMAMM_1_INTERRUPT (DMA_BASE+0x0144)
-+#define DMAMM_1_STATUS (DMA_BASE+0x014C)
-+#define DMAMM_1_BCR0 (DMA_BASE+0x0150)
-+#define DMAMM_1_BCR1 (DMA_BASE+0x0154)
-+#define DMAMM_1_SAR_BASE0 (DMA_BASE+0x0158)
-+#define DMAMM_1_SAR_BASE1 (DMA_BASE+0x015C)
-+#define DMAMM_1_SAR_CURRENT0 (DMA_BASE+0x0164)
-+#define DMAMM_1_SAR_CURRENT1 (DMA_BASE+0x0168)
-+#define DMAMM_1_DAR_BASE0 (DMA_BASE+0x016C)
-+#define DMAMM_1_DAR_BASE1 (DMA_BASE+0x0170)
-+#define DMAMM_1_DAR_CURRENT0 (DMA_BASE+0x0174)
-+#define DMAMM_1_DAR_CURRENT1 (DMA_BASE+0x017C)
-+
-+#define DMAMP_RX_5_CONTROL (DMA_BASE+0x0200)
-+#define DMAMP_RX_5_INTERRUPT (DMA_BASE+0x0204)
-+#define DMAMP_RX_5_PPALLOC (DMA_BASE+0x0208)
-+#define DMAMP_RX_5_STATUS (DMA_BASE+0x020C)
-+#define DMAMP_RX_5_REMAIN (DMA_BASE+0x0214)
-+#define DMAMP_RX_5_MAXCNT0 (DMA_BASE+0x0220)
-+#define DMAMP_RX_5_BASE0 (DMA_BASE+0x0224)
-+#define DMAMP_RX_5_CURRENT0 (DMA_BASE+0x0228)
-+#define DMAMP_RX_5_MAXCNT1 (DMA_BASE+0x0230)
-+#define DMAMP_RX_5_BASE1 (DMA_BASE+0x0234)
-+#define DMAMP_RX_5_CURRENT1 (DMA_BASE+0x0238)
-+
-+#define DMAMP_TX_4_CONTROL (DMA_BASE+0x0240)
-+#define DMAMP_TX_4_INTERRUPT (DMA_BASE+0x0244)
-+#define DMAMP_TX_4_PPALLOC (DMA_BASE+0x0248)
-+#define DMAMP_TX_4_STATUS (DMA_BASE+0x024C)
-+#define DMAMP_TX_4_REMAIN (DMA_BASE+0x0254)
-+#define DMAMP_TX_4_MAXCNT0 (DMA_BASE+0x0260)
-+#define DMAMP_TX_4_BASE0 (DMA_BASE+0x0264)
-+#define DMAMP_TX_4_CURRENT0 (DMA_BASE+0x0268)
-+#define DMAMP_TX_4_MAXCNT1 (DMA_BASE+0x0270)
-+#define DMAMP_TX_4_BASE1 (DMA_BASE+0x0274)
-+#define DMAMP_TX_4_CURRENT1 (DMA_BASE+0x0278)
-+
-+#define DMAMP_RX_7_CONTROL (DMA_BASE+0x0280)
-+#define DMAMP_RX_7_INTERRUPT (DMA_BASE+0x0284)
-+#define DMAMP_RX_7_PPALLOC (DMA_BASE+0x0288)
-+#define DMAMP_RX_7_STATUS (DMA_BASE+0x028C)
-+#define DMAMP_RX_7_REMAIN (DMA_BASE+0x0294)
-+#define DMAMP_RX_7_MAXCNT0 (DMA_BASE+0x02A0)
-+#define DMAMP_RX_7_BASE0 (DMA_BASE+0x02A4)
-+#define DMAMP_RX_7_CURRENT0 (DMA_BASE+0x02A8)
-+#define DMAMP_RX_7_MAXCNT1 (DMA_BASE+0x02B0)
-+#define DMAMP_RX_7_BASE1 (DMA_BASE+0x02B4)
-+#define DMAMP_RX_7_CURRENT1 (DMA_BASE+0x02B8)
-+
-+#define DMAMP_TX_6_CONTROL (DMA_BASE+0x02C0)
-+#define DMAMP_TX_6_INTERRUPT (DMA_BASE+0x02C4)
-+#define DMAMP_TX_6_PPALLOC (DMA_BASE+0x02C8)
-+#define DMAMP_TX_6_STATUS (DMA_BASE+0x02CC)
-+#define DMAMP_TX_6_REMAIN (DMA_BASE+0x02D4)
-+#define DMAMP_TX_6_MAXCNT0 (DMA_BASE+0x02E0)
-+#define DMAMP_TX_6_BASE0 (DMA_BASE+0x02E4)
-+#define DMAMP_TX_6_CURRENT0 (DMA_BASE+0x02E8)
-+#define DMAMP_TX_6_MAXCNT1 (DMA_BASE+0x02F0)
-+#define DMAMP_TX_6_BASE1 (DMA_BASE+0x02F4)
-+#define DMAMP_TX_6_CURRENT1 (DMA_BASE+0x02F8)
-+
-+#define DMAMP_RX_9_CONTROL (DMA_BASE+0x0300)
-+#define DMAMP_RX_9_INTERRUPT (DMA_BASE+0x0304)
-+#define DMAMP_RX_9_PPALLOC (DMA_BASE+0x0308)
-+#define DMAMP_RX_9_STATUS (DMA_BASE+0x030C)
-+#define DMAMP_RX_9_REMAIN (DMA_BASE+0x0314)
-+#define DMAMP_RX_9_MAXCNT0 (DMA_BASE+0x0320)
-+#define DMAMP_RX_9_BASE0 (DMA_BASE+0x0324)
-+#define DMAMP_RX_9_CURRENT0 (DMA_BASE+0x0328)
-+#define DMAMP_RX_9_MAXCNT1 (DMA_BASE+0x0330)
-+#define DMAMP_RX_9_BASE1 (DMA_BASE+0x0334)
-+#define DMAMP_RX_9_CURRENT1 (DMA_BASE+0x0338)
-+
-+#define DMAMP_TX_8_CONTROL (DMA_BASE+0x0340)
-+#define DMAMP_TX_8_INTERRUPT (DMA_BASE+0x0344)
-+#define DMAMP_TX_8_PPALLOC (DMA_BASE+0x0348)
-+#define DMAMP_TX_8_STATUS (DMA_BASE+0x034C)
-+#define DMAMP_TX_8_REMAIN (DMA_BASE+0x0354)
-+#define DMAMP_TX_8_MAXCNT0 (DMA_BASE+0x0360)
-+#define DMAMP_TX_8_BASE0 (DMA_BASE+0x0364)
-+#define DMAMP_TX_8_CURRENT0 (DMA_BASE+0x0368)
-+#define DMAMP_TX_8_MAXCNT1 (DMA_BASE+0x0370)
-+#define DMAMP_TX_8_BASE1 (DMA_BASE+0x0374)
-+#define DMAMP_TX_8_CURRENT1 (DMA_BASE+0x0378)
-+
-+#define DMA_ARBITRATION (DMA_BASE+0x0380)
-+#define DMA_INTERRUPT (DMA_BASE+0x03C0)
-+
-+/*
-+ * DMA Register Base addresses and Offsets
-+ */
-+#define DMA_M2P_TX_0_BASE DMAMP_TX_0_CONTROL
-+#define DMA_M2P_RX_1_BASE DMAMP_RX_1_CONTROL
-+#define DMA_M2P_TX_2_BASE DMAMP_TX_2_CONTROL
-+#define DMA_M2P_RX_3_BASE DMAMP_RX_3_CONTROL
-+#define DMA_M2M_0_BASE DMAMM_0_CONTROL
-+#define DMA_M2M_1_BASE DMAMM_1_CONTROL
-+#define DMA_M2P_RX_5_BASE DMAMP_RX_5_CONTROL
-+#define DMA_M2P_TX_4_BASE DMAMP_TX_4_CONTROL
-+#define DMA_M2P_RX_7_BASE DMAMP_RX_7_CONTROL
-+#define DMA_M2P_TX_6_BASE DMAMP_TX_6_CONTROL
-+#define DMA_M2P_RX_9_BASE DMAMP_RX_9_CONTROL
-+#define DMA_M2P_TX_8_BASE DMAMP_TX_8_CONTROL
-+
-+#define M2P_OFFSET_CONTROL 0x0000
-+#define M2P_OFFSET_INTERRUPT 0x0004
-+#define M2P_OFFSET_PPALLOC 0x0008
-+#define M2P_OFFSET_STATUS 0x000C
-+#define M2P_OFFSET_REMAIN 0x0014
-+#define M2P_OFFSET_MAXCNT0 0x0020
-+#define M2P_OFFSET_BASE0 0x0024
-+#define M2P_OFFSET_CURRENT0 0x0028
-+#define M2P_OFFSET_MAXCNT1 0x0030
-+#define M2P_OFFSET_BASE1 0x0034
-+#define M2P_OFFSET_CURRENT1 0x0038
-+
-+#define M2M_OFFSET_CONTROL 0x0000
-+#define M2M_OFFSET_INTERRUPT 0x0004
-+#define M2M_OFFSET_STATUS 0x000C
-+#define M2M_OFFSET_BCR0 0x0010
-+#define M2M_OFFSET_BCR1 0x0014
-+#define M2M_OFFSET_SAR_BASE0 0x0018
-+#define M2M_OFFSET_SAR_BASE1 0x001C
-+#define M2M_OFFSET_SAR_CURRENT0 0x0024
-+#define M2M_OFFSET_SAR_CURRENT1 0x0028
-+#define M2M_OFFSET_DAR_BASE0 0x002C
-+#define M2M_OFFSET_DAR_BASE1 0x0030
-+#define M2M_OFFSET_DAR_CURRENT0 0x0034
-+#define M2M_OFFSET_DAR_CURRENT1 0x003C
-+
-+/*----------------------------------------------------------------*/
-+/* 8001_0000 - 8001_ffff: Ether MAC */
-+/*----------------------------------------------------------------*/
-+#define MAC_OFFSET 0x010000
-+#define MAC_BASE (EP93XX_AHB_BASE|MAC_OFFSET)
-+
-+#define MAC_RXCTL (MAC_BASE+0x00)
-+#define MAC_TXCTL (MAC_BASE+0x04)
-+#define MAC_TESTCTL (MAC_BASE+0x08)
-+#define MAC_MIICMD (MAC_BASE+0x10)
-+#define MAC_MIIDATA (MAC_BASE+0x14)
-+#define MAC_MIISTS (MAC_BASE+0x18)
-+#define MAC_SELFCTL (MAC_BASE+0x20)
-+#define MAC_INTEN (MAC_BASE+0x24)
-+#define MAC_INTSTSP (MAC_BASE+0x28)
-+#define MAC_INTSTSC (MAC_BASE+0x2C)
-+#define MAC_DIAGAD (MAC_BASE+0x38)
-+#define MAC_DIAGDATA (MAC_BASE+0x3C)
-+#define MAC_GT (MAC_BASE+0x40)
-+#define MAC_FCT (MAC_BASE+0x44)
-+#define MAC_FCF (MAC_BASE+0x48)
-+#define MAC_AFP (MAC_BASE+0x4C)
-+#define MAC_HASHTBL (MAC_BASE+0x50)
-+#define MAC_INDAD (MAC_BASE+0x50)
-+#define MAC_INDAD_UPPER (MAC_BASE+0x54)
-+#define MAC_GIINTSTS (MAC_BASE+0x60)
-+#define MAC_GIINTMSK (MAC_BASE+0x64)
-+#define MAC_GIINTROSTS (MAC_BASE+0x68)
-+#define MAC_GIINTFRC (MAC_BASE+0x6C)
-+#define MAC_TXCOLLCNT (MAC_BASE+0x70)
-+#define MAC_RXMISSCNT (MAC_BASE+0x74)
-+#define MAC_RXRUNTCNT (MAC_BASE+0x78)
-+#define MAC_BMCTL (MAC_BASE+0x80)
-+#define MAC_BMSTS (MAC_BASE+0x84)
-+#define MAC_RXBCA (MAC_BASE+0x88)
-+#define MAC_RXDQBADD (MAC_BASE+0x90)
-+#define MAC_RXDQBLEN (UINT16*)(MAC_BASE+0x94)
-+#define MAC_RXDQCURLEN (UINT16*)(MAC_BASE+0x96)
-+#define MAC_RXDCURADD (MAC_BASE+0x98)
-+#define MAC_RXDENQ (MAC_BASE+0x9C)
-+#define MAC_RXSTSQBADD (MAC_BASE+0xA0)
-+#define MAC_RXSTSQBLEN (UINT16*)(MAC_BASE+0xA4)
-+#define MAC_RXSTSQCURLEN (UINT16*)(MAC_BASE+0xA6)
-+#define MAC_RXSTSQCURADD (MAC_BASE+0xA8)
-+#define MAC_RXSTSENQ (MAC_BASE+0xAC)
-+#define MAC_TXDQBADD (MAC_BASE+0xB0)
-+#define MAC_TXDQBLEN (MAC_BASE+0xB4)
-+#define MAC_TXDQCURLEN (MAC_BASE+0xB6)
-+#define MAC_TXDQCURADD (MAC_BASE+0xB8)
-+#define MAC_TXDENQ (MAC_BASE+0xBC)
-+#define MAC_TXSTSQBADD (MAC_BASE+0xC0)
-+#define MAC_TXSTSQBLEN (MAC_BASE+0xC4)
-+#define MAC_TXSTSQCURLEN (MAC_BASE+0xC6)
-+#define MAC_TXSTSQCURADD (MAC_BASE+0xC8)
-+#define MAC_RXBUFTHRSHLD (MAC_BASE+0xD0)
-+#define MAC_TXBUFTHRSHLD (MAC_BASE+0xD4)
-+#define MAC_RXSTSTHRSHLD (MAC_BASE+0xD8)
-+#define MAC_TXSTSTHRSHLD (MAC_BASE+0xDC)
-+#define MAC_RXDTHRSHLD (MAC_BASE+0xE0)
-+#define MAC_TXDTHRSHLD (MAC_BASE+0xE4)
-+#define MAC_MAXFRMLEN (MAC_BASE+0xE8)
-+#define MAC_RXHDRLEN (MAC_BASE+0xEC)
-+
-+#define MAC_FIFO (MAC_BASE+0x4000)
-+#define MAC_FIFO_LEN 0xc000
-+
-+/*----------------------------------------------------------------*/
-+/* 8002_0000 - 8002_ffff: USB */
-+/*----------------------------------------------------------------*/
-+#define USB_OFFSET 0x020000
-+#define USB_BASE (EP93XX_AHB_BASE|USB_OFFSET)
-+
-+#define HCREVISION (USB_BASE+0x00)
-+#define HCCONTROL (USB_BASE+0x04)
-+#define HCCOMMANDSTATUS (USB_BASE+0x08)
-+#define HCINTERRUPTSTATUS (USB_BASE+0x0C)
-+#define HCINTERRUPTENABLE (USB_BASE+0x10)
-+#define HCINTERRUPTDISABLE (USB_BASE+0x14)
-+#define HCHCCA (USB_BASE+0x18)
-+#define HCPERIODCURRENTED (USB_BASE+0x1C)
-+#define HCCONTROLHEADED (USB_BASE+0x20)
-+#define HCCONTROLCURRENTED (USB_BASE+0x24)
-+#define HCBULKHEADED (USB_BASE+0x28)
-+#define HCBULKCURRENTED (USB_BASE+0x2C)
-+#define HCDONEHEAD (USB_BASE+0x30)
-+#define HCFMINTERVAL (USB_BASE+0x34)
-+#define HCFMREMAINING (USB_BASE+0x38)
-+#define HCFMNUMBER (USB_BASE+0x3C)
-+#define HCPERIODICSTART (USB_BASE+0x40)
-+#define HCLSTHRESHOLD (USB_BASE+0x44)
-+#define HCRHDESCRIPTORA (USB_BASE+0x48)
-+#define HCRHDESCRIPTORB (USB_BASE+0x4C)
-+#define HCRHSTATUS (USB_BASE+0x50)
-+#define HCRHPORTSTATUS0 (USB_BASE+0x54)
-+#define HCRHPORTSTATUS1 (USB_BASE+0x58) /* not in 9301 */
-+#define HCRHPORTSTATUS2 (USB_BASE+0x5C)
-+
-+/* additional non-OHCI registers for controlling the AHB-HCI interface */
-+#define USBCTRL (USB_BASE+0x80)
-+#define USBHCISTS (USB_BASE+0x84)
-+
-+/* 8003_0000 - 8003_ffff: Raster */
-+#define RASTER_OFFSET 0x030000
-+#define RASTER_BASE (EP93XX_AHB_BASE|RASTER_OFFSET)
-+#define VLINESTOTAL (RASTER_BASE+0x00)
-+#define VSYNCSTRTSTOP (RASTER_BASE+0x04)
-+#define VACTIVESTRTSTOP (RASTER_BASE+0x08)
-+#define VCLKSTRTSTOP (RASTER_BASE+0x0C)
-+#define HCLKSTOTAL (RASTER_BASE+0x10)
-+#define HSYNCSTRTSTOP (RASTER_BASE+0x14)
-+#define HACTIVESTRTSTOP (RASTER_BASE+0x18)
-+#define HCLKSTRTSTOP (RASTER_BASE+0x1C)
-+#define BRIGHTNESS (RASTER_BASE+0x20)
-+#define VIDEOATTRIBS (RASTER_BASE+0x24)
-+#define VIDSCRNPAGE (RASTER_BASE+0x28)
-+#define VIDSCRNHPG (RASTER_BASE+0x2C)
-+#define SCRNLINES (RASTER_BASE+0x30)
-+#define LINELENGTH (RASTER_BASE+0x34)
-+#define VLINESTEP (RASTER_BASE+0x38)
-+#define LINECARRY (RASTER_BASE+0x3C)
-+#define BLINKRATE (RASTER_BASE+0x40)
-+#define BLINKMASK (RASTER_BASE+0x44)
-+#define BLINKPATTRN (RASTER_BASE+0x48)
-+#define PATTRNMASK (RASTER_BASE+0x4C)
-+#define BG_OFFSET (RASTER_BASE+0x50)
-+#define PIXELMODE (RASTER_BASE+0x54)
-+#define PARLLIFOUT (RASTER_BASE+0x58)
-+#define PARLLIFIN (RASTER_BASE+0x5C)
-+#define CURSOR_ADR_START (RASTER_BASE+0x60)
-+#define CURSOR_ADR_RESET (RASTER_BASE+0x64)
-+#define CURSORSIZE (RASTER_BASE+0x68)
-+#define CURSORCOLOR1 (RASTER_BASE+0x6C)
-+#define CURSORCOLOR2 (RASTER_BASE+0x70)
-+#define CURSORXYLOC (RASTER_BASE+0x74)
-+#define CURSOR_DHSCAN_LH_YLOC (RASTER_BASE+0x78)
-+#define REALITI_SWLOCK (RASTER_BASE+0x7C)
-+#define GS_LUT (RASTER_BASE+0x80)
-+#define REALITI_TCR (RASTER_BASE+0x100)
-+#define REALITI_TISRA (RASTER_BASE+0x104)
-+#define REALITI_TISRB (RASTER_BASE+0x108)
-+#define CURSOR_TISR (RASTER_BASE+0x10C)
-+#define REALITI_TOCRA (RASTER_BASE+0x110)
-+#define REALITI_TOCRB (RASTER_BASE+0x114)
-+#define FIFO_TOCRA (RASTER_BASE+0x118)
-+#define FIFO_TOCRB (RASTER_BASE+0x11C)
-+#define BLINK_TISR (RASTER_BASE+0x120)
-+#define DAC_TISRA (RASTER_BASE+0x124)
-+#define DAC_TISRB (RASTER_BASE+0x128)
-+#define SHIFT_TISR (RASTER_BASE+0x12C)
-+#define DACMUX_TOCRA (RASTER_BASE+0x130)
-+#define DACMUX_TOCRB (RASTER_BASE+0x134)
-+#define PELMUX_TOCR (RASTER_BASE+0x138)
-+#define VIDEO_TOCRA (RASTER_BASE+0x13C)
-+#define VIDEO_TOCRB (RASTER_BASE+0x140)
-+#define YCRCB_TOCR (RASTER_BASE+0x144)
-+#define CURSOR_TOCR (RASTER_BASE+0x148)
-+#define VIDEO_TOCRC (RASTER_BASE+0x14C)
-+#define SHIFT_TOCR (RASTER_BASE+0x150)
-+#define BLINK_TOCR (RASTER_BASE+0x154)
-+#define REALITI_TCER (RASTER_BASE+0x180)
-+#define SIGVAL (RASTER_BASE+0x200)
-+#define SIGCTL (RASTER_BASE+0x204)
-+#define VSIGSTRTSTOP (RASTER_BASE+0x208)
-+#define HSIGSTRTSTOP (RASTER_BASE+0x20C)
-+#define SIGCLR (RASTER_BASE+0x210)
-+#define ACRATE (RASTER_BASE+0x214)
-+#define LUTCONT (RASTER_BASE+0x218)
-+#define VBLANKSTRTSTOP (RASTER_BASE+0x228)
-+#define HBLANKSTRTSTOP (RASTER_BASE+0x22C)
-+#define LUT (RASTER_BASE+0x400)
-+#define CURSORBLINK1 (RASTER_BASE+0x21C)
-+#define CURSORBLINK2 (RASTER_BASE+0x220)
-+#define CURSORBLINK (RASTER_BASE+0x224)
-+#define EOLOFFSET (RASTER_BASE+0x230)
-+#define FIFOLEVEL (RASTER_BASE+0x234)
-+#define GS_LUT2 (RASTER_BASE+0x280)
-+#define GS_LUT3 (RASTER_BASE+0x300)
-+#define COLOR_LUT (RASTER_BASE+0x400)
-+
-+/* 8006_0000 - 8006_ffff: SDRAM */
-+#define SDRAM_OFFSET 0x060000
-+#define SDRAM_BASE (EP93XX_AHB_BASE|SDRAM_OFFSET)
-+#define SDRAMGLOBALCFG (SDRAM_BASE+0x04)
-+#define SDRAMREFRESHTIME (SDRAM_BASE+0x08) /* Refresh Timer */
-+#define SDRAMBOOTSTATUS (SDRAM_BASE+0x0C)
-+#define SDRAMCFG0 (SDRAM_BASE+0x10) /* Configuration Register 0 (nSDCS0) */
-+#define SDRAMCFG1 (SDRAM_BASE+0x14) /* Configuration Register 1 (nSDCS1) */
-+#define SDRAMCFG2 (SDRAM_BASE+0x18) /* Configuration Register 2 (nSDCS2) */
-+#define SDRAMCFG3 (SDRAM_BASE+0x1C) /* Configuration Register 3 (nSDCS3) */
-+
-+/* 8008_0000 - 8008_ffff: SMC */
-+#define SMC_OFFSET 0x080000
-+#define SMC_BASE (EP93XX_AHB_BASE|SMC_OFFSET)
-+#define SMCBCR0 (SMC_BASE+0x00) /* 0x8008.0000 Bank config register 0 */
-+#define SMCBCR1 (SMC_BASE+0x04) /* 0x8008.0004 Bank config register 1 */
-+#define SMCBCR2 (SMC_BASE+0x08) /* 0x8008.0008 Bank config register 2 */
-+#define SMCBCR3 (SMC_BASE+0x0C) /* 0x8008.000C Bank config register 3 */
-+#define SMCBCR6 (SMC_BASE+0x18) /* 0x8008.0018 Bank config register 6 */
-+#define SMCBCR7 (SMC_BASE+0x1C) /* 0x8008.001C Bank config register 7 */
-+#define PC1ATTRIB (SMC_BASE+0x20) /* 0x8008.0020 PC1 Attribute Register */
-+#define PC1COMMON (SMC_BASE+0x24) /* 0x8008.0024 PC1 Common Register */
-+#define PC1IO (SMC_BASE+0x28) /* 0x8008.0028 PC1 IO Register */
-+#define PC2ATTRIB (SMC_BASE+0x30) /* 0x8008.0030 PC2 Attribute Register */
-+#define PC2COMMON (SMC_BASE+0x34) /* 0x8008.0034 PC2 Common Register */
-+#define PC2IO (SMC_BASE+0x38) /* 0x8008.0038 PC2 IO Register */
-+#define PCMCIACNT (SMC_BASE+0x40) /* 0x8008.0040 PCMCIA control register */
-+
-+/* 8009_0000 - 8009_ffff: Boot ROM */
-+#define BOOT_OFFSET 0x090000
-+#define BOOT_BASE (EP93XX_AHB_BASE|BOOT_OFFSET)
-+
-+/* 800A_0000 - 800A_ffff: IDE Interface */
-+#define IDE_OFFSET 0x0a0000
-+#define IDE_BASE (EP93XX_AHB_BASE|IDE_OFFSET)
-+/*#define IDECR (IDE_BASE+0x00)
-+ *#define IDECFG (IDE_BASE+0x04)
-+ *#define IDEMDMAOP (IDE_BASE+0x08)
-+ *#define IDEUDMAOP (IDE_BASE+0x0C)
-+ *#define IDEDATAOUT (IDE_BASE+0x10)
-+ *#define IDEDATAIN (IDE_BASE+0x14)
-+ *#define IDEMDMADATAOUT (IDE_BASE+0x18)
-+ *#define IDEMDMADATAIN (IDE_BASE+0x1C)
-+ *#define IDEUDMADATAOUT (IDE_BASE+0x20)
-+ *#define IDEUDMADATAIN (IDE_BASE+0x24)
-+ *#define IDEUDMASTATUS (IDE_BASE+0x28)
-+ *#define IDEUDMADEBUG (IDE_BASE+0x2C)
-+ *#define IDEUDMAWFST (IDE_BASE+0x30)
-+ *#define IDEUDMARFST (IDE_BASE+0x34)
-+ */
-+
-+/* 800B_0000 - 800B_FFFF: VIC 0 */
-+#define VIC0_OFFSET 0x0B0000
-+#define VIC0_BASE (EP93XX_AHB_BASE|VIC0_OFFSET)
-+#define VIC0 (VIC0_BASE+0x000)
-+#define VIC0IRQSTATUS (VIC0_BASE+0x000) /* R IRQ status register */
-+#define VIC0FIQSTATUS (VIC0_BASE+0x004) /* R FIQ status register */
-+#define VIC0RAWINTR (VIC0_BASE+0x008) /* R Raw interrupt status register */
-+#define VIC0INTSELECT (VIC0_BASE+0x00C) /* R/W Interrupt select register */
-+#define VIC0INTENABLE (VIC0_BASE+0x010) /* R/W Interrupt enable register */
-+#define VIC0INTENCLEAR (VIC0_BASE+0x014) /* W Interrupt enable clear register */
-+#define VIC0SOFTINT (VIC0_BASE+0x018) /* R/W Software interrupt register */
-+#define VIC0SOFTINTCLEAR (VIC0_BASE+0x01C) /* R/W Software interrupt clear register */
-+#define VIC0PROTECTION (VIC0_BASE+0x020) /* R/W Protection enable register */
-+#define VIC0VECTADDR (VIC0_BASE+0x030) /* R/W Vector address register */
-+#define VIC0DEFVECTADDR (VIC0_BASE+0x034) /* R/W Default vector address register */
-+#define VIC0VECTADDR00 (VIC0_BASE+0x100) /* R/W Vector address 00 register */
-+#define VIC0VECTADDR01 (VIC0_BASE+0x104) /* R/W Vector address 01 register */
-+#define VIC0VECTADDR02 (VIC0_BASE+0x108) /* R/W Vector address 02 register */
-+#define VIC0VECTADDR03 (VIC0_BASE+0x10C) /* R/W Vector address 03 register */
-+#define VIC0VECTADDR04 (VIC0_BASE+0x110) /* R/W Vector address 04 register */
-+#define VIC0VECTADDR05 (VIC0_BASE+0x114) /* R/W Vector address 05 register */
-+#define VIC0VECTADDR06 (VIC0_BASE+0x118) /* R/W Vector address 06 register */
-+#define VIC0VECTADDR07 (VIC0_BASE+0x11C) /* R/W Vector address 07 register */
-+#define VIC0VECTADDR08 (VIC0_BASE+0x120) /* R/W Vector address 08 register */
-+#define VIC0VECTADDR09 (VIC0_BASE+0x124) /* R/W Vector address 09 register */
-+#define VIC0VECTADDR10 (VIC0_BASE+0x128) /* R/W Vector address 10 register */
-+#define VIC0VECTADDR11 (VIC0_BASE+0x12C) /* R/W Vector address 11 register */
-+#define VIC0VECTADDR12 (VIC0_BASE+0x130) /* R/W Vector address 12 register */
-+#define VIC0VECTADDR13 (VIC0_BASE+0x134) /* R/W Vector address 13 register */
-+#define VIC0VECTADDR14 (VIC0_BASE+0x138) /* R/W Vector address 14 register */
-+#define VIC0VECTADDR15 (VIC0_BASE+0x13C) /* R/W Vector address 15 register */
-+#define VIC0VECTCNTL00 (VIC0_BASE+0x200) /* R/W Vector control 00 register */
-+#define VIC0VECTCNTL01 (VIC0_BASE+0x204) /* R/W Vector control 01 register */
-+#define VIC0VECTCNTL02 (VIC0_BASE+0x208) /* R/W Vector control 02 register */
-+#define VIC0VECTCNTL03 (VIC0_BASE+0x20C) /* R/W Vector control 03 register */
-+#define VIC0VECTCNTL04 (VIC0_BASE+0x210) /* R/W Vector control 04 register */
-+#define VIC0VECTCNTL05 (VIC0_BASE+0x214) /* R/W Vector control 05 register */
-+#define VIC0VECTCNTL06 (VIC0_BASE+0x218) /* R/W Vector control 06 register */
-+#define VIC0VECTCNTL07 (VIC0_BASE+0x21C) /* R/W Vector control 07 register */
-+#define VIC0VECTCNTL08 (VIC0_BASE+0x220) /* R/W Vector control 08 register */
-+#define VIC0VECTCNTL09 (VIC0_BASE+0x224) /* R/W Vector control 09 register */
-+#define VIC0VECTCNTL10 (VIC0_BASE+0x228) /* R/W Vector control 10 register */
-+#define VIC0VECTCNTL11 (VIC0_BASE+0x22C) /* R/W Vector control 11 register */
-+#define VIC0VECTCNTL12 (VIC0_BASE+0x230) /* R/W Vector control 12 register */
-+#define VIC0VECTCNTL13 (VIC0_BASE+0x234) /* R/W Vector control 13 register */
-+#define VIC0VECTCNTL14 (VIC0_BASE+0x238) /* R/W Vector control 14 register */
-+#define VIC0VECTCNTL15 (VIC0_BASE+0x23C) /* R/W Vector control 15 register */
-+#define VIC0ITCR (VIC0_BASE+0x300) /* R/W Test control register */
-+#define VIC0ITIP1 (VIC0_BASE+0x304) /* R Test input register (nVICIRQIN/nVICFIQIN) */
-+#define VIC0ITIP2 (VIC0_BASE+0x308) /* R Test input register (VICVECTADDRIN) */
-+#define VIC0ITOP1 (VIC0_BASE+0x30C) /* R Test output register (nVICIRQ/nVICFIQ) */
-+#define VIC0ITOP2 (VIC0_BASE+0x310) /* R Test output register (VICVECTADDROUT) */
-+#define VIC0PERIPHID0 (VIC0_BASE+0xFE0) /* R Peripheral ID register bits 7:0 */
-+#define VIC0PERIPHID1 (VIC0_BASE+0xFE4) /* R Peripheral ID register bits 15:8 */
-+#define VIC0PERIPHID2 (VIC0_BASE+0xFE8) /* R Peripheral ID register bits 23:16 */
-+#define VIC0PERIPHID3 (VIC0_BASE+0xFEC) /* R Peripheral ID register bits 31:24 */
-+
-+/* 800C_0000 - 800C_FFFF: VIC 1 */
-+#define VIC1_OFFSET 0x0C0000
-+#define VIC1_BASE (EP93XX_AHB_BASE|VIC1_OFFSET)
-+#define VIC1 (VIC1_BASE+0x000)
-+#define VIC1IRQSTATUS (VIC1_BASE+0x000) /* R IRQ status register */
-+#define VIC1FIQSTATUS (VIC1_BASE+0x004) /* R FIQ status register */
-+#define VIC1RAWINTR (VIC1_BASE+0x008) /* R Raw interrupt status register */
-+#define VIC1INTSELECT (VIC1_BASE+0x00C) /* R/W Interrupt select register */
-+#define VIC1INTENABLE (VIC1_BASE+0x010) /* R/W Interrupt enable register */
-+#define VIC1INTENCLEAR (VIC1_BASE+0x014) /* W Interrupt enable clear register */
-+#define VIC1SOFTINT (VIC1_BASE+0x018) /* R/W Software interrupt register */
-+#define VIC1SOFTINTCLEAR (VIC1_BASE+0x01C) /* R/W Software interrupt clear register */
-+#define VIC1PROTECTION (VIC1_BASE+0x020) /* R/W Protection enable register */
-+#define VIC1VECTADDR (VIC1_BASE+0x030) /* R/W Vector address register */
-+#define VIC1DEFVECTADDR (VIC1_BASE+0x034) /* R/W Default vector address register */
-+#define VIC1VECTADDR00 (VIC1_BASE+0x100) /* R/W Vector address 00 register */
-+#define VIC1VECTADDR01 (VIC1_BASE+0x104) /* R/W Vector address 01 register */
-+#define VIC1VECTADDR02 (VIC1_BASE+0x108) /* R/W Vector address 02 register */
-+#define VIC1VECTADDR03 (VIC1_BASE+0x10C) /* R/W Vector address 03 register */
-+#define VIC1VECTADDR04 (VIC1_BASE+0x110) /* R/W Vector address 04 register */
-+#define VIC1VECTADDR05 (VIC1_BASE+0x114) /* R/W Vector address 05 register */
-+#define VIC1VECTADDR06 (VIC1_BASE+0x118) /* R/W Vector address 06 register */
-+#define VIC1VECTADDR07 (VIC1_BASE+0x11C) /* R/W Vector address 07 register */
-+#define VIC1VECTADDR08 (VIC1_BASE+0x120) /* R/W Vector address 08 register */
-+#define VIC1VECTADDR09 (VIC1_BASE+0x124) /* R/W Vector address 09 register */
-+#define VIC1VECTADDR10 (VIC1_BASE+0x128) /* R/W Vector address 10 register */
-+#define VIC1VECTADDR11 (VIC1_BASE+0x12C) /* R/W Vector address 11 register */
-+#define VIC1VECTADDR12 (VIC1_BASE+0x130) /* R/W Vector address 12 register */
-+#define VIC1VECTADDR13 (VIC1_BASE+0x134) /* R/W Vector address 13 register */
-+#define VIC1VECTADDR14 (VIC1_BASE+0x138) /* R/W Vector address 14 register */
-+#define VIC1VECTADDR15 (VIC1_BASE+0x13C) /* R/W Vector address 15 register */
-+#define VIC1VECTCNTL00 (VIC1_BASE+0x200) /* R/W Vector control 00 register */
-+#define VIC1VECTCNTL01 (VIC1_BASE+0x204) /* R/W Vector control 01 register */
-+#define VIC1VECTCNTL02 (VIC1_BASE+0x208) /* R/W Vector control 02 register */
-+#define VIC1VECTCNTL03 (VIC1_BASE+0x20C) /* R/W Vector control 03 register */
-+#define VIC1VECTCNTL04 (VIC1_BASE+0x210) /* R/W Vector control 04 register */
-+#define VIC1VECTCNTL05 (VIC1_BASE+0x214) /* R/W Vector control 05 register */
-+#define VIC1VECTCNTL06 (VIC1_BASE+0x218) /* R/W Vector control 06 register */
-+#define VIC1VECTCNTL07 (VIC1_BASE+0x21C) /* R/W Vector control 07 register */
-+#define VIC1VECTCNTL08 (VIC1_BASE+0x220) /* R/W Vector control 08 register */
-+#define VIC1VECTCNTL09 (VIC1_BASE+0x224) /* R/W Vector control 09 register */
-+#define VIC1VECTCNTL10 (VIC1_BASE+0x228) /* R/W Vector control 10 register */
-+#define VIC1VECTCNTL11 (VIC1_BASE+0x22C) /* R/W Vector control 11 register */
-+#define VIC1VECTCNTL12 (VIC1_BASE+0x230) /* R/W Vector control 12 register */
-+#define VIC1VECTCNTL13 (VIC1_BASE+0x234) /* R/W Vector control 13 register */
-+#define VIC1VECTCNTL14 (VIC1_BASE+0x238) /* R/W Vector control 14 register */
-+#define VIC1VECTCNTL15 (VIC1_BASE+0x23C) /* R/W Vector control 15 register */
-+#define VIC1ITCR (VIC1_BASE+0x300) /* R/W Test control register */
-+#define VIC1ITIP1 (VIC1_BASE+0x304) /* R Test input register (nVICIRQIN/nVICFIQIN) */
-+#define VIC1ITIP2 (VIC1_BASE+0x308) /* R Test input register (VICVECTADDRIN) */
-+#define VIC1ITOP1 (VIC1_BASE+0x30C) /* R Test output register (nVICIRQ/nVICFIQ) */
-+#define VIC1ITOP2 (VIC1_BASE+0x310) /* R Test output register (VICVECTADDROUT) */
-+#define VIC1PERIPHID0 (VIC1_BASE+0xFE0) /* R Peripheral ID register bits 7:0 */
-+#define VIC1PERIPHID1 (VIC1_BASE+0xFE4) /* R Peripheral ID register bits 15:8 */
-+#define VIC1PERIPHID2 (VIC1_BASE+0xFE8) /* R Peripheral ID register bits 23:16 */
-+#define VIC1PERIPHID3 (VIC1_BASE+0xFEC) /* R Peripheral ID register bits 31:24 */
-+
-+/******************************************************************/
-+/* EP93xx APB Blocks */
-+/******************************************************************/
-+/* */
-+/* Start End Usage */
-+/* 8080_0000 8080_FFFF: Reserved */
-+/* 8081_0000 8081_FFFF: Timer */
-+/* 8082_0000 8082_FFFF: I2S */
-+/* 8083_0000 8083_FFFF: Security */
-+/* 8084_0000 8084_FFFF: GPIO */
-+/* 8085_0000 8085_FFFF: Reserved */
-+/* 8086_0000 8086_FFFF: Reserved */
-+/* 8087_0000 8087_FFFF: Reserved */
-+/* 8088_0000 8088_FFFF: AC97 */
-+/* 8089_0000 8089_FFFF: Reserved */
-+/* 808A_0000 808A_FFFF: SPI */
-+/* 808B_0000 808B_FFFF: IrDA */
-+/* 808C_0000 808C_FFFF: UART1 */
-+/* 808D_0000 808D_FFFF: UART2 */
-+/* 808E_0000 808E_FFFF: UART3 */
-+/* 808F_0000 808F_FFFF: Key Matrix */
-+/* 8090_0000 8090_FFFF: Touch Screen */
-+/* 8091_0000 8091_FFFF: PWM */
-+/* 8092_0000 8092_FFFF: Real Time Clock */
-+/* 8093_0000 8093_FFFF: Syscon */
-+/* 8094_0000 8094_FFFF: Watchdog */
-+/* 8095_0000 8FFF_FFFF: Reserved */
-+/* */
-+/******************************************************************/
-+
-+#define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)
-+
-+/*----------------------------------------------------------------*/
-+/* 8081_0000 - 8081_ffff: Timers */
-+/*----------------------------------------------------------------*/
-+
-+#define TIMERS_OFFSET 0x010000
-+#define TIMERS_BASE (EP93XX_APB_BASE|TIMERS_OFFSET)
-+
-+#define TIMER1LOAD (TIMERS_BASE+0x00)
-+#define TIMER1VALUE (TIMERS_BASE+0x04) /* RO */
-+#define TIMER1CONTROL (TIMERS_BASE+0x08)
-+#define TIMER1CLEAR (TIMERS_BASE+0x0C) /* WO */
-+
-+#define TIMER2LOAD (TIMERS_BASE+0x20)
-+#define TIMER2VALUE (TIMERS_BASE+0x24) /* RO */
-+#define TIMER2CONTROL (TIMERS_BASE+0x28)
-+#define TIMER2CLEAR (TIMERS_BASE+0x2C) /* WO */
-+
-+#define TIMER3LOAD (TIMERS_BASE+0x80)
-+#define TIMER3VALUE (TIMERS_BASE+0x84) /* RO */
-+#define TIMER3CONTROL (TIMERS_BASE+0x88)
-+#define TIMER3CLEAR (TIMERS_BASE+0x8C) /* WO */
-+
-+#define TIMER4VALUELOW (TIMERS_BASE+0x60)
-+#define TIMER4VALUEHIGH (TIMERS_BASE+0x64)
-+
-+/* 8082_0000 - 8082_ffff: I2S */
-+#define I2S_OFFSET 0x020000
-+#define I2S_BASE (EP93XX_APB_BASE|I2S_OFFSET)
-+
-+#define I2STxClkCfg (I2S_BASE+0x00) /* 8082.0000 R/W Transmitter clock config register */
-+#define I2SRxClkCfg (I2S_BASE+0x04) /* 8082.0004 R/W Receiver clock config register */
-+#define I2SGlSts (I2S_BASE+0x08) /* 8082.0008 R/W SAI Global Status register. */
-+#define I2SGlCtrl (I2S_BASE+0x0C) /* 8082.000C R/W SAI Global Control register */
-+
-+#define I2STX0Lft (I2S_BASE+0x10) /* 8082.0010 R/W Left TX data reg for channel 0 */
-+#define I2STX0Rt (I2S_BASE+0x14) /* 8082.0014 R/W Right TX data reg for channel 0 */
-+#define I2STX1Lft (I2S_BASE+0x18) /* 8082.0018 R/W Left TX data reg for channel 1 */
-+#define I2STX1Rt (I2S_BASE+0x1C) /* 8082.001C R/W Right TX data reg for channel 1 */
-+#define I2STX2Lft (I2S_BASE+0x20) /* 8082.0020 R/W Left TX data reg for channel 2 */
-+#define I2STX2Rt (I2S_BASE+0x24) /* 8082.0024 R/W Right TX data reg for channel 2 */
-+
-+#define I2STXLinCtrlData (I2S_BASE+0x28) /* 8082.0028 R/W TX Line Control data register */
-+#define I2STXCtrl (I2S_BASE+0x2C) /* 8082.002C R/W TX Control register */
-+#define I2STXWrdLen (I2S_BASE+0x30) /* 8082.0030 R/W TX Word Length */
-+#define I2STX0En (I2S_BASE+0x34) /* 8082.0034 R/W TX0 Channel Enable */
-+#define I2STX1En (I2S_BASE+0x38) /* 8082.0038 R/W TX1 Channel Enable */
-+#define I2STX2En (I2S_BASE+0x3C) /* 8082.003C R/W TX2 Channel Enable */
-+
-+#define I2SRX0Lft (I2S_BASE+0x40) /* 8082.0040 R Left RX data reg for channel 0 */
-+#define I2SRX0Rt (I2S_BASE+0x44) /* 8082.0044 R Right RX data reg for channel 0 */
-+#define I2SRX1Lft (I2S_BASE+0x48) /* 8082.0048 R Left RX data reg for channel 1 */
-+#define I2SRX1Rt (I2S_BASE+0x4C) /* 8082.004c R Right RX data reg for channel 1 */
-+#define I2SRX2Lft (I2S_BASE+0x50) /* 8082.0050 R Left RX data reg for channel 2 */
-+#define I2SRX2Rt (I2S_BASE+0x54) /* 8082.0054 R Right RX data reg for channel 2 */
-+
-+#define I2SRXLinCtrlData (I2S_BASE+0x58) /* 8082.0058 R/W RX Line Control data register */
-+#define I2SRXCtrl (I2S_BASE+0x5C) /* 8082.005C R/W RX Control register */
-+#define I2SRXWrdLen (I2S_BASE+0x60) /* 8082.0060 R/W RX Word Length */
-+#define I2SRX0En (I2S_BASE+0x64) /* 8082.0064 R/W RX0 Channel Enable */
-+#define I2SRX1En (I2S_BASE+0x68) /* 8082.0068 R/W RX1 Channel Enable */
-+#define I2SRX2En (I2S_BASE+0x6C) /* 8082.006C R/W RX2 Channel Enable */
-+
-+/* 8083_0000 - 8083_ffff: Security Block */
-+#define SECURITY_OFFSET 0x030000
-+#define SECURITY_BASE (EP93XX_APB_BASE|SECURITY_OFFSET)
-+#define SECFLG (SECURITY_BASE+0x2400)
-+#define SECEN (SECURITY_BASE+0x2410)
-+#define UNIQID (SECURITY_BASE+0x2440)
-+#define UNIQCHK (SECURITY_BASE+0x2450)
-+#define UNIQVAL (SECURITY_BASE+0x2460)
-+#define CLINBOOT (SECURITY_BASE+0x2480)
-+#define CLINVADDR (SECURITY_BASE+0x2484)
-+#define CLSETSKRNL (SECURITY_BASE+0x2488)
-+#define CLSKRNL (SECURITY_BASE+0x248C)
-+#define ITTMP (SECURITY_BASE+0x2490)
-+#define ETBL1 (SECURITY_BASE+0x24A0)
-+#define ETCL1 (SECURITY_BASE+0x24A4)
-+#define ETAPL1 (SECURITY_BASE+0x24A8)
-+#define ETSPTREG1 (SECURITY_BASE+0x24B0)
-+#define ETSPTREG2 (SECURITY_BASE+0x24B4)
-+#define ETSPTREG3 (SECURITY_BASE+0x24B8)
-+
-+#define SECID1 (SECURITY_BASE+0x2500)
-+#define SECID2 (SECURITY_BASE+0x2504)
-+#define SECCHK1 (SECURITY_BASE+0x2520)
-+#define SECCHK2 (SECURITY_BASE+0x2524)
-+#define SECVAL1 (SECURITY_BASE+0x2540)
-+#define SECVAL2 (SECURITY_BASE+0x2544)
-+
-+#define UNIQID2 (SECURITY_BASE+0x2700)
-+#define UNIQID3 (SECURITY_BASE+0x2704)
-+#define UNIQID4 (SECURITY_BASE+0x2708)
-+#define UNIQID5 (SECURITY_BASE+0x270C)
-+#define UNIQCHK2 (SECURITY_BASE+0x2710)
-+#define USRFLG (SECURITY_BASE+0x2714) /* llandre tells me this is also a CPU model flag */
-+#define UNIQVAL2 (SECURITY_BASE+0x2720)
-+#define UNIQVAL3 (SECURITY_BASE+0x2724)
-+#define UNIQVAL4 (SECURITY_BASE+0x2728)
-+#define TESTVAL (SECURITY_BASE+0x2744)
-+#define TESTCHK (SECURITY_BASE+0x2754)
-+#define ACHK1 (SECURITY_BASE+0x27A0)
-+#define ACHK2 (SECURITY_BASE+0x27A4)
-+#define PROCRESET (SECURITY_BASE+0x27A8)
-+#define TESTIDR (SECURITY_BASE+0x27AC)
-+#define AVAL1 (SECURITY_BASE+0x27B0)
-+#define AVAL2 (SECURITY_BASE+0x27B4)
-+#define AID1 (SECURITY_BASE+0x27C4)
-+#define AID2 (SECURITY_BASE+0x27C8)
-+#define ADYNREMAP (SECURITY_BASE+0x27D0)
-+#define ALTTMP (SECURITY_BASE+0x27D4)
-+#define PROCSIGN (SECURITY_BASE+0x27F0)
-+
-+#define ECLIDX (SECURITY_BASE+0x2800)
-+#define ECLINE0 (SECURITY_BASE+0x2810)
-+#define ECLINE1 (SECURITY_BASE+0x2814)
-+#define ECLINE2 (SECURITY_BASE+0x2818)
-+#define ECLINE3 (SECURITY_BASE+0x281C)
-+#define ECLINE4 (SECURITY_BASE+0x2820)
-+#define ECLINE5 (SECURITY_BASE+0x2824)
-+#define ECLINE6 (SECURITY_BASE+0x2828)
-+#define ECLINE7 (SECURITY_BASE+0x282C)
-+#define ETWIDX1 (SECURITY_BASE+0x2840)
-+#define ETWL1 (SECURITY_BASE+0x2844)
-+#define ETWIDX2 (SECURITY_BASE+0x2848)
-+#define ETWL2 (SECURITY_BASE+0x284C)
-+
-+#define ETSPT10 (SECURITY_BASE+0x4000)
-+#define ETSPT11 (SECURITY_BASE+0x4004)
-+#define ETSPT12 (SECURITY_BASE+0x4008)
-+#define ETSPT13 (SECURITY_BASE+0x400C)
-+
-+#define ETSPT2000 (SECURITY_BASE+0x6000)
-+#define ETSPT2020 (SECURITY_BASE+0x6020)
-+#define ETSPT2024 (SECURITY_BASE+0x6024)
-+
-+/* 8084_0000 - 8084_ffff: GPIO */
-+#define GPIO_OFFSET 0x040000
-+#define GPIO_BASE (EP93XX_APB_BASE|GPIO_OFFSET)
-+#define GPIO_PADR (GPIO_BASE+0x00)
-+#define GPIO_PBDR (GPIO_BASE+0x04)
-+#define GPIO_PCDR (GPIO_BASE+0x08)
-+
-+/* For support EP9301 - EP9302 arch */
-+
-+#if !defined(CONFIG_ARCH_EP9301) && !defined (CONFIG_ARCH_EP9302)
-+#define GPIO_PDDR (GPIO_BASE+0x0C)
-+#endif
-+
-+#define GPIO_PADDR (GPIO_BASE+0x10)
-+#define GPIO_PBDDR (GPIO_BASE+0x14)
-+#define GPIO_PCDDR (GPIO_BASE+0x18)
-+
-+/* For support EP9301 - EP9302 arch */
-+
-+#if !defined(CONFIG_ARCH_EP9301) && !defined (CONFIG_ARCH_EP9302)
-+#define GPIO_PDDDR (GPIO_BASE+0x1C)
-+#endif
-+
-+#define GPIO_PEDR (GPIO_BASE+0x20)
-+#define GPIO_PEDDR (GPIO_BASE+0x24)
-+#define GPIO_PFDR (GPIO_BASE+0x30)
-+#define GPIO_PFDDR (GPIO_BASE+0x34)
-+#define GPIO_PGDR (GPIO_BASE+0x38)
-+#define GPIO_PGDDR (GPIO_BASE+0x3C)
-+#define GPIO_PHDR (GPIO_BASE+0x40)
-+#define GPIO_PHDDR (GPIO_BASE+0x44)
-+#define GPIO_INTTYPE1 (GPIO_BASE+0x4C)
-+#define GPIO_INTTYPE2 (GPIO_BASE+0x50)
-+#define GPIO_FEOI (GPIO_BASE+0x54) /* WRITE ONLY - READ UNDEFINED */
-+#define GPIO_INTEN (GPIO_BASE+0x58)
-+#define GPIO_INTSTATUS (GPIO_BASE+0x5C)
-+#define GPIO_RAWINTSTASUS (GPIO_BASE+0x60)
-+#define GPIO_FDB (GPIO_BASE+0x64)
-+#define GPIO_PAPINDR (GPIO_BASE+0x68)
-+#define GPIO_PBPINDR (GPIO_BASE+0x6C)
-+#define GPIO_PCPINDR (GPIO_BASE+0x70)
-+#define GPIO_PDPINDR (GPIO_BASE+0x74)
-+#define GPIO_PEPINDR (GPIO_BASE+0x78)
-+#define GPIO_PFPINDR (GPIO_BASE+0x7C)
-+#define GPIO_PGPINDR (GPIO_BASE+0x80)
-+#define GPIO_PHPINDR (GPIO_BASE+0x84)
-+#define GPIO_AINTTYPE1 (GPIO_BASE+0x90)
-+#define GPIO_AINTTYPE2 (GPIO_BASE+0x94)
-+#define GPIO_AEOI (GPIO_BASE+0x98) /* WRITE ONLY - READ UNDEFINED */
-+#define GPIO_AINTEN (GPIO_BASE+0x9C)
-+#define GPIO_INTSTATUSA (GPIO_BASE+0xA0)
-+#define GPIO_RAWINTSTSTISA (GPIO_BASE+0xA4)
-+#define GPIO_ADB (GPIO_BASE+0xA8)
-+#define GPIO_BINTTYPE1 (GPIO_BASE+0xAC)
-+#define GPIO_BINTTYPE2 (GPIO_BASE+0xB0)
-+#define GPIO_BEOI (GPIO_BASE+0xB4) /* WRITE ONLY - READ UNDEFINED */
-+#define GPIO_BINTEN (GPIO_BASE+0xB8)
-+#define GPIO_INTSTATUSB (GPIO_BASE+0xBC)
-+#define GPIO_RAWINTSTSTISB (GPIO_BASE+0xC0)
-+#define GPIO_BDB (GPIO_BASE+0xC4)
-+#define GPIO_EEDRIVE (GPIO_BASE+0xC8)
-+/*#define Reserved (GPIO_BASE+0xCC) */
-+#define GPIO_TCR (GPIO_BASE+0xD0) /* Test Registers */
-+#define GPIO_TISRA (GPIO_BASE+0xD4) /* Test Registers */
-+#define GPIO_TISRB (GPIO_BASE+0xD8) /* Test Registers */
-+#define GPIO_TISRC (GPIO_BASE+0xDC) /* Test Registers */
-+#define GPIO_TISRD (GPIO_BASE+0xE0) /* Test Registers */
-+#define GPIO_TISRE (GPIO_BASE+0xE4) /* Test Registers */
-+#define GPIO_TISRF (GPIO_BASE+0xE8) /* Test Registers */
-+#define GPIO_TISRG (GPIO_BASE+0xEC) /* Test Registers */
-+#define GPIO_TISRH (GPIO_BASE+0xF0) /* Test Registers */
-+#define GPIO_TCER (GPIO_BASE+0xF4) /* Test Registers */
-+
-+/* 8088_0000 - 8088_ffff: Ac97 Controller (AAC) */
-+#define AC97_OFFSET 0x080000
-+#define AC97_BASE (EP93XX_APB_BASE|AC97_OFFSET)
-+#define AC97DR1 (AC97_BASE+0x00) /* 8088.0000 R/W Data read or written from/to FIFO1 */
-+#define AC97RXCR1 (AC97_BASE+0x04) /* 8088.0004 R/W Control register for receive */
-+#define AC97TXCR1 (AC97_BASE+0x08) /* 8088.0008 R/W Control register for transmit */
-+#define AC97SR1 (AC97_BASE+0x0C) /* 8088.000C R Status register */
-+#define AC97RISR1 (AC97_BASE+0x10) /* 8088.0010 R Raw interrupt status register */
-+#define AC97ISR1 (AC97_BASE+0x14) /* 8088.0014 R Interrupt Status */
-+#define AC97IE1 (AC97_BASE+0x18) /* 8088.0018 R/W Interrupt Enable */
-+#define AC97DR2 (AC97_BASE+0x20) /* 8088.0020 R/W Data read or written from/to FIFO2 */
-+#define AC97RXCR2 (AC97_BASE+0x24) /* 8088.0024 R/W Control register for receive */
-+#define AC97TXCR2 (AC97_BASE+0x28) /* 8088.0028 R/W Control register for transmit */
-+#define AC97SR2 (AC97_BASE+0x2C) /* 8088.002C R Status register */
-+#define AC97RISR2 (AC97_BASE+0x30) /* 8088.0030 R Raw interrupt status register */
-+#define AC97ISR2 (AC97_BASE+0x34) /* 8088.0034 R Interrupt Status */
-+#define AC97IE2 (AC97_BASE+0x38) /* 8088.0038 R/W Interrupt Enable */
-+#define AC97DR3 (AC97_BASE+0x40) /* 8088.0040 R/W Data read or written from/to FIFO3. */
-+#define AC97RXCR3 (AC97_BASE+0x44) /* 8088.0044 R/W Control register for receive */
-+#define AC97TXCR3 (AC97_BASE+0x48) /* 8088.0048 R/W Control register for transmit */
-+#define AC97SR3 (AC97_BASE+0x4C) /* 8088.004C R Status register */
-+#define AC97RISR3 (AC97_BASE+0x50) /* 8088.0050 R Raw interrupt status register */
-+#define AC97ISR3 (AC97_BASE+0x54) /* 8088.0054 R Interrupt Status */
-+#define AC97IE3 (AC97_BASE+0x58) /* 8088.0058 R/W Interrupt Enable */
-+#define AC97DR4 (AC97_BASE+0x60) /* 8088.0060 R/W Data read or written from/to FIFO4. */
-+#define AC97RXCR4 (AC97_BASE+0x64) /* 8088.0064 R/W Control register for receive */
-+#define AC97TXCR4 (AC97_BASE+0x68) /* 8088.0068 R/W Control register for transmit */
-+#define AC97SR4 (AC97_BASE+0x6C) /* 8088.006C R Status register */
-+#define AC97RISR4 (AC97_BASE+0x70) /* 8088.0070 R Raw interrupt status register */
-+#define AC97ISR4 (AC97_BASE+0x74) /* 8088.0074 R Interrupt Status */
-+#define AC97IE4 (AC97_BASE+0x78) /* 8088.0078 R/W Interrupt Enable */
-+#define AC97S1DATA (AC97_BASE+0x80) /* 8088.0080 R/W Data received/transmitted on SLOT1 */
-+#define AC97S2DATA (AC97_BASE+0x84) /* 8088.0084 R/W Data received/transmitted on SLOT2 */
-+#define AC97S12DATA (AC97_BASE+0x88) /* 8088.0088 R/W Data received/transmitted on SLOT12 */
-+#define AC97RGIS (AC97_BASE+0x8C) /* 8088.008C R/W Raw Global interrupt status register */
-+#define AC97GIS (AC97_BASE+0x90) /* 8088.0090 R Global interrupt status register */
-+#define AC97IM (AC97_BASE+0x94) /* 8088.0094 R/W Interrupt mask register */
-+#define AC97EOI (AC97_BASE+0x98) /* 8088.0098 W Interrupt clear register */
-+#define AC97GCR (AC97_BASE+0x9C) /* 8088.009C R/W Main Control register */
-+#define AC97RESET (AC97_BASE+0xA0) /* 8088.00A0 R/W RESET control register. */
-+#define AC97SYNC (AC97_BASE+0xA4) /* 8088.00A4 R/W SYNC control register. */
-+#define AC97GCIS (AC97_BASE+0xA8) /* 8088.00A8 R Global chan FIFO int status register */
-+
-+/* 808A_0000 - 808A_ffff: SSP */
-+#define SSP_OFFSET 0x0A0000
-+#define SSP_BASE (EP93XX_APB_BASE|SSP_OFFSET)
-+#define SSPCR0 (SSP_BASE+0x00)
-+#define SSPCR1 (SSP_BASE+0x04)
-+#define SSPDR (SSP_BASE+0x08)
-+#define SSPSR (SSP_BASE+0x0c)
-+#define SSPCPSR (SSP_BASE+0x10)
-+#define SSPIIR (SSP_BASE+0x14)
-+#define SSPICR (SSP_BASE+0x14)
-+
-+/* 808B_0000 - 808B_ffff: IrDA */
-+#define IRDA_OFFSET 0x0B0000
-+#define IRDA_BASE (EP93XX_APB_BASE|IRDA_OFFSET)
-+#define IrEnable (IRDA_BASE+0x00)
-+#define IrCtrl (IRDA_BASE+0x04)
-+#define IrAdrMatchVal (IRDA_BASE+0x08)
-+#define IrFlag (IRDA_BASE+0x0C)
-+#define IrData (IRDA_BASE+0x10)
-+#define IrDataTail1 (IRDA_BASE+0x14)
-+#define IrDataTail2 (IRDA_BASE+0x18)
-+#define IrDataTail3 (IRDA_BASE+0x1c)
-+#define IrRIB (IRDA_BASE+0x20)
-+#define IrTR0 (IRDA_BASE+0x24)
-+#define IrDMACR (IRDA_BASE+0x28)
-+#define SIRTR0 (IRDA_BASE+0x30)
-+#define MISR (IRDA_BASE+0x80)
-+#define MIMR (IRDA_BASE+0x84)
-+#define MIIR (IRDA_BASE+0x88)
-+#define FISR (IRDA_BASE+0x180)
-+#define FIMR (IRDA_BASE+0x184)
-+#define FIIR (IRDA_BASE+0x188)
-+
-+/* 808C_0000 - 808C_ffff: UART1 */
-+#define UART1_OFFSET 0x0C0000
-+#define UART1_BASE (EP93XX_APB_BASE|UART1_OFFSET)
-+#define UART1DR (UART1_BASE+0x000)
-+#define UART1RSR (UART1_BASE+0x004)
-+#define UART1ECR (UART1_BASE+0x004)
-+#define UART1CR_H (UART1_BASE+0x008)
-+#define UART1CR_M (UART1_BASE+0x00C)
-+#define UART1CR_L (UART1_BASE+0x010)
-+#define UART1CR (UART1_BASE+0x014)
-+#define UART1FR (UART1_BASE+0x018)
-+#define UART1IIR (UART1_BASE+0x01C)
-+#define UART1ICR (UART1_BASE+0x01C)
-+#define UART1ILPR (UART1_BASE+0x020)
-+#define UART1DMACR (UART1_BASE+0x028)
-+#define UART1TMR (UART1_BASE+0x084)
-+#define UART1MCR (UART1_BASE+0x100)
-+#define UART1MSR (UART1_BASE+0x104)
-+#define UART1TCR (UART1_BASE+0x108)
-+#define UART1TISR (UART1_BASE+0x10C)
-+#define UART1TOCR (UART1_BASE+0x110)
-+#define HDLC1CR (UART1_BASE+0x20c)
-+#define HDLC1AMV (UART1_BASE+0x210)
-+#define HDLC1AMSK (UART1_BASE+0x214)
-+#define HDLC1RIB (UART1_BASE+0x218)
-+#define HDLC1SR (UART1_BASE+0x21c)
-+
-+/* 808d_0000 - 808d_ffff: UART2 */
-+#define UART2_OFFSET 0x0D0000
-+#define UART2_BASE (EP93XX_APB_BASE|UART2_OFFSET)
-+#define UART2DR (UART2_BASE+0x00)
-+#define UART2RSR (UART2_BASE+0x04) /* Read */
-+#define UART2ECR (UART2_BASE+0x04) /* Write */
-+#define UART2CR_H (UART2_BASE+0x08)
-+#define UART2CR_M (UART2_BASE+0x0C)
-+#define UART2CR_L (UART2_BASE+0x10)
-+#define UART2CR (UART2_BASE+0x14)
-+#define UART2FR (UART2_BASE+0x18)
-+#define UART2IIR (UART2_BASE+0x1C) /* Read */
-+#define UART2ICR (UART2_BASE+0x1C) /* Write */
-+#define UART2ILPR (UART2_BASE+0x20)
-+#define UART2DMACR (UART2_BASE+0x28)
-+#define UART2TMR (UART2_BASE+0x84)
-+
-+/* 808e_0000 - 808e_ffff: UART3 */
-+#define UART3_OFFSET 0x0E0000
-+#define UART3_BASE (EP93XX_APB_BASE|UART3_OFFSET)
-+#define UART3DR (UART3_BASE+0x00)
-+#define UART3RSR (UART3_BASE+0x04) /* Read */
-+#define UART3ECR (UART3_BASE+0x04) /* Write */
-+#define UART3CR_H (UART3_BASE+0x08)
-+#define UART3CR_M (UART3_BASE+0x0C)
-+#define UART3CR_L (UART3_BASE+0x10)
-+#define UART3CR (UART3_BASE+0x14)
-+#define UART3FR (UART3_BASE+0x18)
-+#define UART3IIR (UART3_BASE+0x1C) /* Read */
-+#define UART3ICR (UART3_BASE+0x1C) /* Write */
-+#define UART3ILPR (UART3_BASE+0x20)
-+#define UART3DMACR (UART3_BASE+0x28)
-+#define UART3TCR (UART3_BASE+0x80)
-+#define UART3TISR (UART3_BASE+0x88)
-+#define UART3TOCR (UART3_BASE+0x8C)
-+#define UART3TMR (UART3_BASE+0x84)
-+#define UART3MCR (UART3_BASE+0x100) /* Modem Control Reg */
-+#define UART3MSR (UART3_BASE+0x104) /* Modem Status Reg */
-+#define UART3HDLCCR (UART3_BASE+0x20C) /* HDLC Registers */
-+#define UART3HDLCAMV (UART3_BASE+0x210) /* HDLC Registers */
-+#define UART3HDLCAMSK (UART3_BASE+0x214) /* HDLC Registers */
-+#define UART3HDLCCRIB (UART3_BASE+0x218) /* HDLC Registers */
-+#define UART3HDLCSR (UART3_BASE+0x21C) /* HDLC Registers */
-+
-+/* 808f_0000 - 808f_ffff: KEY Matrix */
-+#define KEY_OFFSET 0x0F0000
-+#define KEY_BASE (EP93XX_APB_BASE|KEY_OFFSET)
-+#define SCANINIT (KEY_BASE+0x00)
-+#define KEY_DIAG (KEY_BASE+0x04)
-+#define KEY_REG (KEY_BASE+0x08)
-+#define KEY_TCR (KEY_BASE+0x10)
-+#define KEY_TISR (KEY_BASE+0x14)
-+#define KEY_TOCR (KEY_BASE+0x18)
-+
-+/* 8090_0000 - 8090_ffff: Analog Resistive Touchscreen */
-+#define TOUCH_OFFSET 0x100000
-+#define TOUCH_BASE (EP93XX_APB_BASE|TOUCH_OFFSET)
-+#define TSSetup (TOUCH_BASE+0x00) /* R/W touchscreen controller setup control register. */
-+#define TSXYMaxMin (TOUCH_BASE+0x04) /* R/W touchscreen controller max/min register. */
-+#define TSXYResult (TOUCH_BASE+0x08) /* R touchscreen controller result register. */
-+#define TSDischarge (TOUCH_BASE+0x0C) /* LOCKED R/W touchscreen Switch Matrix control register. */
-+#define TSXSample (TOUCH_BASE+0x10) /* LOCKED R/W touchscreen Switch Matrix control register. */
-+#define TSYSample (TOUCH_BASE+0x14) /* LOCKED R/W touchscreen Switch Matrix control register. */
-+#define TSDirect (TOUCH_BASE+0x18) /* LOCKED R/W touchscreen Switch Matrix control register. */
-+#define TSDetect (TOUCH_BASE+0x1C) /* LOCKED R/W touchscreen Switch Matrix control register. */
-+#define TSSWLock (TOUCH_BASE+0x20) /* NA R/W touchscreen software lock register. */
-+#define TSSetup2 (TOUCH_BASE+0x24) /* R/W touchscreen setup control register #2. */
-+
-+/* 8091_0000 - 8091_ffff: PWM */
-+#define PWM_OFFSET 0x110000
-+#define PWM_BASE (EP93XX_APB_BASE|PWM_OFFSET)
-+#define PWM0_TC (PWM_BASE+0x00) /* 80910000 R/W PWM_0 Terminal Count */
-+#define PWM0_DC (PWM_BASE+0x04) /* 80910004 R/W PWM_0 Duty Cycle */
-+#define PWM0_EN (PWM_BASE+0x08) /* 80910008 R/W PWM_0 Enable */
-+#define PWM0_INV (PWM_BASE+0x0C) /* 8091000C R/W PWM_0 Invert */
-+#define PWM0_SYNC (PWM_BASE+0x10) /* 80910010 R/W PWM_0 Synchronous */
-+#define PWM1_TC (PWM_BASE+0x20) /* 80910020 R/W PWM_1 Terminal Count */
-+#define PWM1_DC (PWM_BASE+0x24) /* 80910024 R/W PWM_1 Duty Cycle */
-+#define PWM1_EN (PWM_BASE+0x28) /* 80910028 R/W PWM_1 Enable */
-+#define PWM1_INV (PWM_BASE+0x2C) /* 8091002C R/W PWM_1 Invert */
-+#define PWM1_SYNC (PWM_BASE+0x30) /* 80910030 R/W PWM_1 Synchronous */
-+
-+/* 8092_0000 - 8092_ffff: RTC */
-+#define RTC_OFFSET 0x120000
-+#define RTC_BASE (EP93XX_APB_BASE|RTC_OFFSET)
-+#define RTCDR (RTC_BASE+0x00)
-+#define RTCMR (RTC_BASE+0x04)
-+#define RTCSTAT (RTC_BASE+0x08) /* Read */
-+#define RTCEOI (RTC_BASE+0x08) /* Write */
-+#define RTCLR (RTC_BASE+0x0C)
-+#define RTCCR (RTC_BASE+0x10)
-+#define RTCSCOMP (RTC_BASE+0x108)
-+
-+/* 8093_0000 - 8093_ffff: CSC/Syscon PLL, clock control, & misc. stuff */
-+#define SYSCON_OFFSET 0x130000
-+#define SYSCON_BASE (EP93XX_APB_BASE|SYSCON_OFFSET)
-+#define SYSCON_PWRSR (SYSCON_BASE+0x0000)
-+#define SYSCON_PWRCNT (SYSCON_BASE+0x0004)
-+#define SYSCON_HALT (SYSCON_BASE+0x0008)
-+#define SYSCON_STBY (SYSCON_BASE+0x000c)
-+#define SYSCON_BLEOI (SYSCON_BASE+0x0010)
-+#define SYSCON_MCEOI (SYSCON_BASE+0x0014)
-+#define SYSCON_TEOI (SYSCON_BASE+0x0018)
-+#define SYSCON_STFCLR (SYSCON_BASE+0x001c)
-+#define SYSCON_CLKSET1 (SYSCON_BASE+0x0020)
-+#define SYSCON_CLKSET2 (SYSCON_BASE+0x0024)
-+#define SYSCON_RESV00 (SYSCON_BASE+0x0028)
-+#define SYSCON_RESV01 (SYSCON_BASE+0x002c)
-+#define SYSCON_RESV02 (SYSCON_BASE+0x0030)
-+#define SYSCON_RESV03 (SYSCON_BASE+0x0034)
-+#define SYSCON_RESV04 (SYSCON_BASE+0x0038)
-+#define SYSCON_RESV05 (SYSCON_BASE+0x003c)
-+#define SYSCON_SCRREG0 (SYSCON_BASE+0x0040)
-+#define SYSCON_SCRREG1 (SYSCON_BASE+0x0044)
-+#define SYSCON_CLKTEST (SYSCON_BASE+0x0048)
-+#define SYSCON_USBRESET (SYSCON_BASE+0x004c)
-+#define SYSCON_APBWAIT (SYSCON_BASE+0x0050)
-+#define SYSCON_BMAR (SYSCON_BASE+0x0054)
-+#define SYSCON_BOOTCLR (SYSCON_BASE+0x0058)
-+#define SYSCON_DEVCFG (SYSCON_BASE+0x0080)
-+#define SYSCON_VIDDIV (SYSCON_BASE+0x0084)
-+#define SYSCON_MIRDIV (SYSCON_BASE+0x0088)
-+#define SYSCON_I2SDIV (SYSCON_BASE+0x008C)
-+#define SYSCON_KTDIV (SYSCON_BASE+0x0090)
-+#define SYSCON_CHIPID (SYSCON_BASE+0x0094)
-+#define SYSCON_TSTCR (SYSCON_BASE+0x0098)
-+#define SYSCON_SYSCFG (SYSCON_BASE+0x009C)
-+#define SYSCON_SWLOCK (SYSCON_BASE+0x00C0)
-+
-+#define SYSCON_DEVCFG_KEYS 0x00000002
-+#define SYSCON_DEVCFG_RasOnP3 0x00000010
-+#define SYSCON_DEVCFG_GONK 0x08000000
-+
-+#define SYSCON_KTDIV_KEN 0x00008000
-+
-+/* 8094_0000 - 8094_ffff: Watchdog */
-+#define WATCHDOG_OFFSET 0x140000
-+#define WATCHDOG_BASE (EP93XX_APB_BASE|WATCHDOG_OFFSET)
-+#define WATCHDOG (WATCHDOG_BASE+0x00)
-+#define WDSTATUS (WATCHDOG_BASE+0x04)
-+
-+#endif /* __ASM_ARCH_HARDWARE_H */
-diff --git a/include/asm-arm/arch-ep93xx/regs_ac97.h b/include/asm-arm/arch-ep93xx/regs_ac97.h
-new file mode 100644
-index 0000000..efe0015
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_ac97.h
-@@ -0,0 +1,168 @@
-+/*=============================================================================
-+ * FILE: regs_ac97.h
-+ *
-+ * DESCRIPTION: Ac'97 Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *=============================================================================
-+ */
-+#ifndef _REGS_AC97_H_
-+#define _REGS_AC97_H_
-+
-+/* Bit definitionses */
-+#define AC97ISR_RIS 8
-+#define AC97ISR_TIS 4
-+#define AC97ISR_RTIS 2
-+#define AC97ISR_TCIS 1
-+
-+#define AC97RGIS_SLOT1TXCOMPLETE 0x01
-+#define AC97RGIS_SLOT2RXVALID 0x02
-+#define AC97RGIS_GPIOTXCOMPLETE 0x04
-+#define AC97RGIS_GPIOINTRX 0x08
-+#define AC97RGIS_RWIS 0x10
-+#define AC97RGIS_CODECREADY 0x20
-+#define AC97RGIS_SLOT2TXCOMPLETE 0x40
-+
-+#define AC97SR_RXFE 0x0001
-+#define AC97SR_TXFE 0x0002
-+#define AC97SR_RXFF 0x0004
-+#define AC97SR_TXFF 0x0008
-+#define AC97SR_TXBUSY 0x0010
-+#define AC97SR_RXOE 0x0020
-+#define AC97SR_TXUE 0x0040
-+
-+#define AC97GSR_IFE 0x1
-+#define AC97GSR_LOOP 0x2
-+#define AC97GSR_OVERRIDECODECREADY 0x4
-+
-+#define AC97RESET_TIMEDRESET 0x1
-+#define AC97RESET_FORCEDRESET 0x2
-+#define AC97RESET_EFORCER 0x4
-+
-+#define AC97RXCR_REN 0x1
-+
-+#define AC97TXCR_TEN 0x1
-+
-+/*
-+ * The Ac97 Codec registers, accessable through the Ac-link.
-+ * These are not controller registers and are not memory mapped.
-+ * Includes registers specific to CS4202 (Beavis).
-+ */
-+#define AC97_REG_OFFSET_MASK 0x0000007E
-+
-+#define AC97_00_RESET 0x00000000
-+#define AC97_02_MASTER_VOL 0x00000002
-+#define AC97_04_HEADPHONE_VOL 0x00000004
-+#define AC97_06_MONO_VOL 0x00000006
-+#define AC97_08_TONE 0x00000008
-+#define AC97_0A_PC_BEEP_VOL 0x0000000A
-+#define AC97_0C_PHONE_VOL 0x0000000C
-+#define AC97_0E_MIC_VOL 0x0000000E
-+#define AC97_10_LINE_IN_VOL 0x00000010
-+#define AC97_12_CD_VOL 0x00000012
-+#define AC97_14_VIDEO_VOL 0x00000014
-+#define AC97_16_AUX_VOL 0x00000016
-+#define AC97_18_PCM_OUT_VOL 0x00000018
-+#define AC97_1A_RECORD_SELECT 0x0000001A
-+#define AC97_1C_RECORD_GAIN 0x0000001C
-+#define AC97_1E_RESERVED_1E 0x0000001E
-+#define AC97_20_GENERAL_PURPOSE 0x00000020
-+#define AC97_22_3D_CONTROL 0x00000022
-+#define AC97_24_MODEM_RATE 0x00000024
-+#define AC97_26_POWERDOWN 0x00000026
-+#define AC97_28_EXT_AUDIO_ID 0x00000028
-+#define AC97_2A_EXT_AUDIO_POWER 0x0000002A
-+#define AC97_2C_PCM_FRONT_DAC_RATE 0x0000002C
-+#define AC97_2E_PCM_SURR_DAC_RATE 0x0000002E
-+#define AC97_30_PCM_LFE_DAC_RATE 0x00000030
-+#define AC97_32_PCM_LR_ADC_RATE 0x00000032
-+#define AC97_34_MIC_ADC_RATE 0x00000034
-+#define AC97_36_6CH_VOL_C_LFE 0x00000036
-+#define AC97_38_6CH_VOL_SURROUND 0x00000038
-+#define AC97_3A_SPDIF_CONTROL 0x0000003A
-+#define AC97_3C_EXT_MODEM_ID 0x0000003C
-+#define AC97_3E_EXT_MODEM_POWER 0x0000003E
-+#define AC97_40_LINE1_CODEC_RATE 0x00000040
-+#define AC97_42_LINE2_CODEC_RATE 0x00000042
-+#define AC97_44_HANDSET_CODEC_RATE 0x00000044
-+#define AC97_46_LINE1_CODEC_LEVEL 0x00000046
-+#define AC97_48_LINE2_CODEC_LEVEL 0x00000048
-+#define AC97_4A_HANDSET_CODEC_LEVEL 0x0000004A
-+#define AC97_4C_GPIO_PIN_CONFIG 0x0000004C
-+#define AC97_4E_GPIO_PIN_TYPE 0x0000004E
-+#define AC97_50_GPIO_PIN_STICKY 0x00000050
-+#define AC97_52_GPIO_PIN_WAKEUP 0x00000052
-+#define AC97_54_GPIO_PIN_STATUS 0x00000054
-+#define AC97_56_RESERVED 0x00000056
-+#define AC97_58_RESERVED 0x00000058
-+#define AC97_5A_CRYSTAL_REV_N_FAB_ID 0x0000005A
-+#define AC97_5C_TEST_AND_MISC_CTRL 0x0000005C
-+#define AC97_5E_AC_MODE 0x0000005E
-+#define AC97_60_MISC_CRYSTAL_CONTROL 0x00000060
-+#define AC97_62_VENDOR_RESERVED 0x00000062
-+#define AC97_64_DAC_SRC_PHASE_INCR 0x00000064
-+#define AC97_66_ADC_SRC_PHASE_INCR 0x00000066
-+#define AC97_68_RESERVED_68 0x00000068
-+#define AC97_6A_SERIAL_PORT_CONTROL 0x0000006A
-+#define AC97_6C_VENDOR_RESERVED 0x0000006C
-+#define AC97_6E_VENDOR_RESERVED 0x0000006E
-+#define AC97_70_BDI_CONFIG 0x00000070
-+#define AC97_72_BDI_WAKEUP 0x00000072
-+#define AC97_74_VENDOR_RESERVED 0x00000074
-+#define AC97_76_CAL_ADDRESS 0x00000076
-+#define AC97_78_CAL_DATA 0x00000078
-+#define AC97_7A_VENDOR_RESERVED 0x0000007A
-+#define AC97_7C_VENDOR_ID1 0x0000007C
-+#define AC97_7E_VENDOR_ID2 0x0000007E
-+
-+#ifndef __ASSEMBLY__
-+
-+/* enum type for use with reg AC97_RECORD_SELECT */
-+enum Ac97RecordSources {
-+ RECORD_MIC = 0x0000,
-+ RECORD_CD = 0x0101,
-+ RECORD_VIDEO_IN = 0x0202,
-+ RECORD_AUX_IN = 0x0303,
-+ RECORD_LINE_IN = 0x0404,
-+ RECORD_STEREO_MIX = 0x0505,
-+ RECORD_MONO_MIX = 0x0606,
-+ RECORD_PHONE_IN = 0x0707
-+};
-+
-+#endif /* __ASSEMBLY__ */
-+
-+/*
-+ * Sample rates supported directly in AC97_PCM_FRONT_DAC_RATE and
-+ * AC97_PCM_LR_ADC_RATE.
-+ */
-+#define Ac97_Fs_8000 0x1f40
-+#define Ac97_Fs_11025 0x2b11
-+#define Ac97_Fs_16000 0x3e80
-+#define Ac97_Fs_22050 0x5622
-+#define Ac97_Fs_32000 0x7d00
-+#define Ac97_Fs_44100 0xac44
-+#define Ac97_Fs_48000 0xbb80
-+
-+/*
-+ * RSIZE and TSIZE in AC97RXCR and AC97TXCR
-+ */
-+#define Ac97_SIZE_20 2
-+#define Ac97_SIZE_18 1
-+#define Ac97_SIZE_16 0
-+#define Ac97_SIZE_12 3
-+
-+#endif /* _REGS_AC97_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_dma.h b/include/asm-arm/arch-ep93xx/regs_dma.h
-new file mode 100644
-index 0000000..926965d
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_dma.h
-@@ -0,0 +1,269 @@
-+/*****************************************************************************
-+ *
-+ * linux/include/asm-arm/arch-ep93xx/regs_dma.h
-+ *
-+ * Register definitions for the ep93xx dma channel registers.
-+ *
-+ * Copyright (C) 2003 Cirrus Logic
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ ****************************************************************************/
-+#ifndef _REGS_DMA_H_
-+#define _REGS_DMA_H_
-+
-+/*****************************************************************************
-+ * 0x8000.0000 -> 0x8000.003C M2P Channel 0 Registers (Tx)
-+ * 0x8000.0040 -> 0x8000.007C M2P Channel 1 Registers (Rx)
-+ * 0x8000.0080 -> 0x8000.00BC M2P Channel 2 Registers (Tx)
-+ * 0x8000.00C0 -> 0x8000.00FC M2P Channel 3 Registers (Rx)
-+ * 0x8000.0100 -> 0x8000.013C M2M Channel 0 Registers
-+ * 0x8000.0140 -> 0x8000.017C M2M Channel 1 Registers
-+ * 0x8000.0180 -> 0x8000.01BC Not Used
-+ * 0x8000.01C0 -> 0x8000.01FC Not Used
-+ * 0x8000.0200 -> 0x8000.023C M2P Channel 5 Registers (Rx)
-+ * 0x8000.0240 -> 0x8000.027C M2P Channel 4 Registers (Tx)
-+ * 0x8000.0280 -> 0x8000.02BC M2P Channel 7 Registers (Rx)
-+ * 0x8000.02C0 -> 0x8000.02FC M2P Channel 6 Registers (Tx)
-+ * 0x8000.0300 -> 0x8000.033C M2P Channel 9 Registers (Rx)
-+ * 0x8000.0340 -> 0x8000.037C M2P Channel 8 Registers (Tx)
-+ * 0x8000.0380 DMA Channel Arbitration register
-+ * 0x8000.03C0 DMA Global Interrupt register
-+ * 0x8000.03C4 -> 0x8000.03FC Not Used
-+ *
-+ *
-+ * Internal M2P/P2M Channel Register Map
-+ *
-+ * Offset Name Access Bits Reset Value
-+ * 0x00 CONTROL R/W 6 0
-+ * 0x04 INTERRUPT R/W TC* 3 0
-+ * 0x08 PPALLOC R/W 4 channel dependant
-+ * (see reg description)
-+ * 0x0C STATUS RO 8 0
-+ * 0x10 reserved
-+ * 0x14 REMAIN RO 16 0
-+ * 0X18 Reserved
-+ * 0X1C Reserved
-+ * 0x20 MAXCNT0 R/W 16 0
-+ * 0x24 BASE0 R/W 32 0
-+ * 0x28 CURRENT0 RO 32 0
-+ * 0x2C Reserved
-+ * 0x30 MAXCNT1 R/W 16 0
-+ * 0x34 BASE1 R/W 32 0
-+ * 0X38 CURRENT1 RO 32 0
-+ * 0X3C Reserved
-+ *
-+ * M2M Channel Register Map
-+ * Offset Name Access Bits Reset Value
-+ *
-+ * 0x00 CONTROL R/W 22 0
-+ * 0x04 INTERRUPT R/W TC* 3 0
-+ * 0x08 Reserved
-+ * 0x0C STATUS R/W TC* 14 0
-+ * 0x10 BCR0 R/W 16 0
-+ * 0x14 BCR1 R/W 16 0
-+ * 0x18 SAR_BASE0 R/W 32 0
-+ * 0x1C SAR_BASE1 R/W 32 0
-+ * 0x20 Reserved
-+ * 0x24 SAR_CURRENT0 RO 32 0
-+ * 0x28 SAR_CURRENT1 RO 32 0
-+ * 0x2C DAR_BASE0 R/W 32 0
-+ * 0x30 DAR_BASE1 R/W 32 0
-+ * 0x34 DAR_CURRENT0 RO 32 0
-+ * 0X38 Reserved
-+ * 0X3C DAR_CURRENT1 RO 32 0
-+ * * Write this location once to clear the bit (see
-+ * Interrupt/Status register description for which bits
-+ * this rule applies to).
-+ *
-+ ****************************************************************************/
-+
-+#ifndef __ASSEMBLY__
-+/*
-+ * DMA Register Base addresses
-+ */
-+static unsigned int const DMAM2PChannelBase[10] = {
-+ DMA_M2P_TX_0_BASE,
-+ DMA_M2P_RX_1_BASE,
-+ DMA_M2P_TX_2_BASE,
-+ DMA_M2P_RX_3_BASE,
-+ DMA_M2P_TX_4_BASE,
-+ DMA_M2P_RX_5_BASE,
-+ DMA_M2P_TX_6_BASE,
-+ DMA_M2P_RX_7_BASE,
-+ DMA_M2P_TX_8_BASE,
-+ DMA_M2P_RX_9_BASE
-+};
-+
-+static unsigned int const DMAM2MChannelBase[2] = {
-+ DMA_M2M_0_BASE,
-+ DMA_M2M_1_BASE
-+};
-+
-+#endif /* __ASSEMBLY__ */
-+
-+/*----------------------------------------------------------------------------------*/
-+/* M2P Registers */
-+/*----------------------------------------------------------------------------------*/
-+/*
-+ * M2P CONTROL register bit defines
-+ */
-+#define CONTROL_M2P_STALLINTEN 0x00000001 /* Enables the STALL interrupt */
-+#define CONTROL_M2P_NFBINTEN 0x00000002 /* Enables the NFB interrupt */
-+#define CONTROL_M2P_CHERRORINTEN 0x00000008 /* Enables the ChError interrupt */
-+#define CONTROL_M2P_ENABLE 0x00000010 /* Enables the channel */
-+#define CONTROL_M2P_ABRT 0x00000020 /* Determines how DMA behaves in */
-+ /* NEXT state with peripheral */
-+ /* error */
-+ /* 0: NEXT -> ON, ignore error */
-+ /* 1: NEXT -> STALL, disable ch. */
-+#define CONTROL_M2P_ICE 0x00000040 /* Ignore Channel Error */
-+
-+/*
-+ * M2P INTERRUPT register bit defines
-+ */
-+#define INTERRUPT_M2P_STALLINT 0x00000001 /* Indicates channel stalled. */
-+#define INTERRUPT_M2P_NFBINT 0x00000002 /* Indicates channel is hungry. */
-+#define INTERRUPT_M2P_CHERRORINT 0x00000008 /* Peripheral detects error */
-+
-+/*
-+ * STATUS register bit defines
-+ */
-+#define STATUS_M2P_STALL 0x00000001 /* A '1' indicates channel is */
-+ /* stalled */
-+#define STATUS_M2P_NFB 0x00000002 /* A '1' indicates channel has moved */
-+ /* from NEXT state to ON state, but */
-+ /* waiting for next buffer to be */
-+ /* programmed. */
-+#define STATUS_M2P_CHERROR 0x00000008 /* Enables the ChError interrupt */
-+#define STATUS_M2P_CURRENT_MASK 0x00000030 /* Current state of the FSM */
-+#define STATUS_M2P_CURRENT_SHIFT 4
-+#define STATUS_M2P_NEXTBUFFER 0x00000040 /* Informs the int handler after an */
-+ /* NFB int which pair of maxcnt and */
-+ /* base regs to update. */
-+#define STATUS_M2P_BYTES_MASK 0x0000f800 /* number of valid DMA data */
-+#define STATUS_M2P_BYTES_SHIFT 7 /* currently in */
-+ /* packer/unpacker */
-+
-+#define STATUS_M2P_DMA_NO_BUF 0x00000000
-+#define STATUS_M2P_DMA_BUF_ON 0x00000010
-+#define STATUS_M2P_DMA_BUF_NEXT 0x00000020
-+
-+/*
-+ * Register masks to mask off reserved bits after reading register.
-+ */
-+#define M2P_MASK_PPALLOC 0x0000000f
-+#define M2P_MASK_REMAIN 0x0000ffff
-+#define M2P_MASK_MAXCNT0 0x0000ffff
-+#define M2P_MASK_BASE0 0xffffffff
-+#define M2P_MASK_CURRENT0 0xffffffff
-+#define M2P_MASK_MAXCNT1 0x0000ffff
-+#define M2P_MASK_BASE1 0xffffffff
-+#define M2P_MASK_CURRENT1 0xffffffff
-+
-+/*----------------------------------------------------------------------------------*/
-+/* M2M Registers */
-+/*----------------------------------------------------------------------------------*/
-+
-+#define CONTROL_M2M_STALLINTEN 0x00000001 /* Enables the STALL interrupt */
-+#define CONTROL_M2M_SCT 0x00000002 /* Source Copy Transfer. Setup a */
-+ /* block transfer from 1 memory source */
-+ /* location. */
-+#define CONTROL_M2M_DONEINTEN 0x00000004 /* Enables the DONE interrupt which */
-+ /* indicates if the xfer completed */
-+ /* successfully */
-+#define CONTROL_M2M_ENABLE 0x00000008 /* Enables the channel */
-+#define CONTROL_M2M_START 0x00000010 /* Initiates the xfer. 'software trigger' */
-+#define CONTROL_M2M_BWC_MASK 0x000001e0 /* Bandwidth control. Indicate number of */
-+#define CONTROL_M2M_BWC_SHIFT 5 /* bytes in a transfer. */
-+#define CONTROL_M2M_PW_MASK 0x00000600 /* Peripheral width. Used for xfers */
-+#define CONTROL_M2M_PW_SHIFT 9 /* between memory and external peripheral. */
-+ /* 00: byte, 01: halfword, 10: word. */
-+#define CONTROL_M2M_DAH 0x00000800 /* Destination Address Hold */
-+#define CONTROL_M2M_SAH 0x00001000 /* Source Address Hold */
-+#define CONTROL_M2M_TM_MASK 0x00006000 /* Transfer Mode. 00: sw triggered, */
-+#define CONTROL_M2M_TM_SHIFT 13 /* 01: hw initiated M2P, 01: hw initiated P2M */
-+#define CONTROL_M2M_ETDP_MASK 0x00018000 /* End-of-Transfer/Terminal Count pin */
-+#define CONTROL_M2M_ETDP_SHIFT 15 /* direction and polarity. */
-+#define CONTROL_M2M_DACKP 0x00020000 /* DMA acknowledge pin polarity */
-+
-+#define CONTROL_M2M_DREQP_MASK 0x00180000 /* DMA request pin polarity. must be set */
-+#define CONTROL_M2M_DREQP_SHIFT 19 /* before enable bit. */
-+#define CONTROL_M2M_NFBINTEN 0x00200000 /* Enables generation of the NFB interrupt. */
-+#define CONTROL_M2M_RSS_MASK 0x00c00000 /* Request source selection: */
-+#define CONTROL_M2M_RSS_SHIFT 22 /* 000 - External DReq[0] */
-+ /* 001 - External DReq[1] */
-+ /* 01X - Internal SSPRx */
-+ /* 10X - Internal SSPTx */
-+ /* 11X - Internal IDE */
-+#define CONTROL_M2M_NO_HDSK 0x01000000 /* No handshake. When set the peripheral doesn't */
-+ /* require the regular handshake protocal. Must */
-+ /* be set for SSP and IDE operations, optional */
-+ /* for external peripherals. */
-+#define CONTROL_M2M_PWSC_MASK 0xfe000000 /* Peripheral wait states count. Gives the latency */
-+#define CONTROL_M2M_PWSC_SHIFT 25 /* (in PCLK cycles) needed by the peripheral to */
-+ /* deassert its' request once the M2M xfer w/ DMA */
-+ /* is complete. */
-+
-+/*
-+ * M2M INTERRUPT register bit defines
-+ */
-+#define INTERRUPT_M2M_STALLINT 0x00000001 /* Stall interrupt indicates channel stalled. */
-+#define INTERRUPT_M2M_DONEINT 0x00000002 /* Transaction done. */
-+#define INTERRUPT_M2M_NFBINT 0x00000004 /* Next frame buffer interrupt indicates */
-+ /* channel requires a new buffer */
-+
-+/*
-+ * M2M STATUS register bit defines
-+ */
-+#define STATUS_M2M_STALL 0x00000001 /* A '1' indicates channel is stalled */
-+#define STATUS_M2M_CURRENTSTATE_MASK 0x0000003e /* Indicates state of M2M Channel control */
-+#define STATUS_M2M_CURRENTSTATE_SHIFT 1 /* FSM (0-2): */
-+ /* 000 - IDLE, 001 - STALL, 010 - MEM_RD, */
-+ /* 011 - MEM_WR, 100 - BWC_WAIT */
-+ /* and M2M buffer FSM (3-2): */
-+ /* 00 - NO_BUF, 01 - BUF_ON, 10 - BUF_NEXT */
-+#define STATUS_M2M_DONE 0x00000040 /* Transfer completed successfully if 1. */
-+#define STATUS_M2M_TCS_MASK 0x00000180 /* Terminal Count status. Indicates whether or */
-+#define STATUS_M2M_TCS_SHIFT 7 /* or not the actual byte count reached */
-+ /* programmed limit for buffer descriptor */
-+#define STATUS_M2M_EOTS_MASK 0x00000600 /* End-of-Transfer status for buffer */
-+#define STATUS_M2M_EOTS_SHIFT 9
-+#define STATUS_M2M_NFB 0x00000800 /* A '1' indicates channel has moved */
-+ /* from NEXT state to ON state, but the next */
-+ /* byte count reg for next buffer has not been */
-+ /* programmed yet. */
-+#define STATUS_M2M_NB 0x00001000 /* NextBuffer status. Informs NFB service */
-+ /* routine, after NFB int, which pair of buffer */
-+ /* descriptor registers is free to update. */
-+#define STATUS_M2M_DREQS 0x00002000 /* DREQ status. Reflects the status of the */
-+ /* synchronized external peripherals DMA */
-+ /* request signal. */
-+
-+/*
-+ * Register masks to mask off reserved bits after reading register.
-+ */
-+#define M2M_MASK_BCR0 0x0000ffff
-+#define M2M_MASK_BCR1 0x0000ffff
-+#define M2M_MASK_SAR_BASE0 0xffffffff
-+#define M2M_MASK_SAR_BASE1 0xffffffff
-+#define M2M_MASK_SAR_CURRENT0 0xffffffff
-+#define M2M_MASK_SAR_CURRENT1 0xffffffff
-+#define M2M_MASK_DAR_BASE0 0xffffffff
-+#define M2M_MASK_DAR_BASE1 0xffffffff
-+#define M2M_MASK_DAR_CURRENT0 0xffffffff
-+#define M2M_MASK_DAR_CURRENT1 0xffffffff
-+
-+#endif /* _REGS_DMA_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_gpio.h b/include/asm-arm/arch-ep93xx/regs_gpio.h
-new file mode 100644
-index 0000000..12397be
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_gpio.h
-@@ -0,0 +1,31 @@
-+/*=======================================================================
-+ *
-+ * FILE: regs_gpio.h
-+ *
-+ * DESCRIPTION: GPIO Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *=======================================================================
-+ */
-+#ifndef _REGS_GPIO_H_
-+#define _REGS_GPIO_H_
-+
-+/*
-+ * This file intentionally blank.
-+ */
-+
-+#endif /* _REGS_GPIO_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_hardcode.h b/include/asm-arm/arch-ep93xx/regs_hardcode.h
-new file mode 100644
-index 0000000..ecbc512
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_hardcode.h
-@@ -0,0 +1,110 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/regs_hardcode.h
-+ *
-+ * Handle 'Must-be-zero' and 'Must-be-one' values for various
-+ * registers on different flavours of the EP93xx family.
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef __ASM_ARCH_HARDCODE_H
-+#define __ASM_ARCH_HARDCODE_H
-+
-+#if defined(CONFIG_ARCH_EP9301)
-+#define ep93xx_SYSCON_DEVCFG(v) (((v) & ~0x0460c220) | 0x08000d00)
-+#define ep93xx_VIC0INTSELECT(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTSELECT(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_VIC0INTENABLE(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTENABLE(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_VIC0INTENCLEAR(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTENCLEAR(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_MAC_RXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_UART1MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_UART2TMR(v) (((v) & ~0x000000fd) | 0x00000000)
-+#define ep93xx_IrCtrl(v) (((v) & ~0x00000001) | 0x00000000)
-+#define ep93xx_RTCSCOMP(v) (((v) & ~0x00200000) | 0x00000000)
-+
-+/* cut'n'paste from 9301, verify this section... */
-+#elif defined(CONFIG_ARCH_EP9302)
-+#define ep93xx_SYSCON_DEVCFG(v) (((v) & ~0x0460c220) | 0x08000d00)
-+#define ep93xx_VIC0INTSELECT(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTSELECT(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_VIC0INTENABLE(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTENABLE(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_VIC0INTENCLEAR(v) (((v) & ~0xf8080000) | 0x00000000)
-+#define ep93xx_VIC1INTENCLEAR(v) (((v) & ~0x06879a04) | 0x00000000)
-+#define ep93xx_MAC_RXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_UART1MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_UART2TMR(v) (((v) & ~0x000000fd) | 0x00000000)
-+#define ep93xx_IrCtrl(v) (((v) & ~0x00000001) | 0x00000000)
-+#define ep93xx_RTCSCOMP(v) (((v) & ~0x00200000) | 0x00000000)
-+
-+#elif defined(CONFIG_ARCH_EP9312)
-+#define ep93xx_SYSCON_DEVCFG(v) (((v) & ~0x00000020) | 0x00000000)
-+#define ep93xx_VIC0INTSELECT(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTSELECT(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC0INTENABLE(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTENABLE(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC0INTENCLEAR(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTENCLEAR(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_PIXELMODE(v) (((v) & ~0x00010000) | 0x00000000)
-+#define ep93xx_MAC_RXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_UART1MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_UART2TMR(v) (((v) & ~0x000000fd) | 0x00000000)
-+#define ep93xx_UART3MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_IrCtrl(v) (((v) & ~0x00000001) | 0x00000000)
-+#define ep93xx_RTCSCOMP(v) (((v) & ~0x00200000) | 0x00000000)
-+
-+#elif defined(CONFIG_ARCH_EP9315)
-+#define ep93xx_SYSCON_DEVCFG(v) (((v) & ~0x00000020) | 0x00000000)
-+#define ep93xx_VIC0INTSELECT(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTSELECT(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC0INTENABLE(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTENABLE(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC0INTENCLEAR(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_VIC1INTENCLEAR(v) (((v) & ~0x00000000) | 0x00000000)
-+#define ep93xx_PIXELMODE(v) (((v) & ~0x00010000) | 0x00000000)
-+#define ep93xx_MAC_RXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXBUFTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXSTSTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_RXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_MAC_TXDTHRSHLD(v) (((v) & ~0x00030003) | 0x00000000)
-+#define ep93xx_UART1MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_UART2TMR(v) (((v) & ~0x000000fd) | 0x00000000)
-+#define ep93xx_UART3MCR(v) (((v) & ~0x000000e0) | 0x00000000)
-+#define ep93xx_IrCtrl(v) (((v) & ~0x00000001) | 0x00000000)
-+#define ep93xx_RTCSCOMP(v) (((v) & ~0x00200000) | 0x00000000)
-+
-+#endif
-+
-+#endif /* __ASM_ARCH_HARDWARE_H */
-diff --git a/include/asm-arm/arch-ep93xx/regs_i2s.h b/include/asm-arm/arch-ep93xx/regs_i2s.h
-new file mode 100644
-index 0000000..2ca60df
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_i2s.h
-@@ -0,0 +1,91 @@
-+/*=============================================================================
-+ *
-+ * FILE: reg_i2s.h
-+ *
-+ * DESCRIPTION: ep93xx I2S Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ *=============================================================================
-+ */
-+#ifndef _REG_I2S_H_
-+#define _REG_I2S_H_
-+
-+/* I2STXClkCfg bits */
-+#define i2s_txcc_trls 0x00000001
-+#define i2s_txcc_tckp 0x00000002
-+#define i2s_txcc_trel 0x00000004
-+#define i2s_txcc_mstr 0x00000008
-+#define i2s_txcc_nbcg 0x00000010
-+
-+#define i2s_txcc_bcr_32x 0x00000020
-+#define i2s_txcc_bcr_64x 0x00000040
-+#define i2s_txcc_bcr_128x 0x00000060
-+
-+/* I2SRxClkCfg bits */
-+#define i2s_rxcc_rrls 0x00000001
-+#define i2s_rxcc_rckp 0x00000002
-+#define i2s_rxcc_rrel 0x00000004
-+#define i2s_rxcc_mstr 0x00000008
-+#define i2s_rxcc_nbcg 0x00000010
-+
-+#define i2s_rxcc_bcr_32x 0x00000020
-+#define i2s_rxcc_bcr_64x 0x00000040
-+#define i2s_rxcc_bcr_128x 0x00000060
-+
-+/* I2SGlSts bits */
-+#define TX0_UNDERFLOW 0x00000001
-+#define TX1_UNDERFLOW 0x00000002
-+#define TX2_UNDERFLOW 0x00000004
-+
-+#define RX0_OVERFLOW 0x00000008
-+#define RX1_OVERFLOW 0x00000010
-+#define RX2_OVERFLOW 0x00000020
-+
-+#define TX0_OVERFLOW 0x00000040
-+#define TX1_OVERFLOW 0x00000080
-+#define TX2_OVERFLOW 0x00000100
-+
-+#define RX0_UNDERFLOW 0x00000200
-+#define RX1_UNDERFLOW 0x00000400
-+#define RX2_UNDERFLOW 0x00000800
-+
-+#define TX0_FIFO_FULL 0x00001000
-+#define TX0_FIFO_EMPTY 0x00002000
-+#define TX0_FIFO_HALF_EMPTY 0x00004000
-+
-+#define RX0_FIFO_FULL 0x00008000
-+#define RX0_FIFO_EMPTY 0x00010000
-+#define RX0_FIFO_HALF_FULL 0x00020000
-+
-+#define TX1_FIFO_FULL 0x00040000
-+#define TX1_FIFO_EMPTY 0x00080000
-+#define TX1_FIFO_HALF_EMPTY 0x00100000
-+
-+#define RX1_FIFO_FULL 0x00200000
-+#define RX1_FIFO_EMPTY 0x00400000
-+#define RX1_FIFO_HALF_FULL 0x00800000
-+
-+#define TX2_FIFO_FULL 0x01000000
-+#define TX2_FIFO_EMPTY 0x02000000
-+#define TX2_FIFO_HALF_EMPTY 0x04000000
-+
-+#define RX2_FIFO_FULL 0x08000000
-+#define RX2_FIFO_EMPTY 0x10000000
-+#define RX2_FIFO_HALF_FULL 0x20000000
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/regs_ide.h b/include/asm-arm/arch-ep93xx/regs_ide.h
-new file mode 100644
-index 0000000..762ebfd
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_ide.h
-@@ -0,0 +1,250 @@
-+/*****************************************************************************
-+ *
-+ * linux/include/asm-arm/arch-ep93xx/regs_ide.h
-+ *
-+ * Register definitions for the ep93xx ide registers.
-+ *
-+ * Copyright (C) 2003 Cirrus Logic
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ *
-+ ****************************************************************************/
-+#ifndef _REGS_IDE_H_
-+#define _REGS_IDE_H_
-+
-+#ifndef __ASSEMBLY__
-+
-+/*****************************************************************************
-+ *
-+ * IDE register definitions
-+ *
-+ ****************************************************************************/
-+typedef struct _ide_regs_s {
-+ union {
-+ unsigned int Value;
-+ } IDECR; /* 00 */
-+
-+ union {
-+ struct {
-+ unsigned int IDEEN:1; /* IDE master enable */
-+ unsigned int PIO:1; /* Polled IO operation selection */
-+ unsigned int MDMA:1; /* Multiword DMA operation selection */
-+ unsigned int UDMA:1; /* Ultra DMA operation selection */
-+ unsigned int MODE:4; /* Speed mode number (0 - 4 for PIO, */
-+ /* 0 - 2 for MDMA, 0 - 4 for UDMA) */
-+ unsigned int WST:2; /* Wait State for Turn. Number of */
-+ /* HCLK cycles to hold the data bus */
-+ /* after */
-+ /* PIO write operation */
-+ unsigned int RAZ:22; /* read only always zero */
-+ } Field;
-+ unsigned int Value;
-+ } IDECFG; /* 04 */
-+
-+ union {
-+ struct {
-+ unsigned int MEN:1; /* Enable Multiword DMA operation. */
-+ /* 1 - start mdma, 0 - terminate */
-+ /* mdma operation by host. */
-+ unsigned int RWOP:1; /* Read or write operation selection: */
-+ /* 0 = read, 1 = write. */
-+ unsigned int RAZ:30; /* read only always zero */
-+ } Field;
-+ unsigned int Value;
-+ } IDEMDMAOP; /* 08 */
-+
-+ union {
-+ struct {
-+ unsigned int UEN:1; /* Enable Ultra DMA operation */
-+ /* 1 - start udma, 0 - terminate */
-+ /* udma operation by host. */
-+ unsigned int RWOP:1; /* Read or write operation selection: */
-+ /* 0 = read, 1 = write. */
-+ unsigned int RAZ:30; /* read only always zero */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMAOP; /* 0C */
-+
-+ union {
-+ unsigned int Value;
-+ } IDEDATAOUT; /* 10 */
-+
-+ union {
-+ unsigned int Value;
-+ } IDEDATAIN; /* 14 */
-+
-+ union {
-+ struct {
-+ unsigned int IDEDD:32; /* IDE output data in the output buffer */
-+ /* in MDMA mode. This register should */
-+ /* only be written to by the DMA engine. */
-+ } Field;
-+ unsigned int Value;
-+ } IDEMDMADATAOUT; /* 18 */
-+
-+ union {
-+ struct {
-+ unsigned int IDEDD:32; /* IDE input data in the input buffer */
-+ /* in MDMA mode. */
-+ } Field;
-+ unsigned int Value;
-+ } IDEMDMADATAIN; /* 1C */
-+
-+ union {
-+ struct {
-+ unsigned int IDEDD:32; /* IDE output data at the tail of the */
-+ /* output buffer in UDMA mode. */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMADATAOUT; /* 20 */
-+
-+ union {
-+ struct {
-+ unsigned int IDEDD:32; /* IDE input data at teh head of the */
-+ /* input buffer in UDMA mode. */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMADATAIN; /* 24 */
-+
-+ union {
-+ struct {
-+ unsigned int CS0n:1; /* Chip select pin 0 status. Should */
-+ /* be driven to 1 (deasserted) in UDMA */
-+ unsigned int CS1n:1; /* Chip select pin 1 status. Should */
-+ /* be driven to 1 (deasserted) in UDMA */
-+ unsigned int DA:3; /* Device address status, should be */
-+ /* driven to 0 (deasserted) in UDMA */
-+ unsigned int HSHD:1; /* HSTROBE (during data out) status, */
-+ /* HDMARDYn (during data in) status, */
-+ /* driven by UDMA state machine. */
-+ unsigned int STOP:1; /* STOP (during data out) status, driven */
-+ /* by UDMA state machine. */
-+ unsigned int DM:1; /* DMACKn status, driven by UDMA state */
-+ /* machine. */
-+ unsigned int DDOE:1; /* DD bus output enable as controlled */
-+ /* by UDMA state machine. */
-+ unsigned int DMARQ:1; /* Synchronized version of DMARQ input */
-+ /* from device. */
-+ unsigned int DSDD:1; /* DSTROBE (during data in) and DDMARDYn */
-+ /* (during data out) status from device. */
-+ unsigned int RAZ1:5; /* reserved, always zero */
-+ unsigned int DMAIDE:1; /* DMA request signal from UDMA state */
-+ /* machine. */
-+ unsigned int INTIDE:1; /* INT line generated by UDMA state */
-+ /* machine. */
-+ unsigned int SBUSY:1; /* UDMA state machine busy, not in idle */
-+ /* state. */
-+ unsigned int RAZ2:5; /* Reserved, always zero. */
-+ unsigned int NDO:1; /* Error for data out not completed */
-+ unsigned int NDI:1; /* Error for data in not completed */
-+ unsigned int N4X:1; /* Error for data transferred not */
-+ /* multiples of 4 32 bit words. */
-+ unsigned int RAZ3:5; /* Reserved, always zero */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMASTATUS; /* 28 */
-+
-+ union {
-+ struct {
-+ unsigned int RWOE:1; /* Reset UDMA write data out error. */
-+ unsigned int RWPTR:1; /* Reset UDMA write buffer ptr to 0. */
-+ unsigned int RWDR:1; /* Reset UDMA write DMA request. */
-+ unsigned int RROE:1; /* Reset UDMA read data in error. */
-+ unsigned int RRPTR:1; /* Reset UDMA read buffer ptr to 0. */
-+ unsigned int RRDR:1; /* Reset UDMA read DMA request. */
-+ unsigned int RAZ:26; /* reserved, always zero */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMADEBUG; /* 2C */
-+
-+ union {
-+ struct {
-+ unsigned int HPTR:4; /* Head pointer in the write buffer */
-+ unsigned int TPTR:4; /* Tail pointer in the write buffer */
-+ unsigned int EMPTY:1; /* Write buffer empty status */
-+ unsigned int HOM:1; /* Half or more entries in write buffer */
-+ /* filled status */
-+ unsigned int NFULL:1; /* Write buffer near full status */
-+ unsigned int FULL:1; /* Write buffer full status */
-+ unsigned int RAZ:4; /* Reserved, always zero */
-+ unsigned int CRC:16; /* CRC result for data operation */
-+ /* TODO: is there a CRC? */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMAWFST; /* 30 */
-+
-+ union {
-+ struct {
-+ unsigned int HPTR:4; /* Head pointer in the read buffer */
-+ unsigned int TPTR:4; /* Tail pointer in the read buffer */
-+ unsigned int EMPTY:1; /* Read buffer empty status */
-+ unsigned int HOM:1; /* Half or more entries in read buffer */
-+ /* filled status */
-+ unsigned int NFULL:1; /* Read buffer near full status */
-+ unsigned int FULL:1; /* Read buffer full status */
-+ unsigned int RAZ:4; /* Reserved, always zero */
-+ unsigned int CRC:16; /* CRC result for data operation */
-+ /* TODO: is there a CRC? */
-+ } Field;
-+ unsigned int Value;
-+ } IDEUDMARFST; /* 34 */
-+
-+} IDEREGISTERS;
-+
-+/*****************************************************************************
-+ *
-+ * Global Register Anchor Definitions (these address values will change)
-+ *
-+ ****************************************************************************/
-+#ifdef CONFIG_BLK_DEV_EP93XX
-+static volatile IDEREGISTERS *const ep93xx_ide_regs =
-+ (IDEREGISTERS *) (IDE_BASE);
-+#endif
-+
-+#endif /* Not __ASSEMBLY__ */
-+
-+#define IDECtrl HW_REG(io_p2v(0x800a0000))
-+#define IDECfg HW_REG(io_p2v(0x800a0004))
-+#define IDEMDMAOp HW_REG(io_p2v(0x800a0008))
-+#define IDEUDMAOp HW_REG(io_p2v(0x800a000c))
-+#define IDEDataOut HW_REG(io_p2v(0x800a0010))
-+#define IDEDataIn HW_REG(io_p2v(0x800a0014))
-+#define IDEMDMADataOut HW_REG(io_p2v(0x800a0018))
-+#define IDEMDMADataIn HW_REG(io_p2v(0x800a001c))
-+#define IDEUDMADataOut HW_REG(io_p2v(0x800a0020))
-+#define IDEUDMADataIn HW_REG(io_p2v(0x800a0024))
-+#define IDEUDMASts HW_REG(io_p2v(0x800a0028))
-+#define IDEUDMADebug HW_REG(io_p2v(0x800a002c))
-+#define IDEUDMAWrBufSts HW_REG(io_p2v(0x800a0030))
-+#define IDEUDMARdBufSts HW_REG(io_p2v(0x800a0034))
-+
-+/*****************************************************************************
-+ *
-+ * Bit definitions for use with assembly code for the ide control register.
-+ *
-+ ****************************************************************************/
-+#define IDECtrl_CS0n 0x00000001
-+#define IDECtrl_CS1n 0x00000002
-+#define IDECtrl_DA_MASK 0x0000001c
-+#define IDECtrl_DA_SHIFT 2
-+#define IDECtrl_DIORn 0x00000020
-+#define IDECtrl_DIOWn 0x00000040
-+#define IDECtrl_DASPn 0x00000080
-+#define IDECtrl_DMARQ 0x00000100
-+#define IDECtrl_INTRQ 0x00000200
-+#define IDECtrl_IORDY 0x00000400
-+
-+#endif /* _REGS_IDE_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_irda.h b/include/asm-arm/arch-ep93xx/regs_irda.h
-new file mode 100644
-index 0000000..77edafa
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_irda.h
-@@ -0,0 +1,24 @@
-+/*=======================================================================
-+ *
-+ * FILE: regs_irda.h
-+ *
-+ * DESCRIPTION: IrDA Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ *=======================================================================
-+ */
-+#ifndef _REGS_IRDA_H_
-+#define _REGS_IRDA_H_
-+
-+/* Bit definitions */
-+
-+#define IrEnable_EN_NONE 0x00
-+#define IrEnable_EN_SIR 0x01
-+#define IrEnable_EN_MIR 0x02
-+#define IrEnable_EN_FIR 0x03
-+#define IrEnable_LBM 0x04
-+#define IrEnable_MD 0x08
-+#define IrEnable_FD 0x10
-+
-+#endif /* _REGS_IRDA_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_pcmcia.h b/include/asm-arm/arch-ep93xx/regs_pcmcia.h
-new file mode 100644
-index 0000000..6f731e7
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_pcmcia.h
-@@ -0,0 +1,72 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/regs-pcmcia.h
-+ *
-+ * Derived from:
-+ * linux/include/asm-arm/arch-pxa/pxa-regs.h
-+ *
-+ * Author: Nicolas Pitre
-+ * Created: Jun 15, 2001
-+ * Copyright: MontaVista Software Inc.
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * Personal Computer Memory Card International Association (PCMCIA) sockets
-+ * (from pxa-regs.h for compatibility)
-+ */
-+#ifndef _REGS_PCMCIA_H_
-+#define _REGS_PCMCIA_H_
-+
-+#define PCMCIAPrtSp 0x04000000 /* PCMCIA Partition Space [byte] */
-+#define PCMCIASp (4*PCMCIAPrtSp) /* PCMCIA Space [byte] */
-+#define PCMCIAIOSp PCMCIAPrtSp /* PCMCIA I/O Space [byte] */
-+#define PCMCIAAttrSp PCMCIAPrtSp /* PCMCIA Attribute Space [byte] */
-+#define PCMCIAMemSp PCMCIAPrtSp /* PCMCIA Memory Space [byte] */
-+
-+#define PCMCIA0Sp PCMCIASp /* PCMCIA 0 Space [byte] */
-+#define PCMCIA0IOSp PCMCIAIOSp /* PCMCIA 0 I/O Space [byte] */
-+#define PCMCIA0AttrSp PCMCIAAttrSp /* PCMCIA 0 Attribute Space [byte] */
-+#define PCMCIA0MemSp PCMCIAMemSp /* PCMCIA 0 Memory Space [byte] */
-+
-+#define PCMCIA1Sp PCMCIASp /* PCMCIA 1 Space [byte] */
-+#define PCMCIA1IOSp PCMCIAIOSp /* PCMCIA 1 I/O Space [byte] */
-+#define PCMCIA1AttrSp PCMCIAAttrSp /* PCMCIA 1 Attribute Space [byte] */
-+#define PCMCIA1MemSp PCMCIAMemSp /* PCMCIA 1 Memory Space [byte] */
-+
-+
-+#define _PCMCIA(Nb) /* PCMCIA [0..1] */ \
-+ (0x40000000 + (Nb)*PCMCIASp)
-+#define _PCMCIAIO(Nb) _PCMCIA (Nb) /* PCMCIA I/O [0..1] */
-+#define _PCMCIAAttr(Nb) /* PCMCIA Attribute [0..1] */ \
-+ (_PCMCIA (Nb) + 2*PCMCIAPrtSp)
-+#define _PCMCIAMem(Nb) /* PCMCIA Memory [0..1] */ \
-+ (_PCMCIA (Nb) + 3*PCMCIAPrtSp)
-+
-+#define _PCMCIA0 _PCMCIA (0) /* PCMCIA 0 */
-+#define _PCMCIA0IO _PCMCIAIO (0) /* PCMCIA 0 I/O */
-+#define _PCMCIA0Attr _PCMCIAAttr (0) /* PCMCIA 0 Attribute */
-+#define _PCMCIA0Mem _PCMCIAMem (0) /* PCMCIA 0 Memory */
-+
-+#define _PCMCIA1 _PCMCIA (1) /* PCMCIA 1 */
-+#define _PCMCIA1IO _PCMCIAIO (1) /* PCMCIA 1 I/O */
-+#define _PCMCIA1Attr _PCMCIAAttr (1) /* PCMCIA 1 Attribute */
-+#define _PCMCIA1Mem _PCMCIAMem (1) /* PCMCIA 1 Memory */
-+
-+#define PCATTRIB(sock) ((sock ==0) ? (PC1ATTRIB) : (PC2ATTRIB))
-+#define PCCOMMON(sock) ((sock ==0) ? (PC1COMMON) : (PC2COMMON))
-+#define PCIO(sock) ((sock ==0) ? (PC1IO) : (PC2IO))
-+
-+#define PC16BITSWIDE 0x80000000
-+
-+#define PCMCIA_WRPROT 0x01
-+#define PCMCIA_DETECT 0x06
-+#define PCMCIA_BVD1 0x08
-+#define PCMCIA_BVD2 0x10
-+#define PCMCIA_VS_3V 0x20
-+#define PCMCIA_READY 0x40
-+#define PCMCIA_VS_XV 0x80
-+
-+#endif /* _REGS_PCMCIA_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_raster.h b/include/asm-arm/arch-ep93xx/regs_raster.h
-new file mode 100644
-index 0000000..bfab3ed
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_raster.h
-@@ -0,0 +1,279 @@
-+/*=============================================================================
-+ *
-+ * FILE: regs_raster.h
-+ *
-+ * DESCRIPTION: ep93xx Raster Engine Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ *=============================================================================
-+ */
-+#ifndef _REGS_RASTER_H_
-+#define _REGS_RASTER_H_
-+
-+/* VLINESTOTAL Register Definitions */
-+#define VLINESTOTAL_MASK 0x000007ff
-+
-+/* VSYNCSTRTSTOP Register Definitions */
-+#define VSYNCSTRTSTOP_STRT_MASK 0x07ff0000
-+#define VSYNCSTRTSTOP_STRT_SHIFT 0
-+#define VSYNCSTRTSTOP_STOP_MASK 0x000007ff
-+#define VSYNCSTRTSTOP_STOP_SHIFT 16
-+
-+/* VACTIVESTRTSTOP Register Definitions */
-+#define VACTIVESTRTSTOP_STRT_MASK 0x07ff0000
-+#define VACTIVESTRTSTOP_STRT_SHIFT 0
-+#define VACTIVESTRTSTOP_STOP_MASK 0x000007ff
-+#define VACTIVESTRTSTOP_STOP_SHIFT 16
-+
-+/* VCLKSTRTSTOP Register Definitions */
-+#define VCLKSTRTSTOP_STRT_MASK 0x07ff0000
-+#define VCLKSTRTSTOP_STRT_SHIFT 0
-+#define VCLKSTRTSTOP_STOP_MASK 0x000007ff
-+#define VCLKSTRTSTOP_STOP_SHIFT 16
-+
-+/* VBLANKSTRTSTOP Register Definitions */
-+#define VBLANKSTRTSTOP_STRT_MASK 0x07ff0000
-+#define VBLANKSTRTSTOP_STRT_SHIFT 0
-+#define VBLANKSTRTSTOP_STOP_MASK 0x000007ff
-+#define VBLANKSTRTSTOP_STOP_SHIFT 16
-+
-+/* HSYNCSTRTSTOP Register Definitions */
-+#define HSYNCSTRTSTOP_STRT_MASK 0x07ff0000
-+#define HSYNCSTRTSTOP_STRT_SHIFT 0
-+#define HSYNCSTRTSTOP_STOP_MASK 0x000007ff
-+#define HSYNCSTRTSTOP_STOP_SHIFT 16
-+
-+/* HACTIVESTRTSTOP Register Definitions */
-+#define HACTIVESTRTSTOP_STRT_MASK 0x07ff0000
-+#define HACTIVESTRTSTOP_STRT_SHIFT 0
-+#define HACTIVESTRTSTOP_STOP_MASK 0x000007ff
-+#define HACTIVESTRTSTOP_STOP_SHIFT 16
-+
-+/* HCLKSTRTSTOP Register Definitions */
-+#define HCLKSTRTSTOP_STRT_MASK 0x07ff0000
-+#define HCLKSTRTSTOP_STRT_SHIFT 0
-+#define HCLKSTRTSTOP_STOP_MASK 0x000007ff
-+#define HCLKSTRTSTOP_STOP_SHIFT 16
-+
-+/* BRIGHTNESS Register Definitions */
-+#define BRIGHTNESS_MASK 0x0000ffff
-+#define BRIGHTNESS_CNT_MASK 0x000000ff
-+#define BRIGHTNESS_CNT_SHIFT 0
-+#define BRIGHTNESS_CMP_MASK 0x0000ff00
-+#define BRIGHTNESS_CMP_SHIFT 8
-+
-+/* VIDEOATTRIBS Register Definitions */
-+#define VIDEOATTRIBS_MASK 0x001fffff
-+#define VIDEOATTRIBS_EN 0x00000001
-+#define VIDEOATTRIBS_PCLKEN 0x00000002
-+#define VIDEOATTRIBS_SYNCEN 0x00000004
-+#define VIDEOATTRIBS_DATAEN 0x00000008
-+#define VIDEOATTRIBS_CSYNC 0x00000010
-+#define VIDEOATTRIBS_VCPOL 0x00000020
-+#define VIDEOATTRIBS_HSPOL 0x00000040
-+#define VIDEOATTRIBS_BLKPOL 0x00000080
-+#define VIDEOATTRIBS_INVCLK 0x00000100
-+#define VIDEOATTRIBS_ACEN 0x00000200
-+#define VIDEOATTRIBS_LCDEN 0x00000400
-+#define VIDEOATTRIBS_RGBEN 0x00000800
-+#define VIDEOATTRIBS_CCIREN 0x00001000
-+#define VIDEOATTRIBS_PIFEN 0x00002000
-+#define VIDEOATTRIBS_INTEN 0x00004000
-+#define VIDEOATTRIBS_INT 0x00008000
-+#define VIDEOATTRIBS_INTRLC 0x00010000
-+#define VIDEOATTRIBS_EQUSER 0x00020000
-+#define VIDEOATTRIBS_DHORZ 0x00040000
-+#define VIDEOATTRIBS_DVERT 0x00080000
-+#define VIDEOATTRIBS_BKPXD 0x00100000
-+
-+#define VIDEOATTRIBS_SDSEL_MASK 0x00600000
-+#define VIDEOATTRIBS_SDSEL_SHIFT 21
-+
-+/* HBLANKSTRTSTOP Register Definitions */
-+#define HBLANKSTRTSTOP_STRT_MASK 0x07ff0000
-+#define HBLANKSTRTSTOP_STRT_SHIFT 0
-+#define HBLANKSTRTSTOP_STOP_MASK 0x000007ff
-+#define HBLANKSTRTSTOP_STOP_SHIFT 16
-+
-+/* LINECARRY Register Definitions */
-+#define LINECARRY_LCARY_MASK 0x000007ff
-+#define LINECARRY_LCARY_SHIFT 0
-+
-+/* BLINKRATE Register Definitons */
-+#define BLINKRATE_MASK 0x000000ff
-+
-+/* BLINKMASK Register Definitons */
-+#define BLINKMASK_MASK 0x00ffffff
-+
-+/* VIDSCRNPAGE Register Definitons */
-+#define VIDSCRNPAGE_PAGE_MASK 0x0ffffffc
-+
-+/* VIDSCRNHPG Register Definitons */
-+#define VIDSCRNHPG_MASK 0x0ffffffc
-+
-+/* SCRNLINES Register Definitons */
-+#define SCRNLINES_MASK 0x000007ff
-+
-+/* LINELENGTH Register Definitons */
-+#define LINELENGTH_MASK 0x000007ff
-+
-+/* VLINESTEP Register Definitons */
-+#define VLINESTEP_MASK 0x00000fff
-+
-+/* REALITI_SWLOCK Register Definitons */
-+#define REALITI_SWLOCK_MASK_WR 0xff
-+#define REALITI_SWLOCK_MASK_R 0x1
-+#define REALITI_SWLOCK_VALUE 0xaa
-+
-+/* LUTCONT Register Definitions */
-+#define LUTCONT_MASK 0x00000003
-+#define LUTCONT_SWTCH 0x00000001
-+#define LUTCONT_STAT 0x00000002
-+#define LUTCONT_RAM0 0
-+#define LUTCONT_RAM1 1
-+
-+/* CURSORBLINK1 Register Definitions */
-+#define CURSORBLINK1_MASK 0x00ffffff
-+/* CURSORBLINK2 Register Definitions */
-+#define CURSORBLINK2_MASK 0x00ffffff
-+
-+/* CURSORBLINK Register Definitions */
-+#define CURSORBLINK_MASK 0x000001ff
-+#define CURSORBLINK_RATE_MASK 0x000000ff
-+#define CURSORBLINK_RATE_SHIFT 0
-+#define CURSORBLINK_EN 0x00000100
-+
-+/* BLINKPATRN Register Definitions */
-+#define BLINKPATRN_MASK 0x00ffffff
-+
-+/* PATRNMASK Register Definitions */
-+#define PATRNMASK_MASK 0x00ffffff
-+
-+/* BG_OFFSET Register Definitions */
-+#define BG_OFFSET_MASK 0x00ffffff
-+
-+/* PIXELMODE Register Definitions */
-+#define PIXELMODE_P_MASK 0x00000007
-+#define PIXELMODE_P_MUX_DISABLE 0x00000000
-+#define PIXELMODE_P_4BPP 0x00000001
-+#define PIXELMODE_P_8BPP 0x00000002
-+#define PIXELMODE_P_16BPP 0x00000004
-+#define PIXELMODE_P_24BPP 0x00000006
-+#define PIXELMODE_P_32BPP 0x00000007
-+#define PIXELMODE_P_SHIFT 0
-+
-+#define PIXELMODE_S_MASK 0x00000038
-+#define PIXELMODE_S_SHIFT 3
-+#define PIXELMODE_S_1PPC 0x0
-+#define PIXELMODE_S_1PPCMAPPED 0x1
-+#define PIXELMODE_S_2PPC 0x2
-+#define PIXELMODE_S_4PPC 0x3
-+#define PIXELMODE_S_8PPC 0x4
-+#define PIXELMODE_S_223PPC 0x5
-+#define PIXELMODE_S_DS223PPC 0x6
-+#define PIXELMODE_S_UNDEF 0x7
-+
-+#define PIXELMODE_M_MASK 0x000003c0
-+#define PIXELMODE_M_SHIFT 6
-+#define PIXELMODE_M_NOBLINK 0
-+#define PIXELMODE_M_ANDBLINK 1
-+#define PIXELMODE_M_ORBLINK 2
-+#define PIXELMODE_M_XORBLINK 3
-+#define PIXELMODE_M_BGBLINK 4
-+#define PIXELMODE_M_OFFSINGBLINK 5
-+#define PIXELMODE_M_OFF888BLINK 6
-+#define PIXELMODE_M_DIMBLINK 0xc
-+#define PIXELMODE_M_BRTBLINK 0xd
-+#define PIXELMODE_M_DIM888BLINK 0xe
-+#define PIXELMODE_M_BRT888BLINK 0xf
-+
-+#define PIXELMODE_C_MASK 0x00003c00
-+#define PIXELMODE_C_SHIFT 10
-+#define PIXELMODE_C_LUT 0
-+#define PIXELMODE_C_888 4
-+#define PIXELMODE_C_565 5
-+#define PIXELMODE_C_555 6
-+#define PIXELMODE_C_GSLUT 8
-+
-+#define PIXELMODE_DSCAN 0x00004000
-+#define PIXELMODE_TRBSW 0x00008000
-+#define PIXELMODE_P13951 0x00010000
-+
-+/*PARLLIFOUT Register Defintions */
-+#define PARLLIFOUT_DAT_MASK 0x0000000f
-+#define PARLLIFOUT_DAT_SHIFT 0
-+#define PARLLIFOUT_RD 0x00000010
-+
-+/*PARLLIFIN Register Defintions */
-+#define PARLLIFIN_DAT_MASK 0x0000000f
-+#define PARLLIFIN_DAT_SHIFT 0
-+#define PARLLIFIN_CNT_MASK 0x000f0000
-+#define PARLLIFIN_CNT_SHIFT 16
-+#define PARLLIFIN_ESTRT_MASK 0x00f00000
-+#define PARLLIFIN_ESTRT_SHIFT 20
-+
-+/* CURSORADRSTART Register Defintions */
-+#define CURSOR_ADR_START_MASK 0xfffffffc
-+
-+/* CURSORADRSTART Register Defintions */
-+#define CURSOR_ADR_RESET_MASK 0xfffffffc
-+
-+/* CURSORCOLOR1 Register Definitions */
-+#define CURSORCOLOR1_MASK 0x00ffffff
-+/* CURSORCOLOR2 Register Definitions */
-+#define CURSORCOLOR2_MASK 0x00ffffff
-+
-+/* CURSORXYLOC Register Definitions */
-+#define CURSORXYLOC_MASK 0x07ff87ff
-+#define CURSORXYLOC_XLOC_MASK 0x000007ff
-+#define CURSORXYLOC_XLOC_SHIFT 0
-+#define CURSORXYLOC_CEN 0x00008000
-+#define CURSORXYLOC_YLOC_MASK 0x07ff0000
-+#define CURSORXYLOC_YLOC_SHIFT 16
-+
-+/* CURSOR_DSCAN_LH_YLOC Register Definitions */
-+#define CURSOR_DSCAN_LH_YLOC_MASK 0x000087ff
-+
-+#define CURSOR_DSCAN_LH_YLOC_YLOC_MASK 0x000007ff
-+#define CURSOR_DSCAN_LH_YLOC_YLOC_SHIFT 0
-+#define CURSOR_DSCAN_LH_YLOC_CLHEN 0x00008000
-+
-+/* CURSORSIZE Register Definitions */
-+#define CURSORSIZE_MASK 0x0000ffff
-+
-+#define CURSORSIZE_CWID_MASK 0x00000003
-+#define CURSORSIZE_CWID_SHIFT 0
-+#define CURSORSIZE_CWID_1_WORD 0
-+#define CURSORSIZE_CWID_2_WORD 1
-+#define CURSORSIZE_CWID_3_WORD 2
-+#define CURSORSIZE_CWID_4_WORD 3
-+
-+#define CURSORSIZE_CLINS_MASK 0x000000fc
-+#define CURSORSIZE_CLINS_SHIFT 2
-+
-+#define CURSORSIZE_CSTEP_MASK 0x00000300
-+#define CURSORSIZE_CSTEP_SHIFT 8
-+#define CURSORSIZE_CSTEP_1_WORD 0
-+#define CURSORSIZE_CSTEP_2_WORD 1
-+#define CURSORSIZE_CSTEP_3_WORD 2
-+#define CURSORSIZE_CSTEP_4_WORD 3
-+
-+#define CURSORSIZE_DLNS_MASK 0x0000fc00
-+#define CURSORSIZE_DLNS_SHIFT 10
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/regs_spi.h b/include/asm-arm/arch-ep93xx/regs_spi.h
-new file mode 100644
-index 0000000..a51d3dc
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_spi.h
-@@ -0,0 +1,76 @@
-+/*=======================================================================
-+ *
-+ * FILE: regs_spi.h
-+ *
-+ * DESCRIPTION: SSP Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *=======================================================================
-+ */
-+
-+#ifndef _REGS_SSP_H_
-+#define _REGS_SSP_H_
-+
-+/* Bits in SSPCR0 */
-+#define SSPCR0_DSS_MASK 0x0000000f
-+#define SSPCR0_DSS_4BIT 0x00000003
-+#define SSPCR0_DSS_5BIT 0x00000004
-+#define SSPCR0_DSS_6BIT 0x00000005
-+#define SSPCR0_DSS_7BIT 0x00000006
-+#define SSPCR0_DSS_8BIT 0x00000007
-+#define SSPCR0_DSS_9BIT 0x00000008
-+#define SSPCR0_DSS_10BIT 0x00000009
-+#define SSPCR0_DSS_11BIT 0x0000000a
-+#define SSPCR0_DSS_12BIT 0x0000000b
-+#define SSPCR0_DSS_13BIT 0x0000000c
-+#define SSPCR0_DSS_14BIT 0x0000000d
-+#define SSPCR0_DSS_15BIT 0x0000000e
-+#define SSPCR0_DSS_16BIT 0x0000000f
-+
-+/* Bits in SSPCR1 */
-+#define SSPC1_RIE 0x00000001
-+#define SSPC1_TIE 0x00000002
-+#define SSPC1_RORIE 0x00000004
-+#define SSPC1_LBM 0x00000008
-+#define SSPC1_SSE 0x00000010
-+#define SSPC1_MS 0x00000020
-+#define SSPC1_SOD 0x00000040
-+
-+#define SSPCR0_DSS_SHIFT 0
-+#define SSPCR0_FRF_MASK 0x00000030
-+#define SSPCR0_FRF_SHIFT 4
-+#define SSPCR0_FRF_MOTOROLA (0 << SSPCR0_FRF_SHIFT)
-+#define SSPCR0_FRF_TI (1 << SSPCR0_FRF_SHIFT)
-+#define SSPCR0_FRF_NI (2 << SSPCR0_FRF_SHIFT)
-+#define SSPCR0_SPO 0x00000040
-+#define SSPCR0_SPH 0x00000080
-+#define SSPCR0_SCR_MASK 0x0000ff00
-+#define SSPCR0_SCR_SHIFT 8
-+
-+/* Bits in SSPSR */
-+#define SSPSR_TFE 0x00000001 /* TX FIFO is empty */
-+#define SSPSR_TNF 0x00000002 /* TX FIFO is not full */
-+#define SSPSR_RNE 0x00000004 /* RX FIFO is not empty */
-+#define SSPSR_RFF 0x00000008 /* RX FIFO is full */
-+#define SSPSR_BSY 0x00000010 /* SSP is busy */
-+
-+/* Bits in SSPIIR */
-+#define SSPIIR_RIS 0x00000001 /* RX FIFO IRQ status */
-+#define SSPIIR_TIS 0x00000002 /* TX FIFO is not full */
-+#define SSPIIR_RORIS 0x00000004 /* RX FIFO is full */
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/regs_syscon.h b/include/asm-arm/arch-ep93xx/regs_syscon.h
-new file mode 100644
-index 0000000..271cfcd
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_syscon.h
-@@ -0,0 +1,257 @@
-+/*=============================================================================
-+ *
-+ * FILE: reg_syscon.h
-+ *
-+ * DESCRIPTION: ep93xx Syscon Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ *=============================================================================
-+ */
-+#ifndef _REGS_SYSCON_H_
-+#define _REGS_SYSCON_H_
-+
-+#ifndef __ASSEMBLY__
-+
-+#define SysconSetLocked(registername,value) \
-+ { \
-+ writel( 0xAA, SYSCON_SWLOCK); \
-+ writel( value, registername); \
-+ }
-+
-+#endif /* Not __ASSEMBLY__ */
-+
-+/* SYSCON_CLKSET1 */
-+#define SYSCON_CLKSET1_PLL1_X2IPD_SHIFT 0
-+#define SYSCON_CLKSET1_PLL1_X2IPD_MASK 0x0000001f
-+#define SYSCON_CLKSET1_PLL1_X2FBD2_SHIFT 5
-+#define SYSCON_CLKSET1_PLL1_X2FBD2_MASK 0x000007e0
-+#define SYSCON_CLKSET1_PLL1_X1FBD1_SHIFT 11
-+#define SYSCON_CLKSET1_PLL1_X1FBD1_MASK 0x0000f800
-+#define SYSCON_CLKSET1_PLL1_PS_SHIFT 16
-+#define SYSCON_CLKSET1_PLL1_PS_MASK 0x00030000
-+#define SYSCON_CLKSET1_PCLKDIV_SHIFT 18
-+#define SYSCON_CLKSET1_PCLKDIV_MASK 0x000c0000
-+#define SYSCON_CLKSET1_HCLKDIV_SHIFT 20
-+#define SYSCON_CLKSET1_HCLKDIV_MASK 0x00700000
-+#define SYSCON_CLKSET1_nBYP1 0x00800000
-+#define SYSCON_CLKSET1_SMCROM 0x01000000
-+#define SYSCON_CLKSET1_FCLKDIV_SHIFT 25
-+#define SYSCON_CLKSET1_FCLKDIV_MASK 0x0e000000
-+
-+#define SYSCON_CLKSET1_HSEL 0x00000001
-+#define SYSCON_CLKSET1_PLL1_EXCLKSEL 0x00000002
-+
-+#define SYSCON_CLKSET1_PLL1_P_MASK 0x0000007C
-+#define SYSCON_CLKSET1_PLL1_P_SHIFT 2
-+
-+#define SYSCON_CLKSET1_PLL1_M1_MASK 0x00000780
-+#define SYSCON_CLKSET1_PLL1_M1_SHIFT 7
-+#define SYSCON_CLKSET1_PLL1_M2_MASK 0x0000F800
-+#define SYSCON_CLKSET1_PLL1_M2_SHIFT 11
-+#define SYSCON_CLKSET1_PLL1_PS_MASK 0x00030000
-+#define SYSCON_CLKSET1_PLL1_PS_SHIFT 16
-+#define SYSCON_CLKSET1_PCLK_DIV_MASK 0x000C0000
-+#define SYSCON_CLKSET1_PCLK_DIV_SHIFT 18
-+#define SYSCON_CLKSET1_HCLK_DIV_MASK 0x00700000
-+#define SYSCON_CLKSET1_HCLK_DIV_SHIFT 20
-+#define SYSCON_CLKSET1_SMCROM 0x01000000
-+#define SYSCON_CLKSET1_FCLK_DIV_MASK 0x0E000000
-+#define SYSCON_CLKSET1_FCLK_DIV_SHIFT 25
-+
-+#define SYSCON_CLKSET2_PLL2_EN 0x00000001
-+#define SYSCON_CLKSET2_PLL2EXCLKSEL 0x00000002
-+#define SYSCON_CLKSET2_PLL2_P_MASK 0x0000007C
-+#define SYSCON_CLKSET2_PLL2_P_SHIFT 2
-+#define SYSCON_CLKSET2_PLL2_M2_MASK 0x00000F80
-+#define SYSCON_CLKSET2_PLL2_M2_SHIFT 7
-+#define SYSCON_CLKSET2_PLL2_M1_MASK 0x0001F000
-+#define SYSCON_CLKSET2_PLL2_M1 12
-+#define SYSCON_CLKSET2_PLL2_PS_MASK 0x000C0000
-+#define SYSCON_CLKSET2_PLL2_PS_SHIFT 18
-+#define SYSCON_CLKSET2_USBDIV_MASK 0xF0000000
-+#define SYSCON_CLKSET2_USBDIV_SHIFT 28
-+
-+/* DEV_CFG Register Defines */
-+#define SYSCON_DEVCFG_SHena 0x00000001
-+#define SYSCON_DEVCFG_KEYS 0x00000002
-+#define SYSCON_DEVCFG_ADCPD 0x00000004
-+#define SYSCON_DEVCFG_RAS 0x00000008
-+#define SYSCON_DEVCFG_RASonP3 0x00000010
-+#define SYSCON_DEVCFG_TTIC 0x00000020
-+#define SYSCON_DEVCFG_I2SonAC97 0x00000040
-+#define SYSCON_DEVCFG_I2SonSSP 0x00000080
-+#define SYSCON_DEVCFG_EonIDE 0x00000100
-+#define SYSCON_DEVCFG_PonG 0x00000200
-+#define SYSCON_DEVCFG_GonIDE 0x00000400
-+#define SYSCON_DEVCFG_HonIDE 0x00000800
-+#define SYSCON_DEVCFG_HC1CEN 0x00001000
-+#define SYSCON_DEVCFG_HC1IN 0x00002000
-+#define SYSCON_DEVCFG_HC3CEN 0x00004000
-+#define SYSCON_DEVCFG_HC3IN 0x00008000
-+#define SYSCON_DEVCFG_ADCEN 0x00010000
-+#define SYSCON_DEVCFG_TIN 0x00020000
-+#define SYSCON_DEVCFG_U1EN 0x00040000
-+#define SYSCON_DEVCFG_EXVC 0x00080000
-+#define SYSCON_DEVCFG_U2EN 0x00100000
-+#define SYSCON_DEVCFG_A1onG 0x00200000
-+#define SYSCON_DEVCFG_A2onG 0x00400000
-+#define SYSCON_DEVCFG_CPENA 0x00800000
-+#define SYSCON_DEVCFG_U3EN 0x01000000
-+#define SYSCON_DEVCFG_MonG 0x02000000
-+#define SYSCON_DEVCFG_TonG 0x04000000
-+#define SYSCON_DEVCFG_GonK 0x08000000
-+#define SYSCON_DEVCFG_IonU2 0x10000000
-+#define SYSCON_DEVCFG_D0onG 0x20000000
-+#define SYSCON_DEVCFG_D1onG 0x40000000
-+#define SYSCON_DEVCFG_SWRST 0x80000000
-+
-+/* VIDDIV Register Defines */
-+#define SYSCON_VIDDIV_VDIV_MASK 0x0000007f
-+#define SYSCON_VIDDIV_VDIV_SHIFT 0
-+#define SYSCON_VIDDIV_PDIV_MASK 0x00000300
-+#define SYSCON_VIDDIV_PDIV_SHIFT 8
-+#define SYSCON_VIDDIV_PSEL 0x00002000
-+#define SYSCON_VIDDIV_ESEL 0x00004000
-+#define SYSCON_VIDDIV_VENA 0x00008000
-+
-+/* MIRDIV Register Defines */
-+#define SYSCON_MIRDIV_MDIV_MASK 0x0000003f
-+#define SYSCON_MIRDIV_MDIV_SHIFT 0
-+#define SYSCON_MIRDIV_PDIV_MASK 0x00000300
-+#define SYSCON_MIRDIV_PDIV_SHIFT 8
-+#define SYSCON_MIRDIV_PSEL 0x00002000
-+#define SYSCON_MIRDIV_ESEL 0x00004000
-+#define SYSCON_MIRDIV_MENA 0x00008000
-+
-+/* I2SDIV Register Defines */
-+#define SYSCON_I2SDIV_MDIV_MASK 0x0000007f
-+#define SYSCON_I2SDIV_MDIV_SHIFT 0
-+#define SYSCON_I2SDIV_PDIV_MASK 0x00000300
-+#define SYSCON_I2SDIV_PDIV_SHIFT 8
-+#define SYSCON_I2SDIV_PSEL 0x00002000
-+#define SYSCON_I2SDIV_ESEL 0x00004000
-+#define SYSCON_I2SDIV_MENA 0x00008000
-+#define SYSCON_I2SDIV_SDIV 0x00010000
-+#define SYSCON_I2SDIV_LRDIV_MASK 0x00060000
-+#define SYSCON_I2SDIV_LRDIV_SHIFT 17
-+#define SYSCON_I2SDIV_SPOL 0x00080000
-+#define SYSCON_I2SDIV_DROP 0x00100000
-+#define SYSCON_I2SDIV_ORIDE 0x20000000
-+#define SYSCON_I2SDIV_SLAVE 0x40000000
-+#define SYSCON_I2SDIV_SENA 0x80000000
-+
-+#define SYSCON_I2SDIV_PDIV_OFF 0x00000000
-+#define SYSCON_I2SDIV_PDIV_2 0x00000100
-+#define SYSCON_I2SDIV_PDIV_25 0x00000200
-+#define SYSCON_I2SDIV_PDIV_3 0x00000300
-+
-+#define SYSCON_I2SDIV_LRDIV_32 0x00000000
-+#define SYSCON_I2SDIV_LRDIV_64 0x00020000
-+#define SYSCON_I2SDIV_LRDIV_128 0x00040000
-+
-+/* KTDIV Register Defines */
-+#define SYSCON_KTDIV_KDIV 0x00000001
-+#define SYSCON_KTDIV_KEN 0x00008000
-+#define SYSCON_KTDIV_ADIV 0x00010000
-+#define SYSCON_KTDIV_TSEN 0x80000000
-+
-+/* CHIPID Register Defines */
-+#define SYSCON_CHIPID_ID_MASK 0x0000ffff
-+#define SYSCON_CHIPID_ID_SHIFT 0
-+#define SYSCON_CHIPID_PKID 0x00010000
-+#define SYSCON_CHIPID_BND 0x00040000
-+#define SYSCON_CHIPID_FAB_MASK 0x0e000000
-+#define SYSCON_CHIPID_FAB_SHIFT 25
-+#define SYSCON_CHIPID_REV_MASK 0xf0000000
-+#define SYSCON_CHIPID_REV_SHIFT 28
-+
-+/* TESTCR Register Defines */
-+#define SYSCON_TESTCR_TMODE_MASK 0x000000ff
-+#define SYSCON_TESTCR_TMODE_SHIFT 0
-+#define SYSCON_TESTCR_BONDO 0x00000100
-+#define SYSCON_TESTCR_PACKO 0x00000800
-+#define SYSCON_TESTCR_ETOM 0x00002000
-+#define SYSCON_TESTCR_TOM 0x00004000
-+#define SYSCON_TESTCR_OVR 0x00008000
-+#define SYSCON_TESTCR_TonIDE 0x00010000
-+#define SYSCON_TESTCR_RonG 0x00020000
-+
-+/* SYSCFG Register Defines */
-+#define SYSCON_SYSCFG_LCSn1 0x00000001
-+#define SYSCON_SYSCFG_LCSn2 0x00000002
-+#define SYSCON_SYSCFG_LCSn3 0x00000004
-+#define SYSCON_SYSCFG_LEECK 0x00000008
-+#define SYSCON_SYSCFG_LEEDA 0x00000010
-+#define SYSCON_SYSCFG_LASDO 0x00000020
-+#define SYSCON_SYSCFG_LCSn6 0x00000040
-+#define SYSCON_SYSCFG_LCSn7 0x00000080
-+#define SYSCON_SYSCFG_SBOOT 0x00000100
-+#define SYSCON_SYSCFG_FAB_MASK 0x0e000000
-+#define SYSCON_SYSCFG_FAB_SHIFT 25
-+#define SYSCON_SYSCFG_REV_MASK 0xf0000000
-+#define SYSCON_SYSCFG_REV_SHIFT 28
-+
-+/* PWRSR Register Defines */
-+#define SYSCON_PWRSR_CHIPMAN_MASK 0xFF000000
-+#define SYSCON_PWRSR_CHIPMAN_SHIFT 24
-+#define SYSCON_PWRSR_CHIPID_MASK 0x00FF0000
-+#define SYSCON_PWRSR_CHIPID_SHIFT 16
-+#define SYSCON_PWRSR_WDTFLG 0x00008000
-+#define SYSCON_PWRSR_CLDFLG 0x00002000
-+#define SYSCON_PWRSR_TEST_RESET 0x00001000
-+#define SYSCON_PWRSR_RSTFLG 0x00000800
-+#define SYSCON_PWRSR_SWRESET 0x00000400
-+#define SYSCON_PWRSR_PLL2_LOCKREG 0x00000200
-+#define SYSCON_PWRSR_PLL2_LOCK 0x00000100
-+#define SYSCON_PWRSR_PLL1_LOCKREG 0x00000080
-+#define SYSCON_PWRSR_PLL1_LOCK 0x00000040
-+#define SYSCON_PWRSR_RTCDIV 0x0000003F
-+
-+/* PWRCNT Register Defines */
-+#define SYSCON_PWRCNT_FIREN 0x80000000
-+#define SYSCON_PWRCNT_UARTBAUD 0x20000000
-+#define SYSCON_PWRCNT_USHEN 0x10000000
-+#define SYSCON_PWRCNT_DMA_M2MCH1 0x08000000
-+#define SYSCON_PWRCNT_DMA_M2MCH0 0x04000000
-+#define SYSCON_PWRCNT_DMA_M2PCH8 0x02000000
-+#define SYSCON_PWRCNT_DMA_M2PCH9 0x01000000
-+#define SYSCON_PWRCNT_DMA_M2PCH6 0x00800000
-+#define SYSCON_PWRCNT_DMA_M2PCH7 0x00400000
-+#define SYSCON_PWRCNT_DMA_M2PCH4 0x00200000
-+#define SYSCON_PWRCNT_DMA_M2PCH5 0x00100000
-+#define SYSCON_PWRCNT_DMA_M2PCH2 0x00080000
-+#define SYSCON_PWRCNT_DMA_M2PCH3 0x00040000
-+#define SYSCON_PWRCNT_DMA_M2PCH0 0x00020000
-+#define SYSCON_PWRCNT_DMA_M2PCH1 0x00010000
-+
-+/* BMAR Register Defines */
-+#define BMAR_PRIORD_00 0x00000000
-+#define BMAR_PRIORD_01 0x00000001
-+#define BMAR_PRIORD_02 0x00000002
-+#define BMAR_PRIORD_03 0x00000003
-+#define BMAR_PRI_CORE 0x00000008
-+#define BMAR_DMA_ENIRQ 0x00000010
-+#define BMAR_DMA_ENFIQ 0x00000020
-+#define BMAR_USB_ENIRQ 0x00000040
-+#define BMAR_USB_ENFIQ 0x00000080
-+#define BMAR_MAC_ENIRQ 0x00000100
-+#define BMAR_MAC_ENFIQ 0x00000200
-+#define BMAR_GRAPHICS_ENIRQ 0x00000400
-+#define BMAR_GRAPHICS_ENFIQ 0x00000800
-+
-+#endif /* _REGS_SYSCON_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_touch.h b/include/asm-arm/arch-ep93xx/regs_touch.h
-new file mode 100644
-index 0000000..aad8a99
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_touch.h
-@@ -0,0 +1,94 @@
-+/*=============================================================================
-+ *
-+ * FILE: regs_touch.h
-+ *
-+ * DESCRIPTION: Analog Touchscreen Register Definition
-+ *
-+ * Copyright Cirrus Logic, 2001-2003
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *=============================================================================
-+ */
-+#ifndef _REGS_TOUCH_H_
-+#define _REGS_TOUCH_H_
-+
-+/*
-+ *-----------------------------------------------------------------------------
-+ * Individual bit #defines
-+ *-----------------------------------------------------------------------------
-+ */
-+#define TSSETUP_SDLY_MASK 0x000003FF
-+#define TSSETUP_SDLY_SHIFT 0
-+#define TSSETUP_NSMP_4 0x00000000
-+#define TSSETUP_NSMP_8 0x00000400
-+#define TSSETUP_NSMP_16 0x00000800
-+#define TSSETUP_NSMP_32 0x00000C00
-+#define TSSETUP_NSMP_MASK 0x00000C00
-+#define TSSETUP_DEV_4 0x00000000
-+#define TSSETUP_DEV_8 0x00001000
-+#define TSSETUP_DEV_12 0x00002000
-+#define TSSETUP_DEV_16 0x00003000
-+#define TSSETUP_DEV_24 0x00004000
-+#define TSSETUP_DEV_32 0x00005000
-+#define TSSETUP_DEV_64 0x00006000
-+#define TSSETUP_DEV_128 0x00007000
-+#define TSSETUP_ENABLE 0x00008000
-+#define TSSETUP_DLY_MASK 0x03FF0000
-+#define TSSETUP_DLY_SHIFT 16
-+#define TSSETUP_TDTCT 0x80000000
-+
-+#define TSMAXMIN_XMIN_MASK 0x000000FF
-+#define TSMAXMIN_XMIN_SHIFT 0
-+#define TSMAXMIN_YMIN_MASK 0x0000FF00
-+#define TSMAXMIN_YMIN_SHIFT 8
-+#define TSMAXMIN_XMAX_MASK 0x00FF0000
-+#define TSMAXMIN_XMAX_SHIFT 16
-+#define TSMAXMIN_YMAX_MASK 0xFF000000
-+#define TSMAXMIN_YMAX_SHIFT 24
-+
-+#define TSXYRESULT_X_MASK 0x00000FFF
-+#define TSXYRESULT_X_SHIFT 0
-+#define TSXYRESULT_AD_MASK 0x0000FFFF
-+#define TSXYRESULT_AD_SHIFT 0
-+#define TSXYRESULT_Y_MASK 0x0FFF0000
-+#define TSXYRESULT_Y_SHIFT 16
-+#define TSXYRESULT_SDR 0x80000000
-+
-+#define TSX_SAMPLE_MASK 0x00003FFF
-+#define TSX_SAMPLE_SHIFT 0x00
-+#define TSY_SAMPLE_MASK 0x3FFF0000
-+#define TSY_SAMPLE_SHIFT 0x10
-+
-+#define TSSETUP2_TINT 0x00000001
-+#define TSSETUP2_NICOR 0x00000002
-+#define TSSETUP2_PINT 0x00000004
-+#define TSSETUP2_PENSTS 0x00000008
-+#define TSSETUP2_PINTEN 0x00000010
-+#define TSSETUP2_DEVINT 0x00000020
-+#define TSSETUP2_DINTEN 0x00000040
-+#define TSSETUP2_DTMEN 0x00000080
-+#define TSSETUP2_DISDEV 0x00000100
-+#define TSSETUP2_NSIGND 0x00000200
-+#define TSSETUP2_S28EN 0x00000400
-+#define TSSETUP2_RINTEN 0x00000800
-+
-+#define TSXYRESULT_SDR 0x80000000
-+
-+/*
-+ *-----------------------------------------------------------------------------
-+ *-----------------------------------------------------------------------------
-+ */
-+
-+#endif /* _REGS_TOUCH_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/regs_uart.h b/include/asm-arm/arch-ep93xx/regs_uart.h
-new file mode 100644
-index 0000000..cfadf4a
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/regs_uart.h
-@@ -0,0 +1,84 @@
-+/*
-+ * File: linux/include/asm-arm/arch-ep93xx/regs_uart.h
-+ *
-+ * Copyright (C) 2003 Cirrus Logic, Inc
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef _REGS_UART_H_
-+#define _REGS_UART_H_
-+
-+/* Bits in UARTRSR */
-+#define UARTRSR_FE 0x00000001 /* Framing error */
-+#define UARTRSR_PE 0x00000002 /* Parity error */
-+#define UARTRSR_BE 0x00000004 /* Break error */
-+#define UARTRSR_OE 0x00000008 /* Overrun error */
-+
-+/* Bits in UARTCR - UART1CR, UART2CR, or UART3CR */
-+#define UARTLCR_H_BRK 0x00000001
-+#define UARTLCR_H_PEN 0x00000002
-+#define UARTLCR_H_EPS 0x00000004
-+#define UARTLCR_H_STP2 0x00000008
-+#define UARTLCR_H_FEN 0x00000010
-+#define UARTLCR_H_WLEN 0x00000060
-+#define UARTLCR_H_WLEN_8_DATA 0x00000060
-+#define UARTLCR_H_WLEN_7_DATA 0x00000040
-+#define UARTLCR_H_WLEN_6_DATA 0x00000020
-+#define UARTLCR_H_WLEN_5_DATA 0x00000000
-+
-+/* Bits in UARTFR - UART1FR, UART2FR, or UART3FR */
-+#define UARTFR_RSR_ERRORS 0x0000000F
-+#define UARTFR_CTS 0x00000001
-+#define UARTFR_DSR 0x00000002
-+#define UARTFR_DCD 0x00000004
-+#define UARTFR_BUSY 0x00000008
-+#define UARTFR_RXFE 0x00000010
-+#define UARTFR_TXFF 0x00000020
-+#define UARTFR_RXFF 0x00000040
-+#define UARTFR_TXFE 0x00000080
-+
-+/* Bits in UARTIIR */
-+#define UARTIIR_MIS 0x00000001
-+#define UARTIIR_RIS 0x00000002
-+#define UARTIIR_TIS 0x00000004
-+#define UARTIIR_RTIS 0x00000008
-+
-+/* Bits in UARTCR */
-+#define UARTCR_UARTE 0x00000001
-+#define UARTCR_MSIE 0x00000008
-+#define UARTCR_RIE 0x00000010
-+#define UARTCR_TIE 0x00000020
-+#define UARTCR_RTIE 0x00000040
-+#define UARTCR_LBE 0x00000080
-+
-+/* Bits in UARTMCR */
-+#define UARTMCR_DTR 0x00000001
-+#define UARTMCR_RTS 0x00000002
-+#define UARTMCR_OUT1 0x00000004
-+#define UARTMCR_OUT2 0x00000008
-+#define UARTMCR_LOOP 0x00000010
-+
-+/* Bits in UARTMSR */
-+#define UARTMSR_DCTS 0x00000001
-+#define UARTMSR_DDSR 0x00000002
-+#define UARTMSR_TERI 0x00000004
-+#define UARTMSR_DDCD 0x00000008
-+#define UARTMSR_CTS 0x00000010
-+#define UARTMSR_DSR 0x00000020
-+#define UARTMSR_RI 0x00000040
-+#define UARTMSR_DCD 0x00000080
-+
-+#endif /* _REGS_UART_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/serial.h b/include/asm-arm/arch-ep93xx/serial.h
-new file mode 100644
-index 0000000..06ab737
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/serial.h
-@@ -0,0 +1,49 @@
-+/*
-+ * linux/include/asm-arm/arch-integrator/serial.h
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef __ASM_ARCH_SERIAL_H
-+#define __ASM_ARCH_SERIAL_H
-+
-+#include <asm/arch/platform.h>
-+#include <asm/irq.h>
-+
-+/*
-+ * This assumes you have a 1.8432 MHz clock for your UART.
-+ *
-+ * It'd be nice if someone built a serial card with a 24.576 MHz
-+ * clock, since the 16550A is capable of handling a top speed of 1.5
-+ * megabits/second; but this requires the faster clock.
-+ */
-+#define BASE_BAUD (1843200 / 16)
-+
-+#define _SER_IRQ0 IRQ_UARTINT0
-+#define _SER_IRQ1 IRQ_UARTINT1
-+
-+#define RS_TABLE_SIZE 2
-+
-+#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
-+
-+ /* UART CLK PORT IRQ FLAGS */
-+#define STD_SERIAL_PORT_DEFNS \
-+ { 0, BASE_BAUD, 0x3F8, _SER_IRQ0, STD_COM_FLAGS }, /* ttyS0 */ \
-+ { 0, BASE_BAUD, 0x2F8, _SER_IRQ1, STD_COM_FLAGS }, /* ttyS1 */
-+
-+#define EXTRA_SERIAL_PORT_DEFNS
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/ssp-cirrus.h b/include/asm-arm/arch-ep93xx/ssp-cirrus.h
-new file mode 100644
-index 0000000..e29dc9d
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/ssp-cirrus.h
-@@ -0,0 +1,30 @@
-+/*
-+ *
-+ * FILE: ssp.h
-+ *
-+ * DESCRIPTION: SSP Interface Driver Module implementation
-+ *
-+ * Copyright Cirrus Logic Corporation, 2001-2003. All rights reserved
-+ *
-+ */
-+#ifndef _SSP_DRV_H_
-+#define _SSP_DRV_H_
-+
-+enum SSPDeviceType {
-+ PS2_KEYBOARD = 0,
-+ I2S_CODEC = 1,
-+ SERIAL_FLASH = 2
-+};
-+
-+typedef void (*SSPDataCallback) (unsigned int Data);
-+
-+typedef struct _SSP_DRIVER_API {
-+ int (*Open) (enum SSPDeviceType Device, SSPDataCallback Callback);
-+ int (*Read) (int Handle, unsigned int Addr, unsigned int *pValue);
-+ int (*Write) (int Handle, unsigned int Addr, unsigned int Value);
-+ int (*Close) (int Handle);
-+} SSP_DRIVER_API;
-+
-+extern SSP_DRIVER_API *SSPDriver;
-+
-+#endif /* _SSP_DRV_H_ */
-diff --git a/include/asm-arm/arch-ep93xx/ssp.h b/include/asm-arm/arch-ep93xx/ssp.h
-new file mode 100644
-index 0000000..9102233
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/ssp.h
-@@ -0,0 +1,121 @@
-+/*
-+ * ssp.h
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi, All Rights Reserved.
-+ * Copyright (C) 2004 Siconix, Inc., All Rights Reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef SSP_H
-+#define SSP_H
-+
-+#include <linux/list.h>
-+#include <linux/completion.h>
-+#include <asm/semaphore.h>
-+
-+struct ssp_master_ops;
-+struct ssp_slave;
-+
-+struct ssp_transfer {
-+
-+ /* how many _bytes_ per unit of data */
-+ int size;
-+
-+ /* how many units of data left to be clocked out */
-+ int len;
-+
-+ /* how many units of data left to be clocked in */
-+ int rlen;
-+
-+ /* buffer of units to shift out to slave */
-+ void *tx;
-+
-+ /* buffer to hold units shifted in from slave */
-+ void *rx;
-+
-+ /* signaled when complete */
-+ struct completion *c;
-+};
-+
-+struct ssp_master {
-+
-+ /* serialize access to the frontend */
-+ struct semaphore sem;
-+
-+ /* synchronize the frontend and the backend */
-+ struct completion completion;
-+
-+ /* the slave devices on this master */
-+ struct list_head slave;
-+
-+ /* the active transfer on the bus */
-+ struct ssp_transfer transfer;
-+
-+ /* methods for different master controllers */
-+ struct ssp_master_ops *ops;
-+};
-+
-+struct ssp_master_ops {
-+
-+ /* configure the master for accessing a particular slave */
-+ int (*configure) (struct ssp_slave *);
-+
-+ /* enable the backend to start the transfer */
-+ int (*enable) (struct ssp_transfer *);
-+
-+ /* disable the backend to stop the transfer */
-+ int (*disable) (void);
-+};
-+
-+struct ssp_slave {
-+
-+ /* our link in the masters list of slaves */
-+ struct list_head list;
-+
-+ /* our master */
-+ struct ssp_master *master;
-+#if 0
-+ /* the upper level protocol spoken by the device */
-+ struct ssp_protocol *protocol;
-+#endif
-+ /* the phase and polarity modes we support */
-+ unsigned long supported_modes;
-+
-+ /* our maximum clock rate, in Hz */
-+ unsigned long max_clock_rate;
-+
-+ /* our data unit size, in bits */
-+ int word_size;
-+
-+ /* our data unit size, in bytes */
-+ int nbytes;
-+
-+ /* assert or negate the chip select line for this device */
-+ void (*chip_select) (struct ssp_slave *, int);
-+};
-+
-+/* manage the master-slave list */
-+extern int ssp_add_slave(struct ssp_master *, struct ssp_slave *);
-+extern void ssp_remove_slave(struct ssp_master *, struct ssp_slave *);
-+
-+/* perform a single transaction */
-+extern int ssp_do(struct ssp_slave *s, int len, void *tx, void *rx);
-+
-+/* perform each step of a transaction */
-+extern int ssp_start(struct ssp_slave *s); /* grab master, blocking */
-+extern int ssp_trystart(struct ssp_slave *s); /* grab master, non-blocking */
-+extern void ssp_select(struct ssp_slave *s); /* assert CS */
-+extern int ssp_post(struct ssp_slave *s, int len, void *tx, void *rx); /* start a transfer */
-+extern int ssp_wait(struct ssp_slave *s); /* wait for completion */
-+ /*extern int ssp_disable (struct ssp_slave *s); *//* stop a transfer */
-+extern void ssp_deselect(struct ssp_slave *s); /* negate CS */
-+extern void ssp_finish(struct ssp_slave *s); /* release master */
-+
-+/* module stuff */
-+extern int ssp_init(void);
-+extern void ssp_exit(void);
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/ssp2.h b/include/asm-arm/arch-ep93xx/ssp2.h
-new file mode 100644
-index 0000000..93823a0
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/ssp2.h
-@@ -0,0 +1,29 @@
-+/*
-+ * ssp.h
-+ *
-+ * Copyright (C) 2004 Ray Lehtiniemi, All Rights Reserved.
-+ * Copyright (C) 2004 Siconix, Inc., All Rights Reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef SSP2_H
-+#define SSP2_H
-+
-+#include <asm/arch/ssp.h>
-+
-+struct ep93xx_ssp_slave {
-+ struct ssp_slave slave;
-+ unsigned long cr0;
-+ unsigned long cr1;
-+ unsigned long cpsr;
-+};
-+
-+extern struct ssp_master ep93xx_ssp_master;
-+
-+extern int ep93xx_ssp_init(void);
-+extern void ep93xx_ssp_exit(void);
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/system.h b/include/asm-arm/arch-ep93xx/system.h
-new file mode 100644
-index 0000000..1030210
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/system.h
-@@ -0,0 +1,68 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/system.h
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ * Copyright (C) 2000 Deep Blue Solutions Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef __ASM_ARCH_SYSTEM_H
-+#define __ASM_ARCH_SYSTEM_H
-+
-+#include <asm/arch/platform.h>
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+
-+static void arch_idle(void)
-+{
-+ unsigned long val = readl(SYSCON_DEVCFG);
-+ val = ep93xx_SYSCON_DEVCFG(val | SYSCON_DEVCFG_SHena);
-+ SysconSetLocked(SYSCON_DEVCFG, val);
-+ readl(SYSCON_HALT);
-+}
-+
-+#if defined(CONFIG_MACH_TTML)
-+
-+#include <asm/arch/mach-ttml.h>
-+extern __inline__ void arch_reset(char mode)
-+{
-+ /* reboot using micro */
-+ unsigned char msg[4] = { 0xaa, 0x90, 0xa0, 0x65 };
-+ unsigned char reply[10];
-+ (void)ssp_do_ttml(&ep93xx_ssp_micro, msg, 4, reply, 10);
-+ while (1) ;
-+}
-+
-+#else
-+
-+extern __inline__ void arch_reset(char mode)
-+{
-+#if 1
-+ /* reboot using SW_RESET bit in devcfg register */
-+ unsigned long val = readl(SYSCON_DEVCFG);
-+ SysconSetLocked(SYSCON_DEVCFG,
-+ ep93xx_SYSCON_DEVCFG(val | SYSCON_DEVCFG_SWRST));
-+ SysconSetLocked(SYSCON_DEVCFG,
-+ ep93xx_SYSCON_DEVCFG(val & ~SYSCON_DEVCFG_SWRST));
-+
-+#else
-+ /* reboot using 0.250 second onboard watchdog timeout */
-+ writel(0xaaaa, WATCHDOG);
-+ while (1) ;
-+#endif
-+}
-+#endif
-+
-+#endif
-diff --git a/include/asm-arm/arch-ep93xx/timex.h b/include/asm-arm/arch-ep93xx/timex.h
-new file mode 100644
-index 0000000..87a7628
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/timex.h
-@@ -0,0 +1,26 @@
-+/*
-+ * linux/include/asm-arm/arch-integrator/timex.h
-+ *
-+ * Integrator architecture timex specifications
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/*
-+ * ??
-+ */
-+#define CLOCK_TICK_RATE (50000000 / 16)
-diff --git a/include/asm-arm/arch-ep93xx/uncompress.h b/include/asm-arm/arch-ep93xx/uncompress.h
-new file mode 100644
-index 0000000..f76de3c
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/uncompress.h
-@@ -0,0 +1,91 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/uncompress.h
-+ *
-+ * Copyright (C) 1999 ARM Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+
-+#if defined(CONFIG_MACH_ZEFEERDZA) || defined(CONFIG_MACH_ZEFEERDZB) || \
-+ defined(CONFIG_MACH_ZEFEERDZG) || defined(CONFIG_MACH_ZEFEERDZN) || defined(CONFIG_MACH_ZEFEERDZQ)
-+# define BAUDRATE ((EP93XX_UART_CLK/(16 * 115200)) - 1)
-+#else
-+# define BAUDRATE ((EP93XX_UART_CLK/(16 * 57600)) - 1)
-+#endif
-+
-+#define HW_PREG(reg) ((unsigned int volatile *)(io_v2p(reg)))
-+
-+static void putstr(const char *s)
-+{
-+ while (*s) {
-+ while (*HW_PREG(UART1FR) & UARTFR_TXFF) ;
-+
-+ *HW_PREG(UART1DR) = *s;
-+
-+ if (*s == '\n') {
-+ while (*HW_PREG(UART1FR) & UARTFR_TXFF) ;
-+
-+ *HW_PREG(UART1DR) = '\r';
-+ }
-+ s++;
-+ }
-+ while (*HW_PREG(UART1FR) & UARTFR_BUSY) ;
-+}
-+
-+static void EnableUart(void)
-+{
-+ /*
-+ * Ensure that the base clock to the UARTS is 14.7456Mhz
-+ * and that UART1 is enabled.
-+ */
-+ *HW_PREG(SYSCON_PWRCNT) = SYSCON_PWRCNT_UARTBAUD;
-+
-+ *HW_PREG(SYSCON_SWLOCK) = 0xaa;
-+ *HW_PREG(SYSCON_DEVCFG) = (*HW_PREG(SYSCON_DEVCFG)) | SYSCON_DEVCFG_U1EN;
-+
-+ /* Disable the UARTS and clear out the old settings. */
-+ *HW_PREG(UART1MCR) = 0;
-+ *HW_PREG(UART1CR) = 0;
-+ *HW_PREG(UART1RSR) = 0;
-+ *HW_PREG(UART1CR_L) = 0;
-+ *HW_PREG(UART1CR_M) = 0;
-+ *HW_PREG(UART1CR_H) = 0;
-+
-+ /* Set the baud rate and framing */
-+ *HW_PREG(UART1CR_L) = (BAUDRATE & 0x0FF);
-+ *HW_PREG(UART1CR_M) = ((BAUDRATE >> 8) & 0x0FF);
-+
-+ /* 8 Data bits, No Parity, 1 Stop bit. */
-+ *HW_PREG(UART1CR_H) = (UARTLCR_H_WLEN_8_DATA | UARTLCR_H_FEN);
-+
-+ /* Enable Uart */
-+ *HW_PREG(UART1CR) = UARTCR_UARTE;
-+}
-+
-+#if defined(CONFIG_MACH_ADSSPHERE)
-+#define arch_decomp_setup()
-+#else
-+
-+/* Called early before the UART is used for output by the compressed loader. */
-+static void arch_decomp_setup(void)
-+{
-+ EnableUart();
-+}
-+#endif
-+
-+#define arch_decomp_wdog()
-diff --git a/include/asm-arm/arch-ep93xx/vmalloc.h b/include/asm-arm/arch-ep93xx/vmalloc.h
-new file mode 100644
-index 0000000..ec8f98d
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/vmalloc.h
-@@ -0,0 +1,32 @@
-+/*
-+ * linux/include/asm-arm/arch-integrator/vmalloc.h
-+ *
-+ * Copyright (C) 2000 Russell King.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+/*
-+ * Just any arbitrary offset to the start of the vmalloc VM area: the
-+ * current 8MB value just means that there will be a 8MB "hole" after the
-+ * physical memory until the kernel virtual memory starts. That means that
-+ * any out-of-bounds memory accesses will hopefully be caught.
-+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
-+ * area for the same reason. ;)
-+ */
-+#define VMALLOC_OFFSET (8*1024*1024)
-+#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
-+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
-+#define VMALLOC_END (PAGE_OFFSET + 0x10000000)
-diff --git a/include/asm-arm/arch-ep93xx/zefeerevb.h b/include/asm-arm/arch-ep93xx/zefeerevb.h
-new file mode 100644
-index 0000000..2cb3f84
---- /dev/null
-+++ b/include/asm-arm/arch-ep93xx/zefeerevb.h
-@@ -0,0 +1,51 @@
-+/*
-+ * linux/include/asm-arm/arch-ep93xx/platform.h
-+ *
-+ * Copyright (C) 2004 DAVE Srl <www.dave-tech.it>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+#ifndef ASM_ARCH_ZEFEEREVB_H
-+#define ASM_ARCH_ZEFEEREVB_H
-+
-+#ifdef CONFIG_MACH_ZEFEER_EVBL_107
-+/* GPIO pins used to drive NAND chip mounted on old EVB */
-+/*
-+ nCE = EGPIO2
-+ CLE = EGPIO0
-+ ALE = EGPIO1
-+ R/B = EGPIO3
-+*/
-+# define NAND_EVB_nCE_GPIO_PIN (1 << 2)
-+# define NAND_EVB_CLE_GPIO_PIN (1 << 0)
-+# define NAND_EVB_ALE_GPIO_PIN (1 << 1)
-+# define NAND_EVB_RB_GPIO_PIN (1 << 3)
-+#else
-+/* GPIO pins used to drive NAND chip mounted on EVB */
-+/*
-+ nCE = EGPIO6
-+ CLE = EGPIO4
-+ ALE = EGPIO5
-+ R/B = EGPIO7
-+*/
-+# define NAND_EVB_nCE_GPIO_PIN (1 << 6)
-+# define NAND_EVB_CLE_GPIO_PIN (1 << 4)
-+# define NAND_EVB_ALE_GPIO_PIN (1 << 5)
-+# define NAND_EVB_RB_GPIO_PIN (1 << 7)
-+#endif
-+
-+#define ZEFEEREVB_NAND_PADDR 0x20000000
-+
-+#endif /* ASM_ARCH_ZEFEEREVB_H */
-diff --git a/include/asm-arm/irq.h b/include/asm-arm/irq.h
-index 59975ee..755d9de 100644
---- a/include/asm-arm/irq.h
-+++ b/include/asm-arm/irq.h
-@@ -38,6 +38,12 @@ extern void enable_irq(unsigned int);
- #define IRQT_HIGH (__IRQT_HIGHLVL)
- #define IRQT_PROBE (1 << 4)
-
-+/*
-+ * Flags for enable and disable debounce
-+ */
-+#define IRQT_DB ( 1 << 5 )
-+#define IRQT_NOTDB ( 1 << 6 )
-+
- int set_irq_type(unsigned int irq, unsigned int type);
- void disable_irq_wake(unsigned int irq);
- void enable_irq_wake(unsigned int irq);
-diff --git a/include/asm-arm/procinfo.h b/include/asm-arm/procinfo.h
-index a9c75b2..556e5d8 100644
---- a/include/asm-arm/procinfo.h
-+++ b/include/asm-arm/procinfo.h
-@@ -56,5 +56,6 @@ extern unsigned int elf_hwcap;
- #define HWCAP_VFP 64
- #define HWCAP_EDSP 128
- #define HWCAP_JAVA 256
-+#define HWCAP_CRUNCH 512
-
- #endif
-diff --git a/include/linux/can/oki_ml9620_ctrl.h b/include/linux/can/oki_ml9620_ctrl.h
-new file mode 100644
-index 0000000..d2cfbea
---- /dev/null
-+++ b/include/linux/can/oki_ml9620_ctrl.h
-@@ -0,0 +1,54 @@
-+/*
-+ * include/linux/can/oki_ml9620_ctrl.h
-+ *
-+ * OKI ML9620 CAN Controler driver
-+ *
-+ * Author: Manfred Gruber <manfred.gruber@contec.at>
-+ *
-+ * Copyright 2004 (c) Manfred Gruber
-+ * Copyright 2004 (c) Contec Steuerungstechnik & Automation Ges.m.b.H
-+ * Kufstein/Austria www.contec.at
-+ *
-+ * This driver was written for Contec hypercontrol Micro9 Board
-+ * 1. CAN Controller is on Hypercontrol Micro9 CPU board
-+ * 2. CAN Controller is on Hypercontrol Micro9 eval board
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ */
-+
-+#ifndef _OKI_ML9620_CTRL_H_
-+#define _OKI_ML9620_CTRL_H_
-+
-+#ifdef __KERNEL__
-+struct can_msg {
-+ unsigned short id; /* identifier */
-+ unsigned short dlc : 4; /* bitfield 4: data length code [0..8] */
-+ unsigned short rtr : 1; /* bitfield 1: rtr bit */
-+ unsigned short ext : 1; /* bitfield 1: extended ID */
-+ unsigned short pad : 10; /* workaround alignment issues:
-+ FIXME: completely remove that bitfield junk */
-+ unsigned char data[8]; /* data bytes */
-+};
-+#endif
-+
-+#define CAN_STS_CNTRL_OFF 0 /*!< set CAN controller off */
-+#define CAN_STS_CNTRL_ON 1 /*!< set CAN controller on */
-+#define CAN_STS_CNTRL_SLEEP 2 /*!< set CAN controller sleep mode */
-+#define CAN_STS_CNTRL_AWAKE 3 /*!< set CAN controller wake up */
-+#define CAN_STS_NORMAL 0x00 /*!< CAN controller status normal */
-+#define CAN_STS_RESET 0x01 /*!< CAN controller status reset */
-+#define CAN_STS_WARNING 0x02 /*!< CAN controller status warning */
-+#define CAN_STS_BUS_OFF 0x04 /*!< CAN controller status bus off */
-+#define CAN_STS_SLEEPING 0x08 /*!< CAN controller status sleeping */
-+#define CAN_STS_OVERRUN 0x10 /*!< CAN controller status overrun */
-+#define CAN_STS_TXOK 0x20 /*!< CAN message transmitted */
-+
-+#define COMMAND 0
-+#define CONFIG 1
-+#define SEND 2
-+#define RECEIVE 3
-+#define STATUS 4
-+
-+#endif
-diff --git a/include/linux/input.h b/include/linux/input.h
-index 3c58233..8ea2247 100644
---- a/include/linux/input.h
-+++ b/include/linux/input.h
-@@ -414,6 +414,7 @@ struct input_absinfo {
- #define BTN_STYLUS2 0x14c
- #define BTN_TOOL_DOUBLETAP 0x14d
- #define BTN_TOOL_TRIPLETAP 0x14e
-+#define BTN_RAW 0x14f
-
- #define BTN_WHEEL 0x150
- #define BTN_GEAR_DOWN 0x150
-diff --git a/include/linux/irda.h b/include/linux/irda.h
-index 95dee17..3172c96 100644
---- a/include/linux/irda.h
-+++ b/include/linux/irda.h
-@@ -76,6 +76,7 @@ typedef enum {
- IRDA_MCP2120_DONGLE = 9,
- IRDA_ACT200L_DONGLE = 10,
- IRDA_MA600_DONGLE = 11,
-+ IRDA_EP93XX_SIR = 12,
- } IRDA_DONGLE;
-
- /* Protocol types to be used for SOCK_DGRAM */
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index b0ad6f3..2ee1652 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -883,6 +883,11 @@ extern void __put_task_struct(struct tas
- #define put_task_struct(tsk) \
- do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0)
-
-+#ifdef CONFIG_EP93XX_CRUNCH
-+#define PF_USEDCRUNCH 0x00200000 /* introduced to preserve PF_USEDFPU
-+ meaning across the architecture */
-+#endif
-+
- /*
- * Per process flags
- */
-diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
-index e3710d7..a1c9b53 100644
---- a/include/linux/serial_core.h
-+++ b/include/linux/serial_core.h
-@@ -124,6 +124,9 @@
- /* Hilscher netx */
- #define PORT_NETX 71
-
-+/* Cirrus EP93xx family */
-+#define PORT_EP93XX 65
-+
- #ifdef __KERNEL__
-
- #include <linux/config.h>
-diff --git a/include/linux/ttml.h b/include/linux/ttml.h
-new file mode 100644
-index 0000000..2b0e327
---- /dev/null
-+++ b/include/linux/ttml.h
-@@ -0,0 +1,61 @@
-+/*
-+ * include/linux/ttml.h
-+ *
-+ * TTML TripDawg system devices.
-+ *
-+ * Copyright 2004, Ray Lehtiniemi
-+ * Copyright 2004, Siconix, Inc
-+ */
-+
-+#ifndef __TTML_H
-+#define __TTML_H
-+
-+#define TTML_MAJOR MISC_MAJOR
-+
-+#define TTML_MINOR_LED 240
-+#define TTML_MINOR_BUZZER 241
-+#define TTML_MINOR_SPEEDO 242
-+#define TTML_MINOR_GPIO 243
-+#define TTML_MINOR_BUTTON 244
-+#define TTML_MINOR_WD 245
-+
-+#define MAX_TTML_MINORS 6
-+
-+struct ttml_ioctl_led {
-+ int blue;
-+ int red;
-+ int yellow;
-+};
-+
-+struct ttml_ioctl_buzzer {
-+ int buzzer1;
-+};
-+
-+struct ttml_ioctl_speedo {
-+ int instant;
-+ int average;
-+};
-+
-+struct ttml_ioctl_gpio {
-+ int pto;
-+ int ignition;
-+ int spare;
-+};
-+
-+struct ttml_ioctl_button {
-+ int button1;
-+ int portf;
-+};
-+
-+#define TTML_IOCTL 't'
-+
-+#define TTML_GET_LED _IOR(TTML_IOCTL, 0, struct ttml_ioctl_led)
-+#define TTML_GET_BUZZER _IOR(TTML_IOCTL, 1, struct ttml_ioctl_buzzer)
-+#define TTML_GET_SPEEDO _IOR(TTML_IOCTL, 2, struct ttml_ioctl_speedo)
-+#define TTML_GET_GPIO _IOR(TTML_IOCTL, 3, struct ttml_ioctl_gpio)
-+#define TTML_GET_BUTTON _IOR(TTML_IOCTL, 4, struct ttml_ioctl_button)
-+
-+#define TTML_SET_LED _IOW(TTML_IOCTL, 16, struct ttml_ioctl_led)
-+#define TTML_SET_BUZZER _IOW(TTML_IOCTL, 17, struct ttml_ioctl_buzzer)
-+
-+#endif
-diff --git a/include/net/irda/ep93xx_irda.h b/include/net/irda/ep93xx_irda.h
-new file mode 100644
-index 0000000..0ee919d
---- /dev/null
-+++ b/include/net/irda/ep93xx_irda.h
-@@ -0,0 +1,261 @@
-+ /*********************************************************************
-+ *
-+ * Filename: ep93xx_irda.h
-+ * Version: 0.2
-+ * Description: Header for the EP93xx SOC IrDA driver.
-+ * Status: Experimental.
-+ *
-+ * Copyright 2003 Cirrus Logic, Inc.
-+ *
-+ * Based on the ali-ircc.c implementation:
-+ * Author: Benjamin Kong <benjamin_kong@ali.com.tw>
-+ * Created at: 2000/10/16 03:46PM
-+ * Modified at: 2001/1/3 02:55PM
-+ * Modified by: Benjamin Kong <benjamin_kong@ali.com.tw>
-+ *
-+ * Copyright (c) 2000 Benjamin Kong <benjamin_kong@ali.com.tw>
-+ * All Rights Reserved
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * 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:
-+ * Free Software Foundation, Inc.
-+ * 59 Temple Place, Suite 330
-+ * Boston, MA 02111-1307 USA
-+ ********************************************************************/
-+
-+#ifndef EP93XX_IRDA_H
-+#define EP93XX_IRDA_H
-+
-+#include <linux/time.h>
-+
-+#include <linux/spinlock.h>
-+#include <linux/pm.h>
-+#include <asm/io.h>
-+
-+/*
-+ * Number of DMA channels used
-+ */
-+#define DMA_COUNT 3
-+
-+/*
-+ * TX/RX window queues
-+ */
-+#define MAX_TX_WINDOW 7
-+#define MAX_RX_WINDOW 7
-+
-+struct ep93xx_chip {
-+ char *name;
-+ int iSIR_IRQ, iMFIR_IRQ;
-+ ep93xx_dma_dev_t eSIR_DMATx;
-+ ep93xx_dma_dev_t eMFIR_DMATx;
-+ ep93xx_dma_dev_t eMFIR_DMARx;
-+ int (*init) (struct ep93xx_chip * chip);
-+};
-+
-+/* For storing entries in the status FIFO */
-+
-+struct st_fifo_entry {
-+ int status;
-+ int len;
-+};
-+
-+struct st_fifo {
-+ struct st_fifo_entry entries[MAX_RX_WINDOW];
-+ int pending_bytes;
-+ int head;
-+ int tail;
-+ int len;
-+};
-+
-+struct frame_cb {
-+ void *start; /* Start of frame in DMA mem */
-+ int len; /* Lenght of frame in DMA mem */
-+};
-+
-+struct tx_fifo {
-+ struct frame_cb queue[MAX_TX_WINDOW]; /* Info about frames in queue */
-+ int ptr; /* Currently being sent */
-+ int len; /* Length of queue */
-+ int free; /* Next free slot */
-+ void *tail; /* Next free start in DMA mem */
-+};
-+
-+/* Private data for each instance */
-+struct ep93xx_irda_cb {
-+ struct st_fifo st_fifo; /* Info about received frames */
-+ struct tx_fifo tx_fifo; /* Info about frames to be transmitted */
-+
-+ struct net_device *netdev; /* Net device pointer */
-+ struct net_device_stats stats; /* Net device stats */
-+
-+ struct irlap_cb *irlap; /* The link layer we are binded with */
-+ struct qos_info qos; /* QoS capabilities for this device */
-+
-+ int iSIR_irq, iMFIR_irq; /* Interrupts used */
-+
-+ ep93xx_dma_dev_t ePorts[DMA_COUNT]; /* DMA port ids */
-+
-+ int iDMAh[DMA_COUNT]; /* handles for DMA channels */
-+ dma_addr_t rx_dmaphysh, tx_dmaphysh;
-+
-+ int fifo_size; /* FIFO size */
-+ iobuff_t tx_buff; /* Transmit buffer */
-+ iobuff_t rx_buff; /* Receive buffer */
-+
-+ char *conv_buf; /* Buffer used for SIR conversion */
-+
-+ struct timeval stamp; /* ? */
-+ struct timeval now; /* ? */
-+
-+ spinlock_t lock; /* Used for serializing operations */
-+
-+ __u32 flags; /* Interface flags */
-+
-+ __u8 direction; /* TX/RX flag */
-+
-+ __u32 speed; /* Currently used speed */
-+ __u32 new_speed; /* New target tx/rx speed */
-+
-+ int index; /* Instance index */
-+
-+ int suspended; /* APM suspend flag */
-+ struct pm_dev *dev; /* Power Management device */
-+
-+};
-+
-+/*
-+ * DMA array handle index meanings
-+ */
-+#define DMA_SIR_TX 0
-+#define DMA_MFIR_TX 1
-+#define DMA_MFIR_RX 2
-+
-+/*
-+ * Directional defines
-+ */
-+#define DIR_TX 0x01
-+#define DIR_RX 0x02
-+#define DIR_BOTH 0x03
-+
-+/*
-+ * Modes support flag defines.
-+ */
-+#define CLK_SIR 0x01
-+#define CLK_MIR 0x02
-+#define CLK_FIR 0x04
-+
-+/* Name friendly bit defines for register accesses */
-+
-+/* UART2/SIR */
-+#define U2RSR_OvnErr 0x08
-+#define U2RSR_BrkErr 0x04
-+#define U2RSR_PtyErr 0x02
-+#define U2RSR_FrmErr 0x01
-+
-+#define U2CRH_WLen 0x60
-+#define U2CRH_FEn 0x10
-+#define U2CRH_Stp2 0x08
-+#define U2CRH_EPS 0x04
-+#define U2CRH_PEn 0x02
-+#define U2CRH_Brk 0x01
-+
-+#define U2CR_LoopBk 0x80
-+#define U2CR_RxTO 0x40
-+#define U2CR_TxIrq 0x20
-+#define U2CR_RxIrq 0x10
-+#define U2CR_MdmStsIrq 0x08
-+#define U2CR_SIRLowPwr 0x04
-+#define U2CR_SIR 0x02
-+#define U2CR_UART 0x01
-+
-+#define U2FR_TXFE 0x80
-+#define U2FR_RXFF 0x40
-+#define U2FR_TXFF 0x20
-+#define U2FR_RXFE 0x10
-+#define U2FR_BUSY 0x08
-+#define U2FR_DCD 0x04
-+#define U2FR_DSR 0x02
-+#define U2FR_CTS 0x01
-+
-+#define U2IICR_RXTOIRQ 0x08
-+#define U2IICR_TXIRQ 0x04
-+#define U2IICR_RXIRQ 0x02
-+#define U2IICR_MDMIRQ 0x01
-+
-+#define U2DMACR_DMAErr 0x04
-+#define U2DMACR_TXDMA 0x02
-+#define U2DMACR_RXDMA 0x01
-+
-+#define IrENABLE_SIR 0x01
-+
-+/* IrDA block - MIR/FIR */
-+#define IrENABLE_FIR 0x03
-+#define IrENABLE_MIR 0x02
-+
-+#define IrCONTROL_RXRP 0x40
-+#define IrCONTROL_TXRP 0x20
-+#define IrCONTROL_RXON 0x10
-+#define IrCONTROL_TXON 0x08
-+#define IrCONTROL_TXUNDER 0x04
-+#define IrCONTROL_MIRBR 0x02
-+
-+#define IrFLAG_TXBUSY 0x200
-+#define IrFLAG_RXINFRM 0x100
-+#define IrFLAG_RXSYNC 0x80
-+#define IrFLAG_EOF 0x40
-+#define IrFLAG_WIDTHST 0x30
-+#define IrFLAG_FIRFE 0x08
-+#define IrFLAG_RXOR 0x04
-+#define IrFLAG_CRCERR 0x02
-+#define IrFLAG_RXABORT 0x01
-+
-+#define IrRIB_ByteCt 0x7FF0
-+#define IrRIB_BUFFE 0x08
-+#define IrRIB_BUFOR 0x04
-+#define IrRIB_BUFCRCERR 0x02
-+#define IrRIB_BUFRXABORT 0x01
-+
-+#define IrDMACR_DMAERR 0x04
-+#define IrDMACR_DMATXE 0x02
-+#define IrDMACR_DMARXE 0x01
-+
-+#define MFISR_RXFL 0x40
-+#define MFISR_RXIL 0x20
-+#define MFISR_RXFC 0x10
-+#define MFISR_RXFS 0x08
-+#define MFISR_TXFABORT 0x04
-+#define MFISR_TXFC 0x02
-+#define MFISR_TXSR 0x01
-+
-+#define MFIMR_RXFL 0x40
-+#define MFIMR_RXIL 0x20
-+#define MFIMR_RXFC 0x10
-+#define MFIMR_RXFS 0x08
-+#define MFIMR_TXABORT 0x04
-+#define MFIMR_TXFC 0x02
-+#define MFIMR_TXFS 0x01
-+
-+#define MFIIR_RXFL 0x40
-+#define MFIIR_RXIL 0x20
-+#define MFIIR_RXFC 0x10
-+#define MFIIR_RXFS 0x08
-+#define MFIIR_TXABORT 0x04
-+#define MFIIR_TXFC 0x02
-+#define MFIIR_TXFS 0x01
-+
-+#endif /* EP93XX_IRDA_H */
-diff --git a/init/do_mounts.c b/init/do_mounts.c
-index b27c110..29d2d52 100644
---- a/init/do_mounts.c
-+++ b/init/do_mounts.c
-@@ -410,7 +410,9 @@ void __init prepare_namespace(void)
- root_device_name += 5;
- }
-
-- is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
-+ /* llandre */
-+ /* To retrieve ramdisk from MTD partition we must add major 31 as suggested by rmk */
-+ is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR || MAJOR(ROOT_DEV) == 31;
-
- if (initrd_load())
- goto out;
-diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig
-index 88e52dc..cda016b 100644
---- a/sound/oss/Kconfig
-+++ b/sound/oss/Kconfig
-@@ -1004,6 +1004,26 @@ config SOUND_AEDSP16
- <file:Documentation/sound/oss/AudioExcelDSP16> to get more information
- about this driver and its configuration.
-
-+
-+config SOUND_EP93XX_AC97
-+ tristate "EP93xx AC97 Support"
-+ depends on SOUND_OSS && ARCH_EP93XX
-+ ---help---
-+ AC97 sound support for Cirrus EP93xx
-+
-+config SOUND_EP93XX_AC97_CODEC_CS4297
-+ bool "CS4297"
-+ depends on SOUND_EP93XX_AC97
-+ help
-+ Say Y here if you have CS4297 Codec.
-+
-+config SOUND_EP93XX_AUDIO_PIO
-+ bool "EP93xx AC97 in PIO mode"
-+ depends on SOUND_EP93XX_AC97
-+ ---help---
-+ Run EP93XX AC97 in PIO MODE.
-+ !!! NOT TESTED !!!
-+
- config SC6600
- bool "SC-6600 based audio cards (new Audio Excel DSP 16)"
- depends on SOUND_AEDSP16
-diff --git a/sound/oss/Makefile b/sound/oss/Makefile
-index 9bf3ee5..c7c1927 100644
---- a/sound/oss/Makefile
-+++ b/sound/oss/Makefile
-@@ -91,6 +91,9 @@ obj-$(CONFIG_SOUND_EMU10K1) += emu10k1/
- obj-$(CONFIG_SOUND_CS4281) += cs4281/
- obj-$(CONFIG_DMASOUND) += dmasound/
-
-+obj-$(CONFIG_SOUND_EP93XX_I2S) += ep93xx-audio.o ep93xx-i2s.o
-+obj-$(CONFIG_SOUND_EP93XX_AC97) += ep93xx-audio.o ep93xx-ac97.o
-+
- # Declare multi-part drivers.
-
- sound-objs := \
-diff --git a/sound/oss/ac97_codec.c b/sound/oss/ac97_codec.c
-index fd25aca..c7c9a02 100644
---- a/sound/oss/ac97_codec.c
-+++ b/sound/oss/ac97_codec.c
-@@ -156,6 +156,8 @@ static const struct {
- {0x43525931, "Cirrus Logic CS4299 rev A", &crystal_digital_ops},
- {0x43525933, "Cirrus Logic CS4299 rev C", &crystal_digital_ops},
- {0x43525934, "Cirrus Logic CS4299 rev D", &crystal_digital_ops},
-+ {0x4352594d, "Cirrus Logic CS4201", &crystal_digital_ops},
-+ {0x43525973, "Cirrus Logic CS4202", &crystal_digital_ops},
- {0x43585430, "CXT48", &default_ops, AC97_DELUDED_MODEM },
- {0x43585442, "CXT66", &default_ops, AC97_DELUDED_MODEM },
- {0x44543031, "Diamond Technology DT0893", &default_ops},
-diff --git a/sound/oss/ep93xx-ac97.c b/sound/oss/ep93xx-ac97.c
-new file mode 100644
-index 0000000..a967f19
---- /dev/null
-+++ b/sound/oss/ep93xx-ac97.c
-@@ -0,0 +1,1200 @@
-+/*
-+ * Glue audio driver for the Cirrus EP93xx Ac97 Controller
-+ *
-+ * Copyright (c) 2003 Cirrus Logic Corp.
-+ * Copyright (c) 2000 Nicolas Pitre <nico@cam.org>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License.
-+ *
-+ * This file taken from h3600-uda1341.c
-+ * The mixer code is from ac97_codec.c
-+ *
-+ * History:
-+ *
-+ * 2000-05-21 Nicolas Pitre Initial UDA1341 driver release.
-+ *
-+ * 2000-07-?? George France Bitsy support.
-+ *
-+ * 2000-12-13 Deborah Wallach Fixed power handling for iPAQ/h3600
-+ *
-+ * 2001-06-03 Nicolas Pitre Made this file a separate module, based on
-+ * the former sa1100-uda1341.c driver.
-+ *
-+ * 2001-07-13 Nicolas Pitre Fixes for all supported samplerates.
-+ *
-+ * 2003-04-04 adt Changes for Cirrus Logic EP93xx I2S
-+ *
-+ * 2003-04-25 adt Changes for Cirrus Logic EP93xx Ac97
-+ *
-+ * 2005-05-11 Manfred Gruber Ported this from Cirrus Logic Virgo 1-4-3 release
-+ * to Kernel 2.6.11.X
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/fs.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/errno.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+#include <linux/bitops.h>
-+
-+#include <asm/semaphore.h>
-+#include <asm/uaccess.h>
-+#include <asm/hardware.h>
-+#include <asm/dma.h>
-+#include <asm/arch/clocks.h>
-+#include <asm/io.h>
-+#include <asm/arch/dma.h>
-+#include <linux/dma-mapping.h>
-+
-+#include "ep93xx-audio.h"
-+
-+#undef DEBUG
-+//#define DEBUG 1
-+#ifdef DEBUG
-+#define DPRINTK( x... ) printk( x )
-+#else
-+#define DPRINTK( x... )
-+#endif
-+
-+#define AUDIO_NAME "ep93xx_ac97"
-+
-+#ifdef CONFIG_SOUND_EP93XX_AC97_CODEC_CS4297
-+#define AUDIO_SAMPLE_RATE_DEFAULT 48000
-+#else
-+#define AUDIO_SAMPLE_RATE_DEFAULT 44100
-+#endif
-+
-+/* original check is not good enough in case FOO is greater than
-+ * SOUND_MIXER_NRDEVICES because the supported_mixers has exactly
-+ * SOUND_MIXER_NRDEVICES elements.
-+ * before matching the given mixer against the bitmask in supported_mixers we
-+ * check if mixer number exceeds maximum allowed size which is as mentioned
-+ * above SOUND_MIXER_NRDEVICES */
-+#define supported_mixer(FOO) \
-+ ( (FOO >= 0) && \
-+ (FOO < SOUND_MIXER_NRDEVICES) && \
-+ codec_supported_mixers & (1<<FOO) )
-+
-+/*
-+ * Available record sources.
-+ * LINE1 refers to AUX in.
-+ * IGAIN refers to input gain which means stereo mix.
-+ */
-+#define AC97_RECORD_MASK \
-+ (SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_IGAIN | SOUND_MASK_VIDEO |\
-+ SOUND_MASK_LINE1 | SOUND_MASK_LINE | SOUND_MASK_PHONEIN)
-+
-+#define AC97_STEREO_MASK \
-+ (SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_LINE | SOUND_MASK_CD | \
-+ SOUND_MASK_ALTPCM | SOUND_MASK_IGAIN | SOUND_MASK_LINE1 | SOUND_MASK_VIDEO)
-+
-+#define AC97_SUPPORTED_MASK \
-+ (AC97_STEREO_MASK | SOUND_MASK_BASS | SOUND_MASK_TREBLE | \
-+ SOUND_MASK_SPEAKER | SOUND_MASK_MIC | \
-+ SOUND_MASK_PHONEIN | SOUND_MASK_PHONEOUT)
-+
-+/*
-+ * Function prototypes.
-+ */
-+static int peek(unsigned int uiAddress);
-+static int poke(unsigned int uiAddress, unsigned int uiValue);
-+static void ep93xx_setup_src(void);
-+static void ep93xx_set_samplerate(struct audio_stream_t *stream,
-+ long lSampleRate);
-+static void ep93xx_init_ac97_codec(void);
-+static void ep93xx_set_hw_format(struct audio_stream_t *stream, long format);
-+static void ep93xx_init_ac97_controller(void);
-+static int ep93xx_mixer_ioctl(struct inode *inode, struct file *file, uint cmd,
-+ ulong arg);
-+static void ep93xx_audio_init(void *dummy);
-+static int ep93xx_audio_ioctl(struct inode *inode, struct file *file, uint cmd,
-+ ulong arg);
-+
-+static int ep93xx_audio_open(struct inode *inode, struct file *file);
-+static int __init ep93xx_ac97_init(void);
-+static void __exit ep93xx_ac97_exit(void);
-+static void ep93xx_init_mixer(void);
-+static void ep93xx_audio_enable(struct audio_stream_t *stream);
-+static void ep93xx_audio_disable(struct audio_stream_t *stream);
-+
-+/*
-+ * Statics
-+ */
-+// KERNEL2.4
-+//static long audio_samplerate = AUDIO_SAMPLE_RATE_DEFAULT;
-+static int ac_link_enabled = 0;
-+static int codec_supported_mixers;
-+
-+/* this table has default mixer values for all OSS mixers. */
-+struct mixer_defaults_t {
-+ int mixer;
-+ unsigned int value;
-+};
-+
-+/*
-+ * Default mixer settings that are set up during boot.
-+ *
-+ * These values are 16 bit numbers in which the upper byte is right volume
-+ * and the lower byte is left volume or mono volume for mono controls.
-+ *
-+ * OSS Range for each of left and right volumes is 0 to 100 (0x00 to 0x64).
-+ *
-+ */
-+static struct mixer_defaults_t mixer_defaults[SOUND_MIXER_NRDEVICES] = {
-+ /* Outputs */
-+ {SOUND_MIXER_VOLUME, 0x6464}, /* 0 dB *//* -46.5dB to 0 dB */
-+ {SOUND_MIXER_ALTPCM, 0x6464}, /* 0 dB *//* -46.5dB to 0 dB */
-+ {SOUND_MIXER_PHONEOUT, 0x6464}, /* 0 dB *//* -46.5dB to 0 dB */
-+
-+ /* PCM playback gain */
-+ {SOUND_MIXER_PCM, 0x4b4b}, /* 0 dB *//* -34.5dB to +12dB */
-+
-+ /* Record gain */
-+ {SOUND_MIXER_IGAIN, 0x0000}, /* 0 dB *//* 0 to +22.5 dB */
-+
-+ /* Inputs */
-+ {SOUND_MIXER_MIC, 0x0000}, /* mute *//* -34.5dB to +12dB */
-+ {SOUND_MIXER_LINE, 0x4b4b}, /* 0 dB *//* -34.5dB to +12dB */
-+
-+ /* Inputs that are not connected. */
-+ {SOUND_MIXER_SPEAKER, 0x0000}, /* mute *//* -45dB to 0dB */
-+ {SOUND_MIXER_PHONEIN, 0x0000}, /* mute *//* -34.5dB to +12dB */
-+ {SOUND_MIXER_CD, 0x0000}, /* mute *//* -34.5dB to +12dB */
-+ {SOUND_MIXER_VIDEO, 0x0000}, /* mute *//* -34.5dB to +12dB */
-+ {SOUND_MIXER_LINE1, 0x0000}, /* mute *//* -34.5dB to +12dB */
-+
-+ {-1, 0} /* last entry */
-+};
-+
-+static unsigned int guiOSS_Volume[SOUND_MIXER_NRDEVICES];
-+
-+/* table to scale scale from OSS mixer value to AC97 mixer register value */
-+struct ac97_mixer_hw_t {
-+ unsigned int offset;
-+ int scale;
-+};
-+
-+static struct ac97_mixer_hw_t ac97_hw[SOUND_MIXER_NRDEVICES] = {
-+ [SOUND_MIXER_VOLUME] = {AC97_02_MASTER_VOL, 64},
-+ [SOUND_MIXER_BASS] = {0, 0},
-+ [SOUND_MIXER_TREBLE] = {0, 0},
-+ [SOUND_MIXER_SYNTH] = {0, 0},
-+ [SOUND_MIXER_PCM] = {AC97_18_PCM_OUT_VOL, 32},
-+ [SOUND_MIXER_SPEAKER] = {AC97_0A_PC_BEEP_VOL, 32},
-+ [SOUND_MIXER_LINE] = {AC97_10_LINE_IN_VOL, 32},
-+ [SOUND_MIXER_MIC] = {AC97_0E_MIC_VOL, 32},
-+ [SOUND_MIXER_CD] = {AC97_12_CD_VOL, 32},
-+ [SOUND_MIXER_IMIX] = {0, 0},
-+ [SOUND_MIXER_ALTPCM] = {AC97_04_HEADPHONE_VOL, 64},
-+ [SOUND_MIXER_RECLEV] = {0, 0},
-+ [SOUND_MIXER_IGAIN] = {AC97_1C_RECORD_GAIN, 16},
-+ [SOUND_MIXER_OGAIN] = {0, 0},
-+ [SOUND_MIXER_LINE1] = {AC97_16_AUX_VOL, 32},
-+ [SOUND_MIXER_LINE2] = {0, 0},
-+ [SOUND_MIXER_LINE3] = {0, 0},
-+ [SOUND_MIXER_DIGITAL1] = {0, 0},
-+ [SOUND_MIXER_DIGITAL2] = {0, 0},
-+ [SOUND_MIXER_DIGITAL3] = {0, 0},
-+ [SOUND_MIXER_PHONEIN] = {AC97_0C_PHONE_VOL, 32},
-+ [SOUND_MIXER_PHONEOUT] = {AC97_06_MONO_VOL, 64},
-+ [SOUND_MIXER_VIDEO] = {AC97_14_VIDEO_VOL, 32},
-+ [SOUND_MIXER_RADIO] = {0, 0},
-+ [SOUND_MIXER_MONITOR] = {0, 0},
-+};
-+
-+/* the following tables allow us to go from OSS <-> ac97 quickly. */
-+enum ac97_recsettings {
-+ AC97_REC_MIC = 0,
-+ AC97_REC_CD,
-+ AC97_REC_VIDEO,
-+ AC97_REC_AUX,
-+ AC97_REC_LINE,
-+ AC97_REC_STEREO, /* combination of all enabled outputs.. */
-+ AC97_REC_MONO, /*.. or the mono equivalent */
-+ AC97_REC_PHONE
-+};
-+
-+static const unsigned int ac97_rm2oss[] = {
-+ [AC97_REC_MIC] = SOUND_MIXER_MIC,
-+ [AC97_REC_CD] = SOUND_MIXER_CD,
-+ [AC97_REC_VIDEO] = SOUND_MIXER_VIDEO,
-+ [AC97_REC_AUX] = SOUND_MIXER_LINE1,
-+ [AC97_REC_LINE] = SOUND_MIXER_LINE,
-+ [AC97_REC_STEREO] = SOUND_MIXER_IGAIN,
-+ [AC97_REC_PHONE] = SOUND_MIXER_PHONEIN
-+};
-+
-+/* indexed by bit position */
-+static const unsigned int ac97_oss_rm[] = {
-+ [SOUND_MIXER_MIC] = AC97_REC_MIC,
-+ [SOUND_MIXER_CD] = AC97_REC_CD,
-+ [SOUND_MIXER_VIDEO] = AC97_REC_VIDEO,
-+ [SOUND_MIXER_LINE1] = AC97_REC_AUX,
-+ [SOUND_MIXER_LINE] = AC97_REC_LINE,
-+ [SOUND_MIXER_IGAIN] = AC97_REC_STEREO,
-+ [SOUND_MIXER_PHONEIN] = AC97_REC_PHONE
-+};
-+
-+static struct audio_stream_t ac97_output_stream0 = {
-+ audio_num_channels:EP93XX_DEFAULT_NUM_CHANNELS,
-+ audio_format:EP93XX_DEFAULT_FORMAT,
-+ audio_stream_bitwidth:EP93XX_DEFAULT_BIT_WIDTH,
-+ devicename:"Ac97_out",
-+ dmachannel:{DMATx_AAC1, UNDEF, UNDEF},
-+ sample_rate:0,
-+ hw_bit_width:16,
-+ bCompactMode:1,
-+};
-+
-+static struct audio_stream_t ac97_input_stream0 = {
-+ audio_num_channels:EP93XX_DEFAULT_NUM_CHANNELS,
-+ audio_format:EP93XX_DEFAULT_FORMAT,
-+ audio_stream_bitwidth:EP93XX_DEFAULT_BIT_WIDTH,
-+ devicename:"Ac97_in",
-+ dmachannel:{DMARx_AAC1, UNDEF, UNDEF},
-+ sample_rate:0,
-+ hw_bit_width:16,
-+ bCompactMode:1,
-+};
-+
-+static struct audio_hw_t ep93xx_ac97_hw = {
-+ hw_enable:ep93xx_audio_enable,
-+ hw_disable:ep93xx_audio_disable,
-+ hw_clear_fifo:0,
-+ client_ioctl:ep93xx_audio_ioctl,
-+
-+ set_hw_serial_format:ep93xx_set_hw_format,
-+
-+ txdmachannels:{DMATx_AAC1, DMATx_AAC2, DMATx_AAC3},
-+ rxdmachannels:{DMARx_AAC1, DMARx_AAC2, DMARx_AAC3},
-+
-+ MaxTxDmaChannels:3,
-+ MaxRxDmaChannels:3,
-+
-+ modcnt:0,
-+};
-+
-+static struct audio_state_t ac97_audio_state0 = {
-+ output_stream:&ac97_output_stream0,
-+ input_stream:&ac97_input_stream0,
-+ // KERNEL2.4 deleted internal sema intialisier, do it in function
-+ hw:&ep93xx_ac97_hw,
-+ wr_ref:0,
-+ rd_ref:0,
-+};
-+
-+/*
-+ * peek
-+ *
-+ * Reads an AC97 codec register. Returns -1 if there was an error.
-+ */
-+static int peek(unsigned int uiAddress)
-+{
-+ unsigned int uiAC97RGIS, uiTemp;
-+
-+ if (!ac_link_enabled) {
-+ DPRINTK
-+ ("ep93xx ac97 peek: attempt to peek before enabling ac-link.\n");
-+ return -1;
-+ }
-+
-+ /*
-+ * Check to make sure that the address is aligned on a word boundary
-+ * and is 7E or less.
-+ */
-+ if (((uiAddress & 0x1) != 0) || (uiAddress > 0x007e)) {
-+ return -1;
-+ }
-+
-+ /*
-+ * How it is supposed to work is:
-+ * - The ac97 controller sends out a read addr in slot 1.
-+ * - In the next frame, the codec will echo that address back in slot 1
-+ * and send the data in slot 2. SLOT2RXVALID will be set to 1.
-+ *
-+ * Read until SLOT2RXVALID goes to 1. Reading the data in AC97S2DATA
-+ * clears SLOT2RXVALID.
-+ */
-+
-+ /*
-+ * First, delay one frame in case of back to back peeks/pokes.
-+ */
-+ mdelay(1);
-+
-+ /*
-+ * Write the address to AC97S1DATA, delay 1 frame, read the flags.
-+ */
-+ outl(uiAddress, AC97S1DATA);
-+ uiTemp = inl(AC97GCR); /* read to push write out the wrapper */
-+
-+ udelay(21 * 4);
-+ uiAC97RGIS = inl(AC97RGIS);
-+
-+ /*
-+ * Return error if we timed out.
-+ */
-+ if (((uiAC97RGIS & AC97RGIS_SLOT1TXCOMPLETE) == 0) &&
-+ ((uiAC97RGIS & AC97RGIS_SLOT2RXVALID) == 0)) {
-+ DPRINTK("ep93xx-ac97 - peek failed reading reg 0x%02x.\n",
-+ uiAddress);
-+ return -1;
-+ }
-+
-+ return (inl(AC97S2DATA) & 0x000fffff);
-+}
-+
-+/*
-+ * poke
-+ *
-+ * Writes an AC97 codec Register. Return -1 if error.
-+ */
-+static int poke(unsigned int uiAddress, unsigned int uiValue)
-+{
-+ unsigned int uiAC97RGIS, uiTemp;
-+
-+ if (!ac_link_enabled) {
-+ DPRINTK
-+ ("ep93xx ac97 poke: attempt to poke before enabling ac-link.\n");
-+ return -1;
-+ }
-+
-+ /*
-+ * Check to make sure that the address is align on a word boundary and
-+ * is 7E or less. And that the value is a 16 bit value.
-+ */
-+ if (((uiAddress & 0x1) != 0) || (uiAddress > 0x007e)) {
-+ return -1;
-+ }
-+
-+ /*
-+ * First, delay one frame in case of back to back peeks/pokes.
-+ */
-+ mdelay(1);
-+
-+ /*
-+ * Write the data to AC97S2DATA, then the address to AC97S1DATA.
-+ */
-+ outl(uiValue, AC97S2DATA);
-+ outl(uiAddress, AC97S1DATA);
-+ uiTemp = inl(AC97GCR); /* read to push writes out the wrapper */
-+
-+ /*
-+ * Wait for the tx to complete, get status.
-+ */
-+ udelay(42);
-+ uiAC97RGIS = inl(AC97RGIS);
-+
-+ /*
-+ * Return error if we timed out.
-+ */
-+ if (!(inl(AC97RGIS) & AC97RGIS_SLOT1TXCOMPLETE)) {
-+ DPRINTK
-+ ("ep93xx-ac97: poke failed writing reg 0x%02x value 0x%02x.\n",
-+ uiAddress, uiValue);
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * When we get to the multichannel case the pre-fill and enable code
-+ * will go to the dma driver's start routine.
-+ */
-+static void ep93xx_audio_enable(struct audio_stream_t *stream)
-+{
-+ unsigned int uiTemp;
-+
-+ DPRINTK("ep93xx_audio_enable\n");
-+
-+ /*
-+ * Enable the rx or tx channel
-+ */
-+ if (stream->dmachannel[0] == DMATx_AAC1) {
-+ uiTemp = inl(AC97TXCR1);
-+ outl((uiTemp | AC97TXCR_TEN), AC97TXCR1);
-+ uiTemp = inl(AC97TXCR1);
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+ outl(inl(AC97IE1) | AC97ISR_TIS, AC97IE1);
-+#endif
-+ }
-+
-+ if (stream->dmachannel[0] == DMARx_AAC1) {
-+ uiTemp = inl(AC97RXCR1);
-+ outl((uiTemp | AC97RXCR_REN), AC97RXCR1);
-+ uiTemp = inl(AC97RXCR1);
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+ outl(inl(AC97IE1) | AC97ISR_RIS, AC97IE1);
-+#endif
-+ }
-+ //DPRINTK("ep93xx_audio_enable - EXIT\n");
-+}
-+
-+static void ep93xx_audio_disable(struct audio_stream_t *stream)
-+{
-+ unsigned int uiControl, uiStatus;
-+
-+ DPRINTK("ep93xx_audio_disable\n");
-+
-+ /*
-+ * Disable the rx or tx channel
-+ */
-+ if (stream->dmachannel[0] == DMATx_AAC1) {
-+ uiControl = inl(AC97TXCR1);
-+ if (uiControl & AC97TXCR_TEN) {
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+ outl(inl(AC97IE1) & ~AC97ISR_TIS, AC97IE1);
-+#else
-+ /*
-+ * Wait for fifo to empty. We've shut down the dma
-+ * so that should happen soon.
-+ */
-+ do {
-+ uiStatus = inl(AC97SR1);
-+ } while (((uiStatus & 0x82) == 0));
-+ //} while( ((uiStatus & 0x20)!=0) ;&&
-+ //((uiStatus & 0x82)==0) );
-+#endif
-+
-+ outl((uiControl & ~AC97TXCR_TEN), AC97TXCR1);
-+ uiControl = inl(AC97TXCR1);
-+ }
-+ }
-+
-+ if (stream->dmachannel[0] == DMARx_AAC1) {
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+ outl(inl(AC97IE1) & ~AC97ISR_RIS, AC97IE1);
-+#endif
-+ uiControl = inl(AC97RXCR1);
-+ outl((uiControl & ~AC97RXCR_REN), AC97RXCR1);
-+ uiControl = inl(AC97RXCR1);
-+ }
-+ //DPRINTK("ep93xx_audio_disable - EXIT\n");
-+}
-+
-+/*
-+ * ep93xx_setup_src
-+ *
-+ * Once the ac-link is up and all is good, we want to set the codec to a
-+ * usable mode.
-+ */
-+static void ep93xx_setup_src(void)
-+{
-+ int iTemp;
-+
-+ /*
-+ * Set the VRA bit to enable the SRC.
-+ */
-+ iTemp = peek(AC97_2A_EXT_AUDIO_POWER);
-+ poke(AC97_2A_EXT_AUDIO_POWER, (iTemp | 0x1));
-+
-+ /*
-+ * Set the DSRC/ASRC bits to enable the variable rate SRC.
-+ */
-+ iTemp = peek(AC97_60_MISC_CRYSTAL_CONTROL);
-+ poke(AC97_60_MISC_CRYSTAL_CONTROL, (iTemp | 0x0300));
-+}
-+
-+/*
-+ * ep93xx_set_samplerate
-+ *
-+ * lFrequency - Sample Rate in Hz
-+ * bTx - 1 to set Tx sample rate
-+ * bRx - 1 to set Rx sample rate
-+ */
-+static void ep93xx_set_samplerate(struct audio_stream_t *stream,
-+ long lSampleRate)
-+{
-+#ifndef CONFIG_SOUND_EP93XX_AC97_CODEC_CS4297
-+ unsigned short usDivider, usPhase;
-+
-+ DPRINTK("ep93xx_set_samplerate - Fs = %d\n", (int)lSampleRate);
-+
-+ if ((lSampleRate < 7200) || (lSampleRate > 48000)) {
-+ DPRINTK("ep93xx_set_samplerate - invalid Fs = %d\n",
-+ (int)lSampleRate);
-+ return;
-+ }
-+
-+ /*
-+ * Calculate divider and phase increment.
-+ *
-+ * divider = round( 0x1770000 / lSampleRate )
-+ * Note that usually rounding is done by adding 0.5 to a floating
-+ * value and then truncating. To do this without using floating
-+ * point, I multiply the fraction by two, do the division, then add one,
-+ * then divide the whole by 2 and then truncate.
-+ * Same effect, no floating point math.
-+ *
-+ * Ph incr = trunc( (0x1000000 / usDivider) + 1 )
-+ */
-+
-+ usDivider = (unsigned short)(((2 * 0x1770000 / lSampleRate) + 1) / 2);
-+
-+ usPhase = (0x1000000 / usDivider) + 1;
-+
-+ /*
-+ * Write them in the registers. Spec says divider must be
-+ * written after phase incr.
-+ */
-+ if (stream->dmachannel[0] == DMATx_AAC1) {
-+ poke(AC97_2C_PCM_FRONT_DAC_RATE, usDivider);
-+ poke(AC97_64_DAC_SRC_PHASE_INCR, usPhase);
-+ }
-+
-+ if (stream->dmachannel[0] == DMARx_AAC1) {
-+
-+ poke(AC97_32_PCM_LR_ADC_RATE, usDivider);
-+ poke(AC97_66_ADC_SRC_PHASE_INCR, usPhase);
-+ }
-+
-+ DPRINTK("ep93xx_set_samplerate - phase = %d, divider = %d\n",
-+ (unsigned int)usPhase, (unsigned int)usDivider);
-+
-+ /*
-+ * We sorta should report the actual samplerate back to the calling
-+ * application. But some applications freak out if they don't get
-+ * exactly what they asked for. So we fudge and tell them what
-+ * they want to hear.
-+ */
-+ stream->sample_rate = lSampleRate;
-+
-+ DPRINTK("ep93xx_set_samplerate - EXIT\n");
-+#else
-+ stream->sample_rate = AUDIO_SAMPLE_RATE_DEFAULT;
-+#endif
-+}
-+
-+/*
-+ * ep93xx_set_hw_format
-+ *
-+ * Sets up whether the controller is expecting 20 bit data in 32 bit words
-+ * or 16 bit data compacted to have a stereo sample in each 32 bit word.
-+ */
-+static void ep93xx_set_hw_format(struct audio_stream_t *stream, long format)
-+{
-+ int bCompactMode, uiTemp, iWidth;
-+ unsigned long ulRegValue;
-+
-+ switch (format) {
-+ /*
-+ * Here's all the <=16 bit formats. We can squeeze both L and R
-+ * into one 32 bit sample so use compact mode.
-+ */
-+ case AFMT_U8:
-+ case AFMT_S8:
-+ case AFMT_S16_LE:
-+ case AFMT_U16_LE:
-+ bCompactMode = 1;
-+ ulRegValue = 0x00008018;
-+ iWidth = 16;
-+ break;
-+
-+ /*
-+ * Add any other >16 bit formats here...
-+ */
-+ case AFMT_S32_BLOCKED:
-+ default:
-+ bCompactMode = 0;
-+ ulRegValue = 0x00004018;
-+ iWidth = 20;
-+ break;
-+ }
-+
-+ if (stream->dmachannel[0] == DMARx_AAC1) {
-+ uiTemp = inl(AC97RXCR1);
-+ if (ulRegValue != uiTemp) {
-+ outl(ulRegValue, AC97RXCR1);
-+ uiTemp = inl(AC97RXCR1);
-+ }
-+ stream->hw_bit_width = iWidth;
-+ stream->bCompactMode = bCompactMode;
-+ }
-+
-+ if (stream->dmachannel[0] == DMATx_AAC1) {
-+ uiTemp = inl(AC97TXCR1);
-+ if (ulRegValue != uiTemp) {
-+ outl(ulRegValue, AC97TXCR1);
-+ uiTemp = inl(AC97TXCR1);
-+ }
-+ stream->hw_bit_width = iWidth;
-+ stream->bCompactMode = bCompactMode;
-+ }
-+
-+}
-+
-+/*
-+ * ep93xx_init_ac97_controller
-+ *
-+ * This routine sets up the Ac'97 Controller.
-+ */
-+static void ep93xx_init_ac97_controller(void)
-+{
-+ unsigned int uiDEVCFG, uiTemp;
-+
-+ DPRINTK("ep93xx_init_ac97_controller - enter\n");
-+
-+ /*
-+ * Configure the multiplexed Ac'97 pins to be Ac97 not I2s.
-+ * Configure the EGPIO4 and EGPIO6 to be GPIOS, not to be
-+ * SDOUT's for the second and third I2S controller channels.
-+ */
-+ uiDEVCFG = inl(SYSCON_DEVCFG);
-+
-+ uiDEVCFG &= ~(SYSCON_DEVCFG_I2SonAC97 |
-+ SYSCON_DEVCFG_A1onG | SYSCON_DEVCFG_A2onG);
-+
-+ SysconSetLocked(SYSCON_DEVCFG, uiDEVCFG);
-+
-+ /*
-+ * Disable the AC97 controller internal loopback.
-+ * Disable Override codec ready.
-+ */
-+ outl(0, AC97GCR);
-+
-+ /*
-+ * Enable the AC97 Link.
-+ */
-+ uiTemp = inl(AC97GCR);
-+ outl((uiTemp | AC97GSR_IFE), AC97GCR);
-+ uiTemp = inl(AC97GCR); /* read to push write out the wrapper */
-+
-+ /*
-+ * Set the TIMEDRESET bit. Will cause a > 1uSec reset of the ac-link.
-+ * This bit is self resetting.
-+ */
-+ outl(AC97RESET_TIMEDRESET, AC97RESET);
-+ uiTemp = inl(AC97GCR); /* read to push write out the wrapper */
-+
-+ /*
-+ * Delay briefly, but let's not hog the processor.
-+ */
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(5); /* 50 mSec */
-+
-+ /*
-+ * Read the AC97 status register to see if we've seen a CODECREADY
-+ * signal from the AC97 codec.
-+ */
-+ if (!(inl(AC97RGIS) & AC97RGIS_CODECREADY)) {
-+ DPRINTK("ep93xx-ac97 - FAIL: CODECREADY still low!\n");
-+ return;
-+ }
-+
-+ /*
-+ * Delay for a second, not hogging the processor
-+ */
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(HZ); /* 1 Sec */
-+
-+ /*
-+ * Now the Ac-link is up. We can read and write codec registers.
-+ */
-+ ac_link_enabled = 1;
-+
-+ /*
-+ * Set up the rx and tx channels
-+ * Set the CM bit, data size=16 bits, enable tx slots 3 & 4.
-+ */
-+ ep93xx_set_hw_format(&ac97_output_stream0, EP93XX_DEFAULT_FORMAT);
-+ ep93xx_set_hw_format(&ac97_input_stream0, EP93XX_DEFAULT_FORMAT);
-+
-+ DPRINTK("ep93xx-ac97 -- AC97RXCR1: %08x\n", inl(AC97RXCR1));
-+ DPRINTK("ep93xx-ac97 -- AC97TXCR1: %08x\n", inl(AC97TXCR1));
-+
-+ DPRINTK("ep93xx_init_ac97_controller - EXIT - success\n");
-+
-+}
-+
-+/*
-+ * ep93xx_init_ac97_codec
-+ *
-+ * Program up the external Ac97 codec.
-+ *
-+ */
-+static void ep93xx_init_ac97_codec(void)
-+{
-+ DPRINTK("ep93xx_init_ac97_codec - enter\n");
-+
-+ ep93xx_setup_src();
-+ ep93xx_set_samplerate(&ac97_output_stream0, AUDIO_SAMPLE_RATE_DEFAULT);
-+ ep93xx_set_samplerate(&ac97_input_stream0, AUDIO_SAMPLE_RATE_DEFAULT);
-+ ep93xx_init_mixer();
-+
-+ DPRINTK("ep93xx_init_ac97_codec - EXIT\n");
-+
-+}
-+
-+#ifdef DEBUG
-+static void ep93xx_dump_ac97_regs(void)
-+{
-+ int i;
-+ unsigned int reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
-+
-+ DPRINTK("---------------------------------------------\n");
-+ DPRINTK(" : 0 2 4 6 8 A C E\n");
-+
-+ for (i = 0; i < 0x80; i += 0x10) {
-+ reg0 = 0xffff & (unsigned int)peek(i);
-+ reg1 = 0xffff & (unsigned int)peek(i + 0x2);
-+ reg2 = 0xffff & (unsigned int)peek(i + 0x4);
-+ reg3 = 0xffff & (unsigned int)peek(i + 0x6);
-+ reg4 = 0xffff & (unsigned int)peek(i + 0x8);
-+ reg5 = 0xffff & (unsigned int)peek(i + 0xa);
-+ reg6 = 0xffff & (unsigned int)peek(i + 0xc);
-+ reg7 = 0xffff & (unsigned int)peek(i + 0xe);
-+
-+ DPRINTK(" %02x : %04x %04x %04x %04x %04x %04x %04x %04x\n",
-+ i, reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7);
-+ }
-+}
-+#endif
-+
-+static void ep93xx_set_volume(unsigned int oss_channel, unsigned int oss_val) {
-+ unsigned int left, right;
-+ u16 val = 0;
-+ struct ac97_mixer_hw_t *mh = &ac97_hw[oss_channel];
-+
-+ if (!mh->scale) {
-+ DPRINTK
-+ ("ep93xx-ac97.c: ep93xx_set_volume - not a valid OSS channel\n");
-+ return;
-+ }
-+
-+ /* cleanse input a little */
-+ right = ((oss_val >> 8) & 0xff);
-+ left = (oss_val & 0xff);
-+
-+ if (right > 100)
-+ right = 100;
-+ if (left > 100)
-+ left = 100;
-+
-+ DPRINTK("ac97_codec: wrote OSS channel#%2d (ac97 reg 0x%02x), "
-+ "l:%2d, r:%2d:", oss_channel, mh->offset, left, right);
-+
-+ if (AC97_STEREO_MASK & (1 << oss_channel)) {
-+ /* stereo mixers */
-+ if (oss_channel == SOUND_MIXER_IGAIN) {
-+ right = ((100 - right) * (mh->scale - 1)) / 100;
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (right >= mh->scale)
-+ right = mh->scale - 1;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ right = (mh->scale - 1) - right;
-+ left = (mh->scale - 1) - left;
-+ val = (left << 8) | right;
-+ } else {
-+ if (left == 0 && right == 0) {
-+ val = 0x8000;
-+ } else {
-+ right = ((100 - right) * (mh->scale - 1)) / 100;
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (right >= mh->scale)
-+ right = mh->scale - 1;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ val = (left << 8) | right;
-+ }
-+ }
-+ } else if (left == 0) {
-+ val = 0x8000;
-+ } else if ((oss_channel == SOUND_MIXER_SPEAKER) ||
-+ (oss_channel == SOUND_MIXER_PHONEIN) ||
-+ (oss_channel == SOUND_MIXER_PHONEOUT)) {
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ val = left;
-+ } else if (oss_channel == SOUND_MIXER_MIC) {
-+ val = peek(mh->offset) & ~0x801f;
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ val |= left;
-+ }
-+ /*
-+ * For bass and treble, the low bit is optional. Masking it
-+ * lets us avoid the 0xf 'bypass'.
-+ * Do a read, modify, write as we have two contols in one reg.
-+ */
-+ else if (oss_channel == SOUND_MIXER_BASS) {
-+ val = peek(mh->offset) & ~0x0f00;
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ val |= (left << 8) & 0x0e00;
-+ } else if (oss_channel == SOUND_MIXER_TREBLE) {
-+ val = peek(mh->offset) & ~0x000f;
-+ left = ((100 - left) * (mh->scale - 1)) / 100;
-+ if (left >= mh->scale)
-+ left = mh->scale - 1;
-+ val |= left & 0x000e;
-+ }
-+
-+ DPRINTK(" 0x%04x", val);
-+
-+ poke(mh->offset, val);
-+
-+#ifdef DEBUG
-+ val = peek(mh->offset);
-+ DPRINTK(" (read back 0x%04x)\n", val);
-+#endif
-+
-+ guiOSS_Volume[oss_channel] = oss_val;
-+}
-+
-+static void ep93xx_init_mixer(void)
-+{
-+ u16 cap;
-+ int i;
-+
-+ /* mixer masks */
-+ codec_supported_mixers = AC97_SUPPORTED_MASK;
-+
-+ cap = peek(AC97_00_RESET);
-+ if (!(cap & 0x04)) {
-+ codec_supported_mixers &=
-+ ~(SOUND_MASK_BASS | SOUND_MASK_TREBLE);
-+ }
-+ if (!(cap & 0x10)) {
-+ codec_supported_mixers &= ~SOUND_MASK_ALTPCM;
-+ }
-+
-+ /*
-+ * Detect bit resolution of output volume controls by writing to the
-+ * 6th bit (not unmuting yet)
-+ */
-+ poke(AC97_02_MASTER_VOL, 0xa020);
-+ if (peek(AC97_02_MASTER_VOL) != 0xa020) {
-+ ac97_hw[SOUND_MIXER_VOLUME].scale = 32;
-+ }
-+
-+ poke(AC97_04_HEADPHONE_VOL, 0xa020);
-+ if (peek(AC97_04_HEADPHONE_VOL) != 0xa020) {
-+ ac97_hw[AC97_04_HEADPHONE_VOL].scale = 32;
-+ }
-+
-+ poke(AC97_06_MONO_VOL, 0x8020);
-+ if (peek(AC97_06_MONO_VOL) != 0x8020) {
-+ ac97_hw[AC97_06_MONO_VOL].scale = 32;
-+ }
-+
-+ /* initialize mixer channel volumes */
-+ for (i = 0;
-+ (i < SOUND_MIXER_NRDEVICES) && (mixer_defaults[i].mixer != -1);
-+ i++) {
-+ if (!supported_mixer(mixer_defaults[i].mixer)) {
-+ continue;
-+ }
-+
-+ ep93xx_set_volume(mixer_defaults[i].mixer,
-+ mixer_defaults[i].value);
-+ }
-+
-+}
-+
-+/*
-+ * ac97_recmask_io
-+ *
-+ * Read or write the record source.
-+ */
-+static int ep93xx_read_recsource(void)
-+{
-+ unsigned int val;
-+
-+ /* read it from the card */
-+ val = peek(AC97_1A_RECORD_SELECT);
-+
-+ DPRINTK("ac97_codec: ac97 recmask to set to 0x%04x\n", val);
-+
-+ return (1 << ac97_rm2oss[val & 0x07]);
-+}
-+
-+static int ep93xx_set_recsource(int mask)
-+{
-+ unsigned int val;
-+
-+ /* Arg contains a bit for each recording source */
-+ if (mask == 0) {
-+ return 0;
-+ }
-+
-+ mask &= AC97_RECORD_MASK;
-+
-+ if (mask == 0) {
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * May have more than one bit set. So clear out currently selected
-+ * record source value first (AC97 supports only 1 input)
-+ */
-+ val = (1 << ac97_rm2oss[peek(AC97_1A_RECORD_SELECT) & 0x07]);
-+ if (mask != val)
-+ mask &= ~val;
-+
-+ val = ffs(mask);
-+ val = ac97_oss_rm[val - 1];
-+ val |= val << 8; /* set both channels */
-+
-+ DPRINTK("ac97_codec: setting ac97 recmask to 0x%04x\n", val);
-+
-+ poke(AC97_1A_RECORD_SELECT, val);
-+
-+ return 0;
-+}
-+
-+static int ep93xx_mixer_open(struct inode *inode, struct file *file)
-+{
-+ file->private_data = &ep93xx_ac97_hw;
-+ return 0;
-+}
-+
-+static int ep93xx_mixer_release(struct inode *inode, struct file *file)
-+{
-+ return 0;
-+}
-+
-+static int
-+ep93xx_mixer_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
-+{
-+ int val, nr;
-+
-+ struct audio_hw_t *hw = (struct audio_hw_t *)file->private_data;
-+
-+ DPRINTK("ep93xx_mixer_ioctl - enter. IOC_TYPE is %c \n",
-+ _IOC_TYPE(cmd));
-+
-+ if (cmd == SOUND_MIXER_INFO) {
-+ mixer_info info;
-+ strncpy(info.id, "CS4202", sizeof(info.id));
-+ strncpy(info.name, "Cirrus CS4202", sizeof(info.name));
-+ info.modify_counter = hw->modcnt;
-+ if (copy_to_user((void *)arg, &info, sizeof(info))) {
-+ return -EFAULT;
-+ }
-+ return 0;
-+ }
-+ if (cmd == SOUND_OLD_MIXER_INFO) {
-+ _old_mixer_info info;
-+ strncpy(info.id, "CS4202", sizeof(info.id));
-+ strncpy(info.name, "Cirrus CS4202", sizeof(info.name));
-+ if (copy_to_user((void *)arg, &info, sizeof(info))) {
-+ return -EFAULT;
-+ }
-+ return 0;
-+ }
-+
-+ if ((_IOC_TYPE(cmd) != 'M') || (_SIOC_SIZE(cmd) != sizeof(int)))
-+ return -EINVAL;
-+
-+ if (cmd == OSS_GETVERSION)
-+ return put_user(SOUND_VERSION, (int *)arg);
-+
-+ nr = _IOC_NR(cmd);
-+
-+ if (_SIOC_DIR(cmd) == _SIOC_READ) {
-+ switch (nr) {
-+ case SOUND_MIXER_RECSRC:
-+ /* Read the current record source */
-+ val = ep93xx_read_recsource();
-+ break;
-+
-+ case SOUND_MIXER_DEVMASK:
-+ /* give them the supported mixers */
-+ val = codec_supported_mixers;
-+ break;
-+
-+ case SOUND_MIXER_RECMASK:
-+ /* Arg contains a bit for each supported recording source */
-+ val = AC97_RECORD_MASK;
-+ break;
-+
-+ case SOUND_MIXER_STEREODEVS:
-+ /* Mixer channels supporting stereo */
-+ val = AC97_STEREO_MASK;
-+ break;
-+
-+ case SOUND_MIXER_CAPS:
-+ val = SOUND_CAP_EXCL_INPUT;
-+ break;
-+
-+ default:
-+ if (!supported_mixer(nr))
-+ return -EINVAL;
-+
-+ val = guiOSS_Volume[nr];
-+ break;
-+
-+ } /* switch */
-+
-+ return put_user(val, (int *)arg);
-+ }
-+
-+ if (_SIOC_DIR(cmd) == (_SIOC_WRITE | _SIOC_READ)) {
-+ if (get_user(val, (int *)arg))
-+ return -EFAULT;
-+
-+ switch (nr) {
-+ case SOUND_MIXER_RECSRC:
-+ return ep93xx_set_recsource(val);
-+
-+ default:
-+ if (!supported_mixer(nr))
-+ return -EINVAL;
-+
-+ ep93xx_set_volume(nr, val);
-+ hw->modcnt++;
-+ return 0;
-+ }
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static struct file_operations ep93xx_mixer_fops = {
-+ owner:THIS_MODULE,
-+ llseek:no_llseek,
-+ ioctl:ep93xx_mixer_ioctl,
-+ open:ep93xx_mixer_open,
-+ release:ep93xx_mixer_release,
-+};
-+
-+/*
-+ * Audio interface
-+ */
-+static void ep93xx_audio_init(void *dummy)
-+{
-+ DPRINTK("ep93xx_audio_init - enter\n");
-+
-+ /*
-+ * Init the controller, enable the ac-link.
-+ * Initialize the codec.
-+ */
-+ ep93xx_init_ac97_controller();
-+ ep93xx_init_ac97_codec();
-+
-+#ifdef DEBUG
-+ ep93xx_dump_ac97_regs();
-+#endif
-+
-+ DPRINTK("ep93xx_audio_init - EXIT\n");
-+}
-+
-+static int ep93xx_audio_ioctl(struct inode *inode, struct file *file,
-+ uint cmd, ulong arg)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *os = state->output_stream;
-+ struct audio_stream_t *is = state->input_stream;
-+ long val;
-+ int ret = 0;
-+
-+ /*
-+ * These are platform dependent ioctls which are not handled by the
-+ * generic ep93xx-audio module.
-+ */
-+ switch (cmd) {
-+ case SNDCTL_DSP_SPEED:
-+
-+ DPRINTK("ep93xx_audio_ioctl - SNDCTL_DSP_SPEED\n");
-+
-+ if (get_user(val, (int *)arg)) {
-+ return -EFAULT;
-+ }
-+
-+ if ((file->f_mode & FMODE_WRITE) && (val != os->sample_rate)) {
-+ ep93xx_set_samplerate(os, val);
-+ }
-+ if ((file->f_mode & FMODE_READ) && (val != is->sample_rate)) {
-+ ep93xx_set_samplerate(is, val);
-+ }
-+
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_PCM_READ_RATE:
-+ DPRINTK("ep93xx_audio_ioctl - SOUND_PCM_READ_RATE\n");
-+ if (file->f_mode & FMODE_WRITE) {
-+ return put_user(os->sample_rate, (long *)arg);
-+ }
-+ return put_user(is->sample_rate, (long *)arg);
-+
-+ default:
-+ DPRINTK("ep93xx_audio_ioctl-->ep93xx_mixer_ioctl\n");
-+ /* Maybe this is meant for the mixer (As per OSS Docs) */
-+ return ep93xx_mixer_ioctl(inode, file, cmd, arg);
-+ }
-+
-+ return ret;
-+}
-+
-+static int ep93xx_audio_open(struct inode *inode, struct file *file)
-+{
-+ DPRINTK("ep93xx_audio_open\n");
-+ return ep93xx_audio_attach(inode, file, &ac97_audio_state0);
-+}
-+
-+/*
-+ * Missing fields of this structure will be patched with the call
-+ * to ep93xx_audio_attach().
-+ */
-+static struct file_operations ep93xx_audio_fops = {
-+ open:ep93xx_audio_open,
-+ owner:THIS_MODULE
-+};
-+
-+static int audio_dev_id, mixer_dev_id;
-+
-+static int __init ep93xx_ac97_init(void)
-+{
-+ DPRINTK("ep93xx_ac97_init - enter\n");
-+
-+ // KERNEL2.4
-+ sema_init(&ac97_audio_state0.sem, 1);
-+
-+ /*
-+ * Enable audio early on, give the DAC time to come up.
-+ */
-+ ep93xx_audio_init(0);
-+
-+ /*
-+ * Register devices using sound_core.c's devfs stuff
-+ */
-+ audio_dev_id = register_sound_dsp(&ep93xx_audio_fops, -1);
-+ if (audio_dev_id < 0) {
-+ DPRINTK
-+ (" ep93xx_ac97_init: register_sound_dsp failed for dsp.\n");
-+ return -ENODEV;
-+ }
-+
-+ mixer_dev_id = register_sound_mixer(&ep93xx_mixer_fops, -1);
-+ if (mixer_dev_id < 0) {
-+ DPRINTK
-+ (" ep93xx_ac97_init: register_sound_dsp failed for mixer.\n");
-+ return -ENODEV;
-+ }
-+
-+ printk(KERN_INFO "EP93xx Ac97 audio support initialized.\n");
-+ return 0;
-+}
-+
-+static void __exit ep93xx_ac97_exit(void)
-+{
-+ unregister_sound_dsp(audio_dev_id);
-+ unregister_sound_mixer(mixer_dev_id);
-+}
-+
-+module_init(ep93xx_ac97_init);
-+module_exit(ep93xx_ac97_exit);
-+
-+MODULE_DESCRIPTION("Audio driver for the Cirrus EP93xx Ac97 controller.");
-+MODULE_LICENSE("GPL");
-+/* EXPORT_NO_SYMBOLS; */
-diff --git a/sound/oss/ep93xx-audio.c b/sound/oss/ep93xx-audio.c
-new file mode 100644
-index 0000000..7e00d6d
---- /dev/null
-+++ b/sound/oss/ep93xx-audio.c
-@@ -0,0 +1,3821 @@
-+/*
-+ * ep93xx-audio.c
-+ *
-+ * Common audio handling for the Cirrus EP93xx processor.
-+ *
-+ * Copyright (c) 2003 Cirrus Logic Corp.
-+ * Copyright (C) 2000, 2001 Nicolas Pitre <nico@cam.org>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License.
-+ *
-+ * Taken from sa1100-audio.c
-+ *
-+ * This module handles the generic buffering/DMA/mmap audio interface for
-+ * codecs connected to the EP93xx chip. All features depending on specific
-+ * hardware implementations like supported audio formats or samplerates are
-+ * relegated to separate specific modules.
-+ *
-+ *
-+ * History:
-+ *
-+ * 2000-05-21 Nicolas Pitre Initial release.
-+ *
-+ * 2000-06-10 Erik Bunce Add initial poll support.
-+ *
-+ * 2000-08-22 Nicolas Pitre Removed all DMA stuff. Now using the
-+ * generic SA1100 DMA interface.
-+ *
-+ * 2000-11-30 Nicolas Pitre - Validation of opened instances;
-+ * - Power handling at open/release time instead
-+ * of driver load/unload;
-+ *
-+ * 2001-06-03 Nicolas Pitre Made this file a separate module, based on
-+ * the former sa1100-uda1341.c driver.
-+ *
-+ * 2001-07-22 Nicolas Pitre - added mmap() and realtime support
-+ * - corrected many details to better comply
-+ * with the OSS API
-+ *
-+ * 2001-10-19 Nicolas Pitre - brought DMA registration processing
-+ * into this module for better ressource
-+ * management. This also fixes a bug
-+ * with the suspend/resume logic.
-+ *
-+ * 2003-04-04 Adapted for EP93xx I2S/Ac97 audio.
-+ *
-+ * 2004-04-23 Added support for multiple stereo streams.
-+ *
-+ * 2005-05-11 Manfred Gruber - Ported this from Cirrus Logic Virgo 1-4-3 release
-+ * to Kernel 2.6.11.X
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/fs.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+#include <linux/sched.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/errno.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+#include <linux/sysrq.h>
-+#include <linux/delay.h>
-+#include <linux/kernel_stat.h>
-+#include <asm/arch/dma.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <asm/uaccess.h>
-+//#include <asm/fiq.h>
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/semaphore.h>
-+#include <asm/arch/dma.h>
-+#include <asm/arch/irqs.h>
-+
-+#include "ep93xx-audio.h"
-+
-+#undef DEBUG
-+//#define DEBUG 1
-+#ifdef DEBUG
-+#define DPRINTK( fmt, arg... ) printk( fmt, ##arg )
-+#else
-+#define DPRINTK( fmt, arg... )
-+#endif
-+
-+/* Mostly just prints what ioctls got called */
-+//#define DEBUG 1
-+#ifdef DEBUG
-+#define DPRINTK_IOCTL( fmt, arg... ) printk( fmt, ##arg )
-+#else
-+#define DPRINTK_IOCTL( fmt, arg... )
-+#endif
-+
-+/*
-+ * Experiencing gaps in your audio? Try upping the AUDIO_NBFRAGS_DEFAULT!
-+ * Experiencing memory problems? Try lowering them.
-+ * DMA memory space is precious and rare on ARM.
-+ *
-+ */
-+
-+//
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+#define AUDIO_NBFRAGS_DEFAULT 31
-+#define AUDIO_FRAGSIZE_DEFAULT 65536
-+#define AUDIO_NBFRAGS_MAX 31
-+#else
-+#ifdef CONFIG_SOUND_EP93XX_AC97
-+// Values changed from KERNEL2.4
-+#define AUDIO_NBFRAGS_DEFAULT 4
-+#define AUDIO_FRAGSIZE_DEFAULT 8192 // max is 65536
-+#define AUDIO_NBFRAGS_MAX 4
-+#else
-+#define AUDIO_NBFRAGS_DEFAULT 16
-+#define AUDIO_FRAGSIZE_DEFAULT 32768 // max is 65536
-+#define AUDIO_NBFRAGS_MAX 16
-+#endif
-+#endif
-+
-+/*
-+ * NEXT_BUF
-+ *
-+ * Translates to:
-+ * stream->dma_buffer_index++;
-+ * stream->dma_buffer_index %= stream->nbfrags;
-+ * stream->dma_buffer = stream->buffers + stream->dma_buffer_index;
-+ *
-+ * So stream->dma_buffer always points to the stream->dma_buffer_index-nth element
-+ * of stream->buffers.
-+ */
-+#define NEXT_BUF(_s_,_b_) { \
-+ (_s_)->_b_##_index++; \
-+ (_s_)->_b_##_index %= (_s_)->nbfrags; \
-+ (_s_)->_b_ = (_s_)->buffers + (_s_)->_b_##_index; }
-+
-+#define AUDIO_ACTIVE(state) ((state)->rd_ref || (state)->wr_ref)
-+
-+/* Function prototypes */
-+static __inline__ int copy_to_user_with_conversion
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount);
-+
-+static __inline__ int copy_from_user_with_conversion
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount);
-+
-+static void audio_dma_start(struct audio_state_t *state,
-+ struct audio_stream_t *stream);
-+static void audio_dma_pause(struct audio_state_t *state,
-+ struct audio_stream_t *stream);
-+static void audio_prime_dma(struct audio_state_t *state,
-+ struct audio_stream_t *stream);
-+
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+#define DMA_ADD_BUFFER pio_add_buffer
-+#define DMA_CONFIG pio_config
-+#define DMA_FLUSH pio_flush
-+#define DMA_FREE pio_free
-+#define DMA_GET_POSITION pio_get_position
-+#define DMA_PAUSE pio_pause
-+#define DMA_REMOVE_BUFFER pio_remove_buffer
-+#define DMA_REQUEST pio_request
-+#define DMA_START pio_start
-+#else
-+#define DMA_ADD_BUFFER ep93xx_dma_add_buffer
-+#define DMA_CONFIG ep93xx_dma_config
-+#define DMA_FLUSH ep93xx_dma_flush
-+#define DMA_FREE ep93xx_dma_free
-+#define DMA_GET_POSITION ep93xx_dma_get_position
-+#define DMA_PAUSE ep93xx_dma_pause
-+#define DMA_REMOVE_BUFFER ep93xx_dma_remove_buffer
-+#define DMA_REQUEST ep93xx_dma_request
-+#define DMA_START ep93xx_dma_start
-+#endif
-+
-+#ifdef CONFIG_SOUND_EP93XX_AUDIO_PIO
-+/*
-+ * The maximum number of buffers accepted by the PIO interface.
-+ */
-+#define PIO_MAX_BUFFERS 32
-+
-+/*
-+ * A convenienced macro to advance from one buffer to the next.
-+ */
-+#define PIO_NEXT(x) (((x) + 1) % PIO_MAX_BUFFERS)
-+
-+/*
-+ * A structure to remember information about a buffer.
-+ */
-+struct pio_buffer {
-+ unsigned int source;
-+ unsigned int pos;
-+ unsigned int size;
-+ int buf_id;
-+};
-+
-+/*
-+ * A structure to remember information about a stream.
-+ */
-+struct pio_stream {
-+ int assigned;
-+ struct pio_buffer queue[PIO_MAX_BUFFERS];
-+ ep93xx_dma_dev_t device;
-+ int first;
-+ int cur;
-+ int last;
-+ int bytes;
-+ int pause;
-+ dma_callback callback;
-+ unsigned int user_data;
-+};
-+
-+/*
-+ * The twelve streams that we can handle.
-+ */
-+static struct pio_stream pio_streams[12];
-+
-+/*
-+ * Reference counts for the two interrupt handlers.
-+ */
-+static int pio_irq_ref_count[2];
-+
-+/*
-+ * The registers that enable the three I2S transmitters.
-+ */
-+static const unsigned int i2s_txenable[3] = {
-+ I2STX0En,
-+ I2STX1En,
-+ I2STX2En
-+};
-+
-+/*
-+ * The flag that indicates a FIFO full condition on the three I2S transmitters.
-+ */
-+static const unsigned int i2s_txflag[3] = {
-+ TX0_FIFO_FULL,
-+ TX1_FIFO_FULL,
-+ TX2_FIFO_FULL
-+};
-+
-+/*
-+ * The register that contains the left channel data for the three I2S
-+ * transmitters.
-+ */
-+static const unsigned int i2s_tx_lft[3] = {
-+ I2STX0Lft,
-+ I2STX1Lft,
-+ I2STX2Lft
-+};
-+
-+/*
-+ * The register that contains the right channel data for the three I2S
-+ * transmitters.
-+ */
-+static const unsigned int i2s_tx_rt[3] = {
-+ I2STX0Rt,
-+ I2STX1Rt,
-+ I2STX2Rt
-+};
-+
-+/*
-+ * The registers that enable the three I2S receivers.
-+ */
-+static const unsigned int i2s_rxenable[3] = {
-+ I2SRX0En,
-+ I2SRX1En,
-+ I2SRX2En
-+};
-+
-+/*
-+ * The flag that indicates a FIFO empty condition on the three I2S receivers.
-+ */
-+static const unsigned int i2s_rxflag[3] = {
-+ RX0_FIFO_EMPTY,
-+ RX1_FIFO_EMPTY,
-+ RX2_FIFO_EMPTY
-+};
-+
-+/*
-+ * The register that contains the left channel data for the three I2S
-+ * receivers.
-+ */
-+static const unsigned int i2s_rx_lft[3] = {
-+ I2SRX0Lft,
-+ I2SRX1Lft,
-+ I2SRX2Lft
-+};
-+
-+/*
-+ * The register that contains the right channel data for the three I2S
-+ * receivers.
-+ */
-+static const unsigned int i2s_rx_rt[3] = {
-+ I2SRX0Rt,
-+ I2SRX1Rt,
-+ I2SRX2Rt
-+};
-+
-+/*
-+ * The registers that contain the status for the three AC'97 transceivers.
-+ */
-+static const unsigned int ac97_status[3] = {
-+ AC97SR1,
-+ AC97SR2,
-+ AC97SR3
-+};
-+
-+/*
-+ * The registers that contain the audio data for the three AC'97 transceivers.
-+ */
-+static const unsigned int ac97_data[3] = {
-+ AC97DR1,
-+ AC97DR2,
-+ AC97DR3
-+};
-+
-+/*
-+ * The registers that control the three AC'97 transmitters.
-+ */
-+static const unsigned int ac97_txctrl[3] = {
-+ AC97TXCR1,
-+ AC97TXCR2,
-+ AC97TXCR3
-+};
-+
-+/*
-+ * The registers that control the three AC'97 receivers.
-+ */
-+static const unsigned int ac97_rxctrl[3] = {
-+ AC97RXCR1,
-+ AC97RXCR2,
-+ AC97RXCR3
-+};
-+
-+/*
-+ * The descriptor for our FIQ handler.
-+ */
-+static struct fiq_handler fh = { NULL, "pio_audio", NULL, NULL };
-+
-+/*
-+ * Stack space for our FIQ handler.
-+ */
-+static unsigned char fiq_stack[1024];
-+
-+/*
-+ * References to the labels in the inline assembly.
-+ */
-+extern void i2s_fiq_begin;
-+extern void i2s_fiq_end;
-+extern void ac97_fiq_begin;
-+extern void ac97_fiq_end;
-+
-+/*
-+ * The FIQ handler for I2S audio. This stub is copied into the vector area and
-+ * simply calls the I2S interrupt handler.
-+ */
-+void pio_i2s_fiq_handler(void)
-+{
-+ __asm__ __volatile__("\n\
-+i2s_fiq_begin:\n\
-+ stmdb r13!, {r0-r7, lr}\n\
-+ ldr r0, =pio_i2s_irq_handler\n\
-+ mov lr, pc\n\
-+ mov pc, r0\n\
-+ ldmia r13!, {r0-r7, lr}\n\
-+ subs pc, lr, #4\n\
-+ .ltorg\n\
-+i2s_fiq_end:");
-+}
-+
-+/*
-+ * The FIQ handler for AC'97 audio. This stub is copied into the vector area
-+ * and simply calls the AC'97 interrupt handler.
-+ */
-+void pio_ac97_fiq_handler(void)
-+{
-+ __asm__ __volatile__("\n\
-+ac97_fiq_begin:\n\
-+ stmdb r13!, {r0-r7, lr}\n\
-+ ldr r0, =pio_ac97_irq_handler\n\
-+ mov lr, pc\n\
-+ mov pc, r0\n\
-+ ldmia r13!, {r0-r7, lr}\n\
-+ subs pc, lr, #4\n\
-+ .ltorg\n\
-+ac97_fiq_end:");
-+}
-+
-+/*
-+ * The interrupt handler for I2S audio.
-+ */
-+static void pio_i2s_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ struct pio_stream *p;
-+ struct pio_buffer *b;
-+ int idx;
-+
-+ /*
-+ * Increment the count of interrupts.
-+ */
-+ kstat.irqs[smp_processor_id()][IRQ_SAI]++;
-+
-+ /*
-+ * Loop through the three transmitters.
-+ */
-+ for (idx = 0; idx < 3; idx++) {
-+ /*
-+ * Do nothing if this transmitter is not enabled.
-+ */
-+ if (!inl(i2s_txenable[idx]))
-+ continue;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[idx];
-+
-+ /*
-+ * Loop while the transmit FIFO is not full.
-+ */
-+ while (!(inl(I2SGlSts) & i2s_txflag[idx])) {
-+ /*
-+ * If the stream is not assigned, is paused, or has no
-+ * data, then write out silence.
-+ */
-+ if (!p->assigned || p->pause || (p->cur == p->last)) {
-+ outl(0, i2s_tx_lft[idx]);
-+ outl(0, i2s_tx_rt[idx]);
-+ } else {
-+ /*
-+ * Get a pointer to the current buffer.
-+ */
-+ b = &p->queue[p->cur];
-+
-+ /*
-+ * Write out the next sample.
-+ */
-+ outl(*(unsigned long *)b->source,
-+ i2s_tx_lft[idx]);
-+ outl(*(unsigned long *)(b->source + 4),
-+ i2s_tx_rt[idx]);
-+
-+ /*
-+ * Increment past the next sample.
-+ */
-+ b->source += 8;
-+ b->pos += 8;
-+
-+ /*
-+ * See if the buffer has been consumed.
-+ */
-+ if (b->pos == b->size) {
-+ /*
-+ * Increment the count of bytes
-+ * transmitted.
-+ */
-+ p->bytes += b->size;
-+
-+ /*
-+ * Go to the next buffer.
-+ */
-+ p->cur = PIO_NEXT(p->cur);
-+
-+ /*
-+ * Call the callback if there is one.
-+ */
-+ if (p->callback)
-+ p->callback(NFB, p->device,
-+ p->user_data);
-+ }
-+ }
-+ }
-+ }
-+
-+ /*
-+ * Loop through the three receivers.
-+ */
-+ for (idx = 0; idx < 3; idx++) {
-+ /*
-+ * Do nothing if this receiver is not enabled.
-+ */
-+ if (!inl(i2s_rxenable[idx]))
-+ continue;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[idx + 3];
-+
-+ /*
-+ * Loop while the receive FIFO is not empty.
-+ */
-+ while (!(inl(I2SGlSts) & i2s_rxflag[idx])) {
-+ /*
-+ * If the stream is not assigned, is paused, or has no
-+ * buffer space, then throw away the data.
-+ */
-+ if (!p->assigned || p->pause || (p->cur == p->last)) {
-+ inl(i2s_rx_lft[idx]);
-+ inl(i2s_rx_rt[idx]);
-+ } else {
-+ /*
-+ * Get a pointer to the current buffer.
-+ */
-+ b = &p->queue[p->cur];
-+
-+ /*
-+ * Read in the next sample.
-+ */
-+ *(unsigned long *)b->source =
-+ inl(i2s_rx_lft[idx]);
-+ *(unsigned long *)(b->source + 4) =
-+ inl(i2s_rx_rt[idx]);
-+
-+ /*
-+ * Increment past the next sample.
-+ */
-+ b->source += 8;
-+ b->pos += 8;
-+
-+ /*
-+ * See if the buffer has been consumed.
-+ */
-+ if (b->pos == b->size) {
-+ /*
-+ * Increment the count of bytes
-+ * received.
-+ */
-+ p->bytes += b->size;
-+
-+ /*
-+ * Go to the next buffer.
-+ */
-+ p->cur = PIO_NEXT(p->cur);
-+
-+ /*
-+ * Call the callback if there is one.
-+ */
-+ if (p->callback)
-+ p->callback(NFB, p->device,
-+ p->user_data);
-+ }
-+ }
-+ }
-+ }
-+
-+ /*
-+ * Clear any overrun or underrun conditions that may exist.
-+ */
-+ outl(0, I2SGlSts);
-+}
-+
-+/*
-+ * The interrupt handler for AC'97 audio.
-+*/
-+static void pio_ac97_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ struct pio_stream *p;
-+ struct pio_buffer *b;
-+ int idx, cm;
-+
-+ /*
-+ * Increment the count of interrupts.
-+ */
-+ kstat.irqs[smp_processor_id()][IRQ_AAC]++;
-+
-+ /*
-+ * Loop through the three transmitters.
-+ */
-+ for (idx = 0; idx < 3; idx++) {
-+ /*
-+ * Do nothing if this transmitter is not enabled.
-+ */
-+ if (!(inl(ac97_txctrl[idx]) & AC97TXCR_TEN))
-+ continue;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[idx + 6];
-+
-+ /*
-+ * See if this transmitter is in compact mode.
-+ */
-+ cm = inl(ac97_txctrl[idx]) & AC97TXCR_CM;
-+
-+ /*
-+ * Loop while the transmit FIFO is not full.
-+ */
-+ while (!(inl(ac97_status[idx]) & AC97SR_TXFF)) {
-+ /*
-+ * If the stream is not assigned, is paused, or has no
-+ * data, then write out silence.
-+ */
-+ if (!p->assigned || p->pause || (p->cur == p->last)) {
-+ outl(0, ac97_data[idx]);
-+ if (!cm)
-+ outl(0, ac97_data[idx]);
-+ } else {
-+ /*
-+ * Get a pointer to the current buffer.
-+ */
-+ b = &p->queue[p->cur];
-+
-+ /*
-+ * Write out the next sample.
-+ */
-+ outl(*(unsigned long *)b->source,
-+ ac97_data[idx]);
-+
-+ /*
-+ * Increment past the next sample.
-+ */
-+ b->source += 4;
-+ b->pos += 4;
-+
-+ /*
-+ * Write another sample if we are not in
-+ * compact mode.
-+ */
-+ if (!cm) {
-+ outl(*(unsigned long *)b->source,
-+ ac97_data[idx]);
-+ b->source += 4;
-+ b->pos += 4;
-+ }
-+
-+ /*
-+ * See if the buffer has been consumed.
-+ */
-+ if (b->pos == b->size) {
-+ /*
-+ * Increment the count of bytes
-+ * transmitted.
-+ */
-+ p->bytes += b->size;
-+
-+ /*
-+ * Go to the next buffer.
-+ */
-+ p->cur = PIO_NEXT(p->cur);
-+
-+ /*
-+ * Call the callback if there is one.
-+ */
-+ if (p->callback)
-+ p->callback(NFB, p->device,
-+ p->user_data);
-+ }
-+ }
-+ }
-+ }
-+
-+ /*
-+ * Loop through the three receivers.
-+ */
-+ for (idx = 0; idx < 3; idx++) {
-+ /*
-+ * Do nothing if this receiver is not enabled.
-+ */
-+ if (!(inl(ac97_rxctrl[idx]) & AC97RXCR_REN))
-+ continue;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[idx + 9];
-+
-+ /*
-+ * See if this receiver is in compact mode.
-+ */
-+ cm = inl(ac97_rxctrl[idx]) & AC97RXCR_CM;
-+
-+ /*
-+ * Loop while the receive FIFO is not empty.
-+ */
-+ while (!(inl(ac97_status[idx]) & AC97SR_RXFE)) {
-+ /*
-+ * If the stream is not assigned, is paused, or has no
-+ * buffer space, then throw away the data.
-+ */
-+ if (!p->assigned || p->pause || (p->cur == p->last)) {
-+ inl(ac97_data[idx]);
-+ if (!cm)
-+ inl(ac97_data[idx]);
-+ } else {
-+ /*
-+ * Get a pointer to the current buffer.
-+ */
-+ b = &p->queue[p->cur];
-+
-+ /*
-+ * Read in the next sample.
-+ */
-+ *(unsigned long *)b->source =
-+ inl(ac97_data[idx]);
-+
-+ /*
-+ * Increment past the next sample.
-+ */
-+ b->source += 4;
-+ b->pos += 4;
-+
-+ /*
-+ * Read another sample if we are not in compact
-+ * mode.
-+ */
-+ if (!cm) {
-+ *(unsigned long *)b->source =
-+ inl(ac97_data[idx]);
-+ b->source += 4;
-+ b->pos += 4;
-+ }
-+
-+ /*
-+ * See if the buffer has been consumed.
-+ */
-+ if (b->pos == b->size) {
-+ /*
-+ * Increment the count of bytes
-+ * received.
-+ */
-+ p->bytes += b->size;
-+
-+ /*
-+ * Go to the next buffer.
-+ */
-+ p->cur = PIO_NEXT(p->cur);
-+
-+ /*
-+ * Call the callback if there is one.
-+ */
-+ if (p->callback)
-+ p->callback(NFB, p->device,
-+ p->user_data);
-+ }
-+ }
-+ }
-+ }
-+}
-+
-+/*
-+ * Add a buffer to a PIO stream.
-+ */
-+static int
-+pio_add_buffer(int handle, unsigned int source, unsigned int dest,
-+ unsigned int size, unsigned int last, unsigned int buf_id)
-+{
-+ struct pio_stream *p;
-+ struct pio_buffer *b;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Fail if there is not space for another buffer.
-+ */
-+ if (PIO_NEXT(p->last) == p->first)
-+ return -1;
-+
-+ /*
-+ * Get a pointer to the next buffer.
-+ */
-+ b = &p->queue[p->last];
-+
-+ /*
-+ * Save the information about this buffer.
-+ */
-+ b->source = (unsigned int)phys_to_virt(source);
-+ b->pos = 0;
-+ b->size = size;
-+ b->buf_id = buf_id;
-+
-+ /*
-+ * Increment the last pointer.
-+ */
-+ p->last = PIO_NEXT(p->last);
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Configure a PIO stream.
-+ */
-+static int
-+pio_config(int handle, unsigned int flags_m2p, unsigned int flags_m2m,
-+ dma_callback callback, unsigned int user_data)
-+{
-+ struct pio_stream *p;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * This puts the stream into pause mode.
-+ */
-+ p->pause = 1;
-+
-+ /*
-+ * Save the callback function information.
-+ */
-+ p->callback = callback;
-+ p->user_data = user_data;
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Flush all data from a PIO stream.
-+ */
-+static int pio_flush(int handle)
-+{
-+ struct pio_stream *p;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Disable interrupts.
-+ */
-+ clf();
-+
-+ /*
-+ * Blast all buffer information from this stream.
-+ */
-+ p->first = 0;
-+ p->cur = 0;
-+ p->last = 0;
-+ p->bytes = 0;
-+
-+ /*
-+ * Enable interrupts.
-+ */
-+ stf();
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Free a PIO stream.
-+ */
-+static int pio_free(int handle)
-+{
-+ /*
-+ * See if this is a I2S or AC'97 stream.
-+ */
-+ if (handle < 6) {
-+ /*
-+ * Decrement the I2S reference count.
-+ */
-+ pio_irq_ref_count[0]--;
-+
-+ /*
-+ * See if the reference count is now zero.
-+ */
-+ if (pio_irq_ref_count[0] == 0) {
-+ /*
-+ * Make the I2S interrupt an IRQ instead of a FIQ.
-+ */
-+ outl(inl(VIC1INTSELECT) & ~(1 << (IRQ_SAI - 32)),
-+ VIC1INTSELECT);
-+
-+ /*
-+ * Disable I2S interrupts in the I2S block.
-+ */
-+ outl(0, I2STXCtrl);
-+ outl(0, I2SRXCtrl);
-+
-+ /*
-+ * Release the I2S interrupt.
-+ */
-+ free_irq(IRQ_SAI, (void *)&pio_i2s_irq_handler);
-+
-+ /*
-+ * Release the FIQ.
-+ */
-+ release_fiq(&fh);
-+ }
-+ } else {
-+ /*
-+ * Decrement the AC'97 reference count.
-+ */
-+ pio_irq_ref_count[1]--;
-+
-+ /*
-+ * See if the reference count is now zero.
-+ */
-+ if (pio_irq_ref_count[1] == 0) {
-+ /*
-+ * Make the AC'97 interrupt an IRQ instead of a FIQ.
-+ */
-+ outl(inl(VIC0INTSELECT) & ~(1 << IRQ_AAC),
-+ VIC0INTSELECT);
-+
-+ /*
-+ * Release the AC'97 interrupt.
-+ */
-+ free_irq(IRQ_AAC, (void *)&pio_ac97_irq_handler);
-+
-+ /*
-+ * Release the FIQ.
-+ */
-+ release_fiq(&fh);
-+ }
-+ }
-+
-+ /*
-+ * Mark this stream as unassigned.
-+ */
-+ pio_streams[handle].assigned = 0;
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Get the current position in a PIO stream.
-+ */
-+static int
-+pio_get_position(int handle, unsigned int *buf_id, unsigned int *total,
-+ unsigned int *current_frac)
-+{
-+ struct pio_stream *p;
-+ struct pio_buffer *b;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Disable interrupts.
-+ */
-+ clf();
-+
-+ /*
-+ * Get a pointer to the current buffer.
-+ */
-+ b = &p->queue[p->cur];
-+
-+ /*
-+ * If the buffer is is being requested, then return it.
-+ */
-+ if (buf_id)
-+ *buf_id = b->buf_id;
-+
-+ /*
-+ * If the total bytes transferred is being requested, then return it.
-+ */
-+ if (total)
-+ *total = p->bytes;
-+
-+ /*
-+ * If the bytes transferred from the current buffer is being requested,
-+ * then return it.
-+ */
-+ if (current_frac)
-+ *current_frac = b->size - b->pos;
-+
-+ /*
-+ * Enable interrupts.
-+ */
-+ stf();
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Pause a PIO stream.
-+ */
-+static int pio_pause(int handle, unsigned int channels, unsigned int *handles)
-+{
-+ struct pio_stream *p;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Pause the stream.
-+ */
-+ p->pause = 1;
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Remove a consumed buffer from a PIO stream.
-+ */
-+static int pio_remove_buffer(int handle, unsigned int *buf_id)
-+{
-+ struct pio_stream *p;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Fail if there are not consumed buffers.
-+ */
-+ if (p->first == p->cur)
-+ return -1;
-+
-+ /*
-+ * Return the ID of the next fully consumed buffer.
-+ */
-+ *buf_id = p->queue[p->first].buf_id;
-+
-+ /*
-+ * Increment the first pointer.
-+ */
-+ p->first = PIO_NEXT(p->first);
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Request a PIO stream.
-+ */
-+static int
-+pio_request(int *handle, const char *device_id, ep93xx_dma_dev_t device)
-+{
-+ struct pio_stream *p;
-+ struct pt_regs regs;
-+ int idx, error;
-+
-+ /*
-+ * Get the stream index from the DMA device we are emulating.
-+ */
-+ switch (device) {
-+ case DMATx_I2S1:
-+ idx = 0;
-+ break;
-+ case DMATx_I2S2:
-+ idx = 1;
-+ break;
-+ case DMATx_I2S3:
-+ idx = 2;
-+ break;
-+ case DMARx_I2S1:
-+ idx = 3;
-+ break;
-+ case DMARx_I2S2:
-+ idx = 4;
-+ break;
-+ case DMARx_I2S3:
-+ idx = 5;
-+ break;
-+ case DMATx_AAC1:
-+ idx = 6;
-+ break;
-+ case DMATx_AAC2:
-+ idx = 7;
-+ break;
-+ case DMATx_AAC3:
-+ idx = 8;
-+ break;
-+ case DMARx_AAC1:
-+ idx = 9;
-+ break;
-+ case DMARx_AAC2:
-+ idx = 10;
-+ break;
-+ case DMARx_AAC3:
-+ idx = 11;
-+ break;
-+ default:
-+ return -ENODEV;
-+ }
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[idx];
-+
-+ /*
-+ * Fail if this stream is already assigned.
-+ */
-+ if (p->assigned)
-+ return -EBUSY;
-+
-+ /*
-+ * Initialize this stream.
-+ */
-+ memset(p->queue, 0, sizeof(p->queue));
-+ p->device = device;
-+ p->first = 0;
-+ p->cur = 0;
-+ p->last = 0;
-+ p->bytes = 0;
-+ p->pause = 0;
-+ p->callback = 0;
-+ p->user_data = 0;
-+
-+ /*
-+ * Mark this stream as assigned.
-+ */
-+ p->assigned = 1;
-+
-+ /*
-+ * See if this is a I2S or AC'97 stream.
-+ */
-+ if (idx < 6) {
-+ /*
-+ * If there is already a AC'97 stream in use, then do not allow
-+ * I2S streams.
-+ */
-+ if (pio_irq_ref_count[1])
-+ return -EBUSY;
-+
-+ /*
-+ * See if there is another I2S stream.
-+ */
-+ if (pio_irq_ref_count[0] == 0) {
-+ /*
-+ * Claim the FIQ handler.
-+ */
-+ if (claim_fiq(&fh))
-+ return -EBUSY;
-+
-+ /*
-+ * Request the I2S interrupt.
-+ */
-+ error = request_irq(IRQ_SAI, pio_i2s_irq_handler,
-+ SA_INTERRUPT, "i2s",
-+ (void *)&pio_i2s_irq_handler);
-+ if (error) {
-+ release_fiq(&fh);
-+ return error;
-+ }
-+
-+ /*
-+ * Set the FIQ mode registers.
-+ */
-+ regs.ARM_sp = (long)fiq_stack + sizeof(fiq_stack);
-+ set_fiq_regs(&regs);
-+
-+ /*
-+ * Set the FIQ handler.
-+ */
-+ set_fiq_handler(&i2s_fiq_begin,
-+ &i2s_fiq_end - &i2s_fiq_begin);
-+
-+ /*
-+ * Make the I2S interrupt a FIQ instead of an IRQ.
-+ */
-+ outl(inl(VIC1INTSELECT) | (1 << (IRQ_SAI - 32)),
-+ VIC1INTSELECT);
-+
-+ /*
-+ * Enable transmit half empty and receive half full
-+ * interrupts in the I2S block.
-+ */
-+ outl(2, I2STXCtrl);
-+ outl(2, I2SRXCtrl);
-+ }
-+
-+ /*
-+ * Increment the I2S interrupt reference count.
-+ */
-+ pio_irq_ref_count[0]++;
-+ } else {
-+ /*
-+ * If there is already a I2S stream in use, then do not allow
-+ * AC'97 streams.
-+ */
-+ if (pio_irq_ref_count[0])
-+ return -EBUSY;
-+
-+ /*
-+ * See if there is another AC'97 stream.
-+ */
-+ if (pio_irq_ref_count[1] == 0) {
-+ /*
-+ * Claim the FIQ handler.
-+ */
-+ if (claim_fiq(&fh))
-+ return -EBUSY;
-+
-+ /*
-+ * Request the AC'97 interrupt.
-+ */
-+ error = request_irq(IRQ_AAC, pio_ac97_irq_handler,
-+ SA_INTERRUPT, "ac-97",
-+ (void *)&pio_ac97_irq_handler);
-+ if (error) {
-+ release_fiq(&fh);
-+ return error;
-+ }
-+
-+ /*
-+ * Set the FIQ mode registers.
-+ */
-+ regs.ARM_sp = (long)fiq_stack + sizeof(fiq_stack);
-+ set_fiq_regs(&regs);
-+
-+ /*
-+ * Set the FIQ handler.
-+ */
-+ set_fiq_handler(&ac97_fiq_begin,
-+ &ac97_fiq_end - &ac97_fiq_begin);
-+
-+ /*
-+ * Make the AC'97 interrupt a FIQ instead of an IRQ.
-+ */
-+ outl(inl(VIC0INTSELECT) | (1 << IRQ_AAC),
-+ VIC0INTSELECT);
-+ }
-+
-+ /*
-+ * Increment the AC'97 interrupt reference count.
-+ */
-+ pio_irq_ref_count[1]++;
-+ }
-+
-+ /*
-+ * Return a handle to this stream.
-+ */
-+ *handle = idx;
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+
-+/*
-+ * Start a PIO stream.
-+ */
-+static int pio_start(int handle, unsigned int channels, unsigned int *handles)
-+{
-+ struct pio_stream *p;
-+
-+ /*
-+ * Get a pointer to this stream's structure.
-+ */
-+ p = &pio_streams[handle];
-+
-+ /*
-+ * Start the stream.
-+ */
-+ p->pause = 0;
-+
-+ /*
-+ * Success.
-+ */
-+ return 0;
-+}
-+#endif
-+
-+/*
-+ * calculate_dma2usr_ratio_etc()
-+ *
-+ * For audio playback, we convert samples of arbitrary format to be 32 bit
-+ * for our hardware. We're scaling a user buffer to a dma buffer. So when
-+ * report byte counts, we scale them acording to the ratio of DMA sample
-+ * size to user buffer sample size. When we report # of DMA fragments,
-+ * we don't scale that. So:
-+ * - The fragment size the app sees = (stream->fragsize/stream->dma2usr_ratio)
-+ * - The # of fragments the app sees = stream->nbfrags
-+ *
-+ * User sample type can be stereo/mono/8/16/32 bit.
-+ * DMA sample type will be either CM (compact mode) where two 16 bit
-+ * samples together in a 32 bit word become a stereo sample or non-CM
-+ * where each channel gets a 32 bit word.
-+ *
-+ * Any time usr sample type changes, we need to call this function.
-+ *
-+ * Also adjust the size and number of dma fragments if sample size changed.
-+ *
-+ * Input format Input sample Output sample size ratio (out:in)
-+ * bits channels size (bytes) CM non-CM CM non-CM
-+ * 8 mono 1 4 8 4:1 8:1
-+ * 8 stereo 2 4 8 2:1 4:1
-+ * 16 mono 2 4 8 2:1 4:1
-+ * 16 stereo 4 4 8 1:1 2:1
-+ *
-+ * 24 mono 3 4 8 X 8:3 not a real case
-+ * 24 stereo 6 4 8 X 8:6 not a real case
-+ * 32 mono 4 4 8 X 2:1
-+ * 32 stereo 8 4 8 X 1:1
-+ *
-+ */
-+static void calculate_dma2usr_ratio_etc(struct audio_stream_t *stream)
-+{
-+ unsigned int dma_sample_size, user_sample_size;
-+
-+ if (stream->bCompactMode)
-+ dma_sample_size = 4; /* each stereo sample is 2 * 16 bits */
-+ else
-+ dma_sample_size = 8; /* each stereo sample is 2 * 32 bits */
-+
-+ if (stream->audio_num_channels != 1) {
-+ // If stereo 16 bit, user sample is 4 bytes.
-+ // If stereo 8 bit, user sample is 2 bytes.
-+ user_sample_size = stream->audio_stream_bitwidth / 4;
-+ } else {
-+ // If mono 16 bit, user sample is 2 bytes.
-+ // If mono 8 bit, user sample is 1 bytes.
-+ user_sample_size = stream->audio_stream_bitwidth / 8;
-+ }
-+
-+ /*
-+ * dma2usr_ratio = (4 or 8) / (4, 2, or 1) = 8, 4, 2, or 1
-+ */
-+ stream->dma2usr_ratio = dma_sample_size / user_sample_size;
-+
-+ DPRINTK(" samplesize: dma %d user %d dma/usr ratio %d\n",
-+ dma_sample_size, user_sample_size, stream->dma2usr_ratio);
-+ DPRINTK
-+ (" requested: fragsize %d num frags %d total bytes %d total samples %d\n",
-+ stream->requested_fragsize, stream->requested_nbfrags,
-+ stream->requested_fragsize * stream->requested_nbfrags,
-+ (stream->requested_fragsize * stream->requested_nbfrags) /
-+ user_sample_size);
-+ DPRINTK
-+ (" usr : fragsize %d num frags %d total bytes %d total samples %d\n",
-+ (stream->fragsize / stream->dma2usr_ratio), stream->nbfrags,
-+ stream->fragsize * stream->nbfrags / stream->dma2usr_ratio,
-+ (stream->fragsize * stream->nbfrags) / (stream->dma2usr_ratio *
-+ user_sample_size));
-+ DPRINTK
-+ (" dma: fragsize %d num frags %d total bytes %d total samples %d\n",
-+ stream->fragsize, stream->nbfrags,
-+ stream->fragsize * stream->nbfrags,
-+ (stream->fragsize * stream->nbfrags) / dma_sample_size);
-+
-+}
-+
-+/*
-+ * audio_deallocate_buffers
-+ *
-+ * This function frees all buffers
-+ */
-+static void audio_deallocate_buffers(struct audio_state_t *state,
-+ struct audio_stream_t *stream)
-+{
-+ int frag, i;
-+
-+ DPRINTK("EP93xx - audio_deallocate_buffers\n");
-+
-+ /* ensure DMA won't run anymore */
-+ audio_dma_pause(state, stream);
-+ stream->active = 0;
-+ stream->stopped = 0;
-+
-+ for (i = 0; i < stream->NumDmaChannels; i++)
-+ DMA_FLUSH(stream->dmahandles[i]);
-+
-+ if (stream->buffers) {
-+ for (frag = 0; frag < stream->nbfrags; frag++) {
-+ if (!stream->buffers[frag].master) {
-+ continue;
-+ }
-+ // KERNEL2.4
-+ //consistent_free(stream->buffers[frag].start,
-+ // stream->buffers[frag].master,
-+ // stream->buffers[frag].dma_addr);
-+ dma_free_coherent(NULL, stream->buffers[frag].master,
-+ stream->buffers[frag].start,
-+ stream->buffers[frag].dma_addr);
-+
-+ }
-+
-+ /*
-+ * Free the space allocated to the array of dma_buffer structs.
-+ */
-+ kfree(stream->buffers);
-+ stream->buffers = NULL;
-+ }
-+
-+ stream->buffered_bytes_to_play = 0;
-+ stream->dma_buffer_index = 0;
-+ stream->dma_buffer = NULL;
-+ stream->bytecount = 0;
-+ stream->getptrCount = 0;
-+ stream->fragcount = 0;
-+
-+ DPRINTK("EP93xx - audio_deallocate_buffers - EXIT\n");
-+}
-+
-+/*
-+ * audio_allocate_buffers
-+ *
-+ * This function allocates the buffer structure array and buffer data space
-+ * according to the current number of fragments and fragment size.
-+ * Note that the output_stream and input_stream structs are allocated
-+ * in ep93xx-ac97.c or ep93xx-i2s.c.
-+ */
-+static int audio_allocate_buffers(struct audio_state_t *state,
-+ struct audio_stream_t *stream)
-+{
-+ int frag;
-+ int dmasize = 0;
-+ char *dmabuf = NULL;
-+ dma_addr_t dmaphys = 0;
-+ int buf_num = 0;
-+
-+ if (stream->buffers)
-+ return -EBUSY;
-+
-+ DPRINTK("EP93xx audio_allocate_buffers\n");
-+
-+ /*
-+ * Allocate space for the array of struct audio_buf_t structs.
-+ */
-+ stream->buffers = (struct audio_buf_t *)
-+ kmalloc(sizeof(struct audio_buf_t) * stream->nbfrags, GFP_KERNEL);
-+
-+ if (!stream->buffers) {
-+ DPRINTK("ep93xx-audio: unable to allocate audio memory\n ");
-+ audio_deallocate_buffers(state, stream);
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ * If the audio app hasn't requested a specific fragsize and nbfrags,
-+ * we stay with our default.
-+ */
-+ if ((stream->requested_fragsize != 0)
-+ && (stream->requested_nbfrags != 0)) {
-+ /*
-+ * Adjust the fragsize to take into account how big actual samples in
-+ * the dma buffer are. Max dma buf size is 64K.
-+ */
-+ stream->fragsize =
-+ stream->requested_fragsize * stream->dma2usr_ratio;
-+ }
-+
-+ if (stream->fragsize > 65536)
-+ stream->fragsize = 65536;
-+ if (stream->fragsize < 8192)
-+ stream->fragsize = 8192;
-+
-+ /*
-+ * Adjust num of frags so we have as many samples of buffer as were requested
-+ * even if the fragment size changed.
-+ */
-+ if ((stream->requested_fragsize != 0)
-+ && (stream->requested_nbfrags != 0)) {
-+ stream->nbfrags =
-+ (stream->requested_fragsize * stream->requested_nbfrags *
-+ stream->dma2usr_ratio)
-+ / stream->fragsize;
-+ }
-+
-+ if (stream->nbfrags < 2)
-+ stream->nbfrags = 2;
-+ if (stream->nbfrags > AUDIO_NBFRAGS_MAX)
-+ stream->nbfrags = AUDIO_NBFRAGS_MAX;
-+
-+ memset(stream->buffers, 0,
-+ sizeof(struct audio_buf_t) * stream->nbfrags);
-+
-+ /*
-+ * Let's allocate non-cached memory for DMA buffers.
-+ * We try to allocate all memory at once.
-+ * If this fails (a common reason is memory fragmentation),
-+ * then we allocate more smaller buffers.
-+ */
-+ for (frag = 0; frag < stream->nbfrags; frag++) {
-+ struct audio_buf_t *dma_buffer = &stream->buffers[frag];
-+
-+ if (!dmasize) {
-+ /*
-+ * First try to allocate enough for all the frags that
-+ * don't yet have memory allocated.
-+ */
-+ dmasize = (stream->nbfrags - frag) * stream->fragsize;
-+ do {
-+ // GRM
-+ //dmabuf = consistent_alloc(GFP_KERNEL|GFP_DMA,
-+ // dmasize, &dmaphys);
-+ dmabuf = dma_alloc_coherent(NULL,
-+ dmasize, &dmaphys,
-+ GFP_KERNEL |
-+ GFP_DMA);
-+
-+ /*
-+ * If that fails, try to allocate a chunk of memory
-+ * that is one less fragment is size.
-+ */
-+ if (!dmabuf)
-+ dmasize -= stream->fragsize;
-+
-+ /*
-+ * Keep trying but the minimum we'll attempt is one
-+ * fragment. If we can't even get that, give up.
-+ */
-+ } while (!dmabuf && dmasize);
-+
-+ /*
-+ * If we do fail to allocate enough for all the frags,
-+ * deallocate whatever we did get and quit.
-+ */
-+ if (!dmabuf) {
-+ DPRINTK
-+ ("ep93xx-audio: unable to allocate audio memory\n ");
-+ audio_deallocate_buffers(state, stream);
-+ return -ENOMEM;
-+ }
-+
-+ DPRINTK
-+ ("EP93xx allocated %d bytes: dmabuf=0x%08x dmaphys=0x%08x\n",
-+ dmasize, (int)dmabuf, (int)dmaphys);
-+
-+ /*
-+ * Success! Save the size of this chunk to use when we deallocate it.
-+ */
-+ dma_buffer->master = dmasize;
-+ memzero(dmabuf, dmasize);
-+ }
-+
-+ /*
-+ * Save the start address of the dma_buffer fragment.
-+ * We know the size of the fragment is fragsize.
-+ */
-+ dma_buffer->start = dmabuf;
-+ dma_buffer->dma_addr = dmaphys;
-+ dma_buffer->stream = stream;
-+ dma_buffer->size = 0;
-+ dma_buffer->sent = 0;
-+ dma_buffer->num = buf_num++;
-+
-+ dma_buffer->owner = 0;
-+
-+ /*
-+ * Now if we only allocated the minimal one frag of space, the
-+ * dmasize will be ==0 after this subtraction so it will allocate more
-+ * for the next frag. Otherwise, the next time(s) thru this for loop
-+ * will dole out frag sized pieces of this big master chunk.
-+ */
-+ dmabuf += stream->fragsize;
-+ dmaphys += stream->fragsize;
-+ dmasize -= stream->fragsize;
-+ }
-+
-+ /*
-+ * Initialize the stream.
-+ */
-+ stream->buffered_bytes_to_play = 0;
-+ stream->dma_buffer_index = 0; /* Init the current buffer index. */
-+ stream->dma_buffer = &stream->buffers[0]; /* Point dma_buffer to the current buffer struct. */
-+ stream->bytecount = 0;
-+ stream->getptrCount = 0;
-+ stream->fragcount = 0;
-+
-+ DPRINTK("EP93xx audio_allocate_buffers -- exit SUCCESS\n");
-+ return 0;
-+
-+}
-+
-+/*
-+ * audio_reset_buffers
-+ *
-+ * This function stops and flushes the dma, gets all buffers back
-+ * from the DMA driver and resets them ready to be used again.
-+ */
-+static void audio_reset_buffers(struct audio_state_t *state,
-+ struct audio_stream_t *stream)
-+{
-+ int frag, i;
-+
-+ audio_dma_pause(state, stream);
-+ stream->active = 0;
-+ stream->stopped = 0;
-+
-+ for (i = 0; i < stream->NumDmaChannels; i++)
-+ DMA_FLUSH(stream->dmahandles[i]);
-+
-+ if (stream->buffers) {
-+ for (frag = 0; frag < stream->nbfrags; frag++) {
-+ struct audio_buf_t *dma_buffer = &stream->buffers[frag];
-+ dma_buffer->size = 0;
-+ dma_buffer->sent = 0;
-+ dma_buffer->owner = 0;
-+ }
-+ }
-+
-+ stream->buffered_bytes_to_play = 0;
-+ stream->bytecount = 0;
-+ stream->getptrCount = 0;
-+ stream->fragcount = 0;
-+}
-+
-+/*
-+ * DMA callback functions
-+ */
-+static void audio_dma_tx_callback
-+ (ep93xx_dma_int_t DMAInt, ep93xx_dma_dev_t device, unsigned int user_data) {
-+ unsigned int buf_id;
-+ int handle, i;
-+
-+ struct audio_state_t *state = (struct audio_state_t *)user_data;
-+ struct audio_stream_t *stream = state->output_stream;
-+
-+ /* DPRINTK( "audio_dma_tx_callback - %s\n", stream->devicename ); */
-+
-+ /*
-+ * Get the DMA handle that corresponds to the dma channel
-+ * that needs servicing. A multichannel audio stream will
-+ * have a DMA handle for each stereo pair that it uses.
-+ */
-+ for (i = 0;
-+ (i < stream->NumDmaChannels) && (stream->dmachannel[i] != device);
-+ i++) ;
-+ handle = stream->dmahandles[i];
-+
-+ if (stream->mapped) {
-+ /*
-+ * If we are mapped, get one dma buffer back and recycle it.
-+ */
-+ if (DMA_REMOVE_BUFFER(handle, &buf_id) >= 0) {
-+ struct audio_buf_t *dma_buffer =
-+ (struct audio_buf_t *)buf_id;
-+
-+ /* DPRINTK( "audio_dma_tx_callback - got dma buffer index=%d\n", buf_id); */
-+
-+ /* Accounting */
-+ stream->buffered_bytes_to_play -= dma_buffer->size;
-+
-+ /* bytecount and fragcount will overflow */
-+ stream->bytecount += dma_buffer->size;
-+ if (stream->bytecount < 0)
-+ stream->bytecount = 0;
-+
-+ stream->fragcount++;
-+ if (stream->fragcount < 0)
-+ stream->fragcount = 0;
-+
-+ dma_buffer->size = 0;
-+
-+ /* Recycle dma buffer */
-+ dma_buffer->size = stream->fragsize;
-+
-+ DMA_ADD_BUFFER(handle, /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ stream->fragsize, /* size */
-+ 0, /* is the last chunk? */
-+ (unsigned int)dma_buffer); /* buf id */
-+
-+ dma_buffer->sent = 1;
-+ }
-+ } else {
-+ /*
-+ * Get all buffers that are free'ed back and clear their semephores.
-+ */
-+ while (DMA_REMOVE_BUFFER(handle, &buf_id) >= 0) {
-+ struct audio_buf_t *dma_buffer =
-+ (struct audio_buf_t *)buf_id;
-+
-+ /* DPRINTK( "audio_dma_tx_callback - got dma buffer index=%d\n", buf_id); */
-+
-+ /* Accounting */
-+ stream->buffered_bytes_to_play -= dma_buffer->size;
-+
-+ stream->bytecount += dma_buffer->size;
-+ if (stream->bytecount < 0)
-+ stream->bytecount = 0;
-+
-+ stream->fragcount++;
-+ if (stream->fragcount < 0)
-+ stream->fragcount = 0;
-+
-+ dma_buffer->size = 0;
-+ dma_buffer->sent = 0;
-+
-+ /*
-+ * Release the semaphore on this dma_buffer.
-+ * If write is waiting on this dma_buffer then it can go
-+ * ahead and fill it and send it to the dma.
-+ */
-+ dma_buffer->owner = 0;
-+ }
-+ }
-+
-+ /* And any process polling on write. */
-+ wake_up(&stream->wq);
-+}
-+
-+static void audio_dma_rx_callback
-+ (ep93xx_dma_int_t DMAInt, ep93xx_dma_dev_t device, unsigned int user_data) {
-+ unsigned int buf_id;
-+ int handle, i;
-+
-+ struct audio_state_t *state = (struct audio_state_t *)user_data;
-+ struct audio_stream_t *stream = state->input_stream;
-+
-+ //DPRINTK("audio_dma_rx_callback\n");
-+
-+ /*
-+ * Get the DMA handle that corresponds to the dma channel
-+ * that needs servicing. A multichannel audio stream will
-+ * have a DMA handle for each stereo pair that it uses.
-+ */
-+ for (i = 0;
-+ (i < stream->NumDmaChannels) && (stream->dmachannel[i] != device);
-+ i++) ;
-+ handle = stream->dmahandles[i];
-+
-+ /*
-+ * Keep removing and recycling buffers as long as there are buffers
-+ * to remove.
-+ */
-+ while (!DMA_REMOVE_BUFFER(handle, &buf_id)) {
-+ struct audio_buf_t *dma_buffer = (struct audio_buf_t *)buf_id;
-+
-+ /* Accounting */
-+ stream->bytecount += stream->fragsize;
-+ if (stream->bytecount < 0)
-+ stream->bytecount = 0;
-+
-+ stream->fragcount++;
-+ if (stream->fragcount < 0)
-+ stream->fragcount = 0;
-+
-+ /* Recycle dma buffer */
-+ if (stream->mapped) {
-+ DMA_ADD_BUFFER(handle, /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ stream->fragsize, /* size */
-+ 0, /* is the last chunk? */
-+ (unsigned int)dma_buffer); /* buf id */
-+ } else {
-+ dma_buffer->size = stream->fragsize;
-+ dma_buffer->owner = 0;
-+ }
-+
-+ /* And any process polling on write. */
-+ wake_up(&stream->wq);
-+ }
-+}
-+
-+/*
-+ * audio_sync
-+ *
-+ * Wait until the last byte written to this device has been played.
-+ */
-+static int audio_sync(struct file *file)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *stream = state->output_stream;
-+ struct audio_buf_t *dma_buffer;
-+ int buf_wait_index;
-+
-+ DPRINTK("audio_sync - enter\n");
-+
-+ if (!(file->f_mode & FMODE_WRITE) || !stream->buffers || stream->mapped) {
-+ DPRINTK("audio_sync - exit immediately.\n");
-+ return 0;
-+ }
-+
-+ /*
-+ * Send current dma buffer if it contains data and hasn't been sent.
-+ */
-+ dma_buffer = stream->dma_buffer;
-+
-+ if (dma_buffer->size && !dma_buffer->sent) {
-+ DPRINTK("audio_sync -- SENDING BUFFER index=%d size=%d\n",
-+ stream->dma_buffer_index, dma_buffer->size);
-+
-+ while (dma_buffer->owner == 1)
-+ schedule();
-+ dma_buffer->owner = 1;
-+ DMA_ADD_BUFFER(stream->dmahandles[0], /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ dma_buffer->size, /* size */
-+ 0, /* is the last chunk? */
-+ (unsigned int)dma_buffer); /* dma_buffer id */
-+ dma_buffer->sent = 1;
-+ NEXT_BUF(stream, dma_buffer);
-+ }
-+
-+ /*
-+ * Let's wait for the last dma buffer we sent i.e. the one before the
-+ * current dma_buffer_index. When we acquire the semaphore, this means either:
-+ * - DMA on the buffer completed or
-+ * - the buffer was already free thus nothing else to sync.
-+ */
-+ buf_wait_index =
-+ ((stream->nbfrags + stream->dma_buffer_index -
-+ 1) % stream->nbfrags);
-+ dma_buffer = stream->buffers + buf_wait_index;
-+
-+ DPRINTK("audio_sync - waiting on down_interruptible\n");
-+ while (dma_buffer->owner == 1) {
-+ if (signal_pending(current))
-+ return -ERESTARTSYS;
-+ schedule();
-+ }
-+
-+ DPRINTK("audio_sync - EXIT\n");
-+ return 0;
-+}
-+
-+//static int iWriteCount = 0;
-+
-+/*
-+ * Need to convert to 32 bit stereo format:
-+ * 16 bit signed
-+ * 16 bit unsigned
-+ * 8 bit signed
-+ * 8 bit unsigned
-+ */
-+static int audio_write
-+ (struct file *file,
-+ const char *user_buffer, size_t src_count, loff_t * ppos) {
-+ const char *user_buffer_start = user_buffer;
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *stream = state->output_stream;
-+ unsigned int dma_xfer_count, src_xfer_count, expanded_count;
-+ int ret = 0;
-+// int i,j;
-+
-+ /* DPRINTK_IOCTL( "EP93xx - audio_write: count=%d\n", src_count ); */
-+
-+ // KERNEL2.4
-+ /*if (ppos != &file->f_pos)
-+ return -ESPIPE; */
-+
-+ if (stream->mapped)
-+ return -ENXIO;
-+
-+ if (!access_ok(VERIFY_READ, user_buffer, src_count)) {
-+ DPRINTK("access_ok failed for audio_write!!!!\n");
-+ return -EFAULT;
-+ }
-+
-+ /*
-+ * Allocate dma buffers if we haven't already done so.
-+ */
-+ if (!stream->buffers && audio_allocate_buffers(state, stream))
-+ return -ENOMEM;
-+
-+// if( iWriteCount > 40 )
-+// {
-+// for( i=0; i<4 ; i++ )
-+// {
-+// for( j=0; j<8 ; j++ )
-+// {
-+// printk("%02x ", user_buffer[(i*8)+j] );
-+// }
-+// printk("\n");
-+// }
-+// iWriteCount = 0;
-+// }
-+// iWriteCount++;
-+
-+ /*
-+ * Stay in this loop until we have copied all of the file
-+ * into user memory.
-+ */
-+ while (src_count > 0) {
-+ struct audio_buf_t *dma_buffer = stream->dma_buffer;
-+
-+ /* Wait for a dma buffer to become free */
-+ if (file->f_flags & O_NONBLOCK) {
-+ ret = -EAGAIN;
-+ if (dma_buffer->owner != 0)
-+ break;
-+ } else {
-+ while (dma_buffer->owner == 1) {
-+ if (signal_pending(current))
-+ return -ERESTARTSYS;
-+ schedule();
-+ }
-+ }
-+
-+ /*
-+ * Feed the current dma buffer (stream->dma_buffer)
-+ * This involves expanding sample size from the user_buffer
-+ * to be 32 bit stereo for our dma.
-+ */
-+
-+ /*
-+ * How much space is left in the current dma buffer?
-+ *
-+ * dma_xfer_count is # of bytes placed into the dma buffer
-+ * where each sample is 8 bytes (4 bytes left, 4 bytes right)
-+ * because that's what the I2S is set up for - 32 bit samples.
-+ */
-+ dma_xfer_count = stream->fragsize - dma_buffer->size;
-+
-+ /*
-+ * user_buffer is src_count (bytes) of whatever format.
-+ * How big will src_count be when sample size is expanded
-+ * to 32 bit samples for our hardware?
-+ */
-+ expanded_count = src_count * stream->dma2usr_ratio;
-+
-+ /*
-+ * See if we can fit all the remaining user_buffer in
-+ * the current dma buffer...
-+ */
-+ if (dma_xfer_count > expanded_count)
-+ dma_xfer_count = expanded_count;
-+
-+ //DPRINTK( "EP93xx - audio_write: %d to dma_buffer # %d\n", dma_xfer_count, stream->dma_buffer_index );
-+
-+ src_xfer_count = copy_from_user_with_conversion(state,
-+ dma_buffer->
-+ start +
-+ dma_buffer->
-+ size,
-+ user_buffer,
-+ dma_xfer_count);
-+ if (src_xfer_count <= 0)
-+ return -EFAULT;
-+
-+ /*
-+ * Increment dma buffer pointer.
-+ */
-+ dma_buffer->size += dma_xfer_count;
-+
-+ /*
-+ * Increment user_buffer pointer.
-+ * Decrement the user_buffer size count.
-+ */
-+ user_buffer += src_xfer_count;
-+ src_count -= src_xfer_count;
-+
-+ /*
-+ * If we haven't already started the DMA start it.
-+ * But don't start it if we are waiting on a trigger.
-+ */
-+ if (!stream->active && !stream->stopped) {
-+ stream->active = 1;
-+ audio_dma_start(state, stream);
-+ }
-+
-+ /*
-+ * Note that we've 'downed' the semiphore for this buffer. But the
-+ * dma driver doesn't know about it until we've added it to the DMA
-+ * driver's buffer queue. So let's do that now.
-+ */
-+ dma_buffer->owner = 1;
-+ DMA_ADD_BUFFER(stream->dmahandles[0], /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ dma_buffer->size, /* size */
-+ 0, /* is the last chunk? */
-+ (unsigned int)dma_buffer); /* buf id */
-+
-+ /*
-+ * Note that we added a buffer to play for the benefit of calculating
-+ * ODELAY.
-+ */
-+ stream->buffered_bytes_to_play += dma_buffer->size;
-+
-+ /*
-+ * Indicate that the dma buffer has been sent. Not the same as the
-+ * buffer's semiphore.
-+ */
-+ dma_buffer->sent = 1;
-+
-+ NEXT_BUF(stream, dma_buffer);
-+ }
-+
-+ /*
-+ * Return the number of bytes transferred.
-+ */
-+ if ((int)user_buffer - (int)user_buffer_start)
-+ ret = (int)user_buffer - (int)user_buffer_start;
-+
-+/* DPRINTK( "EP93xx - audio_write: return=%d\n", ret );*/
-+ return ret;
-+}
-+
-+/*
-+ * audio_dma_start
-+ *
-+ * Our Ac97 has a specific start order that it likes. Enable the
-+ * Ac97 channel AFTER enabling DMA. Our I2S is not so picky.
-+ */
-+void audio_dma_start(struct audio_state_t *state, struct audio_stream_t *stream)
-+{
-+ DMA_START(stream->dmahandles[0],
-+ stream->NumDmaChannels, stream->dmahandles);
-+
-+ if (state->hw->hw_enable)
-+ state->hw->hw_enable(stream);
-+
-+}
-+
-+/*
-+ * audio_dma_pause
-+ */
-+void audio_dma_pause(struct audio_state_t *state, struct audio_stream_t *stream)
-+{
-+ DPRINTK("audio_dma_pause - enter\n");
-+
-+ DMA_PAUSE(stream->dmahandles[0],
-+ stream->NumDmaChannels, stream->dmahandles);
-+
-+ if (state->hw->hw_disable)
-+ state->hw->hw_disable(stream);
-+
-+ if (state->hw->hw_clear_fifo)
-+ state->hw->hw_clear_fifo(stream);
-+
-+ DPRINTK("audio_dma_pause - EXIT\n");
-+}
-+
-+static void audio_prime_dma(struct audio_state_t *state,
-+ struct audio_stream_t *stream)
-+{
-+ int i;
-+
-+ DPRINTK("audio_prime_dma\n");
-+
-+ /*
-+ * If we haven't already started the DMA start it.
-+ * But don't start it if we are waiting on a trigger.
-+ */
-+ if (!stream->active && !stream->stopped) {
-+ stream->active = 1;
-+ audio_dma_start(state, stream);
-+ }
-+
-+ for (i = 0; i < stream->nbfrags; i++) {
-+ struct audio_buf_t *dma_buffer = stream->dma_buffer;
-+
-+ dma_buffer->owner = 1;
-+ DMA_ADD_BUFFER(stream->dmahandles[0], /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ stream->fragsize, /* size */
-+ 0, /* is the last chunk? */
-+ (unsigned int)dma_buffer); /* buf id */
-+ NEXT_BUF(stream, dma_buffer);
-+ }
-+}
-+
-+/*
-+ * audio_read
-+ *
-+ * Audio capture function.
-+ */
-+static int audio_read
-+ (struct file *file, char *user_buffer, size_t count, loff_t * ppos) {
-+ char *user_buffer_start = user_buffer;
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *stream = state->input_stream;
-+ unsigned int user_buffer_xfer_count = 0, dma_buffer_xfer_count = 0;
-+ int ret = 0;
-+
-+ DPRINTK("EP93xx - audio_read: count=%d\n", count);
-+
-+ // KERNEL2.4
-+ /*if (ppos != &file->f_pos)
-+ return -ESPIPE; */
-+
-+ if (stream->mapped)
-+ return -ENXIO;
-+
-+ if (!access_ok(VERIFY_WRITE, user_buffer, count)) {
-+ DPRINTK("access_ok failed for audio_read!!!!\n");
-+ return -EFAULT;
-+ }
-+
-+ if (!stream->active) {
-+ if (!stream->buffers && audio_allocate_buffers(state, stream))
-+ return -ENOMEM;
-+
-+ audio_prime_dma(state, stream);
-+ }
-+
-+ while (count > 0) {
-+ /*
-+ * Get the current buffer.
-+ */
-+ struct audio_buf_t *dma_buffer = stream->dma_buffer;
-+
-+ /*
-+ * Wait for a dma buffer to become full
-+ */
-+ if (file->f_flags & O_NONBLOCK) {
-+ //DPRINTK("file->f_flags & O_NONBLOCK\n");
-+ ret = -EAGAIN;
-+ if (dma_buffer->owner != 0)
-+ break;
-+ } else {
-+ while (dma_buffer->owner == 1) {
-+ if (signal_pending(current))
-+ return -ERESTARTSYS;
-+ schedule();
-+ }
-+ }
-+
-+ /*
-+ * If this is the first buffer captured,
-+ * dump the first 8 samples of the dma buffer.
-+ */
-+ if (stream->bFirstCaptureBuffer) {
-+ dma_buffer->size -= 64;
-+ stream->bFirstCaptureBuffer = 0;
-+ }
-+
-+ /*
-+ * How much user buffer would a whole DMA buffer fill?
-+ */
-+ user_buffer_xfer_count =
-+ dma_buffer->size / stream->dma2usr_ratio;
-+
-+ if (user_buffer_xfer_count > count)
-+ user_buffer_xfer_count = count;
-+
-+ dma_buffer_xfer_count =
-+ user_buffer_xfer_count * stream->dma2usr_ratio;
-+
-+ DPRINTK("dma_buffer: start=0x%08x fragsz=%d size=%d\n",
-+ (int)dma_buffer->start, (int)stream->fragsize,
-+ dma_buffer->size);
-+
-+ DPRINTK
-+ ("user_buffer=0x%08x from=0x%08x user_count=%d dma_count=%d\n",
-+ (int)user_buffer,
-+ (int)dma_buffer->start + stream->fragsize -
-+ dma_buffer->size, user_buffer_xfer_count,
-+ dma_buffer_xfer_count);
-+
-+ if (copy_to_user_with_conversion(state,
-+ user_buffer,
-+ dma_buffer->start +
-+ stream->fragsize -
-+ dma_buffer->size,
-+ user_buffer_xfer_count) <= 0)
-+ return -EFAULT;
-+
-+ dma_buffer->size -= dma_buffer_xfer_count;
-+
-+ user_buffer += user_buffer_xfer_count;
-+ count -= user_buffer_xfer_count;
-+
-+ /*
-+ * Grab data from the current dma buffer
-+ */
-+ //DPRINTK("Read: read %d bytes from %d. dmabufsize=%d. count=%d\n",
-+ // user_buffer_xfer_count, stream->dma_buffer_index,
-+ // dma_buffer->size, count);
-+
-+ /*
-+ * If there's still data in this buffer to be read, release
-+ * the semiphore and don't give it back yet. We may come back
-+ * and read from it in a minute when the app calls for another read.
-+ */
-+ if (dma_buffer->size > 0)
-+ break;
-+
-+ /* Make current dma buffer available for DMA again */
-+ dma_buffer->owner = 1;
-+ DMA_ADD_BUFFER(stream->dmahandles[0], /* dma instance */
-+ (unsigned int)dma_buffer->dma_addr, /* source */
-+ 0, /* dest */
-+ stream->fragsize, /* size */
-+ 0, /* the last chunk? */
-+ (unsigned int)dma_buffer); /* buf id */
-+
-+ NEXT_BUF(stream, dma_buffer);
-+ }
-+
-+ if ((int)user_buffer - (int)user_buffer_start)
-+ ret = (int)user_buffer - (int)user_buffer_start;
-+
-+ //DPRINTK("EP93xx - audio_read: return=%d\n", ret);
-+
-+ return ret;
-+}
-+
-+static int audio_mmap(struct file *file, struct vm_area_struct *vma)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *stream = 0;
-+ unsigned long size, vma_addr;
-+ int i, ret;
-+
-+ if (vma->vm_pgoff != 0)
-+ return -EINVAL;
-+
-+ if (vma->vm_flags & VM_WRITE) {
-+ if (!state->wr_ref)
-+ return -EINVAL;
-+
-+ stream = state->output_stream;
-+ } else if (vma->vm_flags & VM_READ) {
-+ if (!state->rd_ref)
-+ return -EINVAL;
-+
-+ stream = state->input_stream;
-+ } else {
-+ return -EINVAL;
-+ }
-+
-+ if (stream->mapped)
-+ return -EINVAL;
-+
-+ size = vma->vm_end - vma->vm_start;
-+
-+ if (size != stream->fragsize * stream->nbfrags)
-+ return -EINVAL;
-+
-+ if (!stream->buffers && audio_allocate_buffers(state, stream))
-+ return -ENOMEM;
-+
-+ vma_addr = vma->vm_start;
-+
-+ for (i = 0; i < stream->nbfrags; i++) {
-+ struct audio_buf_t *dma_buffer = &stream->buffers[i];
-+
-+ if (!dma_buffer->master) {
-+ continue;
-+ }
-+ // KERNEL2.4
-+ //ret = remap_page_range(vma_addr, dma_buffer->dma_addr, dma_buffer->master, vma->vm_page_prot);
-+ ret =
-+ remap_pfn_range(vma, vma_addr, dma_buffer->dma_addr,
-+ dma_buffer->master, vma->vm_page_prot);
-+
-+ if (ret)
-+ return ret;
-+
-+ vma_addr += dma_buffer->master;
-+ }
-+
-+ stream->mapped = 1;
-+
-+ return 0;
-+}
-+
-+static unsigned int audio_poll(struct file *file,
-+ struct poll_table_struct *wait)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *is = state->input_stream;
-+ struct audio_stream_t *os = state->output_stream;
-+ unsigned int mask = 0;
-+ int i;
-+
-+ DPRINTK("EP93xx - audio_poll(): mode=%s%s\n",
-+ (file->f_mode & FMODE_READ) ? "r" : "",
-+ (file->f_mode & FMODE_WRITE) ? "w" : "");
-+
-+ if (file->f_mode & FMODE_READ) {
-+ /* Start audio input if not already active */
-+ if (!is->active) {
-+ if (!is->buffers && audio_allocate_buffers(state, is))
-+ return -ENOMEM;
-+
-+ audio_prime_dma(state, is);
-+ }
-+
-+ poll_wait(file, &is->wq, wait);
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (!os->buffers && audio_allocate_buffers(state, os))
-+ return -ENOMEM;
-+
-+ poll_wait(file, &os->wq, wait);
-+ }
-+
-+ if (file->f_mode & FMODE_READ) {
-+ if (is->mapped) {
-+ /*
-+ * if the buffer is mapped assume we care that there are
-+ * more bytes available than when we last asked using
-+ * SNDCTL_DSP_GETxPTR
-+ */
-+ if (is->bytecount != is->getptrCount)
-+ mask |= POLLIN | POLLRDNORM;
-+ } else {
-+ for (i = 0; i < is->nbfrags; i++) {
-+ if (is->buffers[i].owner != 0) {
-+ mask |= POLLIN | POLLRDNORM;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (os->mapped) {
-+ if (os->bytecount != os->getptrCount)
-+ mask |= POLLOUT | POLLWRNORM;
-+ } else {
-+ for (i = 0; i < os->nbfrags; i++) {
-+ if (os->buffers[i].owner != 0) {
-+ mask |= POLLOUT | POLLWRNORM;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+
-+ DPRINTK("EP93xx - audio_poll() returned mask of %s%s\n",
-+ (mask & POLLIN) ? "r" : "", (mask & POLLOUT) ? "w" : "");
-+
-+ return mask;
-+}
-+
-+/*
-+ * audio_set_fragments
-+ *
-+ * Used to process SNDCTL_DSP_SETFRAGMENT.
-+ *
-+ * Argument is 0xMMMMSSSS where:
-+ * MMMM sets number of fragments.
-+ * SSSS sets dma fragment (dma_buffer) size. size = 2^SSSS bytes
-+ */
-+static int audio_set_fragments(struct audio_state_t *state,
-+ struct audio_stream_t *stream, int val)
-+{
-+ if (stream->active)
-+ return -EBUSY;
-+
-+ stream->requested_fragsize = 1 << (val & 0x000ffff);
-+ stream->requested_nbfrags = (val >> 16) & 0x7FFF;
-+
-+ return 0;
-+}
-+
-+static void print_audio_format(long format)
-+{
-+ switch (format) {
-+ case AFMT_U8:
-+ DPRINTK_IOCTL("AFMT_U8\n");
-+ break;
-+
-+ case AFMT_S8:
-+ DPRINTK_IOCTL("AFMT_S8\n");
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ DPRINTK_IOCTL("AFMT_S32_BLOCKED\n");
-+ break;
-+
-+ case AFMT_S16_LE:
-+ DPRINTK_IOCTL("AFMT_S16_LE\n");
-+ break;
-+
-+ case AFMT_S16_BE:
-+ DPRINTK_IOCTL("AFMT_S16_BE\n");
-+ break;
-+
-+ case AFMT_U16_LE:
-+ DPRINTK_IOCTL("AFMT_U16_LE\n");
-+ break;
-+
-+ case AFMT_U16_BE:
-+ default:
-+ DPRINTK_IOCTL("AFMT_U16_BE\n");
-+ break;
-+ }
-+}
-+
-+/*
-+ * We convert to 24 bit samples that occupy 32 bits each.
-+ * Formats we support:
-+ *
-+ * AFMT_U8
-+ * AFMT_S16_LE Little endian signed 16
-+ * AFMT_S8
-+ * AFMT_U16_LE Little endian U16
-+ * AFMT_S32_BLOCKED 32 bit little endian format, taken from the rme96xx driver.
-+ *
-+ */
-+static long audio_set_format(struct audio_stream_t *stream, long val)
-+{
-+ DPRINTK_IOCTL("audio_set_format enter. Format requested (%d) ",
-+ (int)val);
-+ print_audio_format(val);
-+
-+ switch (val) {
-+ case AFMT_QUERY:
-+ break;
-+
-+ case AFMT_U8:
-+ stream->audio_format = val;
-+ stream->audio_stream_bitwidth = 8;
-+ break;
-+
-+ case AFMT_S8:
-+ stream->audio_format = val;
-+ stream->audio_stream_bitwidth = 8;
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ stream->audio_format = val;
-+ stream->audio_stream_bitwidth = 32;
-+ break;
-+
-+ case AFMT_S16_LE:
-+ case AFMT_S16_BE:
-+ stream->audio_format = AFMT_S16_LE;
-+ stream->audio_stream_bitwidth = 16;
-+ break;
-+
-+ case AFMT_U16_LE:
-+ case AFMT_U16_BE:
-+ default:
-+ stream->audio_format = AFMT_U16_LE;
-+ stream->audio_stream_bitwidth = 16;
-+ break;
-+ }
-+
-+ DPRINTK_IOCTL("audio_set_format EXIT format set to be (%d) ",
-+ (int)stream->audio_format);
-+ print_audio_format((long)stream->audio_format);
-+
-+ return stream->audio_format;
-+}
-+
-+static __inline__ unsigned long copy_to_user_U16_LE_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ unsigned short *user_ptr = (unsigned short *)to; /* 16 bit user buffer */
-+ short *dma_ptr = (short *)from;
-+ short right, left;
-+
-+ /*
-+ * Compact mode - left is the lower 16 bits. right is the upper 16 bits.
-+ */
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ right = *dma_ptr++;
-+ left = *dma_ptr++;
-+ __put_user(left ^ 0x8000, user_ptr++);
-+ __put_user(right ^ 0x8000, user_ptr++);
-+ to_count -= 4;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ dma_ptr++; /* skip right channel sample */
-+ left = *dma_ptr++;
-+ __put_user(left ^ 0x8000, user_ptr++);
-+ to_count -= 2;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_U16_LE
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ short *user_ptr = (short *)to; /* 16 bit user buffer */
-+ int *dma_ptr = (int *)from; /* 32 bit dma buffer */
-+
-+ int shift = state->input_stream->hw_bit_width - 16;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ __put_user(((short)((*dma_ptr++) >> shift)) ^ 0x8000,
-+ user_ptr++);
-+ __put_user(((short)((*dma_ptr++) >> shift)) ^ 0x8000,
-+ user_ptr++);
-+ to_count -= 4;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ __put_user(((short)((*dma_ptr++) >> shift)) ^ 0x8000,
-+ user_ptr++);
-+ dma_ptr++; /* skip right channel sample */
-+ to_count -= 2;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_S16_LE_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ short *user_ptr = (short *)to; /* 16 bit user buffer */
-+ short *dma_ptr = (short *)from;
-+ short left, right;
-+
-+ /*
-+ * Compact mode - left is the lower 16 bits. right is the upper 16 bits.
-+ */
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ right = *dma_ptr++;
-+ left = *dma_ptr++;
-+ __put_user(left, user_ptr++);
-+ __put_user(right, user_ptr++);
-+ to_count -= 4;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ dma_ptr++; /* skip right sample */
-+ left = *dma_ptr++;
-+ __put_user(left, user_ptr++);
-+ to_count -= 2;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_S16_LE
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ short *user_ptr = (short *)to; /* 16 bit user buffer */
-+ int *dma_ptr = (int *)from; /* 32 bit dma buffer */
-+
-+ int shift = state->input_stream->hw_bit_width - 16;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ __put_user((short)((*dma_ptr++) >> shift), user_ptr++);
-+ __put_user((short)((*dma_ptr++) >> shift), user_ptr++);
-+ to_count -= 4;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ __put_user((short)((*dma_ptr++) >> shift), user_ptr++);
-+ dma_ptr++; /* skip right channel sample */
-+ to_count -= 2;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_S8_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ char *user_ptr = (char *)to; /* 8 bit user buffer */
-+ unsigned short *dma_ptr = (unsigned short *)from; /* 16 bit dma buffer */
-+ char right, left;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ right = ((char)(*dma_ptr++ >> 8));
-+ left = ((char)(*dma_ptr++ >> 8));
-+ __put_user(left, user_ptr++);
-+ __put_user(right, user_ptr++);
-+ to_count -= 2;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ dma_ptr++; /* skip right channel sample */
-+ left = ((char)(*dma_ptr++ >> 8));
-+ __put_user(left, user_ptr++);
-+ to_count--;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_S8
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ char *user_ptr = (char *)to; /* 8 bit user buffer */
-+ int *dma_ptr = (int *)from; /* 32 bit dma buffer */
-+
-+ int shift = state->input_stream->hw_bit_width - 8;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ __put_user((char)((*dma_ptr++) >> shift), user_ptr++);
-+ __put_user((char)((*dma_ptr++) >> shift), user_ptr++);
-+ to_count -= 2;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ __put_user((char)((*dma_ptr++) >> shift), user_ptr++);
-+ dma_ptr++; /* skip right channel sample */
-+ to_count--;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_U8_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ char *user_ptr = (char *)to; /* 8 bit user buffer */
-+ unsigned short *dma_ptr = (unsigned short *)from; /* 16 bit dma buffer */
-+ char right, left;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ right = ((char)(*dma_ptr++ >> 8)) ^ 0x80;
-+ left = ((char)(*dma_ptr++ >> 8)) ^ 0x80;
-+ __put_user(left, user_ptr++);
-+ __put_user(right, user_ptr++);
-+ to_count -= 2;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ dma_ptr++; /* skip right channel sample */
-+ left = ((char)(*dma_ptr++ >> 8)) ^ 0x80;
-+ __put_user(left, user_ptr++);
-+ to_count--;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+static __inline__ unsigned long copy_to_user_U8
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, unsigned long to_count) {
-+ int total_to_count = to_count;
-+ char *user_ptr = (char *)to; /* 8 bit user buffer */
-+ int *dma_ptr = (int *)from; /* 32 bit dma buffer */
-+
-+ int shift = state->input_stream->hw_bit_width - 8;
-+
-+ if (state->input_stream->audio_num_channels != 1) {
-+ while (to_count > 0) {
-+ __put_user(((char)((*dma_ptr++) >> shift)) ^ 0x80,
-+ user_ptr++);
-+ __put_user(((char)((*dma_ptr++) >> shift)) ^ 0x80,
-+ user_ptr++);
-+ to_count -= 2;
-+ }
-+ } else {
-+ while (to_count > 0) {
-+ __put_user(((char)((*dma_ptr++) >> shift)) ^ 0x80,
-+ user_ptr++);
-+ dma_ptr++; /* skip right channel sample */
-+ to_count--;
-+ }
-+ }
-+
-+ return total_to_count;
-+}
-+
-+/*
-+ * Returns negative for error
-+ * Returns # of bytes transferred out of the from buffer
-+ * for success.
-+ */
-+static __inline__ int copy_to_user_with_conversion
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ int ret = 0;
-+
-+ if (toCount == 0) {
-+ DPRINTK("copy_to_user_with_conversion - nothing to copy!\n");
-+ }
-+
-+ /*
-+ * Compact Mode means that each 32 bit word has both the
-+ * left and right sample in it.
-+ */
-+ if (state->input_stream->bCompactMode) {
-+ switch (state->input_stream->audio_format) {
-+ case AFMT_U8:
-+ ret = copy_to_user_U8_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S16_LE:
-+ ret = copy_to_user_S16_LE_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S8:
-+ ret = copy_to_user_S8_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_U16_LE:
-+ ret = copy_to_user_U16_LE_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ default:
-+ break;
-+ }
-+ } else {
-+ switch (state->input_stream->audio_format) {
-+ case AFMT_U8:
-+ ret = copy_to_user_U8(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S16_LE:
-+ ret = copy_to_user_S16_LE(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S8:
-+ ret = copy_to_user_S8(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_U16_LE:
-+ ret = copy_to_user_U16_LE(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ default:
-+ __copy_to_user((char *)to, from, toCount);
-+ ret = toCount;
-+ break;
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static __inline__ int copy_from_user_U16_LE_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ unsigned short *dma_buffer = (unsigned short *)to;
-+ unsigned short *user_buffer = (unsigned short *)from;
-+ unsigned short data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+
-+ /*
-+ * Compact mode - left is the lower 16 bits. right is the upper 16 bits.
-+ */
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = data ^ 0x8000;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = data ^ 0x8000;
-+ toCount -= 4;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ data = data ^ 0x8000;
-+ *dma_buffer++ = data;
-+ *dma_buffer++ = data;
-+ toCount -= 4;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 16 bit sample going in results
-+ * in one stereo 32 bit sample going out. So
-+ * mono = (2 bytes in)/(4 bytes out)
-+ * stereo = (4 bytes in)/(4 bytes out)
-+ */
-+ if (mono) {
-+ return toCount0 / 2;
-+ }
-+
-+ return toCount0;
-+}
-+
-+static __inline__ int copy_from_user_U16_LE
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ int *dma_buffer = (int *)to;
-+ int val;
-+ unsigned short *user_buffer = (unsigned short *)from;
-+ unsigned short data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+ int shift = state->output_stream->hw_bit_width - 16;
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned int)data ^ 0x8000) << shift;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned int)data ^ 0x8000) << shift;
-+ toCount -= 8;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = ((unsigned int)data ^ 0x8000) << shift;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 8;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 16 bit sample going in results
-+ * in a two 32 bit (left & right) samples going out. So
-+ * mono = (2 bytes in)/(8 bytes out)
-+ * stereo = (4 bytes in)/(8 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 4;
-+
-+ return toCount0 / 2;
-+}
-+
-+static __inline__ int copy_from_user_S16_LE_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ short *dma_buffer = (short *)to;
-+ unsigned short *user_buffer = (unsigned short *)from;
-+ unsigned short data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+
-+ /*
-+ * Compact mode - left is the lower 16 bits. right is the upper 16 bits.
-+ */
-+
-+ if (!mono) {
-+ __copy_from_user((char *)to, from, toCount);
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = data;
-+ *dma_buffer++ = data;
-+ toCount -= 4;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 16 bit sample going in results
-+ * in one stereo 32 bit sample going out. So
-+ * mono = (2 bytes in)/(4 bytes out)
-+ * stereo = (4 bytes in)/(4 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 2;
-+
-+ return toCount0;
-+}
-+
-+static __inline__ int copy_from_user_S16_LE
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ int *dma_buffer = (int *)to;
-+ int val;
-+ unsigned short *user_buffer = (unsigned short *)from;
-+ unsigned short data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+ int shift = state->output_stream->hw_bit_width - 16;
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned int)data << shift;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned int)data << shift;
-+ toCount -= 8;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = (unsigned int)data << shift;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 8;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 16 bit sample going in results
-+ * in a two 32 bit samples (left & right) going out. So
-+ * mono = (2 bytes in)/(8 bytes out)
-+ * stereo = (4 bytes in)/(8 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 4;
-+
-+ return toCount0 / 2;
-+}
-+
-+static __inline__ int copy_from_user_S8_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ short *dma_buffer = (short *)to;
-+ short val;
-+ unsigned char *user_buffer = (unsigned char *)from;
-+ unsigned char data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+
-+ /*
-+ * Compact mode - left is the lower 16 bits. right is the upper 16 bits.
-+ */
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned short)data << 8;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned short)data << 8;
-+ toCount -= 4;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = (unsigned short)data << 8;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 4;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 8 bit sample going in results
-+ * in one stereo 32 bit sample going out. So
-+ * mono = (1 byte in)/(4 bytes out)
-+ * stereo = (2 bytes in)/(4 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 4;
-+
-+ return toCount0 / 2;
-+}
-+
-+static __inline__ int copy_from_user_S8
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ int *dma_buffer = (int *)to;
-+ int val;
-+ unsigned char *user_buffer = (unsigned char *)from;
-+ unsigned char data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+ int shift = state->output_stream->hw_bit_width - 8;
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned int)data << shift;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = (unsigned int)data << shift;
-+ toCount -= 8;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = (unsigned int)data << shift;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 8;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 8 bit sample going in results
-+ * in a two 32 bit samples (left & right) going out. So
-+ * mono = (1 byte in)/(8 bytes out)
-+ * stereo = (2 bytes in)/(8 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 8;
-+
-+ return toCount0 / 4;
-+}
-+
-+static __inline__ int copy_from_user_U8_CM
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ unsigned short *dma_buffer = (unsigned short *)to;
-+ unsigned short val;
-+ unsigned char *user_buffer = (unsigned char *)from;
-+ unsigned char data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned short)data ^ 0x80) << 8;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned short)data ^ 0x80) << 8;
-+ toCount -= 4;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = ((unsigned short)data ^ 0x80) << 8;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 4;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 8 bit sample going in results
-+ * in one stereo 32 bit sample going out. So
-+ * mono = (1 byte in)/(4 bytes out)
-+ * stereo = (2 bytes in)/(4 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 4;
-+
-+ return toCount0 / 2;
-+}
-+
-+static __inline__ int copy_from_user_U8
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ unsigned int *dma_buffer = (unsigned int *)to;
-+ unsigned int val;
-+ unsigned char *user_buffer = (unsigned char *)from;
-+ unsigned char data;
-+
-+ int toCount0 = toCount;
-+ int mono = (state->output_stream->audio_num_channels == 1);
-+ int shift = state->output_stream->hw_bit_width - 8;
-+
-+ if (!mono) {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned int)data ^ 0x80) << shift;
-+ __get_user(data, user_buffer++);
-+ *dma_buffer++ = ((unsigned int)data ^ 0x80) << shift;
-+ toCount -= 8;
-+ }
-+ } else {
-+ while (toCount > 0) {
-+ __get_user(data, user_buffer++);
-+ val = ((unsigned int)data ^ 0x80) << shift;
-+ *dma_buffer++ = val;
-+ *dma_buffer++ = val;
-+ toCount -= 8;
-+ }
-+ }
-+
-+ /*
-+ * Each mono or stereo 8 bit sample going in results
-+ * in a two 32 bit samples (left & right) going out. So
-+ * mono = (1 byte in)/(8 bytes out)
-+ * stereo = (2 bytes in)/(8 bytes out)
-+ */
-+ if (mono)
-+ return toCount0 / 8;
-+
-+ return toCount0 / 4;
-+}
-+
-+/*
-+ * Returns negative for error
-+ * Returns # of bytes transferred out of the from buffer
-+ * for success.
-+ */
-+static __inline__ int copy_from_user_with_conversion
-+ (struct audio_state_t *state,
-+ const char *to, const char *from, int toCount) {
-+ int ret = 0;
-+
-+ if (toCount == 0) {
-+ DPRINTK("copy_from_user_with_conversion - nothing to copy!\n");
-+ }
-+
-+ /*
-+ * Compact Mode means that each 32 bit word has both the
-+ * left and right sample in it.
-+ */
-+ if (state->output_stream->bCompactMode) {
-+ switch (state->output_stream->audio_format) {
-+ case AFMT_U8:
-+ ret = copy_from_user_U8_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S16_LE:
-+ ret =
-+ copy_from_user_S16_LE_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S8:
-+ ret = copy_from_user_S8_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_U16_LE:
-+ ret =
-+ copy_from_user_U16_LE_CM(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ default:
-+ break;
-+ }
-+ } else {
-+ switch (state->output_stream->audio_format) {
-+ case AFMT_U8:
-+ ret = copy_from_user_U8(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S16_LE:
-+ ret = copy_from_user_S16_LE(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S8:
-+ ret = copy_from_user_S8(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_U16_LE:
-+ ret = copy_from_user_U16_LE(state, to, from, toCount);
-+ break;
-+
-+ case AFMT_S32_BLOCKED:
-+ default:
-+ __copy_from_user((char *)to, from, toCount);
-+ ret = toCount;
-+ break;
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static int audio_ioctl(struct inode *inode, struct file *file,
-+ uint cmd, ulong arg)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ struct audio_stream_t *os = state->output_stream;
-+ struct audio_stream_t *is = state->input_stream;
-+ long val = 0;
-+
-+ switch (cmd) {
-+ case SNDCTL_DSP_STEREO:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_STEREO\n");
-+ if (get_user(val, (int *)arg) || (val > 1) || (val < 0))
-+ return -EFAULT;
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (os->audio_num_channels != (val + 1)) {
-+ os->audio_num_channels = val + 1;
-+ calculate_dma2usr_ratio_etc(os);
-+ }
-+ }
-+
-+ if (file->f_mode & FMODE_READ) {
-+ if (is->audio_num_channels != (val + 1)) {
-+ is->audio_num_channels = val + 1;
-+ calculate_dma2usr_ratio_etc(is);
-+ }
-+ }
-+
-+ return put_user(val, (long *)arg);
-+
-+ case SNDCTL_DSP_CHANNELS:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_CHANNELS\n");
-+ if (get_user(val, (int *)arg) || (val > 2) || (val < 0))
-+ return -EFAULT;
-+
-+ // Calling with value of 0 is a query.
-+ if (val == 0) {
-+ if (file->f_mode & FMODE_WRITE)
-+ val = os->audio_num_channels;
-+ else
-+ val = is->audio_num_channels;
-+ } else {
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (os->audio_num_channels != val) {
-+ os->audio_num_channels = val;
-+ calculate_dma2usr_ratio_etc(os);
-+ }
-+ }
-+ if (file->f_mode & FMODE_READ) {
-+ if (is->audio_num_channels != val) {
-+ is->audio_num_channels = val;
-+ calculate_dma2usr_ratio_etc(is);
-+ }
-+ }
-+ }
-+
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_PCM_READ_CHANNELS:
-+ DPRINTK_IOCTL("audio_ioctl - SOUND_PCM_READ_CHANNELS\n");
-+ if (file->f_mode & FMODE_WRITE)
-+ val = os->audio_num_channels;
-+ else
-+ val = is->audio_num_channels;
-+ return put_user(val, (long *)arg);
-+
-+ case SNDCTL_DSP_SETFMT:
-+ {
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_SETFMT\n");
-+
-+ if (get_user(val, (int *)arg))
-+ return -EFAULT;
-+
-+ if (val != AFMT_QUERY) {
-+ if ((file->f_mode & FMODE_WRITE)
-+ && (val != os->audio_format)) {
-+ audio_set_format(os, val);
-+ calculate_dma2usr_ratio_etc(os);
-+ if (state->hw->set_hw_serial_format)
-+ state->hw->
-+ set_hw_serial_format(os,
-+ val);
-+ }
-+ if ((file->f_mode & FMODE_READ)
-+ && (val != is->audio_format)) {
-+ audio_set_format(is, val);
-+ calculate_dma2usr_ratio_etc(is);
-+ if (state->hw->set_hw_serial_format)
-+ state->hw->
-+ set_hw_serial_format(is,
-+ val);
-+ }
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE)
-+ return put_user(os->audio_format, (long *)arg);
-+ return put_user(is->audio_format, (long *)arg);
-+ }
-+
-+ case SNDCTL_DSP_GETFMTS:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETFMTS\n");
-+ return put_user((AFMT_U8 | AFMT_S8 | AFMT_S16_LE | AFMT_U16_LE),
-+ (long *)arg);
-+
-+ case OSS_GETVERSION:
-+ DPRINTK_IOCTL("audio_ioctl - OSS_GETVERSION\n");
-+ return put_user(SOUND_VERSION, (int *)arg);
-+
-+ case SNDCTL_DSP_GETBLKSIZE:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETBLKSIZE\n");
-+ if (file->f_mode & FMODE_WRITE)
-+ return put_user(os->fragsize, (int *)arg);
-+ return put_user(is->fragsize, (int *)arg);
-+
-+ case SNDCTL_DSP_GETCAPS:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETCAPS\n");
-+ val = DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP;
-+ if (is && os)
-+ val |= DSP_CAP_DUPLEX;
-+ return put_user(val, (int *)arg);
-+
-+ case SNDCTL_DSP_SETFRAGMENT:
-+ {
-+ int ret;
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_SETFRAGMENT\n");
-+ if (get_user(val, (long *)arg))
-+ return -EFAULT;
-+
-+ if (file->f_mode & FMODE_READ) {
-+ ret = audio_set_fragments(state, is, val);
-+ if (ret < 0)
-+ return ret;
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ ret = audio_set_fragments(state, os, val);
-+ if (ret < 0)
-+ return ret;
-+ }
-+
-+ return 0;
-+ }
-+
-+ case SNDCTL_DSP_SYNC:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_SYNC\n");
-+ return audio_sync(file);
-+
-+ case SNDCTL_DSP_SETDUPLEX:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_SETDUPLEX\n");
-+ return 0;
-+
-+ case SNDCTL_DSP_POST:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_POST\n");
-+ return 0;
-+
-+ case SNDCTL_DSP_GETTRIGGER:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETTRIGGER\n");
-+ val = 0;
-+
-+ if (file->f_mode & FMODE_READ && is->active && !is->stopped)
-+ val |= PCM_ENABLE_INPUT;
-+
-+ if (file->f_mode & FMODE_WRITE && os->active && !os->stopped)
-+ val |= PCM_ENABLE_OUTPUT;
-+
-+ return put_user(val, (int *)arg);
-+
-+ case SNDCTL_DSP_SETTRIGGER:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_SETTRIGGER\n");
-+ if (get_user(val, (int *)arg))
-+ return -EFAULT;
-+
-+ if (file->f_mode & FMODE_READ) {
-+ if (val & PCM_ENABLE_INPUT) {
-+ if (!is->active) {
-+ if (!is->buffers
-+ && audio_allocate_buffers(state,
-+ is))
-+ return -ENOMEM;
-+ audio_prime_dma(state, is);
-+ }
-+
-+ if (is->stopped) {
-+ is->stopped = 0;
-+ os->active = 1;
-+ audio_dma_start(state, is);
-+ }
-+ } else {
-+ audio_dma_pause(state, is);
-+ is->stopped = 1;
-+ is->active = 0;
-+ }
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (val & PCM_ENABLE_OUTPUT) {
-+ if (!os->active) {
-+ if (!os->buffers
-+ && audio_allocate_buffers(state,
-+ os))
-+ return -ENOMEM;
-+
-+ if (os->mapped)
-+ audio_prime_dma(state, os);
-+ }
-+
-+ if (os->stopped) {
-+ os->stopped = 0;
-+ os->active = 1;
-+ audio_dma_start(state, os);
-+ }
-+ } else {
-+ audio_dma_pause(state, os);
-+ os->stopped = 1;
-+ os->active = 0;
-+ }
-+ }
-+ return 0;
-+
-+ case SNDCTL_DSP_GETOPTR:
-+ case SNDCTL_DSP_GETIPTR:
-+ {
-+ count_info inf = { 0, };
-+ struct audio_stream_t *stream =
-+ (cmd == SNDCTL_DSP_GETOPTR) ? os : is;
-+ int bytecount, fragcount, buf_num = 0;
-+ unsigned int current_frac, buf_id;
-+ // KERNEL2.4 SNIP
-+ unsigned long flags;
-+ unsigned int total = 0;
-+ // KERNEL2.4 SNAP
-+
-+ DPRINTK_IOCTL
-+ ("audio_ioctl - called SNDCTL_DSP_GETOPTR.\n");
-+
-+ if ((stream == is && !(file->f_mode & FMODE_READ)) ||
-+ (stream == os && !(file->f_mode & FMODE_WRITE)))
-+ return -EINVAL;
-+
-+ if (!stream->active)
-+ return copy_to_user((void *)arg, &inf,
-+ sizeof(inf));
-+
-+ // KERNEL2.4
-+ //save_flags_cli(flags);
-+ local_irq_save(flags);
-+
-+ // KERNEL2.4
-+ //DMA_GET_POSITION( stream->dmahandles[0], &buf_id, 0,
-+ // &current_frac );
-+ DMA_GET_POSITION(stream->dmahandles[0], &buf_id, &total,
-+ &current_frac);
-+
-+ /*
-+ * Out of a set of nbfrags buffers, which one is the current one?
-+ */
-+ if (buf_id)
-+ buf_num = ((struct audio_buf_t *)buf_id)->num;
-+
-+ /*
-+ * The ep93xx-audio ISRs keep track of bytecount and fragcount.
-+ * This bytecount isn't cleared except when the driver is opened
-+ * or when it overflows.
-+ */
-+ bytecount = stream->bytecount;
-+
-+ /* so poll can tell if it changes */
-+ stream->getptrCount = stream->bytecount;
-+
-+ /*
-+ * Return the number of fragment transitions counted in our dma ISR
-+ * since the previous call to this ioctl, then clear that counter.
-+ */
-+ fragcount = stream->fragcount;
-+ stream->fragcount = 0;
-+
-+ // KERNEL2.4
-+ //restore_flags(flags);
-+ local_irq_restore(flags);
-+
-+ /*
-+ * When reporting position to user app, scale byte counts and the
-+ * ptr to reflect the difference in sample size between dma samples
-+ * and user samples. But don't scale the # of fragments.
-+ */
-+ inf.blocks = fragcount;
-+ inf.bytes =
-+ (bytecount + current_frac) / stream->dma2usr_ratio;
-+ inf.ptr =
-+ ((buf_num * stream->fragsize) +
-+ current_frac) / stream->dma2usr_ratio;
-+
-+ return copy_to_user((void *)arg, &inf, sizeof(inf));
-+ }
-+
-+ case SNDCTL_DSP_GETODELAY:
-+ {
-+ int buffered_bytes_left, count;
-+ //unsigned int current_frac;
-+ // KERNEL2.4 SNIP
-+ unsigned int current_frac = 0;
-+ unsigned long flags;
-+ unsigned int total = 0, buf_id = 0;
-+ // KERNEL2.4SNAP
-+
-+ if (!(file->f_mode & FMODE_WRITE))
-+ return -EINVAL;
-+
-+ DPRINTK_IOCTL
-+ ("audio_ioctl - called SNDCTL_DSP_GETODELAY.\n");
-+
-+ // KERNEL2.4
-+ //save_flags_cli(flags);
-+ local_irq_save(flags);
-+
-+ // KERNEL2.4
-+ //DMA_GET_POSITION( os->dmahandles[0], 0, 0, &current_frac );
-+ DMA_GET_POSITION(os->dmahandles[0], &buf_id, &total,
-+ &current_frac);
-+
-+ buffered_bytes_left = os->buffered_bytes_to_play;
-+
-+ // KERNEL2.4
-+ //restore_flags(flags);
-+ local_irq_restore(flags);
-+
-+ count =
-+ (buffered_bytes_left -
-+ current_frac) / os->dma2usr_ratio;
-+
-+ return put_user(count, (int *)arg);
-+ }
-+
-+ case SNDCTL_DSP_GETOSPACE:
-+ {
-+ /*
-+ * It looks like this code is assuming that nobody
-+ * is writing the device while calling this ioctl
-+ * which may be a reasonable assumption. I hope.
-+ * Maybe.
-+ */
-+ audio_buf_info inf = { 0, };
-+ int i;
-+
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETOSPACE\n");
-+
-+ if (!(file->f_mode & FMODE_WRITE))
-+ return -EINVAL;
-+ if (!os->buffers && audio_allocate_buffers(state, os))
-+ return -ENOMEM;
-+
-+ for (i = 0; i < os->nbfrags; i++) {
-+ /*
-+ * If the semaphore is 1, the buffer is available.
-+ */
-+ if (os->buffers[i].owner != 0) {
-+ if (os->buffers[i].size == 0)
-+ inf.fragments++;
-+
-+ inf.bytes +=
-+ os->fragsize - os->buffers[i].size;
-+ }
-+ }
-+
-+ inf.fragsize = os->fragsize / os->dma2usr_ratio;
-+ inf.fragstotal = os->nbfrags;
-+ inf.bytes = inf.bytes / os->dma2usr_ratio;
-+
-+ return copy_to_user((void *)arg, &inf, sizeof(inf));
-+ }
-+
-+ case SNDCTL_DSP_GETISPACE:
-+ {
-+ audio_buf_info inf = { 0, };
-+ int i;
-+
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_GETISPACE\n");
-+
-+ if (!(file->f_mode & FMODE_READ))
-+ return -EINVAL;
-+ if (!is->buffers && audio_allocate_buffers(state, is))
-+ return -ENOMEM;
-+
-+ for (i = 0; i < is->nbfrags; i++) {
-+ if (is->buffers[i].owner != 0) {
-+ if (is->buffers[i].size == is->fragsize)
-+ inf.fragments++;
-+
-+ inf.bytes += is->buffers[i].size;
-+ }
-+ }
-+
-+ inf.fragsize = is->fragsize / is->dma2usr_ratio;
-+ inf.fragstotal = is->nbfrags;
-+ inf.bytes = inf.bytes / is->dma2usr_ratio;
-+
-+ return copy_to_user((void *)arg, &inf, sizeof(inf));
-+ }
-+
-+ case SNDCTL_DSP_NONBLOCK:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_NONBLOCK\n");
-+ file->f_flags |= O_NONBLOCK;
-+ return 0;
-+
-+ case SNDCTL_DSP_RESET:
-+ DPRINTK_IOCTL("audio_ioctl - SNDCTL_DSP_RESET\n");
-+ if (file->f_mode & FMODE_READ)
-+ audio_reset_buffers(state, is);
-+ if (file->f_mode & FMODE_WRITE)
-+ audio_reset_buffers(state, os);
-+ return 0;
-+
-+ default:
-+ /*
-+ * Let the client of this module handle the
-+ * non generic ioctls
-+ */
-+ return state->hw->client_ioctl(inode, file, cmd, arg);
-+ }
-+
-+ return 0;
-+}
-+
-+static int audio_release(struct inode *inode, struct file *file)
-+{
-+ struct audio_state_t *state =
-+ (struct audio_state_t *)file->private_data;
-+ int i;
-+
-+ DPRINTK("EP93xx - audio_release -- enter. Write=%d Read=%d\n",
-+ ((file->f_mode & FMODE_WRITE) != 0),
-+ ((file->f_mode & FMODE_READ) != 0));
-+
-+ down(&state->sem);
-+
-+ if (file->f_mode & FMODE_READ) {
-+ audio_deallocate_buffers(state, state->input_stream);
-+
-+ for (i = 0; i < state->input_stream->NumDmaChannels; i++)
-+ DMA_FREE(state->input_stream->dmahandles[i]);
-+
-+ state->rd_ref = 0;
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ /*
-+ * Wait for all our buffers to play.
-+ */
-+ audio_sync(file);
-+
-+ /*
-+ * audio_deallocate_buffers will pause and flush the dma
-+ * then deallocate the buffers.
-+ */
-+ audio_deallocate_buffers(state, state->output_stream);
-+ for (i = 0; i < state->output_stream->NumDmaChannels; i++)
-+ DMA_FREE(state->output_stream->dmahandles[i]);
-+
-+ state->wr_ref = 0;
-+ }
-+
-+ up(&state->sem);
-+
-+ DPRINTK("EP93xx - audio_release -- EXIT\n");
-+
-+ return 0;
-+}
-+
-+/*
-+ * ep93xx_clear_stream_struct
-+ *
-+ * Initialize stuff or at least clear it to zero for a stream structure.
-+ */
-+static void ep93xx_clear_stream_struct(struct audio_stream_t *stream)
-+{
-+
-+ stream->dmahandles[0] = 0; /* handles for dma driver instances */
-+ stream->dmahandles[1] = 0; /* handles for dma driver instances */
-+ stream->dmahandles[2] = 0; /* handles for dma driver instances */
-+ stream->NumDmaChannels = 0; /* 1, 2, or 3 DMA channels */
-+ stream->TX_dma_ch_bitfield = 0; /* which dma channels used for strm */
-+ stream->RX_dma_ch_bitfield = 0; /* which dma channels used for strm */
-+ stream->buffers = 0; /* array of audio buffer structures */
-+ stream->dma_buffer = 0; /* current buffer used by read/write */
-+ stream->dma_buffer_index = 0; /* index for the pointer above... */
-+ stream->fragsize = AUDIO_FRAGSIZE_DEFAULT; /* fragment i.e. buffer size */
-+ stream->nbfrags = AUDIO_NBFRAGS_DEFAULT; /* nbr of fragments i.e. buffers */
-+ stream->requested_fragsize = 0; /* This is ignored if 0 */
-+ stream->requested_nbfrags = 0; /* This is ignored if 0 */
-+ stream->bytecount = 0; /* nbr of processed bytes */
-+ stream->getptrCount = 0; /* value of bytecount last time */
-+ /* anyone asked via GETxPTR */
-+ stream->fragcount = 0; /* nbr of fragment transitions */
-+ stream->mapped = 0; /* mmap()'ed buffers */
-+ stream->active = 0; /* actually in progress */
-+ stream->stopped = 0; /* might be active but stopped */
-+ stream->bFirstCaptureBuffer = 1; /* flag meaning there is junk in rx fifo */
-+ stream->buffered_bytes_to_play = 0;
-+
-+ calculate_dma2usr_ratio_etc(stream);
-+}
-+
-+/*
-+ * ep93xx_audio_attach
-+ *
-+ * Initialize the state structure for read or write. Allocate dma channels.
-+ * Currently each s is a stereo s (one dma channel).
-+ *
-+ */
-+int ep93xx_audio_attach
-+ (struct inode *inode, struct file *file, struct audio_state_t *state) {
-+ int err, i;
-+ struct audio_stream_t *os = state->output_stream;
-+ struct audio_stream_t *is = state->input_stream;
-+
-+ DPRINTK("ep93xx_audio_attach -- enter. Write=%d Read=%d\n",
-+ ((file->f_mode & FMODE_WRITE) != 0),
-+ ((file->f_mode & FMODE_READ) != 0));
-+
-+ down(&state->sem);
-+
-+ /* access control */
-+ if (((file->f_mode & FMODE_WRITE) && !os) ||
-+ ((file->f_mode & FMODE_READ) && !is)) {
-+ up(&state->sem);
-+ return -ENODEV;
-+ }
-+
-+ if (((file->f_mode & FMODE_WRITE) && state->wr_ref) ||
-+ ((file->f_mode & FMODE_READ) && state->rd_ref)) {
-+ up(&state->sem);
-+ return -EBUSY;
-+ }
-+
-+ /*
-+ * Request DMA channels
-+ */
-+ if (file->f_mode & FMODE_WRITE) {
-+ DPRINTK("ep93xx_audio_attach -- FMODE_WRITE\n");
-+
-+ state->wr_ref = 1;
-+
-+ ep93xx_clear_stream_struct(os);
-+
-+ err = DMA_REQUEST(&os->dmahandles[0],
-+ os->devicename, os->dmachannel[0]);
-+ if (err) {
-+ up(&state->sem);
-+ DPRINTK
-+ ("ep93xx_audio_attach -- EXIT ERROR dma request failed\n");
-+ return err;
-+ }
-+
-+ err = DMA_CONFIG(os->dmahandles[0],
-+ IGNORE_CHANNEL_ERROR,
-+ 0, audio_dma_tx_callback, (unsigned int)state);
-+ if (err) {
-+ DMA_FREE(os->dmahandles[0]);
-+ up(&state->sem);
-+ DPRINTK
-+ ("ep93xx_audio_attach -- EXIT ERROR dma config failed\n");
-+ return err;
-+ }
-+
-+ /*
-+ * Assuming each audio stream is mono or stereo.
-+ */
-+ os->NumDmaChannels = 1;
-+
-+ /*
-+ * Automatically set up the bit field of dma channels used for
-+ * this stream.
-+ */
-+ for (i = 0; (i < state->hw->MaxTxDmaChannels); i++) {
-+ if (os->dmachannel[i] == state->hw->txdmachannels[0])
-+ os->TX_dma_ch_bitfield |= 1;
-+
-+ if (os->dmachannel[i] == state->hw->txdmachannels[1])
-+ os->TX_dma_ch_bitfield |= 2;
-+
-+ if (os->dmachannel[i] == state->hw->txdmachannels[2])
-+ os->TX_dma_ch_bitfield |= 4;
-+ }
-+
-+ DPRINTK("DMA Tx channel bitfield = %x\n",
-+ os->TX_dma_ch_bitfield);
-+
-+ if (state->hw->hw_clear_fifo)
-+ state->hw->hw_clear_fifo(os);
-+
-+ init_waitqueue_head(&os->wq);
-+ }
-+
-+ if (file->f_mode & FMODE_READ) {
-+ state->rd_ref = 1;
-+
-+ ep93xx_clear_stream_struct(is);
-+
-+ err = DMA_REQUEST(&is->dmahandles[0],
-+ is->devicename, is->dmachannel[0]);
-+ if (err) {
-+ up(&state->sem);
-+ DPRINTK
-+ ("ep93xx_audio_attach -- EXIT ERROR dma request failed\n");
-+ return err;
-+ }
-+
-+ err = DMA_CONFIG(is->dmahandles[0],
-+ IGNORE_CHANNEL_ERROR,
-+ 0, audio_dma_rx_callback, (unsigned int)state);
-+ if (err) {
-+ DMA_FREE(is->dmahandles[0]);
-+ up(&state->sem);
-+ DPRINTK
-+ ("ep93xx_audio_attach -- EXIT ERROR dma config failed\n");
-+ return err;
-+ }
-+
-+ is->NumDmaChannels = 1;
-+
-+ /*
-+ * Automatically set up the bit field of dma channels used for
-+ * this stream.
-+ */
-+ for (i = 0; (i < state->hw->MaxRxDmaChannels); i++) {
-+ if (is->dmachannel[i] == state->hw->rxdmachannels[0])
-+ is->RX_dma_ch_bitfield |= 1;
-+
-+ if (is->dmachannel[i] == state->hw->rxdmachannels[1])
-+ is->RX_dma_ch_bitfield |= 2;
-+
-+ if (is->dmachannel[i] == state->hw->rxdmachannels[2])
-+ is->RX_dma_ch_bitfield |= 4;
-+ }
-+
-+ DPRINTK("DMA Rx channel bitfield = %x\n",
-+ is->RX_dma_ch_bitfield);
-+
-+ init_waitqueue_head(&is->wq);
-+ }
-+
-+ /*
-+ * Fill out the rest of the file_operations struct.
-+ */
-+ file->private_data = state;
-+ file->f_op->release = audio_release;
-+ file->f_op->write = audio_write;
-+ file->f_op->read = audio_read;
-+ file->f_op->mmap = audio_mmap;
-+ file->f_op->poll = audio_poll;
-+ file->f_op->ioctl = audio_ioctl;
-+ file->f_op->llseek = no_llseek;
-+
-+ up(&state->sem);
-+
-+ DPRINTK("ep93xx_audio_attach -- EXIT\n");
-+
-+ return 0;
-+}
-+
-+EXPORT_SYMBOL(ep93xx_audio_attach);
-+
-+MODULE_DESCRIPTION("Common audio handling for the Cirrus EP93xx processor");
-+MODULE_LICENSE("GPL");
-diff --git a/sound/oss/ep93xx-audio.h b/sound/oss/ep93xx-audio.h
-new file mode 100644
-index 0000000..04a0581
---- /dev/null
-+++ b/sound/oss/ep93xx-audio.h
-@@ -0,0 +1,149 @@
-+/*
-+ * ep93xx-audio.h
-+ *
-+ * Common audio handling for the Cirrus Logic EP93xx
-+ *
-+ * Copyright (c) 2003 Cirrus Logic Corp.
-+ * Copyright (c) 2000 Nicolas Pitre <nico@cam.org>
-+ *
-+ * Taken from sa1100-audio.h
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License.
-+ */
-+
-+/*
-+ * Getting this from the rme96xx driver. Has same numerical value
-+ * as AC3. Hmmmm.
-+ */
-+#ifndef AFMT_S32_BLOCKED
-+#define AFMT_S32_BLOCKED 0x0000400
-+#endif
-+
-+#define EP93XX_DEFAULT_NUM_CHANNELS 2
-+#define EP93XX_DEFAULT_FORMAT AFMT_S16_LE
-+#define EP93XX_DEFAULT_BIT_WIDTH 16
-+
-+/*
-+ * Buffer Management
-+ */
-+
-+struct audio_buf_t {
-+
-+ int size; /* buffer size */
-+ int sent; /* indicates that dma has the dma_buffer */
-+ char *start; /* points to actual buffer */
-+ dma_addr_t dma_addr; /* physical buffer address */
-+ int owner;
-+ struct semaphore sem; /* down before touching the buffer */
-+ int master; /* owner for buffer allocation, */
-+ /* contains size when true */
-+ int num; /* which out of nbfrags buffers is this? */
-+ struct audio_stream_t *stream; /* owning stream */
-+
-+};
-+
-+#define MAX_DEVICE_NAME 20
-+
-+struct audio_stream_t {
-+
-+ /* dma stuff */
-+ int dmahandles[3]; /* handles for dma driver instances */
-+ char devicename[MAX_DEVICE_NAME]; /* string - name of device */
-+ int NumDmaChannels; /* 1, 2, or 3 DMA channels */
-+ ep93xx_dma_dev_t dmachannel[3]; /* dma channel numbers */
-+
-+ struct audio_buf_t *buffers; /* array of audio buffer structures */
-+ struct audio_buf_t *dma_buffer; /* current buffer used by read/write */
-+ u_int dma_buffer_index; /* index for the pointer above... */
-+
-+ u_int fragsize; /* fragment i.e. buffer size */
-+ u_int nbfrags; /* nbr of fragments i.e. buffers */
-+ u_int requested_fragsize;
-+ u_int requested_nbfrags;
-+
-+ int bytecount; /* nbr of processed bytes */
-+ int getptrCount; /* value of bytecount last time */
-+ /* anyone asked via GETxPTR */
-+ int fragcount; /* nbr of fragment transitions */
-+ wait_queue_head_t wq; /* for poll */
-+ int mapped:1; /* mmap()'ed buffers */
-+ int active:1; /* actually in progress */
-+ int stopped:1; /* might be active but stopped */
-+ u_int TX_dma_ch_bitfield; /* bit0 = txdma1, bit1= txdma2, etc */
-+ u_int RX_dma_ch_bitfield; /* bit0 = rxdma1, bit1= rxdma2, etc */
-+ int bFirstCaptureBuffer; /* flag meaning there is junk in rx fifo */
-+
-+ /*
-+ * Data about the file format that we are configured to play.
-+ */
-+ long audio_num_channels; /* Range: 1 to 6 */
-+ long audio_format;
-+ long audio_stream_bitwidth; /* Range: 8, 16, 24, 32 */
-+
-+ long sample_rate; /* Fs in Hz. */
-+
-+ /*
-+ * Data about how the audio controller and codec are set up.
-+ */
-+ int hw_bit_width; /* width of dac or adc */
-+ int bCompactMode; /* set if 32bits == a stereo sample */
-+
-+ /*
-+ * dma2usr_ratio = dma sample size (8 or 4 bytes) / usr sample size (8,4,2,1)
-+ */
-+ int dma2usr_ratio;
-+
-+ /*
-+ * This provides a way of determining audio playback position that will not
-+ * overflow. This is (size of buffers written) - (buffers we've gotten back)
-+ */
-+ int buffered_bytes_to_play;
-+
-+};
-+
-+/*
-+ * No matter how many streams are going, we are using one hardware device.
-+ * This struct describes that hardware.
-+ */
-+struct audio_hw_t {
-+
-+ ep93xx_dma_dev_t txdmachannels[3]; /* all dma channels available for */
-+ ep93xx_dma_dev_t rxdmachannels[3]; /* this audio ctrlr */
-+
-+ int MaxTxDmaChannels; /* number of tx and rx channels */
-+ int MaxRxDmaChannels; /* number of tx and rx channels */
-+
-+ /*
-+ * Pointers to init, shutdown, and ioctl functions.
-+ */
-+ void (*hw_enable) (struct audio_stream_t * stream);
-+ void (*hw_disable) (struct audio_stream_t * stream);
-+ void (*hw_clear_fifo) (struct audio_stream_t * stream);
-+ int (*client_ioctl) (struct inode *, struct file *, uint, ulong);
-+ void (*set_hw_serial_format) (struct audio_stream_t *, long);
-+
-+ unsigned int modcnt; /* count the # of volume writes */
-+
-+};
-+
-+/*
-+ * State structure for one instance
-+ */
-+struct audio_state_t {
-+ struct audio_stream_t *output_stream;
-+ struct audio_stream_t *input_stream;
-+
-+ struct audio_hw_t *hw; /* hw info */
-+
-+ int rd_ref:1; /* open reference for recording */
-+ int wr_ref:1; /* open reference for playback */
-+
-+ struct semaphore sem; /* to protect against races in attach() */
-+
-+};
-+
-+/*
-+ * Functions exported by this module
-+ */
-+extern int ep93xx_audio_attach(struct inode *inode, struct file *file,
-+ struct audio_state_t *state);