diff -burN linux-2.6.8.1.orig/arch/arm/boot/Makefile linux-2.6.8.1/arch/arm/boot/Makefile
--- linux-2.6.8.1.orig/arch/arm/boot/Makefile	2004-08-14 05:54:50.000000000 -0500
+++ linux-2.6.8.1/arch/arm/boot/Makefile	2004-11-03 09:28:04.000000000 -0600
@@ -62,6 +62,9 @@
    zreladdr-$(CONFIG_ARCH_VERSATILE_PB)	:= 0x00008000
 params_phys-$(CONFIG_ARCH_VERSATILE_PB)	:= 0x00000100
 initrd_phys-$(CONFIG_ARCH_VERSATILE_PB)	:= 0x00800000
+   zreladdr-$(CONFIG_ARCH_EP93XX)	:= $(CONFIG_EP93XX_ZREL_ADDR)
+params_phys-$(CONFIG_ARCH_EP93XX)	:= $(CONFIG_EP93XX_PARAMS_PHYS)
+initrd_phys-$(CONFIG_ARCH_EP93XX)	:= $(CONFIG_EP93XX_INITRD_PHYS)
 
 ZRELADDR    := $(zreladdr-y)
 PARAMS_PHYS := $(params_phys-y)
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9301_defconfig linux-2.6.8.1/arch/arm/configs/edb9301_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9301_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9301_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,802 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+# 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 is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+CONFIG_ARCH_EDB9301=y
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+CONFIG_EP93XX_FLASH_SIZE_16=y
+# CONFIG_EP93XX_FLASH_SIZE_32 is not set
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+CONFIG_EP93XX_FLASH_WIDTH_16=y
+# CONFIG_EP93XX_FLASH_WIDTH_32 is not set
+# CONFIG_EP93XX_SDCS0 is not set
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+CONFIG_EP93XX_SDCS3=y
+CONFIG_EP93XX_SYNC_BOOT=y
+CONFIG_ARCH_EP9301=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x01000000
+CONFIG_EP93XX_PHYS_ADDR=0x00000000
+CONFIG_EP93XX_ZREL_ADDR=0x00008000
+CONFIG_EP93XX_PARAMS_PHYS=0x00000100
+CONFIG_EP93XX_INITRD_PHYS=0x01000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# 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_VFP 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_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=16384
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI 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 is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+# CONFIG_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_SYSFS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_PROC_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# 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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4271=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# Misc devices
+#
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9302A_defconfig linux-2.6.8.1/arch/arm/configs/edb9302A_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9302A_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9302A_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,968 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+CONFIG_ARCH_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+CONFIG_ARCH_EDB9302A=y
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+CONFIG_EP93XX_FLASH_SIZE_16=y
+# CONFIG_EP93XX_FLASH_SIZE_32 is not set
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+CONFIG_EP93XX_FLASH_WIDTH_16=y
+# CONFIG_EP93XX_FLASH_WIDTH_32 is not set
+CONFIG_EP93XX_SDCS0=y
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+# CONFIG_EP93XX_SDCS3 is not set
+# CONFIG_EP93XX_SYNC_BOOT is not set
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9302A=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_PHYS_ADDR=0xc0000000
+CONFIG_EP93XX_ZREL_ADDR=0xc0008000
+CONFIG_EP93XX_PARAMS_PHYS=0xc0000100
+CONFIG_EP93XX_INITRD_PHYS=0xc1000000
+
+#
+# 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_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 is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP 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=y
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD 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 is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+# CONFIG_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# 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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4271=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO 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
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_EP931X=y
+CONFIG_USB_EP931X=y
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_SA1100 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+CONFIG_USB_GADGET_DUALSPEED=y
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_ETH is not set
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_FILE_STORAGE_TEST=y
+# CONFIG_USB_G_SERIAL is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9302_defconfig linux-2.6.8.1/arch/arm/configs/edb9302_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9302_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9302_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,956 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+# 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 is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+CONFIG_ARCH_EDB9302=y
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+CONFIG_EP93XX_FLASH_SIZE_16=y
+# CONFIG_EP93XX_FLASH_SIZE_32 is not set
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+CONFIG_EP93XX_FLASH_WIDTH_16=y
+# CONFIG_EP93XX_FLASH_WIDTH_32 is not set
+# CONFIG_EP93XX_SDCS0 is not set
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+CONFIG_EP93XX_SDCS3=y
+CONFIG_EP93XX_SYNC_BOOT=y
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9302=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x01000000
+CONFIG_EP93XX_PHYS_ADDR=0x00000000
+CONFIG_EP93XX_ZREL_ADDR=0x00008000
+CONFIG_EP93XX_PARAMS_PHYS=0x00000100
+CONFIG_EP93XX_INITRD_PHYS=0x01000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# 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_VFP 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_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=16384
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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 is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD 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 is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+# CONFIG_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_PROC_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# 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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4271=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# Misc devices
+#
+
+#
+# USB support
+#
+CONFIG_USB=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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 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
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9307A_defconfig linux-2.6.8.1/arch/arm/configs/edb9307A_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9307A_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9307A_defconfig	2006-07-24 08:02:15.000000000 -0500
@@ -0,0 +1,997 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+CONFIG_ARCH_EDB9307A=y
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+CONFIG_EP93XX_FLASH_SIZE_16=y
+# CONFIG_EP93XX_FLASH_SIZE_32 is not set
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+CONFIG_EP93XX_FLASH_WIDTH_16=y
+# CONFIG_EP93XX_FLASH_WIDTH_32 is not set
+CONFIG_EP93XX_SDCS0=y
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+# CONFIG_EP93XX_SDCS3 is not set
+# CONFIG_EP93XX_SYNC_BOOT is not set
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9307A=y
+CONFIG_EP93XX_FRAMEBUFFER=y
+CONFIG_EP93XX_GRAPHICS=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x01000000
+CONFIG_EP93XX_PHYS_ADDR=0xc0000000
+CONFIG_EP93XX_ZREL_ADDR=0xc0008000
+CONFIG_EP93XX_PARAMS_PHYS=0xc0000100
+CONFIG_EP93XX_INITRD_PHYS=0xc1000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# 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_VFP 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_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD 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_EP93XX_SERIAL_FLASH=y
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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=y
+CONFIG_FB_EP93XX=y
+CONFIG_FB_EP93XX_CRT=y
+# CONFIG_FB_EP93XX_LCD is not set
+# CONFIG_FB_EP93XX_NTSC is not set
+# CONFIG_FB_EP93XX_PAL is not set
+# CONFIG_FB_EP93XX_8BPP is not set
+CONFIG_FB_EP93XX_16BPP=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_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=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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4271=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# Misc devices
+#
+
+#
+# USB support
+#
+CONFIG_USB=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_EP931X=y
+CONFIG_USB_EP931X=y
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_SA1100 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+CONFIG_USB_GADGET_DUALSPEED=y
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_ETH is not set
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_FILE_STORAGE_TEST=y
+# CONFIG_USB_G_SERIAL is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9307_defconfig linux-2.6.8.1/arch/arm/configs/edb9307_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9307_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9307_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,983 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+CONFIG_ARCH_EDB9307=y
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+# CONFIG_EP93XX_FLASH_SIZE_16 is not set
+CONFIG_EP93XX_FLASH_SIZE_32=y
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+# CONFIG_EP93XX_FLASH_WIDTH_16 is not set
+CONFIG_EP93XX_FLASH_WIDTH_32=y
+# CONFIG_EP93XX_SDCS0 is not set
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+CONFIG_EP93XX_SDCS3=y
+CONFIG_EP93XX_SYNC_BOOT=y
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9307=y
+CONFIG_EP93XX_FRAMEBUFFER=y
+CONFIG_EP93XX_GRAPHICS=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x02000000
+CONFIG_EP93XX_PHYS_ADDR=0x00000000
+CONFIG_EP93XX_ZREL_ADDR=0x00008000
+CONFIG_EP93XX_PARAMS_PHYS=0x00000100
+CONFIG_EP93XX_INITRD_PHYS=0x01000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# 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_VFP 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_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# 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_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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=y
+CONFIG_FB_EP93XX=y
+CONFIG_FB_EP93XX_CRT=y
+# CONFIG_FB_EP93XX_LCD is not set
+# CONFIG_FB_EP93XX_NTSC is not set
+# CONFIG_FB_EP93XX_PAL is not set
+# CONFIG_FB_EP93XX_8BPP is not set
+CONFIG_FB_EP93XX_16BPP=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_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=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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4228A=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# Misc devices
+#
+
+#
+# USB support
+#
+CONFIG_USB=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9312_defconfig linux-2.6.8.1/arch/arm/configs/edb9312_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9312_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9312_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,1013 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+CONFIG_ARCH_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+CONFIG_ARCH_EDB9312=y
+# CONFIG_ARCH_EDB9315 is not set
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+# CONFIG_EP93XX_FLASH_SIZE_16 is not set
+CONFIG_EP93XX_FLASH_SIZE_32=y
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+# CONFIG_EP93XX_FLASH_WIDTH_16 is not set
+CONFIG_EP93XX_FLASH_WIDTH_32=y
+# CONFIG_EP93XX_SDCS0 is not set
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+CONFIG_EP93XX_SDCS3=y
+CONFIG_EP93XX_SYNC_BOOT=y
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9312=y
+CONFIG_EP93XX_FRAMEBUFFER=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x02000000
+CONFIG_EP93XX_PHYS_ADDR=0x00000000
+CONFIG_EP93XX_ZREL_ADDR=0x00008000
+CONFIG_EP93XX_PARAMS_PHYS=0x00000100
+CONFIG_EP93XX_INITRD_PHYS=0x01000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# 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_VFP 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_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=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 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 is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+CONFIG_BLK_DEV_IDE_EP93XX=y
+CONFIG_BLK_DEV_IDE_DMA_EP93XX=y
+CONFIG_IDE_ARM=y
+CONFIG_BLK_DEV_IDEDMA=y
+# 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=640
+CONFIG_INPUT_TSDEV_SCREEN_Y=480
+# 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_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# 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_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_PROC_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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=y
+CONFIG_FB_EP93XX=y
+# CONFIG_FB_EP93XX_CRT is not set
+CONFIG_FB_EP93XX_LCD=y
+# CONFIG_FB_EP93XX_NTSC is not set
+# CONFIG_FB_EP93XX_PAL is not set
+# CONFIG_FB_EP93XX_8BPP is not set
+CONFIG_FB_EP93XX_16BPP=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# 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=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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4228A=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO 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
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9315A_defconfig linux-2.6.8.1/arch/arm/configs/edb9315A_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9315A_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9315A_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,1032 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+CONFIG_ARCH_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+# CONFIG_ARCH_EDB9315 is not set
+CONFIG_ARCH_EDB9315A=y
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+CONFIG_EP93XX_FLASH_SIZE_16=y
+# CONFIG_EP93XX_FLASH_SIZE_32 is not set
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+CONFIG_EP93XX_FLASH_WIDTH_16=y
+# CONFIG_EP93XX_FLASH_WIDTH_32 is not set
+CONFIG_EP93XX_SDCS0=y
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+# CONFIG_EP93XX_SDCS3 is not set
+# CONFIG_EP93XX_SYNC_BOOT is not set
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9315A=y
+CONFIG_EP93XX_FRAMEBUFFER=y
+CONFIG_EP93XX_GRAPHICS=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x01000000
+CONFIG_EP93XX_PHYS_ADDR=0xc0000000
+CONFIG_EP93XX_ZREL_ADDR=0xc0008000
+CONFIG_EP93XX_PARAMS_PHYS=0xc0000100
+CONFIG_EP93XX_INITRD_PHYS=0xc1000000
+
+#
+# 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_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 is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP 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=y
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=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 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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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_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 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
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+CONFIG_BLK_DEV_IDE_EP93XX=y
+CONFIG_BLK_DEV_IDE_DMA_EP93XX=y
+CONFIG_IDE_ARM=y
+CONFIG_BLK_DEV_IDEDMA=y
+# 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# 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 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_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# 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_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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=y
+CONFIG_FB_EP93XX=y
+CONFIG_FB_EP93XX_CRT=y
+# CONFIG_FB_EP93XX_LCD is not set
+# CONFIG_FB_EP93XX_NTSC is not set
+# CONFIG_FB_EP93XX_PAL is not set
+# CONFIG_FB_EP93XX_8BPP is not set
+CONFIG_FB_EP93XX_16BPP=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_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=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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4271=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO 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
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_EP931X=y
+CONFIG_USB_EP931X=y
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_SA1100 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+CONFIG_USB_GADGET_DUALSPEED=y
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_ETH is not set
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_FILE_STORAGE_TEST=y
+# CONFIG_USB_G_SERIAL is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/configs/edb9315_defconfig linux-2.6.8.1/arch/arm/configs/edb9315_defconfig
--- linux-2.6.8.1.orig/arch/arm/configs/edb9315_defconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/configs/edb9315_defconfig	2006-07-14 14:59:40.000000000 -0500
@@ -0,0 +1,1075 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=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_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=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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
+
+#
+# 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_EP93XX=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_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
+
+#
+# Cirrus Logic EP93xx options
+#
+# CONFIG_ARCH_EDB9301 is not set
+# CONFIG_ARCH_EDB9302 is not set
+# CONFIG_ARCH_EDB9302A is not set
+# CONFIG_ARCH_EDB9307 is not set
+# CONFIG_ARCH_EDB9307A is not set
+# CONFIG_ARCH_EDB9312 is not set
+CONFIG_ARCH_EDB9315=y
+# CONFIG_ARCH_EDB9315A is not set
+# CONFIG_EP93XX_CS0 is not set
+# CONFIG_EP93XX_CS1 is not set
+# CONFIG_EP93XX_CS2 is not set
+# CONFIG_EP93XX_CS3 is not set
+CONFIG_EP93XX_CS6=y
+# CONFIG_EP93XX_CS7 is not set
+
+#
+# FLASH chip options
+#
+# CONFIG_EP93XX_FLASH_SIZE_2 is not set
+# CONFIG_EP93XX_FLASH_SIZE_4 is not set
+# CONFIG_EP93XX_FLASH_SIZE_8 is not set
+# CONFIG_EP93XX_FLASH_SIZE_16 is not set
+CONFIG_EP93XX_FLASH_SIZE_32=y
+# CONFIG_EP93XX_FLASH_SIZE_64 is not set
+# CONFIG_EP93XX_FLASH_WIDTH_16 is not set
+CONFIG_EP93XX_FLASH_WIDTH_32=y
+# CONFIG_EP93XX_SDCS0 is not set
+# CONFIG_EP93XX_SDCS1 is not set
+# CONFIG_EP93XX_SDCS2 is not set
+CONFIG_EP93XX_SDCS3=y
+CONFIG_EP93XX_SYNC_BOOT=y
+CONFIG_EP93XX_FPU=y
+# CONFIG_EP93XX_FPU_ACC is not set
+CONFIG_ARCH_EP9315=y
+CONFIG_EP93XX_FRAMEBUFFER=y
+CONFIG_EP93XX_GRAPHICS=y
+CONFIG_EP93XX_FLASH_BASE=0x60000000
+CONFIG_EP93XX_FLASH_SIZE=0x02000000
+CONFIG_EP93XX_PHYS_ADDR=0x00000000
+CONFIG_EP93XX_ZREL_ADDR=0x00008000
+CONFIG_EP93XX_PARAMS_PHYS=0x00000100
+CONFIG_EP93XX_INITRD_PHYS=0x01000000
+
+#
+# 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_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_TCIC is not set
+CONFIG_PCMCIA_EP93XX=y
+CONFIG_PCMCIA_PROBE=y
+
+#
+# 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_VFP 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=y
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/ram"
+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=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 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 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
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+CONFIG_MTD_EDB93XX=y
+# CONFIG_MTD_PCMCIA 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=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=32768
+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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_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_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 is not set
+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 is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=y
+# CONFIG_AIRO_CS is not set
+# CONFIG_PCMCIA_WL3501 is not set
+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
+
+#
+# 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=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_IDE_EP93XX=y
+CONFIG_BLK_DEV_IDE_DMA_EP93XX=y
+CONFIG_IDE_ARM=y
+CONFIG_BLK_DEV_IDEDMA=y
+# 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=m
+# 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_AIC7XXX_OLD is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_EATA_PIO 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
+
+#
+# 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=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# 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 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_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 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_SPI is not set
+# CONFIG_KEYBOARD_EP93XX_KEYPAD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# 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_EP93XX_SERIAL_FLASH is not set
+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_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_QIC02_TAPE 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_EP93XX=y
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ISA is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_SCx200_ACB 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_W83781D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+
+#
+# Other I2C Chip support
+#
+# 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 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 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=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS 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 is not set
+# CONFIG_TMPFS 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=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS_PROC_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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=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_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 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=y
+CONFIG_FB_EP93XX=y
+# CONFIG_FB_EP93XX_CRT is not set
+CONFIG_FB_EP93XX_LCD=y
+# CONFIG_FB_EP93XX_NTSC is not set
+# CONFIG_FB_EP93XX_PAL is not set
+# CONFIG_FB_EP93XX_8BPP is not set
+CONFIG_FB_EP93XX_16BPP=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# 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=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 is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_EP93XX_IIS=y
+CONFIG_CODEC_CS4228A=y
+# CONFIG_SND_EP93XX_AC97 is not set
+
+#
+# ALSA USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# PCMCIA devices
+#
+
+#
+# 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
+
+#
+# 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=m
+CONFIG_USB_STORAGE_DEBUG=y
+CONFIG_USB_STORAGE_RW_DETECT=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_DPCM=y
+CONFIG_USB_STORAGE_HP8200e=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+
+#
+# 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
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_KERNEL 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 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -burN linux-2.6.8.1.orig/arch/arm/Kconfig linux-2.6.8.1/arch/arm/Kconfig
--- linux-2.6.8.1.orig/arch/arm/Kconfig	2004-08-14 05:55:33.000000000 -0500
+++ linux-2.6.8.1/arch/arm/Kconfig	2005-07-25 05:55:34.000000000 -0500
@@ -75,6 +75,11 @@
 config ARCH_CLPS7500
 	bool "Cirrus-CL-PS7500FE"
 
+config ARCH_EP93XX
+	bool "Cirrus Logic EP93xx"
+	help
+	  Cirrus Logic EP93xx based systems.
+
 config ARCH_CLPS711X
 	bool "CLPS711x/EP721x-based"
 
@@ -182,6 +187,8 @@
 
 source "arch/arm/mach-lh7a40x/Kconfig"
 
+source "arch/arm/mach-ep93xx/Kconfig"
+
 # Definitions to make life easier
 config ARCH_ACORN
 	bool
@@ -622,7 +629,7 @@
 
 source "net/Kconfig"
 
-if ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
+if ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE || ARCH_EP9312 || ARCH_EP9315 || ARCH_EP9315A
 source "drivers/ide/Kconfig"
 endif
 
diff -burN linux-2.6.8.1.orig/arch/arm/kernel/calls.S linux-2.6.8.1/arch/arm/kernel/calls.S
--- linux-2.6.8.1.orig/arch/arm/kernel/calls.S	2004-08-14 05:56:24.000000000 -0500
+++ linux-2.6.8.1/arch/arm/kernel/calls.S	2006-03-31 02:39:12.000000000 -0600
@@ -288,6 +288,12 @@
 		.long	sys_pciconfig_iobase
 		.long	sys_pciconfig_read
 		.long	sys_pciconfig_write
+/* 274 */	.long	sys_mq_open
+		.long	sys_mq_unlink
+		.long	sys_mq_timedsend
+		.long	sys_mq_timedreceive
+		.long	sys_mq_notify      
+		.long	sys_mq_getsetattr
 __syscall_end:
 
 		.rept	NR_syscalls - (__syscall_end - __syscall_start) / 4
diff -burN linux-2.6.8.1.orig/arch/arm/kernel/entry-armv.S linux-2.6.8.1/arch/arm/kernel/entry-armv.S
--- linux-2.6.8.1.orig/arch/arm/kernel/entry-armv.S	2004-08-14 05:55:10.000000000 -0500
+++ linux-2.6.8.1/arch/arm/kernel/entry-armv.S	2004-11-03 09:28:04.000000000 -0600
@@ -884,6 +884,39 @@
                .macro  irq_prio_table
                .endm
 
+#elif defined(CONFIG_ARCH_EP93XX)
+
+		.macro  disable_fiq
+		.endm
+
+		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+		ldr	\irqstat, =VIC0IRQSTATUS
+		ldr	\irqstat, [\irqstat, #0]
+
+		mov	\irqnr, #0
+
+1001:		tst	\irqstat, #1
+		bne	1003f
+		add	\irqnr, \irqnr, #1
+		mov	\irqstat, \irqstat, lsr #1
+		cmp	\irqnr, #32
+		bcc	1001b
+
+		ldr	\irqstat, =VIC1IRQSTATUS
+		ldr	\irqstat, [\irqstat, #0]
+
+1002:		tst	\irqstat, #1
+		bne	1003f
+		add	\irqnr, \irqnr, #1
+		mov	\irqstat, \irqstat, lsr #1
+		cmp	\irqnr, #64
+		bcc	1002b
+1003:
+		.endm
+
+		.macro  irq_prio_table
+		.endm
+
 #else
 #error Unknown architecture
 #endif
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/arch.c linux-2.6.8.1/arch/arm/mach-ep93xx/arch.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/arch.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/arch.c	2007-01-25 00:19:58.000000000 -0600
@@ -0,0 +1,538 @@
+/*
+ *  linux/arch/arm/mach-ep93xx/arch.c
+ *
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ * (c) Copyright 2002-2003 Cirrus Logic, Inc., Austin, Tx 
+ *
+ * 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/device.h>
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/utsname.h>
+#include <linux/mtd/physmap.h>
+#include <asm/irq.h>
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/memory.h>
+#include <asm/arch/platform.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
+#include <asm/arch/ssp.h>
+#include <asm/arch/crunch.h>
+
+extern void crunch_init(void);
+int crunch_is_enabled=0;
+
+extern void ep93xx_map_io(void);
+extern void ep93xx_init_irq(void);
+extern void ep93xx_init_time(void);
+
+/*
+* We have added a CONFIG to determine what the size of the
+* Flash Chip we are using. From 2MB to 64MB for now.
+* No more HARDCODED VALUES
+*/
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_2
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x200000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_4
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x400000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_8
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x800000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_16
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x01000000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_32
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x02000000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_64
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x04000000
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_SIZE_128
+#undef CONFIG_EP93XX_FLASH_SIZE
+#define CONFIG_EP93XX_FLASH_SIZE 0x08000000
+#endif
+
+/*
+* We added a CONFIG to determine what the Width is for the Flash Chip.
+* is it a 16bit or 32bit width.
+* No more HARDCODED VALUES
+*/
+
+#ifdef CONFIG_EP93XX_FLASH_WIDTH_16
+#undef CONFIG_EP93XX_FLASH_WIDTH
+#define CONFIG_EP93XX_FLASH_WIDTH 2
+#endif
+
+#ifdef CONFIG_EP93XX_FLASH_WIDTH_32
+#undef CONFIG_EP93XX_FLASH_WIDTH
+#define CONFIG_EP93XX_FLASH_WIDTH 4
+#endif
+
+static struct flash_platform_data ep93xx_flash_data = {
+	.map_name	= "cfi_probe",
+	.width		= CONFIG_EP93XX_FLASH_WIDTH,
+};
+
+static struct resource ep93xx_flash_resource = {
+	.start		= CONFIG_EP93XX_FLASH_BASE,
+	.end		= CONFIG_EP93XX_FLASH_BASE + CONFIG_EP93XX_FLASH_SIZE - 1,
+	.flags		= IORESOURCE_MEM,
+};
+
+static struct platform_device ep93xx_flash_device = {
+	.name		= "edb93xxflash",
+	.id		= 0,
+	.dev		= {
+		.platform_data	= &ep93xx_flash_data,
+	},
+	.num_resources	= 1,
+	.resource	= &ep93xx_flash_resource,
+};
+
+static struct resource ep93xx_ethernet_resources[] = {
+	[0] = {
+		.start		= HwRegToPhys(MAC_BASE),
+		.end		= HwRegToPhys(MAC_BASE) + 0xffff,
+		.flags		= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start		= IRQ_MAC,
+		.end		= IRQ_MAC,
+		.flags		= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device ep93xx_ethernet_device = {
+	.name		= "ep93xxethernet",
+	.id		= 0,
+	.num_resources	= 2,
+	.resource	= ep93xx_ethernet_resources,
+};
+
+static struct resource ep93xx_raster_resources[] = {
+	[0] = {
+		.start		= HwRegToPhys(RASTER_BASE),
+#ifdef CONFIG_EP93XX_GRAPHICS
+		.end		= HwRegToPhys(RASTER_BASE) + 0x1ffff,
+#else
+		.end		= HwRegToPhys(RASTER_BASE) + 0xffff,
+#endif
+		.flags		= IORESOURCE_MEM,
+	},
+#ifdef CONFIG_EP93XX_GRAPHICS
+	[1] = {
+		.start		= IRQ_GRAPHICS,
+		.end		= IRQ_GRAPHICS,
+		.flags		= IORESOURCE_IRQ,
+	},
+#endif
+};
+
+static struct platform_device ep93xx_raster_device = {
+	.name		= "ep93xxfb",
+	.id		= 0,
+#ifdef CONFIG_EP93XX_GRAPHICS
+	.num_resources	= 2,
+#else
+	.num_resources	= 1,
+#endif
+	.resource	= ep93xx_raster_resources,
+};
+
+static struct resource ep93xx_usb_resources[] = {
+	[0] = {
+		.start		= HwRegToPhys(USB_BASE),
+		.end		= HwRegToPhys(USB_BASE) + 0x8C,
+		.flags		= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start		= IRQ_USH,
+		.end		= IRQ_USH,
+		.flags		= IORESOURCE_IRQ,
+	},
+};
+
+static u64 ep93xx_usbhost_dma_mask = 0xffffffffUL;
+
+static struct platform_device ep93xx_usb_device = {
+	.name		= "ep93xxusb",
+	.id		= 0,
+	.num_resources	= 2,
+	.resource	= ep93xx_usb_resources,
+	.dev = {
+		.dma_mask               = &ep93xx_usbhost_dma_mask,
+		.coherent_dma_mask      = 0xffffffffUL,
+	},
+};
+
+static struct resource ep93xx_i2s_resources[] = {
+	[0] = {
+		.start		= HwRegToPhys(I2S_BASE),
+		.end		= HwRegToPhys(I2S_BASE), + 0x6C,
+		.flags		= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start		= NO_IRQ,
+		.end		= NO_IRQ,
+		.flags		= IORESOURCE_IRQ,
+	},
+};
+
+static u64 ep93xx_i2s_dma_mask = 0xffffffffUL;
+
+static struct platform_device ep93xx_i2s_device = {
+	.name		= "ep93xxi2s",
+	.id		= 0,
+	.num_resources	= 2,
+	.resource	= ep93xx_i2s_resources,
+	.dev = {
+		.dma_mask               = &ep93xx_i2s_dma_mask,
+		.coherent_dma_mask      = 0xffffffffUL,
+	},
+};
+
+static struct resource ep93xx_ac97_resources[] = {
+	[0] = {
+		.start		= HwRegToPhys(AC97_BASE),
+		.end		= HwRegToPhys(AC97_BASE), + 0x6C,
+		.flags		= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start		= NO_IRQ,
+		.end		= NO_IRQ,
+		.flags		= IORESOURCE_IRQ,
+	},
+};
+
+static u64 ep93xx_ac97_dma_mask = 0xffffffffUL;
+
+static struct platform_device ep93xx_ac97_device = {
+	.name		= "ep93xx-ac97",
+	.id		= 0,
+	.num_resources	= 2,
+	.resource	= ep93xx_ac97_resources,
+	.dev = {
+		.dma_mask               = &ep93xx_ac97_dma_mask,
+		.coherent_dma_mask      = 0xffffffffUL,
+	},
+};
+
+static struct resource ep93xx_gadget_resources[] = {
+	[0] = {
+		.start		= 0x70000000,
+		.end		= 0x70000000 + 0xff,
+		.flags		= IORESOURCE_MEM,
+	},
+#if (defined(CONFIG_ARCH_EP9315A) || defined(CONFIG_ARCH_EP9307A) || defined(CONFIG_ARCH_EP9302A))
+	[1] = {
+		.start		= IRQ_EXT0,
+		.end		= IRQ_EXT0,
+		.flags		= IORESOURCE_IRQ,
+	},
+#else
+        [1] = {
+                .start          = IRQ_EXT1,
+                .end            = IRQ_EXT1,
+                .flags          = IORESOURCE_IRQ,
+        },
+
+#endif
+
+};
+
+
+static u64 ep93xx_gadget_dma_mask = 0xffffffffUL;
+
+static struct platform_device ep93xx_gadget_device = {
+	.name		= "ep93xx-udc",
+	.id		= 0,
+	.num_resources	= 2,
+	.resource	= ep93xx_gadget_resources,
+	.dev = {
+		.dma_mask               = &ep93xx_gadget_dma_mask,
+		.coherent_dma_mask      = 0xffffffffUL,
+	},
+};
+
+
+static struct resource ep93xx_pcmcia_resources[] = {
+        [0] = {
+                .start          = PCMCIA_BASE_PHYS,
+                .end            = PCMCIA_BASE_PHYS, + PCMCIA_SIZE,
+                .flags          = IORESOURCE_MEM,
+        },
+        [1] = {
+                .start          = IRQ_GPIO0,
+                .end            = IRQ_GPIO7,
+                .flags          = IORESOURCE_IRQ,
+        },
+};
+                                                                                                                             
+static u64 ep93xx_pcmcia_dma_mask = 0xffffffffUL;
+                                                                                                                             
+static struct platform_device ep93xx_pcmcia_device = {
+        .name           = "ep93xx-pcmcia",
+        .id             = 0,
+        .num_resources  = 2,
+        .resource       = ep93xx_pcmcia_resources,
+        .dev = {
+                .dma_mask               = &ep93xx_pcmcia_dma_mask,
+                .coherent_dma_mask      = 0xffffffffUL,
+        },
+};
+
+
+
+static struct platform_device *edb93xx_devices[] __initdata = {
+	&ep93xx_flash_device,
+	&ep93xx_ethernet_device,
+	&ep93xx_raster_device,
+	&ep93xx_usb_device,
+	&ep93xx_i2s_device,
+	&ep93xx_ac97_device,
+	&ep93xx_gadget_device,
+	&ep93xx_pcmcia_device,
+};
+
+
+/*
+ * Setup proper timing for flash memory
+ */
+static void setup_sram_bus_timing(void)
+{
+    int val;
+    
+#ifdef CONFIG_EP93XX_CS0
+#define SMC_CONTROL SMCBCR0
+#endif
+#ifdef CONFIG_EP93XX_CS1
+#define SMC_CONTROL SMCBCR1
+#endif
+#ifdef CONFIG_EP93XX_CS2
+#define SMC_CONTROL SMCBCR2
+#endif
+#ifdef CONFIG_EP93XX_CS3
+#define SMC_CONTROL SMCBCR3
+#endif
+#ifdef CONFIG_EP93XX_CS6
+#define SMC_CONTROL SMCBCR6
+#endif
+#ifdef CONFIG_EP93XX_CS7
+#define SMC_CONTROL SMCBCR7
+#endif
+
+#define WST1_MASK	(0x01f << 5)
+#define WST2_MASK	(0x01f << 11)
+#define IDCY_MASK	(0x0f << 0)
+
+#define WST1_VAL	(21<<5)
+#define WST2_VAL	(5<<11)
+#define IDCY_VAL	(5)
+
+	val=inl(SMC_CONTROL);	
+	val &= ~(WST1_MASK | WST2_MASK | IDCY_MASK);
+	val |= ( WST1_VAL | WST2_VAL | IDCY_VAL );
+	outl(val,SMC_CONTROL);
+}
+
+
+static void __init
+ep93xx_init(void)
+{
+	unsigned int uiTemp;
+	int SSP_Handle;
+
+	/*
+	 * Setup proper timing for flash memory
+	 */
+	setup_sram_bus_timing();
+
+	/*
+	 * Add the platform devices.
+	 */
+	platform_add_devices(edb93xx_devices, ARRAY_SIZE(edb93xx_devices));
+
+	/*
+	 * Enable halt mode.
+	 */
+	uiTemp = inl(SYSCON_DEVCFG) | SYSCON_DEVCFG_SHena;
+	SysconSetLocked(SYSCON_DEVCFG, uiTemp);
+
+	/*
+	 * Set the bus priority.
+	 */
+	outl(BMAR_PRIORD_02, SYSCON_BMAR);
+
+	/*
+	 * Get the hostname from the SPI FLASH if it has been programmed.
+	 */
+	SSP_Handle = SSPDriver->Open(SERIAL_FLASH, 0);
+	if(SSP_Handle != -1) {
+		SSPDriver->Read( SSP_Handle, 0x1000, &uiTemp );
+		if (uiTemp == 0x43414d45) {
+			SSPDriver->Read( SSP_Handle, 0x1010, &uiTemp );
+			system_utsname.nodename[0] = uiTemp & 255;
+			system_utsname.nodename[1] = (uiTemp >> 8) & 255;
+			system_utsname.nodename[2] = (uiTemp >> 16) & 255;
+			system_utsname.nodename[3] = uiTemp >> 24;
+			SSPDriver->Read( SSP_Handle, 0x1014, &uiTemp );
+			system_utsname.nodename[4] = uiTemp & 255;
+			system_utsname.nodename[5] = (uiTemp >> 8) & 255;
+			system_utsname.nodename[6] = (uiTemp >> 16) & 255;
+			system_utsname.nodename[7] = uiTemp >> 24;
+			SSPDriver->Read( SSP_Handle, 0x1018, &uiTemp );
+			system_utsname.nodename[8] = uiTemp & 255;
+			system_utsname.nodename[9] = (uiTemp >> 8) & 255;
+			system_utsname.nodename[10] = (uiTemp >> 16) & 255;
+			system_utsname.nodename[11] = uiTemp >> 24;
+			SSPDriver->Read( SSP_Handle, 0x101c, &uiTemp );
+			system_utsname.nodename[12] = uiTemp & 255;
+			system_utsname.nodename[13] = (uiTemp >> 8) & 255;
+			system_utsname.nodename[14] = (uiTemp >> 16) & 255;
+			system_utsname.nodename[15] = uiTemp >> 24;
+			system_utsname.nodename[16] = 0;
+		}
+		SSPDriver->Close( SSP_Handle );
+	}
+
+#ifdef CONFIG_EP93XX_FPU
+    crunch_enable();
+    crunch_init();
+    crunch_is_enabled=1;
+#endif
+
+}
+
+/* Machine Descriptor created by macros in asm-arm/mach/arch.h
+    bootmem: phys ram base, phys io base, virt io base
+    bootpara: phys param base  */
+
+#ifdef CONFIG_ARCH_EDB9301
+MACHINE_START(EDB9301, "edb9301")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9302
+MACHINE_START(EDB9302, "edb9302")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9302A
+MACHINE_START(EDB9302A, "edb9302A")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9307
+MACHINE_START(EDB9307, "edb9307")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9307A
+MACHINE_START(EDB9307A, "edb9307A")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9312
+MACHINE_START(EDB9312, "edb9312")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9315
+MACHINE_START(EDB9315, "edb9315")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
+
+#ifdef CONFIG_ARCH_EDB9315A
+MACHINE_START(EDB9315A, "edb9315A")
+    MAINTAINER("Cirrus Logic")
+    BOOT_MEM( CONFIG_EP93XX_PHYS_ADDR, 0x80000000, 0xff000000 )
+    BOOT_PARAMS( CONFIG_EP93XX_PARAMS_PHYS )
+    MAPIO(ep93xx_map_io)
+    INITIRQ(ep93xx_init_irq)
+    INITTIME(ep93xx_init_time)
+    INIT_MACHINE(ep93xx_init)
+MACHINE_END
+#endif
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/crunch.c linux-2.6.8.1/arch/arm/mach-ep93xx/crunch.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/crunch.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/crunch.c	2005-08-16 13:51:47.000000000 -0500
@@ -0,0 +1,342 @@
+/*
+ *	Cirrus MaverickCrunch support
+ *
+ *	Copyright (c) 2003 Petko Manolov <petkan@nucleusys.com>
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	version 2 as published by the Free Software Foundation;
+ */
+
+#include <linux/sched.h>
+#include <linux/init.h>
+#include <asm/io.h>
+#include <asm/arch/crunch.h>
+
+
+unsigned int read_dspsc_low(void)
+{
+	int res;
+
+	asm volatile (
+	"cdp        p4, 1, c15, c0, c0, 7\n\t"	// "cfmv32sc      mvdx15, dspsc\n\t"
+	"mrc        p5, 0, %0, c15, c0, 0"	// "cfmvr64l  %0, mvdx15"
+	:"=r" (res)
+	:
+	:"memory");
+
+	return res;
+}
+
+unsigned int read_dspsc_high(void)
+{
+	int res;
+
+	asm volatile (
+	"cdp        p4, 1, c15, c0, c0, 7\n\t"	// "cfmv32sc   mvdx15, dspsc\n\t"
+	"mrc        p5, 0, %0, c15, c0, 1"	// "cfmvr64h   %0, mvdx15"
+	:"=r" (res)
+	:
+	:"memory");
+
+	return res;
+}
+
+void write_dspsc(unsigned int dspsc)
+{
+	asm volatile (
+	"mcr        p5, 0, %0, c15, c0, 0\n\t"	// "cfmv64lr     mvdx15, %0\n\t"
+	"cdp        p4, 2, c15, c0, c0, 7"	// "cfmvsc32     dspsc, mvdx15"
+	:
+	:"r" (dspsc), "rN"(-1)
+	:"memory");
+}
+
+void crunch_init(void)
+{
+	write_dspsc(CRUNCH_INIT);
+//	current->flags |= PF_USEDCRUNCH;
+}
+
+
+/*
+ * had to do it this way since "clf(); cli();" takes longer
+ */
+static inline void clear_fiq_irq(void)
+{
+	int cpsr;
+
+	asm volatile (
+	"mrs	%0, CPSR\n\t"
+	"orr	%0, %0, #192\n\t"
+	"msr	CPSR_c, %0"
+	:"=r" (cpsr)
+	:
+	:"memory");
+}
+
+/*
+ * had to do it this way since "stf(); sti();" takes (twice) longer
+ */
+
+static inline void restore_fiq_irq(void)
+{
+	int cpsr;
+
+	asm volatile (
+	"mrs	%0, CPSR\n\t"
+	"bic	%0, %0, #192\n\t"
+	"msr	CPSR_c, %0"
+	:"=r" (cpsr)
+	:
+	:"memory");
+}
+
+#ifdef CONFIG_EP93XX_FPU_ACC
+
+static inline void save_accumulators(struct task_struct *tsk)
+{
+	int tmp;
+	struct thread_info *ti = tsk->thread_info; /* current_thread_info(); */
+	struct fp_crunch_struct *fp = &ti->fpstate.crunch;
+
+	/*
+	 * clear the IRQ & FIQ to avoid some of the bugs in the errata
+	 */
+	clear_fiq_irq();
+
+	asm volatile (
+	"cdp        p4, 1, c0, c0, c0, 2\n\t"	// "cfmv32al      mvfx0, mvax0\n\t"
+	"stc        p5, c0, [%0], #4\n\t"	// "cfstr32      mvfx0, [%0], 4\n\t"
+	"cdp        p4, 1, c1, c0, c0, 3\n\t"	// "cfmv32am      mvfx1, mvax0\n\t"
+	"stc        p5, c1, [%0], #4\n\t"	// "cfstr32      mvfx1, [%0], 4\n\t"
+	"cdp        p4, 1, c2, c0, c0, 4\n\t"	// "cfmv32ah      mvfx2, mvax0\n\t"
+	"stc        p5, c2, [%0], #4\n\t"	// "cfstr32      mvfx2, [%0], 4\n\t"
+	"cdp        p4, 1, c3, c1, c0, 2\n\t"	// "cfmv32al      mvfx3, mvax1\n\t"
+	"stc        p5, c3, [%0], #4\n\t"	// "cfstr32      mvfx3, [%0], 4\n\t"
+	"cdp        p4, 1, c4, c1, c0, 3\n\t"	// "cfmv32am      mvfx4, mvax1\n\t"
+	"stc        p5, c4, [%0], #4\n\t"	// "cfstr32      mvfx4, [%0], 4\n\t"
+	"cdp        p4, 1, c5, c1, c0, 4\n\t"	// "cfmv32ah      mvfx5, mvax1\n\t"
+	"stc        p5, c5, [%0], #4\n\t"	// "cfstr32      mvfx5, [%0], 4\n\t"
+	"cdp        p4, 1, c6, c2, c0, 2\n\t"	// "cfmv32al      mvfx6, mvax2\n\t"
+	"stc        p5, c6, [%0], #4\n\t"	// "cfstr32      mvfx6, [%0], 4\n\t"
+	"cdp        p4, 1, c7, c2, c0, 3\n\t"	// "cfmv32am      mvfx7, mvax2\n\t"
+	"stc        p5, c7, [%0], #4\n\t"	// "cfstr32      mvfx7, [%0], 4\n\t"
+	"cdp        p4, 1, c8, c2, c0, 4\n\t"	// "cfmv32ah      mvfx8, mvax2\n\t"
+	"stc        p5, c8, [%0], #4\n\t"	// "cfstr32      mvfx8, [%0], 4\n\t"
+	"cdp        p4, 1, c9, c3, c0, 2\n\t"	// "cfmv32al      mvfx9, mvax3\n\t"
+	"stc        p5, c9, [%0], #4\n\t"	// "cfstr32      mvfx9, [%0], 4\n\t"
+	"cdp        p4, 1, c10, c3, c0, 3\n\t"	// "cfmv32am     mvfx10, mvax3\n\t"
+	"stc        p5,c10, [%0], #4\n\t"	// "cfstr32      mvfx10, [%0], 4\n\t"
+	"cdp        p4, 1, c11, c3, c0, 4\n\t"	// "cfmv32ah     mvfx11, mvax3\n\t"
+	"stc        p5, c11, [%0, #0]"		// "cfstr32      mvfx11, [%0, #0]"
+	:"=&r" (tmp)
+	:"0" (&fp->acc0[0])
+	:"memory");
+
+	restore_fiq_irq();
+}
+
+static inline void restore_accumulators(struct task_struct *tsk)
+{
+	int tmp;
+	struct thread_info *ti = tsk->thread_info; /* current_thread_info(); */
+	struct fp_crunch_struct *fp = &ti->fpstate.crunch;
+
+	/*
+	 * clear the IRQ & FIQ to avoid some of the bugs in the errata
+	 */
+	clear_fiq_irq();
+
+	asm volatile (
+	"ldc        p5, c0, [%0],#4\n\t"	// "cfldr32        mvfx0, [%0], 4\n\t"
+	"cdp        p4, 2, c0, c0, c0, 2\n\t"	// "cfmval32       mvax0, mvfx0\n\t"
+	"ldc        p5, c1, [%0],#4\n\t"	// "cfldr32        mvfx1, [%0], 4\n\t"
+	"cdp        p4, 2, c0, c1, c0, 3\n\t"	// "cfmvam32       mvax0, mvfx1\n\t"
+	"ldc        p5, c2, [%0],#4\n\t"	// "cfldr32        mvfx2, [%0], 4\n\t"
+	"cdp        p4, 2, c0, c2, c0, 4\n\t"	// "cfmvah32       mvax0, mvfx2\n\t"
+	"ldc        p5, c3, [%0],#4\n\t"	// "cfldr32        mvfx3, [%0], 4\n\t"
+	"cdp        p4, 2, c1, c3, c0, 2\n\t"	// "cfmval32       mvax1, mvfx3\n\t"
+	"ldc        p5, c4, [%0],#4\n\t"	// "cfldr32        mvfx4, [%0], 4\n\t"
+	"cdp        p4, 2, c1, c4, c0, 3\n\t"	// "cfmvam32       mvax1, mvfx4\n\t"
+	"ldc        p5, c5, [%0],#4\n\t"	// "cfldr32        mvfx5, [%0], 4\n\t"
+	"cdp        p4, 2, c1, c5, c0, 4\n\t"	// "cfmvah32       mvax1, mvfx5\n\t"
+	"ldc        p5, c6, [%0],#4\n\t"	// "cfldr32        mvfx6, [%0], 4\n\t"
+	"cdp        p4, 2, c2, c6, c0, 2\n\t"	// "cfmval32       mvax2, mvfx6\n\t"
+	"ldc        p5, c7, [%0],#4\n\t"	// "cfldr32        mvfx7, [%0], 4\n\t"
+	"cdp        p4, 2, c2, c7, c0, 3\n\t"	// "cfmvam32       mvax2, mvfx7\n\t"
+	"ldc        p5, c8, [%0],#4\n\t"	// "cfldr32        mvfx8, [%0], 4\n\t"
+	"cdp        p4, 2, c2, c8, c0, 4\n\t"	// "cfmvah32       mvax2, mvfx8\n\t"
+	"ldc        p5, c9, [%0],#4\n\t"	// "cfldr32        mvfx9, [%0], 4\n\t"
+	"cdp        p4, 2, c3, c9, c0, 2\n\t"	// "cfmval32       mvax3, mvfx9\n\t"
+	"ldc        p5, c10, [%0],#4\n\t"	// "cfldr32        mvfx10, [%0], 4\n\t"
+	"cdp        p4, 2, c3, c10, c0, 3\n\t"	// "cfmvam32       mvax3, mvfx10\n\t"
+	"ldc        p5, c11, [%0, #0]\n\t"	// "cfldr32        mvfx11, [%0, #0]\n\t"
+	"cdp        p4, 2, c3, c11, c0, 4"	// "cfmvah32       mvax3, mvfx11"
+	:"=&r" (tmp)
+	:"0" (&fp->acc0[0])
+	:"memory");
+
+	restore_fiq_irq();
+}
+
+#endif
+
+
+
+#ifdef CONFIG_EP93XX_FPU
+void save_crunch(struct task_struct *tsk)
+{
+	int tmp;
+	struct thread_info *ti = tsk->thread_info; /* current_thread_info(); */
+	struct fp_crunch_struct *fp = &ti->fpstate.crunch;
+
+
+	asm volatile (
+	"stcl       p5, c0, [%0],#8\n\t"	// "cfstr64        mvdx0, [%0], 8\n\t"
+	"stcl       p5, c1, [%0],#8\n\t"	// "cfstr64        mvdx1, [%0], 8\n\t"
+	"stcl       p5, c2, [%0],#8\n\t"	// "cfstr64        mvdx2, [%0], 8\n\t"
+	"stcl       p5, c3, [%0],#8\n\t"	// "cfstr64        mvdx3, [%0], 8\n\t"
+	"stcl       p5, c4, [%0],#8\n\t"	// "cfstr64        mvdx4, [%0], 8\n\t"
+	"stcl       p5, c5, [%0],#8\n\t"	// "cfstr64        mvdx5, [%0], 8\n\t"
+	"stcl       p5, c6, [%0],#8\n\t"	// "cfstr64        mvdx6, [%0], 8\n\t"
+	"stcl       p5, c7, [%0],#8\n\t"	// "cfstr64        mvdx7, [%0], 8\n\t"
+	"stcl       p5, c8, [%0],#8\n\t"	// "cfstr64        mvdx8, [%0], 8\n\t"
+	"stcl       p5, c9, [%0],#8\n\t"	// "cfstr64        mvdx9, [%0], 8\n\t"
+	"stcl       p5, c10, [%0],#8\n\t"	// "cfstr64        mvdx10, [%0], 8\n\t"
+	"stcl       p5, c11, [%0],#8\n\t"	// "cfstr64        mvdx11, [%0], 8\n\t"
+	"stcl       p5, c12, [%0],#8\n\t"	// "cfstr64        mvdx12, [%0], 8\n\t"
+	"stcl       p5, c13, [%0],#8\n\t"	// "cfstr64        mvdx13, [%0], 8\n\t"
+	"stcl       p5, c14, [%0],#8\n\t"	// "cfstr64        mvdx14, [%0], 8\n\t"
+	"stcl       p5, c15, [%0, #0]\n\t"	// "cfstr64        mvdx15, [%0, #0]\n\t"
+	"cdp        p4, 1, c15, c0, c0, 7\n\t"	// "cfmv32sc       mvdx15, dspsc\n\t"
+	"stc        p5, c15, [%2, #0]"		// "cfstr32        mvfx15, [%2, #0]"
+	:"=&r" (tmp)
+	:"0" (&fp->regs[0]), "r" (&fp->dspsc)
+	:"memory");
+#ifdef CONFIG_EP93XX_CRUNCH_ACC
+	/*
+	 * this call should be made exactly here since it's corrupting
+	 * the contents of most crunch registers ;-)
+	 */
+	save_accumulators(tsk);
+#endif
+}
+
+void restore_crunch(struct task_struct *tsk)
+{
+	int tmp;
+	struct thread_info *ti = tsk->thread_info; /* current_thread_info(); */
+	struct fp_crunch_struct *fp = &ti->fpstate.crunch;
+
+#ifdef CONFIG_EP93XX_CRUNCH_ACC
+	/*
+	 * same as above, but reversed.  if you put the call below the 'asm'
+	 * code then you'll corrupt the 
+	 */
+	restore_accumulators(tsk);
+#endif
+	asm volatile (
+	"ldc        p5, c15, [%2, #0]\n\t"	// "cfldr32   mvfx15, [%2, #0]\n\t"
+	"cdp        p4, 2, c15, c0, c0, 7\n\t"	// "cfmvsc32  dspsc, mvdx15\n\t"
+	"ldcl       p5, c0, [%0],#8\n\t"	// "cfldr64   mvdx0, [%0], 8\n\t"
+	"ldcl       p5, c1, [%0],#8\n\t"	// "cfldr64   mvdx1, [%0], 8\n\t"
+	"ldcl       p5, c2, [%0],#8\n\t"	// "cfldr64   mvdx2, [%0], 8\n\t"
+	"ldcl       p5, c3, [%0],#8\n\t"	// "cfldr64   mvdx3, [%0], 8\n\t"
+	"ldcl       p5, c4, [%0],#8\n\t"	// "cfldr64   mvdx4, [%0], 8\n\t"
+	"ldcl       p5, c5, [%0],#8\n\t"	// "cfldr64   mvdx5, [%0], 8\n\t"
+	"ldcl       p5, c6, [%0],#8\n\t"	// "cfldr64   mvdx6, [%0], 8\n\t"
+	"ldcl       p5, c7, [%0],#8\n\t"	// "cfldr64   mvdx7, [%0], 8\n\t"
+	"ldcl       p5, c8, [%0],#8\n\t"	// "cfldr64   mvdx8, [%0], 8\n\t"
+	"ldcl       p5, c9, [%0],#8\n\t"	// "cfldr64   mvdx9, [%0], 8\n\t"
+	"ldcl       p5, c10, [%0],#8\n\t"	// "cfldr64   mvdx10, [%0], 8\n\t"
+	"ldcl       p5, c11, [%0],#8\n\t"	// "cfldr64   mvdx11, [%0], 8\n\t"
+	"ldcl       p5, c12, [%0],#8\n\t"	// "cfldr64   mvdx12, [%0], 8\n\t"
+	"ldcl       p5, c13, [%0],#8\n\t"	// "cfldr64   mvdx13, [%0], 8\n\t"
+	"ldcl       p5, c14, [%0],#8\n\t"	// "cfldr64   mvdx14, [%0], 8\n\t"
+	"ldcl       p5, c15, [%0, #0]"		// "cfldr64   mvdx15, [%0, #0]"
+	:"=&r" (tmp)
+	:"0" (&fp->regs[0]), "r" (&fp->dspsc)
+	:"memory");
+}
+#endif
+
+#if 0
+
+void crunch_exception(int irq, void *dev_id, struct pt_regs *regs)
+{
+	int sc, opc;
+
+	send_sig(SIGFPE, current, 1);
+	opc = read_dspsc_high();
+	sc = read_dspsc_low();
+	printk("%s: DSPSC_high=%08x, DSPSC_low=%08x\n", __FUNCTION__, opc, sc);
+	sc &= ~(1 << 21);	/* we recure without this */
+	write_dspsc(sc);
+}
+
+/*
+ * only register ep9312 default FPU handler...
+ */
+__init int setup_crunch(void)
+{
+	int res;
+
+	res = request_irq(CRUNCH_IRQ, crunch_exception, SA_INTERRUPT, "FPU", NULL);
+	if (res) {
+		printk("Crunch IRQ (%d) allocation failure\n", CRUNCH_IRQ);
+		return res;
+	}
+
+	return res;
+}
+
+static inline int insn_is_crunch(long insn)
+{
+	long tmp;
+
+	tmp = (insn >> 24) & 0x0e;
+	/* cdp, mcr, mrc */
+	if (tmp == 0x0e || tmp == 0x0c) {
+		tmp = (insn >> 8) & 0x0f;
+		if (tmp == 4)
+			return 1;
+		if (tmp == 5)
+			return 1;
+		if (tmp == 6)
+			return 1;
+	}
+
+	return 0;
+}
+
+int crunch_opcode(struct pt_regs *regs)
+{
+	int *insn;
+	struct task_struct *tsk = current;
+
+	insn = (int *) (instruction_pointer(regs) - 4);
+	if (!insn_is_crunch(*insn)) {
+		/*
+		 * not a crunch instruction, but might be another
+		 * (FPA/VFP) floating point one
+		 */
+		return 0;
+	}
+
+	crunch_enable();
+	regs->ARM_pc -= 4;	/* restart the Crunch instruction */
+	if (tsk->flags & PF_USEDCRUNCH) {
+		restore_crunch(tsk);
+	} else {
+		crunch_init();
+	}
+	tsk->flags |= PF_USEDFPU;
+
+	return 1;
+}
+
+__initcall(setup_crunch);
+#endif
+
+
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma.c linux-2.6.8.1/arch/arm/mach-ep93xx/dma.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/dma.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,28 @@
+/*
+ *  linux/arch/arm/mach-ep93xx/dma.c
+ *
+ *  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
+ */
+#include <linux/init.h>
+
+#include <asm/dma.h>
+#include <asm/mach/dma.h>
+
+void __init arch_dma_init(dma_t *dma)
+{
+}
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma_ep93xx.c linux-2.6.8.1/arch/arm/mach-ep93xx/dma_ep93xx.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma_ep93xx.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/dma_ep93xx.c	2006-09-27 03:19:31.000000000 -0500
@@ -0,0 +1,2929 @@
+/******************************************************************************
+ * 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( fmt, arg... )  printk( fmt, ##arg )
+#else
+#define DPRINTK( fmt, arg... )
+#endif
+
+/*****************************************************************************
+ *
+ * static global variables
+ *
+ ****************************************************************************/
+ep93xx_dma_t dma_chan[MAX_EP93XX_DMA_CHANNELS];
+
+/*
+ *  lock used to protect the list of dma channels while searching for a free
+ *  channel during dma_request.
+ */
+static spinlock_t dma_list_lock;
+
+/*****************************************************************************
+ *
+ *  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);
+		return(-1);
+	}
+
+	/*
+	 *  See if this instance is still open
+	 */
+	if (!dma_chan[channel].ref_count )
+		return(-1);
+
+	return(channel);
+}
+
+static void dma_m2m_transfer_done(ep93xx_dma_t *dma)
+{
+	unsigned int uiCONTROL;
+	unsigned int M2M_reg_base = dma->reg_base;
+	unsigned int read_back;
+
+	DPRINTK("1  ");
+
+	outl( 0, M2M_reg_base+M2M_OFFSET_INTERRUPT );
+
+	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 buffer descriptor 0
+			 *
+			 * Set the SAR_BASE/DAR_BASE/BCR registers with values
+			 * from the next buffer in the queue.
+			 */
+			outl( dma->buffer_queue[dma->current_buffer].source,
+			      M2M_reg_base + M2M_OFFSET_SAR_BASE0 );
+
+			outl( dma->buffer_queue[dma->current_buffer].dest,
+			      M2M_reg_base + M2M_OFFSET_DAR_BASE0 );
+
+			outl( dma->buffer_queue[dma->current_buffer].size,
+			      M2M_reg_base + M2M_OFFSET_BCR0 );
+
+			DPRINTK("SAR_BASE0 - 0x%x\n", dma->buffer_queue[dma->current_buffer].source);
+			DPRINTK("DAR_BASE0 - 0x%x\n", dma->buffer_queue[dma->current_buffer].dest);
+			DPRINTK("BCR0 - 0x%x\n", dma->buffer_queue[dma->current_buffer].size);
+
+			/*
+			 * Decrement the new buffer counter
+			 */
+			dma->new_buffers--;
+
+			/*
+			 * If there's a second new buffer, we program the
+			 * second buffer descriptor.
+			 */
+			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 );
+
+				uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+				uiCONTROL |= CONTROL_M2M_NFBINTEN;
+				outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+				dma->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
+				 * tranferred, 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 = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+			uiCONTROL &= ~CONTROL_M2M_ENABLE;
+			outl( 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;
+		}
+	} else {
+		/*
+		 * No buffers to transfer, or old buffers to mark as used,
+		 * so disable the channel
+		 */
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2M_ENABLE;
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+		/*
+		 * Must read the control register back after a write.
+		 */
+		read_back = inl(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;
+	}
+}
+
+static void dma_m2m_next_frame_buffer(ep93xx_dma_t *dma)
+{
+	int loop;
+	unsigned int uiCONTROL;
+	unsigned int M2M_reg_base = dma->reg_base;
+
+	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 complete the
+			 * transfer of the current buffer, move the FSB
+			 * directly to the STALL state where a STALL interrupt
+			 * will be generated.
+			 */
+			uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+			uiCONTROL &= ~CONTROL_M2M_NFBINTEN ;
+			outl( 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("CONTROL - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_CONTROL) );
+			DPRINTK("STATUS - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_STATUS) );
+			DPRINTK("SAR_BASE0 - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_SAR_BASE0) );
+			DPRINTK("SAR_CUR0 - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_SAR_CURRENT0) );
+			DPRINTK("DAR_BASE0 - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_DAR_BASE0) );
+			DPRINTK("DAR_CUR0 - 0x%x \n",
+                                inl(M2M_reg_base+M2M_OFFSET_DAR_CURRENT0) );
+
+			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%p \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 ( inl(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.
+				 */
+				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 );
+			} else {
+				/*
+				 * Set the SAR_BASE0/DAR_BASE0/BCR0 registers
+				 * with values from the next buffer in the
+				 * queue.
+				 */
+				outl( dma->buffer_queue[(dma->current_buffer + 1) %
+							MAX_EP93XX_DMA_BUFFERS].source,
+				      M2M_reg_base+M2M_OFFSET_SAR_BASE0 );
+
+				outl( dma->buffer_queue[(dma->current_buffer + 1) %
+							MAX_EP93XX_DMA_BUFFERS].dest,
+				      M2M_reg_base+M2M_OFFSET_DAR_BASE0 );
+
+				outl( 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--;
+		}
+	} else {
+		/*
+		 * Total number of buffers is 0 - really we should never get
+		 * here, but just in case.
+		 */
+		DPRINTK("9 \n");
+
+		/*
+		 *  No new buffers to transfer, so Disable the channel
+		 */
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2M_ENABLE;
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+		/*
+		 *  Indicate that the channel is paused by starvation.
+		 */
+		dma->pause = 1;
+	}
+}
+
+/*****************************************************************************
+ *
+ * dma_m2m_irq_handler
+ *
+ ****************************************************************************/
+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;
+	int status;
+
+//	printk("+m2m irq=%d\n", irq);
+
+	/*
+	 *  Determine what kind of dma interrupt this is.
+	 */
+	status = inl(M2M_reg_base + M2M_OFFSET_INTERRUPT);
+	if ( status & INTERRUPT_M2M_DONEINT )
+		dma_int = DONE; // we're done with a requested dma
+	else if ( status & INTERRUPT_M2M_NFBINT )
+		dma_int = NFB;  // we're done with one dma buffer
+
+	DPRINTK("IRQ: b=%#x st=%#x\n", (int)dma->current_buffer, dma_int);
+
+	switch (dma_int) {
+	/*
+	 *  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.
+	 */
+	case NFB:
+		dma_m2m_next_frame_buffer(dma);
+		break;
+	/*
+	 *  Done interrupt generated, indicating that the transfer is complete.
+	 */
+	case DONE:
+		dma_m2m_transfer_done(dma);
+		break;
+
+	default:
+		break;
+	}
+
+	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 ( inl(M2P_reg_base+M2P_OFFSET_INTERRUPT) & INTERRUPT_M2P_STALLINT )
+		dma_int = STALL;
+	else if ( inl(M2P_reg_base+M2P_OFFSET_INTERRUPT) & INTERRUPT_M2P_NFBINT )
+		dma_int = NFB;
+	else if ( inl(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
+				 */
+				outl( dma->buffer_queue[dma->current_buffer].size,
+					  M2P_reg_base+M2P_OFFSET_MAXCNT0 );
+
+				/*
+				 * Set the BASE0 register with the buffer base
+				 * address
+				 */
+				outl( 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
+					 */
+					outl( 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
+					 */
+					outl( 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 = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+					uiCONTROL |= CONTROL_M2P_NFBINTEN;
+					outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+				}
+			} else {
+				/*
+				 *  No new buffers.
+				 */
+				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 = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+				uiCONTROL &= ~CONTROL_M2P_ENABLE;
+				outl( 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",	 inl(M2P_reg_base+M2P_OFFSET_STATUS) );
+				DPRINTK("CONTROL - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_CONTROL) );
+				DPRINTK("REMAIN - 0x%x \n",	 inl(M2P_reg_base+M2P_OFFSET_REMAIN) );
+				DPRINTK("PPALLOC - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_PPALLOC) );
+				DPRINTK("BASE0 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE0) );
+				DPRINTK("MAXCNT0 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT0) );
+				DPRINTK("CURRENT0 - 0x%x \n",   inl(M2P_reg_base+M2P_OFFSET_CURRENT0) );
+				DPRINTK("BASE1 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE1) );
+				DPRINTK("MAXCNT1 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) );
+				DPRINTK("CURRENT1 - 0x%x \n",   inl(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%p \n", dma->callback);
+			}
+		} else {
+			/*
+			 *  No buffers to transfer, or old buffers to mark as used,
+			 *  so Disable the channel
+			 */
+			uiCONTROL = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+			uiCONTROL &= ~CONTROL_M2P_ENABLE;
+			outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+
+			/*
+			 *  Must read the control register back after a write.
+			 */
+			read_back = inl(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 = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+				uiCONTROL &= ~CONTROL_M2P_NFBINTEN;
+				outl( 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",	 inl(M2P_reg_base+M2P_OFFSET_STATUS) );
+				DPRINTK("CONTROL - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_CONTROL) );
+				DPRINTK("REMAIN - 0x%x \n",	 inl(M2P_reg_base+M2P_OFFSET_REMAIN) );
+				DPRINTK("PPALLOC - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_PPALLOC) );
+				DPRINTK("BASE0 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE0) );
+				DPRINTK("MAXCNT0 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT0) );
+				DPRINTK("CURRENT0 - 0x%x \n",   inl(M2P_reg_base+M2P_OFFSET_CURRENT0) );
+				DPRINTK("BASE1 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE1) );
+				DPRINTK("MAXCNT1 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) );
+				DPRINTK("CURRENT1 - 0x%x \n",   inl(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%p \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 ( inl(M2P_reg_base+M2P_OFFSET_STATUS) & STATUS_M2P_NEXTBUFFER ) {
+					/*
+					 *  Set the MAXCNT1 register with the buffer size
+					 */
+					outl( 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
+					 */
+					outl( 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
+					 */
+					outl( 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
+					 */
+					outl( 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--;
+			}
+		} else {
+			/*
+			 *  Total number of buffers is 0 - really we should never get here,
+			 *  but just in case.
+			 */
+			DPRINTK("9 \n");
+
+			/*
+			 *  No new buffers to transfer, so Disable the channel
+			 */
+			uiCONTROL = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+			uiCONTROL &= ~CONTROL_M2P_ENABLE;
+			outl( 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 = inl(M2P_reg_base+M2P_OFFSET_INTERRUPT);
+		uiINTERRUPT &= ~INTERRUPT_M2P_CHERRORINT;
+		outl( 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;
+	unsigned long flags;
+
+	DPRINTK("DMA Open M2P with hw dev %d\n", device);
+
+	/*
+	 *  Lock the dma channel list.
+	 */
+	spin_lock_irqsave(&dma_list_lock, flags);
+
+	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");
+				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_irqrestore(&dma_list_lock, flags);
+
+	/*
+	 *  See if we got a valid channel.
+	 */
+	if (channel < 0)
+		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 = inl(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);
+	}
+	outl( uiPWRCNT, SYSCON_PWRCNT );
+
+	/*
+	 *  Clear out the control register before any further setup.
+	 */
+	outl( 0, M2P_reg_base+M2P_OFFSET_CONTROL );
+
+	/*
+	 *  Setup the peripheral port value in the DMA channel registers.
+	 */
+	if (device < 10)
+		outl( (unsigned int)device, M2P_reg_base+M2P_OFFSET_PPALLOC );
+	else
+		outl( (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;
+	unsigned long flags;
+
+	DPRINTK("DMA Open M2M with hw dev %d\n", device);
+
+	/*
+	 *  Lock the dma channel list.
+	 */
+	spin_lock_irqsave(&dma_list_lock, flags);
+
+	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_irqrestore(&dma_list_lock, flags);
+
+				/*
+				 *  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)
+		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 = inl(SYSCON_PWRCNT);
+	switch (channel) {
+	case 10:
+		uiPWRCNT |= SYSCON_PWRCNT_DMA_M2MCH0;
+		break;
+
+	case 11:
+		uiPWRCNT |= SYSCON_PWRCNT_DMA_M2MCH1;
+		break;
+
+	default:
+		return(-1);
+	}
+	outl( uiPWRCNT, SYSCON_PWRCNT );
+
+	DPRINTK("DMA Open - power control: 0x%x \n", inl(SYSCON_PWRCNT) );
+
+	/*
+	 *  Clear out the control register before any further setup.
+	 */
+	outl( 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 = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~(CONTROL_M2M_TM_MASK | CONTROL_M2M_RSS_MASK);
+		outl( 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 = inl(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);
+
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+		inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		break;
+
+	case DMARx_SSP:
+		/*
+		 * Set RSS field to 1, Set NO_HDSK, Set TM field to 2
+		 */
+		uiCONTROL = inl(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);
+		outl( 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 = inl(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);
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+		break;
+
+	case DMATx_EXT_DREQ:
+		/*
+		 * Set TM field to 2, set RSS field to 0
+		 */
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~(CONTROL_M2M_RSS_MASK|CONTROL_M2M_TM_MASK);
+		uiCONTROL |= 1<<CONTROL_M2M_TM_SHIFT;
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+		break;
+
+	case DMARx_EXT_DREQ:
+		/*
+		 * Set TM field to 2, set RSS field to 0
+		 */
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~(CONTROL_M2M_RSS_MASK|CONTROL_M2M_TM_MASK);
+		uiCONTROL |= 2<<CONTROL_M2M_TM_SHIFT;
+		outl( 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;
+
+	uiCONTROL = inl(M2M_reg_base + M2M_OFFSET_CONTROL);
+	outl(0, M2M_reg_base + M2M_OFFSET_CONTROL);
+	inl(M2M_reg_base + M2M_OFFSET_CONTROL);
+	outl(uiCONTROL, M2M_reg_base + M2M_OFFSET_CONTROL);
+
+	/*
+	 *  By default we disable the stall interrupt.
+	 */
+	uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+	uiCONTROL &= ~CONTROL_M2M_STALLINTEN;
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+	/*
+	 *  By default we disable the done interrupt.
+	 */
+	uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+	uiCONTROL &= ~CONTROL_M2M_DONEINTEN;
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+	/*
+	 *  Set up the transfer control fields based on values passed in
+	 *  the flags_m2m field.
+	 */
+	uiCONTROL = inl(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;
+
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+	inl(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.
+	 */
+	outl(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 disable the next frame buffer
+	 *  interrupt on the channel.
+	 */
+	uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+	uiCONTROL &= ~CONTROL_M2M_NFBINTEN;
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+	/*
+	 * enable the done interrupt.
+	 */
+	uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+	uiCONTROL |= CONTROL_M2M_DONEINTEN;
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+	/*
+	 *  Update the dma channel instance transfer state.
+	 */
+	dma->xfer_enable = TRUE;
+	dma->pause = FALSE;
+
+	/*
+	 *  Program up the first buffer descriptor with a source and destination
+	 *  and a byte count.
+	 */
+	outl( dma->buffer_queue[dma->current_buffer].source,
+	      M2M_reg_base+M2M_OFFSET_SAR_BASE0 );
+
+	outl( dma->buffer_queue[dma->current_buffer].dest,
+	      M2M_reg_base+M2M_OFFSET_DAR_BASE0 );
+
+	outl( dma->buffer_queue[dma->current_buffer].size,
+	      M2M_reg_base+M2M_OFFSET_BCR0 );
+
+	/*
+	 *  Decrement the new buffers counter.
+	 */
+	dma->new_buffers--;
+
+	/*
+	 * 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 );
+
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL |= CONTROL_M2M_NFBINTEN;
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+
+		dma->new_buffers--;
+	}
+
+	/*
+	 *  Now we enable the channel.  This initiates the transfer.
+	 */
+	uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+	uiCONTROL |= CONTROL_M2M_ENABLE;
+	outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+	inl(M2M_reg_base + M2M_OFFSET_CONTROL);
+
+	/*
+	 *  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 = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL |= CONTROL_M2M_START;
+		outl( uiCONTROL, M2M_reg_base+M2M_OFFSET_CONTROL );
+	}
+
+	DPRINTK("DMA - It's been started!!");
+	DPRINTK("CONTROL - 0x%x \n",	inl(M2M_reg_base+M2M_OFFSET_CONTROL) );
+	DPRINTK("STATUS - 0x%x \n",	 inl(M2M_reg_base+M2M_OFFSET_STATUS) );
+	DPRINTK("BCR0 - 0x%x \n",	   dma->buffer_queue[dma->current_buffer].size);
+	DPRINTK("SAR_BASE0 - 0x%x \n",  inl(M2M_reg_base+M2M_OFFSET_SAR_BASE0) );
+	DPRINTK("SAR_CUR0 - 0x%x \n",   inl(M2M_reg_base+M2M_OFFSET_SAR_CURRENT0) );
+	DPRINTK("DAR_BASE0 - 0x%x \n",  inl(M2M_reg_base+M2M_OFFSET_DAR_BASE0) );
+	DPRINTK("DAR_CUR0 - 0x%x \n",   inl(M2M_reg_base+M2M_OFFSET_DAR_CURRENT0) );
+
+	/*
+	 *  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");
+		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);
+		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 = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+	uiCONTROL |= CONTROL_M2P_STALLINTEN;
+	outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+
+	/*
+	 *  Configure the channel for an error from the peripheral.
+	 */
+	uiCONTROL = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+	if ( flags_m2p && CHANNEL_ERROR_INT_ENABLE )
+		uiCONTROL |= CONTROL_M2P_CHERRORINTEN;
+	else
+		uiCONTROL &= ~CONTROL_M2P_CHERRORINTEN;
+	outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+
+	uiCONTROL = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+	if ( flags_m2p && CHANNEL_ABORT )
+		uiCONTROL |= CONTROL_M2P_ABRT;
+	else
+		uiCONTROL &= ~CONTROL_M2P_ABRT;
+	outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+
+	uiCONTROL = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+	if ( flags_m2p && IGNORE_CHANNEL_ERROR )
+		uiCONTROL |= CONTROL_M2P_ICE;
+	else
+		uiCONTROL &= ~CONTROL_M2P_ICE;
+	outl( 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");
+		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);
+	} 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);
+
+			/*
+			 *  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++) {
+		/*
+		 *  Check if we need to restore a paused transfer.
+		 */
+		if (dma_pointers[loop]->pause_buf.buf_id != -1)
+			outl( dma_pointers[loop]->pause_buf.size,
+			      M2P_reg_bases[loop]+M2P_OFFSET_MAXCNT0 );
+		else
+			outl( 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 = inl(M2P_reg_bases[loop]+M2P_OFFSET_CONTROL);
+		uiCONTROL |= CONTROL_M2P_ENABLE;
+		outl( 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;
+	}
+
+	/*
+	 *  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) {
+			outl( 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 if(dma_pointers[loop]->new_buffers){
+			outl( dma_pointers[loop]->buffer_queue[
+				  dma_pointers[loop]->current_buffer].source,
+			      M2P_reg_bases[loop]+M2P_OFFSET_BASE0 );
+            dma_pointers[loop]->new_buffers--;
+            
+          }
+
+	/*
+	 *  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) {
+        	/*
+        	 *  By default we enable the next frame buffer interrupt.
+        	 */
+        	uiCONTROL = inl(M2P_reg_bases[loop]+M2P_OFFSET_CONTROL);
+        	uiCONTROL |= CONTROL_M2P_NFBINTEN;
+        	outl( uiCONTROL, M2P_reg_bases[loop]+M2P_OFFSET_CONTROL );
+
+			outl( dma_pointers[loop]->buffer_queue[
+				  (dma_pointers[loop]->current_buffer + 1) %
+				  MAX_EP93XX_DMA_BUFFERS].size,
+			      M2P_reg_bases[loop]+M2P_OFFSET_MAXCNT1 );
+
+			outl( dma_pointers[loop]->buffer_queue[
+				  (dma_pointers[loop]->current_buffer + 1) %
+				  MAX_EP93XX_DMA_BUFFERS].source,
+			      M2P_reg_bases[loop]+M2P_OFFSET_BASE1 );
+            dma_pointers[loop]->new_buffers--;
+		}
+
+	/*
+	  DPRINTK("DMA - It's been started!!");
+	  DPRINTK("STATUS - 0x%x \n",	 inl(M2P_reg_base+M2P_OFFSET_STATUS) );
+	  DPRINTK("CONTROL - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_CONTROL) );
+	  DPRINTK("REMAIN - 0x%x \n",	 inl(M2P_reg_base+M2P_OFFSET_REMAIN) );
+	  DPRINTK("PPALLOC - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_PPALLOC) );
+	  DPRINTK("BASE0 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE0) );
+	  DPRINTK("MAXCNT0 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT0) );
+	  DPRINTK("CURRENT0 - 0x%x \n",   inl(M2P_reg_base+M2P_OFFSET_CURRENT0) );
+	  DPRINTK("BASE1 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE1) );
+	  DPRINTK("MAXCNT1 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) );
+	  DPRINTK("CURRENT1 - 0x%x \n",   inl(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;
+#if 0
+	static int peak_total_buffers=0;
+#endif
+	/*
+	 *  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");
+		return(-EINVAL);
+	}
+
+	/*
+	 *  Get a pointer to the dma instance.
+	 */
+	dma = &dma_chan[channel];
+
+#if 0	
+	if( dma->total_buffers > peak_total_buffers )
+	{
+	    peak_total_buffers=dma->total_buffers;
+	    printk("peak_total_buffers=%d\n", peak_total_buffers );
+	}
+#endif
+	/*
+	 *  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) 
+	{
+		DPRINTK("too many dma buffers: MAX_EP93XX_DMA_BUFFERS set to low ?\n");
+		/*
+		 *  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, 0);
+		}
+	}
+
+	/*
+	 *  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");
+		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;
+
+	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];
+
+	/*
+	 *  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,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 Flush: Invalid dma handle.\n");
+		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);
+
+	/*
+	 *  Disable the dma channel
+	 */
+	if (channel < 10) {
+		/*
+		 *  M2P channel
+		 */
+		uiCONTROL = inl(dma->reg_base+M2P_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2P_ENABLE;
+		outl( uiCONTROL, dma->reg_base+M2P_OFFSET_CONTROL );
+	} else {
+		/*
+		 *  M2M channel
+		 */
+		uiCONTROL = inl(dma->reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2M_ENABLE;
+		outl( uiCONTROL, dma->reg_base+M2M_OFFSET_CONTROL );
+	}
+
+	for (loop = 0; loop < MAX_EP93XX_DMA_BUFFERS; loop++)
+	{
+		dma->buffer_queue[loop].buf_id = -1;
+		dma->buffer_queue[loop].last = 0;
+	}
+
+	/*
+	 *  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;
+
+    /*
+     * Reset the paused buffer.
+     */
+     dma->pause_buf.last = 0;
+     dma->pause_buf.buf_id = -1;
+
+	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");
+		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;
+	
+//	DPRINTK("DMA buf_id %d, total %d, frac %d\n", buf_id1, total1, current_frac1);
+
+	/*
+	 *  Success.
+	 */
+	return(0);
+}
+
+/*****************************************************************************
+ *
+ *  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");
+		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);
+}
+
+/*****************************************************************************
+ *
+ *  int ep93xx_dma_is_done(int handle)
+ *
+ *  Description:	Determines if the specified channel is done
+ *			transferring the requested data.
+ *
+ *  handle:	 handle for the channel to query.
+ *
+ ****************************************************************************/
+int
+ep93xx_dma_is_done(int handle)
+{
+	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 "ep93xx_dma_is_done: Invalid dma handle.\n");
+		return(-EINVAL);
+	}
+
+        /*
+         * Get a pointer to the DMA channel state structure.
+         */
+        dma = &dma_chan[channel];
+
+        /*
+         * See if there are any buffers remaining to be provided to the HW.
+         */
+        if (dma->new_buffers)
+            return 0;
+
+        /*
+         * See if this is a M2P or M2M channel.
+         */
+        if (channel < 10) {
+            /*
+             * If the bytes remaining register of the HW is not zero, then
+             * there is more work to be done.
+             */
+            if (inl(dma->reg_base + M2P_OFFSET_REMAIN) != 0)
+                return 0;
+        } else {
+            /*
+             * If either byte count register in the HW is not zero, then there
+             * is more work to be done.
+             */
+            if ((inl(dma->reg_base + M2M_OFFSET_BCR0) != 0) ||
+                (inl(dma->reg_base + M2M_OFFSET_BCR1) != 0))
+                return 0;
+        }
+
+        /*
+         * The DMA is complete.
+         */
+        return 1;
+}
+
+/*****************************************************************************
+ * 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))
+		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);
+		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);
+		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) )
+		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",	 inl(M2P_reg_base+M2P_OFFSET_STATUS) );
+	DPRINTK("CONTROL - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_CONTROL) );
+	DPRINTK("REMAIN - 0x%x \n",	 inl(M2P_reg_base+M2P_OFFSET_REMAIN) );
+	DPRINTK("PPALLOC - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_PPALLOC) );
+	DPRINTK("BASE0 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE0) );
+	DPRINTK("MAXCNT0 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT0) );
+	DPRINTK("CURRENT0 - 0x%x \n",   inl(M2P_reg_base+M2P_OFFSET_CURRENT0) );
+	DPRINTK("BASE1 - 0x%x \n",	  inl(M2P_reg_base+M2P_OFFSET_BASE1) );
+	DPRINTK("MAXCNT1 - 0x%x \n",	inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) );
+	DPRINTK("CURRENT1 - 0x%x \n",   inl(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",   inl(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");
+		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 = inl(M2P_reg_base+M2P_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2P_ENABLE;
+		outl( uiCONTROL, M2P_reg_base+M2P_OFFSET_CONTROL );
+	} else {
+		/*
+		 *  M2M channel
+		 */
+		M2M_reg_base = dma->reg_base;
+
+		uiCONTROL = inl(M2M_reg_base+M2M_OFFSET_CONTROL);
+		uiCONTROL &= ~CONTROL_M2M_ENABLE;
+		outl( 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;
+}
+
+arch_initcall(ep93xx_dma_init);
+
+EXPORT_SYMBOL(ep93xx_dma_free);
+EXPORT_SYMBOL(ep93xx_dma_request);
+EXPORT_SYMBOL(ep93xx_dma_flush);
+EXPORT_SYMBOL(ep93xx_dma_pause);
+EXPORT_SYMBOL(ep93xx_dma_remove_buffer);
+EXPORT_SYMBOL(ep93xx_dma_add_buffer);
+EXPORT_SYMBOL(ep93xx_dma_start);
+EXPORT_SYMBOL(ep93xx_dma_config);
+
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma_ep93xx.h linux-2.6.8.1/arch/arm/mach-ep93xx/dma_ep93xx.h
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/dma_ep93xx.h	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/dma_ep93xx.h	2005-11-23 14:56:06.000000000 -0600
@@ -0,0 +1,199 @@
+/*****************************************************************************
+ *
+ * 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_
+
+// as it turns out the ide dma is the biggest dma buffer hog so far
+// in case the HDD is "thinking" (seek/buffer flush)
+// the continueing r/w DMAs to the HDD will be queued up to up to PRD_ENTRIES entries...
+#include <linux/ide.h>
+#define MAX_EP93XX_DMA_BUFFERS      PRD_ENTRIES
+
+#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 ep9312_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 // _DMADRV_H_
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/ee.c linux-2.6.8.1/arch/arm/mach-ep93xx/ee.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/ee.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/ee.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,21 @@
+/*
+ *  linux/arch/arm/mach-ep93xx/ee.c
+ *
+ *  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
+ */
+ 
+/* This file intentionally left blank */
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/irq.c linux-2.6.8.1/arch/arm/mach-ep93xx/irq.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/irq.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/irq.c	2005-09-12 09:57:55.000000000 -0500
@@ -0,0 +1,102 @@
+/*
+ *  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.
+ *
+ * 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/timer.h>
+#include <linux/init.h>
+
+#include <asm/mach/irq.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+
+/********************************************************************
+ *	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.
+ *
+ ************************************************************************/
+
+static void int1_mask(unsigned int irq)
+{
+	outl( (1 << irq), VIC0INTENCLEAR );
+}
+
+static void int1_unmask(unsigned int irq)
+{
+	outl( (1 << irq), VIC0INTENABLE );
+}
+
+static struct irqchip int1_chip = {
+	.ack	= int1_mask,
+	.mask	= int1_mask,
+	.unmask	= int1_unmask,
+};
+ 
+static void int2_mask(unsigned int irq)
+{
+	outl( (1 << (irq - 32)), VIC1INTENCLEAR );
+}
+
+static void int2_unmask(unsigned int irq)
+{
+	outl( (1 << (irq - 32)), VIC1INTENABLE );
+}
+
+static struct irqchip int2_chip = {
+	.ack	= int2_mask,
+	.mask	= int2_mask,
+	.unmask	= int2_unmask,
+};
+ 
+void __init ep93xx_init_irq(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < NR_IRQS; i++) {
+		if ((i < 32) && (INT1_IRQS & (1 << i))) {
+			set_irq_handler(i, do_level_IRQ);
+			set_irq_chip(i, &int1_chip);
+			set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+		}
+		if ((i >= 32) && (INT2_IRQS & (1 << (i - 32)))) {
+			set_irq_handler(i, do_level_IRQ);
+			set_irq_chip(i, &int2_chip);
+			set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+		}
+	}
+}
+
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/Kconfig linux-2.6.8.1/arch/arm/mach-ep93xx/Kconfig
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/Kconfig	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/Kconfig	2007-01-25 00:19:58.000000000 -0600
@@ -0,0 +1,322 @@
+if ARCH_EP93XX
+
+menu "Cirrus Logic EP93xx options"
+
+choice
+	prompt "Board type"
+	default ARCH_EDB9315
+	---help---
+	  The type of EP93xx board on which this kernel is to be run.
+
+config ARCH_EDB9301
+	bool "EDB9301"
+	select ARCH_EP9301
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9301
+	  processor.  The board includes two serial ports, Ethernet, audio, and
+	  expansion headers.  It comes with 32MB SDRAM and 16MB FLASH ROM.
+
+config ARCH_EDB9302
+	bool "EDB9302"
+	select ARCH_EP9302
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9302
+	  processor.  The board includes two serial ports, Ethernet, audio,
+	  USB, and expansion headers.  It comes with 32MB SDRAM and 16MB FLASH
+	  ROM.
+
+config ARCH_EDB9302A
+	bool "EDB9302A"
+	select ARCH_EP9302A
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9302A
+	  processor.  The board includes two serial ports, Ethernet, audio,
+	  USB, and expansion headers.  It comes with 32MB SDRAM and 16MB FLASH
+	  ROM.
+
+config ARCH_EDB9307
+	bool "EDB9307"
+	select ARCH_EP9307
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9307
+	  processor.  The board includes two serial ports, Ethernet, audio,
+	  USB, IrDA, VGA/TV, consumer IR, and expansion headers.  It comes with
+	  64MB SDRAM and 32MB FLASH ROM.
+
+config ARCH_EDB9307A
+        bool "EDB9307A"
+        select ARCH_EP9307A
+        ---help---
+          This is an evaluation board from Cirrus Logic for the EP9307A
+	  Low cost processor.  The board includes one serial port, Ethernet, audio,
+          USB Client/Host, IrDA, VGA/TV, LCD, consumer IR, and expansion headers.  It comes with
+          64MB SDRAM and 16MB FLASH ROM.
+
+config ARCH_EDB9312
+	bool "EDB9312"
+	select ARCH_EP9312
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9312
+	  processor.  The board includes two serial ports, Ethernet, audio,
+	  USB, IrDA, VGA/LCD/TV, IDE, consumer IR, and expansion headers.  It
+	  comes with 64MB SDRAM and 32MB FLASH ROM.
+
+config ARCH_EDB9315
+	bool "EDB9315"
+	select ARCH_EP9315
+	---help---
+	  This is an evaluation board from Cirrus Logic for the EP9315
+	  processor.  The board includes two serial ports, Ethernet, audio,
+	  USB, IrDA, VGA/LCD/TV, IDE, PCMCIA, consumer IR, and expansion
+	  headers.  It comes with 64MB SDRAM and 32MB FLASH ROM.
+
+config ARCH_EDB9315A
+        bool "EDB9315A"
+        select ARCH_EP9315A
+        ---help---
+          This is an evaluation board from Cirrus Logic for the EP9315A
+          processor.  The board includes two serial ports, Ethernet, audio,
+          USB, IrDA, VGA/LCD/TV, IDE, consumer IR, and expansion
+          headers.  It comes with 64MB SDRAM and 16MB FLASH ROM.
+
+endchoice
+
+choice
+	prompt "FLASH chip select"
+	default EP93XX_CS6
+	---help---
+	  The SMC chip select used to access the FLASH on the board.  This must
+	  match the hardware setting or the MTD driver will not be able to
+	  access the on-board FLASH.  Leave this at CSn6 if you are not sure.
+
+config EP93XX_CS0
+	bool "CSn0"
+	---help---
+	  FLASH is connected to the CSn0 pin of the EP93xx.
+
+config EP93XX_CS1
+	bool "CSn1"
+	---help---
+	  FLASH is connected to the CSn1 pin of the EP93xx.
+
+config EP93XX_CS2
+	bool "CSn2"
+	---help---
+	  FLASH is connected to the CSn2 pin of the EP93xx.
+
+config EP93XX_CS3
+	bool "CSn3"
+	---help---
+	  FLASH is connected to the CSn3 pin of the EP93xx.
+
+config EP93XX_CS6
+	bool "CSn6"
+	---help---
+	  FLASH is connected to the CSn6 pin of the EP93xx.
+
+config EP93XX_CS7
+	bool "CSn7"
+	---help---
+	  FLASH is connected to the CSn7 pin of the EP93xx.
+
+endchoice
+
+menu "FLASH chip options"
+	
+choice
+	prompt "FLASH size"
+	default EP93XX_FLASH_SIZE_16
+
+config EP93XX_FLASH_SIZE_2
+	bool "2MB"
+
+config EP93XX_FLASH_SIZE_4
+	bool "4MB"
+
+config EP93XX_FLASH_SIZE_8
+	bool "8MB"
+
+config EP93XX_FLASH_SIZE_16
+	bool "16MB"
+
+config EP93XX_FLASH_SIZE_32
+	bool "32MB"
+
+config EP93XX_FLASH_SIZE_64
+	bool "64MB"
+
+config EP93XX_FLASH_SIZE_128
+	bool "128MB"
+endchoice
+
+
+choice
+	prompt "FLASH width"
+	default EP93XX_FLASH_WIDTH_16
+
+config EP93XX_FLASH_WIDTH_16
+	bool "16bit"
+
+config EP93XX_FLASH_WIDTH_32
+	bool "32bit"
+endchoice
+endmenu
+
+choice
+	prompt "SDRAM chip select"
+	default EP93XX_SDCS3
+	---help---
+	  The SDRAM chip select used to access the SDRAM on the board.  This
+	  must match the hardware setting or the kernel will not run.  Leave
+	  this at SDCSn3 if you are not sure.
+
+config EP93XX_SDCS0
+	bool "SDCSn0"
+	---help---
+	  SDRAM is connected to the SDCDn0 pin of the EP93xx.
+
+config EP93XX_SDCS1
+	bool "SDCSn1"
+	---help---
+	  SDRAM is connected to the SDCDn1 pin of the EP93xx.
+
+config EP93XX_SDCS2
+	bool "SDCSn2"
+	---help---
+	  SDRAM is connected to the SDCDn2 pin of the EP93xx.
+
+config EP93XX_SDCS3
+	bool "SDCSn3"
+	---help---
+	  SDRAM is connected to the SDCDn3 pin of the EP93xx.
+
+endchoice
+
+config EP93XX_SYNC_BOOT
+	bool "Synchronous boot mode"
+	default y
+	---help---
+	  The boot mode of the board.  For internal boot mode, this really
+	  amounts to the physical addresses associated with CSn0 and SDCSn3;
+	  in synchronous boot mode CSn0 is at 0xf000.0000 and SDCSn3 is at
+	  0x0000.0000, and in asynchonous boot mode they are swapped.  For
+	  external boot mode, however, this same mapping applies but also
+	  determines what is executed since the ARM will start executing at
+	  physical address 0x0000.0000.
+
+	  This must match the hardware setting of the kernel will not run.
+	  Leave this set if you are not sure.
+
+
+config EP93XX_FPU
+	bool "Crunch FPU Support"
+	depends on ARCH_EP9302 || ARCH_EP9302A || ARCH_EP9307 || ARCH_EP9307A || ARCH_EP9312 || ARCH_EP9315 || ARCH_EP9315A || ARCH_EP9315A
+	---help---
+	Enable the Crunch floating point coprocessor and
+	let Linux save/restore the context of the Crunch FPU. 
+
+config EP93XX_FPU_ACC
+	bool "Save Crunch FPU Accumulators"
+	depends on EP93XX_FPU
+	---help---
+	Linux can save/store the Crunch accumulator registers.
+	This is only necessary if you wrote assembly code which uses
+	these accumulators and runs in more than one task/thread.
+	The crunch enabled version of GCC-3.4.3 does not generate code
+	which uses the accumulators.
+
+
+config ARCH_EP9301
+	bool
+
+config ARCH_EP9302
+	bool
+
+config ARCH_EP9302A
+	bool
+
+config ARCH_EP9307
+	bool
+	select EP93XX_FRAMEBUFFER
+	select EP93XX_GRAPHICS
+
+config ARCH_EP9307A
+	bool
+	select EP93XX_FRAMEBUFFER
+	select EP93XX_GRAPHICS
+	
+config ARCH_EP9312
+	bool
+	select EP93XX_FRAMEBUFFER
+
+config ARCH_EP9315
+	bool
+	select EP93XX_FRAMEBUFFER
+	select EP93XX_GRAPHICS
+
+config ARCH_EP9315A
+        bool
+        select EP93XX_FRAMEBUFFER
+        select EP93XX_GRAPHICS
+
+config EP93XX_FRAMEBUFFER
+	bool
+
+config EP93XX_GRAPHICS
+	bool
+
+config EP93XX_FLASH_BASE
+	hex
+	default 0x00000000 if EP93XX_CS0 && ! EP93XX_SYNC_BOOT
+	default 0x10000000 if EP93XX_CS1
+	default 0x20000000 if EP93XX_CS2
+	default 0x30000000 if EP93XX_CS3
+	default 0x60000000 if EP93XX_CS6
+	default 0x70000000 if EP93XX_CS7
+	default 0xf0000000 if EP93XX_CS0 && EP93XX_SYNC_BOOT
+
+config EP93XX_FLASH_SIZE
+	hex
+	default 0x01000000 if ARCH_EDB9301
+	default 0x01000000 if ARCH_EDB9302
+	default 0x02000000 if ARCH_EDB9307
+	default 0x02000000 if ARCH_EDB9312
+	default 0x02000000 if ARCH_EDB9315
+	default 0x01000000 if ARCH_EDB9315A
+	default 0x01000000 if ARCH_EDB9307A
+
+config EP93XX_PHYS_ADDR
+	hex
+	default 0x00000000 if EP93XX_SDCS3 && EP93XX_SYNC_BOOT
+	default 0xc0000000 if EP93XX_SDCS0
+	default 0xd0000000 if EP93XX_SDCS1
+	default 0xe0000000 if EP93XX_SDCS2
+	default 0xf0000000 if EP93XX_SDCS3 && ! EP93XX_SYNC_BOOT
+
+config EP93XX_ZREL_ADDR
+	hex
+	default 0x00008000 if EP93XX_SDCS3 && EP93XX_SYNC_BOOT
+	default 0xc0008000 if EP93XX_SDCS0
+	default 0xd0008000 if EP93XX_SDCS1
+	default 0xe0008000 if EP93XX_SDCS2
+	default 0xf0008000 if EP93XX_SDCS3 && ! EP93XX_SYNC_BOOT
+
+config EP93XX_PARAMS_PHYS
+	hex
+	default 0x00000100 if EP93XX_SDCS3 && EP93XX_SYNC_BOOT
+	default 0xc0000100 if EP93XX_SDCS0
+	default 0xd0000100 if EP93XX_SDCS1
+	default 0xe0000100 if EP93XX_SDCS2
+	default 0xf0000100 if EP93XX_SDCS3 && ! EP93XX_SYNC_BOOT
+
+config EP93XX_INITRD_PHYS
+	hex
+	default 0x01000000 if EP93XX_SDCS3 && EP93XX_SYNC_BOOT
+	default 0xc1000000 if EP93XX_SDCS0
+	default 0xd1000000 if EP93XX_SDCS1
+	default 0xe1000000 if EP93XX_SDCS2
+	default 0xf1000000 if EP93XX_SDCS3 && ! EP93XX_SYNC_BOOT
+
+endmenu
+
+endif
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/kgdb-serial.c linux-2.6.8.1/arch/arm/mach-ep93xx/kgdb-serial.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/kgdb-serial.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/kgdb-serial.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,64 @@
+/*
+ * tiny serial helper routines for kgdb
+ *
+ * Based on George G. Davis <gdavis@mvista.com> work.
+ */
+
+#include <linux/config.h>
+#include <asm/io.h>
+#include <asm/hardware/serial_amba.h>
+#include <asm/arch/regmap.h>
+#include <asm/arch/regs_syscon.h>
+
+#if defined(CONFIG_KGDB_UART0)
+#define KGDB_UART_BASE UART1_BASE
+#define KGDB_UART_ENABLE 0x00040000
+#elif defined(CONFIG_KGDB_UART1)
+#define KGDB_UART_BASE UART2_BASE
+#define KGDB_UART_ENABLE 0x00100000
+#elif defined(CONFIG_KGDB_UART2)
+#define KGDB_UART_BASE UART3_BASE
+#define KGDB_UART_ENABLE 0x01000000
+#else
+#error "No kgdb serial port UART has been selected."
+#endif
+
+#if defined(CONFIG_KGDB_9600BAUD)
+#define KGDB_SERIAL_BAUD_RATE ARM_BAUD_9600
+#elif defined(CONFIG_KGDB_19200BAUD)
+#define KGDB_SERIAL_BAUD_RATE ARM_BAUD_19200
+#elif defined(CONFIG_KGDB_38400BAUD)
+#define KGDB_SERIAL_BAUD_RATE ARM_BAUD_38400
+#elif defined(CONFIG_KGDB_57600BAUD)
+#define KGDB_SERIAL_BAUD_RATE ARM_BAUD_57600
+#elif defined(CONFIG_KGDB_115200BAUD)
+#define KGDB_SERIAL_BAUD_RATE ARM_BAUD_115200
+#else
+#error "kgdb serial baud rate has not been specified."
+#endif
+
+void kgdb_serial_init(void)
+{
+	unsigned int uiTemp;
+
+	uiTemp = inl(SYSCON_DEVCFG) | KGDB_UART_ENABLE;
+	outl(0xaa, SYSCON_SWLOCK);
+	outl(uiTemp, SYSCON_DEVCFG);
+	outl(KGDB_SERIAL_BAUD_RATE, KGDB_UART_BASE + AMBA_UARTLCR_L);
+	outl(0, KGDB_UART_BASE + AMBA_UARTLCR_M);
+	outl(AMBA_UARTLCR_H_WLEN_8 | AMBA_UARTLCR_H_FEN,
+	     KGDB_UART_BASE + AMBA_UARTLCR_H);
+	outl(AMBA_UARTCR_UARTEN, KGDB_UART_BASE + AMBA_UARTCR);
+}
+
+void kgdb_serial_putchar(unsigned char ch)
+{
+	while(inl(KGDB_UART_BASE + AMBA_UARTFR) & AMBA_UARTFR_TXFF);
+	outl(ch, KGDB_UART_BASE + AMBA_UARTDR);
+}
+
+unsigned char kgdb_serial_getchar(void)
+{
+	while(inl(KGDB_UART_BASE + AMBA_UARTFR) & AMBA_UARTFR_RXFE);
+	return(inl(KGDB_UART_BASE + AMBA_UARTDR) & 0xff);
+}
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/Makefile linux-2.6.8.1/arch/arm/mach-ep93xx/Makefile
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/Makefile	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/Makefile	2005-08-16 13:51:49.000000000 -0500
@@ -0,0 +1,14 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Object file lists.
+
+obj-y			:= arch.o irq.o mm.o time.o ssp.o dma_ep93xx.o pcmcia_io.o
+obj-m			:=
+obj-n			:=
+obj-			:=
+
+obj-$(CONFIG_EP93XX_FPU) += crunch.o
+obj-$(CONFIG_KGDB_SERIAL) += kgdb-serial.o
+
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/mm.c linux-2.6.8.1/arch/arm/mach-ep93xx/mm.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/mm.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/mm.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,55 @@
+/*
+ *  linux/arch/arm/mach-ep93xx/mm.c
+ *
+ *  Extra MM routines for the Cirrus EP93xx
+ *
+ *  Copyright (C) 1999,2000 Arm Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *  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
+ */
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/config.h>
+#include <linux/bootmem.h>
+
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <asm/arch/bits.h> 
+#include <asm/sizes.h> 
+#include <asm/arch/platform.h> 
+ 
+#include <asm/mach/map.h>
+
+/*
+ *  IO Map for EP93xx:
+ *
+ *  8000 0000 - 807f ffff = AHB peripherals  (8 Meg)
+ *  8080 0000 - 809f ffff = APB peripherals  (2 Meg)
+ *  a000 0000 - b000 0000 = PCMCIA space
+ */ 
+static struct map_desc ep93xx_io_desc[] __initdata = 
+{
+    { IO_BASE_VIRT,      IO_BASE_PHYS,      IO_SIZE,      MT_DEVICE },
+    { PCMCIA_BASE_VIRT,  PCMCIA_BASE_PHYS,  PCMCIA_SIZE,  MT_DEVICE }
+};
+
+void __init ep93xx_map_io(void)
+{
+	iotable_init(ep93xx_io_desc, ARRAY_SIZE(ep93xx_io_desc));
+}
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/pcmcia_io.c linux-2.6.8.1/arch/arm/mach-ep93xx/pcmcia_io.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/pcmcia_io.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/pcmcia_io.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,99 @@
+/*
+ *  linux/arch/arm/mach-ep93xx/pcmcia_io.c
+ *
+ * (c) Copyright 2004 Cirrus Logic, Inc., Austin, Tx 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/utsname.h>
+
+#include <asm/irq.h>
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/memory.h>
+#include <asm/arch/platform.h>
+
+#include <asm/mach/arch.h>
+
+#ifndef __EP93XX_PCMCIA_IDE_HACK__
+#define __EP93XX_PCMCIA_IDE_HACK__
+
+/*
+ * These routines are used to hack the default ide i/o routines in
+ * drivers/ide/ide-iops.h so they work with PCMCIA IDE.  Sad, but
+ * necessary.
+ */
+#define SET_PCMCIA_WIDTH_16_BIT \
+	unsigned long ulSMC_PCIO = inl( SMC_PCIO );	 \
+	if ( (ulSMC_PCIO & PCCONFIG_MW_16BIT)	== 0 ) {   \
+		outl( ulSMC_PCIO | PCCONFIG_MW_16BIT, SMC_PCIO ); \
+		ulSMC_PCIO = inl( SMC_PCIO ); \
+	}
+	
+#define SET_PCMCIA_WIDTH_8_BIT \
+	unsigned long ulSMC_PCIO = inl( SMC_PCIO );	\
+	if ( ulSMC_PCIO & PCCONFIG_MW_16BIT ) {		\
+		outl( ulSMC_PCIO & ~PCCONFIG_MW_16BIT, SMC_PCIO ); \
+		ulSMC_PCIO = inl( SMC_PCIO ); \
+	}
+
+
+inline u8 ep93xx_pcmcia_ide_inb (unsigned long port)
+{
+	SET_PCMCIA_WIDTH_8_BIT
+	return (u8) inb(port);
+}
+
+inline u16 ep93xx_pcmcia_ide_inw (unsigned long port)
+{
+	SET_PCMCIA_WIDTH_16_BIT
+	return (u16) inw(port);
+}
+
+inline void ep93xx_pcmcia_ide_insw (unsigned long port, void *addr, u32 count)
+{
+	SET_PCMCIA_WIDTH_16_BIT
+	return insw(port, addr, count);
+}
+
+inline void ep93xx_pcmcia_ide_outb (u8 addr, unsigned long port)
+{
+	SET_PCMCIA_WIDTH_8_BIT
+	outb(addr, port);
+	ulSMC_PCIO = inl( SMC_PCIO );
+}
+
+inline void ep93xx_pcmcia_ide_outw (u16 addr, unsigned long port)
+{
+	SET_PCMCIA_WIDTH_16_BIT
+	outw(addr, port);
+	ulSMC_PCIO = inl( SMC_PCIO );
+}
+
+inline void ep93xx_pcmcia_ide_outsw (unsigned long port, void *addr, u32 count)
+{
+	SET_PCMCIA_WIDTH_16_BIT
+	outsw(port, addr, count);
+	ulSMC_PCIO = inl( SMC_PCIO );
+}
+#endif /* __EP93XX_PCMCIA_IDE_HACK__ */
+
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/ssp.c linux-2.6.8.1/arch/arm/mach-ep93xx/ssp.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/ssp.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/ssp.c	2006-07-12 11:09:37.000000000 -0500
@@ -0,0 +1,970 @@
+/*
+ *  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.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(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 void  SetSSPtoFLASH(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;
+
+
+typedef enum{
+	SSP_MODE_UNKNOWN = 0,
+	SSP_MODE_PS2,
+	SSP_MODE_I2S,
+	SSP_MODE_FLASH,
+} SSPmodes_t;
+
+static struct timer_list g_KbdTimer;
+static SSPmodes_t gSSPmode = SSP_MODE_UNKNOWN;
+static SSPDataCallback gKeyCallback = 0;
+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
+//=============================================================================
+// This routine will get all of the keys out of the SPI FIFO.
+//=============================================================================
+static 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.
+	//
+	outl( 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", 0))
+	{
+		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(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((iLastValidHandle & ~SSP_DEVICE_MASK) == 0)
+	{
+		/*
+		 * If we wrapped around start over.  Unlikely.
+		 */
+		iLastValidHandle = 1;
+	}
+	
+	Handle = iLastValidHandle | (Device << SSP_DEVICE_SHIFT);
+
+	switch (Device)
+	{
+		case PS2_KEYBOARD:
+		{
+			DPRINTK("SSP_Open - PS2_KEYBOARD\n");
+			if (KeyboardHandle)
+			{
+				return(-1);
+			}
+			else
+			{
+				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);
+			}
+			else
+			{
+				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);
+			}
+			else
+			{
+				DPRINTK("Handle:%08x  Callback:%08x  -- Success\n",
+					Handle, (unsigned int)Callback);
+				FlashHandle = Handle;
+			}
+			break;
+		}
+		default:
+		{
+			return(-1);
+		}
+	}
+	
+	/*
+	 * Return the handle.
+	 */
+	return(Handle );
+}
+
+/*
+ * 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, 0);
+			gKeyCallback = 0;
+			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_FLASH
+(
+	int Handle,
+	unsigned int RegAddr,
+	unsigned int *pValue
+)
+{
+	SSPmodes_t saved_mode;
+
+	DPRINTK("SSP_Read_FLASH\n");
+
+	spin_lock(&ssp_spinlock);
+
+	/*
+	 * Save the SSP mode.  Switch to FLASH mode if we're not
+	 * already in FLASH mode.
+	 */
+	saved_mode = gSSPmode;
+	SetSSPtoFLASH();
+
+	/*
+	 * Let TX fifo clear out.  Poll the Transmit Fifo Empty bit.
+	 */
+	while( !( inl(SSPSR) & SSPSR_TFE ) )
+		barrier();
+
+	/*
+	 * Write the SPI read command.
+	 */
+	outl( 0x03, SSPDR );
+	outl( (RegAddr >> 16) & 255, SSPDR );
+	outl( (RegAddr >> 8) & 255, SSPDR );
+	outl( RegAddr & 255, SSPDR );
+
+	/*
+	 * Delay long enough for one byte to be transmitted.  It takes 7.6uS to
+	 * write a single byte.
+	 */
+	udelay(10);
+
+	/*
+	 * Read a byte to make sure the FIFO doesn't overrun.
+	 */
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	inl( SSPDR );
+
+	/*
+	 * Write four more bytes so that we can read four bytes.
+	 */
+	outl( 0, SSPDR );
+	outl( 0, SSPDR );
+	outl( 0, SSPDR );
+	outl( 0, SSPDR );
+
+	/*
+	 * Delay long enough for three bytes to be transmitted.  It takes 7.6uS
+	 * to write a single byte.
+	 */
+	udelay(25);
+
+	/*
+	 * Read three and throw away the next tree bytes.
+	 */
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	inl( SSPDR );
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	inl( SSPDR );
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	inl( SSPDR );
+
+	/*
+	 * Delay long enough for four bytes to be transmitted.  It takes 7.6uS
+	 * to write a single byte.
+	 */
+	udelay(30);
+
+	/*
+	 * Read the data word.
+	 */
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	*pValue = inl( SSPDR );
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	*pValue |= inl( SSPDR ) << 8;
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	*pValue |= inl( SSPDR ) << 16;
+	while( !( inl(SSPSR) & SSPSR_RNE ) )
+		barrier();
+	*pValue |= inl( SSPDR ) << 24;
+
+	/*
+	 * Wait until the transmit buffer is empty (it should be...).
+	 */
+	while( !( inl(SSPSR) & SSPSR_TFE ) )
+		barrier();
+
+	/*
+	 * Read any residual bytes in the receive buffer.
+	 */
+	while( inl(SSPSR) & SSPSR_RNE )
+		inl( SSPDR );
+	
+	/*
+	 * 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 success.
+	 */
+	return 0;
+}
+
+static int SSP_Read(int Handle, unsigned int Addr, unsigned int *pValue)
+{
+	DPRINTK("SSP_Read\n");
+
+	/*
+	 * Find out which device this API was called for.
+	 */
+	switch( CheckHandle(Handle) )
+	{
+		case SERIAL_FLASH:
+		{
+			return SSP_Read_FLASH(Handle, Addr, pValue);
+		}
+		default:
+		{
+			return -1;
+		}
+	}
+}
+
+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
+	 */
+	outl( 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 EDB9301, EDB9312, and EDB9315.
+	//
+	uiRegTemp = inl(GPIO_PADDR);
+	outl( uiRegTemp | 0x80, GPIO_PADDR );
+
+	uiRegTemp = inl(GPIO_PADR);
+	outl( uiRegTemp | 0x80, GPIO_PADR );
+
+	/*
+	 * Disable SFRM1 to I2S codec by setting EGPIO8 (port B, bit 0).
+	 * The EDB9315 board needs this but is harmless on the EDB9312 board.
+	 */
+#if defined(CONFIG_ARCH_EDB9307) || defined(CONFIG_ARCH_EDB9312) || defined(CONFIG_ARCH_EDB9315)
+	uiRegTemp = inl(GPIO_PBDDR) | 0x01;
+	outl( uiRegTemp, GPIO_PBDDR );
+
+	uiRegTemp = inl(GPIO_PBDR) | 0x01;
+	outl( uiRegTemp, GPIO_PBDR );
+	
+	uiRegTemp = inl(GPIO_PBDR);
+#endif
+
+	/*
+	 * Disable SFRM1 to I2S codec I2S by setting EGPIO6 (port A, bit 6).
+	 * The EDB9301 board needs this
+	 */
+#if defined(CONFIG_ARCH_EDB9301) || defined(CONFIG_ARCH_EDB9302)|| \
+   defined(CONFIG_ARCH_EDB9302A) || defined(CONFIG_ARCH_EDB9307A) || defined(CONFIG_ARCH_EDB9315A) 
+	uiRegTemp = inl(GPIO_PADDR);
+	outl( uiRegTemp | 0x40, GPIO_PADDR );
+
+	uiRegTemp = inl(GPIO_PADR);
+	outl( uiRegTemp | 0x40, GPIO_PADR );
+
+	uiRegTemp = inl(GPIO_PADR);
+#endif
+
+	/*
+	 * Still haven't enabled the keyboard.  So anything in
+	 * the rx fifo is garbage.  Time to take out the trash.
+	 */
+	while( inl(SSPSR) & SSPSR_RNE )
+	{
+		uiRegTemp = inl(SSPDR);
+	}
+
+	/*
+	 * SPICR0_SPO - SCLKOUT Polarity
+	 * SPICR0_SPH - SCLKOUT Phase
+	 * Motorola format, 11 bit, one start, 8 data, one bit for
+	 * parity, one stop bit.
+	 */
+	outl( (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.
+	 */
+	outl( (SSPC1_MS | SSPC1_RIE | SSPC1_SOD), SSPCR1 );
+	outl( 0, SSPIIR );
+	outl( (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 = inl(GPIO_PBDDR);
+	outl( uiRegTemp | 0x50, GPIO_PBDDR );
+
+	uiRegTemp = inl(GPIO_PBDR);
+	outl( uiRegTemp & ~0x50, GPIO_PBDR );
+
+	gSSPmode = SSP_MODE_PS2;
+}
+
+static void SetSSPtoI2S(void)
+{
+	unsigned int uiRegTemp;
+
+	if( gSSPmode == SSP_MODE_I2S )
+	{
+		return;
+	}
+	
+	/*
+	 * Disable recieve interrupts.
+	 */
+	outl( (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 = inl(GPIO_PBDR);
+	outl( 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( inl(SSPSR) & SSPSR_RNE )
+	{
+		uiRegTemp = inl(SSPDR);
+	}
+	
+	/*
+	 * Disable the SSP and disable interrupts
+	 */
+	outl( 0, SSPCR1 );
+
+	/*
+	 * Clock will be 14.7 MHz divided by 4.
+	 */
+	outl( 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 on EDB9312.  On EDB9301 and EDB9315 it
+	 * disables EEPROM but doesn't select anything.
+	 */
+	uiRegTemp = inl(GPIO_PADDR);
+	outl( uiRegTemp | 0x80, GPIO_PADDR );
+
+	uiRegTemp = inl(GPIO_PADR);
+	outl( uiRegTemp | 0x80, GPIO_PADR );
+
+	/*
+	 * Enable SFRM1 to I2S codec by clearing EGPIO8 (port B, bit 0).
+	 * The EDB9315 board needs this but is harmless on the EDB9312 board.
+	 */
+#if defined(CONFIG_ARCH_EDB9307) || defined(CONFIG_ARCH_EDB9312) || defined(CONFIG_ARCH_EDB9315)
+	uiRegTemp = inl(GPIO_PBDDR) | 0x01;
+	outl( uiRegTemp, GPIO_PBDDR );
+
+	uiRegTemp = inl(GPIO_PBDR) & 0xfe;
+	outl( uiRegTemp, GPIO_PBDR );
+	
+	uiRegTemp = inl(GPIO_PBDR);
+#endif
+
+	/*
+	 * Enable SFRM1 to I2S codec I2S by clearing EGPIO6 (port A, bit 6).
+	 * The EDB9301 board needs this
+	 */
+#if defined(CONFIG_ARCH_EDB9301) || defined(CONFIG_ARCH_EDB9302) || \
+    defined(CONFIG_ARCH_EDB9302A) || defined(CONFIG_ARCH_EDB9307A) || defined(CONFIG_ARCH_EDB9315A)
+	uiRegTemp = inl(GPIO_PADDR);
+	outl( uiRegTemp | 0x40, GPIO_PADDR );
+
+	uiRegTemp = inl(GPIO_PADR);
+	outl( uiRegTemp & ~0x40, GPIO_PADR );
+
+	uiRegTemp = inl(GPIO_PADR);
+#endif
+
+	/*
+	 * Motorola format, 8 bit.
+	 */
+	outl( (SSPCR0_SPO | SSPCR0_SPH | SSPCR0_FRF_MOTOROLA | SSPCR0_DSS_8BIT),
+	      SSPCR0 );
+
+	/*
+	 * Configure the device as master, reenable the device.
+	 */
+	outl( SSPC1_SSE, SSPCR1 );
+
+	gSSPmode = SSP_MODE_I2S;
+
+	udelay(10);
+}
+
+static void SetSSPtoFLASH(void)
+{
+	unsigned int uiRegTemp;
+
+	if( gSSPmode == SSP_MODE_FLASH)
+		return;
+
+	/*
+	 * Disable recieve interrupts.
+	 */
+	outl( (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.
+	 */
+	outl( inl(GPIO_PBDR) | 0x50, 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( inl(SSPSR) & SSPSR_RNE )
+		inl(SSPDR);
+	
+	/*
+	 * Disable the SSP and disable interrupts
+	 */
+	outl( 0, SSPCR1 );
+
+	/*
+	 * Clock will be 14.7 MHz divided by 14.
+	 */
+	outl( 2, SSPCPSR );
+
+	/*
+	 * Configure EGPIO7 as an output and clear it.  This selects
+	 * serial flash as the device on the SSP output instead of
+	 * the I2S codec and is valid for EDB9301, EDB9312, and EDB9315.
+	 */
+	outl( inl(GPIO_PADDR) | 0x80, GPIO_PADDR );
+	outl( inl(GPIO_PADR) & ~0x80, GPIO_PADR );
+
+	/*
+	 * Disable SFRM1 to I2S codec by setting EGPIO8 (port B, bit 0).
+	 * The EDB9315 board needs this but is harmless on the EDB9312 board.
+	 */
+#if defined(CONFIG_ARCH_EDB9307) || defined(CONFIG_ARCH_EDB9312) || defined(CONFIG_ARCH_EDB9315)
+	uiRegTemp = inl(GPIO_PBDDR) | 0x01;
+	outl( uiRegTemp, GPIO_PBDDR );
+
+	uiRegTemp = inl(GPIO_PBDR) | 0x01;
+	outl( uiRegTemp, GPIO_PBDR );
+	
+	uiRegTemp = inl(GPIO_PBDR);
+#endif
+
+	/*
+	 * Disable SFRM1 to I2S codec I2S by setting EGPIO6 (port A, bit 6).
+	 * The EDB9301 board needs this
+	 */
+#if defined(CONFIG_ARCH_EDB9301) || defined(CONFIG_ARCH_EDB9302) || \
+    defined(CONFIG_ARCH_EDB9302A) || defined(CONFIG_ARCH_EDB9307A) || defined(CONFIG_ARCH_EDB9315A)
+	uiRegTemp = inl(GPIO_PADDR);
+	outl( uiRegTemp | 0x40, GPIO_PADDR );
+
+	uiRegTemp = inl(GPIO_PADR);
+	outl( uiRegTemp | 0x40, GPIO_PADR );
+
+	uiRegTemp = inl(GPIO_PBDR);
+#endif
+
+	/*
+	 * Motorola format, 8 bit.
+	 */
+	outl( ((6 << SSPCR0_SCR_SHIFT) | SSPCR0_SPO | SSPCR0_SPH |
+	       SSPCR0_FRF_MOTOROLA | SSPCR0_DSS_8BIT),
+	      SSPCR0 );
+
+	/*
+	 * Configure the device as master, reenable the device.
+	 */
+	outl( SSPC1_SSE, SSPCR1 );
+
+	gSSPmode = SSP_MODE_FLASH;
+
+	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);
+
+	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( inl(SSPSR) & SSPSR_RNE)
+	{
+		/*
+		 * Read in the value from the SPI controller into
+		 * the partial key buffer.
+		 */
+		uiKeyBuffer[count] = inl(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 = inl(GPIO_PBDR);
+			outl( 0x50 | uiRegTemp, GPIO_PBDR );
+
+			outl( 0, SSPCR1 );
+			outl( (SSPC1_MS | SSPC1_RIE | SSPC1_SSE), SSPCR1 );
+
+			/*
+			 * Clear EGPIO pins 12 and 14, this will enable the SPI keyboard.
+			 */
+			uiRegTemp = inl(GPIO_PBDR);
+			outl( 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
+)
+{
+	SSPmodes_t 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( !( inl(SSPSR) & SSPSR_TFE ) );
+	
+	/*
+	 * Write the data out to the tx fifo.
+	 */
+	outl( 0x20, SSPDR ); /* chip address for CS4228 */
+	outl( (RegAddr & 0xff), SSPDR );
+	outl( (RegValue & 0xff), SSPDR );
+
+	/*
+	 * Let TX fifo clear out.  Poll the Transmit Fifo Empty bit.
+	 */
+	while( !( inl(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 success.
+	 */
+	return 0;
+}
diff -burN linux-2.6.8.1.orig/arch/arm/mach-ep93xx/time.c linux-2.6.8.1/arch/arm/mach-ep93xx/time.c
--- linux-2.6.8.1.orig/arch/arm/mach-ep93xx/time.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/arch/arm/mach-ep93xx/time.c	2004-11-03 09:28:04.000000000 -0600
@@ -0,0 +1,68 @@
+/*
+ *  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/timex.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/sched.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include <asm/mach/time.h>
+
+/*
+ * gettimeoffset() returns time since last timer tick, in usecs.
+ *
+ * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy.
+ * 'tick' is usecs per jiffy.
+ */
+static unsigned long ep93xx_gettimeoffset(void)
+{
+	unsigned long hwticks;
+	hwticks = LATCH - (inl(TIMER1VALUE) & 0xffff);
+	return (hwticks * (tick_nsec / 1000)) / LATCH;
+}
+
+/*
+ * IRQ handler for the timer
+ */
+static irqreturn_t
+ep93xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	outl(1, TIMER1CLEAR);
+	timer_tick(regs);
+	return IRQ_HANDLED;
+}
+
+static struct irqaction ep93xx_timer_irq = {
+	.name		= "timer tick",
+	.flags		= SA_INTERRUPT,
+	.handler	= ep93xx_timer_interrupt
+};
+
+void __init ep93xx_init_time(void)
+{
+	struct timespec tv;
+
+	outl(0, TIMER1CONTROL);
+	outl(LATCH - 1, TIMER1LOAD);
+	outl(0xc8, TIMER1CONTROL);
+
+	setup_irq(IRQ_TIMER1, &ep93xx_timer_irq);
+	gettimeoffset = ep93xx_gettimeoffset;
+
+	tv.tv_nsec = 0;
+	tv.tv_sec = inl(RTCDR);
+	do_settimeofday(&tv);
+}
diff -burN linux-2.6.8.1.orig/arch/arm/Makefile linux-2.6.8.1/arch/arm/Makefile
--- linux-2.6.8.1.orig/arch/arm/Makefile	2004-08-14 05:55:10.000000000 -0500
+++ linux-2.6.8.1/arch/arm/Makefile	2005-08-15 13:41:41.000000000 -0500
@@ -55,8 +55,8 @@
 tune-$(CONFIG_CPU_V6)		:=-mtune=strongarm
 
 # Need -Uarm for gcc < 3.x
-CFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Wa,-mno-fpu -Uarm
-AFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) -msoft-float -Wa,-mno-fpu
+CFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm
+AFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) -msoft-float
 
 CHECK		:= $(CHECK) -D__arm__=1
 
@@ -94,6 +94,7 @@
  machine-$(CONFIG_ARCH_S3C2410)	   := s3c2410
  machine-$(CONFIG_ARCH_LH7A40X)	   := lh7a40x
  machine-$(CONFIG_ARCH_VERSATILE_PB) := versatile
+ machine-$(CONFIG_ARCH_EP93XX)     := ep93xx
 
 ifeq ($(CONFIG_ARCH_EBSA110),y)
 # This is what happens if you forget the IOCS16 line.
diff -burN linux-2.6.8.1.orig/arch/arm/mm/Kconfig linux-2.6.8.1/arch/arm/mm/Kconfig
--- linux-2.6.8.1.orig/arch/arm/mm/Kconfig	2004-08-14 05:55:10.000000000 -0500
+++ linux-2.6.8.1/arch/arm/mm/Kconfig	2004-11-03 09:28:04.000000000 -0600
@@ -58,9 +58,9 @@
 
 # ARM920T
 config CPU_ARM920T
-	bool "Support ARM920T processor" if !ARCH_S3C2410
-	depends on ARCH_INTEGRATOR || ARCH_S3C2410
-	default y if ARCH_S3C2410
+	bool "Support ARM920T processor" if !ARCH_S3C2410 && !ARCH_EP93XX
+	depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_EP93XX
+	default y if ARCH_S3C2410 || ARCH_EP93XX
 	select CPU_32v4
 	select CPU_ABRT_EV4T
 	select CPU_CACHE_V4WT
diff -burN linux-2.6.8.1.orig/arch/arm/mm/mm-armv.c linux-2.6.8.1/arch/arm/mm/mm-armv.c
--- linux-2.6.8.1.orig/arch/arm/mm/mm-armv.c	2004-08-14 05:55:35.000000000 -0500
+++ linux-2.6.8.1/arch/arm/mm/mm-armv.c	2005-11-23 14:56:06.000000000 -0600
@@ -531,6 +531,12 @@
 		p->virtual    = __phys_to_virt(p->physical);
 		p->length     = mi->bank[i].size;
 		p->type       = MT_MEMORY;
+		
+		printk("	bank %d start at 0x%08x, length 0x%08x, mapped to 0x%08x\n", i
+											   , (int) p->physical
+											   , (int) p->length
+											   , (int) p->virtual);
+				
 		p ++;
 	}
 
diff -burN linux-2.6.8.1.orig/arch/arm/tools/mach-types linux-2.6.8.1/arch/arm/tools/mach-types
--- linux-2.6.8.1.orig/arch/arm/tools/mach-types	2004-08-14 05:55:32.000000000 -0500
+++ linux-2.6.8.1/arch/arm/tools/mach-types	2006-08-30 13:29:35.000000000 -0500
@@ -559,3 +559,7 @@
 switchgrass		MACH_SWITCHGRASS	SWITCHGRASS		549
 ens_cmu			MACH_ENS_CMU		ENS_CMU			550
 mm6_sdb			MACH_MM6_SDB		MM6_SDB			551
+edb9315a		MACH_EDB9315A		EDB9315A		772
+edb9307                 MACH_EDB9307            EDB9307                 607
+edb9302a                MACH_EDB9302A           EDB9302A                1127
+edb9307a                MACH_EDB9307A           EDB9307A                1128
diff -burN linux-2.6.8.1.orig/drivers/char/ep93xx_rtc.c linux-2.6.8.1/drivers/char/ep93xx_rtc.c
--- linux-2.6.8.1.orig/drivers/char/ep93xx_rtc.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/char/ep93xx_rtc.c	2006-09-07 01:07:21.000000000 -0500
@@ -0,0 +1,359 @@
+/*
+ *	Driver for the EP93xx I2C bus RTC device interface
+ *
+ *	Copyright (C) 2006 Cirrus Logic, Co.
+ *	Written by Shrek Wu
+ *	Real Time Clock interface for Linux
+ *
+ *	TODO: Implement periodic interrupts.
+ *	based on /driver/char/ip-rtc.c
+ *	Copyright (C) 2000 Silicon Graphics, Inc.
+ *	Written by Ulf Carlsson (ulfc@engr.sgi.com)
+ *
+ *	Based on code written by Paul Gortmaker.
+ *
+ *	This driver allows use of the real time clock (built into
+ *	nearly all computers) from user space. It exports the /dev/rtc
+ *	interface supporting various ioctl() and also the /proc/rtc
+ *	pseudo-file for status information.
+ *
+ *	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.
+ *
+ */
+
+#define RTC_VERSION		"1.09b"
+
+#include <linux/bcd.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/miscdevice.h>
+#include <linux/ioport.h>
+#include <linux/fcntl.h>
+#include <linux/rtc.h>
+#include <linux/init.h>
+#include <linux/poll.h>
+#include <linux/proc_fs.h>
+#include <linux/smp_lock.h>
+
+#include <linux/rtc_isl1208.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+
+spinlock_t ep93xx_rtc_lock;
+
+static int rtc_ioctl(struct inode *inode, struct file *file,
+		     unsigned int cmd, unsigned long arg);
+
+static int rtc_read_proc(char *page, char **start, off_t off,
+                         int count, int *eof, void *data);
+
+static void get_rtc_time(struct rtc_time *rtc_tm);
+
+/*
+ *	Bits in rtc_status. (6 bits of room for future expansion)
+ */
+
+#define RTC_IS_OPEN		0x01	/* means /dev/rtc is in use	*/
+#define RTC_TIMER_ON		0x02	/* missed irq timer active	*/
+
+static unsigned char rtc_status;	/* bitmapped status byte.	*/
+static unsigned long rtc_freq;	/* Current periodic IRQ rate	*/
+
+
+/*
+ *	If this driver ever becomes modularised, it will be really nice
+ *	to make the epoch retain its value across module reload...
+ */
+
+static unsigned long epoch = 1970;	/* year corresponding to 0x00	*/
+
+static const unsigned char days_in_mo[] =
+{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+
+
+
+static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+		     unsigned long arg)
+{
+
+	struct rtc_time wtime;
+#ifdef EP93xx_RTC_debug
+	printk("ioctol %x\n",cmd);
+#endif
+	switch (cmd) {
+	case RTC_RD_TIME:	/* Read the time/date from RTC	*/
+	{
+		get_rtc_time(&wtime);
+		break;
+	}
+	case RTC_SET_TIME:	/* Set the RTC */
+	{
+		int err=0;
+		struct rtc_time rtc_tm;
+		unsigned char mon, day, hrs, min, sec, leap_yr;
+		unsigned int yrs;
+
+		if (!capable(CAP_SYS_TIME)){
+			printk("%s: line %d ",__FUNCTION__,__LINE__);
+			return -EACCES;
+			}
+
+		if (copy_from_user(&rtc_tm, (struct rtc_time*)arg,
+				   sizeof(struct rtc_time))){
+			printk("%s line %d:copy from user fail ",__FUNCTION__,__LINE__);
+			return -EFAULT;
+			}
+			
+#ifdef EP93xx_RTC_debug			
+		printk("rtc_time: %02d:%02d:%02d\n rtc_date: %04d-%02d-%02d\n",
+		     rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec,
+		     rtc_tm.tm_year + 1900, rtc_tm.tm_mon + 1, rtc_tm.tm_mday);
+#endif		     
+		yrs = rtc_tm.tm_year + 1900;
+		mon = rtc_tm.tm_mon + 1;   /* tm_mon starts at zero */
+		day = rtc_tm.tm_mday;
+		hrs = rtc_tm.tm_hour;
+		min = rtc_tm.tm_min;
+		sec = rtc_tm.tm_sec;
+
+		if (yrs < 1970){
+			printk("yrs < 1970\n");
+			return -EINVAL;
+			}
+
+		leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
+
+		if ((mon > 12) || (day == 0)){
+			printk("(mon > 12) || (day == 0)\n");
+			return -EINVAL;
+			}
+
+		if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))){
+			printk("day > (days_in_mo[mon] + ((mon == 2) && leap_yr)\n");
+			return -EINVAL;
+			}
+
+		if ((hrs >= 24) || (min >= 60) || (sec >= 60)){
+			printk("((hrs >= 24) || (min >= 60) || (sec >= 60))\n");
+			return -EINVAL;
+			}
+
+		if ((yrs -= epoch) > 255){    /* They are unsigned */
+			printk("(yrs -= epoch) > 255\n");
+			return -EINVAL;
+			}
+
+		/*if (yrs > 169)
+			return -EINVAL;
+
+		if (yrs >= 100)
+			yrs -= 100;
+		*/
+		//sec = BIN2BCD(sec);
+		//min = BIN2BCD(min);
+		//hrs = BIN2BCD(hrs);
+		//day = BIN2BCD(day);
+		//mon = BIN2BCD(mon);
+		//yrs = BIN2BCD(yrs);
+
+		spin_lock_irq(&ep93xx_rtc_lock);
+		/*
+		rtc_tm.tm_year = yrs;
+		rtc_tm.tm_mon  = mon;   
+		rtc_tm.tm_mday = day;
+		rtc_tm.tm_hour = hrs;
+		rtc_tm.tm_min = min;
+		rtc_tm.tm_sec = sec;
+		*/
+		err = isl1208_do_command(RTC_SETDATETIME, (void *)&rtc_tm);
+		if(err!=0){
+			printk("%s: do command error:%d\n",__FUNCTION__,err);
+		}
+
+		spin_unlock_irq(&ep93xx_rtc_lock);
+
+		return 0;
+	}
+	default:{
+		printk("the command do not support now\n");
+		return -EINVAL;
+		}
+	}
+	return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
+}
+
+/*
+ *	We enforce only one user at a time here with the open/close.
+ *	Also clear the previous interrupt data on an open, and clean
+ *	up things on a close.
+ */
+
+static int rtc_open(struct inode *inode, struct file *file)
+{
+#ifdef EP93xx_RTC_debug
+	printk("%s\n",__FUNCTION__);
+#endif
+	spin_lock_irq(&ep93xx_rtc_lock);
+
+	if (rtc_status & RTC_IS_OPEN) {
+		spin_unlock_irq(&ep93xx_rtc_lock);
+		return -EBUSY;
+	}
+
+	rtc_status |= RTC_IS_OPEN;
+	spin_unlock_irq(&ep93xx_rtc_lock);
+
+	return 0;
+}
+
+static int rtc_release(struct inode *inode, struct file *file)
+{
+	/*
+	 * Turn off all interrupts once the device is no longer
+	 * in use, and clear the data.
+	 */
+
+	spin_lock_irq(&ep93xx_rtc_lock);
+	rtc_status &= ~RTC_IS_OPEN;
+	spin_unlock_irq(&ep93xx_rtc_lock);
+
+	return 0;
+}
+
+/*
+ *	The various file operations we support.
+ */
+
+static struct file_operations rtc_fops = {
+	.owner		= THIS_MODULE,
+	.ioctl		= rtc_ioctl,
+	.open		= rtc_open,
+	.release	= rtc_release,
+};
+
+static struct miscdevice rtc_dev=
+{
+	RTC_MINOR,
+	"rtc",
+	&rtc_fops
+};
+
+static int __init rtc_init(void)
+{
+
+#ifdef EP93xx_RTC_debug
+	printk("Real Time Clock Driver v%s\n", RTC_VERSION);
+#endif	
+	if (misc_register(&rtc_dev)) {
+		printk(KERN_ERR "rtc: cannot register misc device.\n");
+		return -ENODEV;
+	}
+	if (!create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL)) {
+		printk(KERN_ERR "rtc: cannot create /proc/rtc.\n");
+		misc_deregister(&rtc_dev);
+		return -ENOENT;
+	}
+
+	printk("EP93xx RTC file system driver\n");
+
+	rtc_freq = 1024;
+
+	return 0;
+}
+
+static void __exit rtc_exit (void)
+{
+	/* interrupts and timer disabled at this point by rtc_release */
+
+	remove_proc_entry ("rtc", NULL);
+	misc_deregister(&rtc_dev);
+}
+
+module_init(rtc_init);
+module_exit(rtc_exit);
+
+/*
+ *	Info exported via "/proc/rtc".
+ */
+
+static int rtc_get_status(char *buf)
+{
+	char *p;
+	struct rtc_time tm;
+
+	/*
+	 * Just emulate the standard /proc/rtc
+	 */
+
+	p = buf;
+
+	get_rtc_time(&tm);
+
+	/*
+	 * There is no way to tell if the luser has the RTC set for local
+	 * time or for Universal Standard Time (GMT). Probably local though.
+	 */
+	p += sprintf(p,
+		     "rtc_time\t: %02d:%02d:%02d\n"
+		     "rtc_date\t: %04d-%02d-%02d\n"
+	 	     "rtc_epoch\t: %04lu\n"
+		     "24hr\t\t: yes\n",
+		     tm.tm_hour, tm.tm_min, tm.tm_sec,
+		     tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch);
+
+	return  p - buf;
+}
+
+static int rtc_read_proc(char *page, char **start, off_t off,
+                                 int count, int *eof, void *data)
+{
+        int len = rtc_get_status(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 void get_rtc_time(struct rtc_time *rtc_tm)
+{
+	/*
+	 * Do we need to wait for the last update to finish?
+	 */
+	int err=0;
+	/*
+	 * Only the values that we read from the RTC are set. We leave
+	 * tm_wday, tm_yday and tm_isdst untouched. Even though the
+	 * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated
+	 * by the RTC when initially set to a non-zero value.
+	 */
+#ifdef EP93xx_RTC_debug	 
+	printk("%s:\n",__FUNCTION__);
+#endif	
+	spin_lock_irq(&ep93xx_rtc_lock);
+	
+	err = isl1208_do_command(RTC_GETDATETIME, (void *)rtc_tm);
+	if(err!=0){
+		printk("%s: do command error:%d\n",__FUNCTION__,err);
+	}
+	spin_unlock_irq(&ep93xx_rtc_lock);
+
+
+
+	/*
+	 * Account for differences between how the RTC uses the values
+	 * and how they are defined in a struct rtc_time;
+	 */
+	//if ((rtc_tm->tm_year += (epoch - 1900)) <= 69)
+	//	rtc_tm->tm_year += 100;
+
+	//rtc_tm->tm_mon--;
+}
diff -burN linux-2.6.8.1.orig/drivers/char/Kconfig linux-2.6.8.1/drivers/char/Kconfig
--- linux-2.6.8.1.orig/drivers/char/Kconfig	2004-08-14 05:54:47.000000000 -0500
+++ linux-2.6.8.1/drivers/char/Kconfig	2006-10-10 12:28:29.000000000 -0500
@@ -754,6 +754,16 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called rtc.
 
+config EP93XX_RTC
+	bool "RTC for Intersil 1208 device on Cirrus Logic EP93xx boards"
+	depends on ARCH_EP93XX
+	help
+	If you say Y here and create a character special file /dev/rtc with
+	major number 10 and minor number 135 using mknod ("man mknod"), you
+	will get access to the external Intersil 1208 RTC on the Cirrus Logic Lowcost Boards
+       	via the file /proc/rtc and its behaviour is set by various ioctls on
+	/dev/rtc.
+
 config SGI_DS1286
 	tristate "SGI DS1286 RTC support"
 	depends on SGI_IP22
diff -burN linux-2.6.8.1.orig/drivers/char/Makefile linux-2.6.8.1/drivers/char/Makefile
--- linux-2.6.8.1.orig/drivers/char/Makefile	2004-08-14 05:56:22.000000000 -0500
+++ linux-2.6.8.1/drivers/char/Makefile	2006-10-10 12:28:49.000000000 -0500
@@ -44,7 +44,7 @@
 obj-$(CONFIG_VIOCONS) += viocons.o
 obj-$(CONFIG_VIOTAPE)		+= viotape.o
 obj-$(CONFIG_HVCS)		+= hvcs.o
-
+obj-$(CONFIG_EP93XX_RTC)	+= ep93xx_rtc.o
 obj-$(CONFIG_PRINTER) += lp.o
 obj-$(CONFIG_TIPAR) += tipar.o
 
diff -burN linux-2.6.8.1.orig/drivers/i2c/busses/i2c-ep93xx.c linux-2.6.8.1/drivers/i2c/busses/i2c-ep93xx.c
--- linux-2.6.8.1.orig/drivers/i2c/busses/i2c-ep93xx.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/i2c/busses/i2c-ep93xx.c	2006-06-15 14:04:07.000000000 -0500
@@ -0,0 +1,192 @@
+/* ------------------------------------------------------------------------ *
+ * 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>
+
+//1/(2*clockfrequency)
+#define EE_DELAY_USEC       50
+#define GPIOG_EECLK 1
+#define GPIOG_EEDAT 2
+
+/* ----- I2C algorithm call-back functions and structures ----------------- */
+
+// TODO: optimize
+static void ep93xx_setscl(void *data, int state)
+{
+	unsigned int uiPGDR, uiPGDDR;
+
+	uiPGDR = inl(GPIO_PGDR);
+	uiPGDDR = inl(GPIO_PGDDR);
+
+	/* Configure the clock line as output. */
+	uiPGDDR |= GPIOG_EECLK;
+	outl(uiPGDDR, GPIO_PGDDR);
+
+	/* Set clock line to state */
+	if(state)
+		uiPGDR |= GPIOG_EECLK;
+	else
+		uiPGDR &= ~GPIOG_EECLK;
+	
+	outl(uiPGDR, GPIO_PGDR);
+}
+
+static void ep93xx_setsda(void *data, int state)
+{
+	unsigned int uiPGDR, uiPGDDR;
+	
+	uiPGDR = inl(GPIO_PGDR);
+	uiPGDDR = inl(GPIO_PGDDR);
+
+	/* Configure the data line as output. */
+	uiPGDDR |= GPIOG_EEDAT;
+	outl(uiPGDDR, GPIO_PGDDR);
+
+	/* Set data line to state */
+	if(state)
+		uiPGDR |= GPIOG_EEDAT;
+	else
+		uiPGDR &= ~GPIOG_EEDAT;
+	
+	outl(uiPGDR, GPIO_PGDR);
+}
+
+static int ep93xx_getscl(void *data)
+{
+	unsigned int uiPGDR, uiPGDDR;
+	
+	uiPGDR = inl(GPIO_PGDR);
+	uiPGDDR = inl(GPIO_PGDDR);
+
+	/* Configure the clock line as input */
+	uiPGDDR &= ~GPIOG_EECLK;
+	outl(uiPGDDR, GPIO_PGDDR);
+	
+	/* Return state of the clock line */
+	return (inl(GPIO_PGDR) & GPIOG_EECLK) ? 1 : 0;
+}
+
+static int ep93xx_getsda(void *data)
+{
+	unsigned int uiPGDR, uiPGDDR;
+	uiPGDR = inl(GPIO_PGDR);
+	uiPGDDR = inl(GPIO_PGDDR);
+
+	/* Configure the data line as input */
+	uiPGDDR &= ~GPIOG_EEDAT;
+	outl(uiPGDDR, GPIO_PGDDR);
+
+	/* Return state of the data line */
+	return (inl(GPIO_PGDR) & GPIOG_EEDAT) ? 1 : 0;
+}
+
+/* ------------------------------------------------------------------------
+ * Encapsulate the above functions in the correct operations structure.
+ * This is only done when more than one hardware adapter is supported.
+ */
+
+/* last line (us, ms, timeout)
+ * us dominates the bit rate: 10us  means: 100Kbit/sec(25 means 40kbps)
+ *                            10ms  not known
+ *                            100ms timeout
+ */
+static struct i2c_algo_bit_data ep93xx_data = {
+	.setsda		= ep93xx_setsda,
+	.setscl		= ep93xx_setscl,
+	.getsda		= ep93xx_getsda,
+	.getscl		= ep93xx_getscl,
+	.udelay		= 10,
+	.mdelay		= 10,
+	.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_data,
+	.name		= "EP93XX I2C bit-bang interface",
+};
+
+/* ----- Module loading, unloading and information ------------------------ */
+
+static int __init i2c_ep93xx_init(void)
+{
+	unsigned long uiPGDR, uiPGDDR;
+	
+	/* Read the current value of the GPIO data and data direction registers. */
+	uiPGDR = inl(GPIO_PGDR);
+	uiPGDDR = inl(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. */
+	uiPGDR |= (GPIOG_EEDAT | GPIOG_EECLK);
+	outl(uiPGDR, GPIO_PGDR);
+
+	/* Delay to meet the EE Interface timing specification. */
+	udelay(EE_DELAY_USEC);
+
+	
+	/* Configure the EE data and clock lines as outputs. */
+	uiPGDDR |= (GPIOG_EEDAT | GPIOG_EECLK);
+	outl(uiPGDDR, 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 -burN linux-2.6.8.1.orig/drivers/i2c/busses/Kconfig linux-2.6.8.1/drivers/i2c/busses/Kconfig
--- linux-2.6.8.1.orig/drivers/i2c/busses/Kconfig	2004-08-14 05:56:00.000000000 -0500
+++ linux-2.6.8.1/drivers/i2c/busses/Kconfig	2006-06-08 13:21:47.000000000 -0500
@@ -5,6 +5,10 @@
 menu "I2C Hardware Bus support"
 	depends on I2C
 
+config I2C_EP93XX
+	tristate "EP93XX I2C"
+	depends on I2C && ARCH_EP93XX
+
 config I2C_ALI1535
 	tristate "ALI 1535"
 	depends on I2C && PCI && EXPERIMENTAL
diff -burN linux-2.6.8.1.orig/drivers/i2c/busses/Makefile linux-2.6.8.1/drivers/i2c/busses/Makefile
--- linux-2.6.8.1.orig/drivers/i2c/busses/Makefile	2004-08-14 05:54:48.000000000 -0500
+++ linux-2.6.8.1/drivers/i2c/busses/Makefile	2006-06-08 13:21:47.000000000 -0500
@@ -32,7 +32,7 @@
 obj-$(CONFIG_I2C_VOODOO3)	+= i2c-voodoo3.o
 obj-$(CONFIG_SCx200_ACB)	+= scx200_acb.o
 obj-$(CONFIG_SCx200_I2C)	+= scx200_i2c.o
-
+obj-$(CONFIG_I2C_EP93XX)	+= i2c-ep93xx.o
 ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
 EXTRA_CFLAGS += -DDEBUG
 endif
diff -burN linux-2.6.8.1.orig/drivers/i2c/chips/Kconfig linux-2.6.8.1/drivers/i2c/chips/Kconfig
--- linux-2.6.8.1.orig/drivers/i2c/chips/Kconfig	2004-08-14 05:55:33.000000000 -0500
+++ linux-2.6.8.1/drivers/i2c/chips/Kconfig	2006-09-07 01:07:37.000000000 -0500
@@ -286,4 +286,16 @@
 	  This driver can also be built as a module.  If so, the module
 	  will be called i2c-rtc8564.
 
+config SENSORS_RTC_ISL1208
+        tristate "ISL 1208 RTC chip"
+        depends on I2C && EXPERIMENTAL
+        select I2C_SENSOR
+        help
+          If you say yes here you get support for the ISL 1208 RTC chip.
+
+          This driver can also be built as a module.  If so, the module
+          will be called i2c-isl1208.
+
+
+
 endmenu
diff -burN linux-2.6.8.1.orig/drivers/i2c/chips/Makefile linux-2.6.8.1/drivers/i2c/chips/Makefile
--- linux-2.6.8.1.orig/drivers/i2c/chips/Makefile	2004-08-14 05:56:25.000000000 -0500
+++ linux-2.6.8.1/drivers/i2c/chips/Makefile	2006-09-07 01:07:43.000000000 -0500
@@ -26,6 +26,7 @@
 obj-$(CONFIG_SENSORS_PCF8574)	+= pcf8574.o
 obj-$(CONFIG_SENSORS_PCF8591)	+= pcf8591.o
 obj-$(CONFIG_SENSORS_RTC8564)	+= rtc8564.o
+obj-$(CONFIG_SENSORS_RTC_ISL1208)   += rtc_isl1208.o
 obj-$(CONFIG_SENSORS_VIA686A)	+= via686a.o
 obj-$(CONFIG_SENSORS_W83L785TS)	+= w83l785ts.o
 
diff -burN linux-2.6.8.1.orig/drivers/i2c/chips/rtc_isl1208.c linux-2.6.8.1/drivers/i2c/chips/rtc_isl1208.c
--- linux-2.6.8.1.orig/drivers/i2c/chips/rtc_isl1208.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/i2c/chips/rtc_isl1208.c	2006-09-07 01:07:55.000000000 -0500
@@ -0,0 +1,594 @@
+/*
+ *  linux/drivers/i2c/chips/rtc_isl1208.c
+ *  Copyright (C) 2006 Shrek Wu
+ *
+ *	based on based on linux/drivers/i2c/chips/rtc8289.c
+ *  Copyright (C) 2002-2004 Stefan Eletzhofer
+ *
+ *	based on linux/drivers/acron/char/pcf8583.c
+ *  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 version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Driver for isl RTC 1208 chip
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/rtc.h>		/* get the user-level API */
+#include <linux/init.h>
+#include <linux/bcd.h>
+
+#include <linux/rtc_isl1208.h>
+
+#define DRV_NAME "isl1208"
+#define DRV_VERSION "0.1"
+
+//#define ISL1208_DEBUG
+
+#ifdef ISL1208_DEBUG
+#define _DBG(x, fmt, args...) do{ printk("%s: " fmt "\n", __FUNCTION__, ##args); } while(0);
+#else
+#define _DBG(x, fmt, args...) do { } while(0);
+#endif
+
+
+
+struct isl1208_data {
+	struct i2c_client client;
+	u16 ctrl;
+	struct list_head list;
+	unsigned int epoch;
+};
+
+
+
+static struct i2c_driver isl1208_driver;
+
+static unsigned short ignore[] = { I2C_CLIENT_END };
+static unsigned short normal_addr[] = {
+	ISL1208_I2C_ADDR>>1, I2C_CLIENT_END};
+
+static struct i2c_client_address_data addr_data = {
+	.normal_i2c		= normal_addr,
+	.normal_i2c_range	= ignore,
+	.probe			= ignore,
+	.probe_range		= ignore,
+	.ignore			= ignore,
+	.ignore_range		= ignore,
+	.force			= ignore,
+};
+
+
+
+static LIST_HEAD(isl1208_RTC_clients);
+
+/* block read */
+static int isl1208_read(struct i2c_client *client, unsigned char adr,
+			unsigned char *buf, unsigned char len)
+{
+	int ret = -EIO;
+	unsigned char addr[1] = { adr };
+	struct i2c_msg msgs[2] = {
+		{client->addr, client->flags, sizeof(addr), addr},
+		{client->addr, client->flags|I2C_M_RD, len, buf}
+	};
+
+	_DBG(1, "client=%p, adr=%d, buf=%p, len=%d", client, adr, buf, len);
+
+	/*check the param is or no valid*/
+	if (!buf || !client) {
+		ret = -1;
+		goto done;
+	}
+	
+	if(len == 0){
+		ret = -2;
+		goto done;
+	}
+	
+	if(adr > ISL1208_REG_USR2){
+		ret = -3;
+		goto done;		
+	}
+	
+	if(adr + len > ISL1208_REG_USR2 + 1){
+		ret = -4;
+		goto done;		
+	}
+	
+	/*transfer data based on I2C bus*/
+	ret = i2c_transfer(client->adapter, msgs, 2);
+	if (ret == 2) {
+		ret = 0;
+	}
+	
+	if (ret < 0 ){
+		ret = -5;
+	}
+
+
+done:
+	_DBG(1, "function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+	return ret;
+}
+
+/* block write */
+static int isl1208_write(struct i2c_client *client, unsigned char adr,
+			 unsigned char *data, unsigned char len)
+{
+	int ret = 0;
+	int i;
+	unsigned char i2c_buf[ISL1208_REG_USR2 + 2];/*address + data*/
+	struct i2c_msg msgs[1] = {
+		{ client->addr, client->flags, len + 1, i2c_buf }
+	};
+
+	/*check the param is or no valid*/
+	if (!client || !data || len > 15) {
+		ret = -1;
+		goto done;
+	}
+
+	if(len == 0){
+		ret = -2;
+		goto done;
+	}
+	
+	if(adr > ISL1208_REG_USR2){
+		ret = -3;
+		goto done;		
+	}
+	
+	if(adr + len > ISL1208_REG_USR2 + 1){
+		ret = -4;
+		goto done;		
+	}	
+	_DBG(1, "client=%p, adr=%d, buf=%p, len=%d", client, adr, data, len);	
+	
+	/**/
+	i2c_buf[0] = adr;
+	memcpy(&i2c_buf[1], data, len);
+
+	/*transfer data based on I2C bus*/
+	ret = i2c_transfer(client->adapter, msgs, 1);
+	if (ret == 1) {
+		ret = 0;
+	}
+	
+	if(ret < 0){
+		ret = -5;
+	}
+	
+done:
+	_DBG(1, "function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+	return ret;
+}
+
+static int isl1208_i2c_get_sr(struct i2c_client *client)
+{
+	return i2c_smbus_read_byte_data (client, ISL1208_REG_SR);
+}
+
+static int isl1208_get_datetime(struct i2c_client *client, struct rtc_time *tm)
+{
+	int ret = -EIO;
+	unsigned char  regs[ISL1208_RTC_SECTION_LEN] = { 0, };
+	
+	/*check the param is or no valid*/	
+	if (!tm || !client){
+		_DBG(1, "function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+		return -EINVAL;
+	}
+
+	memset(regs, 0, sizeof(regs));
+		
+	/*check read status register */
+	if ((ret = isl1208_i2c_get_sr(client)) < 0) {
+		dev_err(&client->dev, "%s: reading SR failed %x \n", __func__,ret);
+		return -EIO;
+	}
+	
+	if (ret & ISL1208_REG_SR_RTCF){
+		dev_warn(&client->dev, "rtc power failure detected, "
+			 "please set clock.\n");
+	}
+	
+	/* read RTC date registers */
+	if (ret = isl1208_read(client, 0, regs, ISL1208_RTC_SECTION_LEN))
+	{
+		dev_err(&client->dev, "%s: reading RTC section failed %x\n",
+			__func__,ret);
+		return -EIO;
+	}
+
+	_DBG(1, "client=%p, tm=%p", client, tm);
+
+	/* century stored in minute alarm reg */
+	tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SC]);
+	tm->tm_min = BCD2BIN(regs[ISL1208_REG_MN]);
+	{ 
+		/* HR field has a more complex interpretation */
+		const unsigned char _hr = regs[ISL1208_REG_HR];
+		if (_hr & ISL1208_REG_HR_MIL){ 
+			/* 24h format */
+			tm->tm_hour = BCD2BIN(_hr & 0x3f);
+		}
+		else { 
+			/* 12h format*/
+			tm->tm_hour = BCD2BIN(_hr & 0x1f);
+			if (_hr & ISL1208_REG_HR_PM){ 
+				/* PM flag set */
+				tm->tm_hour += 12;
+			}
+		}
+	}
+
+	tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DT]);
+	tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MO]) - 1; /* rtc starts at 1 */
+	tm->tm_year = BCD2BIN(regs[ISL1208_REG_YR]) + 100;
+	tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DW]);
+
+	_DBG(1,"%s: tm is secs=%d, mins=%d, hours=%d, "
+		"mday=%d, mon=%d, year=%d, wday=%d\n",
+		__FUNCTION__,
+		tm->tm_sec, tm->tm_min, tm->tm_hour,
+		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
+	return 0;
+}
+
+static int
+isl1208_set_datetime(struct i2c_client *client, struct rtc_time *tm,int datetoo)
+{
+	int ret, len = 5;
+	unsigned char regs[ISL1208_RTC_SECTION_LEN] = { 0, };
+
+
+	/*check the param is or no valid*/	
+	if (!tm || !client){
+		_DBG(1, "function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+		return -EINVAL;
+	}
+
+	//_DBGRTCTM(2, *tm);
+
+	/*set the RTC register value*/
+	regs[ISL1208_REG_SC] = BIN2BCD(tm->tm_sec);
+	regs[ISL1208_REG_MN] = BIN2BCD(tm->tm_min);
+	regs[ISL1208_REG_HR] = BIN2BCD(tm->tm_hour) | ISL1208_REG_HR_MIL;
+
+	if (datetoo) {
+		regs[ISL1208_REG_DT] = BIN2BCD(tm->tm_mday);
+		regs[ISL1208_REG_MO] = BIN2BCD(tm->tm_mon + 1);
+		regs[ISL1208_REG_YR] = BIN2BCD(tm->tm_year - 100);
+
+		regs[ISL1208_REG_DW] = BIN2BCD(tm->tm_wday & 7);
+	}
+	
+	/*check read status register */
+	if ((ret = isl1208_i2c_get_sr(client)) < 0) {
+		dev_err(&client->dev, "%s: reading SR failed %x\n", __func__,ret);
+		return -EIO;
+	}
+
+	/* set WRTC */
+	if ( (ret=i2c_smbus_write_byte_data (client, ISL1208_REG_SR,
+				       ret | ISL1208_REG_SR_WRTC) ) < 0) {
+		dev_err(&client->dev, "%s: writing SR failed %x\n", __func__,ret);
+		return -EIO;
+	}
+
+	/* write RTC registers */
+	if (ret = isl1208_write(client, 0, regs, ISL1208_RTC_SECTION_LEN)) {
+		dev_err(&client->dev, "%s: writing RTC section failed %x\n",
+			__func__,ret);
+		return -EIO;
+	}
+
+	/* clear WRTC again */
+	if ( (ret = i2c_smbus_write_byte_data (client, ISL1208_REG_SR,
+				       ret & ~ISL1208_REG_SR_WRTC) ) < 0) {
+		dev_err(&client->dev, "%s: writing SR failed %x\n", __func__,ret);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int isl1208_i2c_read_alarm(struct i2c_client *client,
+				  struct rtc_wkalrm *alarm)
+{
+	struct rtc_time *const tm = &alarm->time;
+	unsigned char  regs[ISL1208_ALARM_SECTION_LEN] = { 0, };
+	int sr,ret = 0;
+	
+	/*check the param is or no valid*/	
+	if (!alarm || !client){
+		_DBG(1, "function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+		return -EINVAL;
+	}
+
+	memset(regs, 0, sizeof(regs));
+
+	/*check read status register */	
+	if ((sr = isl1208_i2c_get_sr(client)) < 0) {
+		dev_err(&client->dev, "%s: reading SR failed %x\n", __func__,sr);
+		return -EIO;
+	}
+	if (sr & ISL1208_REG_SR_RTCF){
+		dev_warn(&client->dev, "rtc power failure detected, "
+			 "please set clock.\n");
+	}
+	
+	/* read ALARM date registers */
+	if (sr = isl1208_read(client, ISL1208_REG_SCA, regs,
+				  ISL1208_ALARM_SECTION_LEN))
+	{
+		dev_err(&client->dev, "%s: reading alarm section failed %x\n",
+			__func__,sr);
+		return -EIO;
+	}
+
+	/* MSB of each alarm register is an enable bit */
+	tm->tm_sec  = BCD2BIN(regs[ISL1208_REG_SCA-ISL1208_REG_SCA] & 0x7f);
+	tm->tm_min  = BCD2BIN(regs[ISL1208_REG_MNA-ISL1208_REG_SCA] & 0x7f);
+	tm->tm_hour = BCD2BIN(regs[ISL1208_REG_HRA-ISL1208_REG_SCA] & 0x3f);
+	tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DTA-ISL1208_REG_SCA] & 0x3f);
+	tm->tm_mon  = BCD2BIN(regs[ISL1208_REG_MOA-ISL1208_REG_SCA] & 0x1f)-1;
+	tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DWA-ISL1208_REG_SCA] & 0x03);
+
+	_DBG(1, "%s: tm is secs=%d, mins=%d, hours=%d, "
+		"mday=%d, mon=%d, wday=%d\n",
+		__FUNCTION__,
+		tm->tm_sec, tm->tm_min, tm->tm_hour,
+		tm->tm_mday, tm->tm_mon, tm->tm_wday);
+		
+	return 0;
+}
+
+
+
+static int
+isl1208_command(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+
+	_DBG(1,"cmd=%d", cmd);
+
+	switch (cmd) {
+	case RTC_GETDATETIME:
+		return isl1208_get_datetime(client, arg);
+
+	case RTC_SETTIME:
+		return isl1208_set_datetime(client, arg, 0);
+
+	case RTC_SETDATETIME:
+		return isl1208_set_datetime(client, arg, 1);
+		
+	case RTC_GETALARM:
+		return isl1208_i2c_read_alarm(client, arg);
+	//case RTC_GETCTRL:
+	//	return rtc8564_get_ctrl(client, arg);
+
+	//case RTC_SETCTRL:
+	//	return rtc8564_set_ctrl(client, arg);
+
+	//case MEM_READ:
+	//	return rtc8564_read_mem(client, arg);
+
+	//case MEM_WRITE:
+	//	return rtc8564_write_mem(client, arg);
+
+	default:
+		return -EINVAL;
+	}
+}
+
+/* Workaround until the I2C subsytem will allow to send
+ * commands to a specific client. This function will send the command
+ * to the first client.
+ */
+int isl1208_do_command(unsigned int cmd, void *arg)
+{
+	struct list_head *walk;
+	struct list_head *tmp;
+	struct isl1208_data *data;
+	
+	_DBG(1,"%s: start\n",__FUNCTION__);
+	list_for_each_safe(walk, tmp, &isl1208_RTC_clients) {
+		data = list_entry(walk, struct isl1208_data, list);
+		return isl1208_command(&data->client, cmd, arg);
+	}
+	_DBG(1,"%s:isl1208_RTC_clients failes\n",__FUNCTION__);
+	return -ENODEV;
+}
+
+
+
+/* simple check to see wether we have a isl1208 */
+static int isl1208_i2c_validate_client(struct i2c_client *client)
+{
+	u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, };
+	u8 zero_mask[ISL1208_RTC_SECTION_LEN] = {
+		0x80, 0x80, 0x40, 0xc0, 0xe0, 0x00, 0xf8
+	};
+	int i,ret;
+
+	_DBG(1,"%s\n",__FUNCTION__);
+
+	if (ret = isl1208_read(client, 0, regs, ISL1208_RTC_SECTION_LEN)){
+		printk("function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+		return -EIO;
+	}
+
+	for (i = 0; i < ISL1208_RTC_SECTION_LEN; ++i) {
+		if (regs[i] & zero_mask[i]) {/* check if bits are cleared */
+			printk("function %s line %d: regs[i]=%d", __FUNCTION__,__LINE__,regs[i]);
+			return -ENODEV;
+		}
+	}
+
+	return 0;
+}
+
+static int isl1208_attach(struct i2c_adapter *adap, int addr, int kind)
+{
+	int ret = 0;
+	int err = 0;
+	struct i2c_client *new_client;
+	struct isl1208_data *new_data;
+
+	struct rtc_time tm;
+
+
+	/**/
+	/*if (!i2c_check_functionality(adap, I2C_FUNC_I2C)) {
+		ret = -ENODEV;
+		printk("function %s line %d: ret=%d\n", __FUNCTION__,__LINE__,ret);
+		goto exit;
+	}*/
+	
+	/**/
+	new_data = kmalloc(sizeof(struct isl1208_data), GFP_KERNEL);
+	if (!new_data) {
+		ret = -ENOMEM;
+		printk("function %s line %d: ret=%d\n", __FUNCTION__,__LINE__,ret);
+		goto exit;
+	}
+	memset(new_data, 0, sizeof(struct isl1208_data));
+	
+	
+	/* 
+	 * The common I2C client data is placed right before the
+	 * specific RTC chip data. 
+	 */
+	new_client = &new_data->client;
+	i2c_set_clientdata(new_client, new_data);
+	
+	new_client->addr = addr;
+	new_client->adapter = adap;
+	new_client->driver = &isl1208_driver;
+	
+	new_client->id = isl1208_driver.id;
+	new_client->flags = 0;//I2C_CLIENT_ALLOW_USE | I2C_DF_NOTIFY;
+		
+
+	/* Verify the chip is really an ISL1208 */
+	if (kind < 0) {
+		if ((isl1208_i2c_validate_client(new_client)) < 0){
+			ret = -ENODEV;
+			printk("function %s line %d: ret=%d", __FUNCTION__,__LINE__,ret);
+			goto done;
+		}
+	}
+	
+	/* We can fill in the remaining client fields */
+	strlcpy(new_client->name, DRV_NAME, I2C_NAME_SIZE);
+
+	_DBG(1,"client=%p\n", new_client);
+	_DBG(1,"client.id=%d\n", new_client->id);	
+	
+	/* Inform the i2c layer */
+	if ((ret = i2c_attach_client(new_client)))
+		goto done;
+	/*add the data struct into list */	
+	list_add(&new_data->list, &isl1208_RTC_clients);
+
+	_DBG(1,"chip found, driver name %s,driver version %s\n",DRV_NAME,DRV_VERSION);
+	
+	/* Check the status of RTC.If requested, set the system time */
+	if ((ret = isl1208_i2c_get_sr (new_client)) < 0) {
+		dev_err(&new_client->dev, "reading status failed\n");
+		goto failout_detach;
+	}
+
+	if (ret & ISL1208_REG_SR_RTCF){
+		dev_warn(&new_client->dev, "rtc power failure detected, "
+			 "please set clock.\n");
+	}
+
+
+/*
+	tm.tm_sec = 0;//BCD2BIN(00);
+	tm.tm_min = 12;//BCD2BIN(20);
+	tm.tm_hour = 13;//BCD2BIN(13 & 0x3f);
+	tm.tm_mday = 6;//BCD2BIN(6);
+	tm.tm_mon = 9-1;//BCD2BIN(9) - 1; 
+	tm.tm_year = 106;//BCD2BIN(106);
+	tm.tm_wday = 2;//BCD2BIN(2);
+
+	isl1208_set_datetime(new_client, &tm,1);
+	isl1208_get_datetime(new_client, &tm);
+*/
+	
+	return 0;
+	
+failout_detach:
+	i2c_detach_client(new_client);	
+done:
+	kfree(new_data);
+exit:
+	return ret;
+}
+
+static int isl1208_attach_adapter(struct i2c_adapter *adap)
+{
+	_DBG(1,"%s\n",__FUNCTION__);
+	return i2c_probe(adap, &addr_data, isl1208_attach);
+}
+
+static int isl1208_detach_client(struct i2c_client *client)
+{
+	int err;
+	struct isl1208_data *data = i2c_get_clientdata(client);
+
+	_DBG(1,"%s\n",__FUNCTION__);
+
+	if ((err = i2c_detach_client(client)))
+	{
+		printk("function %s line %d:client=%p, err=%d", __FUNCTION__,__LINE__,client, err);
+		return err;	
+	}
+		
+	list_del(&data->list);
+	kfree(data);
+	
+	return 0;
+}
+
+static struct i2c_driver isl1208_driver = {
+	.owner		= THIS_MODULE,
+	.name		= DRV_NAME,
+	.id		= I2C_DRIVERID_ISL1208,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter = isl1208_attach_adapter,
+	.detach_client	= isl1208_detach_client,
+	.command	= isl1208_command
+};
+
+static __init int isl1208_init(void)
+{
+	int ret = 0;
+	ret = i2c_add_driver(&isl1208_driver);
+	_DBG(1,"%s over %d\n",__FUNCTION__,ret);
+	return ret;
+}
+
+static __exit void isl1208_exit(void)
+{
+	_DBG(1,"%s\n",__FUNCTION__);
+	i2c_del_driver(&isl1208_driver);
+}
+
+MODULE_AUTHOR("Shrek Wu");
+MODULE_DESCRIPTION("Intersil ISL1208 RTC driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_VERSION);
+
+EXPORT_SYMBOL_GPL(isl1208_do_command);
+
+module_init(isl1208_init);
+module_exit(isl1208_exit);
diff -burN linux-2.6.8.1.orig/drivers/ide/arm/ide_arm.c linux-2.6.8.1/drivers/ide/arm/ide_arm.c
--- linux-2.6.8.1.orig/drivers/ide/arm/ide_arm.c	2004-08-14 05:55:09.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/arm/ide_arm.c	2005-07-25 05:45:57.000000000 -0500
@@ -36,8 +36,14 @@
 		hw_regs_t hw;
 
 		memset(&hw, 0, sizeof(hw));
+#ifdef CONFIG_BLK_DEV_IDE_EP93XX
+		#include <asm/arch/ide.h>
+		old_ide_init_default_hwifs();
+		//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 -burN linux-2.6.8.1.orig/drivers/ide/arm/ide-dma-ep93xx.c linux-2.6.8.1/drivers/ide/arm/ide-dma-ep93xx.c
--- linux-2.6.8.1.orig/drivers/ide/arm/ide-dma-ep93xx.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/ide/arm/ide-dma-ep93xx.c	2005-12-14 02:24:07.000000000 -0600
@@ -0,0 +1,1360 @@
+/******************************************************************************
+ * drivers/ide/arm/ide-dma-ep93xx.c
+ *
+ * Support for IDE UDMA
+ * Version 1.0 for EP93XX-E1
+ *
+ * Copyright (C) 2005  Cirrus Logic
+ *
+ * A large portion of this file is based on the ide-dma.c
+ * and the respective pmac version of 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/ide.h>
+#include <linux/delay.h>
+#include <linux/proc_fs.h>
+#include <asm/io.h>
+#include <asm/ide.h>
+#include <asm/irq.h>
+#include <asm/arch/ide.h>
+#include <asm/arch/dma.h>
+#include <asm/hardware.h>
+
+//#define EP93XX_IDE_DMA_DEBUG
+//#define DEBUG_VADDR
+
+#ifdef EP93XX_IDE_DMA_DEBUG
+#define DPRINTK( fmt, arg... )  printk( fmt, ##arg )
+#else
+#define DPRINTK( fmt, arg... )
+#endif
+
+static void
+ep93xx_set_pio(void);
+
+
+#define ep93xx_ide_dma_intr ide_dma_intr
+
+//this functions comes from PCI PC land
+ide_startstop_t ide_dma_intr (ide_drive_t *drive)
+{
+	u8 stat = 0, dma_stat = 0;
+	
+	DPRINTK("%s\n", __FUNCTION__);
+
+	dma_stat = HWIF(drive)->ide_dma_end(drive);
+	stat = HWIF(drive)->INB(IDE_STATUS_REG);	/* get drive status */
+	if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
+		if (!dma_stat) {
+			struct request *rq = HWGROUP(drive)->rq;
+
+			DRIVER(drive)->end_request(drive, 1, rq->nr_sectors);
+			return ide_stopped;
+		}
+		printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n", 
+		       drive->name, dma_stat);
+	}
+	return DRIVER(drive)->error(drive, "dma_intr", stat);
+}
+
+
+/*****************************************************************************
+ *
+ * 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)
+{
+        unsigned int   ulChipID;
+	byte transfer = 0;
+
+	DPRINTK("%s: ep93xx_config_ide_device\n", drive->name);
+
+	/*
+	 * Determine the best transfer speed supported.  On Rev D1/E0
+     * the maximum DMA mode is 2.  On Rev E1 the maximum UDMA mode is 3.
+	 */
+	transfer = ide_dma_speed(drive, 1); //mode1=udma0..2, mode2=udma2..4
+  	
+	/*
+	 * Do nothing if a DMA mode is not supported or if the drive supports
+         * MDMA.
+	 */
+	if(transfer == XFER_MW_DMA_2 || transfer == XFER_MW_DMA_1 || 
+		transfer == XFER_MW_DMA_0 || transfer == 0) {
+printk("	device only supports MDMA ? (we're hosed)\n");
+                return 1;  
+	}
+
+	ulChipID = inl(SYSCON_CHIPID);
+	if(transfer == XFER_UDMA_3 && ((ulChipID &  SYSCON_CHIPID_REV_MASK)>>SYSCON_CHIPID_REV_SHIFT) != 0x6)
+	{
+		transfer = XFER_UDMA_2; 
+        }
+
+	DPRINTK("configuring the HDD for this transfer: ");
+	/*
+	 * Configure the drive.
+	 */
+	if (ide_config_drive_speed(drive, transfer) == 0) {
+		/*
+		 * Hold on to this value for use later.
+		 */
+printk("	device configured for speed X%d\n", transfer ); 
+		drive->current_speed = transfer;
+
+		/*
+		 * Success, so turn on DMA.
+		 */
+		return HWIF(drive)->ide_dma_on(drive);
+	} 
+	else
+		return 1;  
+}
+
+
+
+
+static int g_prd_count=0;
+static int g_pwr_count=0;
+
+
+
+//from include/asm/dma-mapping.h
+//static inline int
+//dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+//	   enum dma_data_direction dir)
+
+//#define MAP_SG(a,b,c,d)		dma_map_sg( (struct device *) (a), (b), (c), (d) )
+//#define UNMAP_SG(a,b,c,d)	dma_unmap_sg( (struct device *) (a), (b), (c), (d) )
+
+#define MAP_SG(a,b,c,d)		dma_map_sg( NULL, (b), (c), (d) )
+#define UNMAP_SG(a,b,c,d)	dma_unmap_sg( NULL, (b), (c), (d) )
+
+/*
+ * Needed for allowing full modular support of ide-driver
+ */
+static int ep93xx_ide_release_dma_engine (ide_hwif_t *hwif)
+{
+	if (hwif->dmatable_cpu) 
+	{
+	    kfree(hwif->dmatable_cpu);
+	    hwif->dmatable_cpu = NULL;
+	}
+	if (hwif->sg_table) 
+	{
+	    kfree(hwif->sg_table);
+	    hwif->sg_table = NULL;
+	}
+
+
+	return 1;
+}
+
+
+int ep93xx_ide_allocate_dma_engine (ide_hwif_t *hwif)
+{
+	
+	/*
+	 * Allocate memory for the DMA table.
+	 */
+	hwif->dmatable_cpu = kmalloc(PRD_ENTRIES * PRD_BYTES, GFP_KERNEL);
+
+	/*
+	 * Check if we allocated memory for dma
+	 */
+	if (hwif->dmatable_cpu == NULL) 
+	{
+		printk("%s: SG-DMA disabled, UNABLE TO ALLOCATE DMA TABLES\n", hwif->name);
+		return 1;
+	}
+
+	/*
+	 * 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.
+		 */
+		kfree(hwif->dmatable_cpu );
+		printk("%s: SG-DMA disabled, UNABLE TO ALLOCATE DMA TABLES\n", hwif->name);
+		return 1;
+	}
+
+    return 0;
+}
+
+
+/**
+ *	config_drive_for_dma	-	attempt to activate IDE DMA
+ *	@drive: the drive to place in DMA mode
+ *
+ *	If the drive supports at least mode 2 DMA or UDMA of any kind
+ *	then attempt to place it into DMA mode. Drives that are known to
+ *	support DMA but predate the DMA properties or that are known
+ *	to have DMA handling bugs are also set up appropriately based
+ *	on the good/bad drive lists.
+ */
+ 
+static int config_drive_for_dma (ide_drive_t *drive)
+{
+	struct hd_driveid *id = drive->id;
+	ide_hwif_t *hwif = HWIF(drive);
+
+        DPRINTK("%s\n", __FUNCTION__ );
+
+	if ((id->capability & 1) && hwif->autodma) 
+	{
+		/* Consult the list of known "bad" drives */
+		if (__ide_dma_bad_drive(drive))
+			return __ide_dma_off(drive);
+
+		DPRINTK("	drive seems ok\n");
+
+#ifdef EP93XX_IDE_DMA_DEBUG
+		if (id->field_valid & 4)
+		{
+		    printk("	supports UDMA : 0x%08x\n", id->dma_ultra );
+		}
+#endif
+
+		/*
+		 * Enable DMA on any drive that has
+		 * UltraDMA (mode 0/1/2/3/4/5/6) enabled
+		 * ep93xx supports up to udma2 
+		 */
+		 
+		if ( (id->field_valid & 4) && ( id->dma_ultra & 0x7f) )
+		{
+			DPRINTK("enabling UDMA\n");
+			return hwif->ide_dma_on(drive);
+		}
+
+		// ep93xx can't do mdma/sdma
+	}
+
+	return hwif->ide_dma_off_quietly(drive);
+}
+
+
+
+/**
+ *	ep93xx_ide_dma_check		-	check DMA setup
+ *	@drive: drive to check
+ *
+ */
+ 
+static int ep93xx_ide_dma_check (ide_drive_t *drive)
+{
+        DPRINTK("%s\n", __FUNCTION__ );
+
+	config_drive_for_dma(drive);
+	return ep93xx_config_ide_device(drive);
+}
+
+
+/**
+ *	ide_build_sglist	-	map IDE scatter gather for DMA I/O
+ *	@drive: the drive to build the DMA table for
+ *	@rq: the request holding the sg list
+ *
+ *	Perform the PCI mapping magic necessary to access the source or
+ *	target buffers of a request via PCI DMA. The lower layers of the
+ *	kernel provide the necessary cache management so that we can
+ *	operate in a portable fashion
+ */
+
+static int ide_build_sglist(ide_drive_t *drive, struct request *rq)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	struct scatterlist *sg = hwif->sg_table;
+	int nents;
+#ifdef DEBUG_VADDR
+	u32 vaddr;
+	vaddr = (u32) rq->buffer;
+	printk("vaddr=0x%08x, paddr=0x%08x\n", (int) vaddr, (int) virt_to_dma(NULL,vaddr) );
+#endif	
+	if (hwif->sg_dma_active)
+		BUG();
+
+	nents = blk_rq_map_sg(drive->queue, rq, sg);
+		
+	if (rq_data_dir(rq) == READ)
+		hwif->sg_dma_direction = PCI_DMA_FROMDEVICE;
+	else
+		hwif->sg_dma_direction = PCI_DMA_TODEVICE;
+
+	return MAP_SG(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
+}
+
+
+//comes from PCI PC land
+/**
+ *	ide_raw_build_sglist	-	map IDE scatter gather for DMA
+ *	@drive: the drive to build the DMA table for
+ *	@rq: the request holding the sg list
+ *
+ *	Perform the PCI mapping magic necessary to access the source or
+ *	target buffers of a taskfile request via PCI DMA. The lower layers 
+ *	of the  kernel provide the necessary cache management so that we can
+ *	operate in a portable fashion
+ */
+
+static int ide_raw_build_sglist(ide_drive_t *drive, struct request *rq)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	struct scatterlist *sg = hwif->sg_table;
+	int nents = 0;
+	ide_task_t *args = rq->special;
+	u8 *virt_addr = rq->buffer;
+	int sector_count = rq->nr_sectors;
+#ifdef DEBUG_VADDR
+	u32 vaddr;
+	vaddr = (u32) rq->buffer;
+	printk("vaddr=0x%08x, paddr=0x%08x\n", (int) vaddr, (int) virt_to_dma(NULL, vaddr) );
+#endif	
+
+	if (args->command_type == IDE_DRIVE_TASK_RAW_WRITE)
+		hwif->sg_dma_direction = PCI_DMA_TODEVICE;
+	else
+		hwif->sg_dma_direction = PCI_DMA_FROMDEVICE;
+
+#if 1
+	if (sector_count > 256)
+		BUG();
+
+	if (sector_count > 128) {
+#else
+	while (sector_count > 128) {
+#endif
+		memset(&sg[nents], 0, sizeof(*sg));
+		sg[nents].page = virt_to_page(virt_addr);
+		sg[nents].offset = offset_in_page(virt_addr);
+		sg[nents].length = 128  * SECTOR_SIZE;
+		nents++;
+		virt_addr = virt_addr + (128 * SECTOR_SIZE);
+		sector_count -= 128;
+	}
+	memset(&sg[nents], 0, sizeof(*sg));
+	sg[nents].page = virt_to_page(virt_addr);
+	sg[nents].offset = offset_in_page(virt_addr);
+	sg[nents].length =  sector_count  * SECTOR_SIZE;
+	nents++;
+
+	return MAP_SG(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
+}
+
+//comes from PCI PC land
+/**
+ *	ide_build_dmatable	-	build IDE DMA table
+ *
+ *	ide_build_dmatable() prepares a dma request. We map the command
+ *	to get the pci bus addresses of the buffers and then build up
+ *	the PRD table that the IDE layer wants to be fed. The code
+ *	knows about the 64K wrap bug in the CS5530.
+ *
+ *	Returns 0 if all went okay, returns 1 otherwise.
+ *	May also be invoked from trm290.c
+ */
+ 
+static int ep93xx_ide_build_dmatable (ide_drive_t *drive, struct request *rq)
+{
+	ide_hwif_t *hwif	= HWIF(drive);
+	unsigned int *table	= hwif->dmatable_cpu;
+	unsigned int count = 0;
+	int i;
+	struct scatterlist *sg;
+
+	if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE)
+		hwif->sg_nents = i = ide_raw_build_sglist(drive, rq);
+	else
+		hwif->sg_nents = i = ide_build_sglist(drive, rq);
+
+	if (!i)
+		return 0;
+
+	sg = hwif->sg_table;
+	while (i) {
+		u32 cur_addr;
+		u32 cur_len;
+
+		cur_addr = sg_dma_address(sg);
+		cur_len = sg_dma_len(sg);
+
+		/*
+		 * 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(KERN_ERR "%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 (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(KERN_ERR "%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) {
+			*--table |= cpu_to_le32(0x80000000);
+		return count;
+	}
+
+	printk(KERN_ERR "%s: empty DMA table?\n", drive->name);
+
+use_pio_instead:
+
+	UNMAP_SG(hwif->pci_dev,
+		     hwif->sg_table,
+		     hwif->sg_nents,
+		     hwif->sg_dma_direction);
+
+	hwif->sg_dma_active = 0;
+
+	return 0; /* revert to PIO for this request */
+}
+
+
+/* Teardown mappings after DMA has completed.  */
+static void
+ep93xx_ide_destroy_dmatable (ide_drive_t *drive)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	struct scatterlist *sg;  
+	
+	sg = hwif->sg_table;
+
+	if (hwif->sg_nents) {
+		UNMAP_SG(NULL, sg, hwif->sg_nents, hwif->sg_dma_direction);
+		hwif->sg_dma_active = 0;
+	}
+}
+
+
+static int __ide_dma_lostirq (ide_drive_t *drive)
+{
+	printk("%s: DMA interrupt recovery\n", drive->name);
+	return 1;
+}
+
+// from PCI PC land
+/**
+ *	__ide_dma_on		-	Enable DMA on a device
+ *	@drive: drive to enable DMA on
+ *
+ *	Enable IDE DMA for a device on this IDE controller.
+ */
+ 
+int __ide_dma_on (ide_drive_t *drive)
+{
+        DPRINTK("%s\n", __FUNCTION__ );
+
+	drive->using_dma = 1;	
+	ide_toggle_bounce(drive, 1);
+
+	if (HWIF(drive)->ide_dma_host_on(drive))
+		return 1;
+
+	return 0;
+}
+
+
+/*				
+ * this is supposed to enable the host side (PC) host controller
+ * on the ep93xx it is already running, so nothing really happening here
+ *
+ */
+static int
+ep93xx_ide_dma_host_on(ide_drive_t *drive)
+{
+	DPRINTK("%s\n", __FUNCTION__ );
+
+	return 0;
+}
+
+static int
+ep93xx_ide_dma_host_off (ide_drive_t *drive)
+{
+	return 0;
+}
+
+/*****************************************************************************
+ *
+ *  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)
+{
+	int speed;
+
+
+        DPRINTK("%s\n", __FUNCTION__ );
+
+	/*
+	 * Insure that neither device is selected. -wlg
+	 */
+	ep93xx_set_pio();
+
+
+	DPRINTK("rwproc in udma mode (udma starts at 64): %d\n", drive->current_speed);
+
+	/*
+	 * 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:
+		printk("ep93xx ide dma: BAAAAADDD ! someone tries to use MDMA: not supported !!\n");
+		
+		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:
+		
+		    speed = drive->current_speed;
+		    speed -=64; //udma 0
+		    if(speed >= 3)
+			speed = 3; //max udma 3
+
+		    DPRINTK("rwproc in udma %d, action is %d\n", speed, action);
+		    outl( (speed << IDECfg_MODE_SHIFT) | IDECfg_UDMA | IDECfg_IDEEN, IDECFG );
+
+		    //action == 0 for read, action == 1 for write
+
+		    if(action)
+			action=0x2; //IDEUDMAOp_RWOP
+		    else
+			action=0;
+		        
+		    outl( action , IDEUDMAOP );    
+		    outl( action | IDEUDMAOp_UEN, IDEUDMAOP );
+		
+		break;
+
+		default:
+			break;
+	}
+}
+
+
+/*****************************************************************************
+ *
+ * ep93xx_ide_dma_begin()
+ *
+ * This function initiates a dma transfer.
+ *
+ ****************************************************************************/
+static int
+ep93xx_ide_dma_begin(ide_drive_t *drive)
+{
+	int rv;
+	ide_hwif_t *hwif = HWIF(drive);
+	struct request *rq = HWGROUP(drive)->rq;
+
+
+	DPRINTK("%s\n", __FUNCTION__ );
+	
+	/*
+	 * Configure the ep93xx ide controller for a dma operation.
+	 */
+	if (rq_data_dir(rq) == READ)
+	    ep93xx_rwproc(drive, 0);
+	else
+	    ep93xx_rwproc(drive, 1);
+
+	/*
+	 * Start the dma transfer.
+	 */
+	rv=ep93xx_dma_start(hwif->hw.dma, 1, NULL);
+	DPRINTK("	starting dma on handle 0x%08x, rv=%d\n", (int)  hwif->hw.dma, rv );
+	DPRINTK(" 	DMAMM_0_CONTROL=0x%08x\n", inl(DMAMM_0_CONTROL) );
+	return rv;
+}
+
+
+/*****************************************************************************
+ *
+ * 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;
+	int rv;
+
+	DPRINTK("ep93xx_ide_callback %d\n", dma_int);
+	DPRINTK("	IDEUDMARdBufSts=0x%08x\n", inl(IDEUDMARFST) );
+
+#ifdef EP93XX_IDE_DMA_DEBUG
+
+    if( ep93xx_dma_is_done(hwif->hw.dma) == 1 )
+    {
+	printk("dma is done\n");
+    }
+    else
+    {
+	printk("dma is NOT DONE\n");
+    }
+
+    printk("DMAMM_0_SAR_CURRENT0  =0x%08x\n", inl(DMAMM_0_SAR_CURRENT0)   );
+    printk("DMAMM_0_DAR_CURRENT0  =0x%08x\n", inl(DMAMM_0_DAR_CURRENT0)   );
+
+#endif
+	/*
+	 * Retrieve from the dma interface as many used buffers as are
+	 * available.
+	 */
+	while (1)
+	{
+	    rv = ep93xx_dma_remove_buffer(hwif->hw.dma, &temp);
+	    if(rv<0)
+		break;
+	}
+	DPRINTK("buffers removed\n");
+
+    DPRINTK("	return from callback\n");
+}
+
+/*****************************************************************************
+ *
+ *  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	 = inl(IDECR) & IDECtrl_INTRQ;
+
+	DPRINTK(KERN_WARNING "%s: dma_timer_expiry: dev status == 0x%02x,irq= %d\n",
+		drive->name, dev_stat, irq_stat);
+
+	/*
+	 * Clear the expiry handler in case we decide to wait more,
+	 * next time timer expires it is an error
+	 */
+	HWGROUP(drive)->expiry = NULL;
+
+	/*
+	 * If the interrupt is asserted, call the handler.
+	 */
+	if (irq_stat)
+		HWGROUP(drive)->handler(drive);
+
+	/*
+	 * Check if the busy bit or the drq bit is set, indicating that
+	 * a dma transfer is still active, or the IDE interrupt is asserted.
+	 */
+	if ( (dev_stat & 0x80) || (dev_stat & 0x08) || irq_stat)
+		return WAIT_CMD;
+
+	/*
+	 * the device is not busy and the interrupt is not asserted, so check
+	 * if there's an error.
+	 */
+	if (dev_stat & 0x01)	/* ERROR */
+		return -1;
+
+	return 0;	/* Unknown status -- reset the bus */
+}
+
+
+
+
+/*****************************************************************************
+ *
+ * ep93xx_ide_dma_read()
+ *
+ * This function sets up a dma read operation.
+ *
+ ****************************************************************************/
+static int
+ep93xx_ide_dma_read(ide_drive_t *drive)
+{
+	u8 lba48 = (drive->addressing == 1) ? 1 : 0;
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int flags;
+	ide_hwif_t *hwif = HWIF(drive);
+	task_ioreg_t command = WIN_NOP;
+	unsigned int *table	= hwif->dmatable_cpu;
+
+	DPRINTK("%s\n", __FUNCTION__ );
+//printk("r sector %u, count=%u\n", (unsigned) HWGROUP(drive)->rq->sector, HWGROUP(drive)->rq->nr_sectors );
+
+	/*
+	 * Check if we are already transferring on this dma channel.
+	 */
+	if (hwif->sg_dma_active || drive->waiting_for_dma) {
+		DPRINTK("%s: dma_read: dma already active \n", drive->name);
+		return 1;
+	}
+
+
+	/*
+	 * Indicate that we're waiting for dma.
+	 */
+	drive->waiting_for_dma = 1;
+
+	/*
+	 * 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) 
+	{
+	    printk("ep93xx_ide_dma_read: been asked to to MDMA: refusing categorically!!!\n");
+	} 
+	else 
+	{
+		flags |= (WS_IDE_UDMA_READ << WAIT_STATES_SHIFT);
+		/*
+		 * UDMA data register address.
+		 */
+		hwif->dma_base = IDEUDMADATAIN - IO_BASE_VIRT + IO_BASE_PHYS;
+	}
+
+	/*
+	 * 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);
+		drive->waiting_for_dma = 0;
+		/*
+		 * Fail.
+		 */
+		return 1;
+	}
+
+	/*
+	 * Build the table of dma-able buffers.
+	 */
+	if (!(g_prd_count=ep93xx_ide_build_dmatable(drive, rq)) ) 
+	{
+		DPRINTK("%s: ep93xx_ide_dma_read: ERROR- failed to build dma table",
+			drive->name);
+		drive->waiting_for_dma = 0;
+		/*
+		 * Fail, try PIO instead of DMA
+		 */
+		return 1;
+	}
+
+	DPRINTK("	%d dmas pending\n", g_prd_count);
+	/*
+	 * Indicate that the scatter gather is active.
+	 */
+	hwif->sg_dma_active = 1;
+
+	/*
+	 * Prepare the dma interface with some buffers from the
+	 * dma_table.
+	 */
+	do {
+		DPRINTK("	add buf: handle=0x%08x, base=0x%08x, dest=0x%08x, len=0x%08x, g_prd_count=%d\n",
+			     hwif->hw.dma,
+			     hwif->dma_base,
+			     table[0],
+			     table[1],
+			     g_prd_count);
+
+	
+		/*
+		 * Add a buffer to the dma interface.
+		 */
+//		printk("rrd b=0x%08x, len=%d\n",  hwif->dmatable_cpu[0], (int) (hwif->dmatable_cpu[1] & 0x0fffffff) );
+		if (ep93xx_dma_add_buffer(hwif->hw.dma, hwif->dma_base,
+					  table[0],
+					  table[1], 0,
+					  g_prd_count) != 0)
+			break;
+		table += 2;
+
+		/*
+		 * Decrement the count of dmatable entries
+		 */
+		g_prd_count--;
+	} while (g_prd_count);
+
+	/*
+	 * Nothing further is required if this is not a ide_disk (i.e. an ATAPI
+	 * device).
+	 */
+	if (drive->media != ide_disk)
+	{
+		return 0;
+	}
+
+	command = (lba48) ? WIN_READDMA_EXT : WIN_READDMA;
+	
+	if (drive->vdma)
+		command = (lba48) ? WIN_READ_EXT: WIN_READ;
+		
+	if (rq->flags & REQ_DRIVE_TASKFILE) {
+		ide_task_t *args = rq->special;
+		command = args->tfRegister[IDE_COMMAND_OFFSET];
+	}
+
+	DPRINTK("command=0x%02x\n", (u8) command );
+
+	/*
+	 * Enable PIO mode on the IDE interface.
+	 */
+	ep93xx_set_pio();
+
+	/*
+	 * Send the read command to the device.
+	 */
+	ide_execute_command(drive, command, &ep93xx_ide_dma_intr, 2*WAIT_CMD,
+			    &ep93xx_idedma_timer_expiry);
+
+	/*
+	 * initiate the dma transfer.
+	 */	 
+	return hwif->ide_dma_begin(drive);
+}
+
+
+/*****************************************************************************
+ *
+ * ep93xx_ide_dma_write()
+ *
+ * This function sets up a dma write operation.
+ *
+ ****************************************************************************/
+static int
+ep93xx_ide_dma_write(ide_drive_t *drive)
+{
+	u8 lba48 = (drive->addressing == 1) ? 1 : 0;
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int flags;
+	ide_hwif_t *hwif = HWIF(drive);
+	task_ioreg_t command = WIN_NOP;
+	unsigned int *table	= hwif->dmatable_cpu;
+
+	DPRINTK("%s: ep93xx_ide_dma_write\n", drive->name);
+	
+//printk("w sector %u, count=%u\n", (unsigned) HWGROUP(drive)->rq->sector, HWGROUP(drive)->rq->nr_sectors );
+
+	/*
+	 * Check if we are already transferring on this dma channel.
+	 */
+	if (hwif->sg_dma_active || drive->waiting_for_dma) {
+		DPRINTK("%s: dma_write - dma is already active \n",
+			drive->name);
+		return 1;
+	}
+
+	/*
+	 * Indicate that we're waiting for dma.
+	 */
+	drive->waiting_for_dma = 1;
+
+	/*
+	 * 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) 
+	{
+	
+		printk("EP93xx cannot do MDMA !!\n");
+	} 
+	else 
+	{
+		flags |= (WS_IDE_UDMA_WRITE << WAIT_STATES_SHIFT);
+
+		/*
+		 * UDMA data register address.
+		 */
+		hwif->dma_base = IDEUDMADATAOUT - IO_BASE_VIRT + IO_BASE_PHYS;
+	}
+
+	/*
+	 * Configure the dma interface for this IDE operation.
+	 */
+	if (ep93xx_dma_config(hwif->hw.dma, 0, flags, ep93xx_ide_callback,
+			      (unsigned int)drive) != 0) {
+		drive->waiting_for_dma = 0;
+		return 1;
+	}
+
+	/*
+	 * Build the table of dma-able buffers.
+	 */
+	if (!(g_pwr_count = ep93xx_ide_build_dmatable(drive, rq)) ) {
+		drive->waiting_for_dma = 0;
+		/*
+		 * Fail, try PIO instead of DMA
+		 */
+		return 1;
+	}
+
+	/*
+	 * Indicate that we're waiting for dma.
+	 */
+	hwif->sg_dma_active = 1;
+
+
+	/*
+	 * Prepare the dma interface with some buffers from the
+	 * dma_table.
+	 */
+	do {
+		/*
+		 * Add a buffer to the dma interface.
+		 */
+		 
+		if (ep93xx_dma_add_buffer(hwif->hw.dma,
+					  table[0],
+					  hwif->dma_base,
+					  table[1], 0,
+					  g_pwr_count) != 0)
+		{
+		    break;
+		}
+		table += 2;
+
+		/*
+		 * Decrement the count of dmatable entries
+		 */
+		g_pwr_count--;
+	} while (g_pwr_count);
+
+	/*
+	 * Nothing further is required if this is not a ide_disk (i.e. an ATAPI
+	 * device).
+	 */
+	if (drive->media != ide_disk)
+		return 0;
+
+	/*
+	 * Determine the command to be sent to the device.
+	 */
+
+
+	command = (lba48) ? WIN_WRITEDMA_EXT : WIN_WRITEDMA;
+
+	if (drive->vdma)
+		command = (lba48) ? WIN_WRITE_EXT: WIN_WRITE;
+		
+	if (rq->flags & REQ_DRIVE_TASKFILE) 
+	{
+		ide_task_t *args = rq->special;
+		command = args->tfRegister[IDE_COMMAND_OFFSET];
+	}
+
+	/*
+	 * Enable PIO mode on the IDE interface.
+	 */
+	ep93xx_set_pio();
+
+	/*
+	 * Send the write dma command to the device.
+	 */
+	ide_execute_command(drive, command, &ep93xx_ide_dma_intr, 4*WAIT_CMD,
+			    &ep93xx_idedma_timer_expiry);
+
+	/*
+	 * initiate the dma transfer.
+	 */
+	return hwif->ide_dma_begin(drive);
+}
+
+
+/*****************************************************************************
+ *
+ *  ep93xx_set_pio()
+ *
+ *  Configures the ep93xx controller for a PIO mode transfer.
+ *
+ ****************************************************************************/
+static void
+ep93xx_set_pio(void)
+{
+	DPRINTK("ep93xx_set_pio\n");
+
+	/*
+	 * Insure that neither device is selected -wlg
+	 */
+        outl(inl(IDECR) | (IDECtrl_CS0n | IDECtrl_CS1n), IDECR);
+	/*
+	 * Clear the MDMA and UDMA operation registers.
+	 */
+	outl(0, IDEMDMAOP);
+	outl(0, IDEUDMAOP);
+
+	/*
+	 * Enable PIO mode of operation.
+	 */
+	outl(IDECfg_PIO | IDECfg_IDEEN | (4 << IDECfg_MODE_SHIFT) |
+	     (1 << IDECfg_WST_SHIFT), IDECFG);
+}
+
+
+static int
+ep93xx_ide_dma_end(ide_drive_t *drive)
+{
+	ide_hwif_t * hwif = HWIF(drive);
+	int rv;
+	int i;
+	
+	rv = 0;
+
+	DPRINTK("%s\n", __FUNCTION__ );
+
+	while(1)
+	{
+	/*
+	 * See if there is any data left in UDMA FIFOs.  For a read, first wait
+	 * until either the DMA is done or the FIFO is empty.  If there is any
+	 * residual data in the FIFO, there was an error in the transfer.
+	 */
+	    i = inl(IDEUDMARFST);
+	    if( ep93xx_dma_is_done(hwif->hw.dma) )
+		break;
+	    if ( (i & 15) == ((i >> 4) & 15) )
+		break;
+	    udelay(1);
+	}
+	udelay(1);
+
+	/*
+	 * 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();
+
+	/*
+	 * Indicate there's no dma transfer currently in progress.
+	 */
+	hwif->sg_dma_active = 0;
+	drive->waiting_for_dma = 0;
+
+	DPRINTK("IDEUDMARdBufSts=0x%08x\n", inl(IDEUDMARFST) );
+
+	if ( (i & 15) != ((i >> 4) & 15) )
+	{
+	    printk("dma_end: udma fifo ptr mismatch !\n");
+	    rv=-1;
+	    goto end;
+	}
+
+	if( ep93xx_dma_is_done(hwif->hw.dma) != 1)
+	{
+	    printk("dma_end: dma not done !\n");
+	    rv=-1;
+	    goto end;
+	}
+//this doesn't really do anthing right now, but might be necessary in the future
+	ep93xx_ide_destroy_dmatable(drive); 
+//negative value if DMA engine failed	
+end:
+	return rv;
+}
+
+
+//from PCi PC land
+/**
+ *	__ide_dma_host_off_quietly	-	Generic DMA kill
+ *	@drive: drive to control
+ *
+ *	Turn off the current DMA on this IDE controller. 
+ */
+
+static int ep93xx_ide_dma_off_quietly (ide_drive_t *drive)
+{
+        DPRINTK("%s\n", __FUNCTION__ );
+
+	drive->using_dma = 0;
+	ide_toggle_bounce(drive, 0);
+
+	if (HWIF(drive)->ide_dma_host_off(drive))
+		return 1;
+
+	return 0;
+}
+
+
+/*****************************************************************************
+ *
+ * ep93xx_ide_dma_bad_timeout()
+ *
+ ****************************************************************************/
+static int
+ep93xx_ide_dma_timeout(ide_drive_t *drive)
+{
+	printk("%s: ep93xx_ide_dma_timeout\n", drive->name);
+
+	printk("	IDEUDMARdBufSts=0x%08x\n", inl(IDEUDMARFST) );
+	printk("	DMAMM_0_SAR_CURRENT0  =0x%08x\n", inl(DMAMM_0_SAR_CURRENT0)   );
+	printk("	DMAMM_0_DAR_CURRENT0  =0x%08x\n", inl(DMAMM_0_DAR_CURRENT0)   );
+
+	if (HWIF(drive)->ide_dma_test_irq(drive))
+		return 0;
+
+	return HWIF(drive)->ide_dma_end(drive);
+}
+
+/*****************************************************************************
+ *
+ * ep93xx_ide_dma_test_irq()
+ *
+ * This function checks if the IDE interrupt is asserted and returns a
+ * 1 if it is, and 0 otherwise..
+ *
+ ****************************************************************************/
+static 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__);
+	/*
+	 * Return the value of the IDE interrupt bit.
+	 */
+	if( inl(IDECR) & IDECtrl_INTRQ )
+	    return 1;
+	    
+	return 0;
+}
+
+
+static int
+ep93xx_ide_dma_verbose(ide_drive_t *drive)
+{
+        DPRINTK("%s\n", __FUNCTION__ );
+	return 1;
+}
+
+
+void ep93xx_dma_init(ide_hwif_t *hwif)
+{
+    int dma_handle;
+    u32 uiTemp;
+    unsigned long flags;
+    
+    DPRINTK("%s\n", __FUNCTION__ );
+
+        local_irq_save(flags);
+        
+    	if( ep93xx_ide_allocate_dma_engine(hwif) )
+	    return;
+
+
+	/*
+	 * Init the ep93xx dma handle to 0.  This field is used to hold a
+	 * handle to the dma instance.
+	 */
+	hwif->hw.dma = 0; 
+
+	/*
+	 * Make sure the GPIO on IDE bits in the DEVCFG register are not set.
+	 */
+	uiTemp = inl(SYSCON_DEVCFG) & ~(SYSCON_DEVCFG_EonIDE |
+					SYSCON_DEVCFG_GonIDE |
+					SYSCON_DEVCFG_HonIDE);
+	SysconSetLocked( SYSCON_DEVCFG, uiTemp );
+
+	/*
+	 * Insure that neither device is selected. -wlg
+	 */
+        outl(inl(IDECR) | (IDECtrl_CS0n | IDECtrl_CS1n), IDECR);
+
+	/*
+        * Clear the MDMA and UDMA operation registers.
+        */
+	outl(0, IDEMDMAOP);
+	outl(0, IDEUDMAOP);
+
+	/*
+        * Reset the UDMA state machine.
+        */
+	outl(IDEUDMADebug_RWOE | IDEUDMADebug_RWPTR | IDEUDMADebug_RWDR | IDEUDMADebug_RROE | IDEUDMADebug_RRPTR | IDEUDMADebug_RRDR,
+	     IDEUDMADEBUG);
+	outl(0, IDEUDMADEBUG);
+
+	/*
+	 * Set up the IDE interface for PIO transfers, using the default PIO
+	 * mode.
+	 */
+	outl(IDECfg_IDEEN | IDECfg_PIO | (4 << IDECfg_MODE_SHIFT) |
+	     (1 << IDECfg_WST_SHIFT), IDECFG);
+
+	/*
+	 * Setup the ports.
+	 */
+	ide_init_hwif_ports(&hwif->hw, 0x800, 0x406, NULL);
+
+	
+            
+        /*
+	 * Get the interrupt.
+	 */
+	hwif->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.
+	 */
+	hwif->hw.dma = NO_DMA;
+ 
+ 	/*
+	 * Open an instance of the ep93xx dma interface.
+	 */
+
+	if ( ep93xx_dma_request(&dma_handle, hwif->name, DMA_IDE) != 0 ) 
+	{
+			/*
+			 * Fail, so clean up.
+			 */
+			 
+	    ep93xx_ide_release_dma_engine (hwif);
+	    return;
+	}
+
+	/*
+	 * Now that we've got a dma channel allocated, set up the rest
+	 * of the dma specific stuff.
+	 */
+	DPRINTK("\n ide init- dma channel allocated: 0x%x, %s  %d \n", dma_handle, hwif->name, DMA_IDE);
+
+	hwif->hw.dma = dma_handle;
+	/*
+	 * Enable dma support for atapi devices.
+	 */
+
+	hwif->atapi_dma			= 1;
+	hwif->ultra_mask		= 0x0f;  
+	hwif->mwdma_mask		= 0x00;
+	hwif->swdma_mask		= 0x00;
+	hwif->speedproc			= NULL;
+	hwif->autodma			= 1;
+
+	g_prd_count=0;
+  
+     	hwif->ide_dma_on 		= __ide_dma_on;
+	hwif->ide_dma_lostirq 		= __ide_dma_lostirq;
+	hwif->ide_dma_check 		= ep93xx_ide_dma_check;
+	hwif->ide_dma_host_on 		= ep93xx_ide_dma_host_on;
+
+	hwif->ide_dma_host_off 		= ep93xx_ide_dma_host_off;
+
+	hwif->ide_dma_begin 		= ep93xx_ide_dma_begin;
+	hwif->ide_dma_read 		= ep93xx_ide_dma_read;
+	hwif->ide_dma_write 		= ep93xx_ide_dma_write;
+	hwif->ide_dma_end 		= ep93xx_ide_dma_end;
+	hwif->ide_dma_off_quietly 	= ep93xx_ide_dma_off_quietly;
+	hwif->ide_dma_timeout 		= ep93xx_ide_dma_timeout;
+	hwif->ide_dma_test_irq 		= ep93xx_ide_dma_test_irq;
+	hwif->ide_dma_verbose 		= ep93xx_ide_dma_verbose;
+	
+        local_irq_restore(flags);
+}
+
+EXPORT_SYMBOL(ep93xx_dma_init);
diff -burN linux-2.6.8.1.orig/drivers/ide/arm/ide-ep93xx.c linux-2.6.8.1/drivers/ide/arm/ide-ep93xx.c
--- linux-2.6.8.1.orig/drivers/ide/arm/ide-ep93xx.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/ide/arm/ide-ep93xx.c	2005-11-23 14:56:06.000000000 -0600
@@ -0,0 +1,304 @@
+/******************************************************************************
+ * drivers/ide/arm/ide-ep93xx.c
+ *
+ * Support for IDE PIO
+ * Version 1.0 for EP93XX-E1
+ *
+ * Copyright (C) 2005  Cirrus Logic
+ *
+ * A large portion of this file is based on the ide-io.c
+ * and the respective pmac version of 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/ide.h>
+#include <linux/delay.h>
+#include <linux/proc_fs.h>
+#include <asm/io.h>
+#include <asm/ide.h>
+#include <asm/irq.h>
+#include <asm/arch/ide.h>
+#include <asm/arch/dma.h>
+#include <asm/hardware.h>
+
+extern void ep93xx_dma_init(ide_hwif_t *hwif);
+
+/*****************************************************************************
+ *
+ *  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;
+	
+	/*
+	 * Write the address out.
+	 */
+	uiIDECR = IDECtrl_DIORn | IDECtrl_DIOWn | ((addr & 7) << 2) |
+		  (addr >> 10);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Write the data out.
+	 */
+	outl(b, IDEDATAOUT);
+
+	/*
+	 * Toggle the write signal.
+	 */
+	outl(uiIDECR & ~IDECtrl_DIOWn, IDECR);
+
+	outl(uiIDECR, IDECR);
+}
+
+static void
+ep93xx_ide_outbsync(ide_drive_t *drive, u8 b, unsigned long addr)
+{
+	unsigned int uiIDECR;
+	/*
+	 * Write the address out.
+	 */
+	uiIDECR = IDECtrl_DIORn | IDECtrl_DIOWn | ((addr & 7) << 2) |
+		  (addr >> 10);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Write the data out.p
+	 */
+	outl(b, IDEDATAOUT);
+	/*
+	 * Toggle the write signal.
+	 */
+	outl(uiIDECR & ~IDECtrl_DIOWn, IDECR);
+	outl(uiIDECR, IDECR);
+}
+
+static unsigned char
+ep93xx_ide_inb(unsigned long addr)
+{
+	unsigned int uiIDECR;
+
+	/*
+	 * Write the address out.
+	 */
+	uiIDECR = IDECtrl_DIORn | IDECtrl_DIOWn | ((addr & 7) << 2) |
+		  (addr >> 10);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Toggle the read signal.
+	 */
+	outl(uiIDECR & ~IDECtrl_DIORn, IDECR);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Read the data in.
+	 */
+	return(inl(IDEDATAIN) & 0xff);
+}
+
+/*****************************************************************************
+ *
+ *  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;
+
+	/*
+	 * Write the address out.
+	 */
+	uiIDECR = IDECtrl_DIORn | IDECtrl_DIOWn | ((addr & 7) << 2) |
+		  (addr >> 10);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Write the data out.
+	 */
+	outl(w, IDEDATAOUT);
+
+	/*
+	 * Toggle the write signal.
+	 */
+	outl(uiIDECR & ~IDECtrl_DIOWn, IDECR);	
+	outl(uiIDECR, IDECR);
+}
+
+static u16
+ep93xx_ide_inw(unsigned long addr)
+{
+	unsigned int uiIDECR;
+
+	/*
+	 * Write the address out.
+	 */
+	uiIDECR = IDECtrl_DIORn | IDECtrl_DIOWn | ((addr & 7) << 2) |
+		  (addr >> 10);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Toggle the read signal.
+	 */
+	outl(uiIDECR & ~IDECtrl_DIORn, IDECR);
+	outl(uiIDECR, IDECR);
+
+	/*
+	 * Read the data in.
+	 */
+	return(inl(IDEDATAIN) & 0xffff);
+}
+
+/*****************************************************************************
+ *
+ *  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;
+
+	/*
+	 * Read in data from the data register 16 bits at a time.
+	 */
+	for (; count; count--)
+		*data++ = ep93xx_ide_inw(addr);
+}
+
+static void
+ep93xx_ide_outsw(unsigned long addr, void *buf, u32 count)
+{
+	unsigned short *data = (unsigned short *)buf;
+
+	/*
+	 * Write out data to the data register 16 bits at a time.
+	 */
+	for (; count; count--)
+		ep93xx_ide_outw(*data++, addr);
+}
+
+static void
+ep93xx_ata_input_data(ide_drive_t *drive, void *buffer, u32 count)
+{
+	/*
+	 * Read in the specified number of half words from the ide interface.
+	 */
+	ep93xx_ide_insw(IDE_DATA_REG, buffer, count << 1);
+}
+
+static void
+ep93xx_ata_output_data(ide_drive_t *drive, void *buffer, u32 count)
+{
+	/*
+	 * write the specified number of half words from the ide interface
+	 * to the ide device.
+	 */
+	ep93xx_ide_outsw(IDE_DATA_REG, buffer, count << 1);
+}
+
+static void
+ep93xx_atapi_input_bytes(ide_drive_t *drive, void *buffer, u32 count)
+{
+	/*
+	 * read in the specified number of bytes from the ide interface.
+	 */
+	ep93xx_ide_insw(IDE_DATA_REG, buffer, (count >> 1) + (count & 1));
+}
+
+static void
+ep93xx_atapi_output_bytes(ide_drive_t *drive, void *buffer, u32 count)
+{
+	/*
+	 * Write the specified number of bytes from the ide interface
+	 * to the ide device.
+	 */
+	ep93xx_ide_outsw(IDE_DATA_REG, buffer, (count >> 1) + (count & 1));
+}
+
+
+
+
+void
+ep93xx_ide_init(struct hwif_s *hwif)
+{
+      
+    u32 uiTemp;         
+	      
+	/*
+	 * Make sure the GPIO on IDE bits in the DEVCFG register are not set.
+	 */
+	uiTemp = inl(SYSCON_DEVCFG) & ~(SYSCON_DEVCFG_EonIDE |
+					SYSCON_DEVCFG_GonIDE |
+					SYSCON_DEVCFG_HonIDE);
+	SysconSetLocked( SYSCON_DEVCFG, uiTemp );
+
+	/*
+	 * Insure that neither device is selected. -wlg
+	 */
+        outl(inl(IDECR) | (IDECtrl_CS0n | IDECtrl_CS1n), IDECR);
+
+	/*
+	 * Make sure that MWDMA and UDMA are disabled.
+	 */
+	outl(0, IDEMDMAOP);
+	outl(0, IDEUDMAOP);
+
+	/*
+	 * Set up the IDE interface for PIO transfers, using the default PIO
+	 * mode.
+	 */
+	outl(IDECfg_IDEEN | IDECfg_PIO | (4 << IDECfg_MODE_SHIFT) |
+	     (1 << IDECfg_WST_SHIFT), IDECFG);
+
+	/*
+	 * Setup the ports.
+	 */
+	ide_init_hwif_ports(&(hwif->hw), 0x800, 0x406, NULL);
+	      
+	/*
+	 *  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->OUTSW = ep93xx_ide_outsw;
+
+	hwif->INB = ep93xx_ide_inb;
+	hwif->INW = ep93xx_ide_inw;
+	hwif->INSW = ep93xx_ide_insw;
+
+
+	ep93xx_dma_init(hwif);
+}
+
+
+
diff -burN linux-2.6.8.1.orig/drivers/ide/arm/Makefile linux-2.6.8.1/drivers/ide/arm/Makefile
--- linux-2.6.8.1.orig/drivers/ide/arm/Makefile	2004-08-14 05:54:46.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/arm/Makefile	2005-11-23 14:56:06.000000000 -0600
@@ -1,5 +1,7 @@
 
 obj-$(CONFIG_BLK_DEV_IDE_ICSIDE)	+= icside.o
 obj-$(CONFIG_BLK_DEV_IDE_RAPIDE)	+= rapide.o
+obj-$(CONFIG_BLK_DEV_IDE_EP93XX)	+= ide-ep93xx.o
+obj-$(CONFIG_BLK_DEV_IDE_DMA_EP93XX)	+= ide-dma-ep93xx.o
 
 EXTRA_CFLAGS	:= -Idrivers/ide
diff -burN linux-2.6.8.1.orig/drivers/ide/ide-cd.c linux-2.6.8.1/drivers/ide/ide-cd.c
--- linux-2.6.8.1.orig/drivers/ide/ide-cd.c	2004-08-14 05:55:22.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/ide-cd.c	2005-10-11 01:32:45.000000000 -0500
@@ -1057,8 +1057,13 @@
 	 */
 	if (dma) {
 		info->dma = 0;
+	#ifdef CONFIG_ARCH_EP93XX
+	         dma_error = HWIF(drive)->ide_dma_end(drive);
+        #else		 	
 		if ((dma_error = HWIF(drive)->ide_dma_end(drive)))
 			__ide_dma_off(drive);
+	#endif
+	
 	}
 
 	if (cdrom_decode_status(drive, 0, &stat))
@@ -1069,7 +1074,14 @@
 			ide_end_request(drive, 1, rq->nr_sectors);
 			return ide_stopped;
 		} else
+   #ifdef CONFIG_ARCH_EP93XX	
+           
+	    return  ide_stopped;
+   #else
 			return DRIVER(drive)->error(drive, "dma error", stat);
+	   
+    #endif
+	    
 	}
 
 	/* Read the interrupt reason and the transfer length. */
diff -burN linux-2.6.8.1.orig/drivers/ide/ide-io.c linux-2.6.8.1/drivers/ide/ide-io.c
--- linux-2.6.8.1.orig/drivers/ide/ide-io.c	2004-08-14 05:55:59.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/ide-io.c	2005-09-01 22:26:39.000000000 -0500
@@ -647,7 +647,7 @@
 
 	SELECT_DRIVE(drive);
 	if (ide_wait_stat(&startstop, drive, drive->ready_stat, BUSY_STAT|DRQ_STAT, WAIT_READY)) {
-		printk(KERN_ERR "%s: drive not ready for command\n", drive->name);
+	//	printk(KERN_ERR "%s: drive not ready for command\n", drive->name);
 		return startstop;
 	}
 	if (!drive->special.all) {
@@ -941,7 +941,7 @@
 		ret = DRIVER(drive)->error(drive, "dma timeout error",
 						hwif->INB(IDE_STATUS_REG));
 	} else {
-		printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
+//		printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
 		(void) hwif->ide_dma_timeout(drive);
 	}
 
diff -burN linux-2.6.8.1.orig/drivers/ide/ide-iops.c linux-2.6.8.1/drivers/ide/ide-iops.c
--- linux-2.6.8.1.orig/drivers/ide/ide-iops.c	2004-08-14 05:55:10.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/ide-iops.c	2005-09-08 03:05:21.000000000 -0500
@@ -30,23 +30,46 @@
 #include <asm/io.h>
 #include <asm/bitops.h>
 
+//#undef DEBUG
+#define DEBUG 1
+#ifdef DEBUG
+#  define DPRINTK(fmt, args...)	printk("%s: " fmt, __FUNCTION__ , ## args)
+#else
+#  define DPRINTK(fmt, args...)
+#endif
+
+
 /*
  *	Conventional PIO operations for ATA devices
  */
 
 static u8 ide_inb (unsigned long port)
 {
+#if defined( CONFIG_ARCH_EDB7312 )
+	return IN_BYTE(port);
+#elif defined( CONFIG_ARCH_EP93XX )
+	return (u8) ep93xx_pcmcia_ide_inb(port);
+#else
 	return (u8) inb(port);
+#endif
 }
 
 static u16 ide_inw (unsigned long port)
 {
+#ifdef CONFIG_ARCH_EP93XX
+	return (u16) ep93xx_pcmcia_ide_inw(port);
+#else
 	return (u16) inw(port);
+#endif
 }
 
 static void ide_insw (unsigned long port, void *addr, u32 count)
 {
-	insw(port, addr, count);
+#ifdef CONFIG_ARCH_EP93XX
+	return ep93xx_pcmcia_ide_insw(port, addr, count);
+#else
+	return insw(port, addr, count);
+#endif
 }
 
 static u32 ide_inl (unsigned long port)
@@ -61,22 +84,43 @@
 
 static void ide_outb (u8 val, unsigned long port)
 {
-	outb(val, port);
+#if defined( CONFIG_ARCH_EDB7312 )
+	OUT_BYTE(val, port);
+#elif defined( CONFIG_ARCH_EP93XX )
+	ep93xx_pcmcia_ide_outb(val, port);
+#else
+	outb(addr, port);
+#endif
 }
 
 static void ide_outbsync (ide_drive_t *drive, u8 addr, unsigned long port)
 {
+#ifdef CONFIG_ARCH_EP93XX
+	ep93xx_pcmcia_ide_outb(addr, port);
+#else
 	outb(addr, port);
+#endif
 }
 
 static void ide_outw (u16 val, unsigned long port)
 {
-	outw(val, port);
+#ifdef CONFIG_ARCH_EP93XX
+	ep93xx_pcmcia_ide_outw(val, port);
+#else
+	outw(addr, port);
+#endif
 }
 
+
+
+
 static void ide_outsw (unsigned long port, void *addr, u32 count)
 {
+#ifdef CONFIG_ARCH_EP93XX
+	ep93xx_pcmcia_ide_outsw(port, addr, count);
+#else
 	outsw(port, addr, count);
+#endif	
 }
 
 static void ide_outl (u32 val, unsigned long port)
@@ -1002,7 +1046,9 @@
 	if(hwgroup->handler)
 		BUG();
 	hwgroup->handler	= handler;
+//	DPRINTK(" \n \n hwgroup->expiry begin \n \n ");
 	hwgroup->expiry		= expiry;
+//        DPRINTK(" \n \n hwgroup->expiry end \n \n ");
 	hwgroup->timer.expires	= jiffies + timeout;
 	add_timer(&hwgroup->timer);
 	hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG);
@@ -1271,11 +1317,15 @@
 	u8 stat = 0;
 
 	while(timeout--) {
+	
+	
 		/*
 		 * Turn this into a schedule() sleep once I'm sure
 		 * about locking issues (2.5 work ?).
 		 */
+		// mdelay(1);
 		mdelay(1);
+		
 		stat = hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]);
 		if ((stat & BUSY_STAT) == 0)
 			return 0;
@@ -1290,5 +1340,8 @@
 	return -EBUSY;
 }
 
+
+
+
 EXPORT_SYMBOL_GPL(ide_wait_not_busy);
 
diff -burN linux-2.6.8.1.orig/drivers/ide/ide-lib.c linux-2.6.8.1/drivers/ide/ide-lib.c
--- linux-2.6.8.1.orig/drivers/ide/ide-lib.c	2004-08-14 05:56:23.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/ide-lib.c	2005-10-11 01:32:18.000000000 -0500
@@ -91,47 +91,47 @@
 	switch(mode) {
 		case 0x04:
 			if ((id->dma_ultra & 0x0040) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0040))
 				{ speed = XFER_UDMA_6; break; }
 		case 0x03:
 			if ((id->dma_ultra & 0x0020) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0020))
 				{ speed = XFER_UDMA_5; break; }
 		case 0x02:
 			if ((id->dma_ultra & 0x0010) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0010))
 				{ speed = XFER_UDMA_4; break; }
 			if ((id->dma_ultra & 0x0008) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0008))
 				{ speed = XFER_UDMA_3; break; }
 		case 0x01:
 			if ((id->dma_ultra & 0x0004) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0004))
 				{ speed = XFER_UDMA_2; break; }
 			if ((id->dma_ultra & 0x0002) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0002))
 				{ speed = XFER_UDMA_1; break; }
 			if ((id->dma_ultra & 0x0001) &&
-			    (id->dma_ultra & hwif->ultra_mask))
+			    (id->dma_ultra & hwif->ultra_mask & 0x0001))
 				{ speed = XFER_UDMA_0; break; }
 		case 0x00:
 			if ((id->dma_mword & 0x0004) &&
-			    (id->dma_mword & hwif->mwdma_mask))
+			    (id->dma_mword & hwif->mwdma_mask & 0x0004))
 				{ speed = XFER_MW_DMA_2; break; }
 			if ((id->dma_mword & 0x0002) &&
-			    (id->dma_mword & hwif->mwdma_mask))
+			    (id->dma_mword & hwif->mwdma_mask & 0x0002))
 				{ speed = XFER_MW_DMA_1; break; }
 			if ((id->dma_mword & 0x0001) &&
-			    (id->dma_mword & hwif->mwdma_mask))
+			    (id->dma_mword & hwif->mwdma_mask & 0x0001))
 				{ speed = XFER_MW_DMA_0; break; }
 			if ((id->dma_1word & 0x0004) &&
-			    (id->dma_1word & hwif->swdma_mask))
+			    (id->dma_1word & hwif->swdma_mask & 0x0004))
 				{ speed = XFER_SW_DMA_2; break; }
 			if ((id->dma_1word & 0x0002) &&
-			    (id->dma_1word & hwif->swdma_mask))
+			    (id->dma_1word & hwif->swdma_mask & 0x0002))
 				{ speed = XFER_SW_DMA_1; break; }
 			if ((id->dma_1word & 0x0001) &&
-			    (id->dma_1word & hwif->swdma_mask))
+			    (id->dma_1word & hwif->swdma_mask & 0x0001))
 				{ speed = XFER_SW_DMA_0; break; }
 	}
 
diff -burN linux-2.6.8.1.orig/drivers/ide/Kconfig linux-2.6.8.1/drivers/ide/Kconfig
--- linux-2.6.8.1.orig/drivers/ide/Kconfig	2004-08-14 05:55:32.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/Kconfig	2005-09-26 21:06:03.000000000 -0500
@@ -324,6 +324,19 @@
 	  and your BIOS does not already do this for you, then say Y here.
 	  Otherwise say N.
 
+config BLK_DEV_IDE_EP93XX
+        bool "EP93xx support"
+        depends on (ARCH_EP9312 || ARCH_EP9315 || ARCH_EP9315A )
+        help
+          If you want IDE support for EP9312&EP9315&EP9315A, say Y here.
+
+config BLK_DEV_IDE_DMA_EP93XX
+        bool "EP93xx IDE DMA support"
+       depends on (ARCH_EP9312 || ARCH_EP9315 || ARCH_EP9315A )
+        help
+          If you want IDE DMA support for your EP9312&EP9315&EP9315A, say Y here.
+
+                                                                                                                     
 config BLK_DEV_IDEPNP
 	bool "PNP EIDE support"
 	depends on PNP
@@ -798,7 +811,7 @@
 	  Apple machines.
 
 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 || ARCH_EP9312 || ARCH_EP9315 || ARCH_EP9315A )
 
 config BLK_DEV_IDE_ICSIDE
 	tristate "ICS IDE interface support"
@@ -1038,7 +1051,7 @@
 endif
 
 config BLK_DEV_IDEDMA
-	def_bool BLK_DEV_IDEDMA_PCI || BLK_DEV_IDEDMA_PMAC || BLK_DEV_IDEDMA_ICS
+	def_bool BLK_DEV_IDEDMA_PCI || BLK_DEV_IDEDMA_PMAC || BLK_DEV_IDEDMA_ICS || BLK_DEV_IDE_DMA_EP93XX
 
 config IDEDMA_IVB
 	bool "IGNORE word93 Validation BITS"
diff -burN linux-2.6.8.1.orig/drivers/ide/legacy/ide-cs.c linux-2.6.8.1/drivers/ide/legacy/ide-cs.c
--- linux-2.6.8.1.orig/drivers/ide/legacy/ide-cs.c	2004-08-14 05:55:47.000000000 -0500
+++ linux-2.6.8.1/drivers/ide/legacy/ide-cs.c	2005-12-12 23:51:50.000000000 -0600
@@ -413,11 +413,14 @@
 	   -- need to investigate the required PCMCIA magic */
 	ide_unregister(info->hd);
 	/* deal with brain dead IDE resource management */
+#ifndef CONFIG_ARCH_EP93XX
 	request_region(link->io.BasePort1, link->io.NumPorts1,
 		       info->node.dev_name);
 	if (link->io.NumPorts2)
 	    request_region(link->io.BasePort2, link->io.NumPorts2,
 			   info->node.dev_name);
+#endif
+    
     }
     info->ndev = 0;
     link->dev = NULL;
diff -burN linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_keypad.c linux-2.6.8.1/drivers/input/keyboard/ep93xx_keypad.c
--- linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_keypad.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/input/keyboard/ep93xx_keypad.c	2006-11-02 01:18:01.000000000 -0600
@@ -0,0 +1,425 @@
+/******************************************************************************
+ * 
+ *  File:   linux/drivers/input/keyboard/ep93xx_keypad.c
+ *
+ *  Purpose:    Support for 8x8 keypad (With Scroll Wheel) for a Cirrus Logic EP93xx
+ *
+ *  History:    
+ *              For Sirius (Internet Radio) Project.
+ *
+ * Copyright 2006 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
+ *   
+ ******************************************************************************/
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/delay.h>
+#include <linux/wait.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/poll.h>
+#include <linux/miscdevice.h>
+#include <linux/init.h>
+#include <linux/compiler.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/syscalls.h>
+#include <linux/input.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#include "ep93xx_keypad.h"
+
+static struct ep93xx_keypad_dev dev;
+static char *name = "Cirrus EP93xx 8x8 keypad driver";
+
+#define WHEEL_SOFT_DEBOUNCE	2
+static void handle_scancode(struct ep93xx_keypad_dev* pdev, unsigned char scancode, int down)
+{   
+#ifdef FIX_FOR_EC12E2424404
+    int i, wheel1_count=0, wheel2_count=0;
+    if(down && ((scancode == KEY_WHEEL_1) || (scancode == KEY_WHEEL_2)) )
+    {
+        pdev->wheelkey_count &= 0x03;
+        pdev->wheelkey_buffer[pdev->wheelkey_count] = scancode;
+        pdev->wheelkey_count ++;
+
+        if(pdev->wheelkey_hit)
+        {
+            for(i=0;i<=pdev->wheelkey_count;i++)
+            {
+                if(pdev->wheelkey_buffer[i]==KEY_WHEEL_1) wheel1_count++;
+                if(pdev->wheelkey_buffer[i]==KEY_WHEEL_2) wheel2_count++;
+            }
+            if(wheel1_count >= WHEEL_SOFT_DEBOUNCE)
+            {
+                input_report_key((struct input_dev*)&dev, KEY_WHEEL_1, 1);
+                input_report_key((struct input_dev*)&dev, KEY_WHEEL_1, 0);
+                input_sync((struct input_dev*)&dev);
+            }
+            else if(wheel2_count >= WHEEL_SOFT_DEBOUNCE)
+            {
+                input_report_key((struct input_dev*)&dev, KEY_WHEEL_2, 1);
+                input_report_key((struct input_dev*)&dev, KEY_WHEEL_2, 0);
+                input_sync((struct input_dev*)&dev);
+            }
+            pdev->wheelkey_hit = 0;
+            pdev->wheelkey_count = 0;
+        }
+    }
+    else
+#endif
+    if(scancode > 0)
+    {
+        input_report_key((struct input_dev*)&dev, scancode, down);
+        input_sync((struct input_dev*)&dev);
+    }
+}
+
+static irqreturn_t ep93xx_keypad_isr(int irq, void *dev_id, struct pt_regs *regs)
+{
+    int nkey1,nkey2;
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+    int phase,step;
+#endif
+    unsigned long status;
+    struct ep93xx_keypad_dev* pdev = (struct ep93xx_keypad_dev*)dev_id;
+    
+    status = inl(KEY_REG);
+    
+    status &= 0x3fff;
+
+/*  printk("status = %08x\n", (int)status);
+    printk("%d\n",wheel_phase_table[pdev->wheelkey]);
+*/
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+    phase = wheel_phase_table[pdev->wheelkey&0x3];
+#endif
+
+    if(status & KEYREG_KEY2)
+    {
+        nkey1 = KeyPadTable[ (status & KEYREG_KEY1_MASK)>>KEYREG_KEY1_SHIFT ];
+        nkey2 = KeyPadTable[ (status & KEYREG_KEY2_MASK)>>KEYREG_KEY2_SHIFT ];
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+        if( (nkey1 == KEY_WHEEL_1) || (nkey2 == KEY_WHEEL_1) )
+        {
+            pdev->wheelkey |= WHEEL_FLAG1;
+        }
+        if( (nkey1 == KEY_WHEEL_2) || (nkey2 == KEY_WHEEL_2) )
+        {
+            pdev->wheelkey |= WHEEL_FLAG2;
+        }
+        if(pdev->last_key1 >0 || pdev->last_key2 >0)
+        {
+            if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) && (nkey2 != pdev->last_key1) )
+            {
+                handle_scancode(pdev, pdev->last_key1, 0);
+                pdev->last_key1 = 0;
+            }
+            if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) && (nkey2 != pdev->last_key2) )
+            {
+                handle_scancode(pdev, pdev->last_key2, 0);
+                pdev->last_key2 = 0;
+            }
+        }
+
+        if( (nkey1 != KEY_WHEEL_1) && (nkey1 != KEY_WHEEL_2) )
+        {
+            if( (nkey1 != pdev->last_key1) && (nkey1 != pdev->last_key2) )
+            {
+                handle_scancode(pdev, nkey1, 1);
+                pdev->last_key1 = nkey1;
+            }
+        }
+
+        if( (nkey2 != KEY_WHEEL_1) && (nkey2 != KEY_WHEEL_2) )
+        {
+            if( (nkey2 != pdev->last_key1) && (nkey2 != pdev->last_key2) )
+            {
+                handle_scancode(pdev, nkey2, 1);
+                pdev->last_key2 = nkey2;
+            }
+        }
+#else
+        if(pdev->last_key1 >0 || pdev->last_key2 >0)
+        {
+            if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) && (nkey2 != pdev->last_key1) )
+            {
+                handle_scancode(pdev, pdev->last_key1, 0);
+                pdev->last_key1 = 0;
+            }
+            if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) && (nkey2 != pdev->last_key2) )
+            {
+                handle_scancode(pdev, pdev->last_key2, 0);
+                pdev->last_key2 = 0;
+            }
+        }
+
+        if( (nkey1 != pdev->last_key1) && (nkey1 != pdev->last_key2) )
+        {
+            handle_scancode(pdev, nkey1, 1);
+            pdev->last_key1 = nkey1;
+        }
+        if( (nkey2 != pdev->last_key1) && (nkey2 != pdev->last_key2) )
+        {
+            handle_scancode(pdev, nkey2, 1);
+            pdev->last_key2 = nkey2;
+        }
+#endif
+    }
+    else if(status & KEYREG_KEY1)
+    {
+        nkey1 = KeyPadTable[ (status & KEYREG_KEY1_MASK)>>KEYREG_KEY1_SHIFT ];
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+        if(nkey1 == KEY_WHEEL_1)
+        {
+            pdev->wheelkey |= WHEEL_FLAG1;
+            if(pdev->wheelkey & WHEEL_FLAG2)
+            {
+                pdev->wheelkey &= ~WHEEL_FLAG2;
+            }
+            if(pdev->last_key1 >0 || pdev->last_key2 >0)
+            {
+                if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) )
+                {
+                    handle_scancode(pdev, pdev->last_key1, 0);
+                    pdev->last_key1 = 0;
+                }
+                if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) )
+                {
+                    handle_scancode(pdev, pdev->last_key2, 0);
+                    pdev->last_key2 = 0;
+                }
+            }
+        }
+        else if(nkey1 == KEY_WHEEL_2)
+        {
+            pdev->wheelkey |= WHEEL_FLAG2;
+            if(pdev->wheelkey & WHEEL_FLAG1)
+            {
+                pdev->wheelkey &= ~WHEEL_FLAG1;
+            }
+            if(pdev->last_key1 >0 || pdev->last_key2 >0)
+            {
+                if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) )
+                {
+                    handle_scancode(pdev, pdev->last_key1, 0);
+                    pdev->last_key1 = 0;
+                }
+                if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) )
+                {
+                    handle_scancode(pdev, pdev->last_key2, 0);
+                    pdev->last_key2 = 0;
+                }
+            }
+        }
+        else
+        {
+            if(pdev->wheelkey & WHEEL_FLAG2)
+            {
+                pdev->wheelkey &= ~WHEEL_FLAG2;
+            }
+            if(pdev->wheelkey & WHEEL_FLAG1)
+            {
+                pdev->wheelkey &= ~WHEEL_FLAG1;
+            }
+            if(pdev->last_key1 >0 || pdev->last_key2 >0)
+            {
+                if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) )
+                {
+                    handle_scancode(pdev, pdev->last_key1, 0);
+                    pdev->last_key1 = 0;
+                }
+                if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) )
+                {
+                    handle_scancode(pdev, pdev->last_key2, 0);
+                    pdev->last_key2 = 0;
+                }
+            }
+            handle_scancode(pdev, nkey1, 1);
+            pdev->last_key1 = nkey1;
+        }
+#else
+        if(pdev->last_key1 >0 || pdev->last_key2 >0)
+        {
+            if((pdev->last_key1 > 0) && (nkey1 != pdev->last_key1) )
+            {
+                handle_scancode(pdev, pdev->last_key1, 0);
+                pdev->last_key1 = 0;
+            }
+            if((pdev->last_key2 > 0) && (nkey1 != pdev->last_key2) )
+            {
+                handle_scancode(pdev, pdev->last_key2, 0);
+                pdev->last_key2 = 0;
+            }
+        }
+        handle_scancode(pdev, nkey1, 1);
+        pdev->last_key1 = nkey1;
+#endif
+    }
+    else
+    {
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+        if(pdev->wheelkey & WHEEL_FLAG2)
+        {
+            pdev->wheelkey &= ~WHEEL_FLAG2;
+        }
+        if(pdev->wheelkey & WHEEL_FLAG1)
+        {
+            pdev->wheelkey &= ~WHEEL_FLAG1;
+        }
+#ifdef FIX_FOR_EC12E2424404
+        pdev->wheelkey_hit = 1;
+#endif
+
+#endif
+        if(pdev->last_key1)
+        {
+            handle_scancode(pdev, pdev->last_key1, 0);
+            pdev->last_key1 = 0;
+        }
+        if(pdev->last_key2)
+        {
+            handle_scancode(pdev, pdev->last_key2, 0);
+            pdev->last_key2 = 0;
+        }
+    }
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+    if(phase != wheel_phase_table[pdev->wheelkey&0x3])
+    {
+        step = ((wheel_phase_table[pdev->wheelkey&0x3] - phase + 4 ) % 4 );
+        if(step == 2)
+            step = pdev->last_wheel_step;
+        else
+            pdev->last_wheel_step = step;
+        
+        /*printk("step %d\n",step);*/
+        switch(step)
+        {
+        case 1:
+            handle_scancode(pdev, KEY_WHEEL_1, 1);
+            handle_scancode(pdev, KEY_WHEEL_1, 0);
+            break;
+        case 3:
+            handle_scancode(pdev, KEY_WHEEL_2, 1);
+            handle_scancode(pdev, KEY_WHEEL_2, 0);
+            break;
+        default:
+            break;
+        }
+    }
+#endif
+    return(IRQ_HANDLED);
+}
+ 
+unsigned long setprescale (unsigned short nScale)
+{
+    unsigned long nValue;
+
+    nValue = inl(SCANINIT);
+    nValue = ( nValue & (~SCANINIT_PRSCL_MASK) ) | (nScale & SCANINIT_PRSCL_MASK);
+    outl(nValue, SCANINIT);
+    return nValue;
+}
+
+unsigned long setdebounce (unsigned char nDebounce)
+{
+    unsigned long nValue;
+
+    nValue = inl(SCANINIT);
+    nValue = ( nValue & (~SCANINIT_DBNC_MASK) ) | ((nDebounce<<16) & SCANINIT_DBNC_MASK);
+    outl(nValue, SCANINIT);
+    return nValue;
+}
+
+void keypad_enable ( unsigned char bState )
+{
+    unsigned long nreg;
+    if( bState ) 
+    {
+        nreg = inl(SYSCON_KTDIV);
+        nreg |= SYSCON_KTDIV_KEN;
+        SysconSetLocked( SYSCON_KTDIV, nreg );    
+    }
+    else
+    {
+        nreg = inl(SYSCON_KTDIV);
+        nreg &= (~SYSCON_KTDIV_KEN);
+        SysconSetLocked( SYSCON_KTDIV, nreg );    
+    }
+    return;
+}
+
+//=============================================================================
+// ep93xx_keypad_init
+//=============================================================================
+int __init ep93xx_keypad_init(void)
+{
+    int i;
+    int retval;
+
+    printk("%s\n", name);
+    init_input_dev((struct input_dev*)&dev);
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+    dev.wheelkey = 0;
+    dev.last_wheel_step = 0;
+#ifdef FIX_FOR_EC12E2424404
+    dev.wheelkey_count = 0;
+    dev.wheelkey_hit = 0;
+#endif
+
+#endif
+
+    dev.last_key1 = 0;
+    dev.last_key2 = 0;
+    dev.input.name = name;
+    dev.input.evbit[0] = BIT(EV_KEY);
+
+    for (i = 0; i < KeyPad_SIZE; i++)
+        set_bit(KeyPadTable[i], dev.input.keybit);
+
+#ifdef FIX_FOR_EC12E2424404
+    setdebounce(0xfc);
+    setprescale(0x8);
+#else
+    setdebounce(0xfe);
+    setprescale(0x80);
+#endif
+    retval = request_irq( IRQ_KEY, ep93xx_keypad_isr, SA_INTERRUPT, "ep93xx_keypad", (void*)&dev);
+    if( retval )
+    {
+        printk(KERN_WARNING "ep93xx_keypad: failed to get keypad IRQ\n");
+        return retval;
+    }
+    
+    input_register_device((struct input_dev*)&dev);
+
+    keypad_enable(1);
+
+    return 0;
+}
+
+void __exit ep93xx_keypad_cleanup(void)
+{
+    keypad_enable(0);
+    input_unregister_device((struct input_dev*)&dev);
+    free_irq( IRQ_KEY, (void*)&dev );
+}
+
+module_init(ep93xx_keypad_init);
+module_exit(ep93xx_keypad_cleanup);
+MODULE_LICENSE("GPL");
diff -burN linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_keypad.h linux-2.6.8.1/drivers/input/keyboard/ep93xx_keypad.h
--- linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_keypad.h	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/input/keyboard/ep93xx_keypad.h	2006-07-10 13:58:58.000000000 -0500
@@ -0,0 +1,95 @@
+/*
+ * ep93xx_keypad.h Keymap definitions
+ */
+
+#if defined(CONFIG_KEYBOARD_EP93XX_SCROLL_WHEEL)
+#define SCROLL_WHEEL_KEY_SUPPORT
+#endif
+
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+
+/*
+ *  Support for a scroll wheel key:
+ *      ALPS 12mm Size Insulated Shaft Type Encoder.
+ *  Part NO. :      EC12E2424404
+ *  Connect TO:     Col1/2-Row3
+ */
+#define FIX_FOR_EC12E2424404 1
+
+
+#define KEY_WHEEL_1      KEY_UP
+#define KEY_WHEEL_2      KEY_DOWN
+
+static int wheel_phase_table[16] = {1,0,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
+
+
+#endif
+
+
+//
+// This table is used to map the scan code to the Linux default keymap.
+//
+#define KeyPad_SIZE         (8*8)
+static unsigned int const KeyPadTable[KeyPad_SIZE] = 
+{
+/*             COL0        COL1        CLO2        COL3       COL4       COL5       COL6       COL7   */
+/*ROW0*/       KEY_ESC,    KEY_1 ,     KEY_2 ,     0,         0,         0,         0,         0, 
+/*ROW1*/       KEY_3 ,     KEY_4 ,     KEY_5 ,     0,         0,         0,         0,         0, 
+/*ROW2*/       KEY_6 ,     KEY_7 ,     KEY_ENTER,  0,         0,         0,         0,         0, 
+/*ROW3*/       0,          KEY_UP,     KEY_DOWN,   0,         0,         0,         0,         0, 
+/*ROW4*/       0,          0,          0,          0,         0,         0,         0,         0, 
+/*ROW5*/       0,          0,          0,          0,         0,         0,         0,         0, 
+/*ROW6*/       0,          0,          0,          0,         0,         0,         0,         0, 
+/*ROW7*/       0,          0,          0,          0,         0,         0,         0,         0
+};
+
+struct ep93xx_keypad_dev
+{
+    struct input_dev input;
+
+#ifdef SCROLL_WHEEL_KEY_SUPPORT
+
+#define WHEEL_FLAG1   1
+#define WHEEL_FLAG2  2
+    int wheelkey;
+    int last_wheel_step;
+
+#ifdef FIX_FOR_EC12E2424404
+    int wheelkey_buffer[4];
+    int wheelkey_count;
+    int wheelkey_hit;
+#endif
+
+#endif
+
+    int last_key1;
+    int last_key2;
+
+};
+
+#define SCANINIT_PRSCL_MASK         0x000003FF
+#define SCANINIT_PRSCL_SHIFT        0L
+#define SCANINIT_T2                 0x00001000
+#define SCANINIT_BACK               0x00002000
+#define SCANINIT_DIAG               0x00004000
+#define SCANINIT_DIS3KY             0x00008000
+#define SCANINIT_DBNC_MASK          0x00FF0000
+#define SCANINIT_DBNC_SHIFT         16L
+
+#define KEYREG_KEY1_MASK            0x0000003F
+#define KEYREG_KEY1_SHIFT           0L
+#define KEYREG_KEY2_MASK            0x00000Fc0
+#define KEYREG_KEY2_SHIFT           6L
+#define KEYREG_KEY1ROW_MASK         0x00000007
+#define KEYREG_KEY1ROW_SHIFT        0L
+#define KEYREG_KEY1COL_MASK         0x00000038
+#define KEYREG_KEY1COL_SHIFT        3L
+#define KEYREG_KEY2ROW_MASK         0x000001c0
+#define KEYREG_KEY2ROW_SHIFT        6L
+#define KEYREG_KEY2COL_MASK         0x00000E00
+#define KEYREG_KEY2COL_SHIFT        9L
+
+#define KEYREG_KEY1                 0x00001000
+#define KEYREG_KEY2                 0x00002000
+#define KEYREG_INT                  0x00004000
+#define KEYREG_K                    0x00008000
diff -burN linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_spi_kbd.c linux-2.6.8.1/drivers/input/keyboard/ep93xx_spi_kbd.c
--- linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_spi_kbd.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/input/keyboard/ep93xx_spi_kbd.c	2005-07-07 02:54:02.000000000 -0500
@@ -0,0 +1,422 @@
+/******************************************************************************
+ * 
+ *  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 
+ *
+ * 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.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;
+static char *name = "Cirrus EP93xx PS/2 keyboard driver";
+
+//-----------------------------------------------------------------------------
+//  Debug stuff...
+//-----------------------------------------------------------------------------
+
+#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
+
+typedef struct {
+	unsigned char scancode;
+	unsigned char count;
+} key_down_tracker_t;
+
+//
+// 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 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);
+
+
+/* 
+ * wrapper: 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
+//=============================================================================
+static void InitSniffer(void)
+{
+	int i;
+
+	//
+	// 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.
+	//
+	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);
+}
+
+//=============================================================================
+// EP93XXSpiKbdInit
+//=============================================================================
+int __init EP93XXSpiKbdInit(void)
+{
+	int i;
+	printk("%s\n", name);
+
+	ep93xxkbd_dev.name = 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 -burN linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_spi_kbd.h linux-2.6.8.1/drivers/input/keyboard/ep93xx_spi_kbd.h
--- linux-2.6.8.1.orig/drivers/input/keyboard/ep93xx_spi_kbd.h	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/input/keyboard/ep93xx_spi_kbd.h	2005-07-07 02:53:05.000000000 -0500
@@ -0,0 +1,149 @@
+/*
+ * 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 -burN linux-2.6.8.1.orig/drivers/input/keyboard/Kconfig linux-2.6.8.1/drivers/input/keyboard/Kconfig
--- linux-2.6.8.1.orig/drivers/input/keyboard/Kconfig	2004-08-14 05:56:22.000000000 -0500
+++ linux-2.6.8.1/drivers/input/keyboard/Kconfig	2006-07-10 14:11:34.000000000 -0500
@@ -96,3 +96,22 @@
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called amikbd.
+
+config KEYBOARD_EP93XX_SPI
+	tristate "EP93xx PS2 Keyboard support"
+	depends on ARCH_EP93XX && INPUT && INPUT_KEYBOARD 
+	help
+	  Say Y here if you want support for a PS2 keyboard connected via SPI.
+
+config KEYBOARD_EP93XX_KEYPAD
+	tristate "EP93xx 8x8 Keypad support"
+	depends on ARCH_EP93XX && INPUT && INPUT_KEYBOARD
+	help
+	  Say Y here if you want support for an 8x8 keypad.
+
+config KEYBOARD_EP93XX_SCROLL_WHEEL
+	bool "EP93xx Scrollwheel support"
+	depends on KEYBOARD_EP93XX_KEYPAD
+	help
+	  Say Y here if you want support for a Scroll Wheel.
+
diff -burN linux-2.6.8.1.orig/drivers/input/keyboard/Makefile linux-2.6.8.1/drivers/input/keyboard/Makefile
--- linux-2.6.8.1.orig/drivers/input/keyboard/Makefile	2004-08-14 05:56:26.000000000 -0500
+++ linux-2.6.8.1/drivers/input/keyboard/Makefile	2006-07-10 13:58:58.000000000 -0500
@@ -12,3 +12,5 @@
 obj-$(CONFIG_KEYBOARD_AMIGA)		+= amikbd.o
 obj-$(CONFIG_KEYBOARD_NEWTON)		+= newtonkbd.o
 obj-$(CONFIG_KEYBOARD_98KBD)		+= 98kbd.o
+obj-$(CONFIG_KEYBOARD_EP93XX_SPI) 	+= ep93xx_spi_kbd.o
+obj-$(CONFIG_KEYBOARD_EP93XX_KEYPAD) 	+= ep93xx_keypad.o
diff -burN linux-2.6.8.1.orig/drivers/input/touchscreen/ep93xx_ts.c linux-2.6.8.1/drivers/input/touchscreen/ep93xx_ts.c
--- linux-2.6.8.1.orig/drivers/input/touchscreen/ep93xx_ts.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/input/touchscreen/ep93xx_ts.c	2005-10-04 16:45:06.000000000 -0500
@@ -0,0 +1,1106 @@
+/*
+ *  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/wait.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/poll.h>
+#include <linux/miscdevice.h>
+#include <linux/init.h>
+#include <linux/compiler.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/syscalls.h>
+#include <linux/input.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 0xFE0 //C00
+#define   TS_LIGHT_INV_PRESSURE 0xFFF //e00
+
+//
+// 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_XY_CHANGE 0x300
+#define   TS_MAX_VALID_PRESSURE_CHANGE  0x100
+
+//
+// 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.
+ */
+/* #define UART_HACK_DEBUG 1 */
+#if 0
+#ifdef UART_HACK_DEBUG
+static char szBuf[256];
+void UARTWriteString(char * msg);
+#define DPRINTK( x... )   \
+    sprintf( szBuf, ##x ); \
+    UARTWriteString( szBuf );
+#else
+static char szBuf[256];
+#define DPRINTK( x... )  \
+    sprintf( szBuf, ##x ); \
+    printk( szBuf );
+#endif
+#endif // 0
+#define DPRINTK( x... ) 
+
+//-----------------------------------------------------------------------------
+// A few more macros...
+//-----------------------------------------------------------------------------
+#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)
+
+//
+// For now, we use one of the minor numbers from the local/experimental
+// range.
+//
+#define EP93XX_TS_MINOR 240
+
+//-----------------------------------------------------------------------------
+// Static Declarations
+//-----------------------------------------------------------------------------
+static unsigned int   guiLastX, guiLastY;
+static unsigned int   guiLastInvPressure;
+
+struct TouchScreenSample
+{
+    int     currentX;
+    int     currentY;
+    int     currentButton;
+    int     currentPressure;
+    struct timeval currentTime;
+};
+
+//
+// This must match the structure in tslib.
+//
+struct ts_sample {
+    int     x;
+    int     y;
+    unsigned int    pressure;
+    struct timeval  tv;
+};
+
+
+static struct TouchScreenSample gSample;
+
+// static int currentX, currentY, currentButton;
+// static int gPressure;
+// static struct timeval  gtime;
+
+static int bFreshTouchData;
+static int bCurrentPenDown;
+
+
+
+static DECLARE_WAIT_QUEUE_HEAD(queue);
+static DECLARE_MUTEX(open_sem);
+static spinlock_t event_buffer_lock = SPIN_LOCK_UNLOCKED;
+static struct fasync_struct *fasync;
+
+//-----------------------------------------------------------------------------
+// Typedef Declarations
+//-----------------------------------------------------------------------------
+typedef enum {
+    TS_MODE_UN_INITIALIZED,
+    TS_MODE_HARDWARE_SCAN,
+    TS_MODE_SOFT_SCAN
+} ts_mode_t;
+
+static ts_mode_t      gScanningMode;
+
+typedef enum{
+    TS_STATE_STOPPED = 0,
+    TS_STATE_Z1,
+    TS_STATE_Z2,
+    TS_STATE_Y,
+    TS_STATE_X,
+    TS_STATE_DONE
+} ts_states_t;
+
+typedef struct 
+{
+    unsigned int   uiX;
+    unsigned int   uiY;
+    unsigned int   uiZ1;
+    unsigned int   uiZ2;
+    ts_states_t    state;
+} ts_struct_t;
+
+static ts_struct_t sTouch;
+
+/*
+ * From the spec, here's how to set up the touch screen's switch registers.
+ */
+typedef struct 
+{
+    unsigned int uiDetect;
+    unsigned int uiDischarge;
+    unsigned int uiXSample;
+    unsigned int uiYSample;
+    unsigned int uiSwitchZ1;
+    unsigned int uiSwitchZ2;
+}SwitchStructType;
+
+//
+// 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 SwitchStructType sSwitchSettings = 
+/*     s28en=0
+ *   TSDetect    TSDischarge  TSXSample  TSYSample    SwitchZ1   SwitchZ2
+ */
+    {0x00403604, 0x0007fe04, 0x00081604, 0x00104601, 0x00101601, 0x00101608};   
+
+
+//-----------------------------------------------------------------------------
+// Function Declarations
+//-----------------------------------------------------------------------------
+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 ee93xx_ts_evt_add( int button, int dX, int dY, int Pressure );
+static ssize_t ep93xx_ts_read(struct file *filp, char *buf, 
+        size_t count, loff_t *l);
+static unsigned int ep93xx_ts_poll(struct file *filp, poll_table *wait);
+static int ep93xx_ts_open(struct inode *inode, struct file *filp);
+static int ep93xx_ts_fasync(int fd, struct file *filp, int on);
+static int ep93xx_ts_release(struct inode *inode, struct file *filp);
+static ssize_t ep93xx_ts_write(struct file *file, const char *buffer, 
+                size_t count, loff_t *ppos);
+static void ep93xx_hw_setup(void);
+static void ep93xx_hw_shutdown(void);
+int __init ep93xx_ts_init(void);
+void __exit ep93xx_ts_exit(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(void);
+static void Set_Timer2_uSec( unsigned int Delay_mSec );
+static void Stop_Timer2(void);
+
+
+
+//-----------------------------------------------------------------------------
+//  Debug stuff...
+//-----------------------------------------------------------------------------
+
+#ifdef UART_HACK_DEBUG
+
+// This "array" is a cheap-n-easy way of getting access to the UART registers.
+static unsigned int * const pDebugUART=(unsigned int *)IO_ADDRESS(UART1_BASE);
+//static unsigned int * const pDebugUART=(unsigned int *)IO_ADDRESS(UART3_BASE);
+static int bUartInitialized = 0; 
+
+void SendChar(char value)
+{
+    // wait for Tx fifo full flag to clear.
+    while (pDebugUART[0x18>>2] & 0x20);
+
+    // send a char to the uart               
+    pDebugUART[0] = value;
+}
+
+void UARTWriteString(char * msg) 
+{
+    int index = 0;
+    unsigned int uiTemp;
+
+    //if((pDebugUART[0x14>>2] & 0x1) == 0)
+    if( bUartInitialized == 0 )
+    {
+        uiTemp = inl(SYSCON_DEVCFG);
+        uiTemp |= SYSCON_DEVCFG_U1EN;
+        //uiTemp |= SYSCON_DEVCFG_U3EN;
+        SysconSetLocked(SYSCON_DEVCFG, uiTemp);  
+        pDebugUART[0x10>>2] = 0xf;
+        pDebugUART[0xc>>2] = 0;
+        pDebugUART[0x8>>2] = 0x70;
+        pDebugUART[0x14>>2] = 0x1;
+        bUartInitialized = 1;
+    }
+    while (msg[index] != 0)
+    {
+        if (msg[index] == '\n')
+        {
+            SendChar('\r');
+            SendChar('\n');
+        }
+        else 
+        {
+            SendChar(msg[index]);
+        }
+        index++;
+    }
+}
+#endif // UART_HACK_DEBUG
+
+/*
+ *  ep93xx_ts_isr
+ */
+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);
+}
+ 
+/*
+ * Save the current ts 'event' in an atomic fashion.
+ */
+static void ee93xx_ts_evt_add( int buttons, int iX, int iY, int iPressure )
+{
+#ifdef PRINT_CALIBRATION_FACTORS
+    if( iX > iMaxX ) iMaxX = iX;
+    if( iX < iMinX ) iMinX = iX;
+    if( iY > iMaxY ) iMaxY = iY;
+    if( iY < iMinY ) iMinY = iY;
+#endif
+
+    
+    // printk("ee93xx_ts_evt_add\n");
+    //DPRINTK("cb\n");
+    /*
+     * Note the event, but use spinlocks to keep it from getting
+     * halfway read if we get interrupted.
+     */  
+    
+    spin_lock(&event_buffer_lock);
+    gSample.currentX        = iX;
+    gSample.currentY        = iY;
+    gSample.currentButton   = buttons;
+    gSample.currentPressure = iPressure;
+    bFreshTouchData         = 1;
+    do_gettimeofday(&gSample.currentTime);
+
+    
+    spin_unlock(&event_buffer_lock);
+
+    kill_fasync(&fasync, SIGIO, POLL_IN);
+    wake_up_interruptible(&queue);
+
+}
+
+
+static ssize_t ep93xx_ts_read(struct file *filp, char *buf, size_t count, loff_t *l)
+{
+
+    unsigned short data[3];
+    struct  ts_sample   ts_data;
+    int     iReturn;
+    // printk("ep93xx_ts_read\n");
+
+#ifdef PRINT_CALIBRATION_FACTORS
+    static int lala=0;
+    if( bFreshTouchData && (lala++ > 9) )
+    {
+        DPRINTK("%4d, %4d - range [%4d to %4d],[%4d to %4d]\n",
+            f, currentY, iMinX, iMaxX, iMinY, iMaxY );
+        lala = 0;
+    }
+#endif
+    if( !bFreshTouchData)
+    {
+        iReturn = 0;
+    }        
+    else if( (count == sizeof(data)) )
+    {
+        spin_lock_irq(&event_buffer_lock);
+        bFreshTouchData = 0;
+        data[0] = gSample.currentX;
+        data[1] = gSample.currentY;
+        data[2] = gSample.currentButton;
+        
+        spin_unlock_irq(&event_buffer_lock);
+
+        if (copy_to_user(buf, data, sizeof data))
+            return -EFAULT;
+
+        count -= sizeof(data);
+
+        /* return the # of bytes that got read */
+        iReturn = sizeof(data) ;
+    }
+    else if (count == sizeof(struct ts_sample) )
+    {
+        spin_lock_irq(&event_buffer_lock);
+        bFreshTouchData = 0;
+        ts_data.x           = gSample.currentX;
+        ts_data.y           = gSample.currentY;
+        ts_data.pressure    = gSample.currentPressure;
+        ts_data.tv          = gSample.currentTime;
+        spin_unlock_irq(&event_buffer_lock);
+        
+        if (copy_to_user(buf, &ts_data, sizeof(struct ts_sample)))
+        {
+            iReturn = -EFAULT;
+        }
+        else
+        {                
+            count -= sizeof(ts_data);
+            iReturn = sizeof(ts_data);
+        }            
+
+    }
+
+    return iReturn;
+}
+
+static unsigned int ep93xx_ts_poll(struct file *filp, poll_table *wait)
+{
+    // printk("ep93xx_ts_poll\n");
+    poll_wait(filp, &queue, wait);
+
+    if( bFreshTouchData )
+    {
+        return POLLIN | POLLRDNORM;
+    }
+    
+    return 0;
+}
+
+static int ep93xx_ts_open(struct inode *inode, struct file *filp)
+{
+    // printk("ep93xx_ts_open");
+
+    if( down_trylock(&open_sem) )
+    {
+        return -EBUSY;
+    }
+
+    ep93xx_hw_setup();
+
+    return 0;
+}
+
+/*
+ * Asynchronous I/O support.
+ */
+static int ep93xx_ts_fasync(int fd, struct file *filp, int on)
+{
+    int retval;
+
+    retval = fasync_helper(fd, filp, on, &fasync);
+    if (retval < 0)
+    {
+        return retval;
+    }
+    
+    return 0;
+}
+
+static int ep93xx_ts_release(struct inode *inode, struct file *filp)
+{
+    Stop_Timer2();
+
+    /*
+     * Call our async I/O support to request that this file 
+     * cease to be used for async I/O.
+     */
+    ep93xx_ts_fasync(-1, filp, 0);
+
+    ep93xx_hw_shutdown();
+    
+    up(&open_sem);
+    
+    return 0;
+}
+
+static ssize_t ep93xx_ts_write(struct file *file, const char *buffer, size_t count,
+               loff_t *ppos)
+{
+    return -EINVAL;
+}
+
+
+static int ep93xx_ts_ioctl(struct inode *inode, struct file *file, uint command, ulong u)
+{
+    static const int         version = EV_VERSION;   
+    static const u_int32_t   bit =(1 << EV_ABS);
+    static const u_int64_t   absbit = (1 << ABS_X) | (1 << ABS_Y) | (1 << ABS_PRESSURE);
+    int         iReturn ;
+    int         i;
+    
+    switch(command)
+    {
+        case EVIOCGVERSION:
+            DPRINTK("ep93xx_ts_ioctl command = EVIOCGVERSION\r\n");
+            i = copy_to_user((void __user *)u, (void *)version, sizeof(version));
+            iReturn = i ? -EFAULT : 0;
+            break;
+            
+        case EVIOCGBIT(0,sizeof(u_int32_t) * 8) :
+            DPRINTK("ep93xx_ts_ioctl command = EVIOCGBIT(0,sizeof(uint32) * 8)\r\n");
+            i = copy_to_user((void __user *)u, (void *)bit, sizeof(bit));
+            iReturn = i ? -EFAULT : 0;
+            break;
+            
+        case EVIOCGBIT(EV_ABS, sizeof(absbit) * 8):
+            DPRINTK("ep93xx_ts_ioctl command = EVIOCGBIT(0,sizeof(uint32) * 8)\r\n");
+            copy_to_user((void __user *)u, (void *)absbit, sizeof(absbit));
+            iReturn = i ? -EFAULT : 0;
+            break;
+        default:
+            DPRINTK(" ep93xx_ts_ioctl unknown command = %d\n",u);           
+            iReturn = -1;
+            break;
+    }            
+    
+    return iReturn;
+}
+
+static struct file_operations ep93xx_ts_fops = {
+    owner:      THIS_MODULE,
+    read:       ep93xx_ts_read,
+    write:      ep93xx_ts_write,
+    poll:       ep93xx_ts_poll,
+    open:       ep93xx_ts_open,
+//    ioctl:      ep93xx_ts_ioctl,
+    release:    ep93xx_ts_release,
+    fasync:     ep93xx_ts_fasync,
+};
+
+static struct miscdevice ep93xx_ts_miscdev = 
+{
+        EP93XX_TS_MINOR,
+        "ep93xx_ts",
+        &ep93xx_ts_fops
+};
+
+void ep93xx_hw_setup(void)
+{
+    unsigned int uiKTDIV, uiTSXYMaxMin;
+    // printk("ep93xx_hw_setup\n");
+    
+    /*
+     * Set the TSEN bit in KTDIV so that we are enabling the clock
+     * for the touchscreen.
+     */    
+    uiKTDIV = inl(SYSCON_KTDIV);
+    uiKTDIV |= SYSCON_KTDIV_TSEN;
+    SysconSetLocked( SYSCON_KTDIV, uiKTDIV );    
+
+    //
+    // Program the TSSetup and TSSetup2 registers.
+    //
+    outl( TSSETUP_DEFAULT, TSSetup );
+    outl( TSSETUP2_DEFAULT, TSSetup2 );
+
+    //
+    // Set the the touch settings. 
+    //
+    outl( 0xaa, TSSWLock );
+    outl( sSwitchSettings.uiDischarge, TSDirect );
+
+    outl( 0xaa, TSSWLock );
+    outl( sSwitchSettings.uiDischarge, TSDischarge );
+
+    outl( 0xaa, TSSWLock );
+    outl( sSwitchSettings.uiSwitchZ1, TSXSample );
+
+    outl( 0xaa, TSSWLock );
+    outl( sSwitchSettings.uiSwitchZ2, TSYSample );
+
+    outl( 0xaa, TSSWLock );
+    outl( 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;
+    outl( uiTSXYMaxMin, TSXYMaxMin );
+    
+    bCurrentPenDown = 0;
+    bFreshTouchData = 0;
+    guiLastX = 0;
+    guiLastY = 0;
+    guiLastInvPressure = 0xffffff;
+    
+    //
+    // Enable the touch screen scanning engine.
+    //
+    TS_Hardware_Scan_Mode();
+}
+
+/*
+ * ep93xx_hw_shutdown
+ *
+ */
+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.
+     */
+    outl( 0, TSSetup );
+    outl( 0, TSSetup2 );
+
+    /*
+     * Clear the TSEN bit in KTDIV so that we are disabling the clock
+     * for the touchscreen.
+     */    
+    uiKTDIV = inl(SYSCON_KTDIV);
+    uiKTDIV &= ~SYSCON_KTDIV_TSEN;
+    SysconSetLocked( SYSCON_KTDIV, uiKTDIV );    
+
+} /* ep93xx_hw_shutdown */
+
+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 );
+            
+            outl( 0xaa, TSSWLock );
+            outl( sSwitchSettings.uiDischarge, TSDirect );
+            
+            sTouch.state = TS_STATE_DONE;
+        
+            /*
+             * Process this set of ADC readings.
+             */
+            ProcessPointData();
+            
+            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.
+    //
+    outl( 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(void)
+{
+    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;
+                ee93xx_ts_evt_add( 0, guiLastX, guiLastY, 0 );
+        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;
+            ee93xx_ts_evt_add( 1, sTouch.uiX, sTouch.uiY, (0x7000000 /uiInvPressure) );
+        }
+
+        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.
+    //
+    outl( 0xaa, TSSWLock );
+    outl( uiADCSwitch, TSDirect );
+
+    //
+    // Read and throw away the first sample.
+    //
+    do {
+        uiResult = inl(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 = inl(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 = inl( SYSCON_DEVCFG );
+    SysconSetLocked( SYSCON_DEVCFG, (uiDevCfg & ~SYSCON_DEVCFG_TIN) );    
+
+    //
+    // Enable the touch screen scanning state machine by setting
+    // the ENABLE bit.
+    //
+    outl( (TSSETUP_DEFAULT | TSSETUP_ENABLE), TSSetup );
+
+    //
+    // Set the flag to show that we are in interrupt mode.
+    //
+    gScanningMode = TS_MODE_HARDWARE_SCAN;
+
+    //
+    // Initialize TSSetup2 register.
+    //
+    outl( TSSETUP2_DEFAULT, TSSetup2 );
+
+}
+
+//****************************************************************************
+// TS_Soft_Scan_Mode
+//****************************************************************************
+// Sets 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.
+        //
+        outl( TSSETUP_DEFAULT, TSSetup );
+
+        //
+        // Set the TIN bit so we can do manual touchscreen polling.
+        //
+        uiDevCfg = inl( SYSCON_DEVCFG );
+        SysconSetLocked( 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
+     */
+    outl( 0, TIMER2CONTROL );
+
+    uiClockTicks = ((uiDelay_uSec * 508) + 999) / 1000;
+    outl( uiClockTicks, TIMER2LOAD );
+    outl( uiClockTicks, TIMER2VALUE );
+
+    /*
+     * Set up Timer 2 for 508 kHz clock and periodic mode.
+     */ 
+    outl( 0xC8, TIMER2CONTROL );
+
+}
+
+static void Stop_Timer2(void)
+{
+    outl( 0, TIMER2CONTROL );
+}
+
+/*
+ * Initialization and exit routines
+ */
+int __init ep93xx_ts_init(void)
+{
+    int retval;
+
+    // printk("ep93xx_ts_init\n");
+
+    // printk("request Touchscreen interrupt.\n");
+    retval = request_irq( IRQ_TOUCH, ep93xx_ts_isr, SA_INTERRUPT, "ep93xx_ts", 0);
+    if( retval )
+    {
+        // printk(KERN_WARNING "ep93xx_ts: failed to get touchscreen IRQ\n");
+        return retval;
+    }
+
+    // printk("Request Timer interrupt.\n");
+    retval = request_irq( IRQ_TIMER2, ep93xx_timer2_isr,
+                        SA_INTERRUPT, "ep93xx_timer2", 0);
+    if( retval )
+    {
+        // printk(KERN_WARNING "ep93xx_ts: failed to get timer2 IRQ\n");
+        return retval;
+    }
+
+    // printk("Register Touchscreen Driver\n");
+    misc_register(&ep93xx_ts_miscdev);
+
+    sTouch.state = TS_STATE_STOPPED;
+    gScanningMode = TS_MODE_UN_INITIALIZED;
+    
+    // printk(KERN_NOTICE "EP93xx touchscreen driver configured for 4-wire operation\n");
+
+    return 0;
+}
+
+void __exit
+ep93xx_ts_exit(void)
+{
+    DPRINTK("ep93xx_ts_exit\n");
+    
+    Stop_Timer2();
+
+    free_irq(IRQ_TOUCH, 0);
+    free_irq(IRQ_TIMER2, 0);
+    
+    misc_deregister(&ep93xx_ts_miscdev);
+}
+
+module_init(ep93xx_ts_init);
+module_exit(ep93xx_ts_exit);
+
+MODULE_DESCRIPTION("Cirrus EP93xx touchscreen driver");
+MODULE_SUPPORTED_DEVICE("touchscreen/ep93xx");
diff -burN linux-2.6.8.1.orig/drivers/input/touchscreen/Kconfig linux-2.6.8.1/drivers/input/touchscreen/Kconfig
--- linux-2.6.8.1.orig/drivers/input/touchscreen/Kconfig	2004-08-14 05:55:32.000000000 -0500
+++ linux-2.6.8.1/drivers/input/touchscreen/Kconfig	2006-01-17 13:49:07.000000000 -0600
@@ -34,4 +34,7 @@
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called gunze.
+config TOUCHSCREEN_EP93XX
+        tristate "EP93xx Touchscreen"
+ 	depends on ARM && INPUT && ARCH_EP93XX && INPUT_TOUCHSCREEN
 
diff -burN linux-2.6.8.1.orig/drivers/input/touchscreen/Makefile linux-2.6.8.1/drivers/input/touchscreen/Makefile
--- linux-2.6.8.1.orig/drivers/input/touchscreen/Makefile	2004-08-14 05:56:14.000000000 -0500
+++ linux-2.6.8.1/drivers/input/touchscreen/Makefile	2005-08-02 13:50:38.000000000 -0500
@@ -6,3 +6,4 @@
 
 obj-$(CONFIG_TOUCHSCREEN_BITSY)	+= h3600_ts_input.o
 obj-$(CONFIG_TOUCHSCREEN_GUNZE)	+= gunze.o
+obj-$(CONFIG_TOUCHSCREEN_EP93XX) += ep93xx_ts.o
diff -burN linux-2.6.8.1.orig/drivers/mtd/chips/cfi_util.c linux-2.6.8.1/drivers/mtd/chips/cfi_util.c
--- linux-2.6.8.1.orig/drivers/mtd/chips/cfi_util.c	2004-08-14 05:55:34.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/chips/cfi_util.c	2006-08-21 21:13:10.000000000 -0500
@@ -55,7 +55,7 @@
 	}
 
 	if (extp->MajorVersion != '1' || 
-	    (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {
+	    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
 		printk(KERN_WARNING "  Unknown %s Extended Query "
 		       "version %c.%c.\n",  name, extp->MajorVersion,
 		       extp->MinorVersion);
diff -burN linux-2.6.8.1.orig/drivers/mtd/maps/edb93xx.c linux-2.6.8.1/drivers/mtd/maps/edb93xx.c
--- linux-2.6.8.1.orig/drivers/mtd/maps/edb93xx.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/mtd/maps/edb93xx.c	2006-11-01 03:49:44.000000000 -0600
@@ -0,0 +1,294 @@
+/*======================================================================
+
+    drivers/mtd/maps/edb93xx.c: EDB93xx flash map driver
+
+    Copyright (C) 2000 ARM Limited
+    Copyright (C) 2003 Deep Blue Solutions Ltd.
+    Copyright (C) 2004 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
+
+======================================================================*/
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+#include <linux/init.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/mach/flash.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/system.h>
+
+struct edb93xx_flash_info {
+	struct flash_platform_data *plat;
+	struct resource		*res;
+	struct mtd_partition	*parts;
+	struct mtd_info		*mtd;
+	struct map_info		map;
+};
+
+#ifdef CONFIG_MTD_COMPLEX_MAPPINGS
+#define MUNG_ADDR(x) ((x & 0xfffe0000) | ((x & 0x00010000) >> 15) | ((x & 0x0000ffff) << 1))
+
+static map_word
+edb93xx_flash_read(struct map_info *map, unsigned long ofs)
+{
+	map_word ret;
+	if (ofs == 0x40)
+		ret.x[0] = 0;
+	else
+		ret.x[0] = __raw_readw(map->virt + MUNG_ADDR(ofs));
+	return ret;
+}
+
+static void
+edb93xx_flash_copy_from(struct map_info *map, void *to, unsigned long from,
+			ssize_t len)
+{
+	while (len) {
+		*(short *)to++ = __raw_readw(map->virt + MUNG_ADDR(from));
+		from += 2;
+		len -= 2;
+	}
+}
+
+static void
+edb93xx_flash_write(struct map_info *map, const map_word d, unsigned long adr)
+{
+	__raw_writew(d.x[0], map->virt + MUNG_ADDR(adr));
+}
+
+static void
+edb93xx_flash_copy_to(struct map_info *map, unsigned long to, const void *from,
+		      ssize_t len)
+{
+	while (len) {
+		__raw_writew(*(short *)from++, map->virt + MUNG_ADDR(to));
+		to += 2;
+		len -= 2;
+	}
+}
+#endif
+
+static void
+edb93xx_flash_set_vpp(struct map_info *map, int on)
+{
+	struct edb93xx_flash_info *info = container_of(map, struct edb93xx_flash_info, map);
+
+	if (info->plat && info->plat->set_vpp)
+		info->plat->set_vpp(on);
+}
+
+static const char *probes[] = { "cmdlinepart", "RedBoot", NULL };
+
+static int
+edb93xx_flash_probe(struct device *_dev)
+{
+	struct platform_device *dev = to_platform_device(_dev);
+	struct flash_platform_data *plat = dev->dev.platform_data;
+	struct resource *res = dev->resource;
+	unsigned int size = res->end - res->start + 1;
+	struct edb93xx_flash_info *info;
+	int err;
+	void *base;
+
+	info = kmalloc(sizeof(struct edb93xx_flash_info), GFP_KERNEL);
+	if (!info) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	memset(info, 0, sizeof(struct edb93xx_flash_info));
+
+	info->plat = plat;
+	if (plat && plat->init) {
+		err = plat->init();
+		if (err)
+			goto no_resource;
+	}
+
+	info->res = request_mem_region(res->start, size, "mtd");
+	if (!info->res) {
+		err = -EBUSY;
+		goto no_resource;
+	}
+
+	base = ioremap(res->start, size);
+	if (!base) {
+		err = -ENOMEM;
+		goto no_mem;
+	}
+
+	/*
+	 * look for CFI based flash parts fitted to this board
+	 */
+	info->map.size		= size;
+	info->map.bankwidth	= plat->width;
+	info->map.phys		= res->start;
+	info->map.virt		= (unsigned long) base;
+	info->map.name		= dev->dev.bus_id;
+	info->map.set_vpp	= edb93xx_flash_set_vpp;
+
+
+   /*  defined(CONFIG_ARCH_EDB9312) || \  */
+
+#if defined(CONFIG_MTD_COMPLEX_MAPPINGS) && \
+    (defined(CONFIG_ARCH_EDB9307) || \
+     defined(CONFIG_ARCH_EDB9315))
+
+#ifdef CONFIG_EP93XX_CS0
+#define CONFIG inl(SMCBCR0)
+#endif
+#ifdef CONFIG_EP93XX_CS1
+#define CONFIG inl(SMCBCR1)
+#endif
+#ifdef CONFIG_EP93XX_CS2
+#define CONFIG inl(SMCBCR2)
+#endif
+#ifdef CONFIG_EP93XX_CS3
+#define CONFIG inl(SMCBCR3)
+#endif
+#ifdef CONFIG_EP93XX_CS6
+#define CONFIG inl(SMCBCR6)
+#endif
+#ifdef CONFIG_EP93XX_CS7
+#define CONFIG inl(SMCBCR7)
+#endif
+
+	if ((CONFIG & SMCBCR_MW_MASK) == SMCBCR_MW_16) {
+		info->map.read = edb93xx_flash_read;
+		info->map.copy_from = edb93xx_flash_copy_from;
+		info->map.write = edb93xx_flash_write;
+		info->map.copy_to = edb93xx_flash_copy_to;
+	} else
+#endif
+	simple_map_init(&info->map);
+
+	/*
+	 * Also, the CFI layer automatically works out what size
+	 * of chips we have, and does the necessary identification
+	 * for us automatically.
+	 */
+	printk("Cirrus Platform start to probe mtd device\n");
+	info->mtd = do_map_probe(plat->map_name, &info->map);
+	if (!info->mtd) {
+		err = -ENXIO;
+		goto no_device;
+	}
+
+#ifdef CONFIG_MTD_COMPLEX_MAPPINGS
+	simple_map_init(&info->map);
+#endif
+
+	info->mtd->owner = THIS_MODULE;
+
+	err = parse_mtd_partitions(info->mtd, probes, &info->parts, 0);
+	if (err > 0) {
+		err = add_mtd_partitions(info->mtd, info->parts, err);
+		if (err)
+			printk(KERN_ERR
+			       "mtd partition registration failed: %d\n", err);
+	}
+
+	if (err == 0)
+		dev_set_drvdata(&dev->dev, info);
+
+	/*
+	 * If we got an error, free all resources.
+	 */
+	if (err < 0) {
+		if (info->mtd) {
+			del_mtd_partitions(info->mtd);
+			map_destroy(info->mtd);
+		}
+		if (info->parts)
+			kfree(info->parts);
+
+ no_device:
+		iounmap(base);
+ no_mem:
+		release_mem_region(res->start, size);
+ no_resource:
+		if (plat && plat->exit)
+			plat->exit();
+		kfree(info);
+	}
+ out:
+	return err;
+}
+
+static int
+edb93xx_flash_remove(struct device *_dev)
+{
+	struct platform_device *dev = to_platform_device(_dev);
+	struct edb93xx_flash_info *info = dev_get_drvdata(&dev->dev);
+
+	dev_set_drvdata(&dev->dev, NULL);
+
+	if (info) {
+		if (info->mtd) {
+			del_mtd_partitions(info->mtd);
+			map_destroy(info->mtd);
+		}
+		if (info->parts)
+			kfree(info->parts);
+
+		iounmap((void *)info->map.virt);
+		release_resource(info->res);
+		kfree(info->res);
+
+		if (info->plat && info->plat->exit)
+			info->plat->exit();
+
+		kfree(info);
+	}
+
+	return 0;
+}
+
+static struct device_driver edb93xx_flash_driver = {
+	.name		= "edb93xxflash",
+	.bus		= &platform_bus_type,
+	.probe		= edb93xx_flash_probe,
+	.remove		= edb93xx_flash_remove,
+};
+
+static int __init
+edb93xx_flash_init(void)
+{
+	return driver_register(&edb93xx_flash_driver);
+}
+
+static void __exit
+edb93xx_flash_exit(void)
+{
+	driver_unregister(&edb93xx_flash_driver);
+}
+
+module_init(edb93xx_flash_init);
+module_exit(edb93xx_flash_exit);
+
+MODULE_AUTHOR("Cirrus Logic, Inc.");
+MODULE_DESCRIPTION("EDB93xx CFI map driver");
+MODULE_LICENSE("GPL");
diff -burN linux-2.6.8.1.orig/drivers/mtd/maps/Kconfig linux-2.6.8.1/drivers/mtd/maps/Kconfig
--- linux-2.6.8.1.orig/drivers/mtd/maps/Kconfig	2004-08-14 05:56:23.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/maps/Kconfig	2004-11-03 09:28:04.000000000 -0600
@@ -502,6 +502,13 @@
 	  This enables access to the CFI Flash on the Cogent EDB7312 board.
 	  If you have such a board, say 'Y' here.
 
+config MTD_EDB93XX
+	tristate "CFI Flash device mapped on EDB93xx"
+	depends on ARM && MTD_CFI && ARCH_EP93XX
+	help
+	  This enables access ot the CFI FLASH on the EDB93xx boards.  If you
+	  have such a board, say 'Y' here.
+
 config MTD_IMPA7
 	tristate "JEDEC Flash device mapped on impA7"
 	depends on ARM && MTD_JEDECPROBE
diff -burN linux-2.6.8.1.orig/drivers/mtd/maps/Makefile linux-2.6.8.1/drivers/mtd/maps/Makefile
--- linux-2.6.8.1.orig/drivers/mtd/maps/Makefile	2004-08-14 05:54:46.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/maps/Makefile	2004-11-03 09:28:04.000000000 -0600
@@ -48,6 +48,7 @@
 obj-$(CONFIG_MTD_LASAT)		+= lasat.o
 obj-$(CONFIG_MTD_AUTCPU12)	+= autcpu12-nvram.o
 obj-$(CONFIG_MTD_EDB7312)	+= edb7312.o
+obj-$(CONFIG_MTD_EDB93XX)	+= edb93xx.o
 obj-$(CONFIG_MTD_IMPA7)		+= impa7.o
 obj-$(CONFIG_MTD_FORTUNET)	+= fortunet.o
 obj-$(CONFIG_MTD_REDWOOD)	+= redwood.o
diff -burN linux-2.6.8.1.orig/drivers/mtd/nand/ep93xx_nand.c linux-2.6.8.1/drivers/mtd/nand/ep93xx_nand.c
--- linux-2.6.8.1.orig/drivers/mtd/nand/ep93xx_nand.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/mtd/nand/ep93xx_nand.c	2006-09-01 03:08:13.000000000 -0500
@@ -0,0 +1,451 @@
+/*======================================================================
+ 
+   drivers/mtd/nand/ep93xx_nand.c: EDB93xx NAND flash driver
+ 
+   Copyright (C) 2006 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
+ 
+======================================================================*/
+
+#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>
+
+
+/*
+ *  There is a jumper select the ALE connect to A24 or EGPIO4.
+ *  If ALE is connected to A24, define NAND_ALE_ON_A24.
+ *  If ALE is connected to EGPIO4, un-define NAND_ALE_ON_A24.
+ */
+#undef NAND_ALE_ON_A24
+
+/*
+ *  There is a jumper select the CLE connect to A25 or EGPIO5.
+ *  If CLE is connected to A25, define NAND_CLE_ON_A25.
+ *  If CLE is connected to EGPIO5, un-define NAND_CLE_ON_A25.
+ */
+#undef NAND_CLE_ON_A25
+
+/*
+ *  There is a jumper select the CE connect to CS3 or EGPIO8.
+ *  If CE is connected to CS3, define NAND_CE_DONNT_CARE.
+ *  If CE is connected to EGPIO8, un-define NAND_CE_DONNT_CARE.
+ *  
+ *  NOTICE: CE DON'T CARE mode doesn't work for all nand chips.
+ */
+#undef NAND_CE_DONNT_CARE
+
+/*
+ *  There is a jumper select the R/B connect to /WAIT or EGPIO9.
+ *  If CE is connected to /WAIT, define NAND_RB_ON_WAIT.
+ *  If CE is connected to EGPIO9, un-define NAND_RB_ON_WAIT.
+ *  
+ */
+#undef NAND_RB_ON_WAIT
+
+
+static struct mtd_info *ep93xx_mtd = NULL;
+
+/*
+ *  CS3 is used for NAND flash.
+ */
+#define EP93xx_FIO_PBASE 0x30000000
+
+
+#ifdef NAND_ALE_ON_A24
+
+    static int ale_status = 0;
+    static int ale_address_offset = 0;
+
+#endif
+
+#ifdef NAND_CLE_ON_A25
+
+    static int cle_status = 0;
+    static int cle_address_offset = 0;
+#endif
+
+static int ep93xx_fio_pbase = EP93xx_FIO_PBASE;
+
+#ifdef MODULE
+MODULE_PARM(ep93xx_fio_pbase, "i");
+
+__setup("ep93xx_fio_pbase=",ep93xx_fio_pbase);
+#endif
+
+#ifdef CONFIG_MTD_PARTITIONS
+
+#define BOOT_PARTITION_SIZE         (0x800000)
+/*
+ * Define static partitions for flash device
+ */
+static struct mtd_partition partition_info[] =
+{
+    {
+        .name = "EP93xx Nand Flash Boot Partition",
+        .offset = 0,
+        .size = BOOT_PARTITION_SIZE
+    },
+    {
+        .name = "EP93xx Nand Flash",
+        .offset = BOOT_PARTITION_SIZE,
+        .size = 32*1024*1024
+    }
+};
+
+#define NUM_PARTITIONS 2
+
+#endif
+
+int EGpio_out (int line, int value)
+{
+    unsigned long uTmp;
+    unsigned long PDR = GPIO_PADR;
+    unsigned long PDDR = GPIO_PADDR;
+
+    if(line&0xff00)
+    {
+        PDR = GPIO_PBDR;
+        PDDR = GPIO_PBDDR;
+        line = line>>8;
+    }
+
+    uTmp = inl(PDDR);
+    if( ( uTmp & line) == 0)
+    {
+        outl(uTmp|line, PDDR);
+    }
+
+
+    uTmp = inl(PDR);
+    if(value)
+        outl(uTmp|line, PDR);
+    else
+        outl(uTmp&(~line), PDR);
+
+    return value;
+}
+
+int EGpio_in (int line)
+{
+    unsigned long uTmp;
+    unsigned long PDR = GPIO_PADR;
+    unsigned long PDDR = GPIO_PADDR;
+
+    if(line&0xff00)
+    {
+        PDR = GPIO_PBDR;
+        PDDR = GPIO_PBDDR;
+        line = line>>8;
+    }
+
+    uTmp = inl(PDDR);
+    if( uTmp & line )
+    {
+        outl(uTmp&(~line), PDDR);
+    }
+
+    return (inl(PDR) & line)?1:0;
+}
+
+#ifndef NAND_RB_ON_WAIT
+int ep93xx_device_ready(struct mtd_info *mtd)
+{
+    return EGpio_in(1<<9);
+}
+#endif
+
+static void ep93xx_read_buf(struct mtd_info *mtd, u_char *buf, int len)
+{
+    int i;
+    struct nand_chip *this = mtd->priv;
+    
+    /*printk("readbuf of %d bytes: \n", len);*/
+    
+    for (i=0; i<len; i++)
+        buf[i] = readb(this->IO_ADDR_R);
+}
+
+#if defined(NAND_CLE_ON_A25) || defined(NAND_ALE_ON_A24)
+
+static void ep93xx_nand_write_byte(struct mtd_info *mtd, u_char byte)
+{
+    struct nand_chip *this = mtd->priv;
+
+#ifdef NAND_ALE_ON_A24
+    if(ale_status)
+    {
+        writeb(byte, ale_address_offset);
+        return;
+    }
+#endif
+
+#ifdef NAND_CLE_ON_A25
+    if(cle_status)
+    {
+        writeb(byte, cle_address_offset);
+        return;
+    }
+#endif
+    writeb(byte, this->IO_ADDR_W);
+}
+
+#endif
+
+/*
+ *      hardware specific access to control-lines
+ */
+static void ep93xx_hwcontrol(struct mtd_info *mtd, int cmd)
+{
+    switch(cmd)
+    {
+
+    case NAND_CTL_SETCLE:
+#ifdef NAND_CLE_ON_A25
+
+        cle_status = 1;
+#else
+
+        EGpio_out(1<<5, 1);
+#endif
+
+        break;
+    case NAND_CTL_CLRCLE:
+#ifdef NAND_CLE_ON_A25
+
+        cle_status = 0;
+#else
+
+        EGpio_out(1<<5, 0);
+#endif
+
+        break;
+
+    case NAND_CTL_SETALE:
+#ifdef NAND_ALE_ON_A24
+
+        ale_status = 1;
+#else
+
+        EGpio_out(1<<4, 1);
+#endif
+
+        break;
+    case NAND_CTL_CLRALE:
+#ifdef NAND_ALE_ON_A24
+
+        ale_status = 0;
+#else
+
+        EGpio_out(1<<4, 0);
+#endif
+
+        break;
+
+    case NAND_CTL_SETNCE:
+#ifndef NAND_CE_DONNT_CARE
+
+        EGpio_out(1<<8, 0);
+#endif
+
+        break;
+    case NAND_CTL_CLRNCE:
+#ifndef NAND_CE_DONNT_CARE
+
+        EGpio_out(1<<8, 1);
+#endif
+
+        break;
+    }
+}
+
+
+#ifdef CONFIG_MTD_PARTITIONS
+const char *part_probes[] =
+    { "cmdlinepart", NULL
+    };
+#endif
+
+/*
+ * Main initialization routine
+ */
+static int __init ep93xx_init (void)
+{
+    int ret=0;
+    struct nand_chip *chip;
+    const char *part_type = 0;
+    int mtd_parts_nb = 0;
+    struct mtd_partition *mtd_parts = 0;
+    int ep93xx_fio_base =0;
+
+    /* Allocate memory for MTD device structure and private data */
+    ep93xx_mtd = kmalloc(sizeof(struct mtd_info) +
+                         sizeof(struct nand_chip),
+                         GFP_KERNEL);
+    if (!ep93xx_mtd)
+    {
+        printk("Unable to allocate EDB93xx NAND MTD device structure.\n");
+        ret = -ENOMEM;
+        goto fail_return;
+    }
+
+    /* map physical adress */
+    ep93xx_fio_base = (unsigned long)ioremap(ep93xx_fio_pbase, SZ_1K);
+    if(!ep93xx_fio_base)
+    {
+        printk("ioremap EDB93xx NAND flash failed\n");
+        ret = -EIO;
+        goto fail_return;
+    }
+    
+#ifdef NAND_ALE_ON_A24
+    ale_address_offset = (unsigned long)ioremap(ep93xx_fio_pbase | 0x1000000, SZ_1K);
+    if(!ale_address_offset)
+    {
+        printk("ioremap EDB93xx NAND flash failed\n");
+        ret = -EIO;
+        goto fail_return;
+    }
+#endif
+
+#ifdef NAND_CLE_ON_A25
+
+    cle_address_offset = (unsigned long)ioremap(ep93xx_fio_pbase | 0x2000000, SZ_1K);
+    if(!cle_address_offset)
+    {
+        printk("ioremap EDB93xx NAND flash failed\n");
+        ret = -EIO;
+        goto fail_return;
+    }
+
+#endif
+
+    /* Get pointer to private data */
+    chip = (struct nand_chip *) (&ep93xx_mtd[1]);
+
+    /* Initialize structures */
+    memset((char *) ep93xx_mtd, 0, sizeof(struct mtd_info));
+    memset((char *) chip, 0, sizeof(struct nand_chip));
+
+    /* Link the private data with the MTD structure */
+    ep93xx_mtd->priv = chip;
+
+    /* insert callbacks */
+    chip->IO_ADDR_R = ep93xx_fio_base;
+    chip->IO_ADDR_W = ep93xx_fio_base;
+    chip->hwcontrol = ep93xx_hwcontrol;
+#ifdef NAND_RB_ON_WAIT
+    chip->dev_ready = NULL;
+#else
+    chip->dev_ready = ep93xx_device_ready;
+#endif
+    chip->read_buf = ep93xx_read_buf;
+    /* 15 us command delay time */
+    chip->chip_delay = 100;
+    chip->eccmode = NAND_ECC_SOFT;
+    
+
+#if defined(NAND_CLE_ON_A25) || defined(NAND_ALE_ON_A24)
+    chip->write_byte = ep93xx_nand_write_byte;
+#endif
+    /* Scan to find existence of the device */
+    printk("Scan the NAND device for EDB93xx.\n");
+    if (nand_scan (ep93xx_mtd, 1))
+    {
+        ret = -ENXIO;
+        goto fail_return;
+    }
+
+    /* Allocate memory for internal data buffer */
+    chip->data_buf = kmalloc (sizeof(u_char) * (ep93xx_mtd->oobblock + ep93xx_mtd->oobsize), GFP_KERNEL);
+    if (!chip->data_buf)
+    {
+        ret = -ENOMEM;
+        goto fail_return;
+    }
+
+#ifdef CONFIG_MTD_PARTITIONS
+    ep93xx_mtd->name = "ep93xx_nand";
+    mtd_parts_nb = parse_mtd_partitions(ep93xx_mtd, part_probes,
+                                        &mtd_parts, 0);
+    if (mtd_parts_nb > 0)
+        part_type = "command line";
+    else
+        mtd_parts_nb = 0;
+#endif
+
+    if (mtd_parts_nb == 0)
+    {
+        mtd_parts = partition_info;
+        mtd_parts_nb = NUM_PARTITIONS;
+        part_type = "static";
+    }
+
+    /* Register the partitions */
+    printk(KERN_NOTICE "Using %s partition definition\n", part_type);
+    add_mtd_partitions(ep93xx_mtd, mtd_parts, mtd_parts_nb);
+
+    /* Return happy */
+    return ret;
+
+fail_return:
+
+#ifdef NAND_ALE_ON_A24
+    if(ale_address_offset)
+        iounmap((void *)ale_address_offset);
+#endif
+
+#ifdef NAND_CLE_ON_A25
+    if(cle_address_offset)
+        iounmap((void *)cle_address_offset);
+#endif
+    
+    if(ep93xx_fio_base)
+        iounmap((void *)ep93xx_fio_base);
+
+    if (ep93xx_mtd)
+        kfree (ep93xx_mtd);
+
+    return ret;
+}
+module_init(ep93xx_init);
+
+/*
+ * Clean up routine
+ */
+static void __exit ep93xx_cleanup (void)
+{
+    struct nand_chip *chip = (struct nand_chip *) &ep93xx_mtd[1];
+
+    /* Unregister the device */
+    del_mtd_device (ep93xx_mtd);
+
+    /* Free internal data buffer */
+    kfree (chip->data_buf);
+
+    /* Free the MTD device structure */
+    kfree (ep93xx_mtd);
+}
+module_exit(ep93xx_cleanup);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("MTD map driver for EDB93xx NAND daughter board");
diff -burN linux-2.6.8.1.orig/drivers/mtd/nand/Kconfig linux-2.6.8.1/drivers/mtd/nand/Kconfig
--- linux-2.6.8.1.orig/drivers/mtd/nand/Kconfig	2004-08-14 05:55:59.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/nand/Kconfig	2006-08-22 20:50:48.000000000 -0500
@@ -147,4 +147,12 @@
 	  Even if you leave this disabled, you can enable BBT writes at module
 	  load time (assuming you build diskonchip as a module) with the module
 	  parameter "inftl_bbt_write=1".
+config MTD_NAND_EDB93xx
+	tristate "EDB93xx NAND Flash Support"
+	depends on ARCH_EP93XX && MTD_NAND
+	help
+	  This enables the driver for the NAND flash support on the
+	  EDB93xx NAND Daughter Board.
+	  There are different ways of setting up the NAND device.
+	  Please consult the source code.
 endmenu
diff -burN linux-2.6.8.1.orig/drivers/mtd/nand/Makefile linux-2.6.8.1/drivers/mtd/nand/Makefile
--- linux-2.6.8.1.orig/drivers/mtd/nand/Makefile	2004-08-14 05:54:47.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/nand/Makefile	2006-08-30 20:28:23.000000000 -0500
@@ -15,5 +15,6 @@
 obj-$(CONFIG_MTD_NAND_AU1550)		+= au1550nd.o
 obj-$(CONFIG_MTD_NAND_PPCHAMELEONEVB)	+= ppchameleonevb.o
 obj-$(CONFIG_MTD_NAND_DISKONCHIP)	+= diskonchip.o
+obj-$(CONFIG_MTD_NAND_EDB93xx)		+= ep93xx_nand.o
 
 nand-objs = nand_base.o nand_bbt.o
diff -burN linux-2.6.8.1.orig/drivers/mtd/nand/nand_ids.c linux-2.6.8.1/drivers/mtd/nand/nand_ids.c
--- linux-2.6.8.1.orig/drivers/mtd/nand/nand_ids.c	2004-08-14 05:55:10.000000000 -0500
+++ linux-2.6.8.1/drivers/mtd/nand/nand_ids.c	2006-09-14 21:18:24.000000000 -0500
@@ -62,7 +62,7 @@
 	
 	{"NAND 256MiB 3,3V 8-bit", 	0x71, 512, 256, 0x4000, 0},
 
-	{"NAND 512MiB 3,3V 8-bit", 	0xDC, 512, 512, 0x4000, 0},
+//	{"NAND 512MiB 3,3V 8-bit", 	0xDC, 512, 512, 0x4000, 0},
 	
 	/* These are the new chips with large page size. The pagesize
 	* and the erasesize is determined from the extended id bytes
@@ -118,6 +118,7 @@
 	{NAND_MFR_NATIONAL, "National"},
 	{NAND_MFR_RENESAS, "Renesas"},
 	{NAND_MFR_STMICRO, "ST Micro"},
+	{0x2c, "Micron"},
 	{0x0, "Unknown"}
 };
 
diff -burN linux-2.6.8.1.orig/drivers/net/ep93xx_eth.c linux-2.6.8.1/drivers/net/ep93xx_eth.c
--- linux-2.6.8.1.orig/drivers/net/ep93xx_eth.c	1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.8.1/drivers/net/ep93xx_eth.c	2006-11-15 01:43:05.000000000 -0600
@@ -0,0 +1,1606 @@
+/*----------------------------------------------------------------------------
+ * 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.
+ *
+ * Theory of Operation
+ * Driver Configuration
+ *  - Getting MAC address from system
+ *     To setup identical MAC address for each target board, driver need
+ *      to get a MAC address from system.  Normally, system has a Serial
+ *      EEPROM or other media to store individual MAC address when
+ *      manufacturing.
+ *      The macro GET_MAC_ADDR is prepared to get the MAC address from
+ *      system and one should supply a routine for this purpose.
+ * Driver Initialization
+ * DMA Operation
+ * Cache Coherence
+ *
+ * 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
+ *--------------------------------------------------------------------------*/
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/in.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/irq.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+
+#include <asm/arch/hardware.h>
+#include <asm/arch/ssp.h>
+
+#include "ep93xx_eth.h"
+
+/*----------------------------------------------------------------------------
+ * The name of the card.
+ * It is used for messages and in the requests for io regions, irqs and ...
+ * This device is not in a card but I used same name in skeleton.c file.
+ *--------------------------------------------------------------------------*/
+#define  cardname  "ep93xxethernet"
+
+/*----------------------------------------------------------------------------
+ * Macro to get MAC address from system
+ *
+ * Parameters:
+ *  - pD  : a pointer to the net device information, struct net_device.
+ *          one can get base address of device from pD->base_addr,
+ *          device instance ID (0 for 1st and so on) from *((int*)pD->priv).
+ *  - pMac: a pointer to a 6 bytes length buffer to return device MAC address.
+ *          this buffer will be initialized with default_mac[] value before
+ *          calling.
+ * Return: none
+ *--------------------------------------------------------------------------*/
+#define GET_MAC_ADDR(pD, pMac)						\
+	{								\
+		unsigned int uiTemp;					\
+		int SSP_Handle;						\
+									\
+		SSP_Handle = SSPDriver->Open( SERIAL_FLASH, 0 );	\
+		if (SSP_Handle != -1) {					\
+			SSPDriver->Read( SSP_Handle, 0x1000, &uiTemp );	\
+			if (uiTemp == 0x43414d45) {			\
+				SSPDriver->Read( SSP_Handle, 0x1004,	\
+						 &uiTemp );		\
+				pMac[0] = uiTemp & 255;			\
+				pMac[1] = (uiTemp >> 8) & 255;		\
+				pMac[2] = (uiTemp >> 16) & 255;		\
+				pMac[3] = uiTemp >> 24;			\
+				SSPDriver->Read( SSP_Handle, 0x1008,	\
+						 &uiTemp );		\
+				pMac[4] = uiTemp & 255;			\
+				pMac[5] = (uiTemp >> 8) & 255;		\
+			}						\
+			SSPDriver->Close( SSP_Handle );			\
+		}							\
+	}
+
+/****  default MAC address if GET_MAC_ADDR does not override  *************/
+static const U8  default_mac[6] = {0x00, 0xba, 0xd0, 0x0b, 0xad, 0x00};
+
+/*----------------------------------------------------------------------------
+ * 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  Default_IntSrc  (IntEn_RxMIE|IntEn_RxSQIE|IntEn_TxLEIE|IntEn_TIE|IntEn_TxSQIE|IntEn_RxEOFIE|IntEn_RxEOBIE|IntEn_RxHDRIE)
+*/
+#define  Default_IntSrc  (IntEn_TxSQIE|IntEn_RxEOFIE|IntEn_RxEOBIE|IntEn_RxHDRIE)
+
+/****  Length of Device Queue in number of entries
+       (must be less than or equal to 255)  ********************************/
+#define  LEN_QueRxDesc  64             /*length of Rx Descriptor Queue (4 or bigger) Must be power of 2.*/
+#define  LEN_QueRxSts   LEN_QueRxDesc  /*length of Rx Status Queue*/
+#define  LEN_QueTxDesc  8              /*length of Tx Descriptor Queue (4 or bigger) Must be power of 2.*/
+#define  LEN_QueTxSts   LEN_QueTxDesc  /*length of Tx Status Queue*/
+
+/****  Tx Queue fill-up level control  *************************************/
+#define  LVL_TxStop    LEN_QueTxDesc - 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 bytes  ******************************************/
+#define  LEN_RxBuf  (1518+2+16)  /*length of Rx buffer, must be 4-byte aligned*/
+#define  LEN_TxBuf   LEN_RxBuf
+
+/*----------------------------------------------------------------------------
+ * MACRO for ease
+ *--------------------------------------------------------------------------*/
+#define  Align32(a)  (((unsigned int)(a)+3)&~0x03)  /*32bit address alignment*/
+#define  IdxNext(idxCur,len)  (((idxCur)+1)%(len))  /*calc next array index number*/
+
+/****  malloc/free routine for DMA buffer  **********************************/
+ /*use non-cached DMA buffer*/
+#define  MALLOC_DMA(size, pPhyAddr)  dma_alloc_writecombine(NULL, (size), (dma_addr_t*)(pPhyAddr), GFP_KERNEL | GFP_DMA)
+//#define  FREE_DMA(size, vaddr, paddr)            dma_free_writecombine(NULL, (size), (vaddr), (paddr))
+
+/*----------------------------------------------------------------------------
+ * DEBUGGING LEVELS
+ *
+ * 0 for normal operation
+ * 1 for slightly more details
+ * >2 for various levels of increasingly useless information
+ *    2 for interrupt tracking, status flags
+ *    3 for packet dumps, etc.
+ *--------------------------------------------------------------------------*/
+//#define  _DBG  3
+
+#if (_DBG > 2 )
+#define PRINTK3(x) printk x
+#else
+#define PRINTK3(x)
+#endif
+
+#if _DBG > 1
+#define PRINTK2(x) printk x
+#else
+#define PRINTK2(x)
+#endif
+
+#if _DBG > 0
+#define PRINTK1(x) printk x
+#else
+#define PRINTK1(x)
+#endif
+
+#ifdef _DBG
+#define PRINTK(x) printk x
+#else
+#define PRINTK(x)
+#endif
+
+#define  _PRTK_ENTRY      PRINTK2   /*to trace function entries*/
+#define  _PRTK_SWERR      PRINTK    /*logical S/W error*/
+#define  _PRTK_SYSFAIL    PRINTK    /*system service failure*/
+#define  _PRTK_HWFAIL     PRINTK    /*H/W operation failure message*/
+#define  _PRTK_WARN       PRINTK1   /*warning information*/
+#define  _PRTK_INFO       PRINTK2   /*general information*/
+#define  _PRTK_ENTRY_ISR  PRINTK3   /*to trace function entries belong to ISR*/
+#define  _PRTK_WARN_ISR   PRINTK1   /*warning informations from ISR*/
+#define  _PRTK_INFO_ISR   PRINTK3   /*general informations from ISR*/
+#define  _PRTK_           PRINTK    /*for temporary print out*/
+
+#if 0
+# define  _PRTK_DUMP       PRINTK1   /*to dump large amount of debug info*/
+#endif
+
+/*----------------------------------------------------------------------------
+ * Custom Data Structures
+ *--------------------------------------------------------------------------*/
+
+/****  the information about the buffer passed to device.
+       there are matching bufferDescriptor informations
+       for each Tx/Rx Descriptor Queue entry to trace
+       the buffer within those queues.  ************************************/
+typedef  struct bufferDescriptor  {
+    void  *vaddr;                /*virtual address representing the buffer passed to device*/
+    int(*