linux: Add 2.6.30-rc4 and necessary patches for tx25
authorFlorian Boor <florian.boor@kernelconcepts.de>
Wed, 1 Jul 2009 00:01:33 +0000 (02:01 +0200)
committerFlorian Boor <florian.boor@kernelconcepts.de>
Wed, 1 Jul 2009 00:03:25 +0000 (02:03 +0200)
recipes/linux/linux-2.6.30-rc4/tx25/defconfig [new file with mode: 0644]
recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch [new file with mode: 0644]
recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff [new file with mode: 0644]
recipes/linux/linux_2.6.30-rc4.bb [new file with mode: 0644]

diff --git a/recipes/linux/linux-2.6.30-rc4/tx25/defconfig b/recipes/linux/linux-2.6.30-rc4/tx25/defconfig
new file mode 100644 (file)
index 0000000..290f8df
--- /dev/null
@@ -0,0 +1,1211 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.30-rc4
+# Tue Jun 30 22:46:56 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_MTD_XIP=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+# CONFIG_NAMESPACES is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+# CONFIG_AIO is not set
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+CONFIG_ARCH_MXC=y
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_W90X900 is not set
+
+#
+# Freescale MXC Implementations
+#
+# CONFIG_ARCH_MX1 is not set
+CONFIG_ARCH_MX2=y
+# CONFIG_ARCH_MX3 is not set
+# CONFIG_MACH_MX21 is not set
+# CONFIG_MACH_MX27 is not set
+CONFIG_MACH_MX25=y
+
+#
+# MX2 platforms:
+#
+CONFIG_MACH_TX25=y
+# CONFIG_KARO_DEBUG is not set
+CONFIG_MACH_STK5_BASEBOARD=y
+# CONFIG_MXC_IRQ_PRIOR is not set
+# CONFIG_MXC_PWM is not set
+CONFIG_ARCH_MXC_IOMUX_V3=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_UNEVICTABLE_LRU=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_CMDLINE="init=/linuxrc root=1f01 rootfstype=jffs2 ro console=ttymxc0,115200 panic=1"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_VFP=y
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_VERBOSE=y
+CONFIG_CAN_PM_TRACE=y
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_APM_EMULATION=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_TESTS=m
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-5
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+CONFIG_MTD_NAND_MXC=y
+CONFIG_MTD_NAND_MXC_FLASH_BBT=y
+CONFIG_ARCH_MXC_HAS_NFC_V1=y
+CONFIG_ARCH_MXC_HAS_NFC_V1_1=y
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+CONFIG_COMPAT_NET_DEV_OPS=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+CONFIG_SMSC_PHY=y
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_ETHOC is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_DNET is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+CONFIG_FEC=y
+# CONFIG_FEC2 is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+CONFIG_NETCONSOLE=y
+CONFIG_NETCONSOLE_DYNAMIC=y
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=m
+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_EVDEV=m
+CONFIG_INPUT_EVBUG=m
+# CONFIG_INPUT_APMPOWER 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_STOWAWAY is not set
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_IMX=y
+CONFIG_SERIAL_IMX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_DEBUG_GPIO=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+
+#
+# Multimedia devices
+#
+
+#
+# Multimedia core support
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_VIDEO_MEDIA is not set
+
+#
+# Multimedia drivers
+#
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_TILEBLITTING=y
+
+#
+# Frame buffer hardware drivers
+#
+CONFIG_FB_IMX=y
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
+# CONFIG_SOUND is not set
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+CONFIG_HID_DEBUG=y
+# CONFIG_HIDRAW is not set
+# CONFIG_HID_PID is not set
+
+#
+# Special HID drivers
+#
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_GPIO_PLATFORM=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+# CONFIG_LEDS_TRIGGER_TIMER is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FILE_LOCKING=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=y
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=y
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=y
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+CONFIG_NLS_CODEPAGE_1250=m
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+CONFIG_DEBUG_SLAB=y
+CONFIG_DEBUG_SLAB_LEAK=y
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+
+#
+# Tracers
+#
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
+# CONFIG_EVENT_TRACER is not set
+# CONFIG_BOOT_TRACER is not set
+# CONFIG_TRACE_BRANCH_PROFILING is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_ARM_UNWIND=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+# CONFIG_CRYPTO_FIPS is not set
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+
+#
+# Digest
+#
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
diff --git a/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch b/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch
new file mode 100644 (file)
index 0000000..b030555
--- /dev/null
@@ -0,0 +1,55110 @@
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/include/asm/barrier.h linux-2.6.30-rc4-git/arch/alpha/include/asm/barrier.h
+--- linux-2.6.30-rc4/arch/alpha/include/asm/barrier.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/include/asm/barrier.h      2009-05-13 09:46:19.000000000 +0200
+@@ -16,11 +16,13 @@ __asm__ __volatile__("wmb": : :"memory")
+ __asm__ __volatile__("mb": : :"memory")
+ #ifdef CONFIG_SMP
++#define __ASM_SMP_MB  "\tmb\n"
+ #define smp_mb()      mb()
+ #define smp_rmb()     rmb()
+ #define smp_wmb()     wmb()
+ #define smp_read_barrier_depends()    read_barrier_depends()
+ #else
++#define __ASM_SMP_MB
+ #define smp_mb()      barrier()
+ #define smp_rmb()     barrier()
+ #define smp_wmb()     barrier()
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/include/asm/futex.h linux-2.6.30-rc4-git/arch/alpha/include/asm/futex.h
+--- linux-2.6.30-rc4/arch/alpha/include/asm/futex.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/include/asm/futex.h        2009-05-13 09:46:19.000000000 +0200
+@@ -1,6 +1,116 @@
+-#ifndef _ASM_FUTEX_H
+-#define _ASM_FUTEX_H
++#ifndef _ASM_ALPHA_FUTEX_H
++#define _ASM_ALPHA_FUTEX_H
+-#include <asm-generic/futex.h>
++#ifdef __KERNEL__
+-#endif
++#include <linux/futex.h>
++#include <linux/uaccess.h>
++#include <asm/errno.h>
++#include <asm/barrier.h>
++
++#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)    \
++      __asm__ __volatile__(                                   \
++              __ASM_SMP_MB                                    \
++      "1:     ldl_l   %0,0(%2)\n"                             \
++              insn                                            \
++      "2:     stl_c   %1,0(%2)\n"                             \
++      "       beq     %1,4f\n"                                \
++      "       mov     $31,%1\n"                               \
++      "3:     .subsection 2\n"                                \
++      "4:     br      1b\n"                                   \
++      "       .previous\n"                                    \
++      "       .section __ex_table,\"a\"\n"                    \
++      "       .long   1b-.\n"                                 \
++      "       lda     $31,3b-1b(%1)\n"                        \
++      "       .long   2b-.\n"                                 \
++      "       lda     $31,3b-2b(%1)\n"                        \
++      "       .previous\n"                                    \
++      :       "=&r" (oldval), "=&r"(ret)                      \
++      :       "r" (uaddr), "r"(oparg)                         \
++      :       "memory")
++
++static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
++{
++      int op = (encoded_op >> 28) & 7;
++      int cmp = (encoded_op >> 24) & 15;
++      int oparg = (encoded_op << 8) >> 20;
++      int cmparg = (encoded_op << 20) >> 20;
++      int oldval = 0, ret;
++      if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
++              oparg = 1 << oparg;
++
++      if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
++              return -EFAULT;
++
++      pagefault_disable();
++
++      switch (op) {
++      case FUTEX_OP_SET:
++              __futex_atomic_op("mov %3,%1\n", ret, oldval, uaddr, oparg);
++              break;
++      case FUTEX_OP_ADD:
++              __futex_atomic_op("addl %0,%3,%1\n", ret, oldval, uaddr, oparg);
++              break;
++      case FUTEX_OP_OR:
++              __futex_atomic_op("or %0,%3,%1\n", ret, oldval, uaddr, oparg);
++              break;
++      case FUTEX_OP_ANDN:
++              __futex_atomic_op("andnot %0,%3,%1\n", ret, oldval, uaddr, oparg);
++              break;
++      case FUTEX_OP_XOR:
++              __futex_atomic_op("xor %0,%3,%1\n", ret, oldval, uaddr, oparg);
++              break;
++      default:
++              ret = -ENOSYS;
++      }
++
++      pagefault_enable();
++
++      if (!ret) {
++              switch (cmp) {
++              case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
++              case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
++              case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
++              case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
++              case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
++              case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
++              default: ret = -ENOSYS;
++              }
++      }
++      return ret;
++}
++
++static inline int
++futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
++{
++      int prev, cmp;
++
++      if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
++              return -EFAULT;
++
++      __asm__ __volatile__ (
++              __ASM_SMP_MB
++      "1:     ldl_l   %0,0(%2)\n"
++      "       cmpeq   %0,%3,%1\n"
++      "       beq     %1,3f\n"
++      "       mov     %4,%1\n"
++      "2:     stl_c   %1,0(%2)\n"
++      "       beq     %1,4f\n"
++      "3:     .subsection 2\n"
++      "4:     br      1b\n"
++      "       .previous\n"
++      "       .section __ex_table,\"a\"\n"
++      "       .long   1b-.\n"
++      "       lda     $31,3b-1b(%0)\n"
++      "       .long   2b-.\n"
++      "       lda     $31,3b-2b(%0)\n"
++      "       .previous\n"
++      :       "=&r"(prev), "=&r"(cmp)
++      :       "r"(uaddr), "r"((long)oldval), "r"(newval)
++      :       "memory");
++
++      return prev;
++}
++
++#endif /* __KERNEL__ */
++#endif /* _ASM_ALPHA_FUTEX_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/include/asm/uaccess.h linux-2.6.30-rc4-git/arch/alpha/include/asm/uaccess.h
+--- linux-2.6.30-rc4/arch/alpha/include/asm/uaccess.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/include/asm/uaccess.h      2009-05-13 09:46:19.000000000 +0200
+@@ -507,5 +507,7 @@ struct exception_table_entry
+       (pc) + (_fixup)->fixup.bits.nextinsn;                   \
+ })
++#define ARCH_HAS_SORT_EXTABLE
++#define ARCH_HAS_SEARCH_EXTABLE
+ #endif /* __ALPHA_UACCESS_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/binfmt_loader.c linux-2.6.30-rc4-git/arch/alpha/kernel/binfmt_loader.c
+--- linux-2.6.30-rc4/arch/alpha/kernel/binfmt_loader.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/binfmt_loader.c     2009-05-13 09:46:19.000000000 +0200
+@@ -46,6 +46,6 @@ static struct linux_binfmt loader_format
+ static int __init init_loader_binfmt(void)
+ {
+-      return register_binfmt(&loader_format);
++      return insert_binfmt(&loader_format);
+ }
+ arch_initcall(init_loader_binfmt);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/err_ev6.c linux-2.6.30-rc4-git/arch/alpha/kernel/err_ev6.c
+--- linux-2.6.30-rc4/arch/alpha/kernel/err_ev6.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/err_ev6.c   2009-05-13 09:46:19.000000000 +0200
+@@ -229,7 +229,7 @@ ev6_process_logout_frame(struct el_commo
+ }
+ void
+-ev6_machine_check(u64 vector, u64 la_ptr)
++ev6_machine_check(unsigned long vector, unsigned long la_ptr)
+ {
+       struct el_common *mchk_header = (struct el_common *)la_ptr;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/err_ev7.c linux-2.6.30-rc4-git/arch/alpha/kernel/err_ev7.c
+--- linux-2.6.30-rc4/arch/alpha/kernel/err_ev7.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/err_ev7.c   2009-05-13 09:46:19.000000000 +0200
+@@ -117,7 +117,7 @@ ev7_collect_logout_frame_subpackets(stru
+ }
+ void
+-ev7_machine_check(u64 vector, u64 la_ptr)
++ev7_machine_check(unsigned long vector, unsigned long la_ptr)
+ {
+       struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr;
+       char *saved_err_prefix = err_print_prefix;
+@@ -246,7 +246,7 @@ ev7_process_pal_subpacket(struct el_subp
+       switch(header->type) {
+       case EL_TYPE__PAL__LOGOUT_FRAME:
+-              printk("%s*** MCHK occurred on LPID %ld (RBOX %llx)\n",
++              printk("%s*** MCHK occurred on LPID %lld (RBOX %llx)\n",
+                      err_print_prefix,
+                      packet->by_type.logout.whami, 
+                      packet->by_type.logout.rbox_whami);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/err_impl.h linux-2.6.30-rc4-git/arch/alpha/kernel/err_impl.h
+--- linux-2.6.30-rc4/arch/alpha/kernel/err_impl.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/err_impl.h  2009-05-13 09:46:19.000000000 +0200
+@@ -60,26 +60,26 @@ extern struct ev7_lf_subpackets *
+ ev7_collect_logout_frame_subpackets(struct el_subpacket *,
+                                   struct ev7_lf_subpackets *);
+ extern void ev7_register_error_handlers(void);
+-extern void ev7_machine_check(u64, u64);
++extern void ev7_machine_check(unsigned long, unsigned long);
+ /*
+  * err_ev6.c
+  */
+ extern void ev6_register_error_handlers(void);
+ extern int ev6_process_logout_frame(struct el_common *, int);
+-extern void ev6_machine_check(u64, u64);
++extern void ev6_machine_check(unsigned long, unsigned long);
+ /*
+  * err_marvel.c
+  */
+-extern void marvel_machine_check(u64, u64);
++extern void marvel_machine_check(unsigned long, unsigned long);
+ extern void marvel_register_error_handlers(void);
+ /*
+  * err_titan.c
+  */
+ extern int titan_process_logout_frame(struct el_common *, int);
+-extern void titan_machine_check(u64, u64);
++extern void titan_machine_check(unsigned long, unsigned long);
+ extern void titan_register_error_handlers(void);
+ extern int privateer_process_logout_frame(struct el_common *, int);
+-extern void privateer_machine_check(u64, u64);
++extern void privateer_machine_check(unsigned long, unsigned long);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/err_marvel.c linux-2.6.30-rc4-git/arch/alpha/kernel/err_marvel.c
+--- linux-2.6.30-rc4/arch/alpha/kernel/err_marvel.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/err_marvel.c        2009-05-13 09:46:19.000000000 +0200
+@@ -1042,7 +1042,7 @@ marvel_process_logout_frame(struct ev7_l
+ }
+ void
+-marvel_machine_check(u64 vector, u64 la_ptr)
++marvel_machine_check(unsigned long vector, unsigned long la_ptr)
+ {
+       struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr;
+       int (*process_frame)(struct ev7_lf_subpackets *, int) = NULL;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/err_titan.c linux-2.6.30-rc4-git/arch/alpha/kernel/err_titan.c
+--- linux-2.6.30-rc4/arch/alpha/kernel/err_titan.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/err_titan.c 2009-05-13 09:46:19.000000000 +0200
+@@ -380,7 +380,7 @@ titan_process_logout_frame(struct el_com
+ }
+ void
+-titan_machine_check(u64 vector, u64 la_ptr)
++titan_machine_check(unsigned long vector, unsigned long la_ptr)
+ {
+       struct el_common *mchk_header = (struct el_common *)la_ptr;
+       struct el_TITAN_sysdata_mcheck *tmchk =
+@@ -702,7 +702,7 @@ privateer_process_logout_frame(struct el
+ }
+ void
+-privateer_machine_check(u64 vector, u64 la_ptr)
++privateer_machine_check(unsigned long vector, unsigned long la_ptr)
+ {
+       struct el_common *mchk_header = (struct el_common *)la_ptr;
+       struct el_TITAN_sysdata_mcheck *tmchk =
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/Makefile linux-2.6.30-rc4-git/arch/alpha/kernel/Makefile
+--- linux-2.6.30-rc4/arch/alpha/kernel/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -8,7 +8,7 @@ EXTRA_CFLAGS   := -Werror -Wno-sign-compar
+ obj-y    := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
+           irq_alpha.o signal.o setup.o ptrace.o time.o \
+-          alpha_ksyms.o systbls.o err_common.o io.o binfmt_loader.o
++          alpha_ksyms.o systbls.o err_common.o io.o
+ obj-$(CONFIG_VGA_HOSE)        += console.o
+ obj-$(CONFIG_SMP)     += smp.o
+@@ -43,6 +43,10 @@ else
+ # Misc support
+ obj-$(CONFIG_ALPHA_SRM)               += srmcons.o
++ifdef CONFIG_BINFMT_AOUT
++obj-y += binfmt_loader.o
++endif
++
+ # Core logic support
+ obj-$(CONFIG_ALPHA_APECS)     += core_apecs.o
+ obj-$(CONFIG_ALPHA_CIA)               += core_cia.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/kernel/proto.h linux-2.6.30-rc4-git/arch/alpha/kernel/proto.h
+--- linux-2.6.30-rc4/arch/alpha/kernel/proto.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/kernel/proto.h     2009-05-13 09:46:19.000000000 +0200
+@@ -36,7 +36,6 @@ extern void cia_pci_tbi(struct pci_contr
+ extern struct pci_ops irongate_pci_ops;
+ extern int irongate_pci_clr_err(void);
+ extern void irongate_init_arch(void);
+-extern void irongate_machine_check(u64, u64);
+ #define irongate_pci_tbi ((void *)0)
+ /* core_lca.c */
+@@ -49,7 +48,7 @@ extern void lca_pci_tbi(struct pci_contr
+ extern struct pci_ops marvel_pci_ops;
+ extern void marvel_init_arch(void);
+ extern void marvel_kill_arch(int);
+-extern void marvel_machine_check(u64, u64);
++extern void marvel_machine_check(unsigned long, unsigned long);
+ extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
+ extern int marvel_pa_to_nid(unsigned long);
+ extern int marvel_cpuid_to_nid(int);
+@@ -86,7 +85,7 @@ extern void t2_pci_tbi(struct pci_contro
+ extern struct pci_ops titan_pci_ops;
+ extern void titan_init_arch(void);
+ extern void titan_kill_arch(int);
+-extern void titan_machine_check(u64, u64);
++extern void titan_machine_check(unsigned long, unsigned long);
+ extern void titan_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
+ extern struct _alpha_agp_info *titan_agp_info(void);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/alpha/mm/extable.c linux-2.6.30-rc4-git/arch/alpha/mm/extable.c
+--- linux-2.6.30-rc4/arch/alpha/mm/extable.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/alpha/mm/extable.c       2009-05-13 09:46:19.000000000 +0200
+@@ -3,11 +3,49 @@
+  */
+ #include <linux/module.h>
++#include <linux/sort.h>
+ #include <asm/uaccess.h>
++static inline unsigned long ex_to_addr(const struct exception_table_entry *x)
++{
++      return (unsigned long)&x->insn + x->insn;
++}
++
++static void swap_ex(void *a, void *b, int size)
++{
++      struct exception_table_entry *ex_a = a, *ex_b = b;
++      unsigned long addr_a = ex_to_addr(ex_a), addr_b = ex_to_addr(ex_b);
++      unsigned int t = ex_a->fixup.unit;
++
++      ex_a->fixup.unit = ex_b->fixup.unit;
++      ex_b->fixup.unit = t;
++      ex_a->insn = (int)(addr_b - (unsigned long)&ex_a->insn);
++      ex_b->insn = (int)(addr_a - (unsigned long)&ex_b->insn);
++}
++
++/*
++ * The exception table needs to be sorted so that the binary
++ * search that we use to find entries in it works properly.
++ * This is used both for the kernel exception table and for
++ * the exception tables of modules that get loaded.
++ */
++static int cmp_ex(const void *a, const void *b)
++{
++      const struct exception_table_entry *x = a, *y = b;
++
++      /* avoid overflow */
++      if (ex_to_addr(x) > ex_to_addr(y))
++              return 1;
++      if (ex_to_addr(x) < ex_to_addr(y))
++              return -1;
++      return 0;
++}
++
+ void sort_extable(struct exception_table_entry *start,
+                 struct exception_table_entry *finish)
+ {
++      sort(start, finish - start, sizeof(struct exception_table_entry),
++           cmp_ex, swap_ex);
+ }
+ const struct exception_table_entry *
+@@ -20,7 +58,7 @@ search_extable(const struct exception_ta
+               unsigned long mid_value;
+               mid = (last - first) / 2 + first;
+-              mid_value = (unsigned long)&mid->insn + mid->insn;
++              mid_value = ex_to_addr(mid);
+                 if (mid_value == value)
+                         return mid;
+                 else if (mid_value < value)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/configs/davinci_all_defconfig linux-2.6.30-rc4-git/arch/arm/configs/davinci_all_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/davinci_all_defconfig    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/configs/davinci_all_defconfig        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,1784 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.30-rc2
++# Wed Apr 15 08:16:53 2009
++#
++CONFIG_ARM=y
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_MMU=y
++# CONFIG_NO_IOPORT is not set
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ZONE_DMA=y
++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_POSIX_MQUEUE_SYSCTL=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++
++#
++# RCU Subsystem
++#
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
++# CONFIG_CGROUPS is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++# CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_EMBEDDED=y
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++# CONFIG_STRIP_ASM_SYMS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++CONFIG_COMPAT_BRK=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_CLK=y
++# CONFIG_SLOW_WORK is not set
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_MODVERSIONS=y
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_BSG is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_FREEZER is not set
++
++#
++# System Type
++#
++# CONFIG_ARCH_AAEC2000 is not set
++# CONFIG_ARCH_INTEGRATOR is not set
++# CONFIG_ARCH_REALVIEW is not set
++# CONFIG_ARCH_VERSATILE is not set
++# CONFIG_ARCH_AT91 is not set
++# CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_EBSA110 is not set
++# CONFIG_ARCH_EP93XX is not set
++# CONFIG_ARCH_GEMINI is not set
++# CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_NETX is not set
++# CONFIG_ARCH_H720X is not set
++# CONFIG_ARCH_IMX is not set
++# CONFIG_ARCH_IOP13XX is not set
++# CONFIG_ARCH_IOP32X is not set
++# CONFIG_ARCH_IOP33X is not set
++# CONFIG_ARCH_IXP23XX is not set
++# CONFIG_ARCH_IXP2000 is not set
++# CONFIG_ARCH_IXP4XX is not set
++# CONFIG_ARCH_L7200 is not set
++# CONFIG_ARCH_KIRKWOOD is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_LOKI is not set
++# CONFIG_ARCH_MV78XX0 is not set
++# CONFIG_ARCH_MXC is not set
++# CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_PNX4008 is not set
++# CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_RPC is not set
++# CONFIG_ARCH_SA1100 is not set
++# CONFIG_ARCH_S3C2410 is not set
++# CONFIG_ARCH_S3C64XX is not set
++# CONFIG_ARCH_SHARK is not set
++# CONFIG_ARCH_LH7A40X is not set
++CONFIG_ARCH_DAVINCI=y
++# CONFIG_ARCH_OMAP is not set
++# CONFIG_ARCH_MSM is not set
++# CONFIG_ARCH_W90X900 is not set
++
++#
++# TI DaVinci Implementations
++#
++
++#
++# DaVinci Core Type
++#
++CONFIG_ARCH_DAVINCI_DM644x=y
++
++#
++# DaVinci Board Type
++#
++CONFIG_MACH_DAVINCI_EVM=y
++CONFIG_DAVINCI_MUX=y
++CONFIG_DAVINCI_MUX_DEBUG=y
++CONFIG_DAVINCI_MUX_WARNINGS=y
++CONFIG_DAVINCI_RESET_CLOCKS=y
++
++#
++# Processor Type
++#
++CONFIG_CPU_32=y
++CONFIG_CPU_ARM926T=y
++CONFIG_CPU_32v5=y
++CONFIG_CPU_ABRT_EV5TJ=y
++CONFIG_CPU_PABRT_NOIFAR=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++
++#
++# Processor Features
++#
++CONFIG_ARM_THUMB=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
++# CONFIG_OUTER_CACHE is not set
++CONFIG_COMMON_CLKDEV=y
++
++#
++# Bus support
++#
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD is not set
++
++#
++# Kernel Features
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_VMSPLIT_3G=y
++# CONFIG_VMSPLIT_2G is not set
++# CONFIG_VMSPLIT_1G is not set
++CONFIG_PAGE_OFFSET=0xC0000000
++CONFIG_PREEMPT=y
++CONFIG_HZ=100
++CONFIG_AEABI=y
++# CONFIG_OABI_COMPAT is not set
++CONFIG_ARCH_FLATMEM_HAS_HOLES=y
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_SPLIT_PTLOCK_CPUS=4096
++# CONFIG_PHYS_ADDR_T_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_LEDS=y
++# CONFIG_LEDS_CPU is not set
++CONFIG_ALIGNMENT_TRAP=y
++
++#
++# Boot options
++#
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_CMDLINE=""
++# CONFIG_XIP_KERNEL is not set
++# CONFIG_KEXEC is not set
++
++#
++# CPU Power Management
++#
++# CONFIG_CPU_IDLE is not set
++
++#
++# Floating point emulation
++#
++
++#
++# At least one emulation must be selected
++#
++# CONFIG_VFP is not set
++
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
++CONFIG_HAVE_AOUT=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++CONFIG_IPV6=m
++# CONFIG_IPV6_PRIVACY is not set
++# CONFIG_IPV6_ROUTER_PREF is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
++CONFIG_IPV6_SIT=m
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
++# CONFIG_NETWORK_SECMARK is not set
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
++
++#
++# Core Netfilter Configuration
++#
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NETFILTER_XTABLES is not set
++# CONFIG_IP_VS is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_NF_DEFRAG_IPV4 is not set
++# CONFIG_IP_NF_QUEUE is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++
++#
++# IPv6: Netfilter Configuration
++#
++# CONFIG_IP6_NF_QUEUE is not set
++# CONFIG_IP6_NF_IPTABLES is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_WIRELESS is not set
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=m
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_TESTS is not set
++# CONFIG_MTD_REDBOOT_PARTS is not set
++# CONFIG_MTD_AFS_PARTS is not set
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=m
++CONFIG_MTD_BLKDEVS=m
++CONFIG_MTD_BLOCK=m
++# CONFIG_MTD_BLOCK_RO is not set
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=m
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=m
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=m
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=m
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=m
++# CONFIG_MTD_PHYSMAP_COMPAT is not set
++# CONFIG_MTD_ARM_INTEGRATOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++CONFIG_MTD_NAND=m
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++# CONFIG_MTD_NAND_GPIO is not set
++CONFIG_MTD_NAND_IDS=m
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++# CONFIG_MTD_ALAUDA is not set
++CONFIG_MTD_NAND_DAVINCI=m
++# CONFIG_MTD_ONENAND is not set
++
++#
++# LPDDR flash memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=m
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_UB is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=1
++CONFIG_BLK_DEV_RAM_SIZE=32768
++# CONFIG_BLK_DEV_XIP is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++CONFIG_EEPROM_AT24=y
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_93CX6 is not set
++CONFIG_HAVE_IDE=y
++CONFIG_IDE=m
++
++#
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
++#
++CONFIG_IDE_XFER_MODE=y
++CONFIG_IDE_TIMINGS=y
++# CONFIG_BLK_DEV_IDE_SATA is not set
++CONFIG_IDE_GD=m
++CONFIG_IDE_GD_ATA=y
++# CONFIG_IDE_GD_ATAPI is not set
++# CONFIG_BLK_DEV_IDECD is not set
++# CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_IDE_TASK_IOCTL is not set
++CONFIG_IDE_PROC_FS=y
++
++#
++# IDE chipset support/bugfixes
++#
++# CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
++CONFIG_BLK_DEV_PALMCHIP_BK3710=m
++CONFIG_BLK_DEV_IDEDMA=y
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=m
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_TGT is not set
++# CONFIG_SCSI_NETLINK is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=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
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++# CONFIG_SCSI_MULTI_LUN is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_LIBFC is not set
++# CONFIG_LIBFCOE is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++CONFIG_COMPAT_NET_DEV_OPS=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++CONFIG_TUN=m
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++CONFIG_LXT_PHY=y
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_STE10XP is not set
++CONFIG_LSI_ET1011C_PHY=y
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_AX88796 is not set
++# CONFIG_SMC91X is not set
++# CONFIG_DM9000 is not set
++# CONFIG_ETHOC is not set
++# CONFIG_SMC911X is not set
++# CONFIG_SMSC911X is not set
++# CONFIG_DNET is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
++# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
++# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
++# CONFIG_B44 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET is not set
++# CONFIG_WAN is not set
++CONFIG_PPP=m
++# CONFIG_PPP_MULTILINK is not set
++# CONFIG_PPP_FILTER is not set
++CONFIG_PPP_ASYNC=m
++CONFIG_PPP_SYNC_TTY=m
++CONFIG_PPP_DEFLATE=m
++# CONFIG_PPP_BSDCOMP is not set
++# CONFIG_PPP_MPPE is not set
++# CONFIG_PPPOE is not set
++# CONFIG_PPPOL2TP is not set
++# CONFIG_SLIP is not set
++CONFIG_SLHC=m
++CONFIG_NETCONSOLE=y
++# CONFIG_NETCONSOLE_DYNAMIC is not set
++CONFIG_NETPOLL=y
++CONFIG_NETPOLL_TRAP=y
++CONFIG_NET_POLL_CONTROLLER=y
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=m
++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_EVDEV=m
++CONFIG_INPUT_EVBUG=m
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++CONFIG_KEYBOARD_ATKBD=m
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++CONFIG_KEYBOARD_XTKBD=m
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++CONFIG_KEYBOARD_GPIO=y
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
++# CONFIG_TOUCHSCREEN_AD7879 is not set
++# CONFIG_TOUCHSCREEN_FUJITSU is not set
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_INEXIO is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++# CONFIG_TOUCHSCREEN_PENMOUNT is not set
++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
++# CONFIG_TOUCHSCREEN_TSC2007 is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++# CONFIG_VT_CONSOLE is not set
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_NR_UARTS=3
++CONFIG_SERIAL_8250_RUNTIME_UARTS=3
++# CONFIG_SERIAL_8250_EXTENDED is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=m
++# CONFIG_HW_RANDOM_TIMERIOMEM is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_HELPER_AUTO=y
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++CONFIG_I2C_DAVINCI=y
++# CONFIG_I2C_GPIO is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_SIMTEC is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_STUB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++# CONFIG_SPI is not set
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++CONFIG_GPIOLIB=y
++# CONFIG_DEBUG_GPIO is not set
++# CONFIG_GPIO_SYSFS is not set
++
++#
++# Memory mapped GPIO expanders:
++#
++
++#
++# I2C GPIO expanders:
++#
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++CONFIG_GPIO_PCF857X=m
++
++#
++# PCI GPIO expanders:
++#
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_AD7414 is not set
++# CONFIG_SENSORS_AD7418 is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ADT7462 is not set
++# CONFIG_SENSORS_ADT7470 is not set
++# CONFIG_SENSORS_ADT7473 is not set
++# CONFIG_SENSORS_ADT7475 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
++# CONFIG_SENSORS_G760A is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_LTC4215 is not set
++# CONFIG_SENSORS_LTC4245 is not set
++# CONFIG_SENSORS_LM95241 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_MAX6650 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_SHT15 is not set
++# CONFIG_SENSORS_DME1737 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_ADS7828 is not set
++# CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83L786NG is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++# CONFIG_THERMAL is not set
++# CONFIG_THERMAL_HWMON is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++CONFIG_DAVINCI_WATCHDOG=m
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++
++#
++# Sonics Silicon Backplane
++#
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_ASIC3 is not set
++# CONFIG_HTC_EGPIO is not set
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_MFD_TMIO is not set
++# CONFIG_MFD_T7L66XB is not set
++# CONFIG_MFD_TC6387XB is not set
++# CONFIG_MFD_TC6393XB is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_PCF50633 is not set
++
++#
++# Multimedia devices
++#
++
++#
++# Multimedia core support
++#
++CONFIG_VIDEO_DEV=y
++CONFIG_VIDEO_V4L2_COMMON=y
++CONFIG_VIDEO_ALLOW_V4L1=y
++CONFIG_VIDEO_V4L1_COMPAT=y
++# CONFIG_DVB_CORE is not set
++CONFIG_VIDEO_MEDIA=y
++
++#
++# Multimedia drivers
++#
++# CONFIG_MEDIA_ATTACH is not set
++CONFIG_MEDIA_TUNER=y
++# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
++CONFIG_MEDIA_TUNER_SIMPLE=y
++CONFIG_MEDIA_TUNER_TDA8290=y
++CONFIG_MEDIA_TUNER_TDA9887=y
++CONFIG_MEDIA_TUNER_TEA5761=y
++CONFIG_MEDIA_TUNER_TEA5767=y
++CONFIG_MEDIA_TUNER_MT20XX=y
++CONFIG_MEDIA_TUNER_XC2028=y
++CONFIG_MEDIA_TUNER_XC5000=y
++CONFIG_MEDIA_TUNER_MC44S803=y
++CONFIG_VIDEO_V4L2=y
++CONFIG_VIDEO_V4L1=y
++CONFIG_VIDEO_CAPTURE_DRIVERS=y
++# CONFIG_VIDEO_ADV_DEBUG is not set
++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
++CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
++# CONFIG_VIDEO_VIVI is not set
++# CONFIG_VIDEO_CPIA is not set
++# CONFIG_VIDEO_CPIA2 is not set
++# CONFIG_VIDEO_SAA5246A is not set
++# CONFIG_VIDEO_SAA5249 is not set
++# CONFIG_SOC_CAMERA is not set
++# CONFIG_V4L_USB_DRIVERS is not set
++# CONFIG_RADIO_ADAPTERS is not set
++CONFIG_DAB=y
++# CONFIG_USB_DABUSB is not set
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++CONFIG_FB=y
++CONFIG_FIRMWARE_EDID=y
++# CONFIG_FB_DDC is not set
++# CONFIG_FB_BOOT_VESA_SUPPORT is not set
++# CONFIG_FB_CFB_FILLRECT is not set
++# CONFIG_FB_CFB_COPYAREA is not set
++# CONFIG_FB_CFB_IMAGEBLIT is not set
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
++# CONFIG_FB_SYS_FILLRECT is not set
++# CONFIG_FB_SYS_COPYAREA is not set
++# CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_SYS_FOPS is not set
++# CONFIG_FB_SVGALIB is not set
++# CONFIG_FB_MACMODES is not set
++# CONFIG_FB_BACKLIGHT is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++# CONFIG_VGA_CONSOLE is not set
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE=y
++# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
++# CONFIG_FONTS is not set
++CONFIG_FONT_8x8=y
++CONFIG_FONT_8x16=y
++CONFIG_LOGO=y
++CONFIG_LOGO_LINUX_MONO=y
++CONFIG_LOGO_LINUX_VGA16=y
++CONFIG_LOGO_LINUX_CLUT224=y
++CONFIG_SOUND=m
++# CONFIG_SOUND_OSS_CORE is not set
++CONFIG_SND=m
++CONFIG_SND_TIMER=m
++CONFIG_SND_PCM=m
++CONFIG_SND_JACK=y
++# CONFIG_SND_SEQUENCER is not set
++# CONFIG_SND_MIXER_OSS is not set
++# CONFIG_SND_PCM_OSS is not set
++# CONFIG_SND_HRTIMER is not set
++# CONFIG_SND_DYNAMIC_MINORS is not set
++CONFIG_SND_SUPPORT_OLD_API=y
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++CONFIG_SND_DRIVERS=y
++# 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
++CONFIG_SND_ARM=y
++CONFIG_SND_USB=y
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_CAIAQ is not set
++CONFIG_SND_SOC=m
++# CONFIG_SND_DAVINCI_SOC is not set
++CONFIG_SND_SOC_I2C_AND_SPI=m
++# CONFIG_SND_SOC_ALL_CODECS is not set
++# CONFIG_SOUND_PRIME is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=m
++# CONFIG_HID_DEBUG is not set
++# CONFIG_HIDRAW is not set
++
++#
++# USB Input Devices
++#
++CONFIG_USB_HID=m
++# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDDEV is not set
++
++#
++# USB HID Boot Protocol drivers
++#
++# CONFIG_USB_KBD is not set
++# CONFIG_USB_MOUSE is not set
++
++#
++# Special HID drivers
++#
++CONFIG_HID_A4TECH=m
++CONFIG_HID_APPLE=m
++CONFIG_HID_BELKIN=m
++CONFIG_HID_CHERRY=m
++CONFIG_HID_CHICONY=m
++CONFIG_HID_CYPRESS=m
++# CONFIG_DRAGONRISE_FF is not set
++CONFIG_HID_EZKEY=m
++# CONFIG_HID_KYE is not set
++CONFIG_HID_GYRATION=m
++# CONFIG_HID_KENSINGTON is not set
++CONFIG_HID_LOGITECH=m
++# CONFIG_LOGITECH_FF is not set
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
++CONFIG_HID_MICROSOFT=m
++CONFIG_HID_MONTEREY=m
++# CONFIG_HID_NTRIG is not set
++CONFIG_HID_PANTHERLORD=m
++# CONFIG_PANTHERLORD_FF is not set
++CONFIG_HID_PETALYNX=m
++CONFIG_HID_SAMSUNG=m
++CONFIG_HID_SONY=m
++CONFIG_HID_SUNPLUS=m
++# CONFIG_GREENASIA_FF is not set
++# CONFIG_HID_TOPSEED is not set
++# CONFIG_THRUSTMASTER_FF is not set
++# CONFIG_ZEROPLUS_FF is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++# CONFIG_USB_ARCH_HAS_OHCI is not set
++# CONFIG_USB_ARCH_HAS_EHCI is not set
++CONFIG_USB=m
++# CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
++CONFIG_USB_MON=m
++# CONFIG_USB_WUSB is not set
++# CONFIG_USB_WUSB_CBAF is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_C67X00_HCD is not set
++# CONFIG_USB_OXU210HP_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++# CONFIG_USB_HWA_HCD is not set
++CONFIG_USB_MUSB_HDRC=m
++CONFIG_USB_MUSB_SOC=y
++
++#
++# DaVinci 35x and 644x USB support
++#
++# CONFIG_USB_MUSB_HOST is not set
++CONFIG_USB_MUSB_PERIPHERAL=y
++# CONFIG_USB_MUSB_OTG is not set
++CONFIG_USB_GADGET_MUSB_HDRC=y
++CONFIG_MUSB_PIO_ONLY=y
++# CONFIG_USB_MUSB_DEBUG is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++# CONFIG_USB_WDM is not set
++# CONFIG_USB_TMC is not set
++
++#
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
++#
++
++#
++# also be needed; see USB_STORAGE Help for more info
++#
++CONFIG_USB_STORAGE=m
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++
++#
++# USB port drivers
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++CONFIG_USB_TEST=m
++# CONFIG_USB_ISIGHTFW is not set
++# CONFIG_USB_VST is not set
++CONFIG_USB_GADGET=m
++# CONFIG_USB_GADGET_DEBUG is not set
++CONFIG_USB_GADGET_DEBUG_FILES=y
++CONFIG_USB_GADGET_DEBUG_FS=y
++CONFIG_USB_GADGET_VBUS_DRAW=2
++CONFIG_USB_GADGET_SELECTED=y
++# CONFIG_USB_GADGET_AT91 is not set
++# CONFIG_USB_GADGET_ATMEL_USBA is not set
++# CONFIG_USB_GADGET_FSL_USB2 is not set
++# CONFIG_USB_GADGET_LH7A40X is not set
++# CONFIG_USB_GADGET_OMAP is not set
++# CONFIG_USB_GADGET_PXA25X is not set
++# CONFIG_USB_GADGET_PXA27X is not set
++# CONFIG_USB_GADGET_S3C2410 is not set
++# CONFIG_USB_GADGET_IMX is not set
++# CONFIG_USB_GADGET_M66592 is not set
++# CONFIG_USB_GADGET_AMD5536UDC is not set
++# CONFIG_USB_GADGET_FSL_QE is not set
++# CONFIG_USB_GADGET_CI13XXX is not set
++# CONFIG_USB_GADGET_NET2280 is not set
++# CONFIG_USB_GADGET_GOKU is not set
++# CONFIG_USB_GADGET_DUMMY_HCD is not set
++CONFIG_USB_GADGET_DUALSPEED=y
++CONFIG_USB_ZERO=m
++CONFIG_USB_ETH=m
++CONFIG_USB_ETH_RNDIS=y
++CONFIG_USB_GADGETFS=m
++CONFIG_USB_FILE_STORAGE=m
++# CONFIG_USB_FILE_STORAGE_TEST is not set
++CONFIG_USB_G_SERIAL=m
++# CONFIG_USB_MIDI_GADGET is not set
++CONFIG_USB_G_PRINTER=m
++CONFIG_USB_CDC_COMPOSITE=m
++
++#
++# OTG and related infrastructure
++#
++CONFIG_USB_OTG_UTILS=y
++# CONFIG_USB_GPIO_VBUS is not set
++# CONFIG_NOP_USB_XCEIV is not set
++CONFIG_MMC=m
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_UNSAFE_RESUME is not set
++
++#
++# MMC/SD/SDIO Card Drivers
++#
++CONFIG_MMC_BLOCK=m
++# CONFIG_MMC_BLOCK_BOUNCE is not set
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_SDHCI is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_ACCESSIBILITY is not set
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=m
++
++#
++# LED drivers
++#
++# CONFIG_LEDS_PCA9532 is not set
++CONFIG_LEDS_GPIO=m
++CONFIG_LEDS_GPIO_PLATFORM=y
++# CONFIG_LEDS_LP5521 is not set
++# CONFIG_LEDS_PCA955X is not set
++# CONFIG_LEDS_BD2802 is not set
++
++#
++# LED Triggers
++#
++CONFIG_LEDS_TRIGGERS=y
++CONFIG_LEDS_TRIGGER_TIMER=m
++# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
++CONFIG_LEDS_TRIGGER_HEARTBEAT=m
++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
++# CONFIG_LEDS_TRIGGER_GPIO is not set
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++
++#
++# iptables trigger is under Netfilter config (LED target)
++#
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=m
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++# CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8563 is not set
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_S35390A is not set
++# CONFIG_RTC_DRV_FM3130 is not set
++# CONFIG_RTC_DRV_RX8581 is not set
++
++#
++# SPI RTC drivers
++#
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_CMOS is not set
++# CONFIG_RTC_DRV_DS1286 is not set
++# CONFIG_RTC_DRV_DS1511 is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T35 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_BQ4802 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++
++#
++# on-CPU RTC drivers
++#
++# CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_REGULATOR is not set
++# CONFIG_UIO is not set
++# CONFIG_STAGING is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=y
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4_FS is not set
++CONFIG_JBD=y
++# CONFIG_JBD_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_XFS_FS=m
++# CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_POSIX_ACL is not set
++# CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++CONFIG_AUTOFS4_FS=m
++# CONFIG_FUSE_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# CONFIG_CONFIGFS_FS is not set
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=m
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# CONFIG_SQUASHFS is not set
++# CONFIG_VXFS_FS is not set
++CONFIG_MINIX_FS=m
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++CONFIG_ROOT_NFS=y
++CONFIG_NFSD=m
++CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
++# CONFIG_NFSD_V4 is not set
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=m
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++CONFIG_SMB_FS=m
++# CONFIG_SMB_NLS_DEFAULT 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_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++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=m
++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=m
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++CONFIG_DEBUG_FS=y
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++# CONFIG_DEBUG_SHIRQ is not set
++CONFIG_DETECT_SOFTLOCKUP=y
++# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
++CONFIG_DETECT_HUNG_TASK=y
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++CONFIG_TIMER_STATS=y
++# CONFIG_DEBUG_OBJECTS is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++CONFIG_DEBUG_PREEMPT=y
++CONFIG_DEBUG_RT_MUTEXES=y
++CONFIG_DEBUG_PI_LIST=y
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++CONFIG_DEBUG_MUTEXES=y
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_RCU_CPU_STALL_DETECTOR is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++# CONFIG_SYSCTL_SYSCALL_CHECK is not set
++# CONFIG_PAGE_POISONING is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_TRACING_SUPPORT=y
++
++#
++# Tracers
++#
++# CONFIG_FUNCTION_TRACER is not set
++# CONFIG_IRQSOFF_TRACER is not set
++# CONFIG_PREEMPT_TRACER is not set
++# CONFIG_SCHED_TRACER is not set
++# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_EVENT_TRACER is not set
++# CONFIG_BOOT_TRACER is not set
++# CONFIG_TRACE_BRANCH_PROFILING is not set
++# CONFIG_STACK_TRACER is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_DYNAMIC_DEBUG is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
++CONFIG_DEBUG_USER=y
++CONFIG_DEBUG_ERRORS=y
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_LL is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++# CONFIG_CRYPTO_FIPS is not set
++# CONFIG_CRYPTO_MANAGER is not set
++# CONFIG_CRYPTO_MANAGER2 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
++# CONFIG_CRYPTO_LZO is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++# CONFIG_CRYPTO_HW is not set
++# CONFIG_BINARY_PRINTF is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_GENERIC_FIND_LAST_BIT=y
++CONFIG_CRC_CCITT=m
++# CONFIG_CRC16 is not set
++CONFIG_CRC_T10DIF=m
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=m
++CONFIG_DECOMPRESS_GZIP=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/configs/mx21_defconfig linux-2.6.30-rc4-git/arch/arm/configs/mx21_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/mx21_defconfig   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/configs/mx21_defconfig       2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,1170 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.30-rc1
++# Tue Apr 14 16:58:09 2009
++#
++CONFIG_ARM=y
++CONFIG_HAVE_PWM=y
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_MMU=y
++# CONFIG_NO_IOPORT is not set
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ARCH_MTD_XIP=y
++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++
++#
++# RCU Subsystem
++#
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_CGROUPS is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++# CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_EMBEDDED=y
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++CONFIG_KALLSYMS_EXTRA_PASS=y
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_COMPAT_BRK=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++# CONFIG_SLOW_WORK is not set
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_BSG is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++CONFIG_DEFAULT_NOOP=y
++CONFIG_DEFAULT_IOSCHED="noop"
++# CONFIG_FREEZER is not set
++
++#
++# System Type
++#
++# CONFIG_ARCH_AAEC2000 is not set
++# CONFIG_ARCH_INTEGRATOR is not set
++# CONFIG_ARCH_REALVIEW is not set
++# CONFIG_ARCH_VERSATILE is not set
++# CONFIG_ARCH_AT91 is not set
++# CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_EBSA110 is not set
++# CONFIG_ARCH_EP93XX is not set
++# CONFIG_ARCH_GEMINI is not set
++# CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_NETX is not set
++# CONFIG_ARCH_H720X is not set
++# CONFIG_ARCH_IOP13XX is not set
++# CONFIG_ARCH_IOP32X is not set
++# CONFIG_ARCH_IOP33X is not set
++# CONFIG_ARCH_IXP23XX is not set
++# CONFIG_ARCH_IXP2000 is not set
++# CONFIG_ARCH_IXP4XX is not set
++# CONFIG_ARCH_L7200 is not set
++# CONFIG_ARCH_KIRKWOOD is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_LOKI is not set
++# CONFIG_ARCH_MV78XX0 is not set
++CONFIG_ARCH_MXC=y
++# CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_PNX4008 is not set
++# CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_RPC is not set
++# CONFIG_ARCH_SA1100 is not set
++# CONFIG_ARCH_S3C2410 is not set
++# CONFIG_ARCH_S3C64XX is not set
++# CONFIG_ARCH_SHARK is not set
++# CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_DAVINCI is not set
++# CONFIG_ARCH_OMAP is not set
++# CONFIG_ARCH_MSM is not set
++# CONFIG_ARCH_W90X900 is not set
++
++#
++# Freescale MXC Implementations
++#
++# CONFIG_ARCH_MX1 is not set
++CONFIG_ARCH_MX2=y
++# CONFIG_ARCH_MX3 is not set
++CONFIG_MACH_MX21=y
++# CONFIG_MACH_MX27 is not set
++
++#
++# MX2 platforms:
++#
++CONFIG_MACH_MX21ADS=y
++# CONFIG_MXC_IRQ_PRIOR is not set
++CONFIG_MXC_PWM=y
++
++#
++# Processor Type
++#
++CONFIG_CPU_32=y
++CONFIG_CPU_ARM926T=y
++CONFIG_CPU_32v5=y
++CONFIG_CPU_ABRT_EV5TJ=y
++CONFIG_CPU_PABRT_NOIFAR=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++
++#
++# Processor Features
++#
++CONFIG_ARM_THUMB=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
++# CONFIG_OUTER_CACHE is not set
++CONFIG_COMMON_CLKDEV=y
++
++#
++# Bus support
++#
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD is not set
++
++#
++# Kernel Features
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_VMSPLIT_3G=y
++# CONFIG_VMSPLIT_2G is not set
++# CONFIG_VMSPLIT_1G is not set
++CONFIG_PAGE_OFFSET=0xC0000000
++CONFIG_PREEMPT=y
++CONFIG_HZ=100
++CONFIG_AEABI=y
++CONFIG_OABI_COMPAT=y
++CONFIG_ARCH_FLATMEM_HAS_HOLES=y
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_SPLIT_PTLOCK_CPUS=4096
++# CONFIG_PHYS_ADDR_T_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=0
++CONFIG_VIRT_TO_BUS=y
++CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_ALIGNMENT_TRAP=y
++
++#
++# Boot options
++#
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_CMDLINE=""
++# CONFIG_XIP_KERNEL is not set
++# CONFIG_KEXEC is not set
++
++#
++# CPU Power Management
++#
++# CONFIG_CPU_IDLE is not set
++
++#
++# Floating point emulation
++#
++
++#
++# At least one emulation must be selected
++#
++# CONFIG_FPE_NWFPE is not set
++# CONFIG_FPE_FASTFPE is not set
++# CONFIG_VFP is not set
++
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
++CONFIG_HAVE_AOUT=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_NET=y
++
++#
++# Networking options
++#
++# CONFIG_PACKET is not set
++# CONFIG_UNIX is not set
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++# CONFIG_INET_DIAG is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++CONFIG_WIRELESS=y
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_OLD_REGULATORY is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_LIB80211 is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++CONFIG_MTD_DEBUG=y
++CONFIG_MTD_DEBUG_VERBOSE=3
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_TESTS is not set
++CONFIG_MTD_REDBOOT_PARTS=y
++CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
++# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
++# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AFS_PARTS is not set
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++CONFIG_MTD_CFI_ADV_OPTIONS=y
++CONFIG_MTD_CFI_NOSWAP=y
++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
++CONFIG_MTD_CFI_GEOMETRY=y
++# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_OTP is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++# CONFIG_MTD_XIP is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=y
++# CONFIG_MTD_PHYSMAP_COMPAT is not set
++# CONFIG_MTD_ARM_INTEGRATOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_DATAFLASH is not set
++# CONFIG_MTD_M25P80 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++CONFIG_MTD_NAND=y
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++# CONFIG_MTD_NAND_GPIO is not set
++CONFIG_MTD_NAND_IDS=y
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++CONFIG_MTD_NAND_MXC=y
++# CONFIG_MTD_ONENAND is not set
++
++#
++# LPDDR flash memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++# CONFIG_BLK_DEV_LOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_RAM is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_AT25 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_93CX6 is not set
++CONFIG_HAVE_IDE=y
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++CONFIG_COMPAT_NET_DEV_OPS=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_AX88796 is not set
++# CONFIG_SMC91X is not set
++# CONFIG_DM9000 is not set
++# CONFIG_ENC28J60 is not set
++# CONFIG_ETHOC is not set
++# CONFIG_SMC911X is not set
++# CONFIG_SMSC911X is not set
++# CONFIG_DNET is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
++# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
++# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
++# CONFIG_B44 is not set
++CONFIG_CS89x0=y
++CONFIG_CS89x0_NONISA_IRQ=y
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++# CONFIG_INPUT_MOUSEDEV is not set
++# CONFIG_INPUT_JOYDEV is not set
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++# CONFIG_INPUT_KEYBOARD is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++# CONFIG_TOUCHSCREEN_ADS7846 is not set
++# CONFIG_TOUCHSCREEN_FUJITSU is not set
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_INEXIO is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++# CONFIG_TOUCHSCREEN_PENMOUNT is not set
++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
++# CONFIG_TOUCHSCREEN_TSC2007 is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++# CONFIG_CONSOLE_TRANSLATIONS is not set
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_NR_UARTS=1
++CONFIG_SERIAL_8250_RUNTIME_UARTS=1
++# CONFIG_SERIAL_8250_EXTENDED is not set
++
++#
++# Non-8250 serial port support
++#
++# CONFIG_SERIAL_MAX3100 is not set
++CONFIG_SERIAL_IMX=y
++CONFIG_SERIAL_IMX_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_HELPER_AUTO=y
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++# CONFIG_I2C_GPIO is not set
++CONFIG_I2C_IMX=y
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_SIMTEC is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_TAOS_EVM is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_STUB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_PCF8575 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++CONFIG_SPI=y
++CONFIG_SPI_MASTER=y
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_BITBANG is not set
++# CONFIG_SPI_GPIO is not set
++
++#
++# SPI Protocol Masters
++#
++# CONFIG_SPI_SPIDEV is not set
++# CONFIG_SPI_TLE62X0 is not set
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++CONFIG_GPIOLIB=y
++# CONFIG_GPIO_SYSFS is not set
++
++#
++# Memory mapped GPIO expanders:
++#
++
++#
++# I2C GPIO expanders:
++#
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++
++#
++# PCI GPIO expanders:
++#
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_GPIO_MAX7301 is not set
++# CONFIG_GPIO_MCP23S08 is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_THERMAL_HWMON is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++
++#
++# Sonics Silicon Backplane
++#
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_ASIC3 is not set
++# CONFIG_HTC_EGPIO is not set
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_MFD_TMIO is not set
++# CONFIG_MFD_TC6393XB is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_PCF50633 is not set
++
++#
++# Multimedia devices
++#
++
++#
++# Multimedia core support
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
++# CONFIG_DAB is not set
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_DDC is not set
++# CONFIG_FB_BOOT_VESA_SUPPORT is not set
++CONFIG_FB_CFB_FILLRECT=y
++CONFIG_FB_CFB_COPYAREA=y
++CONFIG_FB_CFB_IMAGEBLIT=y
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
++# CONFIG_FB_SYS_FILLRECT is not set
++# CONFIG_FB_SYS_COPYAREA is not set
++# CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_SYS_FOPS is not set
++# CONFIG_FB_SVGALIB is not set
++# CONFIG_FB_MACMODES is not set
++# CONFIG_FB_BACKLIGHT is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++CONFIG_FB_IMX=y
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++# CONFIG_VGA_CONSOLE is not set
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE=y
++# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
++CONFIG_FONTS=y
++CONFIG_FONT_8x8=y
++# CONFIG_FONT_8x16 is not set
++# CONFIG_FONT_6x11 is not set
++# CONFIG_FONT_7x14 is not set
++# CONFIG_FONT_PEARL_8x8 is not set
++# CONFIG_FONT_ACORN_8x8 is not set
++# CONFIG_FONT_MINI_4x6 is not set
++# CONFIG_FONT_SUN8x16 is not set
++# CONFIG_FONT_SUN12x22 is not set
++# CONFIG_FONT_10x18 is not set
++CONFIG_LOGO=y
++CONFIG_LOGO_LINUX_MONO=y
++CONFIG_LOGO_LINUX_VGA16=y
++CONFIG_LOGO_LINUX_CLUT224=y
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++CONFIG_MMC=y
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_UNSAFE_RESUME is not set
++
++#
++# MMC/SD/SDIO Card Drivers
++#
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_BLOCK_BOUNCE=y
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_SDHCI is not set
++CONFIG_MMC_MXC=y
++# CONFIG_MMC_SPI is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_ACCESSIBILITY is not set
++# CONFIG_NEW_LEDS is not set
++CONFIG_RTC_LIB=y
++# CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_REGULATOR is not set
++# CONFIG_UIO is not set
++# CONFIG_STAGING is not set
++
++#
++# File systems
++#
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4_FS is not set
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++CONFIG_FILE_LOCKING=y
++# CONFIG_XFS_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++# CONFIG_DNOTIFY is not set
++# CONFIG_INOTIFY is not set
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++# CONFIG_VFAT_FS is not set
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# CONFIG_CONFIGFS_FS is not set
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_SQUASHFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++CONFIG_ROOT_NFS=y
++# CONFIG_NFSD is not set
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++# CONFIG_NLS_CODEPAGE_437 is not set
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++# CONFIG_NLS_ISO8859_1 is not set
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++# CONFIG_NLS_UTF8 is not set
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_KERNEL is not set
++# CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_RCU_CPU_STALL_DETECTOR is not set
++# CONFIG_LATENCYTOP is not set
++CONFIG_SYSCTL_SYSCALL_CHECK=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_TRACING_SUPPORT=y
++
++#
++# Tracers
++#
++# CONFIG_FUNCTION_TRACER is not set
++# CONFIG_IRQSOFF_TRACER is not set
++# CONFIG_PREEMPT_TRACER is not set
++# CONFIG_SCHED_TRACER is not set
++# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_EVENT_TRACER is not set
++# CONFIG_BOOT_TRACER is not set
++# CONFIG_TRACE_BRANCH_PROFILING is not set
++# CONFIG_STACK_TRACER is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_ARM_UNWIND=y
++# CONFIG_DEBUG_USER is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++# CONFIG_CRYPTO_FIPS is not set
++# CONFIG_CRYPTO_MANAGER is not set
++# CONFIG_CRYPTO_MANAGER2 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
++# CONFIG_CRYPTO_LZO is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_BINARY_PRINTF is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_T10DIF is not set
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/configs/mx31moboard_defconfig linux-2.6.30-rc4-git/arch/arm/configs/mx31moboard_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/mx31moboard_defconfig    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/configs/mx31moboard_defconfig        1970-01-01 01:00:00.000000000 +0100
+@@ -1,790 +0,0 @@
+-#
+-# Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.27-rc5
+-# Fri Oct 24 11:41:22 2008
+-#
+-CONFIG_ARM=y
+-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+-CONFIG_GENERIC_GPIO=y
+-CONFIG_GENERIC_TIME=y
+-CONFIG_GENERIC_CLOCKEVENTS=y
+-CONFIG_MMU=y
+-# CONFIG_NO_IOPORT is not set
+-CONFIG_GENERIC_HARDIRQS=y
+-CONFIG_STACKTRACE_SUPPORT=y
+-CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+-CONFIG_LOCKDEP_SUPPORT=y
+-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+-CONFIG_HARDIRQS_SW_RESEND=y
+-CONFIG_GENERIC_IRQ_PROBE=y
+-CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_GENERIC_HWEIGHT=y
+-CONFIG_GENERIC_CALIBRATE_DELAY=y
+-CONFIG_ARCH_SUPPORTS_AOUT=y
+-CONFIG_ZONE_DMA=y
+-CONFIG_ARCH_MTD_XIP=y
+-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+-CONFIG_VECTORS_BASE=0xffff0000
+-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+-
+-#
+-# General setup
+-#
+-CONFIG_EXPERIMENTAL=y
+-CONFIG_BROKEN_ON_SMP=y
+-CONFIG_LOCK_KERNEL=y
+-CONFIG_INIT_ENV_ARG_LIMIT=32
+-CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
+-CONFIG_SWAP=y
+-CONFIG_SYSVIPC=y
+-CONFIG_SYSVIPC_SYSCTL=y
+-# CONFIG_POSIX_MQUEUE is not set
+-# CONFIG_BSD_PROCESS_ACCT is not set
+-# CONFIG_TASKSTATS is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_IKCONFIG=y
+-CONFIG_IKCONFIG_PROC=y
+-CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_CGROUPS is not set
+-CONFIG_GROUP_SCHED=y
+-CONFIG_FAIR_GROUP_SCHED=y
+-# CONFIG_RT_GROUP_SCHED is not set
+-CONFIG_USER_SCHED=y
+-# CONFIG_CGROUP_SCHED is not set
+-CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+-# CONFIG_RELAY is not set
+-# CONFIG_NAMESPACES is not set
+-# CONFIG_BLK_DEV_INITRD is not set
+-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+-CONFIG_SYSCTL=y
+-CONFIG_EMBEDDED=y
+-CONFIG_UID16=y
+-CONFIG_SYSCTL_SYSCALL=y
+-CONFIG_KALLSYMS=y
+-# CONFIG_KALLSYMS_EXTRA_PASS is not set
+-CONFIG_HOTPLUG=y
+-CONFIG_PRINTK=y
+-CONFIG_BUG=y
+-CONFIG_ELF_CORE=y
+-CONFIG_COMPAT_BRK=y
+-CONFIG_BASE_FULL=y
+-CONFIG_FUTEX=y
+-CONFIG_ANON_INODES=y
+-CONFIG_EPOLL=y
+-CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+-CONFIG_EVENTFD=y
+-CONFIG_SHMEM=y
+-CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_SLAB=y
+-# CONFIG_SLUB is not set
+-# CONFIG_SLOB is not set
+-# CONFIG_PROFILING is not set
+-# CONFIG_MARKERS is not set
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_KPROBES is not set
+-# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
+-# CONFIG_HAVE_IOREMAP_PROT is not set
+-CONFIG_HAVE_KPROBES=y
+-CONFIG_HAVE_KRETPROBES=y
+-# CONFIG_HAVE_ARCH_TRACEHOOK is not set
+-# CONFIG_HAVE_DMA_ATTRS is not set
+-# CONFIG_USE_GENERIC_SMP_HELPERS is not set
+-# CONFIG_HAVE_CLK is not set
+-CONFIG_PROC_PAGE_MONITOR=y
+-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+-CONFIG_SLABINFO=y
+-CONFIG_RT_MUTEXES=y
+-# CONFIG_TINY_SHMEM is not set
+-CONFIG_BASE_SMALL=0
+-CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+-CONFIG_MODULE_UNLOAD=y
+-CONFIG_MODULE_FORCE_UNLOAD=y
+-CONFIG_MODVERSIONS=y
+-# CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_KMOD=y
+-CONFIG_BLOCK=y
+-# CONFIG_LBD is not set
+-# CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_LSF is not set
+-# CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-# CONFIG_DEFAULT_AS is not set
+-# CONFIG_DEFAULT_DEADLINE is not set
+-CONFIG_DEFAULT_CFQ=y
+-# CONFIG_DEFAULT_NOOP is not set
+-CONFIG_DEFAULT_IOSCHED="cfq"
+-CONFIG_CLASSIC_RCU=y
+-
+-#
+-# System Type
+-#
+-# CONFIG_ARCH_AAEC2000 is not set
+-# CONFIG_ARCH_INTEGRATOR is not set
+-# CONFIG_ARCH_REALVIEW is not set
+-# CONFIG_ARCH_VERSATILE is not set
+-# CONFIG_ARCH_AT91 is not set
+-# CONFIG_ARCH_CLPS7500 is not set
+-# CONFIG_ARCH_CLPS711X is not set
+-# CONFIG_ARCH_EBSA110 is not set
+-# CONFIG_ARCH_EP93XX is not set
+-# CONFIG_ARCH_FOOTBRIDGE is not set
+-# CONFIG_ARCH_NETX is not set
+-# CONFIG_ARCH_H720X is not set
+-# CONFIG_ARCH_IMX is not set
+-# CONFIG_ARCH_IOP13XX is not set
+-# CONFIG_ARCH_IOP32X is not set
+-# CONFIG_ARCH_IOP33X is not set
+-# CONFIG_ARCH_IXP23XX is not set
+-# CONFIG_ARCH_IXP2000 is not set
+-# CONFIG_ARCH_IXP4XX is not set
+-# CONFIG_ARCH_L7200 is not set
+-# CONFIG_ARCH_KIRKWOOD is not set
+-# CONFIG_ARCH_KS8695 is not set
+-# CONFIG_ARCH_NS9XXX is not set
+-# CONFIG_ARCH_LOKI is not set
+-# CONFIG_ARCH_MV78XX0 is not set
+-CONFIG_ARCH_MXC=y
+-# CONFIG_ARCH_ORION5X is not set
+-# CONFIG_ARCH_PNX4008 is not set
+-# CONFIG_ARCH_PXA is not set
+-# CONFIG_ARCH_RPC is not set
+-# CONFIG_ARCH_SA1100 is not set
+-# CONFIG_ARCH_S3C2410 is not set
+-# CONFIG_ARCH_SHARK is not set
+-# CONFIG_ARCH_LH7A40X is not set
+-# CONFIG_ARCH_DAVINCI is not set
+-# CONFIG_ARCH_OMAP is not set
+-# CONFIG_ARCH_MSM7X00A is not set
+-
+-#
+-# Boot options
+-#
+-
+-#
+-# Power management
+-#
+-
+-#
+-# Freescale MXC Implementations
+-#
+-# CONFIG_ARCH_MX2 is not set
+-CONFIG_ARCH_MX3=y
+-
+-#
+-# MX3 Options
+-#
+-# CONFIG_MACH_MX31ADS is not set
+-# CONFIG_MACH_PCM037 is not set
+-# CONFIG_MACH_MX31LITE is not set
+-CONFIG_MACH_MX31MOBOARD=y
+-# CONFIG_MXC_IRQ_PRIOR is not set
+-
+-#
+-# Processor Type
+-#
+-CONFIG_CPU_32=y
+-CONFIG_CPU_V6=y
+-# CONFIG_CPU_32v6K is not set
+-CONFIG_CPU_32v6=y
+-CONFIG_CPU_ABRT_EV6=y
+-CONFIG_CPU_PABRT_NOIFAR=y
+-CONFIG_CPU_CACHE_V6=y
+-CONFIG_CPU_CACHE_VIPT=y
+-CONFIG_CPU_COPY_V6=y
+-CONFIG_CPU_TLB_V6=y
+-CONFIG_CPU_HAS_ASID=y
+-CONFIG_CPU_CP15=y
+-CONFIG_CPU_CP15_MMU=y
+-
+-#
+-# Processor Features
+-#
+-CONFIG_ARM_THUMB=y
+-# CONFIG_CPU_ICACHE_DISABLE is not set
+-# CONFIG_CPU_DCACHE_DISABLE is not set
+-# CONFIG_CPU_BPREDICT_DISABLE is not set
+-# CONFIG_OUTER_CACHE is not set
+-
+-#
+-# Bus support
+-#
+-# CONFIG_PCI_SYSCALL is not set
+-# CONFIG_ARCH_SUPPORTS_MSI is not set
+-# CONFIG_PCCARD is not set
+-
+-#
+-# Kernel Features
+-#
+-CONFIG_TICK_ONESHOT=y
+-CONFIG_NO_HZ=y
+-CONFIG_HIGH_RES_TIMERS=y
+-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+-CONFIG_PREEMPT=y
+-CONFIG_HZ=100
+-CONFIG_AEABI=y
+-# CONFIG_OABI_COMPAT is not set
+-CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+-CONFIG_SELECT_MEMORY_MODEL=y
+-CONFIG_FLATMEM_MANUAL=y
+-# CONFIG_DISCONTIGMEM_MANUAL is not set
+-# CONFIG_SPARSEMEM_MANUAL is not set
+-CONFIG_FLATMEM=y
+-CONFIG_FLAT_NODE_MEM_MAP=y
+-# CONFIG_SPARSEMEM_STATIC is not set
+-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+-CONFIG_PAGEFLAGS_EXTENDED=y
+-CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_RESOURCES_64BIT is not set
+-CONFIG_ZONE_DMA_FLAG=1
+-CONFIG_BOUNCE=y
+-CONFIG_VIRT_TO_BUS=y
+-CONFIG_ALIGNMENT_TRAP=y
+-
+-#
+-# Boot options
+-#
+-CONFIG_ZBOOT_ROM_TEXT=0x0
+-CONFIG_ZBOOT_ROM_BSS=0x0
+-CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw ip=off"
+-# CONFIG_XIP_KERNEL is not set
+-# CONFIG_KEXEC is not set
+-
+-#
+-# Floating point emulation
+-#
+-
+-#
+-# At least one emulation must be selected
+-#
+-CONFIG_VFP=y
+-
+-#
+-# Userspace binary formats
+-#
+-CONFIG_BINFMT_ELF=y
+-# CONFIG_BINFMT_AOUT is not set
+-# CONFIG_BINFMT_MISC is not set
+-
+-#
+-# Power management options
+-#
+-# CONFIG_PM is not set
+-CONFIG_ARCH_SUSPEND_POSSIBLE=y
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-# CONFIG_IP_MULTICAST is not set
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_FIB_HASH=y
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-# CONFIG_IP_PNP_BOOTP is not set
+-# CONFIG_IP_PNP_RARP is not set
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_ARPD is not set
+-# CONFIG_SYN_COOKIES is not set
+-# CONFIG_INET_AH is not set
+-# CONFIG_INET_ESP is not set
+-# CONFIG_INET_IPCOMP is not set
+-# CONFIG_INET_XFRM_TUNNEL is not set
+-# CONFIG_INET_TUNNEL is not set
+-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+-# CONFIG_INET_XFRM_MODE_BEET is not set
+-# CONFIG_INET_LRO is not set
+-# CONFIG_INET_DIAG is not set
+-# CONFIG_TCP_CONG_ADVANCED is not set
+-CONFIG_TCP_CONG_CUBIC=y
+-CONFIG_DEFAULT_TCP_CONG="cubic"
+-# CONFIG_TCP_MD5SIG is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETWORK_SECMARK is not set
+-# CONFIG_NETFILTER is not set
+-# CONFIG_IP_DCCP is not set
+-# CONFIG_IP_SCTP is not set
+-# CONFIG_TIPC is not set
+-# CONFIG_ATM is not set
+-# CONFIG_BRIDGE is not set
+-# CONFIG_VLAN_8021Q is not set
+-# CONFIG_DECNET is not set
+-# CONFIG_LLC2 is not set
+-# CONFIG_IPX is not set
+-# CONFIG_ATALK is not set
+-# CONFIG_X25 is not set
+-# CONFIG_LAPB is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-# CONFIG_NET_SCHED is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+-# CONFIG_AF_RXRPC is not set
+-
+-#
+-# Wireless
+-#
+-# CONFIG_CFG80211 is not set
+-# CONFIG_WIRELESS_EXT is not set
+-# CONFIG_MAC80211 is not set
+-# CONFIG_IEEE80211 is not set
+-# CONFIG_RFKILL is not set
+-# CONFIG_NET_9P is not set
+-
+-#
+-# Device Drivers
+-#
+-
+-#
+-# Generic Driver Options
+-#
+-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+-CONFIG_STANDALONE=y
+-CONFIG_PREVENT_FIRMWARE_BUILD=y
+-CONFIG_FW_LOADER=m
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+-# CONFIG_SYS_HYPERVISOR is not set
+-# CONFIG_CONNECTOR is not set
+-CONFIG_MTD=y
+-# CONFIG_MTD_DEBUG is not set
+-# CONFIG_MTD_CONCAT is not set
+-CONFIG_MTD_PARTITIONS=y
+-CONFIG_MTD_REDBOOT_PARTS=y
+-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+-CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+-# CONFIG_MTD_CMDLINE_PARTS is not set
+-# CONFIG_MTD_AFS_PARTS is not set
+-# CONFIG_MTD_AR7_PARTS is not set
+-
+-#
+-# User Modules And Translation Layers
+-#
+-CONFIG_MTD_CHAR=y
+-CONFIG_MTD_BLKDEVS=y
+-CONFIG_MTD_BLOCK=y
+-# CONFIG_FTL is not set
+-# CONFIG_NFTL is not set
+-# CONFIG_INFTL is not set
+-# CONFIG_RFD_FTL is not set
+-# CONFIG_SSFDC is not set
+-# CONFIG_MTD_OOPS is not set
+-
+-#
+-# RAM/ROM/Flash chip drivers
+-#
+-CONFIG_MTD_CFI=y
+-# CONFIG_MTD_JEDECPROBE is not set
+-CONFIG_MTD_GEN_PROBE=y
+-CONFIG_MTD_CFI_ADV_OPTIONS=y
+-CONFIG_MTD_CFI_NOSWAP=y
+-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+-CONFIG_MTD_CFI_GEOMETRY=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
+-CONFIG_MTD_MAP_BANK_WIDTH_2=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+-CONFIG_MTD_CFI_I1=y
+-# CONFIG_MTD_CFI_I2 is not set
+-# CONFIG_MTD_CFI_I4 is not set
+-# CONFIG_MTD_CFI_I8 is not set
+-# CONFIG_MTD_OTP is not set
+-# CONFIG_MTD_CFI_INTELEXT is not set
+-CONFIG_MTD_CFI_AMDSTD=y
+-# CONFIG_MTD_CFI_STAA is not set
+-CONFIG_MTD_CFI_UTIL=y
+-# CONFIG_MTD_RAM is not set
+-# CONFIG_MTD_ROM is not set
+-# CONFIG_MTD_ABSENT is not set
+-# CONFIG_MTD_XIP is not set
+-
+-#
+-# Mapping drivers for chip access
+-#
+-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-CONFIG_MTD_PHYSMAP=y
+-CONFIG_MTD_PHYSMAP_START=0x0
+-CONFIG_MTD_PHYSMAP_LEN=0x0
+-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+-# CONFIG_MTD_ARM_INTEGRATOR is not set
+-# CONFIG_MTD_PLATRAM is not set
+-
+-#
+-# Self-contained MTD device drivers
+-#
+-# CONFIG_MTD_SLRAM is not set
+-# CONFIG_MTD_PHRAM is not set
+-# CONFIG_MTD_MTDRAM is not set
+-# CONFIG_MTD_BLOCK2MTD is not set
+-
+-#
+-# Disk-On-Chip Device Drivers
+-#
+-# CONFIG_MTD_DOC2000 is not set
+-# CONFIG_MTD_DOC2001 is not set
+-# CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
+-# CONFIG_MTD_ONENAND is not set
+-
+-#
+-# UBI - Unsorted block images
+-#
+-# CONFIG_MTD_UBI is not set
+-# CONFIG_PARPORT is not set
+-# CONFIG_BLK_DEV is not set
+-# CONFIG_MISC_DEVICES is not set
+-CONFIG_HAVE_IDE=y
+-# CONFIG_IDE is not set
+-
+-#
+-# SCSI device support
+-#
+-# CONFIG_RAID_ATTRS is not set
+-# CONFIG_SCSI is not set
+-# CONFIG_SCSI_DMA is not set
+-# CONFIG_SCSI_NETLINK is not set
+-# CONFIG_ATA is not set
+-# CONFIG_MD is not set
+-CONFIG_NETDEVICES=y
+-# CONFIG_DUMMY is not set
+-# CONFIG_BONDING is not set
+-# CONFIG_MACVLAN is not set
+-# CONFIG_EQUALIZER is not set
+-# CONFIG_TUN is not set
+-# CONFIG_VETH is not set
+-# CONFIG_PHYLIB is not set
+-CONFIG_NET_ETHERNET=y
+-CONFIG_MII=y
+-# CONFIG_AX88796 is not set
+-CONFIG_SMC91X=y
+-# CONFIG_DM9000 is not set
+-# CONFIG_IBM_NEW_EMAC_ZMII is not set
+-# CONFIG_IBM_NEW_EMAC_RGMII is not set
+-# CONFIG_IBM_NEW_EMAC_TAH is not set
+-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_B44 is not set
+-# CONFIG_NETDEV_1000 is not set
+-# CONFIG_NETDEV_10000 is not set
+-
+-#
+-# Wireless LAN
+-#
+-# CONFIG_WLAN_PRE80211 is not set
+-# CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-# CONFIG_WAN is not set
+-# CONFIG_PPP is not set
+-# CONFIG_SLIP is not set
+-# CONFIG_NETCONSOLE is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_ISDN is not set
+-
+-#
+-# Input device support
+-#
+-# CONFIG_INPUT is not set
+-
+-#
+-# Hardware I/O ports
+-#
+-# CONFIG_SERIO is not set
+-# CONFIG_GAMEPORT is not set
+-
+-#
+-# Character devices
+-#
+-# CONFIG_VT is not set
+-CONFIG_DEVKMEM=y
+-# CONFIG_SERIAL_NONSTANDARD is not set
+-
+-#
+-# Serial drivers
+-#
+-# CONFIG_SERIAL_8250 is not set
+-
+-#
+-# Non-8250 serial port support
+-#
+-CONFIG_SERIAL_IMX=y
+-CONFIG_SERIAL_IMX_CONSOLE=y
+-CONFIG_SERIAL_CORE=y
+-CONFIG_SERIAL_CORE_CONSOLE=y
+-CONFIG_UNIX98_PTYS=y
+-# CONFIG_LEGACY_PTYS is not set
+-# CONFIG_IPMI_HANDLER is not set
+-# CONFIG_HW_RANDOM is not set
+-# CONFIG_NVRAM is not set
+-# CONFIG_R3964 is not set
+-# CONFIG_RAW_DRIVER is not set
+-# CONFIG_TCG_TPM is not set
+-# CONFIG_I2C is not set
+-# CONFIG_SPI is not set
+-CONFIG_ARCH_REQUIRE_GPIOLIB=y
+-CONFIG_GPIOLIB=y
+-# CONFIG_GPIO_SYSFS is not set
+-
+-#
+-# I2C GPIO expanders:
+-#
+-
+-#
+-# PCI GPIO expanders:
+-#
+-
+-#
+-# SPI GPIO expanders:
+-#
+-# CONFIG_W1 is not set
+-# CONFIG_POWER_SUPPLY is not set
+-# CONFIG_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-
+-#
+-# Sonics Silicon Backplane
+-#
+-CONFIG_SSB_POSSIBLE=y
+-# CONFIG_SSB is not set
+-
+-#
+-# Multifunction device drivers
+-#
+-# CONFIG_MFD_CORE is not set
+-# CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_EGPIO is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_MFD_T7L66XB is not set
+-# CONFIG_MFD_TC6387XB is not set
+-# CONFIG_MFD_TC6393XB is not set
+-
+-#
+-# Multimedia devices
+-#
+-
+-#
+-# Multimedia core support
+-#
+-# CONFIG_VIDEO_DEV is not set
+-# CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+-# CONFIG_DAB is not set
+-
+-#
+-# Graphics support
+-#
+-# CONFIG_VGASTATE is not set
+-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+-# CONFIG_FB is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+-# CONFIG_SOUND is not set
+-# CONFIG_USB_SUPPORT is not set
+-# CONFIG_MMC is not set
+-# CONFIG_NEW_LEDS is not set
+-CONFIG_RTC_LIB=y
+-# CONFIG_RTC_CLASS is not set
+-# CONFIG_DMADEVICES is not set
+-
+-#
+-# Voltage and Current regulators
+-#
+-# CONFIG_REGULATOR is not set
+-# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+-# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+-# CONFIG_REGULATOR_BQ24022 is not set
+-# CONFIG_UIO is not set
+-
+-#
+-# File systems
+-#
+-# CONFIG_EXT2_FS is not set
+-# CONFIG_EXT3_FS is not set
+-# CONFIG_EXT4DEV_FS is not set
+-# CONFIG_REISERFS_FS is not set
+-# CONFIG_JFS_FS is not set
+-# CONFIG_FS_POSIX_ACL is not set
+-# CONFIG_XFS_FS is not set
+-# CONFIG_OCFS2_FS is not set
+-# CONFIG_DNOTIFY is not set
+-CONFIG_INOTIFY=y
+-CONFIG_INOTIFY_USER=y
+-# CONFIG_QUOTA is not set
+-# CONFIG_AUTOFS_FS is not set
+-# CONFIG_AUTOFS4_FS is not set
+-# CONFIG_FUSE_FS is not set
+-
+-#
+-# CD-ROM/DVD Filesystems
+-#
+-# CONFIG_ISO9660_FS is not set
+-# CONFIG_UDF_FS is not set
+-
+-#
+-# DOS/FAT/NT Filesystems
+-#
+-# CONFIG_MSDOS_FS is not set
+-# CONFIG_VFAT_FS is not set
+-# CONFIG_NTFS_FS is not set
+-
+-#
+-# Pseudo filesystems
+-#
+-CONFIG_PROC_FS=y
+-CONFIG_PROC_SYSCTL=y
+-CONFIG_SYSFS=y
+-CONFIG_TMPFS=y
+-# CONFIG_TMPFS_POSIX_ACL is not set
+-# CONFIG_HUGETLB_PAGE is not set
+-# CONFIG_CONFIGFS_FS is not set
+-
+-#
+-# Miscellaneous filesystems
+-#
+-# CONFIG_ADFS_FS is not set
+-# CONFIG_AFFS_FS is not set
+-# CONFIG_HFS_FS is not set
+-# CONFIG_HFSPLUS_FS is not set
+-# CONFIG_BEFS_FS is not set
+-# CONFIG_BFS_FS is not set
+-# CONFIG_EFS_FS is not set
+-CONFIG_JFFS2_FS=y
+-CONFIG_JFFS2_FS_DEBUG=0
+-CONFIG_JFFS2_FS_WRITEBUFFER=y
+-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+-# CONFIG_JFFS2_SUMMARY is not set
+-# CONFIG_JFFS2_FS_XATTR is not set
+-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+-CONFIG_JFFS2_ZLIB=y
+-# CONFIG_JFFS2_LZO is not set
+-CONFIG_JFFS2_RTIME=y
+-# CONFIG_JFFS2_RUBIN is not set
+-# CONFIG_CRAMFS is not set
+-# CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+-# CONFIG_HPFS_FS is not set
+-# CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+-# CONFIG_SYSV_FS is not set
+-# CONFIG_UFS_FS is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
+-CONFIG_NFS_FS=y
+-# CONFIG_NFS_V3 is not set
+-# CONFIG_NFS_V4 is not set
+-CONFIG_ROOT_NFS=y
+-# CONFIG_NFSD is not set
+-CONFIG_LOCKD=y
+-CONFIG_NFS_COMMON=y
+-CONFIG_SUNRPC=y
+-# CONFIG_RPCSEC_GSS_KRB5 is not set
+-# CONFIG_RPCSEC_GSS_SPKM3 is not set
+-# CONFIG_SMB_FS is not set
+-# CONFIG_CIFS is not set
+-# CONFIG_NCP_FS is not set
+-# CONFIG_CODA_FS is not set
+-# CONFIG_AFS_FS is not set
+-
+-#
+-# Partition Types
+-#
+-# CONFIG_PARTITION_ADVANCED is not set
+-CONFIG_MSDOS_PARTITION=y
+-# CONFIG_NLS is not set
+-# CONFIG_DLM is not set
+-
+-#
+-# Kernel hacking
+-#
+-# CONFIG_PRINTK_TIME is not set
+-# CONFIG_ENABLE_WARN_DEPRECATED is not set
+-# CONFIG_ENABLE_MUST_CHECK is not set
+-CONFIG_FRAME_WARN=1024
+-# CONFIG_MAGIC_SYSRQ is not set
+-# CONFIG_UNUSED_SYMBOLS is not set
+-# CONFIG_DEBUG_FS is not set
+-# CONFIG_HEADERS_CHECK is not set
+-# CONFIG_DEBUG_KERNEL is not set
+-# CONFIG_DEBUG_BUGVERBOSE is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+-CONFIG_FRAME_POINTER=y
+-# CONFIG_LATENCYTOP is not set
+-CONFIG_SYSCTL_SYSCALL_CHECK=y
+-CONFIG_HAVE_FTRACE=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-# CONFIG_FTRACE is not set
+-# CONFIG_IRQSOFF_TRACER is not set
+-# CONFIG_PREEMPT_TRACER is not set
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_SAMPLES is not set
+-CONFIG_HAVE_ARCH_KGDB=y
+-# CONFIG_DEBUG_USER is not set
+-
+-#
+-# Security options
+-#
+-# CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+-# CONFIG_CRYPTO is not set
+-
+-#
+-# Library routines
+-#
+-CONFIG_BITREVERSE=y
+-# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+-# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+-# CONFIG_CRC_CCITT is not set
+-# CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+-# CONFIG_CRC_ITU_T is not set
+-CONFIG_CRC32=y
+-# CONFIG_CRC7 is not set
+-# CONFIG_LIBCRC32C is not set
+-CONFIG_ZLIB_INFLATE=y
+-CONFIG_ZLIB_DEFLATE=y
+-CONFIG_PLIST=y
+-CONFIG_HAS_IOMEM=y
+-CONFIG_HAS_IOPORT=y
+-CONFIG_HAS_DMA=y
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/configs/mx3_defconfig linux-2.6.30-rc4-git/arch/arm/configs/mx3_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/mx3_defconfig    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/configs/mx3_defconfig        2009-05-13 09:46:19.000000000 +0200
+@@ -197,7 +197,7 @@ CONFIG_MXC_PWM=y
+ #
+ CONFIG_CPU_32=y
+ CONFIG_CPU_V6=y
+-CONFIG_CPU_32v6K=y
++# CONFIG_CPU_32v6K is not set
+ CONFIG_CPU_32v6=y
+ CONFIG_CPU_ABRT_EV6=y
+ CONFIG_CPU_PABRT_NOIFAR=y
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/configs/viper_defconfig linux-2.6.30-rc4-git/arch/arm/configs/viper_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/viper_defconfig  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/configs/viper_defconfig      2009-05-13 09:46:19.000000000 +0200
+@@ -298,7 +298,6 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+ CONFIG_CPU_FREQ_GOV_USERSPACE=m
+ CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+-CONFIG_CPU_FREQ_PXA=y
+ #
+ # Floating point emulation
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/Kconfig linux-2.6.30-rc4-git/arch/arm/Kconfig
+--- linux-2.6.30-rc4/arch/arm/Kconfig  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/Kconfig      2009-05-13 09:46:19.000000000 +0200
+@@ -308,15 +308,6 @@ config ARCH_H720X
+       help
+         This enables support for systems based on the Hynix HMS720x
+-config ARCH_IMX
+-      bool "IMX"
+-      select CPU_ARM920T
+-      select GENERIC_GPIO
+-      select GENERIC_TIME
+-      select GENERIC_CLOCKEVENTS
+-      help
+-        Support for Motorola's i.MX family of processors (MX1, MXL).
+-
+ config ARCH_IOP13XX
+       bool "IOP13xx-based"
+       depends on MMU
+@@ -454,6 +445,7 @@ config ARCH_MXC
+       select ARCH_MTD_XIP
+       select GENERIC_GPIO
+       select ARCH_REQUIRE_GPIOLIB
++      select HAVE_CLK
+       help
+         Support for Freescale MXC/iMX-based family of processors
+@@ -486,8 +478,6 @@ config ARCH_PXA
+       select HAVE_CLK
+       select COMMON_CLKDEV
+       select ARCH_REQUIRE_GPIOLIB
+-      select HAVE_CLK
+-      select COMMON_CLKDEV
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
+       select TICK_ONESHOT
+@@ -585,6 +575,8 @@ config ARCH_DAVINCI
+       select ARCH_REQUIRE_GPIOLIB
+       select HAVE_CLK
+       select ZONE_DMA
++      select HAVE_IDE
++      select COMMON_CLKDEV
+       help
+         Support for TI's DaVinci platform.
+@@ -681,8 +673,6 @@ endif
+ source "arch/arm/mach-lh7a40x/Kconfig"
+-source "arch/arm/mach-imx/Kconfig"
+-
+ source "arch/arm/mach-h720x/Kconfig"
+ source "arch/arm/mach-versatile/Kconfig"
+@@ -740,6 +730,56 @@ if !MMU
+ source "arch/arm/Kconfig-nommu"
+ endif
++config ARM_ERRATA_411920
++      bool "ARM errata: Invalidation of the Instruction Cache operation can fail"
++      depends on CPU_V6 && !SMP
++      help
++        Invalidation of the Instruction Cache operation can
++        fail. This erratum is present in 1136 (before r1p4), 1156 and 1176.
++        It does not affect the MPCore. This option enables the ARM Ltd.
++        recommended workaround.
++
++config ARM_ERRATA_430973
++      bool "ARM errata: Stale prediction on replaced interworking branch"
++      depends on CPU_V7
++      help
++        This option enables the workaround for the 430973 Cortex-A8
++        (r1p0..r1p2) erratum. If a code sequence containing an ARM/Thumb
++        interworking branch is replaced with another code sequence at the
++        same virtual address, whether due to self-modifying code or virtual
++        to physical address re-mapping, Cortex-A8 does not recover from the
++        stale interworking branch prediction. This results in Cortex-A8
++        executing the new code sequence in the incorrect ARM or Thumb state.
++        The workaround enables the BTB/BTAC operations by setting ACTLR.IBE
++        and also flushes the branch target cache at every context switch.
++        Note that setting specific bits in the ACTLR register may not be
++        available in non-secure mode.
++
++config ARM_ERRATA_458693
++      bool "ARM errata: Processor deadlock when a false hazard is created"
++      depends on CPU_V7
++      help
++        This option enables the workaround for the 458693 Cortex-A8 (r2p0)
++        erratum. For very specific sequences of memory operations, it is
++        possible for a hazard condition intended for a cache line to instead
++        be incorrectly associated with a different cache line. This false
++        hazard might then cause a processor deadlock. The workaround enables
++        the L1 caching of the NEON accesses and disables the PLD instruction
++        in the ACTLR register. Note that setting specific bits in the ACTLR
++        register may not be available in non-secure mode.
++
++config ARM_ERRATA_460075
++      bool "ARM errata: Data written to the L2 cache can be overwritten with stale data"
++      depends on CPU_V7
++      help
++        This option enables the workaround for the 460075 Cortex-A8 (r2p0)
++        erratum. Any asynchronous access to the L2 cache may encounter a
++        situation in which recent store transactions to the L2 cache are lost
++        and overwritten with stale memory contents from external memory. The
++        workaround disables the write-allocate mode for the L2 cache via the
++        ACTLR register. Note that setting specific bits in the ACTLR register
++        may not be available in non-secure mode.
++
+ endmenu
+ source "arch/arm/common/Kconfig"
+@@ -971,7 +1011,7 @@ source "mm/Kconfig"
+ config LEDS
+       bool "Timer and CPU usage LEDs"
+       depends on ARCH_CDB89712 || ARCH_EBSA110 || \
+-                 ARCH_EBSA285 || ARCH_IMX || ARCH_INTEGRATOR || \
++                 ARCH_EBSA285 || ARCH_INTEGRATOR || \
+                  ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
+                  ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
+                  ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
+@@ -1137,7 +1177,7 @@ endmenu
+ menu "CPU Power Management"
+-if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA)
++if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_PXA)
+ source "drivers/cpufreq/Kconfig"
+@@ -1162,15 +1202,6 @@ config CPU_FREQ_INTEGRATOR
+         If in doubt, say Y.
+-config CPU_FREQ_IMX
+-      tristate "CPUfreq driver for i.MX CPUs"
+-      depends on ARCH_IMX && CPU_FREQ
+-      default n
+-      help
+-        This enables the CPUfreq driver for i.MX CPUs.
+-
+-        If in doubt, say N.
+-
+ config CPU_FREQ_PXA
+       bool
+       depends on CPU_FREQ && ARCH_PXA && PXA25x
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/board-dm644x-evm.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/board-dm644x-evm.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/board-dm644x-evm.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/board-dm644x-evm.c      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,696 @@
++/*
++ * TI DaVinci EVM board support
++ *
++ * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
++ *
++ * 2007 (c) MontaVista Software, Inc. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ */
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/dma-mapping.h>
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++#include <linux/leds.h>
++#include <linux/memory.h>
++#include <linux/etherdevice.h>
++
++#include <linux/i2c.h>
++#include <linux/i2c/pcf857x.h>
++#include <linux/i2c/at24.h>
++
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/nand.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/physmap.h>
++#include <linux/io.h>
++#include <linux/phy.h>
++#include <linux/clk.h>
++
++#include <asm/setup.h>
++#include <asm/mach-types.h>
++
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/mach/flash.h>
++
++#include <mach/dm644x.h>
++#include <mach/common.h>
++#include <mach/i2c.h>
++#include <mach/serial.h>
++#include <mach/mux.h>
++#include <mach/psc.h>
++#include <mach/nand.h>
++
++#define DM644X_EVM_PHY_MASK           (0x2)
++#define DM644X_EVM_MDIO_FREQUENCY     (2200000) /* PHY bus frequency */
++
++#define DAVINCI_CFC_ATA_BASE            0x01C66000
++
++#define DAVINCI_ASYNC_EMIF_CONTROL_BASE   0x01e00000
++#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE  0x02000000
++#define DAVINCI_ASYNC_EMIF_DATA_CE1_BASE  0x04000000
++#define DAVINCI_ASYNC_EMIF_DATA_CE2_BASE  0x06000000
++#define DAVINCI_ASYNC_EMIF_DATA_CE3_BASE  0x08000000
++
++#define LXT971_PHY_ID (0x001378e2)
++#define LXT971_PHY_MASK       (0xfffffff0)
++
++static struct mtd_partition davinci_evm_norflash_partitions[] = {
++      /* bootloader (UBL, U-Boot, etc) in first 5 sectors */
++      {
++              .name           = "bootloader",
++              .offset         = 0,
++              .size           = 5 * SZ_64K,
++              .mask_flags     = MTD_WRITEABLE, /* force read-only */
++      },
++      /* bootloader params in the next 1 sectors */
++      {
++              .name           = "params",
++              .offset         = MTDPART_OFS_APPEND,
++              .size           = SZ_64K,
++              .mask_flags     = 0,
++      },
++      /* kernel */
++      {
++              .name           = "kernel",
++              .offset         = MTDPART_OFS_APPEND,
++              .size           = SZ_2M,
++              .mask_flags     = 0
++      },
++      /* file system */
++      {
++              .name           = "filesystem",
++              .offset         = MTDPART_OFS_APPEND,
++              .size           = MTDPART_SIZ_FULL,
++              .mask_flags     = 0
++      }
++};
++
++static struct physmap_flash_data davinci_evm_norflash_data = {
++      .width          = 2,
++      .parts          = davinci_evm_norflash_partitions,
++      .nr_parts       = ARRAY_SIZE(davinci_evm_norflash_partitions),
++};
++
++/* NOTE: CFI probe will correctly detect flash part as 32M, but EMIF
++ * limits addresses to 16M, so using addresses past 16M will wrap */
++static struct resource davinci_evm_norflash_resource = {
++      .start          = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE,
++      .end            = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1,
++      .flags          = IORESOURCE_MEM,
++};
++
++static struct platform_device davinci_evm_norflash_device = {
++      .name           = "physmap-flash",
++      .id             = 0,
++      .dev            = {
++              .platform_data  = &davinci_evm_norflash_data,
++      },
++      .num_resources  = 1,
++      .resource       = &davinci_evm_norflash_resource,
++};
++
++/* DM644x EVM includes a 64 MByte small-page NAND flash (16K blocks).
++ * It may used instead of the (default) NOR chip to boot, using TI's
++ * tools to install the secondary boot loader (UBL) and U-Boot.
++ */
++struct mtd_partition davinci_evm_nandflash_partition[] = {
++      /* Bootloader layout depends on whose u-boot is installed, but we
++       * can hide all the details.
++       *  - block 0 for u-boot environment ... in mainline u-boot
++       *  - block 1 for UBL (plus up to four backup copies in blocks 2..5)
++       *  - blocks 6...? for u-boot
++       *  - blocks 16..23 for u-boot environment ... in TI's u-boot
++       */
++      {
++              .name           = "bootloader",
++              .offset         = 0,
++              .size           = SZ_256K + SZ_128K,
++              .mask_flags     = MTD_WRITEABLE,        /* force read-only */
++      },
++      /* Kernel */
++      {
++              .name           = "kernel",
++              .offset         = MTDPART_OFS_APPEND,
++              .size           = SZ_4M,
++              .mask_flags     = 0,
++      },
++      /* File system (older GIT kernels started this on the 5MB mark) */
++      {
++              .name           = "filesystem",
++              .offset         = MTDPART_OFS_APPEND,
++              .size           = MTDPART_SIZ_FULL,
++              .mask_flags     = 0,
++      }
++      /* A few blocks at end hold a flash BBT ... created by TI's CCS
++       * using flashwriter_nand.out, but ignored by TI's versions of
++       * Linux and u-boot.  We boot faster by using them.
++       */
++};
++
++static struct davinci_nand_pdata davinci_evm_nandflash_data = {
++      .parts          = davinci_evm_nandflash_partition,
++      .nr_parts       = ARRAY_SIZE(davinci_evm_nandflash_partition),
++      .ecc_mode       = NAND_ECC_HW,
++      .options        = NAND_USE_FLASH_BBT,
++};
++
++static struct resource davinci_evm_nandflash_resource[] = {
++      {
++              .start          = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE,
++              .end            = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1,
++              .flags          = IORESOURCE_MEM,
++      }, {
++              .start          = DAVINCI_ASYNC_EMIF_CONTROL_BASE,
++              .end            = DAVINCI_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1,
++              .flags          = IORESOURCE_MEM,
++      },
++};
++
++static struct platform_device davinci_evm_nandflash_device = {
++      .name           = "davinci_nand",
++      .id             = 0,
++      .dev            = {
++              .platform_data  = &davinci_evm_nandflash_data,
++      },
++      .num_resources  = ARRAY_SIZE(davinci_evm_nandflash_resource),
++      .resource       = davinci_evm_nandflash_resource,
++};
++
++static u64 davinci_fb_dma_mask = DMA_BIT_MASK(32);
++
++static struct platform_device davinci_fb_device = {
++      .name           = "davincifb",
++      .id             = -1,
++      .dev = {
++              .dma_mask               = &davinci_fb_dma_mask,
++              .coherent_dma_mask      = DMA_BIT_MASK(32),
++      },
++      .num_resources = 0,
++};
++
++static struct platform_device rtc_dev = {
++      .name           = "rtc_davinci_evm",
++      .id             = -1,
++};
++
++static struct resource ide_resources[] = {
++      {
++              .start          = DAVINCI_CFC_ATA_BASE,
++              .end            = DAVINCI_CFC_ATA_BASE + 0x7ff,
++              .flags          = IORESOURCE_MEM,
++      },
++      {
++              .start          = IRQ_IDE,
++              .end            = IRQ_IDE,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static u64 ide_dma_mask = DMA_32BIT_MASK;
++
++static struct platform_device ide_dev = {
++      .name           = "palm_bk3710",
++      .id             = -1,
++      .resource       = ide_resources,
++      .num_resources  = ARRAY_SIZE(ide_resources),
++      .dev = {
++              .dma_mask               = &ide_dma_mask,
++              .coherent_dma_mask      = DMA_32BIT_MASK,
++      },
++};
++
++/*----------------------------------------------------------------------*/
++
++/*
++ * I2C GPIO expanders
++ */
++
++#define PCF_Uxx_BASE(x)       (DAVINCI_N_GPIO + ((x) * 8))
++
++
++/* U2 -- LEDs */
++
++static struct gpio_led evm_leds[] = {
++      { .name = "DS8", .active_low = 1,
++              .default_trigger = "heartbeat", },
++      { .name = "DS7", .active_low = 1, },
++      { .name = "DS6", .active_low = 1, },
++      { .name = "DS5", .active_low = 1, },
++      { .name = "DS4", .active_low = 1, },
++      { .name = "DS3", .active_low = 1, },
++      { .name = "DS2", .active_low = 1,
++              .default_trigger = "mmc0", },
++      { .name = "DS1", .active_low = 1,
++              .default_trigger = "ide-disk", },
++};
++
++static const struct gpio_led_platform_data evm_led_data = {
++      .num_leds       = ARRAY_SIZE(evm_leds),
++      .leds           = evm_leds,
++};
++
++static struct platform_device *evm_led_dev;
++
++static int
++evm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      struct gpio_led *leds = evm_leds;
++      int status;
++
++      while (ngpio--) {
++              leds->gpio = gpio++;
++              leds++;
++      }
++
++      /* what an extremely annoying way to be forced to handle
++       * device unregistration ...
++       */
++      evm_led_dev = platform_device_alloc("leds-gpio", 0);
++      platform_device_add_data(evm_led_dev,
++                      &evm_led_data, sizeof evm_led_data);
++
++      evm_led_dev->dev.parent = &client->dev;
++      status = platform_device_add(evm_led_dev);
++      if (status < 0) {
++              platform_device_put(evm_led_dev);
++              evm_led_dev = NULL;
++      }
++      return status;
++}
++
++static int
++evm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      if (evm_led_dev) {
++              platform_device_unregister(evm_led_dev);
++              evm_led_dev = NULL;
++      }
++      return 0;
++}
++
++static struct pcf857x_platform_data pcf_data_u2 = {
++      .gpio_base      = PCF_Uxx_BASE(0),
++      .setup          = evm_led_setup,
++      .teardown       = evm_led_teardown,
++};
++
++
++/* U18 - A/V clock generator and user switch */
++
++static int sw_gpio;
++
++static ssize_t
++sw_show(struct device *d, struct device_attribute *a, char *buf)
++{
++      char *s = gpio_get_value_cansleep(sw_gpio) ? "on\n" : "off\n";
++
++      strcpy(buf, s);
++      return strlen(s);
++}
++
++static DEVICE_ATTR(user_sw, S_IRUGO, sw_show, NULL);
++
++static int
++evm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      int     status;
++
++      /* export dip switch option */
++      sw_gpio = gpio + 7;
++      status = gpio_request(sw_gpio, "user_sw");
++      if (status == 0)
++              status = gpio_direction_input(sw_gpio);
++      if (status == 0)
++              status = device_create_file(&client->dev, &dev_attr_user_sw);
++      else
++              gpio_free(sw_gpio);
++      if (status != 0)
++              sw_gpio = -EINVAL;
++
++      /* audio PLL:  48 kHz (vs 44.1 or 32), single rate (vs double) */
++      gpio_request(gpio + 3, "pll_fs2");
++      gpio_direction_output(gpio + 3, 0);
++
++      gpio_request(gpio + 2, "pll_fs1");
++      gpio_direction_output(gpio + 2, 0);
++
++      gpio_request(gpio + 1, "pll_sr");
++      gpio_direction_output(gpio + 1, 0);
++
++      return 0;
++}
++
++static int
++evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      gpio_free(gpio + 1);
++      gpio_free(gpio + 2);
++      gpio_free(gpio + 3);
++
++      if (sw_gpio > 0) {
++              device_remove_file(&client->dev, &dev_attr_user_sw);
++              gpio_free(sw_gpio);
++      }
++      return 0;
++}
++
++static struct pcf857x_platform_data pcf_data_u18 = {
++      .gpio_base      = PCF_Uxx_BASE(1),
++      .n_latch        = (1 << 3) | (1 << 2) | (1 << 1),
++      .setup          = evm_u18_setup,
++      .teardown       = evm_u18_teardown,
++};
++
++
++/* U35 - various I/O signals used to manage USB, CF, ATA, etc */
++
++static int
++evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      /* p0 = nDRV_VBUS (initial:  don't supply it) */
++      gpio_request(gpio + 0, "nDRV_VBUS");
++      gpio_direction_output(gpio + 0, 1);
++
++      /* p1 = VDDIMX_EN */
++      gpio_request(gpio + 1, "VDDIMX_EN");
++      gpio_direction_output(gpio + 1, 1);
++
++      /* p2 = VLYNQ_EN */
++      gpio_request(gpio + 2, "VLYNQ_EN");
++      gpio_direction_output(gpio + 2, 1);
++
++      /* p3 = n3V3_CF_RESET (initial: stay in reset) */
++      gpio_request(gpio + 3, "nCF_RESET");
++      gpio_direction_output(gpio + 3, 0);
++
++      /* (p4 unused) */
++
++      /* p5 = 1V8_WLAN_RESET (initial: stay in reset) */
++      gpio_request(gpio + 5, "WLAN_RESET");
++      gpio_direction_output(gpio + 5, 1);
++
++      /* p6 = nATA_SEL (initial: select) */
++      gpio_request(gpio + 6, "nATA_SEL");
++      gpio_direction_output(gpio + 6, 0);
++
++      /* p7 = nCF_SEL (initial: deselect) */
++      gpio_request(gpio + 7, "nCF_SEL");
++      gpio_direction_output(gpio + 7, 1);
++
++      /* irlml6401 switches over 1A, in under 8 msec;
++       * now it can be managed by nDRV_VBUS ...
++       */
++      setup_usb(500, 8);
++
++      return 0;
++}
++
++static int
++evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
++{
++      gpio_free(gpio + 7);
++      gpio_free(gpio + 6);
++      gpio_free(gpio + 5);
++      gpio_free(gpio + 3);
++      gpio_free(gpio + 2);
++      gpio_free(gpio + 1);
++      gpio_free(gpio + 0);
++      return 0;
++}
++
++static struct pcf857x_platform_data pcf_data_u35 = {
++      .gpio_base      = PCF_Uxx_BASE(2),
++      .setup          = evm_u35_setup,
++      .teardown       = evm_u35_teardown,
++};
++
++/*----------------------------------------------------------------------*/
++
++/* Most of this EEPROM is unused, but U-Boot uses some data:
++ *  - 0x7f00, 6 bytes Ethernet Address
++ *  - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL)
++ *  - ... newer boards may have more
++ */
++static struct memory_accessor *at24_mem_acc;
++
++static void at24_setup(struct memory_accessor *mem_acc, void *context)
++{
++      DECLARE_MAC_BUF(mac_str);
++      char mac_addr[6];
++
++      at24_mem_acc = mem_acc;
++
++      /* Read MAC addr from EEPROM */
++      if (at24_mem_acc->read(at24_mem_acc, mac_addr, 0x7f00, 6) == 6) {
++              printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
++                     print_mac(mac_str, mac_addr));
++      }
++}
++
++static struct at24_platform_data eeprom_info = {
++      .byte_len       = (256*1024) / 8,
++      .page_size      = 64,
++      .flags          = AT24_FLAG_ADDR16,
++      .setup          = at24_setup,
++};
++
++int dm6446evm_eeprom_read(void *buf, off_t off, size_t count)
++{
++      if (at24_mem_acc)
++              return at24_mem_acc->read(at24_mem_acc, buf, off, count);
++      return -ENODEV;
++}
++EXPORT_SYMBOL(dm6446evm_eeprom_read);
++
++int dm6446evm_eeprom_write(void *buf, off_t off, size_t count)
++{
++      if (at24_mem_acc)
++              return at24_mem_acc->write(at24_mem_acc, buf, off, count);
++      return -ENODEV;
++}
++EXPORT_SYMBOL(dm6446evm_eeprom_write);
++
++/*
++ * MSP430 supports RTC, card detection, input from IR remote, and
++ * a bit more.  It triggers interrupts on GPIO(7) from pressing
++ * buttons on the IR remote, and for card detect switches.
++ */
++static struct i2c_client *dm6446evm_msp;
++
++static int dm6446evm_msp_probe(struct i2c_client *client,
++              const struct i2c_device_id *id)
++{
++      dm6446evm_msp = client;
++      return 0;
++}
++
++static int dm6446evm_msp_remove(struct i2c_client *client)
++{
++      dm6446evm_msp = NULL;
++      return 0;
++}
++
++static const struct i2c_device_id dm6446evm_msp_ids[] = {
++      { "dm6446evm_msp", 0, },
++      { /* end of list */ },
++};
++
++static struct i2c_driver dm6446evm_msp_driver = {
++      .driver.name    = "dm6446evm_msp",
++      .id_table       = dm6446evm_msp_ids,
++      .probe          = dm6446evm_msp_probe,
++      .remove         = dm6446evm_msp_remove,
++};
++
++static int dm6444evm_msp430_get_pins(void)
++{
++      static const char txbuf[2] = { 2, 4, };
++      char buf[4];
++      struct i2c_msg msg[2] = {
++              {
++                      .addr = dm6446evm_msp->addr,
++                      .flags = 0,
++                      .len = 2,
++                      .buf = (void __force *)txbuf,
++              },
++              {
++                      .addr = dm6446evm_msp->addr,
++                      .flags = I2C_M_RD,
++                      .len = 4,
++                      .buf = buf,
++              },
++      };
++      int status;
++
++      if (!dm6446evm_msp)
++              return -ENXIO;
++
++      /* Command 4 == get input state, returns port 2 and port3 data
++       *   S Addr W [A] len=2 [A] cmd=4 [A]
++       *   RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P
++       */
++      status = i2c_transfer(dm6446evm_msp->adapter, msg, 2);
++      if (status < 0)
++              return status;
++
++      dev_dbg(&dm6446evm_msp->dev,
++              "PINS: %02x %02x %02x %02x\n",
++              buf[0], buf[1], buf[2], buf[3]);
++
++      return (buf[3] << 8) | buf[2];
++}
++
++static struct i2c_board_info __initdata i2c_info[] =  {
++      {
++              I2C_BOARD_INFO("dm6446evm_msp", 0x23),
++      },
++      {
++              I2C_BOARD_INFO("pcf8574", 0x38),
++              .platform_data  = &pcf_data_u2,
++      },
++      {
++              I2C_BOARD_INFO("pcf8574", 0x39),
++              .platform_data  = &pcf_data_u18,
++      },
++      {
++              I2C_BOARD_INFO("pcf8574", 0x3a),
++              .platform_data  = &pcf_data_u35,
++      },
++      {
++              I2C_BOARD_INFO("24c256", 0x50),
++              .platform_data  = &eeprom_info,
++      },
++      /* ALSO:
++       * - tvl320aic33 audio codec (0x1b)
++       * - tvp5146 video decoder (0x5d)
++       */
++};
++
++/* The msp430 uses a slow bitbanged I2C implementation (ergo 20 KHz),
++ * which requires 100 usec of idle bus after i2c writes sent to it.
++ */
++static struct davinci_i2c_platform_data i2c_pdata = {
++      .bus_freq       = 20 /* kHz */,
++      .bus_delay      = 100 /* usec */,
++};
++
++static void __init evm_init_i2c(void)
++{
++      davinci_init_i2c(&i2c_pdata);
++      i2c_add_driver(&dm6446evm_msp_driver);
++      i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
++}
++
++static struct platform_device *davinci_evm_devices[] __initdata = {
++      &davinci_fb_device,
++      &rtc_dev,
++};
++
++static struct davinci_uart_config uart_config __initdata = {
++      .enabled_uarts = (1 << 0),
++};
++
++static void __init
++davinci_evm_map_io(void)
++{
++      davinci_map_common_io();
++      dm644x_init();
++}
++
++static int davinci_phy_fixup(struct phy_device *phydev)
++{
++      unsigned int control;
++      /* CRITICAL: Fix for increasing PHY signal drive strength for
++       * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY
++       * signal strength was low causing  TX to fail randomly. The
++       * fix is to Set bit 11 (Increased MII drive strength) of PHY
++       * register 26 (Digital Config register) on this phy. */
++      control = phy_read(phydev, 26);
++      phy_write(phydev, 26, (control | 0x800));
++      return 0;
++}
++
++#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
++    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
++#define HAS_ATA 1
++#else
++#define HAS_ATA 0
++#endif
++
++#if defined(CONFIG_MTD_PHYSMAP) || \
++    defined(CONFIG_MTD_PHYSMAP_MODULE)
++#define HAS_NOR 1
++#else
++#define HAS_NOR 0
++#endif
++
++#if defined(CONFIG_MTD_NAND_DAVINCI) || \
++    defined(CONFIG_MTD_NAND_DAVINCI_MODULE)
++#define HAS_NAND 1
++#else
++#define HAS_NAND 0
++#endif
++
++static __init void davinci_evm_init(void)
++{
++      struct clk *aemif_clk;
++
++      aemif_clk = clk_get(NULL, "aemif");
++      clk_enable(aemif_clk);
++
++      if (HAS_ATA) {
++              if (HAS_NAND || HAS_NOR)
++                      pr_warning("WARNING: both IDE and Flash are "
++                              "enabled, but they share AEMIF pins.\n"
++                              "\tDisable IDE for NAND/NOR support.\n");
++              davinci_cfg_reg(DM644X_HPIEN_DISABLE);
++              davinci_cfg_reg(DM644X_ATAEN);
++              davinci_cfg_reg(DM644X_HDIREN);
++              platform_device_register(&ide_dev);
++      } else if (HAS_NAND || HAS_NOR) {
++              davinci_cfg_reg(DM644X_HPIEN_DISABLE);
++              davinci_cfg_reg(DM644X_ATAEN_DISABLE);
++
++              /* only one device will be jumpered and detected */
++              if (HAS_NAND) {
++                      platform_device_register(&davinci_evm_nandflash_device);
++                      evm_leds[7].default_trigger = "nand-disk";
++                      if (HAS_NOR)
++                              pr_warning("WARNING: both NAND and NOR flash "
++                                      "are enabled; disable one of them.\n");
++              } else if (HAS_NOR)
++                      platform_device_register(&davinci_evm_norflash_device);
++      }
++
++      platform_add_devices(davinci_evm_devices,
++                           ARRAY_SIZE(davinci_evm_devices));
++      evm_init_i2c();
++
++      davinci_serial_init(&uart_config);
++
++      /* Register the fixup for PHY on DaVinci */
++      phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK,
++                                      davinci_phy_fixup);
++
++}
++
++static __init void davinci_evm_irq_init(void)
++{
++      davinci_irq_init();
++}
++
++MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")
++      /* Maintainer: MontaVista Software <source@mvista.com> */
++      .phys_io      = IO_PHYS,
++      .io_pg_offst  = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
++      .boot_params  = (DAVINCI_DDR_BASE + 0x100),
++      .map_io       = davinci_evm_map_io,
++      .init_irq     = davinci_evm_irq_init,
++      .timer        = &davinci_timer,
++      .init_machine = davinci_evm_init,
++MACHINE_END
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/board-evm.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/board-evm.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/board-evm.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/board-evm.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,440 +0,0 @@
+-/*
+- * TI DaVinci EVM board support
+- *
+- * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
+- *
+- * 2007 (c) MontaVista Software, Inc. This file is licensed under
+- * the terms of the GNU General Public License version 2. This program
+- * is licensed "as is" without any warranty of any kind, whether express
+- * or implied.
+- */
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/init.h>
+-#include <linux/dma-mapping.h>
+-#include <linux/platform_device.h>
+-#include <linux/gpio.h>
+-#include <linux/leds.h>
+-
+-#include <linux/i2c.h>
+-#include <linux/i2c/pcf857x.h>
+-#include <linux/i2c/at24.h>
+-
+-#include <linux/mtd/mtd.h>
+-#include <linux/mtd/partitions.h>
+-#include <linux/mtd/physmap.h>
+-#include <linux/io.h>
+-
+-#include <asm/setup.h>
+-#include <asm/mach-types.h>
+-
+-#include <asm/mach/arch.h>
+-#include <asm/mach/map.h>
+-#include <asm/mach/flash.h>
+-
+-#include <mach/hardware.h>
+-#include <mach/common.h>
+-#include <mach/i2c.h>
+-
+-/* other misc. init functions */
+-void __init davinci_psc_init(void);
+-void __init davinci_irq_init(void);
+-void __init davinci_map_common_io(void);
+-void __init davinci_init_common_hw(void);
+-
+-#if defined(CONFIG_MTD_PHYSMAP) || \
+-    defined(CONFIG_MTD_PHYSMAP_MODULE)
+-
+-static struct mtd_partition davinci_evm_norflash_partitions[] = {
+-      /* bootloader (U-Boot, etc) in first 4 sectors */
+-      {
+-              .name           = "bootloader",
+-              .offset         = 0,
+-              .size           = 4 * SZ_64K,
+-              .mask_flags     = MTD_WRITEABLE, /* force read-only */
+-      },
+-      /* bootloader params in the next 1 sectors */
+-      {
+-              .name           = "params",
+-              .offset         = MTDPART_OFS_APPEND,
+-              .size           = SZ_64K,
+-              .mask_flags     = 0,
+-      },
+-      /* kernel */
+-      {
+-              .name           = "kernel",
+-              .offset         = MTDPART_OFS_APPEND,
+-              .size           = SZ_2M,
+-              .mask_flags     = 0
+-      },
+-      /* file system */
+-      {
+-              .name           = "filesystem",
+-              .offset         = MTDPART_OFS_APPEND,
+-              .size           = MTDPART_SIZ_FULL,
+-              .mask_flags     = 0
+-      }
+-};
+-
+-static struct physmap_flash_data davinci_evm_norflash_data = {
+-      .width          = 2,
+-      .parts          = davinci_evm_norflash_partitions,
+-      .nr_parts       = ARRAY_SIZE(davinci_evm_norflash_partitions),
+-};
+-
+-/* NOTE: CFI probe will correctly detect flash part as 32M, but EMIF
+- * limits addresses to 16M, so using addresses past 16M will wrap */
+-static struct resource davinci_evm_norflash_resource = {
+-      .start          = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE,
+-      .end            = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1,
+-      .flags          = IORESOURCE_MEM,
+-};
+-
+-static struct platform_device davinci_evm_norflash_device = {
+-      .name           = "physmap-flash",
+-      .id             = 0,
+-      .dev            = {
+-              .platform_data  = &davinci_evm_norflash_data,
+-      },
+-      .num_resources  = 1,
+-      .resource       = &davinci_evm_norflash_resource,
+-};
+-
+-#endif
+-
+-#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
+-    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
+-
+-static struct resource ide_resources[] = {
+-      {
+-              .start          = DAVINCI_CFC_ATA_BASE,
+-              .end            = DAVINCI_CFC_ATA_BASE + 0x7ff,
+-              .flags          = IORESOURCE_MEM,
+-      },
+-      {
+-              .start          = IRQ_IDE,
+-              .end            = IRQ_IDE,
+-              .flags          = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static u64 ide_dma_mask = DMA_BIT_MASK(32);
+-
+-static struct platform_device ide_dev = {
+-      .name           = "palm_bk3710",
+-      .id             = -1,
+-      .resource       = ide_resources,
+-      .num_resources  = ARRAY_SIZE(ide_resources),
+-      .dev = {
+-              .dma_mask               = &ide_dma_mask,
+-              .coherent_dma_mask      = DMA_BIT_MASK(32),
+-      },
+-};
+-
+-#endif
+-
+-/*----------------------------------------------------------------------*/
+-
+-/*
+- * I2C GPIO expanders
+- */
+-
+-#define PCF_Uxx_BASE(x)       (DAVINCI_N_GPIO + ((x) * 8))
+-
+-
+-/* U2 -- LEDs */
+-
+-static struct gpio_led evm_leds[] = {
+-      { .name = "DS8", .active_low = 1,
+-              .default_trigger = "heartbeat", },
+-      { .name = "DS7", .active_low = 1, },
+-      { .name = "DS6", .active_low = 1, },
+-      { .name = "DS5", .active_low = 1, },
+-      { .name = "DS4", .active_low = 1, },
+-      { .name = "DS3", .active_low = 1, },
+-      { .name = "DS2", .active_low = 1,
+-              .default_trigger = "mmc0", },
+-      { .name = "DS1", .active_low = 1,
+-              .default_trigger = "ide-disk", },
+-};
+-
+-static const struct gpio_led_platform_data evm_led_data = {
+-      .num_leds       = ARRAY_SIZE(evm_leds),
+-      .leds           = evm_leds,
+-};
+-
+-static struct platform_device *evm_led_dev;
+-
+-static int
+-evm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      struct gpio_led *leds = evm_leds;
+-      int status;
+-
+-      while (ngpio--) {
+-              leds->gpio = gpio++;
+-              leds++;
+-      }
+-
+-      /* what an extremely annoying way to be forced to handle
+-       * device unregistration ...
+-       */
+-      evm_led_dev = platform_device_alloc("leds-gpio", 0);
+-      platform_device_add_data(evm_led_dev,
+-                      &evm_led_data, sizeof evm_led_data);
+-
+-      evm_led_dev->dev.parent = &client->dev;
+-      status = platform_device_add(evm_led_dev);
+-      if (status < 0) {
+-              platform_device_put(evm_led_dev);
+-              evm_led_dev = NULL;
+-      }
+-      return status;
+-}
+-
+-static int
+-evm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      if (evm_led_dev) {
+-              platform_device_unregister(evm_led_dev);
+-              evm_led_dev = NULL;
+-      }
+-      return 0;
+-}
+-
+-static struct pcf857x_platform_data pcf_data_u2 = {
+-      .gpio_base      = PCF_Uxx_BASE(0),
+-      .setup          = evm_led_setup,
+-      .teardown       = evm_led_teardown,
+-};
+-
+-
+-/* U18 - A/V clock generator and user switch */
+-
+-static int sw_gpio;
+-
+-static ssize_t
+-sw_show(struct device *d, struct device_attribute *a, char *buf)
+-{
+-      char *s = gpio_get_value_cansleep(sw_gpio) ? "on\n" : "off\n";
+-
+-      strcpy(buf, s);
+-      return strlen(s);
+-}
+-
+-static DEVICE_ATTR(user_sw, S_IRUGO, sw_show, NULL);
+-
+-static int
+-evm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      int     status;
+-
+-      /* export dip switch option */
+-      sw_gpio = gpio + 7;
+-      status = gpio_request(sw_gpio, "user_sw");
+-      if (status == 0)
+-              status = gpio_direction_input(sw_gpio);
+-      if (status == 0)
+-              status = device_create_file(&client->dev, &dev_attr_user_sw);
+-      else
+-              gpio_free(sw_gpio);
+-      if (status != 0)
+-              sw_gpio = -EINVAL;
+-
+-      /* audio PLL:  48 kHz (vs 44.1 or 32), single rate (vs double) */
+-      gpio_request(gpio + 3, "pll_fs2");
+-      gpio_direction_output(gpio + 3, 0);
+-
+-      gpio_request(gpio + 2, "pll_fs1");
+-      gpio_direction_output(gpio + 2, 0);
+-
+-      gpio_request(gpio + 1, "pll_sr");
+-      gpio_direction_output(gpio + 1, 0);
+-
+-      return 0;
+-}
+-
+-static int
+-evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      gpio_free(gpio + 1);
+-      gpio_free(gpio + 2);
+-      gpio_free(gpio + 3);
+-
+-      if (sw_gpio > 0) {
+-              device_remove_file(&client->dev, &dev_attr_user_sw);
+-              gpio_free(sw_gpio);
+-      }
+-      return 0;
+-}
+-
+-static struct pcf857x_platform_data pcf_data_u18 = {
+-      .gpio_base      = PCF_Uxx_BASE(1),
+-      .n_latch        = (1 << 3) | (1 << 2) | (1 << 1),
+-      .setup          = evm_u18_setup,
+-      .teardown       = evm_u18_teardown,
+-};
+-
+-
+-/* U35 - various I/O signals used to manage USB, CF, ATA, etc */
+-
+-static int
+-evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      /* p0 = nDRV_VBUS (initial:  don't supply it) */
+-      gpio_request(gpio + 0, "nDRV_VBUS");
+-      gpio_direction_output(gpio + 0, 1);
+-
+-      /* p1 = VDDIMX_EN */
+-      gpio_request(gpio + 1, "VDDIMX_EN");
+-      gpio_direction_output(gpio + 1, 1);
+-
+-      /* p2 = VLYNQ_EN */
+-      gpio_request(gpio + 2, "VLYNQ_EN");
+-      gpio_direction_output(gpio + 2, 1);
+-
+-      /* p3 = n3V3_CF_RESET (initial: stay in reset) */
+-      gpio_request(gpio + 3, "nCF_RESET");
+-      gpio_direction_output(gpio + 3, 0);
+-
+-      /* (p4 unused) */
+-
+-      /* p5 = 1V8_WLAN_RESET (initial: stay in reset) */
+-      gpio_request(gpio + 5, "WLAN_RESET");
+-      gpio_direction_output(gpio + 5, 1);
+-
+-      /* p6 = nATA_SEL (initial: select) */
+-      gpio_request(gpio + 6, "nATA_SEL");
+-      gpio_direction_output(gpio + 6, 0);
+-
+-      /* p7 = nCF_SEL (initial: deselect) */
+-      gpio_request(gpio + 7, "nCF_SEL");
+-      gpio_direction_output(gpio + 7, 1);
+-
+-      /* irlml6401 sustains over 3A, switches 5V in under 8 msec */
+-      setup_usb(500, 8);
+-
+-      return 0;
+-}
+-
+-static int
+-evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+-{
+-      gpio_free(gpio + 7);
+-      gpio_free(gpio + 6);
+-      gpio_free(gpio + 5);
+-      gpio_free(gpio + 3);
+-      gpio_free(gpio + 2);
+-      gpio_free(gpio + 1);
+-      gpio_free(gpio + 0);
+-      return 0;
+-}
+-
+-static struct pcf857x_platform_data pcf_data_u35 = {
+-      .gpio_base      = PCF_Uxx_BASE(2),
+-      .setup          = evm_u35_setup,
+-      .teardown       = evm_u35_teardown,
+-};
+-
+-/*----------------------------------------------------------------------*/
+-
+-/* Most of this EEPROM is unused, but U-Boot uses some data:
+- *  - 0x7f00, 6 bytes Ethernet Address
+- *  - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL)
+- *  - ... newer boards may have more
+- */
+-static struct at24_platform_data eeprom_info = {
+-      .byte_len       = (256*1024) / 8,
+-      .page_size      = 64,
+-      .flags          = AT24_FLAG_ADDR16,
+-};
+-
+-static struct i2c_board_info __initdata i2c_info[] =  {
+-      {
+-              I2C_BOARD_INFO("pcf8574", 0x38),
+-              .platform_data  = &pcf_data_u2,
+-      },
+-      {
+-              I2C_BOARD_INFO("pcf8574", 0x39),
+-              .platform_data  = &pcf_data_u18,
+-      },
+-      {
+-              I2C_BOARD_INFO("pcf8574", 0x3a),
+-              .platform_data  = &pcf_data_u35,
+-      },
+-      {
+-              I2C_BOARD_INFO("24c256", 0x50),
+-              .platform_data  = &eeprom_info,
+-      },
+-      /* ALSO:
+-       * - tvl320aic33 audio codec (0x1b)
+-       * - msp430 microcontroller (0x23)
+-       * - tvp5146 video decoder (0x5d)
+-       */
+-};
+-
+-/* The msp430 uses a slow bitbanged I2C implementation (ergo 20 KHz),
+- * which requires 100 usec of idle bus after i2c writes sent to it.
+- */
+-static struct davinci_i2c_platform_data i2c_pdata = {
+-      .bus_freq       = 20 /* kHz */,
+-      .bus_delay      = 100 /* usec */,
+-};
+-
+-static void __init evm_init_i2c(void)
+-{
+-      davinci_init_i2c(&i2c_pdata);
+-      i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
+-}
+-
+-static struct platform_device *davinci_evm_devices[] __initdata = {
+-#if defined(CONFIG_MTD_PHYSMAP) || \
+-    defined(CONFIG_MTD_PHYSMAP_MODULE)
+-      &davinci_evm_norflash_device,
+-#endif
+-#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
+-    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
+-      &ide_dev,
+-#endif
+-};
+-
+-static void __init
+-davinci_evm_map_io(void)
+-{
+-      davinci_map_common_io();
+-}
+-
+-static __init void davinci_evm_init(void)
+-{
+-      davinci_psc_init();
+-
+-#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
+-    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
+-#if defined(CONFIG_MTD_PHYSMAP) || \
+-    defined(CONFIG_MTD_PHYSMAP_MODULE)
+-      printk(KERN_WARNING "WARNING: both IDE and NOR flash are enabled, "
+-             "but share pins.\n\t Disable IDE for NOR support.\n");
+-#endif
+-#endif
+-
+-      platform_add_devices(davinci_evm_devices,
+-                           ARRAY_SIZE(davinci_evm_devices));
+-      evm_init_i2c();
+-}
+-
+-static __init void davinci_evm_irq_init(void)
+-{
+-      davinci_init_common_hw();
+-      davinci_irq_init();
+-}
+-
+-MACHINE_START(DAVINCI_EVM, "DaVinci EVM")
+-      /* Maintainer: MontaVista Software <source@mvista.com> */
+-      .phys_io      = IO_PHYS,
+-      .io_pg_offst  = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
+-      .boot_params  = (DAVINCI_DDR_BASE + 0x100),
+-      .map_io       = davinci_evm_map_io,
+-      .init_irq     = davinci_evm_irq_init,
+-      .timer        = &davinci_timer,
+-      .init_machine = davinci_evm_init,
+-MACHINE_END
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/clock.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/clock.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/clock.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/clock.c 2009-05-13 09:46:19.000000000 +0200
+@@ -1,7 +1,8 @@
+ /*
+- * TI DaVinci clock config file
++ * Clock and PLL control for DaVinci devices
+  *
+- * Copyright (C) 2006 Texas Instruments.
++ * Copyright (C) 2006-2007 Texas Instruments.
++ * Copyright (C) 2008-2009 Deep Root Systems, LLC
+  *
+  * 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
+@@ -13,6 +14,7 @@
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/errno.h>
++#include <linux/clk.h>
+ #include <linux/err.h>
+ #include <linux/mutex.h>
+ #include <linux/platform_device.h>
+@@ -21,98 +23,50 @@
+ #include <mach/hardware.h>
+ #include <mach/psc.h>
++#include <mach/cputype.h>
+ #include "clock.h"
+-/* PLL/Reset register offsets */
+-#define PLLM          0x110
+-
+ static LIST_HEAD(clocks);
+ static DEFINE_MUTEX(clocks_mutex);
+ static DEFINE_SPINLOCK(clockfw_lock);
+-static unsigned int commonrate;
+-static unsigned int armrate;
+-static unsigned int fixedrate = 27000000;     /* 27 MHZ */
+-
+-extern void davinci_psc_config(unsigned int domain, unsigned int id, char enable);
+-
+-/*
+- * Returns a clock. Note that we first try to use device id on the bus
+- * and clock name. If this fails, we try to use clock name only.
+- */
+-struct clk *clk_get(struct device *dev, const char *id)
++static unsigned psc_domain(struct clk *clk)
+ {
+-      struct clk *p, *clk = ERR_PTR(-ENOENT);
+-      int idno;
+-
+-      if (dev == NULL || dev->bus != &platform_bus_type)
+-              idno = -1;
+-      else
+-              idno = to_platform_device(dev)->id;
+-
+-      mutex_lock(&clocks_mutex);
+-
+-      list_for_each_entry(p, &clocks, node) {
+-              if (p->id == idno &&
+-                  strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
+-                      clk = p;
+-                      goto found;
+-              }
+-      }
+-
+-      list_for_each_entry(p, &clocks, node) {
+-              if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
+-                      clk = p;
+-                      break;
+-              }
+-      }
+-
+-found:
+-      mutex_unlock(&clocks_mutex);
+-
+-      return clk;
++      return (clk->flags & PSC_DSP)
++              ? DAVINCI_GPSC_DSPDOMAIN
++              : DAVINCI_GPSC_ARMDOMAIN;
+ }
+-EXPORT_SYMBOL(clk_get);
+-void clk_put(struct clk *clk)
++static void __clk_enable(struct clk *clk)
+ {
+-      if (clk && !IS_ERR(clk))
+-              module_put(clk->owner);
+-}
+-EXPORT_SYMBOL(clk_put);
+-
+-static int __clk_enable(struct clk *clk)
+-{
+-      if (clk->flags & ALWAYS_ENABLED)
+-              return 0;
+-
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, clk->lpsc, 1);
+-      return 0;
++      if (clk->parent)
++              __clk_enable(clk->parent);
++      if (clk->usecount++ == 0 && (clk->flags & CLK_PSC))
++              davinci_psc_config(psc_domain(clk), clk->lpsc, 1);
+ }
+ static void __clk_disable(struct clk *clk)
+ {
+-      if (clk->usecount)
++      if (WARN_ON(clk->usecount == 0))
+               return;
+-
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, clk->lpsc, 0);
++      if (--clk->usecount == 0 && !(clk->flags & CLK_PLL))
++              davinci_psc_config(psc_domain(clk), clk->lpsc, 0);
++      if (clk->parent)
++              __clk_disable(clk->parent);
+ }
+ int clk_enable(struct clk *clk)
+ {
+       unsigned long flags;
+-      int ret = 0;
+       if (clk == NULL || IS_ERR(clk))
+               return -EINVAL;
+-      if (clk->usecount++ == 0) {
+-              spin_lock_irqsave(&clockfw_lock, flags);
+-              ret = __clk_enable(clk);
+-              spin_unlock_irqrestore(&clockfw_lock, flags);
+-      }
++      spin_lock_irqsave(&clockfw_lock, flags);
++      __clk_enable(clk);
++      spin_unlock_irqrestore(&clockfw_lock, flags);
+-      return ret;
++      return 0;
+ }
+ EXPORT_SYMBOL(clk_enable);
+@@ -123,11 +77,9 @@ void clk_disable(struct clk *clk)
+       if (clk == NULL || IS_ERR(clk))
+               return;
+-      if (clk->usecount > 0 && !(--clk->usecount)) {
+-              spin_lock_irqsave(&clockfw_lock, flags);
+-              __clk_disable(clk);
+-              spin_unlock_irqrestore(&clockfw_lock, flags);
+-      }
++      spin_lock_irqsave(&clockfw_lock, flags);
++      __clk_disable(clk);
++      spin_unlock_irqrestore(&clockfw_lock, flags);
+ }
+ EXPORT_SYMBOL(clk_disable);
+@@ -136,7 +88,7 @@ unsigned long clk_get_rate(struct clk *c
+       if (clk == NULL || IS_ERR(clk))
+               return -EINVAL;
+-      return *(clk->rate);
++      return clk->rate;
+ }
+ EXPORT_SYMBOL(clk_get_rate);
+@@ -145,7 +97,7 @@ long clk_round_rate(struct clk *clk, uns
+       if (clk == NULL || IS_ERR(clk))
+               return -EINVAL;
+-      return *(clk->rate);
++      return clk->rate;
+ }
+ EXPORT_SYMBOL(clk_round_rate);
+@@ -164,10 +116,23 @@ int clk_register(struct clk *clk)
+       if (clk == NULL || IS_ERR(clk))
+               return -EINVAL;
++      if (WARN(clk->parent && !clk->parent->rate,
++                      "CLK: %s parent %s has no rate!\n",
++                      clk->name, clk->parent->name))
++              return -EINVAL;
++
+       mutex_lock(&clocks_mutex);
+-      list_add(&clk->node, &clocks);
++      list_add_tail(&clk->node, &clocks);
+       mutex_unlock(&clocks_mutex);
++      /* If rate is already set, use it */
++      if (clk->rate)
++              return 0;
++
++      /* Otherwise, default to parent rate */
++      if (clk->parent)
++              clk->rate = clk->parent->rate;
++
+       return 0;
+ }
+ EXPORT_SYMBOL(clk_register);
+@@ -183,84 +148,150 @@ void clk_unregister(struct clk *clk)
+ }
+ EXPORT_SYMBOL(clk_unregister);
+-static struct clk davinci_clks[] = {
+-      {
+-              .name = "ARMCLK",
+-              .rate = &armrate,
+-              .lpsc = -1,
+-              .flags = ALWAYS_ENABLED,
+-      },
+-      {
+-              .name = "UART",
+-              .rate = &fixedrate,
+-              .lpsc = DAVINCI_LPSC_UART0,
+-      },
+-      {
+-              .name = "EMACCLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_EMAC_WRAPPER,
+-      },
+-      {
+-              .name = "I2CCLK",
+-              .rate = &fixedrate,
+-              .lpsc = DAVINCI_LPSC_I2C,
+-      },
+-      {
+-              .name = "IDECLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_ATA,
+-      },
+-      {
+-              .name = "McBSPCLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_McBSP,
+-      },
+-      {
+-              .name = "MMCSDCLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_MMC_SD,
+-      },
+-      {
+-              .name = "SPICLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_SPI,
+-      },
+-      {
+-              .name = "gpio",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_GPIO,
+-      },
+-      {
+-              .name = "usb",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_USB,
+-      },
+-      {
+-              .name = "AEMIFCLK",
+-              .rate = &commonrate,
+-              .lpsc = DAVINCI_LPSC_AEMIF,
+-              .usecount = 1,
++#ifdef CONFIG_DAVINCI_RESET_CLOCKS
++/*
++ * Disable any unused clocks left on by the bootloader
++ */
++static int __init clk_disable_unused(void)
++{
++      struct clk *ck;
++
++      spin_lock_irq(&clockfw_lock);
++      list_for_each_entry(ck, &clocks, node) {
++              if (ck->usecount > 0)
++                      continue;
++              if (!(ck->flags & CLK_PSC))
++                      continue;
++
++              /* ignore if in Disabled or SwRstDisable states */
++              if (!davinci_psc_is_clk_active(ck->lpsc))
++                      continue;
++
++              pr_info("Clocks: disable unused %s\n", ck->name);
++              davinci_psc_config(psc_domain(ck), ck->lpsc, 0);
+       }
+-};
++      spin_unlock_irq(&clockfw_lock);
++
++      return 0;
++}
++late_initcall(clk_disable_unused);
++#endif
+-int __init davinci_clk_init(void)
++static void clk_sysclk_recalc(struct clk *clk)
+ {
+-      struct clk *clkp;
+-      int count = 0;
+-      u32 pll_mult;
+-
+-      pll_mult = davinci_readl(DAVINCI_PLL_CNTRL0_BASE + PLLM);
+-      commonrate = ((pll_mult + 1) * 27000000) / 6;
+-      armrate = ((pll_mult + 1) * 27000000) / 2;
+-
+-      for (clkp = davinci_clks; count < ARRAY_SIZE(davinci_clks);
+-           count++, clkp++) {
+-              clk_register(clkp);
+-
+-              /* Turn on clocks that have been enabled in the
+-               * table above */
+-              if (clkp->usecount)
+-                      clk_enable(clkp);
++      u32 v, plldiv;
++      struct pll_data *pll;
++
++      /* If this is the PLL base clock, no more calculations needed */
++      if (clk->pll_data)
++              return;
++
++      if (WARN_ON(!clk->parent))
++              return;
++
++      clk->rate = clk->parent->rate;
++
++      /* Otherwise, the parent must be a PLL */
++      if (WARN_ON(!clk->parent->pll_data))
++              return;
++
++      pll = clk->parent->pll_data;
++
++      /* If pre-PLL, source clock is before the multiplier and divider(s) */
++      if (clk->flags & PRE_PLL)
++              clk->rate = pll->input_rate;
++
++      if (!clk->div_reg)
++              return;
++
++      v = __raw_readl(pll->base + clk->div_reg);
++      if (v & PLLDIV_EN) {
++              plldiv = (v & PLLDIV_RATIO_MASK) + 1;
++              if (plldiv)
++                      clk->rate /= plldiv;
++      }
++}
++
++static void __init clk_pll_init(struct clk *clk)
++{
++      u32 ctrl, mult = 1, prediv = 1, postdiv = 1;
++      u8 bypass;
++      struct pll_data *pll = clk->pll_data;
++
++      pll->base = IO_ADDRESS(pll->phys_base);
++      ctrl = __raw_readl(pll->base + PLLCTL);
++      clk->rate = pll->input_rate = clk->parent->rate;
++
++      if (ctrl & PLLCTL_PLLEN) {
++              bypass = 0;
++              mult = __raw_readl(pll->base + PLLM);
++              mult = (mult & PLLM_PLLM_MASK) + 1;
++      } else
++              bypass = 1;
++
++      if (pll->flags & PLL_HAS_PREDIV) {
++              prediv = __raw_readl(pll->base + PREDIV);
++              if (prediv & PLLDIV_EN)
++                      prediv = (prediv & PLLDIV_RATIO_MASK) + 1;
++              else
++                      prediv = 1;
++      }
++
++      /* pre-divider is fixed, but (some?) chips won't report that */
++      if (cpu_is_davinci_dm355() && pll->num == 1)
++              prediv = 8;
++
++      if (pll->flags & PLL_HAS_POSTDIV) {
++              postdiv = __raw_readl(pll->base + POSTDIV);
++              if (postdiv & PLLDIV_EN)
++                      postdiv = (postdiv & PLLDIV_RATIO_MASK) + 1;
++              else
++                      postdiv = 1;
++      }
++
++      if (!bypass) {
++              clk->rate /= prediv;
++              clk->rate *= mult;
++              clk->rate /= postdiv;
++      }
++
++      pr_debug("PLL%d: input = %lu MHz [ ",
++               pll->num, clk->parent->rate / 1000000);
++      if (bypass)
++              pr_debug("bypass ");
++      if (prediv > 1)
++              pr_debug("/ %d ", prediv);
++      if (mult > 1)
++              pr_debug("* %d ", mult);
++      if (postdiv > 1)
++              pr_debug("/ %d ", postdiv);
++      pr_debug("] --> %lu MHz output.\n", clk->rate / 1000000);
++}
++
++int __init davinci_clk_init(struct davinci_clk *clocks)
++  {
++      struct davinci_clk *c;
++      struct clk *clk;
++
++      for (c = clocks; c->lk.clk; c++) {
++              clk = c->lk.clk;
++
++              if (clk->pll_data)
++                      clk_pll_init(clk);
++
++              /* Calculate rates for PLL-derived clocks */
++              else if (clk->flags & CLK_PLL)
++                      clk_sysclk_recalc(clk);
++
++              if (clk->lpsc)
++                      clk->flags |= CLK_PSC;
++
++              clkdev_add(&c->lk);
++              clk_register(clk);
++
++              /* Turn on clocks that Linux doesn't otherwise manage */
++              if (clk->flags & ALWAYS_ENABLED)
++                      clk_enable(clk);
+       }
+       return 0;
+@@ -285,12 +316,52 @@ static void davinci_ck_stop(struct seq_f
+ {
+ }
++#define CLKNAME_MAX   10              /* longest clock name */
++#define NEST_DELTA    2
++#define NEST_MAX      4
++
++static void
++dump_clock(struct seq_file *s, unsigned nest, struct clk *parent)
++{
++      char            *state;
++      char            buf[CLKNAME_MAX + NEST_DELTA * NEST_MAX];
++      struct clk      *clk;
++      unsigned        i;
++
++      if (parent->flags & CLK_PLL)
++              state = "pll";
++      else if (parent->flags & CLK_PSC)
++              state = "psc";
++      else
++              state = "";
++
++      /* <nest spaces> name <pad to end> */
++      memset(buf, ' ', sizeof(buf) - 1);
++      buf[sizeof(buf) - 1] = 0;
++      i = strlen(parent->name);
++      memcpy(buf + nest, parent->name,
++                      min(i, (unsigned)(sizeof(buf) - 1 - nest)));
++
++      seq_printf(s, "%s users=%2d %-3s %9ld Hz\n",
++                 buf, parent->usecount, state, clk_get_rate(parent));
++      /* REVISIT show device associations too */
++
++      /* cost is now small, but not linear... */
++      list_for_each_entry(clk, &clocks, node) {
++              if (clk->parent == parent)
++                      dump_clock(s, nest + NEST_DELTA, clk);
++      }
++}
++
+ static int davinci_ck_show(struct seq_file *m, void *v)
+ {
+-      struct clk *cp;
+-
+-      list_for_each_entry(cp, &clocks, node)
+-              seq_printf(m,"%s %d %d\n", cp->name, *(cp->rate), cp->usecount);
++      /* Show clock tree; we know the main oscillator is first.
++       * We trust nonzero usecounts equate to PSC enables...
++       */
++      mutex_lock(&clocks_mutex);
++      if (!list_empty(&clocks))
++              dump_clock(m, 0, list_first_entry(&clocks, struct clk, node));
++      mutex_unlock(&clocks_mutex);
+       return 0;
+ }
+@@ -321,4 +392,4 @@ static int __init davinci_ck_proc_init(v
+ }
+ __initcall(davinci_ck_proc_init);
+-#endif        /* CONFIG_DEBUG_PROC_FS */
++#endif /* CONFIG_DEBUG_PROC_FS */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/clock.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/clock.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/clock.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/clock.h 2009-05-13 09:46:19.000000000 +0200
+@@ -1,7 +1,8 @@
+ /*
+  * TI DaVinci clock definitions
+  *
+- * Copyright (C) 2006 Texas Instruments.
++ * Copyright (C) 2006-2007 Texas Instruments.
++ * Copyright (C) 2008-2009 Deep Root Systems, LLC
+  *
+  * 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
+@@ -11,23 +12,85 @@
+ #ifndef __ARCH_ARM_DAVINCI_CLOCK_H
+ #define __ARCH_ARM_DAVINCI_CLOCK_H
++#include <linux/list.h>
++#include <asm/clkdev.h>
++
++#define DAVINCI_PLL1_BASE 0x01c40800
++#define DAVINCI_PLL2_BASE 0x01c40c00
++#define MAX_PLL 2
++
++/* PLL/Reset register offsets */
++#define PLLCTL          0x100
++#define PLLCTL_PLLEN    BIT(0)
++#define PLLCTL_CLKMODE  BIT(8)
++
++#define PLLM          0x110
++#define PLLM_PLLM_MASK  0xff
++
++#define PREDIV          0x114
++#define PLLDIV1         0x118
++#define PLLDIV2         0x11c
++#define PLLDIV3         0x120
++#define POSTDIV         0x128
++#define BPDIV           0x12c
++#define PLLCMD                0x138
++#define PLLSTAT               0x13c
++#define PLLALNCTL     0x140
++#define PLLDCHANGE    0x144
++#define PLLCKEN               0x148
++#define PLLCKSTAT     0x14c
++#define PLLSYSTAT     0x150
++#define PLLDIV4         0x160
++#define PLLDIV5         0x164
++#define PLLDIV6         0x168
++#define PLLDIV7         0x16c
++#define PLLDIV8         0x170
++#define PLLDIV9         0x174
++#define PLLDIV_EN       BIT(15)
++#define PLLDIV_RATIO_MASK 0x1f
++
++struct pll_data {
++      u32 phys_base;
++      void __iomem *base;
++      u32 num;
++      u32 flags;
++      u32 input_rate;
++};
++#define PLL_HAS_PREDIV          0x01
++#define PLL_HAS_POSTDIV         0x02
++
+ struct clk {
+       struct list_head        node;
+       struct module           *owner;
+       const char              *name;
+-      unsigned int            *rate;
+-      int                     id;
+-      __s8                    usecount;
+-      __u8                    flags;
+-      __u8                    lpsc;
++      unsigned long           rate;
++      u8                      usecount;
++      u8                      flags;
++      u8                      lpsc;
++      struct clk              *parent;
++      struct pll_data         *pll_data;
++      u32                     div_reg;
+ };
+ /* Clock flags */
+-#define RATE_CKCTL            1
+-#define RATE_FIXED            2
+-#define RATE_PROPAGATES               4
+-#define VIRTUAL_CLOCK         8
+-#define ALWAYS_ENABLED                16
+-#define ENABLE_REG_32BIT      32
++#define ALWAYS_ENABLED                BIT(1)
++#define CLK_PSC                 BIT(2)
++#define PSC_DSP                 BIT(3) /* PSC uses DSP domain, not ARM */
++#define CLK_PLL                       BIT(4) /* PLL-derived clock */
++#define PRE_PLL                 BIT(5) /* source is before PLL mult/div */
++
++struct davinci_clk {
++      struct clk_lookup lk;
++};
++
++#define CLK(dev, con, ck)             \
++      {                               \
++              .lk = {                 \
++                      .dev_id = dev,  \
++                      .con_id = con,  \
++                      .clk = ck,      \
++              },                      \
++      }
++int davinci_clk_init(struct davinci_clk *clocks);
+ #endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/devices.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/devices.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/devices.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/devices.c       2009-05-13 09:46:19.000000000 +0200
+@@ -21,6 +21,10 @@
+ #include <mach/hardware.h>
+ #include <mach/i2c.h>
+ #include <mach/irqs.h>
++#include <mach/cputype.h>
++#include <mach/mux.h>
++
++#define DAVINCI_I2C_BASE           0x01C21000
+ static struct resource i2c_resources[] = {
+       {
+@@ -43,6 +47,9 @@ static struct platform_device davinci_i2
+ void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
+ {
++      if (cpu_is_davinci_dm644x())
++              davinci_cfg_reg(DM644X_I2C);
++
+       davinci_i2c_device.dev.platform_data = pdata;
+       (void) platform_device_register(&davinci_i2c_device);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/dm644x.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/dm644x.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/dm644x.c    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/dm644x.c        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,461 @@
++/*
++ * TI DaVinci DM644x chip specific setup
++ *
++ * Author: Kevin Hilman, Deep Root Systems, LLC
++ *
++ * 2007 (c) Deep Root Systems, LLC. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ */
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/clk.h>
++#include <linux/platform_device.h>
++
++#include <mach/dm644x.h>
++#include <mach/clock.h>
++#include <mach/cputype.h>
++#include <mach/edma.h>
++#include <mach/irqs.h>
++#include <mach/psc.h>
++#include <mach/mux.h>
++
++#include "clock.h"
++#include "mux.h"
++
++/*
++ * Device specific clocks
++ */
++#define DM644X_REF_FREQ               27000000
++
++static struct pll_data pll1_data = {
++      .num       = 1,
++      .phys_base = DAVINCI_PLL1_BASE,
++};
++
++static struct pll_data pll2_data = {
++      .num       = 2,
++      .phys_base = DAVINCI_PLL2_BASE,
++};
++
++static struct clk ref_clk = {
++      .name = "ref_clk",
++      .rate = DM644X_REF_FREQ,
++};
++
++static struct clk pll1_clk = {
++      .name = "pll1",
++      .parent = &ref_clk,
++      .pll_data = &pll1_data,
++      .flags = CLK_PLL,
++};
++
++static struct clk pll1_sysclk1 = {
++      .name = "pll1_sysclk1",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV1,
++};
++
++static struct clk pll1_sysclk2 = {
++      .name = "pll1_sysclk2",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV2,
++};
++
++static struct clk pll1_sysclk3 = {
++      .name = "pll1_sysclk3",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV3,
++};
++
++static struct clk pll1_sysclk5 = {
++      .name = "pll1_sysclk5",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV5,
++};
++
++static struct clk pll1_aux_clk = {
++      .name = "pll1_aux_clk",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL | PRE_PLL,
++};
++
++static struct clk pll1_sysclkbp = {
++      .name = "pll1_sysclkbp",
++      .parent = &pll1_clk,
++      .flags = CLK_PLL | PRE_PLL,
++      .div_reg = BPDIV
++};
++
++static struct clk pll2_clk = {
++      .name = "pll2",
++      .parent = &ref_clk,
++      .pll_data = &pll2_data,
++      .flags = CLK_PLL,
++};
++
++static struct clk pll2_sysclk1 = {
++      .name = "pll2_sysclk1",
++      .parent = &pll2_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV1,
++};
++
++static struct clk pll2_sysclk2 = {
++      .name = "pll2_sysclk2",
++      .parent = &pll2_clk,
++      .flags = CLK_PLL,
++      .div_reg = PLLDIV2,
++};
++
++static struct clk pll2_sysclkbp = {
++      .name = "pll2_sysclkbp",
++      .parent = &pll2_clk,
++      .flags = CLK_PLL | PRE_PLL,
++      .div_reg = BPDIV
++};
++
++static struct clk dsp_clk = {
++      .name = "dsp",
++      .parent = &pll1_sysclk1,
++      .lpsc = DAVINCI_LPSC_GEM,
++      .flags = PSC_DSP,
++      .usecount = 1,                  /* REVISIT how to disable? */
++};
++
++static struct clk arm_clk = {
++      .name = "arm",
++      .parent = &pll1_sysclk2,
++      .lpsc = DAVINCI_LPSC_ARM,
++      .flags = ALWAYS_ENABLED,
++};
++
++static struct clk vicp_clk = {
++      .name = "vicp",
++      .parent = &pll1_sysclk2,
++      .lpsc = DAVINCI_LPSC_IMCOP,
++      .flags = PSC_DSP,
++      .usecount = 1,                  /* REVISIT how to disable? */
++};
++
++static struct clk vpss_master_clk = {
++      .name = "vpss_master",
++      .parent = &pll1_sysclk3,
++      .lpsc = DAVINCI_LPSC_VPSSMSTR,
++      .flags = CLK_PSC,
++};
++
++static struct clk vpss_slave_clk = {
++      .name = "vpss_slave",
++      .parent = &pll1_sysclk3,
++      .lpsc = DAVINCI_LPSC_VPSSSLV,
++};
++
++static struct clk uart0_clk = {
++      .name = "uart0",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_UART0,
++};
++
++static struct clk uart1_clk = {
++      .name = "uart1",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_UART1,
++};
++
++static struct clk uart2_clk = {
++      .name = "uart2",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_UART2,
++};
++
++static struct clk emac_clk = {
++      .name = "emac",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_EMAC_WRAPPER,
++};
++
++static struct clk i2c_clk = {
++      .name = "i2c",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_I2C,
++};
++
++static struct clk ide_clk = {
++      .name = "ide",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_ATA,
++};
++
++static struct clk asp_clk = {
++      .name = "asp0",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_McBSP,
++};
++
++static struct clk mmcsd_clk = {
++      .name = "mmcsd",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_MMC_SD,
++};
++
++static struct clk spi_clk = {
++      .name = "spi",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_SPI,
++};
++
++static struct clk gpio_clk = {
++      .name = "gpio",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_GPIO,
++};
++
++static struct clk usb_clk = {
++      .name = "usb",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_USB,
++};
++
++static struct clk vlynq_clk = {
++      .name = "vlynq",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_VLYNQ,
++};
++
++static struct clk aemif_clk = {
++      .name = "aemif",
++      .parent = &pll1_sysclk5,
++      .lpsc = DAVINCI_LPSC_AEMIF,
++};
++
++static struct clk pwm0_clk = {
++      .name = "pwm0",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_PWM0,
++};
++
++static struct clk pwm1_clk = {
++      .name = "pwm1",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_PWM1,
++};
++
++static struct clk pwm2_clk = {
++      .name = "pwm2",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_PWM2,
++};
++
++static struct clk timer0_clk = {
++      .name = "timer0",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_TIMER0,
++};
++
++static struct clk timer1_clk = {
++      .name = "timer1",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_TIMER1,
++};
++
++static struct clk timer2_clk = {
++      .name = "timer2",
++      .parent = &pll1_aux_clk,
++      .lpsc = DAVINCI_LPSC_TIMER2,
++      .usecount = 1,              /* REVISIT: why cant' this be disabled? */
++};
++
++struct davinci_clk dm644x_clks[] = {
++      CLK(NULL, "ref", &ref_clk),
++      CLK(NULL, "pll1", &pll1_clk),
++      CLK(NULL, "pll1_sysclk1", &pll1_sysclk1),
++      CLK(NULL, "pll1_sysclk2", &pll1_sysclk2),
++      CLK(NULL, "pll1_sysclk3", &pll1_sysclk3),
++      CLK(NULL, "pll1_sysclk5", &pll1_sysclk5),
++      CLK(NULL, "pll1_aux", &pll1_aux_clk),
++      CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp),
++      CLK(NULL, "pll2", &pll2_clk),
++      CLK(NULL, "pll2_sysclk1", &pll2_sysclk1),
++      CLK(NULL, "pll2_sysclk2", &pll2_sysclk2),
++      CLK(NULL, "pll2_sysclkbp", &pll2_sysclkbp),
++      CLK(NULL, "dsp", &dsp_clk),
++      CLK(NULL, "arm", &arm_clk),
++      CLK(NULL, "vicp", &vicp_clk),
++      CLK(NULL, "vpss_master", &vpss_master_clk),
++      CLK(NULL, "vpss_slave", &vpss_slave_clk),
++      CLK(NULL, "arm", &arm_clk),
++      CLK(NULL, "uart0", &uart0_clk),
++      CLK(NULL, "uart1", &uart1_clk),
++      CLK(NULL, "uart2", &uart2_clk),
++      CLK("davinci_emac.1", NULL, &emac_clk),
++      CLK("i2c_davinci.1", NULL, &i2c_clk),
++      CLK("palm_bk3710", NULL, &ide_clk),
++      CLK("soc-audio.0", NULL, &asp_clk),
++      CLK("davinci_mmc.0", NULL, &mmcsd_clk),
++      CLK(NULL, "spi", &spi_clk),
++      CLK(NULL, "gpio", &gpio_clk),
++      CLK(NULL, "usb", &usb_clk),
++      CLK(NULL, "vlynq", &vlynq_clk),
++      CLK(NULL, "aemif", &aemif_clk),
++      CLK(NULL, "pwm0", &pwm0_clk),
++      CLK(NULL, "pwm1", &pwm1_clk),
++      CLK(NULL, "pwm2", &pwm2_clk),
++      CLK(NULL, "timer0", &timer0_clk),
++      CLK(NULL, "timer1", &timer1_clk),
++      CLK("watchdog", NULL, &timer2_clk),
++      CLK(NULL, NULL, NULL),
++};
++
++#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
++
++static struct resource dm644x_emac_resources[] = {
++      {
++              .start  = DM644X_EMAC_BASE,
++              .end    = DM644X_EMAC_BASE + 0x47ff,
++              .flags  = IORESOURCE_MEM,
++      },
++      {
++              .start = IRQ_EMACINT,
++              .end   = IRQ_EMACINT,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device dm644x_emac_device = {
++       .name          = "davinci_emac",
++       .id            = 1,
++       .num_resources = ARRAY_SIZE(dm644x_emac_resources),
++       .resource      = dm644x_emac_resources,
++};
++
++#endif
++
++/*
++ * Device specific mux setup
++ *
++ *    soc     description     mux  mode   mode  mux    dbg
++ *                            reg  offset mask  mode
++ */
++static const struct mux_config dm644x_pins[] = {
++MUX_CFG(DM644X, HDIREN,               0,   16,    1,    1,     true)
++MUX_CFG(DM644X, ATAEN,                0,   17,    1,    1,     true)
++MUX_CFG(DM644X, ATAEN_DISABLE,        0,   17,    1,    0,     true)
++
++MUX_CFG(DM644X, HPIEN_DISABLE,        0,   29,    1,    0,     true)
++
++MUX_CFG(DM644X, AEAW,         0,   0,     31,   31,    true)
++
++MUX_CFG(DM644X, MSTK,         1,   9,     1,    0,     false)
++
++MUX_CFG(DM644X, I2C,          1,   7,     1,    1,     false)
++
++MUX_CFG(DM644X, MCBSP,                1,   10,    1,    1,     false)
++
++MUX_CFG(DM644X, UART1,                1,   1,     1,    1,     true)
++MUX_CFG(DM644X, UART2,                1,   2,     1,    1,     true)
++
++MUX_CFG(DM644X, PWM0,         1,   4,     1,    1,     false)
++
++MUX_CFG(DM644X, PWM1,         1,   5,     1,    1,     false)
++
++MUX_CFG(DM644X, PWM2,         1,   6,     1,    1,     false)
++
++MUX_CFG(DM644X, VLYNQEN,      0,   15,    1,    1,     false)
++MUX_CFG(DM644X, VLSCREN,      0,   14,    1,    1,     false)
++MUX_CFG(DM644X, VLYNQWD,      0,   12,    3,    3,     false)
++
++MUX_CFG(DM644X, EMACEN,               0,   31,    1,    1,     true)
++
++MUX_CFG(DM644X, GPIO3V,               0,   31,    1,    0,     true)
++
++MUX_CFG(DM644X, GPIO0,                0,   24,    1,    0,     true)
++MUX_CFG(DM644X, GPIO3,                0,   25,    1,    0,     false)
++MUX_CFG(DM644X, GPIO43_44,    1,   7,     1,    0,     false)
++MUX_CFG(DM644X, GPIO46_47,    0,   22,    1,    0,     true)
++
++MUX_CFG(DM644X, RGB666,               0,   22,    1,    1,     true)
++
++MUX_CFG(DM644X, LOEEN,                0,   24,    1,    1,     true)
++MUX_CFG(DM644X, LFLDEN,               0,   25,    1,    1,     false)
++};
++
++
++/*----------------------------------------------------------------------*/
++
++static const s8 dma_chan_dm644x_no_event[] = {
++       0,  1, 12, 13, 14,
++      15, 25, 30, 31, 45,
++      46, 47, 55, 56, 57,
++      58, 59, 60, 61, 62,
++      63,
++      -1
++};
++
++static struct edma_soc_info dm644x_edma_info = {
++      .n_channel      = 64,
++      .n_region       = 4,
++      .n_slot         = 128,
++      .n_tc           = 2,
++      .noevent        = dma_chan_dm644x_no_event,
++};
++
++static struct resource edma_resources[] = {
++      {
++              .name   = "edma_cc",
++              .start  = 0x01c00000,
++              .end    = 0x01c00000 + SZ_64K - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      {
++              .name   = "edma_tc0",
++              .start  = 0x01c10000,
++              .end    = 0x01c10000 + SZ_1K - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      {
++              .name   = "edma_tc1",
++              .start  = 0x01c10400,
++              .end    = 0x01c10400 + SZ_1K - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      {
++              .start  = IRQ_CCINT0,
++              .flags  = IORESOURCE_IRQ,
++      },
++      {
++              .start  = IRQ_CCERRINT,
++              .flags  = IORESOURCE_IRQ,
++      },
++      /* not using TC*_ERR */
++};
++
++static struct platform_device dm644x_edma_device = {
++      .name                   = "edma",
++      .id                     = -1,
++      .dev.platform_data      = &dm644x_edma_info,
++      .num_resources          = ARRAY_SIZE(edma_resources),
++      .resource               = edma_resources,
++};
++
++/*----------------------------------------------------------------------*/
++void __init dm644x_init(void)
++{
++      davinci_clk_init(dm644x_clks);
++      davinci_mux_register(dm644x_pins, ARRAY_SIZE(dm644x_pins));
++}
++
++static int __init dm644x_init_devices(void)
++{
++      if (!cpu_is_davinci_dm644x())
++              return 0;
++
++      platform_device_register(&dm644x_edma_device);
++      return 0;
++}
++postcore_initcall(dm644x_init_devices);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/dma.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/dma.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/dma.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/dma.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,1135 @@
++/*
++ * EDMA3 support for DaVinci
++ *
++ * Copyright (C) 2006-2009 Texas Instruments.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include <linux/compiler.h>
++#include <linux/io.h>
++
++#include <mach/cputype.h>
++#include <mach/memory.h>
++#include <mach/hardware.h>
++#include <mach/irqs.h>
++#include <mach/edma.h>
++#include <mach/mux.h>
++
++
++/* Offsets matching "struct edmacc_param" */
++#define PARM_OPT              0x00
++#define PARM_SRC              0x04
++#define PARM_A_B_CNT          0x08
++#define PARM_DST              0x0c
++#define PARM_SRC_DST_BIDX     0x10
++#define PARM_LINK_BCNTRLD     0x14
++#define PARM_SRC_DST_CIDX     0x18
++#define PARM_CCNT             0x1c
++
++#define PARM_SIZE             0x20
++
++/* Offsets for EDMA CC global channel registers and their shadows */
++#define SH_ER         0x00    /* 64 bits */
++#define SH_ECR                0x08    /* 64 bits */
++#define SH_ESR                0x10    /* 64 bits */
++#define SH_CER                0x18    /* 64 bits */
++#define SH_EER                0x20    /* 64 bits */
++#define SH_EECR               0x28    /* 64 bits */
++#define SH_EESR               0x30    /* 64 bits */
++#define SH_SER                0x38    /* 64 bits */
++#define SH_SECR               0x40    /* 64 bits */
++#define SH_IER                0x50    /* 64 bits */
++#define SH_IECR               0x58    /* 64 bits */
++#define SH_IESR               0x60    /* 64 bits */
++#define SH_IPR                0x68    /* 64 bits */
++#define SH_ICR                0x70    /* 64 bits */
++#define SH_IEVAL      0x78
++#define SH_QER                0x80
++#define SH_QEER               0x84
++#define SH_QEECR      0x88
++#define SH_QEESR      0x8c
++#define SH_QSER               0x90
++#define SH_QSECR      0x94
++#define SH_SIZE               0x200
++
++/* Offsets for EDMA CC global registers */
++#define EDMA_REV      0x0000
++#define EDMA_CCCFG    0x0004
++#define EDMA_QCHMAP   0x0200  /* 8 registers */
++#define EDMA_DMAQNUM  0x0240  /* 8 registers (4 on OMAP-L1xx) */
++#define EDMA_QDMAQNUM 0x0260
++#define EDMA_QUETCMAP 0x0280
++#define EDMA_QUEPRI   0x0284
++#define EDMA_EMR      0x0300  /* 64 bits */
++#define EDMA_EMCR     0x0308  /* 64 bits */
++#define EDMA_QEMR     0x0310
++#define EDMA_QEMCR    0x0314
++#define EDMA_CCERR    0x0318
++#define EDMA_CCERRCLR 0x031c
++#define EDMA_EEVAL    0x0320
++#define EDMA_DRAE     0x0340  /* 4 x 64 bits*/
++#define EDMA_QRAE     0x0380  /* 4 registers */
++#define EDMA_QUEEVTENTRY      0x0400  /* 2 x 16 registers */
++#define EDMA_QSTAT    0x0600  /* 2 registers */
++#define EDMA_QWMTHRA  0x0620
++#define EDMA_QWMTHRB  0x0624
++#define EDMA_CCSTAT   0x0640
++
++#define EDMA_M                0x1000  /* global channel registers */
++#define EDMA_ECR      0x1008
++#define EDMA_ECRH     0x100C
++#define EDMA_SHADOW0  0x2000  /* 4 regions shadowing global channels */
++#define EDMA_PARM     0x4000  /* 128 param entries */
++
++#define DAVINCI_DMA_3PCC_BASE 0x01C00000
++
++#define PARM_OFFSET(param_no) (EDMA_PARM + ((param_no) << 5))
++
++#define EDMA_MAX_DMACH           64
++#define EDMA_MAX_PARAMENTRY     512
++#define EDMA_MAX_EVQUE            2   /* FIXME too small */
++
++
++/*****************************************************************************/
++
++static void __iomem *edmacc_regs_base;
++
++static inline unsigned int edma_read(int offset)
++{
++      return (unsigned int)__raw_readl(edmacc_regs_base + offset);
++}
++
++static inline void edma_write(int offset, int val)
++{
++      __raw_writel(val, edmacc_regs_base + offset);
++}
++static inline void edma_modify(int offset, unsigned and, unsigned or)
++{
++      unsigned val = edma_read(offset);
++      val &= and;
++      val |= or;
++      edma_write(offset, val);
++}
++static inline void edma_and(int offset, unsigned and)
++{
++      unsigned val = edma_read(offset);
++      val &= and;
++      edma_write(offset, val);
++}
++static inline void edma_or(int offset, unsigned or)
++{
++      unsigned val = edma_read(offset);
++      val |= or;
++      edma_write(offset, val);
++}
++static inline unsigned int edma_read_array(int offset, int i)
++{
++      return edma_read(offset + (i << 2));
++}
++static inline void edma_write_array(int offset, int i, unsigned val)
++{
++      edma_write(offset + (i << 2), val);
++}
++static inline void edma_modify_array(int offset, int i,
++              unsigned and, unsigned or)
++{
++      edma_modify(offset + (i << 2), and, or);
++}
++static inline void edma_or_array(int offset, int i, unsigned or)
++{
++      edma_or(offset + (i << 2), or);
++}
++static inline void edma_or_array2(int offset, int i, int j, unsigned or)
++{
++      edma_or(offset + ((i*2 + j) << 2), or);
++}
++static inline void edma_write_array2(int offset, int i, int j, unsigned val)
++{
++      edma_write(offset + ((i*2 + j) << 2), val);
++}
++static inline unsigned int edma_shadow0_read(int offset)
++{
++      return edma_read(EDMA_SHADOW0 + offset);
++}
++static inline unsigned int edma_shadow0_read_array(int offset, int i)
++{
++      return edma_read(EDMA_SHADOW0 + offset + (i << 2));
++}
++static inline void edma_shadow0_write(int offset, unsigned val)
++{
++      edma_write(EDMA_SHADOW0 + offset, val);
++}
++static inline void edma_shadow0_write_array(int offset, int i, unsigned val)
++{
++      edma_write(EDMA_SHADOW0 + offset + (i << 2), val);
++}
++static inline unsigned int edma_parm_read(int offset, int param_no)
++{
++      return edma_read(EDMA_PARM + offset + (param_no << 5));
++}
++static inline void edma_parm_write(int offset, int param_no, unsigned val)
++{
++      edma_write(EDMA_PARM + offset + (param_no << 5), val);
++}
++static inline void edma_parm_modify(int offset, int param_no,
++              unsigned and, unsigned or)
++{
++      edma_modify(EDMA_PARM + offset + (param_no << 5), and, or);
++}
++static inline void edma_parm_and(int offset, int param_no, unsigned and)
++{
++      edma_and(EDMA_PARM + offset + (param_no << 5), and);
++}
++static inline void edma_parm_or(int offset, int param_no, unsigned or)
++{
++      edma_or(EDMA_PARM + offset + (param_no << 5), or);
++}
++
++/*****************************************************************************/
++
++/* actual number of DMA channels and slots on this silicon */
++static unsigned num_channels;
++static unsigned num_slots;
++
++static struct dma_interrupt_data {
++      void (*callback)(unsigned channel, unsigned short ch_status,
++                       void *data);
++      void *data;
++} intr_data[EDMA_MAX_DMACH];
++
++/* The edma_inuse bit for each PaRAM slot is clear unless the
++ * channel is in use ... by ARM or DSP, for QDMA, or whatever.
++ */
++static DECLARE_BITMAP(edma_inuse, EDMA_MAX_PARAMENTRY);
++
++/* The edma_noevent bit for each channel is clear unless
++ * it doesn't trigger DMA events on this platform.  It uses a
++ * bit of SOC-specific initialization code.
++ */
++static DECLARE_BITMAP(edma_noevent, EDMA_MAX_DMACH);
++
++/* dummy param set used to (re)initialize parameter RAM slots */
++static const struct edmacc_param dummy_paramset = {
++      .link_bcntrld = 0xffff,
++      .ccnt = 1,
++};
++
++static const int __initconst
++queue_tc_mapping[EDMA_MAX_EVQUE + 1][2] = {
++/* {event queue no, TC no} */
++      {0, 0},
++      {1, 1},
++      {-1, -1}
++};
++
++static const int __initconst
++queue_priority_mapping[EDMA_MAX_EVQUE + 1][2] = {
++      /* {event queue no, Priority} */
++      {0, 3},
++      {1, 7},
++      {-1, -1}
++};
++
++/*****************************************************************************/
++
++static void map_dmach_queue(unsigned ch_no, enum dma_event_q queue_no)
++{
++      int bit = (ch_no & 0x7) * 4;
++
++      /* default to low priority queue */
++      if (queue_no == EVENTQ_DEFAULT)
++              queue_no = EVENTQ_1;
++
++      queue_no &= 7;
++      edma_modify_array(EDMA_DMAQNUM, (ch_no >> 3),
++                      ~(0x7 << bit), queue_no << bit);
++}
++
++static void __init map_queue_tc(int queue_no, int tc_no)
++{
++      int bit = queue_no * 4;
++      edma_modify(EDMA_QUETCMAP, ~(0x7 << bit), ((tc_no & 0x7) << bit));
++}
++
++static void __init assign_priority_to_queue(int queue_no, int priority)
++{
++      int bit = queue_no * 4;
++      edma_modify(EDMA_QUEPRI, ~(0x7 << bit), ((priority & 0x7) << bit));
++}
++
++static inline void
++setup_dma_interrupt(unsigned lch,
++      void (*callback)(unsigned channel, u16 ch_status, void *data),
++      void *data)
++{
++      if (!callback) {
++              edma_shadow0_write_array(SH_IECR, lch >> 5,
++                              (1 << (lch & 0x1f)));
++      }
++
++      intr_data[lch].callback = callback;
++      intr_data[lch].data = data;
++
++      if (callback) {
++              edma_shadow0_write_array(SH_ICR, lch >> 5,
++                              (1 << (lch & 0x1f)));
++              edma_shadow0_write_array(SH_IESR, lch >> 5,
++                              (1 << (lch & 0x1f)));
++      }
++}
++
++/******************************************************************************
++ *
++ * DMA interrupt handler
++ *
++ *****************************************************************************/
++static irqreturn_t dma_irq_handler(int irq, void *data)
++{
++      int i;
++      unsigned int cnt = 0;
++
++      dev_dbg(data, "dma_irq_handler\n");
++
++      if ((edma_shadow0_read_array(SH_IPR, 0) == 0)
++          && (edma_shadow0_read_array(SH_IPR, 1) == 0))
++              return IRQ_NONE;
++
++      while (1) {
++              int j;
++              if (edma_shadow0_read_array(SH_IPR, 0))
++                      j = 0;
++              else if (edma_shadow0_read_array(SH_IPR, 1))
++                      j = 1;
++              else
++                      break;
++              dev_dbg(data, "IPR%d %08x\n", j,
++                              edma_shadow0_read_array(SH_IPR, j));
++              for (i = 0; i < 32; i++) {
++                      int k = (j << 5) + i;
++                      if (edma_shadow0_read_array(SH_IPR, j) & (1 << i)) {
++                              /* Clear the corresponding IPR bits */
++                              edma_shadow0_write_array(SH_ICR, j, (1 << i));
++                              if (intr_data[k].callback) {
++                                      intr_data[k].callback(k, DMA_COMPLETE,
++                                              intr_data[k].data);
++                              }
++                      }
++              }
++              cnt++;
++              if (cnt > 10)
++                      break;
++      }
++      edma_shadow0_write(SH_IEVAL, 1);
++      return IRQ_HANDLED;
++}
++
++/******************************************************************************
++ *
++ * DMA error interrupt handler
++ *
++ *****************************************************************************/
++static irqreturn_t dma_ccerr_handler(int irq, void *data)
++{
++      int i;
++      unsigned int cnt = 0;
++
++      dev_dbg(data, "dma_ccerr_handler\n");
++
++      if ((edma_read_array(EDMA_EMR, 0) == 0) &&
++          (edma_read_array(EDMA_EMR, 1) == 0) &&
++          (edma_read(EDMA_QEMR) == 0) && (edma_read(EDMA_CCERR) == 0))
++              return IRQ_NONE;
++
++      while (1) {
++              int j = -1;
++              if (edma_read_array(EDMA_EMR, 0))
++                      j = 0;
++              else if (edma_read_array(EDMA_EMR, 1))
++                      j = 1;
++              if (j >= 0) {
++                      dev_dbg(data, "EMR%d %08x\n", j,
++                                      edma_read_array(EDMA_EMR, j));
++                      for (i = 0; i < 32; i++) {
++                              int k = (j << 5) + i;
++                              if (edma_read_array(EDMA_EMR, j) & (1 << i)) {
++                                      /* Clear the corresponding EMR bits */
++                                      edma_write_array(EDMA_EMCR, j, 1 << i);
++                                      /* Clear any SER */
++                                      edma_shadow0_write_array(SH_SECR, j,
++                                                      (1 << i));
++                                      if (intr_data[k].callback) {
++                                              intr_data[k].callback(k,
++                                                              DMA_CC_ERROR,
++                                                              intr_data
++                                                              [k].data);
++                                      }
++                              }
++                      }
++              } else if (edma_read(EDMA_QEMR)) {
++                      dev_dbg(data, "QEMR %02x\n",
++                              edma_read(EDMA_QEMR));
++                      for (i = 0; i < 8; i++) {
++                              if (edma_read(EDMA_QEMR) & (1 << i)) {
++                                      /* Clear the corresponding IPR bits */
++                                      edma_write(EDMA_QEMCR, 1 << i);
++                                      edma_shadow0_write(SH_QSECR, (1 << i));
++
++                                      /* NOTE:  not reported!! */
++                              }
++                      }
++              } else if (edma_read(EDMA_CCERR)) {
++                      dev_dbg(data, "CCERR %08x\n",
++                              edma_read(EDMA_CCERR));
++                      /* FIXME:  CCERR.BIT(16) ignored!  much better
++                       * to just write CCERRCLR with CCERR value...
++                       */
++                      for (i = 0; i < 8; i++) {
++                              if (edma_read(EDMA_CCERR) & (1 << i)) {
++                                      /* Clear the corresponding IPR bits */
++                                      edma_write(EDMA_CCERRCLR, 1 << i);
++
++                                      /* NOTE:  not reported!! */
++                              }
++                      }
++              }
++              if ((edma_read_array(EDMA_EMR, 0) == 0)
++                  && (edma_read_array(EDMA_EMR, 1) == 0)
++                  && (edma_read(EDMA_QEMR) == 0)
++                  && (edma_read(EDMA_CCERR) == 0)) {
++                      break;
++              }
++              cnt++;
++              if (cnt > 10)
++                      break;
++      }
++      edma_write(EDMA_EEVAL, 1);
++      return IRQ_HANDLED;
++}
++
++/******************************************************************************
++ *
++ * Transfer controller error interrupt handlers
++ *
++ *****************************************************************************/
++
++#define tc_errs_handled       false   /* disabled as long as they're NOPs */
++
++static irqreturn_t dma_tc0err_handler(int irq, void *data)
++{
++      dev_dbg(data, "dma_tc0err_handler\n");
++      return IRQ_HANDLED;
++}
++
++static irqreturn_t dma_tc1err_handler(int irq, void *data)
++{
++      dev_dbg(data, "dma_tc1err_handler\n");
++      return IRQ_HANDLED;
++}
++
++/*-----------------------------------------------------------------------*/
++
++/* Resource alloc/free:  dma channels, parameter RAM slots */
++
++/**
++ * edma_alloc_channel - allocate DMA channel and paired parameter RAM
++ * @channel: specific channel to allocate; negative for "any unmapped channel"
++ * @callback: optional; to be issued on DMA completion or errors
++ * @data: passed to callback
++ * @eventq_no: an EVENTQ_* constant, used to choose which Transfer
++ *    Controller (TC) executes requests using this channel.  Use
++ *    EVENTQ_DEFAULT unless you really need a high priority queue.
++ *
++ * This allocates a DMA channel and its associated parameter RAM slot.
++ * The parameter RAM is initialized to hold a dummy transfer.
++ *
++ * Normal use is to pass a specific channel number as @channel, to make
++ * use of hardware events mapped to that channel.  When the channel will
++ * be used only for software triggering or event chaining, channels not
++ * mapped to hardware events (or mapped to unused events) are preferable.
++ *
++ * DMA transfers start from a channel using edma_start(), or by
++ * chaining.  When the transfer described in that channel's parameter RAM
++ * slot completes, that slot's data may be reloaded through a link.
++ *
++ * DMA errors are only reported to the @callback associated with the
++ * channel driving that transfer, but transfer completion callbacks can
++ * be sent to another channel under control of the TCC field in
++ * the option word of the transfer's parameter RAM set.  Drivers must not
++ * use DMA transfer completion callbacks for channels they did not allocate.
++ * (The same applies to TCC codes used in transfer chaining.)
++ *
++ * Returns the number of the channel, else negative errno.
++ */
++int edma_alloc_channel(int channel,
++              void (*callback)(unsigned channel, u16 ch_status, void *data),
++              void *data,
++              enum dma_event_q eventq_no)
++{
++      if (channel < 0) {
++              channel = 0;
++              for (;;) {
++                      channel = find_next_bit(edma_noevent,
++                                      num_channels, channel);
++                      if (channel == num_channels)
++                              return -ENOMEM;
++                      if (!test_and_set_bit(channel, edma_inuse))
++                              break;
++                      channel++;
++              }
++      } else if (channel >= num_channels) {
++              return -EINVAL;
++      } else if (test_and_set_bit(channel, edma_inuse)) {
++              return -EBUSY;
++      }
++
++      /* ensure access through shadow region 0 */
++      edma_or_array2(EDMA_DRAE, 0, channel >> 5, 1 << (channel & 0x1f));
++
++      /* ensure no events are pending */
++      edma_stop(channel);
++      memcpy_toio(edmacc_regs_base + PARM_OFFSET(channel),
++                      &dummy_paramset, PARM_SIZE);
++
++      if (callback)
++              setup_dma_interrupt(channel, callback, data);
++
++      map_dmach_queue(channel, eventq_no);
++
++      return channel;
++}
++EXPORT_SYMBOL(edma_alloc_channel);
++
++
++/**
++ * edma_free_channel - deallocate DMA channel
++ * @channel: dma channel returned from edma_alloc_channel()
++ *
++ * This deallocates the DMA channel and associated parameter RAM slot
++ * allocated by edma_alloc_channel().
++ *
++ * Callers are responsible for ensuring the channel is inactive, and
++ * will not be reactivated by linking, chaining, or software calls to
++ * edma_start().
++ */
++void edma_free_channel(unsigned channel)
++{
++      if (channel >= num_channels)
++              return;
++
++      setup_dma_interrupt(channel, NULL, NULL);
++      /* REVISIT should probably take out of shadow region 0 */
++
++      memcpy_toio(edmacc_regs_base + PARM_OFFSET(channel),
++                      &dummy_paramset, PARM_SIZE);
++      clear_bit(channel, edma_inuse);
++}
++EXPORT_SYMBOL(edma_free_channel);
++
++/**
++ * edma_alloc_slot - allocate DMA parameter RAM
++ * @slot: specific slot to allocate; negative for "any unused slot"
++ *
++ * This allocates a parameter RAM slot, initializing it to hold a
++ * dummy transfer.  Slots allocated using this routine have not been
++ * mapped to a hardware DMA channel, and will normally be used by
++ * linking to them from a slot associated with a DMA channel.
++ *
++ * Normal use is to pass EDMA_SLOT_ANY as the @slot, but specific
++ * slots may be allocated on behalf of DSP firmware.
++ *
++ * Returns the number of the slot, else negative errno.
++ */
++int edma_alloc_slot(int slot)
++{
++      if (slot < 0) {
++              slot = num_channels;
++              for (;;) {
++                      slot = find_next_zero_bit(edma_inuse,
++                                      num_slots, slot);
++                      if (slot == num_slots)
++                              return -ENOMEM;
++                      if (!test_and_set_bit(slot, edma_inuse))
++                              break;
++              }
++      } else if (slot < num_channels || slot >= num_slots) {
++              return -EINVAL;
++      } else if (test_and_set_bit(slot, edma_inuse)) {
++              return -EBUSY;
++      }
++
++      memcpy_toio(edmacc_regs_base + PARM_OFFSET(slot),
++                      &dummy_paramset, PARM_SIZE);
++
++      return slot;
++}
++EXPORT_SYMBOL(edma_alloc_slot);
++
++/**
++ * edma_free_slot - deallocate DMA parameter RAM
++ * @slot: parameter RAM slot returned from edma_alloc_slot()
++ *
++ * This deallocates the parameter RAM slot allocated by edma_alloc_slot().
++ * Callers are responsible for ensuring the slot is inactive, and will
++ * not be activated.
++ */
++void edma_free_slot(unsigned slot)
++{
++      if (slot < num_channels || slot >= num_slots)
++              return;
++
++      memcpy_toio(edmacc_regs_base + PARM_OFFSET(slot),
++                      &dummy_paramset, PARM_SIZE);
++      clear_bit(slot, edma_inuse);
++}
++EXPORT_SYMBOL(edma_free_slot);
++
++/*-----------------------------------------------------------------------*/
++
++/* Parameter RAM operations (i) -- read/write partial slots */
++
++/**
++ * edma_set_src - set initial DMA source address in parameter RAM slot
++ * @slot: parameter RAM slot being configured
++ * @src_port: physical address of source (memory, controller FIFO, etc)
++ * @addressMode: INCR, except in very rare cases
++ * @fifoWidth: ignored unless @addressMode is FIFO, else specifies the
++ *    width to use when addressing the fifo (e.g. W8BIT, W32BIT)
++ *
++ * Note that the source address is modified during the DMA transfer
++ * according to edma_set_src_index().
++ */
++void edma_set_src(unsigned slot, dma_addr_t src_port,
++                              enum address_mode mode, enum fifo_width width)
++{
++      if (slot < num_slots) {
++              unsigned int i = edma_parm_read(PARM_OPT, slot);
++
++              if (mode) {
++                      /* set SAM and program FWID */
++                      i = (i & ~(EDMA_FWID)) | (SAM | ((width & 0x7) << 8));
++              } else {
++                      /* clear SAM */
++                      i &= ~SAM;
++              }
++              edma_parm_write(PARM_OPT, slot, i);
++
++              /* set the source port address
++                 in source register of param structure */
++              edma_parm_write(PARM_SRC, slot, src_port);
++      }
++}
++EXPORT_SYMBOL(edma_set_src);
++
++/**
++ * edma_set_dest - set initial DMA destination address in parameter RAM slot
++ * @slot: parameter RAM slot being configured
++ * @dest_port: physical address of destination (memory, controller FIFO, etc)
++ * @addressMode: INCR, except in very rare cases
++ * @fifoWidth: ignored unless @addressMode is FIFO, else specifies the
++ *    width to use when addressing the fifo (e.g. W8BIT, W32BIT)
++ *
++ * Note that the destination address is modified during the DMA transfer
++ * according to edma_set_dest_index().
++ */
++void edma_set_dest(unsigned slot, dma_addr_t dest_port,
++                               enum address_mode mode, enum fifo_width width)
++{
++      if (slot < num_slots) {
++              unsigned int i = edma_parm_read(PARM_OPT, slot);
++
++              if (mode) {
++                      /* set DAM and program FWID */
++                      i = (i & ~(EDMA_FWID)) | (DAM | ((width & 0x7) << 8));
++              } else {
++                      /* clear DAM */
++                      i &= ~DAM;
++              }
++              edma_parm_write(PARM_OPT, slot, i);
++              /* set the destination port address
++                 in dest register of param structure */
++              edma_parm_write(PARM_DST, slot, dest_port);
++      }
++}
++EXPORT_SYMBOL(edma_set_dest);
++
++/**
++ * edma_get_position - returns the current transfer points
++ * @slot: parameter RAM slot being examined
++ * @src: pointer to source port position
++ * @dst: pointer to destination port position
++ *
++ * Returns current source and destination addresses for a particular
++ * parameter RAM slot.  Its channel should not be active when this is called.
++ */
++void edma_get_position(unsigned slot, dma_addr_t *src, dma_addr_t *dst)
++{
++      struct edmacc_param temp;
++
++      edma_read_slot(slot, &temp);
++      if (src != NULL)
++              *src = temp.src;
++      if (dst != NULL)
++              *dst = temp.dst;
++}
++EXPORT_SYMBOL(edma_get_position);
++
++/**
++ * edma_set_src_index - configure DMA source address indexing
++ * @slot: parameter RAM slot being configured
++ * @src_bidx: byte offset between source arrays in a frame
++ * @src_cidx: byte offset between source frames in a block
++ *
++ * Offsets are specified to support either contiguous or discontiguous
++ * memory transfers, or repeated access to a hardware register, as needed.
++ * When accessing hardware registers, both offsets are normally zero.
++ */
++void edma_set_src_index(unsigned slot, s16 src_bidx, s16 src_cidx)
++{
++      if (slot < num_slots) {
++              edma_parm_modify(PARM_SRC_DST_BIDX, slot,
++                              0xffff0000, src_bidx);
++              edma_parm_modify(PARM_SRC_DST_CIDX, slot,
++                              0xffff0000, src_cidx);
++      }
++}
++EXPORT_SYMBOL(edma_set_src_index);
++
++/**
++ * edma_set_dest_index - configure DMA destination address indexing
++ * @slot: parameter RAM slot being configured
++ * @dest_bidx: byte offset between destination arrays in a frame
++ * @dest_cidx: byte offset between destination frames in a block
++ *
++ * Offsets are specified to support either contiguous or discontiguous
++ * memory transfers, or repeated access to a hardware register, as needed.
++ * When accessing hardware registers, both offsets are normally zero.
++ */
++void edma_set_dest_index(unsigned slot, s16 dest_bidx, s16 dest_cidx)
++{
++      if (slot < num_slots) {
++              edma_parm_modify(PARM_SRC_DST_BIDX, slot,
++                              0x0000ffff, dest_bidx << 16);
++              edma_parm_modify(PARM_SRC_DST_CIDX, slot,
++                              0x0000ffff, dest_cidx << 16);
++      }
++}
++EXPORT_SYMBOL(edma_set_dest_index);
++
++/**
++ * edma_set_transfer_params - configure DMA transfer parameters
++ * @slot: parameter RAM slot being configured
++ * @acnt: how many bytes per array (at least one)
++ * @bcnt: how many arrays per frame (at least one)
++ * @ccnt: how many frames per block (at least one)
++ * @bcnt_rld: used only for A-Synchronized transfers; this specifies
++ *    the value to reload into bcnt when it decrements to zero
++ * @sync_mode: ASYNC or ABSYNC
++ *
++ * See the EDMA3 documentation to understand how to configure and link
++ * transfers using the fields in PaRAM slots.  If you are not doing it
++ * all at once with edma_write_slot(), you will use this routine
++ * plus two calls each for source and destination, setting the initial
++ * address and saying how to index that address.
++ *
++ * An example of an A-Synchronized transfer is a serial link using a
++ * single word shift register.  In that case, @acnt would be equal to
++ * that word size; the serial controller issues a DMA synchronization
++ * event to transfer each word, and memory access by the DMA transfer
++ * controller will be word-at-a-time.
++ *
++ * An example of an AB-Synchronized transfer is a device using a FIFO.
++ * In that case, @acnt equals the FIFO width and @bcnt equals its depth.
++ * The controller with the FIFO issues DMA synchronization events when
++ * the FIFO threshold is reached, and the DMA transfer controller will
++ * transfer one frame to (or from) the FIFO.  It will probably use
++ * efficient burst modes to access memory.
++ */
++void edma_set_transfer_params(unsigned slot,
++              u16 acnt, u16 bcnt, u16 ccnt,
++              u16 bcnt_rld, enum sync_dimension sync_mode)
++{
++      if (slot < num_slots) {
++              edma_parm_modify(PARM_LINK_BCNTRLD, slot,
++                              0x0000ffff, bcnt_rld << 16);
++              if (sync_mode == ASYNC)
++                      edma_parm_and(PARM_OPT, slot, ~SYNCDIM);
++              else
++                      edma_parm_or(PARM_OPT, slot, SYNCDIM);
++              /* Set the acount, bcount, ccount registers */
++              edma_parm_write(PARM_A_B_CNT, slot, (bcnt << 16) | acnt);
++              edma_parm_write(PARM_CCNT, slot, ccnt);
++      }
++}
++EXPORT_SYMBOL(edma_set_transfer_params);
++
++/**
++ * edma_link - link one parameter RAM slot to another
++ * @from: parameter RAM slot originating the link
++ * @to: parameter RAM slot which is the link target
++ *
++ * The originating slot should not be part of any active DMA transfer.
++ */
++void edma_link(unsigned from, unsigned to)
++{
++      if (from >= num_slots)
++              return;
++      if (to >= num_slots)
++              return;
++      edma_parm_modify(PARM_LINK_BCNTRLD, from, 0xffff0000, PARM_OFFSET(to));
++}
++EXPORT_SYMBOL(edma_link);
++
++/**
++ * edma_unlink - cut link from one parameter RAM slot
++ * @from: parameter RAM slot originating the link
++ *
++ * The originating slot should not be part of any active DMA transfer.
++ * Its link is set to 0xffff.
++ */
++void edma_unlink(unsigned from)
++{
++      if (from >= num_slots)
++              return;
++      edma_parm_or(PARM_LINK_BCNTRLD, from, 0xffff);
++}
++EXPORT_SYMBOL(edma_unlink);
++
++/*-----------------------------------------------------------------------*/
++
++/* Parameter RAM operations (ii) -- read/write whole parameter sets */
++
++/**
++ * edma_write_slot - write parameter RAM data for slot
++ * @slot: number of parameter RAM slot being modified
++ * @param: data to be written into parameter RAM slot
++ *
++ * Use this to assign all parameters of a transfer at once.  This
++ * allows more efficient setup of transfers than issuing multiple
++ * calls to set up those parameters in small pieces, and provides
++ * complete control over all transfer options.
++ */
++void edma_write_slot(unsigned slot, const struct edmacc_param *param)
++{
++      if (slot >= num_slots)
++              return;
++      memcpy_toio(edmacc_regs_base + PARM_OFFSET(slot), param, PARM_SIZE);
++}
++EXPORT_SYMBOL(edma_write_slot);
++
++/**
++ * edma_read_slot - read parameter RAM data from slot
++ * @slot: number of parameter RAM slot being copied
++ * @param: where to store copy of parameter RAM data
++ *
++ * Use this to read data from a parameter RAM slot, perhaps to
++ * save them as a template for later reuse.
++ */
++void edma_read_slot(unsigned slot, struct edmacc_param *param)
++{
++      if (slot >= num_slots)
++              return;
++      memcpy_fromio(param, edmacc_regs_base + PARM_OFFSET(slot), PARM_SIZE);
++}
++EXPORT_SYMBOL(edma_read_slot);
++
++/*-----------------------------------------------------------------------*/
++
++/* Various EDMA channel control operations */
++
++/**
++ * edma_pause - pause dma on a channel
++ * @channel: on which edma_start() has been called
++ *
++ * This temporarily disables EDMA hardware events on the specified channel,
++ * preventing them from triggering new transfers on its behalf
++ */
++void edma_pause(unsigned channel)
++{
++      if (channel < num_channels) {
++              unsigned int mask = (1 << (channel & 0x1f));
++
++              edma_shadow0_write_array(SH_EECR, channel >> 5, mask);
++      }
++}
++EXPORT_SYMBOL(edma_pause);
++
++/**
++ * edma_resume - resumes dma on a paused channel
++ * @channel: on which edma_pause() has been called
++ *
++ * This re-enables EDMA hardware events on the specified channel.
++ */
++void edma_resume(unsigned channel)
++{
++      if (channel < num_channels) {
++              unsigned int mask = (1 << (channel & 0x1f));
++
++              edma_shadow0_write_array(SH_EESR, channel >> 5, mask);
++      }
++}
++EXPORT_SYMBOL(edma_resume);
++
++/**
++ * edma_start - start dma on a channel
++ * @channel: channel being activated
++ *
++ * Channels with event associations will be triggered by their hardware
++ * events, and channels without such associations will be triggered by
++ * software.  (At this writing there is no interface for using software
++ * triggers except with channels that don't support hardware triggers.)
++ *
++ * Returns zero on success, else negative errno.
++ */
++int edma_start(unsigned channel)
++{
++      if (channel < num_channels) {
++              int j = channel >> 5;
++              unsigned int mask = (1 << (channel & 0x1f));
++
++              /* EDMA channels without event association */
++              if (test_bit(channel, edma_noevent)) {
++                      pr_debug("EDMA: ESR%d %08x\n", j,
++                              edma_shadow0_read_array(SH_ESR, j));
++                      edma_shadow0_write_array(SH_ESR, j, mask);
++                      return 0;
++              }
++
++              /* EDMA channel with event association */
++              pr_debug("EDMA: ER%d %08x\n", j,
++                      edma_shadow0_read_array(SH_ER, j));
++              /* Clear any pending error */
++              edma_write_array(EDMA_EMCR, j, mask);
++              /* Clear any SER */
++              edma_shadow0_write_array(SH_SECR, j, mask);
++              edma_shadow0_write_array(SH_EESR, j, mask);
++              pr_debug("EDMA: EER%d %08x\n", j,
++                      edma_shadow0_read_array(SH_EER, j));
++              return 0;
++      }
++
++      return -EINVAL;
++}
++EXPORT_SYMBOL(edma_start);
++
++/**
++ * edma_stop - stops dma on the channel passed
++ * @channel: channel being deactivated
++ *
++ * When @lch is a channel, any active transfer is paused and
++ * all pending hardware events are cleared.  The current transfer
++ * may not be resumed, and the channel's Parameter RAM should be
++ * reinitialized before being reused.
++ */
++void edma_stop(unsigned channel)
++{
++      if (channel < num_channels) {
++              int j = channel >> 5;
++              unsigned int mask = (1 << (channel & 0x1f));
++
++              edma_shadow0_write_array(SH_EECR, j, mask);
++              edma_shadow0_write_array(SH_ECR, j, mask);
++              edma_shadow0_write_array(SH_SECR, j, mask);
++              edma_write_array(EDMA_EMCR, j, mask);
++
++              pr_debug("EDMA: EER%d %08x\n", j,
++                              edma_shadow0_read_array(SH_EER, j));
++
++              /* REVISIT:  consider guarding against inappropriate event
++               * chaining by overwriting with dummy_paramset.
++               */
++      }
++}
++EXPORT_SYMBOL(edma_stop);
++
++/******************************************************************************
++ *
++ * It cleans ParamEntry qand bring back EDMA to initial state if media has
++ * been removed before EDMA has finished.It is usedful for removable media.
++ * Arguments:
++ *      ch_no     - channel no
++ *
++ * Return: zero on success, or corresponding error no on failure
++ *
++ * FIXME this should not be needed ... edma_stop() should suffice.
++ *
++ *****************************************************************************/
++
++void edma_clean_channel(unsigned channel)
++{
++      if (channel < num_channels) {
++              int j = (channel >> 5);
++              unsigned int mask = 1 << (channel & 0x1f);
++
++              pr_debug("EDMA: EMR%d %08x\n", j,
++                              edma_read_array(EDMA_EMR, j));
++              edma_shadow0_write_array(SH_ECR, j, mask);
++              /* Clear the corresponding EMR bits */
++              edma_write_array(EDMA_EMCR, j, mask);
++              /* Clear any SER */
++              edma_shadow0_write_array(SH_SECR, j, mask);
++              edma_write(EDMA_CCERRCLR, (1 << 16) | 0x3);
++      }
++}
++EXPORT_SYMBOL(edma_clean_channel);
++
++/*
++ * edma_clear_event - clear an outstanding event on the DMA channel
++ * Arguments:
++ *    channel - channel number
++ */
++void edma_clear_event(unsigned channel)
++{
++      if (channel >= num_channels)
++              return;
++      if (channel < 32)
++              edma_write(EDMA_ECR, 1 << channel);
++      else
++              edma_write(EDMA_ECRH, 1 << (channel - 32));
++}
++EXPORT_SYMBOL(edma_clear_event);
++
++/*-----------------------------------------------------------------------*/
++
++static int __init edma_probe(struct platform_device *pdev)
++{
++      struct edma_soc_info    *info = pdev->dev.platform_data;
++      int                     i;
++      int                     status;
++      const s8                *noevent;
++      int                     irq = 0, err_irq = 0;
++      struct resource         *r;
++      resource_size_t         len;
++
++      if (!info)
++              return -ENODEV;
++
++      r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "edma_cc");
++      if (!r)
++              return -ENODEV;
++
++      len = r->end - r->start + 1;
++
++      r = request_mem_region(r->start, len, r->name);
++      if (!r)
++              return -EBUSY;
++
++      edmacc_regs_base = ioremap(r->start, len);
++      if (!edmacc_regs_base) {
++              status = -EBUSY;
++              goto fail1;
++      }
++
++      num_channels = min_t(unsigned, info->n_channel, EDMA_MAX_DMACH);
++      num_slots = min_t(unsigned, info->n_slot, EDMA_MAX_PARAMENTRY);
++
++      dev_dbg(&pdev->dev, "DMA REG BASE ADDR=%p\n", edmacc_regs_base);
++
++      for (i = 0; i < num_slots; i++)
++              memcpy_toio(edmacc_regs_base + PARM_OFFSET(i),
++                              &dummy_paramset, PARM_SIZE);
++
++      noevent = info->noevent;
++      if (noevent) {
++              while (*noevent != -1)
++                      set_bit(*noevent++, edma_noevent);
++      }
++
++      irq = platform_get_irq(pdev, 0);
++      status = request_irq(irq, dma_irq_handler, 0, "edma", &pdev->dev);
++      if (status < 0) {
++              dev_dbg(&pdev->dev, "request_irq %d failed --> %d\n",
++                      irq, status);
++              goto fail;
++      }
++
++      err_irq = platform_get_irq(pdev, 1);
++      status = request_irq(err_irq, dma_ccerr_handler, 0,
++                              "edma_error", &pdev->dev);
++      if (status < 0) {
++              dev_dbg(&pdev->dev, "request_irq %d failed --> %d\n",
++                      err_irq, status);
++              goto fail;
++      }
++
++      if (tc_errs_handled) {
++              status = request_irq(IRQ_TCERRINT0, dma_tc0err_handler, 0,
++                                      "edma_tc0", &pdev->dev);
++              if (status < 0) {
++                      dev_dbg(&pdev->dev, "request_irq %d failed --> %d\n",
++                              IRQ_TCERRINT0, status);
++                      return status;
++              }
++              status = request_irq(IRQ_TCERRINT, dma_tc1err_handler, 0,
++                                      "edma_tc1", &pdev->dev);
++              if (status < 0) {
++                      dev_dbg(&pdev->dev, "request_irq %d --> %d\n",
++                              IRQ_TCERRINT, status);
++                      return status;
++              }
++      }
++
++      /* Everything lives on transfer controller 1 until otherwise specified.
++       * This way, long transfers on the low priority queue
++       * started by the codec engine will not cause audio defects.
++       */
++      for (i = 0; i < num_channels; i++)
++              map_dmach_queue(i, EVENTQ_1);
++
++      /* Event queue to TC mapping */
++      for (i = 0; queue_tc_mapping[i][0] != -1; i++)
++              map_queue_tc(queue_tc_mapping[i][0], queue_tc_mapping[i][1]);
++
++      /* Event queue priority mapping */
++      for (i = 0; queue_priority_mapping[i][0] != -1; i++)
++              assign_priority_to_queue(queue_priority_mapping[i][0],
++                                       queue_priority_mapping[i][1]);
++
++      for (i = 0; i < info->n_region; i++) {
++              edma_write_array2(EDMA_DRAE, i, 0, 0x0);
++              edma_write_array2(EDMA_DRAE, i, 1, 0x0);
++              edma_write_array(EDMA_QRAE, i, 0x0);
++      }
++
++      return 0;
++
++fail:
++      if (err_irq)
++              free_irq(err_irq, NULL);
++      if (irq)
++              free_irq(irq, NULL);
++      iounmap(edmacc_regs_base);
++fail1:
++      release_mem_region(r->start, len);
++      return status;
++}
++
++
++static struct platform_driver edma_driver = {
++      .driver.name    = "edma",
++};
++
++static int __init edma_init(void)
++{
++      return platform_driver_probe(&edma_driver, edma_probe);
++}
++arch_initcall(edma_init);
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/gpio.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/gpio.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/gpio.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/gpio.c  2009-05-13 09:46:19.000000000 +0200
+@@ -20,6 +20,7 @@
+ #include <linux/irq.h>
+ #include <linux/bitops.h>
++#include <mach/cputype.h>
+ #include <mach/irqs.h>
+ #include <mach/hardware.h>
+ #include <mach/gpio.h>
+@@ -36,9 +37,10 @@ struct davinci_gpio {
+ static struct davinci_gpio chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];
++static unsigned __initdata ngpio;
+ /* create a non-inlined version */
+-static struct gpio_controller *__iomem __init gpio2controller(unsigned gpio)
++static struct gpio_controller __iomem * __init gpio2controller(unsigned gpio)
+ {
+       return __gpio_to_controller(gpio);
+ }
+@@ -114,9 +116,30 @@ static int __init davinci_gpio_setup(voi
+ {
+       int i, base;
+-      for (i = 0, base = 0;
+-                      i < ARRAY_SIZE(chips);
+-                      i++, base += 32) {
++      /* The gpio banks conceptually expose a segmented bitmap,
++       * and "ngpio" is one more than the largest zero-based
++       * bit index that's valid.
++       */
++      if (cpu_is_davinci_dm355()) {           /* or dm335() */
++              ngpio = 104;
++      } else if (cpu_is_davinci_dm644x()) {   /* or dm337() */
++              ngpio = 71;
++      } else if (cpu_is_davinci_dm646x()) {
++              /* NOTE:  each bank has several "reserved" bits,
++               * unusable as GPIOs.  Only 33 of the GPIO numbers
++               * are usable, and we're not rejecting the others.
++               */
++              ngpio = 43;
++      } else {
++              /* if cpu_is_davinci_dm643x() ngpio = 111 */
++              pr_err("GPIO setup:  how many GPIOs?\n");
++              return -EINVAL;
++      }
++
++      if (WARN_ON(DAVINCI_N_GPIO < ngpio))
++              ngpio = DAVINCI_N_GPIO;
++
++      for (i = 0, base = 0; base < ngpio; i++, base += 32) {
+               chips[i].chip.label = "DaVinci";
+               chips[i].chip.direction_input = davinci_direction_in;
+@@ -125,7 +148,7 @@ static int __init davinci_gpio_setup(voi
+               chips[i].chip.set = davinci_gpio_set;
+               chips[i].chip.base = base;
+-              chips[i].chip.ngpio = DAVINCI_N_GPIO - base;
++              chips[i].chip.ngpio = ngpio - base;
+               if (chips[i].chip.ngpio > 32)
+                       chips[i].chip.ngpio = 32;
+@@ -143,11 +166,11 @@ pure_initcall(davinci_gpio_setup);
+  * We expect irqs will normally be set up as input pins, but they can also be
+  * used as output pins ... which is convenient for testing.
+  *
+- * NOTE:  GPIO0..GPIO7 also have direct INTC hookups, which work in addition
+- * to their GPIOBNK0 irq (but with a bit less overhead).  But we don't have
+- * a good way to hook those up ...
++ * NOTE:  The first few GPIOs also have direct INTC hookups in addition
++ * to their GPIOBNK0 irq, with a bit less overhead but less flexibility
++ * on triggering (e.g. no edge options).  We don't try to use those.
+  *
+- * All those INTC hookups (GPIO0..GPIO7 plus five IRQ banks) can also
++ * All those INTC hookups (direct, plus several IRQ banks) can also
+  * serve as EDMA event triggers.
+  */
+@@ -235,29 +258,42 @@ gpio_irq_handler(unsigned irq, struct ir
+ }
+ /*
+- * NOTE:  for suspend/resume, probably best to make a sysdev (and class)
+- * with its suspend/resume calls hooking into the results of the set_wake()
++ * NOTE:  for suspend/resume, probably best to make a platform_device with
++ * suspend_late/resume_resume calls hooking into results of the set_wake()
+  * calls ... so if no gpios are wakeup events the clock can be disabled,
+  * with outputs left at previously set levels, and so that VDD3P3V.IOPWDN0
+- * can be set appropriately for GPIOV33 pins.
++ * (dm6446) can be set appropriately for GPIOV33 pins.
+  */
+ static int __init davinci_gpio_irq_setup(void)
+ {
+       unsigned        gpio, irq, bank;
++      unsigned        bank_irq;
+       struct clk      *clk;
++      u32             binten = 0;
++
++      if (cpu_is_davinci_dm355()) {           /* or dm335() */
++              bank_irq = IRQ_DM355_GPIOBNK0;
++      } else if (cpu_is_davinci_dm644x()) {
++              bank_irq = IRQ_GPIOBNK0;
++      } else if (cpu_is_davinci_dm646x()) {
++              bank_irq = IRQ_DM646X_GPIOBNK0;
++      } else {
++              printk(KERN_ERR "Don't know first GPIO bank IRQ.\n");
++              return -EINVAL;
++      }
+       clk = clk_get(NULL, "gpio");
+       if (IS_ERR(clk)) {
+               printk(KERN_ERR "Error %ld getting gpio clock?\n",
+                      PTR_ERR(clk));
+-              return 0;
++              return PTR_ERR(clk);
+       }
+-
+       clk_enable(clk);
+-      for (gpio = 0, irq = gpio_to_irq(0), bank = IRQ_GPIOBNK0;
+-           gpio < DAVINCI_N_GPIO; bank++) {
++      for (gpio = 0, irq = gpio_to_irq(0), bank = 0;
++                      gpio < ngpio;
++                      bank++, bank_irq++) {
+               struct gpio_controller  *__iomem g = gpio2controller(gpio);
+               unsigned                i;
+@@ -265,28 +301,28 @@ static int __init davinci_gpio_irq_setup
+               __raw_writel(~0, &g->clr_rising);
+               /* set up all irqs in this bank */
+-              set_irq_chained_handler(bank, gpio_irq_handler);
+-              set_irq_chip_data(bank, g);
+-              set_irq_data(bank, (void *)irq);
++              set_irq_chained_handler(bank_irq, gpio_irq_handler);
++              set_irq_chip_data(bank_irq, g);
++              set_irq_data(bank_irq, (void *)irq);
+-              for (i = 0; i < 16 && gpio < DAVINCI_N_GPIO;
+-                   i++, irq++, gpio++) {
++              for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) {
+                       set_irq_chip(irq, &gpio_irqchip);
+                       set_irq_chip_data(irq, g);
+                       set_irq_handler(irq, handle_simple_irq);
+                       set_irq_flags(irq, IRQF_VALID);
+               }
++
++              binten |= BIT(bank);
+       }
+       /* BINTEN -- per-bank interrupt enable. genirq would also let these
+        * bits be set/cleared dynamically.
+        */
+-      __raw_writel(0x1f, (void *__iomem)
++      __raw_writel(binten, (void *__iomem)
+                    IO_ADDRESS(DAVINCI_GPIO_BASE + 0x08));
+       printk(KERN_INFO "DaVinci: %d gpio irqs\n", irq - gpio_to_irq(0));
+       return 0;
+ }
+-
+ arch_initcall(davinci_gpio_irq_setup);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/id.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/id.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/id.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/id.c    2009-05-13 09:46:19.000000000 +0200
+@@ -15,7 +15,9 @@
+ #include <linux/init.h>
+ #include <linux/io.h>
+-#define JTAG_ID_BASE          0x01c40028
++#define JTAG_ID_BASE          IO_ADDRESS(0x01c40028)
++
++static unsigned int davinci_revision;
+ struct davinci_id {
+       u8      variant;        /* JTAG ID bits 31:28 */
+@@ -33,6 +35,20 @@ static struct davinci_id davinci_ids[] _
+               .manufacturer = 0x017,
+               .type         = 0x64460000,
+       },
++      {
++              /* DM646X */
++              .part_no      = 0xb770,
++              .variant      = 0x0,
++              .manufacturer = 0x017,
++              .type         = 0x64670000,
++      },
++      {
++              /* DM355 */
++              .part_no        = 0xb73b,
++              .variant        = 0x0,
++              .manufacturer   = 0x00f,
++              .type           = 0x03550000,
++      },
+ };
+ /*
+@@ -42,7 +58,7 @@ static u16 __init davinci_get_part_no(vo
+ {
+       u32 dev_id, part_no;
+-      dev_id = davinci_readl(JTAG_ID_BASE);
++      dev_id = __raw_readl(JTAG_ID_BASE);
+       part_no = ((dev_id >> 12) & 0xffff);
+@@ -56,13 +72,19 @@ static u8 __init davinci_get_variant(voi
+ {
+       u32 variant;
+-      variant = davinci_readl(JTAG_ID_BASE);
++      variant = __raw_readl(JTAG_ID_BASE);
+       variant = (variant >> 28) & 0xf;
+       return variant;
+ }
++unsigned int davinci_rev(void)
++{
++      return davinci_revision >> 16;
++}
++EXPORT_SYMBOL(davinci_rev);
++
+ void __init davinci_check_revision(void)
+ {
+       int i;
+@@ -75,7 +97,7 @@ void __init davinci_check_revision(void)
+       /* First check only the major version in a safe way */
+       for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
+               if (part_no == (davinci_ids[i].part_no)) {
+-                      system_rev = davinci_ids[i].type;
++                      davinci_revision = davinci_ids[i].type;
+                       break;
+               }
+       }
+@@ -84,10 +106,11 @@ void __init davinci_check_revision(void)
+       for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
+               if (part_no == davinci_ids[i].part_no &&
+                   variant == davinci_ids[i].variant) {
+-                      system_rev = davinci_ids[i].type;
++                      davinci_revision = davinci_ids[i].type;
+                       break;
+               }
+       }
+-      printk("DaVinci DM%04x variant 0x%x\n", system_rev >> 16, variant);
++      printk(KERN_INFO "DaVinci DM%04x variant 0x%x\n",
++             davinci_rev(), variant);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/board-dm6446evm.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/board-dm6446evm.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/board-dm6446evm.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/board-dm6446evm.h  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,20 @@
++/*
++ * DaVinci DM6446 EVM board specific headers
++ *
++ * Author: Kevin Hilman, Deep Root Systems, LLC
++ *
++ * 2007 (c) Deep Root Systems, LLC. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or ifndef.
++ */
++
++#ifndef _MACH_DAVINCI_DM6446EVM_H
++#define _MACH_DAVINCI_DM6446EVM_H
++
++#include <linux/types.h>
++
++int dm6446evm_eeprom_read(char *buf, off_t off, size_t count);
++int dm6446evm_eeprom_write(char *buf, off_t off, size_t count);
++
++#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/clkdev.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/clkdev.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/clkdev.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/clkdev.h   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,13 @@
++#ifndef __MACH_CLKDEV_H
++#define __MACH_CLKDEV_H
++
++static inline int __clk_get(struct clk *clk)
++{
++      return 1;
++}
++
++static inline void __clk_put(struct clk *clk)
++{
++}
++
++#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/clock.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/clock.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/clock.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/clock.h    2009-05-13 09:46:19.000000000 +0200
+@@ -17,6 +17,5 @@ struct clk;
+ extern int clk_register(struct clk *clk);
+ extern void clk_unregister(struct clk *clk);
+-extern int davinci_clk_init(void);
+ #endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/common.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/common.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/common.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/common.h   2009-05-13 09:46:19.000000000 +0200
+@@ -16,6 +16,12 @@ struct sys_timer;
+ extern struct sys_timer davinci_timer;
++extern void davinci_irq_init(void);
++extern void davinci_map_common_io(void);
++
++/* parameters describe VBUS sourcing for host mode */
++extern void setup_usb(unsigned mA, unsigned potpgt_msec);
++
+ /* parameters describe VBUS sourcing for host mode */
+ extern void setup_usb(unsigned mA, unsigned potpgt_msec);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/cputype.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/cputype.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/cputype.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/cputype.h  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,49 @@
++/*
++ * DaVinci CPU type detection
++ *
++ * Author: Kevin Hilman, Deep Root Systems, LLC
++ *
++ * Defines the cpu_is_*() macros for runtime detection of DaVinci
++ * device type.  In addtion, if support for a given device is not
++ * compiled in to the kernel, the macros return 0 so that
++ * resulting code can be optimized out.
++ *
++ * 2009 (c) Deep Root Systems, LLC. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ */
++#ifndef _ASM_ARCH_CPU_H
++#define _ASM_ARCH_CPU_H
++
++extern unsigned int davinci_rev(void);
++
++#define IS_DAVINCI_CPU(type, id)                      \
++static inline int is_davinci_dm ##type(void)          \
++{                                                     \
++      return (davinci_rev() == (id)) ? 1 : 0;         \
++}
++
++IS_DAVINCI_CPU(644x, 0x6446)
++IS_DAVINCI_CPU(646x, 0x6467)
++IS_DAVINCI_CPU(355, 0x355)
++
++#ifdef CONFIG_ARCH_DAVINCI_DM644x
++#define cpu_is_davinci_dm644x() is_davinci_dm644x()
++#else
++#define cpu_is_davinci_dm644x() 0
++#endif
++
++#ifdef CONFIG_ARCH_DAVINCI_DM646x
++#define cpu_is_davinci_dm646x() is_davinci_dm646x()
++#else
++#define cpu_is_davinci_dm646x() 0
++#endif
++
++#ifdef CONFIG_ARCH_DAVINCI_DM355
++#define cpu_is_davinci_dm355() is_davinci_dm355()
++#else
++#define cpu_is_davinci_dm355() 0
++#endif
++
++#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/dm644x.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/dm644x.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/dm644x.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/dm644x.h   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++ * This file contains the processor specific definitions
++ * of the TI DM644x.
++ *
++ * Copyright (C) 2008 Texas Instruments.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ */
++#ifndef __ASM_ARCH_DM644X_H
++#define __ASM_ARCH_DM644X_H
++
++#include <linux/platform_device.h>
++#include <mach/hardware.h>
++
++#define DM644X_EMAC_BASE              (0x01C80000)
++#define DM644X_EMAC_CNTRL_OFFSET      (0x0000)
++#define DM644X_EMAC_CNTRL_MOD_OFFSET  (0x1000)
++#define DM644X_EMAC_CNTRL_RAM_OFFSET  (0x2000)
++#define DM644X_EMAC_MDIO_OFFSET               (0x4000)
++#define DM644X_EMAC_CNTRL_RAM_SIZE    (0x2000)
++
++void __init dm644x_init(void);
++
++#endif /* __ASM_ARCH_DM644X_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/edma.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/edma.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/edma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/edma.h     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,228 @@
++/*
++ *  TI DAVINCI dma definitions
++ *
++ *  Copyright (C) 2006-2009 Texas Instruments.
++ *
++ *  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  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
++ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
++ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
++ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
++ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
++ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
++ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ *  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.
++ *
++ */
++
++/*
++ * This EDMA3 programming framework exposes two basic kinds of resource:
++ *
++ *  Channel   Triggers transfers, usually from a hardware event but
++ *            also manually or by "chaining" from DMA completions.
++ *            Each channel is coupled to a Parameter RAM (PaRAM) slot.
++ *
++ *  Slot      Each PaRAM slot holds a DMA transfer descriptor (PaRAM
++ *            "set"), source and destination addresses, a link to a
++ *            next PaRAM slot (if any), options for the transfer, and
++ *            instructions for updating those addresses.  There are
++ *            more than twice as many slots as event channels.
++ *
++ * Each PaRAM set describes a sequence of transfers, either for one large
++ * buffer or for several discontiguous smaller buffers.  An EDMA transfer
++ * is driven only from a channel, which performs the transfers specified
++ * in its PaRAM slot until there are no more transfers.  When that last
++ * transfer completes, the "link" field may be used to reload the channel's
++ * PaRAM slot with a new transfer descriptor.
++ *
++ * The EDMA Channel Controller (CC) maps requests from channels into physical
++ * Transfer Controller (TC) requests when the channel triggers (by hardware
++ * or software events, or by chaining).  The two physical DMA channels provided
++ * by the TCs are thus shared by many logical channels.
++ *
++ * DaVinci hardware also has a "QDMA" mechanism which is not currently
++ * supported through this interface.  (DSP firmware uses it though.)
++ */
++
++#ifndef EDMA_H_
++#define EDMA_H_
++
++/* PaRAM slots are laid out like this */
++struct edmacc_param {
++      unsigned int opt;
++      unsigned int src;
++      unsigned int a_b_cnt;
++      unsigned int dst;
++      unsigned int src_dst_bidx;
++      unsigned int link_bcntrld;
++      unsigned int src_dst_cidx;
++      unsigned int ccnt;
++};
++
++#define CCINT0_INTERRUPT     16
++#define CCERRINT_INTERRUPT   17
++#define TCERRINT0_INTERRUPT   18
++#define TCERRINT1_INTERRUPT   19
++
++/* fields in edmacc_param.opt */
++#define SAM           BIT(0)
++#define DAM           BIT(1)
++#define SYNCDIM               BIT(2)
++#define STATIC                BIT(3)
++#define EDMA_FWID     (0x07 << 8)
++#define TCCMODE               BIT(11)
++#define EDMA_TCC(t)   ((t) << 12)
++#define TCINTEN               BIT(20)
++#define ITCINTEN      BIT(21)
++#define TCCHEN                BIT(22)
++#define ITCCHEN               BIT(23)
++
++#define TRWORD (0x7<<2)
++#define PAENTRY (0x1ff<<5)
++
++/* Drivers should avoid using these symbolic names for dm644x
++ * channels, and use platform_device IORESOURCE_DMA resources
++ * instead.  (Other DaVinci chips have different peripherals
++ * and thus have different DMA channel mappings.)
++ */
++#define DAVINCI_DMA_MCBSP_TX              2
++#define DAVINCI_DMA_MCBSP_RX              3
++#define DAVINCI_DMA_VPSS_HIST             4
++#define DAVINCI_DMA_VPSS_H3A              5
++#define DAVINCI_DMA_VPSS_PRVU             6
++#define DAVINCI_DMA_VPSS_RSZ              7
++#define DAVINCI_DMA_IMCOP_IMXINT          8
++#define DAVINCI_DMA_IMCOP_VLCDINT         9
++#define DAVINCI_DMA_IMCO_PASQINT         10
++#define DAVINCI_DMA_IMCOP_DSQINT         11
++#define DAVINCI_DMA_SPI_SPIX             16
++#define DAVINCI_DMA_SPI_SPIR             17
++#define DAVINCI_DMA_UART0_URXEVT0        18
++#define DAVINCI_DMA_UART0_UTXEVT0        19
++#define DAVINCI_DMA_UART1_URXEVT1        20
++#define DAVINCI_DMA_UART1_UTXEVT1        21
++#define DAVINCI_DMA_UART2_URXEVT2        22
++#define DAVINCI_DMA_UART2_UTXEVT2        23
++#define DAVINCI_DMA_MEMSTK_MSEVT         24
++#define DAVINCI_DMA_MMCRXEVT             26
++#define DAVINCI_DMA_MMCTXEVT             27
++#define DAVINCI_DMA_I2C_ICREVT           28
++#define DAVINCI_DMA_I2C_ICXEVT           29
++#define DAVINCI_DMA_GPIO_GPINT0          32
++#define DAVINCI_DMA_GPIO_GPINT1          33
++#define DAVINCI_DMA_GPIO_GPINT2          34
++#define DAVINCI_DMA_GPIO_GPINT3          35
++#define DAVINCI_DMA_GPIO_GPINT4          36
++#define DAVINCI_DMA_GPIO_GPINT5          37
++#define DAVINCI_DMA_GPIO_GPINT6          38
++#define DAVINCI_DMA_GPIO_GPINT7          39
++#define DAVINCI_DMA_GPIO_GPBNKINT0       40
++#define DAVINCI_DMA_GPIO_GPBNKINT1       41
++#define DAVINCI_DMA_GPIO_GPBNKINT2       42
++#define DAVINCI_DMA_GPIO_GPBNKINT3       43
++#define DAVINCI_DMA_GPIO_GPBNKINT4       44
++#define DAVINCI_DMA_TIMER0_TINT0         48
++#define DAVINCI_DMA_TIMER1_TINT1         49
++#define DAVINCI_DMA_TIMER2_TINT2         50
++#define DAVINCI_DMA_TIMER3_TINT3         51
++#define DAVINCI_DMA_PWM0                 52
++#define DAVINCI_DMA_PWM1                 53
++#define DAVINCI_DMA_PWM2                 54
++
++/*ch_status paramater of callback function possible values*/
++#define DMA_COMPLETE 1
++#define DMA_CC_ERROR 2
++#define DMA_TC1_ERROR 3
++#define DMA_TC2_ERROR 4
++
++enum address_mode {
++      INCR = 0,
++      FIFO = 1
++};
++
++enum fifo_width {
++      W8BIT = 0,
++      W16BIT = 1,
++      W32BIT = 2,
++      W64BIT = 3,
++      W128BIT = 4,
++      W256BIT = 5
++};
++
++enum dma_event_q {
++      EVENTQ_0 = 0,
++      EVENTQ_1 = 1,
++      EVENTQ_DEFAULT = -1
++};
++
++enum sync_dimension {
++      ASYNC = 0,
++      ABSYNC = 1
++};
++
++#define EDMA_CHANNEL_ANY              -1      /* for edma_alloc_channel() */
++#define EDMA_SLOT_ANY                 -1      /* for edma_alloc_slot() */
++
++/* alloc/free DMA channels and their dedicated parameter RAM slots */
++int edma_alloc_channel(int channel,
++      void (*callback)(unsigned channel, u16 ch_status, void *data),
++      void *data, enum dma_event_q);
++void edma_free_channel(unsigned channel);
++
++/* alloc/free parameter RAM slots */
++int edma_alloc_slot(int slot);
++void edma_free_slot(unsigned slot);
++
++/* calls that operate on part of a parameter RAM slot */
++void edma_set_src(unsigned slot, dma_addr_t src_port,
++                              enum address_mode mode, enum fifo_width);
++void edma_set_dest(unsigned slot, dma_addr_t dest_port,
++                               enum address_mode mode, enum fifo_width);
++void edma_get_position(unsigned slot, dma_addr_t *src, dma_addr_t *dst);
++void edma_set_src_index(unsigned slot, s16 src_bidx, s16 src_cidx);
++void edma_set_dest_index(unsigned slot, s16 dest_bidx, s16 dest_cidx);
++void edma_set_transfer_params(unsigned slot, u16 acnt, u16 bcnt, u16 ccnt,
++              u16 bcnt_rld, enum sync_dimension sync_mode);
++void edma_link(unsigned from, unsigned to);
++void edma_unlink(unsigned from);
++
++/* calls that operate on an entire parameter RAM slot */
++void edma_write_slot(unsigned slot, const struct edmacc_param *params);
++void edma_read_slot(unsigned slot, struct edmacc_param *params);
++
++/* channel control operations */
++int edma_start(unsigned channel);
++void edma_stop(unsigned channel);
++void edma_clean_channel(unsigned channel);
++void edma_clear_event(unsigned channel);
++void edma_pause(unsigned channel);
++void edma_resume(unsigned channel);
++
++/* UNRELATED TO DMA */
++int davinci_alloc_iram(unsigned size);
++void davinci_free_iram(unsigned addr, unsigned size);
++
++/* platform_data for EDMA driver */
++struct edma_soc_info {
++
++      /* how many dma resources of each type */
++      unsigned        n_channel;
++      unsigned        n_region;
++      unsigned        n_slot;
++      unsigned        n_tc;
++
++      /* list of channels with no even trigger; terminated by "-1" */
++      const s8        *noevent;
++};
++
++#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/gpio.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/gpio.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/gpio.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/gpio.h     2009-05-13 09:46:19.000000000 +0200
+@@ -15,9 +15,11 @@
+ #include <linux/io.h>
+ #include <asm-generic/gpio.h>
+-#include <mach/hardware.h>
++
+ #include <mach/irqs.h>
++#define DAVINCI_GPIO_BASE 0x01C67000
++
+ /*
+  * basic gpio routines
+  *
+@@ -26,23 +28,18 @@
+  * go through boot loaders.
+  *
+  * the gpio clock will be turned on when gpios are used, and you may also
+- * need to pay attention to PINMUX0 and PINMUX1 to be sure those pins are
++ * need to pay attention to PINMUX registers to be sure those pins are
+  * used as gpios, not with other peripherals.
+  *
+  * On-chip GPIOs are numbered 0..(DAVINCI_N_GPIO-1).  For documentation,
+- * and maybe for later updates, code should write GPIO(N) or:
+- *  - GPIOV18(N) for 1.8V pins, N in 0..53; same as GPIO(0)..GPIO(53)
+- *  - GPIOV33(N) for 3.3V pins, N in 0..17; same as GPIO(54)..GPIO(70)
+- *
+- * For GPIO IRQs use gpio_to_irq(GPIO(N)) or gpio_to_irq(GPIOV33(N)) etc
+- * for now, that's != GPIO(N)
++ * and maybe for later updates, code may write GPIO(N).  These may be
++ * all 1.8V signals, all 3.3V ones, or a mix of the two.  A given chip
++ * may not support all the GPIOs in that range.
+  *
+  * GPIOs can also be on external chips, numbered after the ones built-in
+  * to the DaVinci chip.  For now, they won't be usable as IRQ sources.
+  */
+-#define       GPIO(X)         (X)             /* 0 <= X <= 70 */
+-#define       GPIOV18(X)      (X)             /* 1.8V i/o; 0 <= X <= 53 */
+-#define       GPIOV33(X)      ((X)+54)        /* 3.3V i/o; 0 <= X <= 17 */
++#define       GPIO(X)         (X)             /* 0 <= X <= (DAVINCI_N_GPIO - 1) */
+ struct gpio_controller {
+       u32     dir;
+@@ -71,12 +68,14 @@ __gpio_to_controller(unsigned gpio)
+ {
+       void *__iomem ptr;
+-      if (gpio < 32)
++      if (gpio < 32 * 1)
+               ptr = IO_ADDRESS(DAVINCI_GPIO_BASE + 0x10);
+-      else if (gpio < 64)
++      else if (gpio < 32 * 2)
+               ptr = IO_ADDRESS(DAVINCI_GPIO_BASE + 0x38);
+-      else if (gpio < DAVINCI_N_GPIO)
++      else if (gpio < 32 * 3)
+               ptr = IO_ADDRESS(DAVINCI_GPIO_BASE + 0x60);
++      else if (gpio < 32 * 4)
++              ptr = IO_ADDRESS(DAVINCI_GPIO_BASE + 0x88);
+       else
+               ptr = NULL;
+       return ptr;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/hardware.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/hardware.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/hardware.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/hardware.h 2009-05-13 09:46:19.000000000 +0200
+@@ -1,9 +1,9 @@
+ /*
+- * Common hardware definitions
++ * Hardware definitions common to all DaVinci family processors
+  *
+- * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
++ * Author: Kevin Hilman, Deep Root Systems, LLC
+  *
+- * 2007 (c) MontaVista Software, Inc. This file is licensed under
++ * 2007 (c) Deep Root Systems, LLC. This file is licensed under
+  * the terms of the GNU General Public License version 2. This program
+  * is licensed "as is" without any warranty of any kind, whether express
+  * or implied.
+@@ -12,41 +12,16 @@
+ #define __ASM_ARCH_HARDWARE_H
+ /*
+- * Base register addresses
++ * Before you add anything to ths file:
++ *
++ * This header is for defines common to ALL DaVinci family chips.
++ * Anything that is chip specific should go in <chipname>.h,
++ * and the chip/board init code should then explicitly include
++ * <chipname>.h
+  */
+-#define DAVINCI_DMA_3PCC_BASE                 (0x01C00000)
+-#define DAVINCI_DMA_3PTC0_BASE                        (0x01C10000)
+-#define DAVINCI_DMA_3PTC1_BASE                        (0x01C10400)
+-#define DAVINCI_I2C_BASE                      (0x01C21000)
+-#define DAVINCI_PWM0_BASE                     (0x01C22000)
+-#define DAVINCI_PWM1_BASE                     (0x01C22400)
+-#define DAVINCI_PWM2_BASE                     (0x01C22800)
+-#define DAVINCI_SYSTEM_MODULE_BASE            (0x01C40000)
+-#define DAVINCI_PLL_CNTRL0_BASE                       (0x01C40800)
+-#define DAVINCI_PLL_CNTRL1_BASE                       (0x01C40C00)
+-#define DAVINCI_PWR_SLEEP_CNTRL_BASE          (0x01C41000)
+-#define DAVINCI_SYSTEM_DFT_BASE                       (0x01C42000)
+-#define DAVINCI_IEEE1394_BASE                 (0x01C60000)
+-#define DAVINCI_USB_OTG_BASE                  (0x01C64000)
+-#define DAVINCI_CFC_ATA_BASE                  (0x01C66000)
+-#define DAVINCI_SPI_BASE                      (0x01C66800)
+-#define DAVINCI_GPIO_BASE                     (0x01C67000)
+-#define DAVINCI_UHPI_BASE                     (0x01C67800)
+-#define DAVINCI_VPSS_REGS_BASE                        (0x01C70000)
+-#define DAVINCI_EMAC_CNTRL_REGS_BASE          (0x01C80000)
+-#define DAVINCI_EMAC_WRAPPER_CNTRL_REGS_BASE  (0x01C81000)
+-#define DAVINCI_EMAC_WRAPPER_RAM_BASE         (0x01C82000)
+-#define DAVINCI_MDIO_CNTRL_REGS_BASE          (0x01C84000)
+-#define DAVINCI_IMCOP_BASE                    (0x01CC0000)
+-#define DAVINCI_ASYNC_EMIF_CNTRL_BASE         (0x01E00000)
+-#define DAVINCI_VLYNQ_BASE                    (0x01E01000)
+-#define DAVINCI_MCBSP_BASE                    (0x01E02000)
+-#define DAVINCI_MMC_SD_BASE                   (0x01E10000)
+-#define DAVINCI_MS_BASE                               (0x01E20000)
+-#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE      (0x02000000)
+-#define DAVINCI_ASYNC_EMIF_DATA_CE1_BASE      (0x04000000)
+-#define DAVINCI_ASYNC_EMIF_DATA_CE2_BASE      (0x06000000)
+-#define DAVINCI_ASYNC_EMIF_DATA_CE3_BASE      (0x08000000)
+-#define DAVINCI_VLYNQ_REMOTE_BASE             (0x0C000000)
++#define DAVINCI_SYSTEM_MODULE_BASE        0x01C40000
++
++/* System control register offsets */
++#define DM64XX_VDD3P3V_PWDN   0x48
+ #endif /* __ASM_ARCH_HARDWARE_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/io.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/io.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/io.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/io.h       2009-05-13 09:46:19.000000000 +0200
+@@ -40,22 +40,12 @@
+ #else
+ #define IOMEM(x)                ((void __force __iomem *)(x))
+-/*
+- * Functions to access the DaVinci IO region
+- *
+- * NOTE: - Use davinci_read/write[bwl] for physical register addresses
+- *     - Use __raw_read/write[bwl]() for virtual register addresses
+- *     - Use IO_ADDRESS(phys_addr) to convert registers to virtual addresses
+- *     - DO NOT use hardcoded virtual addresses to allow changing the
+- *       IO address space again if needed
+- */
+-#define davinci_readb(a)      __raw_readb(IO_ADDRESS(a))
+-#define davinci_readw(a)      __raw_readw(IO_ADDRESS(a))
+-#define davinci_readl(a)      __raw_readl(IO_ADDRESS(a))
++#define __arch_ioremap(p, s, t)       davinci_ioremap(p, s, t)
++#define __arch_iounmap(v)     davinci_iounmap(v)
+-#define davinci_writeb(v, a)  __raw_writeb(v, IO_ADDRESS(a))
+-#define davinci_writew(v, a)  __raw_writew(v, IO_ADDRESS(a))
+-#define davinci_writel(v, a)  __raw_writel(v, IO_ADDRESS(a))
++void __iomem *davinci_ioremap(unsigned long phys, size_t size,
++                            unsigned int type);
++void davinci_iounmap(volatile void __iomem *addr);
+ #endif /* __ASSEMBLER__ */
+ #endif /* __ASM_ARCH_IO_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/irqs.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/irqs.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/irqs.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/irqs.h     2009-05-13 09:46:19.000000000 +0200
+@@ -96,10 +96,111 @@
+ #define IRQ_EMUINT       63
+ #define DAVINCI_N_AINTC_IRQ   64
+-#define DAVINCI_N_GPIO                71
++#define DAVINCI_N_GPIO                104
+ #define NR_IRQS                       (DAVINCI_N_AINTC_IRQ + DAVINCI_N_GPIO)
+ #define ARCH_TIMER_IRQ IRQ_TINT1_TINT34
++/* DaVinci DM6467-specific Interrupts */
++#define IRQ_DM646X_VP_VERTINT0  0
++#define IRQ_DM646X_VP_VERTINT1  1
++#define IRQ_DM646X_VP_VERTINT2  2
++#define IRQ_DM646X_VP_VERTINT3  3
++#define IRQ_DM646X_VP_ERRINT    4
++#define IRQ_DM646X_RESERVED_1   5
++#define IRQ_DM646X_RESERVED_2   6
++#define IRQ_DM646X_WDINT        7
++#define IRQ_DM646X_CRGENINT0    8
++#define IRQ_DM646X_CRGENINT1    9
++#define IRQ_DM646X_TSIFINT0     10
++#define IRQ_DM646X_TSIFINT1     11
++#define IRQ_DM646X_VDCEINT      12
++#define IRQ_DM646X_USBINT       13
++#define IRQ_DM646X_USBDMAINT    14
++#define IRQ_DM646X_PCIINT       15
++#define IRQ_DM646X_TCERRINT2    20
++#define IRQ_DM646X_TCERRINT3    21
++#define IRQ_DM646X_IDE          22
++#define IRQ_DM646X_HPIINT       23
++#define IRQ_DM646X_EMACRXTHINT  24
++#define IRQ_DM646X_EMACRXINT    25
++#define IRQ_DM646X_EMACTXINT    26
++#define IRQ_DM646X_EMACMISCINT  27
++#define IRQ_DM646X_MCASP0TXINT  28
++#define IRQ_DM646X_MCASP0RXINT  29
++#define IRQ_DM646X_RESERVED_3   31
++#define IRQ_DM646X_MCASP1TXINT  32
++#define IRQ_DM646X_VLQINT       38
++#define IRQ_DM646X_UARTINT2     42
++#define IRQ_DM646X_SPINT0       43
++#define IRQ_DM646X_SPINT1       44
++#define IRQ_DM646X_DSP2ARMINT   45
++#define IRQ_DM646X_RESERVED_4   46
++#define IRQ_DM646X_PSCINT       47
++#define IRQ_DM646X_GPIO0        48
++#define IRQ_DM646X_GPIO1        49
++#define IRQ_DM646X_GPIO2        50
++#define IRQ_DM646X_GPIO3        51
++#define IRQ_DM646X_GPIO4        52
++#define IRQ_DM646X_GPIO5        53
++#define IRQ_DM646X_GPIO6        54
++#define IRQ_DM646X_GPIO7        55
++#define IRQ_DM646X_GPIOBNK0     56
++#define IRQ_DM646X_GPIOBNK1     57
++#define IRQ_DM646X_GPIOBNK2     58
++#define IRQ_DM646X_DDRINT       59
++#define IRQ_DM646X_AEMIFINT     60
++
++/* DaVinci DM355-specific Interrupts */
++#define IRQ_DM355_CCDC_VDINT0 0
++#define IRQ_DM355_CCDC_VDINT1 1
++#define IRQ_DM355_CCDC_VDINT2 2
++#define IRQ_DM355_IPIPE_HST   3
++#define IRQ_DM355_H3AINT      4
++#define IRQ_DM355_IPIPE_SDR   5
++#define IRQ_DM355_IPIPEIFINT  6
++#define IRQ_DM355_OSDINT      7
++#define IRQ_DM355_VENCINT     8
++#define IRQ_DM355_IMCOPINT    11
++#define IRQ_DM355_RTOINT      13
++#define IRQ_DM355_TINT4               13
++#define IRQ_DM355_TINT2_TINT12        13
++#define IRQ_DM355_UARTINT2    14
++#define IRQ_DM355_TINT5               14
++#define IRQ_DM355_TINT2_TINT34        14
++#define IRQ_DM355_TINT6               15
++#define IRQ_DM355_TINT3_TINT12        15
++#define IRQ_DM355_SPINT1_0    17
++#define IRQ_DM355_SPINT1_1    18
++#define IRQ_DM355_SPINT2_0    19
++#define IRQ_DM355_SPINT2_1    21
++#define IRQ_DM355_TINT7               22
++#define IRQ_DM355_TINT3_TINT34        22
++#define IRQ_DM355_SDIOINT0    23
++#define IRQ_DM355_MMCINT0     26
++#define IRQ_DM355_MSINT               26
++#define IRQ_DM355_MMCINT1     27
++#define IRQ_DM355_PWMINT3     28
++#define IRQ_DM355_SDIOINT1    31
++#define IRQ_DM355_SPINT0_0    42
++#define IRQ_DM355_SPINT0_1    43
++#define IRQ_DM355_GPIO0               44
++#define IRQ_DM355_GPIO1               45
++#define IRQ_DM355_GPIO2               46
++#define IRQ_DM355_GPIO3               47
++#define IRQ_DM355_GPIO4               48
++#define IRQ_DM355_GPIO5               49
++#define IRQ_DM355_GPIO6               50
++#define IRQ_DM355_GPIO7               51
++#define IRQ_DM355_GPIO8               52
++#define IRQ_DM355_GPIO9               53
++#define IRQ_DM355_GPIOBNK0    54
++#define IRQ_DM355_GPIOBNK1    55
++#define IRQ_DM355_GPIOBNK2    56
++#define IRQ_DM355_GPIOBNK3    57
++#define IRQ_DM355_GPIOBNK4    58
++#define IRQ_DM355_GPIOBNK5    59
++#define IRQ_DM355_GPIOBNK6    60
++
+ #endif /* __ASM_ARCH_IRQS_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/mux.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/mux.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/mux.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/mux.h      2009-05-13 09:46:19.000000000 +0200
+@@ -1,55 +1,183 @@
+ /*
+- * DaVinci pin multiplexing defines
++ * Table of the DAVINCI register configurations for the PINMUX combinations
+  *
+  * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com>
+  *
++ * Based on linux/include/asm-arm/arch-omap/mux.h:
++ * Copyright (C) 2003 - 2005 Nokia Corporation
++ *
++ * Written by Tony Lindgren
++ *
+  * 2007 (c) MontaVista Software, Inc. This file is licensed under
+  * the terms of the GNU General Public License version 2. This program
+  * is licensed "as is" without any warranty of any kind, whether express
+  * or implied.
++ *
++ * Copyright (C) 2008 Texas Instruments.
+  */
+-#ifndef __ASM_ARCH_MUX_H
+-#define __ASM_ARCH_MUX_H
+-#define DAVINCI_MUX_AEAW0     0
+-#define DAVINCI_MUX_AEAW1     1
+-#define DAVINCI_MUX_AEAW2     2
+-#define DAVINCI_MUX_AEAW3     3
+-#define DAVINCI_MUX_AEAW4     4
+-#define DAVINCI_MUX_AECS4     10
+-#define DAVINCI_MUX_AECS5     11
+-#define DAVINCI_MUX_VLYNQWD0  12
+-#define DAVINCI_MUX_VLYNQWD1  13
+-#define DAVINCI_MUX_VLSCREN   14
+-#define DAVINCI_MUX_VLYNQEN   15
+-#define DAVINCI_MUX_HDIREN    16
+-#define DAVINCI_MUX_ATAEN     17
+-#define DAVINCI_MUX_RGB666    22
+-#define DAVINCI_MUX_RGB888    23
+-#define DAVINCI_MUX_LOEEN     24
+-#define DAVINCI_MUX_LFLDEN    25
+-#define DAVINCI_MUX_CWEN      26
+-#define DAVINCI_MUX_CFLDEN    27
+-#define DAVINCI_MUX_HPIEN     29
+-#define DAVINCI_MUX_1394EN    30
+-#define DAVINCI_MUX_EMACEN    31
+-
+-#define DAVINCI_MUX_LEVEL2    32
+-#define DAVINCI_MUX_UART0     (DAVINCI_MUX_LEVEL2 + 0)
+-#define DAVINCI_MUX_UART1     (DAVINCI_MUX_LEVEL2 + 1)
+-#define DAVINCI_MUX_UART2     (DAVINCI_MUX_LEVEL2 + 2)
+-#define DAVINCI_MUX_U2FLO     (DAVINCI_MUX_LEVEL2 + 3)
+-#define DAVINCI_MUX_PWM0      (DAVINCI_MUX_LEVEL2 + 4)
+-#define DAVINCI_MUX_PWM1      (DAVINCI_MUX_LEVEL2 + 5)
+-#define DAVINCI_MUX_PWM2      (DAVINCI_MUX_LEVEL2 + 6)
+-#define DAVINCI_MUX_I2C               (DAVINCI_MUX_LEVEL2 + 7)
+-#define DAVINCI_MUX_SPI               (DAVINCI_MUX_LEVEL2 + 8)
+-#define DAVINCI_MUX_MSTK      (DAVINCI_MUX_LEVEL2 + 9)
+-#define DAVINCI_MUX_ASP               (DAVINCI_MUX_LEVEL2 + 10)
+-#define DAVINCI_MUX_CLK0      (DAVINCI_MUX_LEVEL2 + 16)
+-#define DAVINCI_MUX_CLK1      (DAVINCI_MUX_LEVEL2 + 17)
+-#define DAVINCI_MUX_TIMIN     (DAVINCI_MUX_LEVEL2 + 18)
++#ifndef __INC_MACH_MUX_H
++#define __INC_MACH_MUX_H
++
++/* System module registers */
++#define PINMUX0                       0x00
++#define PINMUX1                       0x04
++/* dm355 only */
++#define PINMUX2                       0x08
++#define PINMUX3                       0x0c
++#define PINMUX4                       0x10
++#define INTMUX                        0x18
++#define EVTMUX                        0x1c
++
++struct mux_config {
++      const char *name;
++      const char *mux_reg_name;
++      const unsigned char mux_reg;
++      const unsigned char mask_offset;
++      const unsigned char mask;
++      const unsigned char mode;
++      bool debug;
++};
++
++enum davinci_dm644x_index {
++      /* ATA and HDDIR functions */
++      DM644X_HDIREN,
++      DM644X_ATAEN,
++      DM644X_ATAEN_DISABLE,
++
++      /* HPI functions */
++      DM644X_HPIEN_DISABLE,
++
++      /* AEAW functions */
++      DM644X_AEAW,
++
++      /* Memory Stick */
++      DM644X_MSTK,
++
++      /* I2C */
++      DM644X_I2C,
++
++      /* ASP function */
++      DM644X_MCBSP,
++
++      /* UART1 */
++      DM644X_UART1,
++
++      /* UART2 */
++      DM644X_UART2,
++
++      /* PWM0 */
++      DM644X_PWM0,
++
++      /* PWM1 */
++      DM644X_PWM1,
++
++      /* PWM2 */
++      DM644X_PWM2,
++
++      /* VLYNQ function */
++      DM644X_VLYNQEN,
++      DM644X_VLSCREN,
++      DM644X_VLYNQWD,
++
++      /* EMAC and MDIO function */
++      DM644X_EMACEN,
++
++      /* GPIO3V[0:16] pins */
++      DM644X_GPIO3V,
++
++      /* GPIO pins */
++      DM644X_GPIO0,
++      DM644X_GPIO3,
++      DM644X_GPIO43_44,
++      DM644X_GPIO46_47,
++
++      /* VPBE */
++      DM644X_RGB666,
++
++      /* LCD */
++      DM644X_LOEEN,
++      DM644X_LFLDEN,
++};
++
++enum davinci_dm646x_index {
++      /* ATA function */
++      DM646X_ATAEN,
++
++      /* AUDIO Clock */
++      DM646X_AUDCK1,
++      DM646X_AUDCK0,
++
++      /* CRGEN Control */
++      DM646X_CRGMUX,
++
++      /* VPIF Control */
++      DM646X_STSOMUX_DISABLE,
++      DM646X_STSIMUX_DISABLE,
++      DM646X_PTSOMUX_DISABLE,
++      DM646X_PTSIMUX_DISABLE,
++
++      /* TSIF Control */
++      DM646X_STSOMUX,
++      DM646X_STSIMUX,
++      DM646X_PTSOMUX_PARALLEL,
++      DM646X_PTSIMUX_PARALLEL,
++      DM646X_PTSOMUX_SERIAL,
++      DM646X_PTSIMUX_SERIAL,
++};
++
++enum davinci_dm355_index {
++      /* MMC/SD 0 */
++      DM355_MMCSD0,
++
++      /* MMC/SD 1 */
++      DM355_SD1_CLK,
++      DM355_SD1_CMD,
++      DM355_SD1_DATA3,
++      DM355_SD1_DATA2,
++      DM355_SD1_DATA1,
++      DM355_SD1_DATA0,
++
++      /* I2C */
++      DM355_I2C_SDA,
++      DM355_I2C_SCL,
++
++      /* ASP0 function */
++      DM355_MCBSP0_BDX,
++      DM355_MCBSP0_X,
++      DM355_MCBSP0_BFSX,
++      DM355_MCBSP0_BDR,
++      DM355_MCBSP0_R,
++      DM355_MCBSP0_BFSR,
++
++      /* SPI0 */
++      DM355_SPI0_SDI,
++      DM355_SPI0_SDENA0,
++      DM355_SPI0_SDENA1,
++
++      /* IRQ muxing */
++      DM355_INT_EDMA_CC,
++      DM355_INT_EDMA_TC0_ERR,
++      DM355_INT_EDMA_TC1_ERR,
++
++      /* EDMA event muxing */
++      DM355_EVT8_ASP1_TX,
++      DM355_EVT9_ASP1_RX,
++      DM355_EVT26_MMC0_RX,
++};
+-extern void davinci_mux_peripheral(unsigned int mux, unsigned int enable);
++#ifdef CONFIG_DAVINCI_MUX
++/* setup pin muxing */
++extern void davinci_mux_init(void);
++extern int davinci_mux_register(const struct mux_config *pins,
++                              unsigned long size);
++extern int davinci_cfg_reg(unsigned long reg_cfg);
++#else
++/* boot loader does it all (no warnings from CONFIG_DAVINCI_MUX_WARNINGS) */
++static inline void davinci_mux_init(void) {}
++static inline int davinci_mux_register(const struct mux_config *pins,
++                                     unsigned long size) { return 0; }
++static inline int davinci_cfg_reg(unsigned long reg_cfg) { return 0; }
++#endif
+-#endif /* __ASM_ARCH_MUX_H */
++#endif /* __INC_MACH_MUX_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/psc.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/psc.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/psc.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/psc.h      2009-05-13 09:46:19.000000000 +0200
+@@ -38,8 +38,6 @@
+ #define DAVINCI_LPSC_TPTC1          4
+ #define DAVINCI_LPSC_EMAC           5
+ #define DAVINCI_LPSC_EMAC_WRAPPER   6
+-#define DAVINCI_LPSC_MDIO           7
+-#define DAVINCI_LPSC_IEEE1394       8
+ #define DAVINCI_LPSC_USB            9
+ #define DAVINCI_LPSC_ATA            10
+ #define DAVINCI_LPSC_VLYNQ          11
+@@ -47,7 +45,6 @@
+ #define DAVINCI_LPSC_DDR_EMIF       13
+ #define DAVINCI_LPSC_AEMIF          14
+ #define DAVINCI_LPSC_MMC_SD         15
+-#define DAVINCI_LPSC_MEMSTICK       16
+ #define DAVINCI_LPSC_McBSP          17
+ #define DAVINCI_LPSC_I2C            18
+ #define DAVINCI_LPSC_UART0          19
+@@ -73,4 +70,54 @@
+ #define DAVINCI_LPSC_GEM            39
+ #define DAVINCI_LPSC_IMCOP          40
++#define DM355_LPSC_TIMER3             5
++#define DM355_LPSC_SPI1                       6
++#define DM355_LPSC_MMC_SD1            7
++#define DM355_LPSC_McBSP1             8
++#define DM355_LPSC_PWM3                       10
++#define DM355_LPSC_SPI2                       11
++#define DM355_LPSC_RTO                        12
++#define DM355_LPSC_VPSS_DAC           41
++
++/*
++ * LPSC Assignments
++ */
++#define DM646X_LPSC_ARM            0
++#define DM646X_LPSC_C64X_CPU       1
++#define DM646X_LPSC_HDVICP0        2
++#define DM646X_LPSC_HDVICP1        3
++#define DM646X_LPSC_TPCC           4
++#define DM646X_LPSC_TPTC0          5
++#define DM646X_LPSC_TPTC1          6
++#define DM646X_LPSC_TPTC2          7
++#define DM646X_LPSC_TPTC3          8
++#define DM646X_LPSC_PCI            13
++#define DM646X_LPSC_EMAC           14
++#define DM646X_LPSC_VDCE           15
++#define DM646X_LPSC_VPSSMSTR       16
++#define DM646X_LPSC_VPSSSLV        17
++#define DM646X_LPSC_TSIF0          18
++#define DM646X_LPSC_TSIF1          19
++#define DM646X_LPSC_DDR_EMIF       20
++#define DM646X_LPSC_AEMIF          21
++#define DM646X_LPSC_McASP0         22
++#define DM646X_LPSC_McASP1         23
++#define DM646X_LPSC_CRGEN0         24
++#define DM646X_LPSC_CRGEN1         25
++#define DM646X_LPSC_UART0          26
++#define DM646X_LPSC_UART1          27
++#define DM646X_LPSC_UART2          28
++#define DM646X_LPSC_PWM0           29
++#define DM646X_LPSC_PWM1           30
++#define DM646X_LPSC_I2C            31
++#define DM646X_LPSC_SPI            32
++#define DM646X_LPSC_GPIO           33
++#define DM646X_LPSC_TIMER0         34
++#define DM646X_LPSC_TIMER1         35
++#define DM646X_LPSC_ARM_INTC       45
++
++extern int davinci_psc_is_clk_active(unsigned int id);
++extern void davinci_psc_config(unsigned int domain, unsigned int id,
++                             char enable);
++
+ #endif /* __ASM_ARCH_PSC_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/serial.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/serial.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/include/mach/serial.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/include/mach/serial.h   2009-05-13 09:46:19.000000000 +0200
+@@ -13,8 +13,23 @@
+ #include <mach/io.h>
+-#define DAVINCI_UART0_BASE   (IO_PHYS + 0x20000)
+-#define DAVINCI_UART1_BASE   (IO_PHYS + 0x20400)
+-#define DAVINCI_UART2_BASE   (IO_PHYS + 0x20800)
++#define DAVINCI_MAX_NR_UARTS  3
++#define DAVINCI_UART0_BASE    (IO_PHYS + 0x20000)
++#define DAVINCI_UART1_BASE    (IO_PHYS + 0x20400)
++#define DAVINCI_UART2_BASE    (IO_PHYS + 0x20800)
++
++#define DM355_UART2_BASE      (IO_PHYS + 0x206000)
++
++/* DaVinci UART register offsets */
++#define UART_DAVINCI_PWREMU           0x0c
++#define UART_DM646X_SCR                       0x10
++#define UART_DM646X_SCR_TX_WATERMARK  0x08
++
++struct davinci_uart_config {
++      /* Bit field of UARTs present; bit 0 --> UART1 */
++      unsigned int enabled_uarts;
++};
++
++extern void davinci_serial_init(struct davinci_uart_config *);
+ #endif /* __ASM_ARCH_SERIAL_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/io.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/io.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/io.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/io.c    2009-05-13 09:46:19.000000000 +0200
+@@ -51,7 +51,26 @@ void __init davinci_map_common_io(void)
+       davinci_check_revision();
+ }
+-void __init davinci_init_common_hw(void)
++#define BETWEEN(p, st, sz)    ((p) >= (st) && (p) < ((st) + (sz)))
++#define XLATE(p, pst, vst)    ((void __iomem *)((p) - (pst) + (vst)))
++
++/*
++ * Intercept ioremap() requests for addresses in our fixed mapping regions.
++ */
++void __iomem *davinci_ioremap(unsigned long p, size_t size, unsigned int type)
++{
++      if (BETWEEN(p, IO_PHYS, IO_SIZE))
++              return XLATE(p, IO_PHYS, IO_VIRT);
++
++      return __arm_ioremap(p, size, type);
++}
++EXPORT_SYMBOL(davinci_ioremap);
++
++void davinci_iounmap(volatile void __iomem *addr)
+ {
+-      davinci_clk_init();
++      unsigned long virt = (unsigned long)addr;
++
++      if (virt >= VMALLOC_START && virt < VMALLOC_END)
++              __iounmap(addr);
+ }
++EXPORT_SYMBOL(davinci_iounmap);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/irq.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/irq.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/irq.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/irq.c   2009-05-13 09:46:19.000000000 +0200
+@@ -25,6 +25,7 @@
+ #include <linux/io.h>
+ #include <mach/hardware.h>
++#include <mach/cputype.h>
+ #include <asm/mach/irq.h>
+ #define IRQ_BIT(irq)          ((irq) & 0x1f)
+@@ -40,14 +41,18 @@
+ #define IRQ_INTPRI0_REG_OFFSET        0x0030
+ #define IRQ_INTPRI7_REG_OFFSET        0x004C
++const u8 *davinci_def_priorities;
++
++#define INTC_BASE IO_ADDRESS(DAVINCI_ARM_INTC_BASE)
++
+ static inline unsigned int davinci_irq_readl(int offset)
+ {
+-      return davinci_readl(DAVINCI_ARM_INTC_BASE + offset);
++      return __raw_readl(INTC_BASE + offset);
+ }
+ static inline void davinci_irq_writel(unsigned long value, int offset)
+ {
+-      davinci_writel(value, DAVINCI_ARM_INTC_BASE + offset);
++      __raw_writel(value, INTC_BASE + offset);
+ }
+ /* Disable interrupt */
+@@ -108,9 +113,8 @@ static struct irq_chip davinci_irq_chip_
+       .unmask = davinci_unmask_irq,
+ };
+-
+ /* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
+-static const u8 default_priorities[DAVINCI_N_AINTC_IRQ] __initdata = {
++static const u8 dm644x_default_priorities[DAVINCI_N_AINTC_IRQ] __initdata = {
+       [IRQ_VDINT0]            = 2,
+       [IRQ_VDINT1]            = 6,
+       [IRQ_VDINT2]            = 6,
+@@ -177,11 +181,149 @@ static const u8 default_priorities[DAVIN
+       [IRQ_EMUINT]            = 7,
+ };
++static const u8 dm646x_default_priorities[DAVINCI_N_AINTC_IRQ] = {
++      [IRQ_DM646X_VP_VERTINT0]        = 7,
++      [IRQ_DM646X_VP_VERTINT1]        = 7,
++      [IRQ_DM646X_VP_VERTINT2]        = 7,
++      [IRQ_DM646X_VP_VERTINT3]        = 7,
++      [IRQ_DM646X_VP_ERRINT]          = 7,
++      [IRQ_DM646X_RESERVED_1]         = 7,
++      [IRQ_DM646X_RESERVED_2]         = 7,
++      [IRQ_DM646X_WDINT]              = 7,
++      [IRQ_DM646X_CRGENINT0]          = 7,
++      [IRQ_DM646X_CRGENINT1]          = 7,
++      [IRQ_DM646X_TSIFINT0]           = 7,
++      [IRQ_DM646X_TSIFINT1]           = 7,
++      [IRQ_DM646X_VDCEINT]            = 7,
++      [IRQ_DM646X_USBINT]             = 7,
++      [IRQ_DM646X_USBDMAINT]          = 7,
++      [IRQ_DM646X_PCIINT]             = 7,
++      [IRQ_CCINT0]                    = 7,    /* dma */
++      [IRQ_CCERRINT]                  = 7,    /* dma */
++      [IRQ_TCERRINT0]                 = 7,    /* dma */
++      [IRQ_TCERRINT]                  = 7,    /* dma */
++      [IRQ_DM646X_TCERRINT2]          = 7,
++      [IRQ_DM646X_TCERRINT3]          = 7,
++      [IRQ_DM646X_IDE]                = 7,
++      [IRQ_DM646X_HPIINT]             = 7,
++      [IRQ_DM646X_EMACRXTHINT]        = 7,
++      [IRQ_DM646X_EMACRXINT]          = 7,
++      [IRQ_DM646X_EMACTXINT]          = 7,
++      [IRQ_DM646X_EMACMISCINT]        = 7,
++      [IRQ_DM646X_MCASP0TXINT]        = 7,
++      [IRQ_DM646X_MCASP0RXINT]        = 7,
++      [IRQ_AEMIFINT]                  = 7,
++      [IRQ_DM646X_RESERVED_3]         = 7,
++      [IRQ_DM646X_MCASP1TXINT]        = 7,    /* clockevent */
++      [IRQ_TINT0_TINT34]              = 7,    /* clocksource */
++      [IRQ_TINT1_TINT12]              = 7,    /* DSP timer */
++      [IRQ_TINT1_TINT34]              = 7,    /* system tick */
++      [IRQ_PWMINT0]                   = 7,
++      [IRQ_PWMINT1]                   = 7,
++      [IRQ_DM646X_VLQINT]             = 7,
++      [IRQ_I2C]                       = 7,
++      [IRQ_UARTINT0]                  = 7,
++      [IRQ_UARTINT1]                  = 7,
++      [IRQ_DM646X_UARTINT2]           = 7,
++      [IRQ_DM646X_SPINT0]             = 7,
++      [IRQ_DM646X_SPINT1]             = 7,
++      [IRQ_DM646X_DSP2ARMINT]         = 7,
++      [IRQ_DM646X_RESERVED_4]         = 7,
++      [IRQ_DM646X_PSCINT]             = 7,
++      [IRQ_DM646X_GPIO0]              = 7,
++      [IRQ_DM646X_GPIO1]              = 7,
++      [IRQ_DM646X_GPIO2]              = 7,
++      [IRQ_DM646X_GPIO3]              = 7,
++      [IRQ_DM646X_GPIO4]              = 7,
++      [IRQ_DM646X_GPIO5]              = 7,
++      [IRQ_DM646X_GPIO6]              = 7,
++      [IRQ_DM646X_GPIO7]              = 7,
++      [IRQ_DM646X_GPIOBNK0]           = 7,
++      [IRQ_DM646X_GPIOBNK1]           = 7,
++      [IRQ_DM646X_GPIOBNK2]           = 7,
++      [IRQ_DM646X_DDRINT]             = 7,
++      [IRQ_DM646X_AEMIFINT]           = 7,
++      [IRQ_COMMTX]                    = 7,
++      [IRQ_COMMRX]                    = 7,
++      [IRQ_EMUINT]                    = 7,
++};
++
++static const u8 dm355_default_priorities[DAVINCI_N_AINTC_IRQ] = {
++      [IRQ_DM355_CCDC_VDINT0]         = 2,
++      [IRQ_DM355_CCDC_VDINT1]         = 6,
++      [IRQ_DM355_CCDC_VDINT2]         = 6,
++      [IRQ_DM355_IPIPE_HST]           = 6,
++      [IRQ_DM355_H3AINT]              = 6,
++      [IRQ_DM355_IPIPE_SDR]           = 6,
++      [IRQ_DM355_IPIPEIFINT]          = 6,
++      [IRQ_DM355_OSDINT]              = 7,
++      [IRQ_DM355_VENCINT]             = 6,
++      [IRQ_ASQINT]                    = 6,
++      [IRQ_IMXINT]                    = 6,
++      [IRQ_USBINT]                    = 4,
++      [IRQ_DM355_RTOINT]              = 4,
++      [IRQ_DM355_UARTINT2]            = 7,
++      [IRQ_DM355_TINT6]               = 7,
++      [IRQ_CCINT0]                    = 5,    /* dma */
++      [IRQ_CCERRINT]                  = 5,    /* dma */
++      [IRQ_TCERRINT0]                 = 5,    /* dma */
++      [IRQ_TCERRINT]                  = 5,    /* dma */
++      [IRQ_DM355_SPINT2_1]            = 7,
++      [IRQ_DM355_TINT7]               = 4,
++      [IRQ_DM355_SDIOINT0]            = 7,
++      [IRQ_MBXINT]                    = 7,
++      [IRQ_MBRINT]                    = 7,
++      [IRQ_MMCINT]                    = 7,
++      [IRQ_DM355_MMCINT1]             = 7,
++      [IRQ_DM355_PWMINT3]             = 7,
++      [IRQ_DDRINT]                    = 7,
++      [IRQ_AEMIFINT]                  = 7,
++      [IRQ_DM355_SDIOINT1]            = 4,
++      [IRQ_TINT0_TINT12]              = 2,    /* clockevent */
++      [IRQ_TINT0_TINT34]              = 2,    /* clocksource */
++      [IRQ_TINT1_TINT12]              = 7,    /* DSP timer */
++      [IRQ_TINT1_TINT34]              = 7,    /* system tick */
++      [IRQ_PWMINT0]                   = 7,
++      [IRQ_PWMINT1]                   = 7,
++      [IRQ_PWMINT2]                   = 7,
++      [IRQ_I2C]                       = 3,
++      [IRQ_UARTINT0]                  = 3,
++      [IRQ_UARTINT1]                  = 3,
++      [IRQ_DM355_SPINT0_0]            = 3,
++      [IRQ_DM355_SPINT0_1]            = 3,
++      [IRQ_DM355_GPIO0]               = 3,
++      [IRQ_DM355_GPIO1]               = 7,
++      [IRQ_DM355_GPIO2]               = 4,
++      [IRQ_DM355_GPIO3]               = 4,
++      [IRQ_DM355_GPIO4]               = 7,
++      [IRQ_DM355_GPIO5]               = 7,
++      [IRQ_DM355_GPIO6]               = 7,
++      [IRQ_DM355_GPIO7]               = 7,
++      [IRQ_DM355_GPIO8]               = 7,
++      [IRQ_DM355_GPIO9]               = 7,
++      [IRQ_DM355_GPIOBNK0]            = 7,
++      [IRQ_DM355_GPIOBNK1]            = 7,
++      [IRQ_DM355_GPIOBNK2]            = 7,
++      [IRQ_DM355_GPIOBNK3]            = 7,
++      [IRQ_DM355_GPIOBNK4]            = 7,
++      [IRQ_DM355_GPIOBNK5]            = 7,
++      [IRQ_DM355_GPIOBNK6]            = 7,
++      [IRQ_COMMTX]                    = 7,
++      [IRQ_COMMRX]                    = 7,
++      [IRQ_EMUINT]                    = 7,
++};
++
+ /* ARM Interrupt Controller Initialization */
+ void __init davinci_irq_init(void)
+ {
+       unsigned i;
+-      const u8 *priority = default_priorities;
++
++      if (cpu_is_davinci_dm644x())
++              davinci_def_priorities = dm644x_default_priorities;
++      else if (cpu_is_davinci_dm646x())
++              davinci_def_priorities = dm646x_default_priorities;
++      else if (cpu_is_davinci_dm355())
++              davinci_def_priorities = dm355_default_priorities;
+       /* Clear all interrupt requests */
+       davinci_irq_writel(~0x0, FIQ_REG0_OFFSET);
+@@ -209,8 +351,8 @@ void __init davinci_irq_init(void)
+               unsigned        j;
+               u32             pri;
+-              for (j = 0, pri = 0; j < 32; j += 4, priority++)
+-                      pri |= (*priority & 0x07) << j;
++              for (j = 0, pri = 0; j < 32; j += 4, davinci_def_priorities++)
++                      pri |= (*davinci_def_priorities & 0x07) << j;
+               davinci_irq_writel(pri, i);
+       }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/Kconfig linux-2.6.30-rc4-git/arch/arm/mach-davinci/Kconfig
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/Kconfig     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/Kconfig 2009-05-13 09:46:19.000000000 +0200
+@@ -4,19 +4,56 @@ menu "TI DaVinci Implementations"
+ comment "DaVinci Core Type"
+-config ARCH_DAVINCI644x
+-      default y
++config ARCH_DAVINCI_DM644x
+       bool "DaVinci 644x based system"
+ comment "DaVinci Board Type"
+ config MACH_DAVINCI_EVM
+-      bool "TI DaVinci EVM"
++      bool "TI DM644x EVM"
+       default y
+-      depends on ARCH_DAVINCI644x
++      depends on ARCH_DAVINCI_DM644x
+       help
+         Configure this option to specify the whether the board used
+-        for development is a DaVinci EVM
++        for development is a DM644x EVM
++
++
++config DAVINCI_MUX
++      bool "DAVINCI multiplexing support"
++      depends on ARCH_DAVINCI
++      default y
++      help
++        Pin multiplexing support for DAVINCI boards. If your bootloader
++        sets the multiplexing correctly, say N. Otherwise, or if unsure,
++        say Y.
++
++config DAVINCI_MUX_DEBUG
++        bool "Multiplexing debug output"
++        depends on DAVINCI_MUX
++        help
++          Makes the multiplexing functions print out a lot of debug info.
++          This is useful if you want to find out the correct values of the
++          multiplexing registers.
++
++config DAVINCI_MUX_WARNINGS
++        bool "Warn about pins the bootloader didn't set up"
++        depends on DAVINCI_MUX
++        help
++          Choose Y here to warn whenever driver initialization logic needs
++          to change the pin multiplexing setup.  When there are no warnings
++          printed, it's safe to deselect DAVINCI_MUX for your product.
++
++config DAVINCI_RESET_CLOCKS
++      bool "Reset unused clocks during boot"
++      depends on ARCH_DAVINCI
++      help
++        Say Y if you want to reset unused clocks during boot.
++        This option saves power, but assumes all drivers are
++        using the clock framework. Broken drivers that do not
++        yet use clock framework may not work with this option.
++        If you are booting from another operating system, you
++        probably do not want this option enabled until your
++        device drivers work properly.
+ endmenu
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/Makefile linux-2.6.30-rc4-git/arch/arm/mach-davinci/Makefile
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/Makefile    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/Makefile        2009-05-13 09:46:19.000000000 +0200
+@@ -5,7 +5,12 @@
+ # Common objects
+ obj-y                         := time.o irq.o clock.o serial.o io.o id.o psc.o \
+-                         gpio.o mux.o devices.o usb.o
++                         gpio.o devices.o dma.o usb.o
++
++obj-$(CONFIG_DAVINCI_MUX)             += mux.o
++
++# Chip specific
++obj-$(CONFIG_ARCH_DAVINCI_DM644x)       += dm644x.o
+ # Board specific
+-obj-$(CONFIG_MACH_DAVINCI_EVM)  += board-evm.o
++obj-$(CONFIG_MACH_DAVINCI_EVM)        += board-dm644x-evm.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/mux.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/mux.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/mux.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/mux.c   2009-05-13 09:46:19.000000000 +0200
+@@ -1,41 +1,103 @@
+ /*
+- * DaVinci pin multiplexing configurations
++ * Utility to set the DAVINCI MUX register from a table in mux.h
+  *
+  * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com>
+  *
++ * Based on linux/arch/arm/plat-omap/mux.c:
++ * Copyright (C) 2003 - 2005 Nokia Corporation
++ *
++ * Written by Tony Lindgren
++ *
+  * 2007 (c) MontaVista Software, Inc. This file is licensed under
+  * the terms of the GNU General Public License version 2. This program
+  * is licensed "as is" without any warranty of any kind, whether express
+  * or implied.
++ *
++ * Copyright (C) 2008 Texas Instruments.
+  */
+ #include <linux/io.h>
++#include <linux/module.h>
+ #include <linux/spinlock.h>
+ #include <mach/hardware.h>
+-
+ #include <mach/mux.h>
+-/* System control register offsets */
+-#define PINMUX0         0x00
+-#define PINMUX1         0x04
++static const struct mux_config *mux_table;
++static unsigned long pin_table_sz;
+-static DEFINE_SPINLOCK(mux_lock);
++int __init davinci_mux_register(const struct mux_config *pins,
++                              unsigned long size)
++{
++      mux_table = pins;
++      pin_table_sz = size;
+-void davinci_mux_peripheral(unsigned int mux, unsigned int enable)
++      return 0;
++}
++
++/*
++ * Sets the DAVINCI MUX register based on the table
++ */
++int __init_or_module davinci_cfg_reg(const unsigned long index)
+ {
+-      u32 pinmux, muxreg = PINMUX0;
++      static DEFINE_SPINLOCK(mux_spin_lock);
++      void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);
++      unsigned long flags;
++      const struct mux_config *cfg;
++      unsigned int reg_orig = 0, reg = 0;
++      unsigned int mask, warn = 0;
++
++      if (!mux_table)
++              BUG();
++
++      if (index >= pin_table_sz) {
++              printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
++                     index, pin_table_sz);
++              dump_stack();
++              return -ENODEV;
++      }
++
++      cfg = &mux_table[index];
++
++      if (cfg->name == NULL) {
++              printk(KERN_ERR "No entry for the specified index\n");
++              return -ENODEV;
++      }
++
++      /* Update the mux register in question */
++      if (cfg->mask) {
++              unsigned        tmp1, tmp2;
++
++              spin_lock_irqsave(&mux_spin_lock, flags);
++              reg_orig = __raw_readl(base + cfg->mux_reg);
++
++              mask = (cfg->mask << cfg->mask_offset);
++              tmp1 = reg_orig & mask;
++              reg = reg_orig & ~mask;
++
++              tmp2 = (cfg->mode << cfg->mask_offset);
++              reg |= tmp2;
++
++              if (tmp1 != tmp2)
++                      warn = 1;
++
++              __raw_writel(reg, base + cfg->mux_reg);
++              spin_unlock_irqrestore(&mux_spin_lock, flags);
++      }
++
++      if (warn) {
++#ifdef CONFIG_DAVINCI_MUX_WARNINGS
++              printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
++#endif
++      }
+-      if (mux >= DAVINCI_MUX_LEVEL2) {
+-              muxreg = PINMUX1;
+-              mux -= DAVINCI_MUX_LEVEL2;
++#ifdef CONFIG_DAVINCI_MUX_DEBUG
++      if (cfg->debug || warn) {
++              printk(KERN_WARNING "MUX: Setting register %s\n", cfg->name);
++              printk(KERN_WARNING "      %s (0x%08x) = 0x%08x -> 0x%08x\n",
++                     cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
+       }
++#endif
+-      spin_lock(&mux_lock);
+-      pinmux = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + muxreg);
+-      if (enable)
+-              pinmux |= (1 << mux);
+-      else
+-              pinmux &= ~(1 << mux);
+-      davinci_writel(pinmux, DAVINCI_SYSTEM_MODULE_BASE + muxreg);
+-      spin_unlock(&mux_lock);
++      return 0;
+ }
++EXPORT_SYMBOL(davinci_cfg_reg);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/mux.h linux-2.6.30-rc4-git/arch/arm/mach-davinci/mux.h
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/mux.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/mux.h   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,51 @@
++/*
++ * Pin-multiplex helper macros for TI DaVinci family devices
++ *
++ * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com>
++ *
++ * 2007 (c) MontaVista Software, Inc. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ *
++ * Copyright (C) 2008 Texas Instruments.
++ */
++#ifndef _MACH_DAVINCI_MUX_H_
++#define _MACH_DAVINCI_MUX_H_
++
++#include <mach/mux.h>
++
++#define MUX_CFG(soc, desc, muxreg, mode_offset, mode_mask, mux_mode, dbg)\
++[soc##_##desc] = {                                                    \
++                      .name =  #desc,                                 \
++                      .debug = dbg,                                   \
++                      .mux_reg_name = "PINMUX"#muxreg,                \
++                      .mux_reg = PINMUX##muxreg,                      \
++                      .mask_offset = mode_offset,                     \
++                      .mask = mode_mask,                              \
++                      .mode = mux_mode,                               \
++              },
++
++#define INT_CFG(soc, desc, mode_offset, mode_mask, mux_mode, dbg)     \
++[soc##_##desc] = {                                                    \
++                      .name =  #desc,                                 \
++                      .debug = dbg,                                   \
++                      .mux_reg_name = "INTMUX",                       \
++                      .mux_reg = INTMUX,                              \
++                      .mask_offset = mode_offset,                     \
++                      .mask = mode_mask,                              \
++                      .mode = mux_mode,                               \
++              },
++
++#define EVT_CFG(soc, desc, mode_offset, mode_mask, mux_mode, dbg)     \
++[soc##_##desc] = {                                                    \
++                      .name =  #desc,                                 \
++                      .debug = dbg,                                   \
++                      .mux_reg_name = "EVTMUX",                       \
++                      .mux_reg = EVTMUX,                              \
++                      .mask_offset = mode_offset,                     \
++                      .mask = mode_mask,                              \
++                      .mode = mux_mode,                               \
++              },
++
++#endif /* _MACH_DAVINCI_MUX_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/psc.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/psc.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/psc.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/psc.c   2009-05-13 09:46:19.000000000 +0200
+@@ -23,10 +23,13 @@
+ #include <linux/init.h>
+ #include <linux/io.h>
++#include <mach/cputype.h>
+ #include <mach/hardware.h>
+ #include <mach/psc.h>
+ #include <mach/mux.h>
++#define DAVINCI_PWR_SLEEP_CNTRL_BASE 0x01C41000
++
+ /* PSC register offsets */
+ #define EPCPR         0x070
+ #define PTCMD         0x120
+@@ -36,102 +39,61 @@
+ #define MDSTAT                0x800
+ #define MDCTL         0xA00
+-/* System control register offsets */
+-#define VDD3P3V_PWDN  0x48
++#define MDSTAT_STATE_MASK 0x1f
+-static void davinci_psc_mux(unsigned int id)
++/* Return nonzero iff the domain's clock is active */
++int __init davinci_psc_is_clk_active(unsigned int id)
+ {
+-      switch (id) {
+-      case DAVINCI_LPSC_ATA:
+-              davinci_mux_peripheral(DAVINCI_MUX_HDIREN, 1);
+-              davinci_mux_peripheral(DAVINCI_MUX_ATAEN, 1);
+-              break;
+-      case DAVINCI_LPSC_MMC_SD:
+-              /* VDD power manupulations are done in U-Boot for CPMAC
+-               * so applies to MMC as well
+-               */
+-              /*Set up the pull regiter for MMC */
+-              davinci_writel(0, DAVINCI_SYSTEM_MODULE_BASE + VDD3P3V_PWDN);
+-              davinci_mux_peripheral(DAVINCI_MUX_MSTK, 0);
+-              break;
+-      case DAVINCI_LPSC_I2C:
+-              davinci_mux_peripheral(DAVINCI_MUX_I2C, 1);
+-              break;
+-      case DAVINCI_LPSC_McBSP:
+-              davinci_mux_peripheral(DAVINCI_MUX_ASP, 1);
+-              break;
+-      default:
+-              break;
+-      }
++      void __iomem *psc_base = IO_ADDRESS(DAVINCI_PWR_SLEEP_CNTRL_BASE);
++      u32 mdstat = __raw_readl(psc_base + MDSTAT + 4 * id);
++
++      /* if clocked, state can be "Enable" or "SyncReset" */
++      return mdstat & BIT(12);
+ }
+ /* Enable or disable a PSC domain */
+ void davinci_psc_config(unsigned int domain, unsigned int id, char enable)
+ {
+-      u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl, mdstat_mask;
++      u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl;
++      void __iomem *psc_base = IO_ADDRESS(DAVINCI_PWR_SLEEP_CNTRL_BASE);
++      u32 next_state = enable ? 0x3 : 0x2; /* 0x3 enables, 0x2 disables */
++
++      mdctl = __raw_readl(psc_base + MDCTL + 4 * id);
++      mdctl &= ~MDSTAT_STATE_MASK;
++      mdctl |= next_state;
++      __raw_writel(mdctl, psc_base + MDCTL + 4 * id);
+-      mdctl = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + MDCTL + 4 * id);
+-      if (enable)
+-              mdctl |= 0x00000003;    /* Enable Module */
+-      else
+-              mdctl &= 0xFFFFFFF2;    /* Disable Module */
+-      davinci_writel(mdctl, DAVINCI_PWR_SLEEP_CNTRL_BASE + MDCTL + 4 * id);
+-
+-      pdstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDSTAT);
++      pdstat = __raw_readl(psc_base + PDSTAT);
+       if ((pdstat & 0x00000001) == 0) {
+-              pdctl1 = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1);
++              pdctl1 = __raw_readl(psc_base + PDCTL1);
+               pdctl1 |= 0x1;
+-              davinci_writel(pdctl1, DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1);
++              __raw_writel(pdctl1, psc_base + PDCTL1);
+               ptcmd = 1 << domain;
+-              davinci_writel(ptcmd, DAVINCI_PWR_SLEEP_CNTRL_BASE + PTCMD);
++              __raw_writel(ptcmd, psc_base + PTCMD);
+               do {
+-                      epcpr = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE +
+-                                            EPCPR);
++                      epcpr = __raw_readl(psc_base + EPCPR);
+               } while ((((epcpr >> domain) & 1) == 0));
+-              pdctl1 = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1);
++              pdctl1 = __raw_readl(psc_base + PDCTL1);
+               pdctl1 |= 0x100;
+-              davinci_writel(pdctl1, DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1);
++              __raw_writel(pdctl1, psc_base + PDCTL1);
+               do {
+-                      ptstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE +
++                      ptstat = __raw_readl(psc_base +
+                                              PTSTAT);
+               } while (!(((ptstat >> domain) & 1) == 0));
+       } else {
+               ptcmd = 1 << domain;
+-              davinci_writel(ptcmd, DAVINCI_PWR_SLEEP_CNTRL_BASE + PTCMD);
++              __raw_writel(ptcmd, psc_base + PTCMD);
+               do {
+-                      ptstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE +
+-                                             PTSTAT);
++                      ptstat = __raw_readl(psc_base + PTSTAT);
+               } while (!(((ptstat >> domain) & 1) == 0));
+       }
+-      if (enable)
+-              mdstat_mask = 0x3;
+-      else
+-              mdstat_mask = 0x2;
+-
+       do {
+-              mdstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE +
+-                                     MDSTAT + 4 * id);
+-      } while (!((mdstat & 0x0000001F) == mdstat_mask));
+-
+-      if (enable)
+-              davinci_psc_mux(id);
+-}
+-
+-void __init davinci_psc_init(void)
+-{
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_VPSSMSTR, 1);
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_VPSSSLV, 1);
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_TPCC, 1);
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_TPTC0, 1);
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_TPTC1, 1);
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_GPIO, 1);
+-
+-      /* Turn on WatchDog timer LPSC.  Needed for RESET to work */
+-      davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DAVINCI_LPSC_TIMER2, 1);
++              mdstat = __raw_readl(psc_base + MDSTAT + 4 * id);
++      } while (!((mdstat & MDSTAT_STATE_MASK) == next_state));
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/serial.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/serial.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/serial.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/serial.c        2009-05-13 09:46:19.000000000 +0200
+@@ -32,32 +32,47 @@
+ #include <mach/hardware.h>
+ #include <mach/serial.h>
+ #include <mach/irqs.h>
++#include <mach/cputype.h>
++#include "clock.h"
+-#define UART_DAVINCI_PWREMU 0x0c
+-
+-static inline unsigned int davinci_serial_in(struct plat_serial8250_port *up,
+-                                        int offset)
++static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
++                                         int offset)
+ {
+       offset <<= up->regshift;
+-      return (unsigned int)__raw_readb(up->membase + offset);
++      return (unsigned int)__raw_readl(IO_ADDRESS(up->mapbase) + offset);
+ }
+-static inline void davinci_serial_outp(struct plat_serial8250_port *p,
+-                                     int offset, int value)
++static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
++                                  int value)
+ {
+       offset <<= p->regshift;
+-      __raw_writeb(value, p->membase + offset);
++      __raw_writel(value, IO_ADDRESS(p->mapbase) + offset);
+ }
+ static struct plat_serial8250_port serial_platform_data[] = {
+       {
+-              .membase        = (char *)IO_ADDRESS(DAVINCI_UART0_BASE),
+-              .mapbase        = (unsigned long)DAVINCI_UART0_BASE,
++              .mapbase        = DAVINCI_UART0_BASE,
+               .irq            = IRQ_UARTINT0,
+-              .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
++              .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
++                                UPF_IOREMAP,
++              .iotype         = UPIO_MEM,
++              .regshift       = 2,
++      },
++      {
++              .mapbase        = DAVINCI_UART1_BASE,
++              .irq            = IRQ_UARTINT1,
++              .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
++                                UPF_IOREMAP,
++              .iotype         = UPIO_MEM,
++              .regshift       = 2,
++      },
++      {
++              .mapbase        = DAVINCI_UART2_BASE,
++              .irq            = IRQ_UARTINT2,
++              .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
++                                UPF_IOREMAP,
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+-              .uartclk        = 27000000,
+       },
+       {
+               .flags          = 0
+@@ -74,22 +89,68 @@ static struct platform_device serial_dev
+ static void __init davinci_serial_reset(struct plat_serial8250_port *p)
+ {
+-      /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */
+       unsigned int pwremu = 0;
+-      davinci_serial_outp(p, UART_IER, 0);  /* disable all interrupts */
++      serial_write_reg(p, UART_IER, 0);  /* disable all interrupts */
+-      davinci_serial_outp(p, UART_DAVINCI_PWREMU, pwremu);
++      /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */
++      serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
+       mdelay(10);
+       pwremu |= (0x3 << 13);
+       pwremu |= 0x1;
+-      davinci_serial_outp(p, UART_DAVINCI_PWREMU, pwremu);
++      serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
++
++      if (cpu_is_davinci_dm646x())
++              serial_write_reg(p, UART_DM646X_SCR,
++                               UART_DM646X_SCR_TX_WATERMARK);
++}
++
++void __init davinci_serial_init(struct davinci_uart_config *info)
++{
++      int i;
++      char name[16];
++      struct clk *uart_clk;
++      struct device *dev = &serial_device.dev;
++
++      /*
++       * Make sure the serial ports are muxed on at this point.
++       * You have to mux them off in device drivers later on
++       * if not needed.
++       */
++      for (i = 0; i < DAVINCI_MAX_NR_UARTS; i++) {
++              struct plat_serial8250_port *p = serial_platform_data + i;
++
++              if (!(info->enabled_uarts & (1 << i))) {
++                      p->flags = 0;
++                      continue;
++              }
++
++              if (cpu_is_davinci_dm646x())
++                      p->iotype = UPIO_MEM32;
++
++              if (cpu_is_davinci_dm355()) {
++                      if (i == 2) {
++                              p->mapbase = (unsigned long)DM355_UART2_BASE;
++                              p->irq = IRQ_DM355_UARTINT2;
++                      }
++              }
++
++              sprintf(name, "uart%d", i);
++              uart_clk = clk_get(dev, name);
++              if (IS_ERR(uart_clk))
++                      printk(KERN_ERR "%s:%d: failed to get UART%d clock\n",
++                                      __func__, __LINE__, i);
++              else {
++                      clk_enable(uart_clk);
++                      p->uartclk = clk_get_rate(uart_clk);
++                      davinci_serial_reset(p);
++              }
++      }
+ }
+ static int __init davinci_init(void)
+ {
+-      davinci_serial_reset(&serial_platform_data[0]);
+       return platform_device_register(&serial_device);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/time.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/time.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/time.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/time.c  2009-05-13 09:46:19.000000000 +0200
+@@ -16,6 +16,9 @@
+ #include <linux/clockchips.h>
+ #include <linux/spinlock.h>
+ #include <linux/io.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/device.h>
+ #include <mach/hardware.h>
+ #include <asm/system.h>
+@@ -24,8 +27,11 @@
+ #include <asm/mach/time.h>
+ #include <asm/errno.h>
+ #include <mach/io.h>
++#include <mach/cputype.h>
++#include "clock.h"
+ static struct clock_event_device clockevent_davinci;
++static unsigned int davinci_clock_tick_rate;
+ #define DAVINCI_TIMER0_BASE (IO_PHYS + 0x21400)
+ #define DAVINCI_TIMER1_BASE (IO_PHYS + 0x21800)
+@@ -99,9 +105,9 @@ struct timer_s {
+       unsigned int id;
+       unsigned long period;
+       unsigned long opts;
+-      unsigned long reg_base;
+-      unsigned long tim_reg;
+-      unsigned long prd_reg;
++      void __iomem *base;
++      unsigned long tim_off;
++      unsigned long prd_off;
+       unsigned long enamode_shift;
+       struct irqaction irqaction;
+ };
+@@ -114,15 +120,15 @@ static struct timer_s timers[];
+ static int timer32_config(struct timer_s *t)
+ {
+-      u32 tcr = davinci_readl(t->reg_base + TCR);
++      u32 tcr = __raw_readl(t->base + TCR);
+       /* disable timer */
+       tcr &= ~(TCR_ENAMODE_MASK << t->enamode_shift);
+-      davinci_writel(tcr, t->reg_base + TCR);
++      __raw_writel(tcr, t->base + TCR);
+       /* reset counter to zero, set new period */
+-      davinci_writel(0, t->tim_reg);
+-      davinci_writel(t->period, t->prd_reg);
++      __raw_writel(0, t->base + t->tim_off);
++      __raw_writel(t->period, t->base + t->prd_off);
+       /* Set enable mode */
+       if (t->opts & TIMER_OPTS_ONESHOT) {
+@@ -131,13 +137,13 @@ static int timer32_config(struct timer_s
+               tcr |= TCR_ENAMODE_PERIODIC << t->enamode_shift;
+       }
+-      davinci_writel(tcr, t->reg_base + TCR);
++      __raw_writel(tcr, t->base + TCR);
+       return 0;
+ }
+ static inline u32 timer32_read(struct timer_s *t)
+ {
+-      return davinci_readl(t->tim_reg);
++      return __raw_readl(t->base + t->tim_off);
+ }
+ static irqreturn_t timer_interrupt(int irq, void *dev_id)
+@@ -176,51 +182,54 @@ static struct timer_s timers[] = {
+ static void __init timer_init(void)
+ {
+-      u32 bases[] = {DAVINCI_TIMER0_BASE, DAVINCI_TIMER1_BASE};
++      u32 phys_bases[] = {DAVINCI_TIMER0_BASE, DAVINCI_TIMER1_BASE};
+       int i;
+       /* Global init of each 64-bit timer as a whole */
+       for(i=0; i<2; i++) {
+-              u32 tgcr, base = bases[i];
++              u32 tgcr;
++              void __iomem *base = IO_ADDRESS(phys_bases[i]);
+               /* Disabled, Internal clock source */
+-              davinci_writel(0, base + TCR);
++              __raw_writel(0, base + TCR);
+               /* reset both timers, no pre-scaler for timer34 */
+               tgcr = 0;
+-              davinci_writel(tgcr, base + TGCR);
++              __raw_writel(tgcr, base + TGCR);
+               /* Set both timers to unchained 32-bit */
+               tgcr = TGCR_TIMMODE_32BIT_UNCHAINED << TGCR_TIMMODE_SHIFT;
+-              davinci_writel(tgcr, base + TGCR);
++              __raw_writel(tgcr, base + TGCR);
+               /* Unreset timers */
+               tgcr |= (TGCR_UNRESET << TGCR_TIM12RS_SHIFT) |
+                       (TGCR_UNRESET << TGCR_TIM34RS_SHIFT);
+-              davinci_writel(tgcr, base + TGCR);
++              __raw_writel(tgcr, base + TGCR);
+               /* Init both counters to zero */
+-              davinci_writel(0, base + TIM12);
+-              davinci_writel(0, base + TIM34);
++              __raw_writel(0, base + TIM12);
++              __raw_writel(0, base + TIM34);
+       }
+       /* Init of each timer as a 32-bit timer */
+       for (i=0; i< ARRAY_SIZE(timers); i++) {
+               struct timer_s *t = &timers[i];
++              u32 phys_base;
+               if (t->name) {
+                       t->id = i;
+-                      t->reg_base = (IS_TIMER1(t->id) ?
++                      phys_base = (IS_TIMER1(t->id) ?
+                              DAVINCI_TIMER1_BASE : DAVINCI_TIMER0_BASE);
++                      t->base = IO_ADDRESS(phys_base);
+                       if (IS_TIMER_BOT(t->id)) {
+                               t->enamode_shift = 6;
+-                              t->tim_reg = t->reg_base + TIM12;
+-                              t->prd_reg = t->reg_base + PRD12;
++                              t->tim_off = TIM12;
++                              t->prd_off = PRD12;
+                       } else {
+                               t->enamode_shift = 22;
+-                              t->tim_reg = t->reg_base + TIM34;
+-                              t->prd_reg = t->reg_base + PRD34;
++                              t->tim_off = TIM34;
++                              t->prd_off = PRD34;
+                       }
+                       /* Register interrupt */
+@@ -274,7 +283,7 @@ static void davinci_set_mode(enum clock_
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+-              t->period = CLOCK_TICK_RATE / (HZ);
++              t->period = davinci_clock_tick_rate / (HZ);
+               t->opts = TIMER_OPTS_PERIODIC;
+               timer32_config(t);
+               break;
+@@ -301,21 +310,29 @@ static struct clock_event_device clockev
+ static void __init davinci_timer_init(void)
+ {
++      struct clk *timer_clk;
++
+       static char err[] __initdata = KERN_ERR
+               "%s: can't register clocksource!\n";
+       /* init timer hw */
+       timer_init();
++      timer_clk = clk_get(NULL, "timer0");
++      BUG_ON(IS_ERR(timer_clk));
++      clk_enable(timer_clk);
++
++      davinci_clock_tick_rate = clk_get_rate(timer_clk);
++
+       /* setup clocksource */
+       clocksource_davinci.mult =
+-              clocksource_khz2mult(CLOCK_TICK_RATE/1000,
++              clocksource_khz2mult(davinci_clock_tick_rate/1000,
+                                    clocksource_davinci.shift);
+       if (clocksource_register(&clocksource_davinci))
+               printk(err, clocksource_davinci.name);
+       /* setup clockevent */
+-      clockevent_davinci.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC,
++      clockevent_davinci.mult = div_sc(davinci_clock_tick_rate, NSEC_PER_SEC,
+                                        clockevent_davinci.shift);
+       clockevent_davinci.max_delta_ns =
+               clockevent_delta2ns(0xfffffffe, &clockevent_davinci);
+@@ -333,42 +350,52 @@ struct sys_timer davinci_timer = {
+ /* reset board using watchdog timer */
+ void davinci_watchdog_reset(void) {
+-      u32 tgcr, wdtcr, base = DAVINCI_WDOG_BASE;
++      u32 tgcr, wdtcr;
++      void __iomem *base = IO_ADDRESS(DAVINCI_WDOG_BASE);
++      struct device dev;
++      struct clk *wd_clk;
++      char *name = "watchdog";
++
++      dev_set_name(&dev, name);
++      wd_clk = clk_get(&dev, NULL);
++      if (WARN_ON(IS_ERR(wd_clk)))
++              return;
++      clk_enable(wd_clk);
+       /* disable, internal clock source */
+-      davinci_writel(0, base + TCR);
++      __raw_writel(0, base + TCR);
+       /* reset timer, set mode to 64-bit watchdog, and unreset */
+       tgcr = 0;
+-      davinci_writel(tgcr, base + TCR);
++      __raw_writel(tgcr, base + TCR);
+       tgcr = TGCR_TIMMODE_64BIT_WDOG << TGCR_TIMMODE_SHIFT;
+       tgcr |= (TGCR_UNRESET << TGCR_TIM12RS_SHIFT) |
+               (TGCR_UNRESET << TGCR_TIM34RS_SHIFT);
+-      davinci_writel(tgcr, base + TCR);
++      __raw_writel(tgcr, base + TCR);
+       /* clear counter and period regs */
+-      davinci_writel(0, base + TIM12);
+-      davinci_writel(0, base + TIM34);
+-      davinci_writel(0, base + PRD12);
+-      davinci_writel(0, base + PRD34);
++      __raw_writel(0, base + TIM12);
++      __raw_writel(0, base + TIM34);
++      __raw_writel(0, base + PRD12);
++      __raw_writel(0, base + PRD34);
+       /* enable */
+-      wdtcr = davinci_readl(base + WDTCR);
++      wdtcr = __raw_readl(base + WDTCR);
+       wdtcr |= WDTCR_WDEN_ENABLE << WDTCR_WDEN_SHIFT;
+-      davinci_writel(wdtcr, base + WDTCR);
++      __raw_writel(wdtcr, base + WDTCR);
+       /* put watchdog in pre-active state */
+       wdtcr = (WDTCR_WDKEY_SEQ0 << WDTCR_WDKEY_SHIFT) |
+               (WDTCR_WDEN_ENABLE << WDTCR_WDEN_SHIFT);
+-      davinci_writel(wdtcr, base + WDTCR);
++      __raw_writel(wdtcr, base + WDTCR);
+       /* put watchdog in active state */
+       wdtcr = (WDTCR_WDKEY_SEQ1 << WDTCR_WDKEY_SHIFT) |
+               (WDTCR_WDEN_ENABLE << WDTCR_WDEN_SHIFT);
+-      davinci_writel(wdtcr, base + WDTCR);
++      __raw_writel(wdtcr, base + WDTCR);
+       /* write an invalid value to the WDKEY field to trigger
+        * a watchdog reset */
+       wdtcr = 0x00004000;
+-      davinci_writel(wdtcr, base + WDTCR);
++      __raw_writel(wdtcr, base + WDTCR);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-davinci/usb.c linux-2.6.30-rc4-git/arch/arm/mach-davinci/usb.c
+--- linux-2.6.30-rc4/arch/arm/mach-davinci/usb.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-davinci/usb.c   2009-05-13 09:46:19.000000000 +0200
+@@ -14,6 +14,8 @@
+ #include <mach/hardware.h>
+ #include <mach/irqs.h>
++#define DAVINCI_USB_OTG_BASE 0x01C64000
++
+ #if defined(CONFIG_USB_MUSB_HDRC) || defined(CONFIG_USB_MUSB_HDRC_MODULE)
+ static struct musb_hdrc_eps_bits musb_eps[] = {
+       { "ep1_tx", 8, },
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/clock.c linux-2.6.30-rc4-git/arch/arm/mach-imx/clock.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/clock.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/clock.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,210 +0,0 @@
+-/*
+- *  Copyright (C) 2008 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+- *
+- * 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/device.h>
+-#include <linux/list.h>
+-#include <linux/math64.h>
+-#include <linux/err.h>
+-#include <linux/io.h>
+-
+-#include <mach/hardware.h>
+-
+-/*
+- * Very simple approach: We can't disable clocks, so we do
+- * not need refcounting
+- */
+-
+-struct clk {
+-      struct list_head node;
+-      const char *name;
+-      unsigned long (*get_rate)(void);
+-};
+-
+-/*
+- *  get the system pll clock in Hz
+- *
+- *                  mfi + mfn / (mfd +1)
+- *  f = 2 * f_ref * --------------------
+- *                        pd + 1
+- */
+-static unsigned long imx_decode_pll(unsigned int pll, u32 f_ref)
+-{
+-      unsigned long long ll;
+-      unsigned long quot;
+-
+-      u32 mfi = (pll >> 10) & 0xf;
+-      u32 mfn = pll & 0x3ff;
+-      u32 mfd = (pll >> 16) & 0x3ff;
+-      u32 pd =  (pll >> 26) & 0xf;
+-
+-      mfi = mfi <= 5 ? 5 : mfi;
+-
+-      ll = 2 * (unsigned long long)f_ref *
+-              ((mfi << 16) + (mfn << 16) / (mfd + 1));
+-      quot = (pd + 1) * (1 << 16);
+-      ll += quot / 2;
+-      do_div(ll, quot);
+-      return (unsigned long)ll;
+-}
+-
+-static unsigned long imx_get_system_clk(void)
+-{
+-      u32 f_ref = (CSCR & CSCR_SYSTEM_SEL) ? 16000000 : (CLK32 * 512);
+-
+-      return imx_decode_pll(SPCTL0, f_ref);
+-}
+-
+-static unsigned long imx_get_mcu_clk(void)
+-{
+-      return imx_decode_pll(MPCTL0, CLK32 * 512);
+-}
+-
+-/*
+- *  get peripheral clock 1 ( UART[12], Timer[12], PWM )
+- */
+-static unsigned long imx_get_perclk1(void)
+-{
+-      return imx_get_system_clk() / (((PCDR) & 0xf)+1);
+-}
+-
+-/*
+- *  get peripheral clock 2 ( LCD, SD, SPI[12] )
+- */
+-static unsigned long imx_get_perclk2(void)
+-{
+-      return imx_get_system_clk() / (((PCDR>>4) & 0xf)+1);
+-}
+-
+-/*
+- *  get peripheral clock 3 ( SSI )
+- */
+-static unsigned long imx_get_perclk3(void)
+-{
+-      return imx_get_system_clk() / (((PCDR>>16) & 0x7f)+1);
+-}
+-
+-/*
+- *  get hclk ( SDRAM, CSI, Memory Stick, I2C, DMA )
+- */
+-static unsigned long imx_get_hclk(void)
+-{
+-      return imx_get_system_clk() / (((CSCR>>10) & 0xf)+1);
+-}
+-
+-static struct clk clk_system_clk = {
+-      .name = "system_clk",
+-      .get_rate = imx_get_system_clk,
+-};
+-
+-static struct clk clk_hclk = {
+-      .name = "hclk",
+-      .get_rate = imx_get_hclk,
+-};
+-
+-static struct clk clk_mcu_clk = {
+-      .name = "mcu_clk",
+-      .get_rate = imx_get_mcu_clk,
+-};
+-
+-static struct clk clk_perclk1 = {
+-      .name = "perclk1",
+-      .get_rate = imx_get_perclk1,
+-};
+-
+-static struct clk clk_uart_clk = {
+-      .name = "uart_clk",
+-      .get_rate = imx_get_perclk1,
+-};
+-
+-static struct clk clk_perclk2 = {
+-      .name = "perclk2",
+-      .get_rate = imx_get_perclk2,
+-};
+-
+-static struct clk clk_perclk3 = {
+-      .name = "perclk3",
+-      .get_rate = imx_get_perclk3,
+-};
+-
+-static struct clk *clks[] = {
+-      &clk_perclk1,
+-      &clk_perclk2,
+-      &clk_perclk3,
+-      &clk_system_clk,
+-      &clk_hclk,
+-      &clk_mcu_clk,
+-      &clk_uart_clk,
+-};
+-
+-static LIST_HEAD(clocks);
+-static DEFINE_MUTEX(clocks_mutex);
+-
+-struct clk *clk_get(struct device *dev, const char *id)
+-{
+-      struct clk *p, *clk = ERR_PTR(-ENOENT);
+-
+-      mutex_lock(&clocks_mutex);
+-      list_for_each_entry(p, &clocks, node) {
+-              if (!strcmp(p->name, id)) {
+-                      clk = p;
+-                      goto found;
+-              }
+-      }
+-
+-found:
+-      mutex_unlock(&clocks_mutex);
+-
+-      return clk;
+-}
+-EXPORT_SYMBOL(clk_get);
+-
+-void clk_put(struct clk *clk)
+-{
+-}
+-EXPORT_SYMBOL(clk_put);
+-
+-int clk_enable(struct clk *clk)
+-{
+-      return 0;
+-}
+-EXPORT_SYMBOL(clk_enable);
+-
+-void clk_disable(struct clk *clk)
+-{
+-}
+-EXPORT_SYMBOL(clk_disable);
+-
+-unsigned long clk_get_rate(struct clk *clk)
+-{
+-      return clk->get_rate();
+-}
+-EXPORT_SYMBOL(clk_get_rate);
+-
+-int imx_clocks_init(void)
+-{
+-      int i;
+-
+-      mutex_lock(&clocks_mutex);
+-      for (i = 0; i < ARRAY_SIZE(clks); i++)
+-              list_add(&clks[i]->node, &clocks);
+-      mutex_unlock(&clocks_mutex);
+-
+-      return 0;
+-}
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/cpufreq.c linux-2.6.30-rc4-git/arch/arm/mach-imx/cpufreq.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/cpufreq.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/cpufreq.c   1970-01-01 01:00:00.000000000 +0100
+@@ -1,315 +0,0 @@
+-/*
+- * cpu.c: clock scaling for the iMX
+- *
+- * Copyright (C) 2000 2001, The Delft University of Technology
+- * Copyright (c) 2004 Sascha Hauer <sascha@saschahauer.de>
+- * Copyright (C) 2006 Inky Lung <ilung@cwlinux.com>
+- * Copyright (C) 2006 Pavel Pisa, PiKRON <ppisa@pikron.com>
+- *
+- * Based on SA1100 version written by:
+- * - Johan Pouwelse (J.A.Pouwelse@its.tudelft.nl): initial version
+- * - Erik Mouw (J.A.K.Mouw@its.tudelft.nl):
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- *
+- */
+-
+-/*#define DEBUG*/
+-
+-#include <linux/kernel.h>
+-#include <linux/types.h>
+-#include <linux/init.h>
+-#include <linux/cpufreq.h>
+-#include <linux/clk.h>
+-#include <linux/err.h>
+-#include <asm/system.h>
+-
+-#include <mach/hardware.h>
+-
+-#include "generic.h"
+-
+-#ifndef __val2mfld
+-#define __val2mfld(mask,val) (((mask)&~((mask)<<1))*(val)&(mask))
+-#endif
+-#ifndef __mfld2val
+-#define __mfld2val(mask,val) (((val)&(mask))/((mask)&~((mask)<<1)))
+-#endif
+-
+-#define CR_920T_CLOCK_MODE    0xC0000000
+-#define CR_920T_FASTBUS_MODE  0x00000000
+-#define CR_920T_ASYNC_MODE    0xC0000000
+-
+-static u32 mpctl0_at_boot;
+-static u32 bclk_div_at_boot;
+-
+-static struct clk *system_clk, *mcu_clk;
+-
+-static void imx_set_async_mode(void)
+-{
+-      adjust_cr(CR_920T_CLOCK_MODE, CR_920T_ASYNC_MODE);
+-}
+-
+-static void imx_set_fastbus_mode(void)
+-{
+-      adjust_cr(CR_920T_CLOCK_MODE, CR_920T_FASTBUS_MODE);
+-}
+-
+-static void imx_set_mpctl0(u32 mpctl0)
+-{
+-      unsigned long flags;
+-
+-      if (mpctl0 == 0) {
+-              local_irq_save(flags);
+-              CSCR &= ~CSCR_MPEN;
+-              local_irq_restore(flags);
+-              return;
+-      }
+-
+-      local_irq_save(flags);
+-      MPCTL0 = mpctl0;
+-      CSCR |= CSCR_MPEN;
+-      local_irq_restore(flags);
+-}
+-
+-/**
+- * imx_compute_mpctl - compute new PLL parameters
+- * @new_mpctl:        pointer to location assigned by new PLL control register value
+- * @cur_mpctl:        current PLL control register parameters
+- * @f_ref:    reference source frequency Hz
+- * @freq:     required frequency in Hz
+- * @relation: is one of %CPUFREQ_RELATION_L (supremum)
+- *            and %CPUFREQ_RELATION_H (infimum)
+- */
+-long imx_compute_mpctl(u32 *new_mpctl, u32 cur_mpctl, u32 f_ref, unsigned long freq, int relation)
+-{
+-        u32 mfi;
+-        u32 mfn;
+-        u32 mfd;
+-        u32 pd;
+-      unsigned long long ll;
+-      long l;
+-      long quot;
+-
+-      /* Fdppl=2*Fref*(MFI+MFN/(MFD+1))/(PD+1) */
+-      /*  PD=<0,15>, MFD=<1,1023>, MFI=<5,15> MFN=<0,1022> */
+-
+-      if (cur_mpctl) {
+-              mfd = ((cur_mpctl >> 16) & 0x3ff) + 1;
+-              pd =  ((cur_mpctl >> 26) & 0xf) + 1;
+-      } else {
+-              pd=2; mfd=313;
+-      }
+-
+-      /* pd=2; mfd=313; mfi=8; mfn=183; */
+-      /* (MFI+MFN/(MFD)) = Fdppl / (2*Fref) * (PD); */
+-
+-      quot = (f_ref + (1 << 9)) >> 10;
+-      l = (freq * pd + quot) / (2 * quot);
+-      mfi = l >> 10;
+-      mfn = ((l & ((1 << 10) - 1)) * mfd + (1 << 9)) >> 10;
+-
+-      mfd -= 1;
+-      pd -= 1;
+-
+-      *new_mpctl = ((mfi & 0xf) << 10) | (mfn & 0x3ff) | ((mfd & 0x3ff) << 16)
+-              | ((pd & 0xf) << 26);
+-
+-      ll = 2 * (unsigned long long)f_ref * ( (mfi<<16) + (mfn<<16) / (mfd+1) );
+-      quot = (pd+1) * (1<<16);
+-      ll += quot / 2;
+-      do_div(ll, quot);
+-      freq = ll;
+-
+-      pr_debug(KERN_DEBUG "imx: new PLL parameters pd=%d mfd=%d mfi=%d mfn=%d, freq=%ld\n",
+-              pd, mfd, mfi, mfn, freq);
+-
+-      return freq;
+-}
+-
+-
+-static int imx_verify_speed(struct cpufreq_policy *policy)
+-{
+-      if (policy->cpu != 0)
+-              return -EINVAL;
+-
+-      cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, policy->cpuinfo.max_freq);
+-
+-      return 0;
+-}
+-
+-static unsigned int imx_get_speed(unsigned int cpu)
+-{
+-      unsigned int freq;
+-      unsigned int cr;
+-      unsigned int cscr;
+-      unsigned int bclk_div;
+-
+-      if (cpu)
+-              return 0;
+-
+-      cscr = CSCR;
+-      bclk_div = __mfld2val(CSCR_BCLK_DIV, cscr) + 1;
+-      cr = get_cr();
+-
+-      if((cr & CR_920T_CLOCK_MODE) == CR_920T_FASTBUS_MODE) {
+-              freq = clk_get_rate(system_clk);
+-              freq = (freq + bclk_div/2) / bclk_div;
+-      } else {
+-              freq = clk_get_rate(mcu_clk);
+-              if (cscr & CSCR_MPU_PRESC)
+-                      freq /= 2;
+-      }
+-
+-      freq = (freq + 500) / 1000;
+-
+-      return freq;
+-}
+-
+-static int imx_set_target(struct cpufreq_policy *policy,
+-                        unsigned int target_freq,
+-                        unsigned int relation)
+-{
+-      struct cpufreq_freqs freqs;
+-      u32 mpctl0 = 0;
+-      u32 cscr;
+-      unsigned long flags;
+-      long freq;
+-      long sysclk;
+-      unsigned int bclk_div = bclk_div_at_boot;
+-
+-      /*
+-       * Some governors do not respects CPU and policy lower limits
+-       * which leads to bad things (division by zero etc), ensure
+-       * that such things do not happen.
+-       */
+-      if(target_freq < policy->cpuinfo.min_freq)
+-              target_freq = policy->cpuinfo.min_freq;
+-
+-      if(target_freq < policy->min)
+-              target_freq = policy->min;
+-
+-      freq = target_freq * 1000;
+-
+-      pr_debug(KERN_DEBUG "imx: requested frequency %ld Hz, mpctl0 at boot 0x%08x\n",
+-                      freq, mpctl0_at_boot);
+-
+-      sysclk = clk_get_rate(system_clk);
+-
+-      if (freq > sysclk / bclk_div_at_boot + 1000000) {
+-              freq = imx_compute_mpctl(&mpctl0, mpctl0_at_boot, CLK32 * 512, freq, relation);
+-              if (freq < 0) {
+-                      printk(KERN_WARNING "imx: target frequency %ld Hz cannot be set\n", freq);
+-                      return -EINVAL;
+-              }
+-      } else {
+-              if(freq + 1000 < sysclk) {
+-                      if (relation == CPUFREQ_RELATION_L)
+-                              bclk_div = (sysclk - 1000) / freq;
+-                      else
+-                              bclk_div = (sysclk + freq + 1000) / freq;
+-
+-                      if(bclk_div > 16)
+-                              bclk_div = 16;
+-                      if(bclk_div < bclk_div_at_boot)
+-                              bclk_div = bclk_div_at_boot;
+-              }
+-              freq = (sysclk + bclk_div / 2) / bclk_div;
+-      }
+-
+-      freqs.old = imx_get_speed(0);
+-      freqs.new = (freq + 500) / 1000;
+-      freqs.cpu = 0;
+-      freqs.flags = 0;
+-
+-      cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+-
+-      local_irq_save(flags);
+-
+-      imx_set_fastbus_mode();
+-
+-      imx_set_mpctl0(mpctl0);
+-
+-      cscr = CSCR;
+-      cscr &= ~CSCR_BCLK_DIV;
+-      cscr |= __val2mfld(CSCR_BCLK_DIV, bclk_div - 1);
+-      CSCR = cscr;
+-
+-      if(mpctl0) {
+-              CSCR |= CSCR_MPLL_RESTART;
+-
+-              /* Wait until MPLL is stabilized */
+-              while( CSCR & CSCR_MPLL_RESTART );
+-
+-              imx_set_async_mode();
+-      }
+-
+-      local_irq_restore(flags);
+-
+-      cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+-
+-      pr_debug(KERN_INFO "imx: set frequency %ld Hz, running from %s\n",
+-                      freq, mpctl0? "MPLL": "SPLL");
+-
+-      return 0;
+-}
+-
+-static int __init imx_cpufreq_driver_init(struct cpufreq_policy *policy)
+-{
+-      printk(KERN_INFO "i.MX cpu freq change driver v1.0\n");
+-
+-      if (policy->cpu != 0)
+-              return -EINVAL;
+-
+-      policy->cur = policy->min = policy->max = imx_get_speed(0);
+-      policy->cpuinfo.min_freq = 8000;
+-      policy->cpuinfo.max_freq = 200000;
+-       /* Manual states, that PLL stabilizes in two CLK32 periods */
+-      policy->cpuinfo.transition_latency = 4 * 1000000000LL / CLK32;
+-      return 0;
+-}
+-
+-static struct cpufreq_driver imx_driver = {
+-      .flags          = CPUFREQ_STICKY,
+-      .verify         = imx_verify_speed,
+-      .target         = imx_set_target,
+-      .get            = imx_get_speed,
+-      .init           = imx_cpufreq_driver_init,
+-      .name           = "imx",
+-};
+-
+-static int __init imx_cpufreq_init(void)
+-{
+-      bclk_div_at_boot = __mfld2val(CSCR_BCLK_DIV, CSCR) + 1;
+-      mpctl0_at_boot = 0;
+-
+-      system_clk = clk_get(NULL, "system_clk");
+-      if (IS_ERR(system_clk))
+-              return PTR_ERR(system_clk);
+-
+-      mcu_clk = clk_get(NULL, "mcu_clk");
+-      if (IS_ERR(mcu_clk)) {
+-              clk_put(system_clk);
+-              return PTR_ERR(mcu_clk);
+-      }
+-
+-      if((CSCR & CSCR_MPEN) &&
+-         ((get_cr() & CR_920T_CLOCK_MODE) != CR_920T_FASTBUS_MODE))
+-              mpctl0_at_boot = MPCTL0;
+-
+-      return cpufreq_register_driver(&imx_driver);
+-}
+-
+-arch_initcall(imx_cpufreq_init);
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/dma.c linux-2.6.30-rc4-git/arch/arm/mach-imx/dma.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/dma.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/dma.c       1970-01-01 01:00:00.000000000 +0100
+@@ -1,597 +0,0 @@
+-/*
+- *  linux/arch/arm/mach-imx/dma.c
+- *
+- *  imx DMA registration and IRQ dispatching
+- *
+- *  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.
+- *
+- *  2004-03-03 Sascha Hauer <sascha@saschahauer.de>
+- *             initial version heavily inspired by
+- *             linux/arch/arm/mach-pxa/dma.c
+- *
+- *  2005-04-17 Pavel Pisa <pisa@cmp.felk.cvut.cz>
+- *             Changed to support scatter gather DMA
+- *             by taking Russell's code from RiscPC
+- *
+- *  2006-05-31 Pavel Pisa <pisa@cmp.felk.cvut.cz>
+- *             Corrected error handling code.
+- *
+- */
+-
+-#undef DEBUG
+-
+-#include <linux/module.h>
+-#include <linux/init.h>
+-#include <linux/kernel.h>
+-#include <linux/interrupt.h>
+-#include <linux/errno.h>
+-
+-#include <asm/scatterlist.h>
+-#include <asm/system.h>
+-#include <asm/irq.h>
+-#include <mach/hardware.h>
+-#include <mach/dma.h>
+-#include <mach/imx-dma.h>
+-
+-struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS];
+-
+-/*
+- * imx_dma_sg_next - prepare next chunk for scatter-gather DMA emulation
+- * @dma_ch: i.MX DMA channel number
+- * @lastcount: number of bytes transferred during last transfer
+- *
+- * Functions prepares DMA controller for next sg data chunk transfer.
+- * The @lastcount argument informs function about number of bytes transferred
+- * during last block. Zero value can be used for @lastcount to setup DMA
+- * for the first chunk.
+- */
+-static inline int imx_dma_sg_next(imx_dmach_t dma_ch, unsigned int lastcount)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-      unsigned int nextcount;
+-      unsigned int nextaddr;
+-
+-      if (!imxdma->name) {
+-              printk(KERN_CRIT "%s: called for  not allocated channel %d\n",
+-                     __func__, dma_ch);
+-              return 0;
+-      }
+-
+-      imxdma->resbytes -= lastcount;
+-
+-      if (!imxdma->sg) {
+-              pr_debug("imxdma%d: no sg data\n", dma_ch);
+-              return 0;
+-      }
+-
+-      imxdma->sgbc += lastcount;
+-      if ((imxdma->sgbc >= imxdma->sg->length) || !imxdma->resbytes) {
+-              if ((imxdma->sgcount <= 1) || !imxdma->resbytes) {
+-                      pr_debug("imxdma%d: sg transfer limit reached\n",
+-                               dma_ch);
+-                      imxdma->sgcount=0;
+-                      imxdma->sg = NULL;
+-                      return 0;
+-              } else {
+-                      imxdma->sgcount--;
+-                      imxdma->sg++;
+-                      imxdma->sgbc = 0;
+-              }
+-      }
+-      nextcount = imxdma->sg->length - imxdma->sgbc;
+-      nextaddr = imxdma->sg->dma_address + imxdma->sgbc;
+-
+-      if(imxdma->resbytes < nextcount)
+-              nextcount = imxdma->resbytes;
+-
+-      if ((imxdma->dma_mode & DMA_MODE_MASK) == DMA_MODE_READ)
+-              DAR(dma_ch) = nextaddr;
+-      else
+-              SAR(dma_ch) = nextaddr;
+-
+-      CNTR(dma_ch) = nextcount;
+-      pr_debug("imxdma%d: next sg chunk dst 0x%08x, src 0x%08x, size 0x%08x\n",
+-               dma_ch, DAR(dma_ch), SAR(dma_ch), CNTR(dma_ch));
+-
+-      return nextcount;
+-}
+-
+-/*
+- * imx_dma_setup_sg_base - scatter-gather DMA emulation
+- * @dma_ch: i.MX DMA channel number
+- * @sg: pointer to the scatter-gather list/vector
+- * @sgcount: scatter-gather list hungs count
+- *
+- * Functions sets up i.MX DMA state for emulated scatter-gather transfer
+- * and sets up channel registers to be ready for the first chunk
+- */
+-static int
+-imx_dma_setup_sg_base(imx_dmach_t dma_ch,
+-                    struct scatterlist *sg, unsigned int sgcount)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-
+-      imxdma->sg = sg;
+-      imxdma->sgcount = sgcount;
+-      imxdma->sgbc = 0;
+-      return imx_dma_sg_next(dma_ch, 0);
+-}
+-
+-/**
+- * imx_dma_setup_single - setup i.MX DMA channel for linear memory to/from device transfer
+- * @dma_ch: i.MX DMA channel number
+- * @dma_address: the DMA/physical memory address of the linear data block
+- *            to transfer
+- * @dma_length: length of the data block in bytes
+- * @dev_addr: physical device port address
+- * @dmamode: DMA transfer mode, %DMA_MODE_READ from the device to the memory
+- *           or %DMA_MODE_WRITE from memory to the device
+- *
+- * The function setups DMA channel source and destination addresses for transfer
+- * specified by provided parameters. The scatter-gather emulation is disabled,
+- * because linear data block
+- * form the physical address range is transferred.
+- * Return value: if incorrect parameters are provided -%EINVAL.
+- *            Zero indicates success.
+- */
+-int
+-imx_dma_setup_single(imx_dmach_t dma_ch, dma_addr_t dma_address,
+-                   unsigned int dma_length, unsigned int dev_addr,
+-                   unsigned int dmamode)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-
+-      imxdma->sg = NULL;
+-      imxdma->sgcount = 0;
+-      imxdma->dma_mode = dmamode;
+-      imxdma->resbytes = dma_length;
+-
+-      if (!dma_address) {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_single null address\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      if (!dma_length) {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_single zero length\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) {
+-              pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for read\n",
+-                      dma_ch, (unsigned int)dma_address, dma_length,
+-                      dev_addr);
+-              SAR(dma_ch) = dev_addr;
+-              DAR(dma_ch) = (unsigned int)dma_address;
+-      } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) {
+-              pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for write\n",
+-                      dma_ch, (unsigned int)dma_address, dma_length,
+-                      dev_addr);
+-              SAR(dma_ch) = (unsigned int)dma_address;
+-              DAR(dma_ch) = dev_addr;
+-      } else {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_single bad dmamode\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      CNTR(dma_ch) = dma_length;
+-
+-      return 0;
+-}
+-
+-/**
+- * imx_dma_setup_sg - setup i.MX DMA channel SG list to/from device transfer
+- * @dma_ch: i.MX DMA channel number
+- * @sg: pointer to the scatter-gather list/vector
+- * @sgcount: scatter-gather list hungs count
+- * @dma_length: total length of the transfer request in bytes
+- * @dev_addr: physical device port address
+- * @dmamode: DMA transfer mode, %DMA_MODE_READ from the device to the memory
+- *           or %DMA_MODE_WRITE from memory to the device
+- *
+- * The function sets up DMA channel state and registers to be ready for transfer
+- * specified by provided parameters. The scatter-gather emulation is set up
+- * according to the parameters.
+- *
+- * The full preparation of the transfer requires setup of more register
+- * by the caller before imx_dma_enable() can be called.
+- *
+- * %BLR(dma_ch) holds transfer burst length in bytes, 0 means 64 bytes
+- *
+- * %RSSR(dma_ch) has to be set to the DMA request line source %DMA_REQ_xxx
+- *
+- * %CCR(dma_ch) has to specify transfer parameters, the next settings is typical
+- * for linear or simple scatter-gather transfers if %DMA_MODE_READ is specified
+- *
+- * %CCR_DMOD_LINEAR | %CCR_DSIZ_32 | %CCR_SMOD_FIFO | %CCR_SSIZ_x
+- *
+- * The typical setup for %DMA_MODE_WRITE is specified by next options combination
+- *
+- * %CCR_SMOD_LINEAR | %CCR_SSIZ_32 | %CCR_DMOD_FIFO | %CCR_DSIZ_x
+- *
+- * Be careful here and do not mistakenly mix source and target device
+- * port sizes constants, they are really different:
+- * %CCR_SSIZ_8, %CCR_SSIZ_16, %CCR_SSIZ_32,
+- * %CCR_DSIZ_8, %CCR_DSIZ_16, %CCR_DSIZ_32
+- *
+- * Return value: if incorrect parameters are provided -%EINVAL.
+- * Zero indicates success.
+- */
+-int
+-imx_dma_setup_sg(imx_dmach_t dma_ch,
+-               struct scatterlist *sg, unsigned int sgcount, unsigned int dma_length,
+-               unsigned int dev_addr, unsigned int dmamode)
+-{
+-      int res;
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-
+-      imxdma->sg = NULL;
+-      imxdma->sgcount = 0;
+-      imxdma->dma_mode = dmamode;
+-      imxdma->resbytes = dma_length;
+-
+-      if (!sg || !sgcount) {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_sg epty sg list\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      if (!sg->length) {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_sg zero length\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) {
+-              pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for read\n",
+-                      dma_ch, sg, sgcount, dma_length, dev_addr);
+-              SAR(dma_ch) = dev_addr;
+-      } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) {
+-              pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for write\n",
+-                      dma_ch, sg, sgcount, dma_length, dev_addr);
+-              DAR(dma_ch) = dev_addr;
+-      } else {
+-              printk(KERN_ERR "imxdma%d: imx_dma_setup_sg bad dmamode\n",
+-                     dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      res = imx_dma_setup_sg_base(dma_ch, sg, sgcount);
+-      if (res <= 0) {
+-              printk(KERN_ERR "imxdma%d: no sg chunk ready\n", dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      return 0;
+-}
+-
+-/**
+- * imx_dma_setup_handlers - setup i.MX DMA channel end and error notification handlers
+- * @dma_ch: i.MX DMA channel number
+- * @irq_handler: the pointer to the function called if the transfer
+- *            ends successfully
+- * @err_handler: the pointer to the function called if the premature
+- *            end caused by error occurs
+- * @data: user specified value to be passed to the handlers
+- */
+-int
+-imx_dma_setup_handlers(imx_dmach_t dma_ch,
+-                     void (*irq_handler) (int, void *),
+-                     void (*err_handler) (int, void *, int),
+-                     void *data)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-      unsigned long flags;
+-
+-      if (!imxdma->name) {
+-              printk(KERN_CRIT "%s: called for  not allocated channel %d\n",
+-                     __func__, dma_ch);
+-              return -ENODEV;
+-      }
+-
+-      local_irq_save(flags);
+-      DISR = (1 << dma_ch);
+-      imxdma->irq_handler = irq_handler;
+-      imxdma->err_handler = err_handler;
+-      imxdma->data = data;
+-      local_irq_restore(flags);
+-      return 0;
+-}
+-
+-/**
+- * imx_dma_enable - function to start i.MX DMA channel operation
+- * @dma_ch: i.MX DMA channel number
+- *
+- * The channel has to be allocated by driver through imx_dma_request()
+- * or imx_dma_request_by_prio() function.
+- * The transfer parameters has to be set to the channel registers through
+- * call of the imx_dma_setup_single() or imx_dma_setup_sg() function
+- * and registers %BLR(dma_ch), %RSSR(dma_ch) and %CCR(dma_ch) has to
+- * be set prior this function call by the channel user.
+- */
+-void imx_dma_enable(imx_dmach_t dma_ch)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-      unsigned long flags;
+-
+-      pr_debug("imxdma%d: imx_dma_enable\n", dma_ch);
+-
+-      if (!imxdma->name) {
+-              printk(KERN_CRIT "%s: called for  not allocated channel %d\n",
+-                     __func__, dma_ch);
+-              return;
+-      }
+-
+-      local_irq_save(flags);
+-      DISR = (1 << dma_ch);
+-      DIMR &= ~(1 << dma_ch);
+-      CCR(dma_ch) |= CCR_CEN;
+-      local_irq_restore(flags);
+-}
+-
+-/**
+- * imx_dma_disable - stop, finish i.MX DMA channel operatin
+- * @dma_ch: i.MX DMA channel number
+- */
+-void imx_dma_disable(imx_dmach_t dma_ch)
+-{
+-      unsigned long flags;
+-
+-      pr_debug("imxdma%d: imx_dma_disable\n", dma_ch);
+-
+-      local_irq_save(flags);
+-      DIMR |= (1 << dma_ch);
+-      CCR(dma_ch) &= ~CCR_CEN;
+-      DISR = (1 << dma_ch);
+-      local_irq_restore(flags);
+-}
+-
+-/**
+- * imx_dma_request - request/allocate specified channel number
+- * @dma_ch: i.MX DMA channel number
+- * @name: the driver/caller own non-%NULL identification
+- */
+-int imx_dma_request(imx_dmach_t dma_ch, const char *name)
+-{
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-      unsigned long flags;
+-
+-      /* basic sanity checks */
+-      if (!name)
+-              return -EINVAL;
+-
+-      if (dma_ch >= IMX_DMA_CHANNELS) {
+-              printk(KERN_CRIT "%s: called for  non-existed channel %d\n",
+-                     __func__, dma_ch);
+-              return -EINVAL;
+-      }
+-
+-      local_irq_save(flags);
+-      if (imxdma->name) {
+-              local_irq_restore(flags);
+-              return -ENODEV;
+-      }
+-
+-      imxdma->name = name;
+-      imxdma->irq_handler = NULL;
+-      imxdma->err_handler = NULL;
+-      imxdma->data = NULL;
+-      imxdma->sg = NULL;
+-      local_irq_restore(flags);
+-      return 0;
+-}
+-
+-/**
+- * imx_dma_free - release previously acquired channel
+- * @dma_ch: i.MX DMA channel number
+- */
+-void imx_dma_free(imx_dmach_t dma_ch)
+-{
+-      unsigned long flags;
+-      struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
+-
+-      if (!imxdma->name) {
+-              printk(KERN_CRIT
+-                     "%s: trying to free channel %d which is already freed\n",
+-                     __func__, dma_ch);
+-              return;
+-      }
+-
+-      local_irq_save(flags);
+-      /* Disable interrupts */
+-      DIMR |= (1 << dma_ch);
+-      CCR(dma_ch) &= ~CCR_CEN;
+-      imxdma->name = NULL;
+-      local_irq_restore(flags);
+-}
+-
+-/**
+- * imx_dma_request_by_prio - find and request some of free channels best suiting requested priority
+- * @name: the driver/caller own non-%NULL identification
+- * @prio: one of the hardware distinguished priority level:
+- *        %DMA_PRIO_HIGH, %DMA_PRIO_MEDIUM, %DMA_PRIO_LOW
+- *
+- * This function tries to find free channel in the specified priority group
+- * if the priority cannot be achieved it tries to look for free channel
+- * in the higher and then even lower priority groups.
+- *
+- * Return value: If there is no free channel to allocate, -%ENODEV is returned.
+- *               On successful allocation channel is returned.
+- */
+-imx_dmach_t imx_dma_request_by_prio(const char *name, imx_dma_prio prio)
+-{
+-      int i;
+-      int best;
+-
+-      switch (prio) {
+-      case (DMA_PRIO_HIGH):
+-              best = 8;
+-              break;
+-      case (DMA_PRIO_MEDIUM):
+-              best = 4;
+-              break;
+-      case (DMA_PRIO_LOW):
+-      default:
+-              best = 0;
+-              break;
+-      }
+-
+-      for (i = best; i < IMX_DMA_CHANNELS; i++) {
+-              if (!imx_dma_request(i, name)) {
+-                      return i;
+-              }
+-      }
+-
+-      for (i = best - 1; i >= 0; i--) {
+-              if (!imx_dma_request(i, name)) {
+-                      return i;
+-              }
+-      }
+-
+-      printk(KERN_ERR "%s: no free DMA channel found\n", __func__);
+-
+-      return -ENODEV;
+-}
+-
+-static irqreturn_t dma_err_handler(int irq, void *dev_id)
+-{
+-      int i, disr = DISR;
+-      struct imx_dma_channel *channel;
+-      unsigned int err_mask = DBTOSR | DRTOSR | DSESR | DBOSR;
+-      int errcode;
+-
+-      DISR = disr & err_mask;
+-      for (i = 0; i < IMX_DMA_CHANNELS; i++) {
+-              if(!(err_mask & (1 << i)))
+-                      continue;
+-              channel = &imx_dma_channels[i];
+-              errcode = 0;
+-
+-              if (DBTOSR & (1 << i)) {
+-                      DBTOSR = (1 << i);
+-                      errcode |= IMX_DMA_ERR_BURST;
+-              }
+-              if (DRTOSR & (1 << i)) {
+-                      DRTOSR = (1 << i);
+-                      errcode |= IMX_DMA_ERR_REQUEST;
+-              }
+-              if (DSESR & (1 << i)) {
+-                      DSESR = (1 << i);
+-                      errcode |= IMX_DMA_ERR_TRANSFER;
+-              }
+-              if (DBOSR & (1 << i)) {
+-                      DBOSR = (1 << i);
+-                      errcode |= IMX_DMA_ERR_BUFFER;
+-              }
+-
+-              /*
+-               * The cleaning of @sg field would be questionable
+-               * there, because its value can help to compute
+-               * remaining/transferred bytes count in the handler
+-               */
+-              /*imx_dma_channels[i].sg = NULL;*/
+-
+-              if (channel->name && channel->err_handler) {
+-                      channel->err_handler(i, channel->data, errcode);
+-                      continue;
+-              }
+-
+-              imx_dma_channels[i].sg = NULL;
+-
+-              printk(KERN_WARNING
+-                     "DMA timeout on channel %d (%s) -%s%s%s%s\n",
+-                     i, channel->name,
+-                     errcode&IMX_DMA_ERR_BURST?    " burst":"",
+-                     errcode&IMX_DMA_ERR_REQUEST?  " request":"",
+-                     errcode&IMX_DMA_ERR_TRANSFER? " transfer":"",
+-                     errcode&IMX_DMA_ERR_BUFFER?   " buffer":"");
+-      }
+-      return IRQ_HANDLED;
+-}
+-
+-static irqreturn_t dma_irq_handler(int irq, void *dev_id)
+-{
+-      int i, disr = DISR;
+-
+-      pr_debug("imxdma: dma_irq_handler called, disr=0x%08x\n",
+-                   disr);
+-
+-      DISR = disr;
+-      for (i = 0; i < IMX_DMA_CHANNELS; i++) {
+-              if (disr & (1 << i)) {
+-                      struct imx_dma_channel *channel = &imx_dma_channels[i];
+-                      if (channel->name) {
+-                              if (imx_dma_sg_next(i, CNTR(i))) {
+-                                      CCR(i) &= ~CCR_CEN;
+-                                      mb();
+-                                      CCR(i) |= CCR_CEN;
+-                              } else {
+-                                      if (channel->irq_handler)
+-                                              channel->irq_handler(i,
+-                                                      channel->data);
+-                              }
+-                      } else {
+-                              /*
+-                               * IRQ for an unregistered DMA channel:
+-                               * let's clear the interrupts and disable it.
+-                               */
+-                              printk(KERN_WARNING
+-                                     "spurious IRQ for DMA channel %d\n", i);
+-                      }
+-              }
+-      }
+-      return IRQ_HANDLED;
+-}
+-
+-static int __init imx_dma_init(void)
+-{
+-      int ret;
+-      int i;
+-
+-      /* reset DMA module */
+-      DCR = DCR_DRST;
+-
+-      ret = request_irq(DMA_INT, dma_irq_handler, 0, "DMA", NULL);
+-      if (ret) {
+-              printk(KERN_CRIT "Wow!  Can't register IRQ for DMA\n");
+-              return ret;
+-      }
+-
+-      ret = request_irq(DMA_ERR, dma_err_handler, 0, "DMA", NULL);
+-      if (ret) {
+-              printk(KERN_CRIT "Wow!  Can't register ERRIRQ for DMA\n");
+-              free_irq(DMA_INT, NULL);
+-      }
+-
+-      /* enable DMA module */
+-      DCR = DCR_DEN;
+-
+-      /* clear all interrupts */
+-      DISR = (1 << IMX_DMA_CHANNELS) - 1;
+-
+-      /* enable interrupts */
+-      DIMR = (1 << IMX_DMA_CHANNELS) - 1;
+-
+-      for (i = 0; i < IMX_DMA_CHANNELS; i++) {
+-              imx_dma_channels[i].sg = NULL;
+-              imx_dma_channels[i].dma_num = i;
+-      }
+-
+-      return ret;
+-}
+-
+-arch_initcall(imx_dma_init);
+-
+-EXPORT_SYMBOL(imx_dma_setup_single);
+-EXPORT_SYMBOL(imx_dma_setup_sg);
+-EXPORT_SYMBOL(imx_dma_setup_handlers);
+-EXPORT_SYMBOL(imx_dma_enable);
+-EXPORT_SYMBOL(imx_dma_disable);
+-EXPORT_SYMBOL(imx_dma_request);
+-EXPORT_SYMBOL(imx_dma_free);
+-EXPORT_SYMBOL(imx_dma_request_by_prio);
+-EXPORT_SYMBOL(imx_dma_channels);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/generic.c linux-2.6.30-rc4-git/arch/arm/mach-imx/generic.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/generic.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/generic.c   1970-01-01 01:00:00.000000000 +0100
+@@ -1,271 +0,0 @@
+-/*
+- *  arch/arm/mach-imx/generic.c
+- *
+- *  author: Sascha Hauer
+- *  Created: april 20th, 2004
+- *  Copyright: Synertronixx GmbH
+- *
+- *  Common code for i.MX machines
+- *
+- * 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/platform_device.h>
+-#include <linux/init.h>
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/string.h>
+-
+-#include <asm/errno.h>
+-#include <mach/hardware.h>
+-#include <mach/imx-regs.h>
+-
+-#include <asm/mach/map.h>
+-#include <mach/mmc.h>
+-#include <mach/gpio.h>
+-
+-unsigned long imx_gpio_alloc_map[(GPIO_PORT_MAX + 1) * 32 / BITS_PER_LONG];
+-
+-void imx_gpio_mode(int gpio_mode)
+-{
+-      unsigned int pin = gpio_mode & GPIO_PIN_MASK;
+-      unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
+-      unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT;
+-      unsigned int tmp;
+-
+-      /* Pullup enable */
+-      if(gpio_mode & GPIO_PUEN)
+-              PUEN(port) |= (1<<pin);
+-      else
+-              PUEN(port) &= ~(1<<pin);
+-
+-      /* Data direction */
+-      if(gpio_mode & GPIO_OUT)
+-              DDIR(port) |= 1<<pin;
+-      else
+-              DDIR(port) &= ~(1<<pin);
+-
+-      /* Primary / alternate function */
+-      if(gpio_mode & GPIO_AF)
+-              GPR(port) |= (1<<pin);
+-      else
+-              GPR(port) &= ~(1<<pin);
+-
+-      /* use as gpio? */
+-      if(gpio_mode &  GPIO_GIUS)
+-              GIUS(port) |= (1<<pin);
+-      else
+-              GIUS(port) &= ~(1<<pin);
+-
+-      /* Output / input configuration */
+-      /* FIXME: I'm not very sure about OCR and ICONF, someone
+-       * should have a look over it
+-       */
+-      if(pin<16) {
+-              tmp = OCR1(port);
+-              tmp &= ~( 3<<(pin*2));
+-              tmp |= (ocr << (pin*2));
+-              OCR1(port) = tmp;
+-
+-              ICONFA1(port) &= ~( 3<<(pin*2));
+-              ICONFA1(port) |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << (pin * 2);
+-              ICONFB1(port) &= ~( 3<<(pin*2));
+-              ICONFB1(port) |= ((gpio_mode >> GPIO_BOUT_SHIFT) & 3) << (pin * 2);
+-      } else {
+-              tmp = OCR2(port);
+-              tmp &= ~( 3<<((pin-16)*2));
+-              tmp |= (ocr << ((pin-16)*2));
+-              OCR2(port) = tmp;
+-
+-              ICONFA2(port) &= ~( 3<<((pin-16)*2));
+-              ICONFA2(port) |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << ((pin-16) * 2);
+-              ICONFB2(port) &= ~( 3<<((pin-16)*2));
+-              ICONFB2(port) |= ((gpio_mode >> GPIO_BOUT_SHIFT) & 3) << ((pin-16) * 2);
+-      }
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_mode);
+-
+-int imx_gpio_request(unsigned gpio, const char *label)
+-{
+-      if(gpio >= (GPIO_PORT_MAX + 1) * 32) {
+-              printk(KERN_ERR "imx_gpio: Attempt to request nonexistent GPIO %d for \"%s\"\n",
+-                      gpio, label ? label : "?");
+-              return -EINVAL;
+-      }
+-
+-      if(test_and_set_bit(gpio, imx_gpio_alloc_map)) {
+-              printk(KERN_ERR "imx_gpio: GPIO %d already used. Allocation for \"%s\" failed\n",
+-                      gpio, label ? label : "?");
+-              return -EBUSY;
+-      }
+-
+-      return 0;
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_request);
+-
+-void imx_gpio_free(unsigned gpio)
+-{
+-      if(gpio >= (GPIO_PORT_MAX + 1) * 32)
+-              return;
+-
+-      clear_bit(gpio, imx_gpio_alloc_map);
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_free);
+-
+-int imx_gpio_direction_input(unsigned gpio)
+-{
+-      imx_gpio_mode(gpio | GPIO_IN | GPIO_GIUS | GPIO_DR);
+-      return 0;
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_direction_input);
+-
+-int imx_gpio_direction_output(unsigned gpio, int value)
+-{
+-      imx_gpio_set_value(gpio, value);
+-      imx_gpio_mode(gpio | GPIO_OUT | GPIO_GIUS | GPIO_DR);
+-      return 0;
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_direction_output);
+-
+-int imx_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
+-                              int alloc_mode, const char *label)
+-{
+-      const int *p = pin_list;
+-      int i;
+-      unsigned gpio;
+-      unsigned mode;
+-
+-      for (i = 0; i < count; i++) {
+-              gpio = *p & (GPIO_PIN_MASK | GPIO_PORT_MASK);
+-              mode = *p & ~(GPIO_PIN_MASK | GPIO_PORT_MASK);
+-
+-              if (gpio >= (GPIO_PORT_MAX + 1) * 32)
+-                      goto setup_error;
+-
+-              if (alloc_mode & IMX_GPIO_ALLOC_MODE_RELEASE)
+-                      imx_gpio_free(gpio);
+-              else if (!(alloc_mode & IMX_GPIO_ALLOC_MODE_NO_ALLOC))
+-                      if (imx_gpio_request(gpio, label))
+-                              if (!(alloc_mode & IMX_GPIO_ALLOC_MODE_TRY_ALLOC))
+-                                      goto setup_error;
+-
+-              if (!(alloc_mode & (IMX_GPIO_ALLOC_MODE_ALLOC_ONLY |
+-                                  IMX_GPIO_ALLOC_MODE_RELEASE)))
+-                      imx_gpio_mode(gpio | mode);
+-
+-              p++;
+-      }
+-      return 0;
+-
+-setup_error:
+-      if(alloc_mode & (IMX_GPIO_ALLOC_MODE_NO_ALLOC |
+-                       IMX_GPIO_ALLOC_MODE_TRY_ALLOC))
+-              return -EINVAL;
+-
+-      while (p != pin_list) {
+-              p--;
+-              gpio = *p & (GPIO_PIN_MASK | GPIO_PORT_MASK);
+-              imx_gpio_free(gpio);
+-      }
+-
+-      return -EINVAL;
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_setup_multiple_pins);
+-
+-void __imx_gpio_set_value(unsigned gpio, int value)
+-{
+-      imx_gpio_set_value_inline(gpio, value);
+-}
+-
+-EXPORT_SYMBOL(__imx_gpio_set_value);
+-
+-int imx_gpio_to_irq(unsigned gpio)
+-{
+-      return IRQ_GPIOA(0) + gpio;
+-}
+-
+-EXPORT_SYMBOL(imx_gpio_to_irq);
+-
+-int imx_irq_to_gpio(unsigned irq)
+-{
+-      if (irq < IRQ_GPIOA(0))
+-              return -EINVAL;
+-      return irq - IRQ_GPIOA(0);
+-}
+-
+-EXPORT_SYMBOL(imx_irq_to_gpio);
+-
+-static struct resource imx_mmc_resources[] = {
+-      [0] = {
+-              .start  = 0x00214000,
+-              .end    = 0x002140FF,
+-              .flags  = IORESOURCE_MEM,
+-      },
+-      [1] = {
+-              .start  = (SDHC_INT),
+-              .end    = (SDHC_INT),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static u64 imxmmmc_dmamask = 0xffffffffUL;
+-
+-static struct platform_device imx_mmc_device = {
+-      .name           = "imx-mmc",
+-      .id             = 0,
+-      .dev            = {
+-              .dma_mask = &imxmmmc_dmamask,
+-              .coherent_dma_mask = 0xffffffff,
+-      },
+-      .num_resources  = ARRAY_SIZE(imx_mmc_resources),
+-      .resource       = imx_mmc_resources,
+-};
+-
+-void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
+-{
+-      imx_mmc_device.dev.platform_data = info;
+-}
+-
+-static struct platform_device *devices[] __initdata = {
+-      &imx_mmc_device,
+-};
+-
+-static struct map_desc imx_io_desc[] __initdata = {
+-      {
+-              .virtual        = IMX_IO_BASE,
+-              .pfn            = __phys_to_pfn(IMX_IO_PHYS),
+-              .length         = IMX_IO_SIZE,
+-              .type           = MT_DEVICE
+-      }
+-};
+-
+-void __init
+-imx_map_io(void)
+-{
+-      iotable_init(imx_io_desc, ARRAY_SIZE(imx_io_desc));
+-}
+-
+-static int __init imx_init(void)
+-{
+-      return platform_add_devices(devices, ARRAY_SIZE(devices));
+-}
+-
+-subsys_initcall(imx_init);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/generic.h linux-2.6.30-rc4-git/arch/arm/mach-imx/generic.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/generic.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/generic.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,16 +0,0 @@
+-/*
+- *  linux/arch/arm/mach-imx/generic.h
+- *
+- * Author:    Sascha Hauer <sascha@saschahauer.de>
+- * Copyright: Synertronixx GmbH
+- *
+- * 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.
+- */
+-
+-extern void __init imx_map_io(void);
+-extern void __init imx_init_irq(void);
+-
+-struct sys_timer;
+-extern struct sys_timer imx_timer;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/debug-macro.S linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/debug-macro.S
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/debug-macro.S      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/debug-macro.S  1970-01-01 01:00:00.000000000 +0100
+@@ -1,34 +0,0 @@
+-/* arch/arm/mach-imx/include/mach/debug-macro.S
+- *
+- * Debugging macro include header
+- *
+- *  Copyright (C) 1994-1999 Russell King
+- *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+-*/
+-
+-              .macro  addruart,rx
+-              mrc     p15, 0, \rx, c1, c0
+-              tst     \rx, #1                 @ MMU enabled?
+-              moveq   \rx, #0x00000000        @ physical
+-              movne   \rx, #0xe0000000        @ virtual
+-              orreq   \rx, \rx, #0x00200000   @ physical
+-              orr     \rx, \rx, #0x00006000   @ UART1 offset
+-              .endm
+-
+-              .macro  senduart,rd,rx
+-              str     \rd, [\rx, #0x40]       @ TXDATA
+-              .endm
+-
+-              .macro  waituart,rd,rx
+-              .endm
+-
+-              .macro  busyuart,rd,rx
+-1002:         ldr     \rd, [\rx, #0x98]       @ SR2
+-              tst     \rd, #1 << 3            @ TXDC
+-              beq     1002b                   @ wait until transmit done
+-              .endm
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/dma.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/dma.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/dma.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/dma.h  1970-01-01 01:00:00.000000000 +0100
+@@ -1,56 +0,0 @@
+-/*
+- *  linux/include/asm-arm/imxads/dma.h
+- *
+- *  Copyright (C) 1997,1998 Russell King
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#ifndef __ASM_ARCH_DMA_H
+-#define __ASM_ARCH_DMA_H
+-
+-typedef enum {
+-      DMA_PRIO_HIGH = 0,
+-      DMA_PRIO_MEDIUM = 1,
+-      DMA_PRIO_LOW = 2
+-} imx_dma_prio;
+-
+-#define DMA_REQ_UART3_T        2
+-#define DMA_REQ_UART3_R        3
+-#define DMA_REQ_SSI2_T         4
+-#define DMA_REQ_SSI2_R         5
+-#define DMA_REQ_CSI_STAT       6
+-#define DMA_REQ_CSI_R          7
+-#define DMA_REQ_MSHC           8
+-#define DMA_REQ_DSPA_DCT_DOUT  9
+-#define DMA_REQ_DSPA_DCT_DIN  10
+-#define DMA_REQ_DSPA_MAC      11
+-#define DMA_REQ_EXT           12
+-#define DMA_REQ_SDHC          13
+-#define DMA_REQ_SPI1_R        14
+-#define DMA_REQ_SPI1_T        15
+-#define DMA_REQ_SSI_T         16
+-#define DMA_REQ_SSI_R         17
+-#define DMA_REQ_ASP_DAC       18
+-#define DMA_REQ_ASP_ADC       19
+-#define DMA_REQ_USP_EP(x)    (20+(x))
+-#define DMA_REQ_SPI2_R        26
+-#define DMA_REQ_SPI2_T        27
+-#define DMA_REQ_UART2_T       28
+-#define DMA_REQ_UART2_R       29
+-#define DMA_REQ_UART1_T       30
+-#define DMA_REQ_UART1_R       31
+-
+-#endif                                /* _ASM_ARCH_DMA_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/entry-macro.S linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/entry-macro.S
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/entry-macro.S      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/entry-macro.S  1970-01-01 01:00:00.000000000 +0100
+@@ -1,32 +0,0 @@
+-/*
+- * arch/arm/mach-imx/include/mach/entry-macro.S
+- *
+- * Low-level IRQ helper macros for iMX-based platforms
+- *
+- * This file is licensed under  the terms of the GNU General Public
+- * License version 2. This program is licensed "as is" without any
+- * warranty of any kind, whether express or implied.
+- */
+-#include <mach/hardware.h>
+-
+-              .macro  disable_fiq
+-              .endm
+-
+-              .macro  get_irqnr_preamble, base, tmp
+-              .endm
+-
+-              .macro  arch_ret_to_user, tmp1, tmp2
+-              .endm
+-
+-#define AITC_NIVECSR   0x40
+-              .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+-              ldr     \base, =IO_ADDRESS(IMX_AITC_BASE)
+-              @ Load offset & priority of the highest priority
+-              @ interrupt pending.
+-              ldr     \irqstat, [\base, #AITC_NIVECSR]
+-              @ Shift off the priority leaving the offset or
+-              @ "interrupt number", use arithmetic shift to
+-              @ transform illegal source (0xffff) as -1
+-              mov     \irqnr, \irqstat, asr #16
+-              adds    \tmp, \irqnr, #1
+-              .endm
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/gpio.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/gpio.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/gpio.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,106 +0,0 @@
+-#ifndef _IMX_GPIO_H
+-
+-#include <linux/kernel.h>
+-#include <mach/hardware.h>
+-#include <mach/imx-regs.h>
+-
+-#define IMX_GPIO_ALLOC_MODE_NORMAL    0
+-#define IMX_GPIO_ALLOC_MODE_NO_ALLOC  1
+-#define IMX_GPIO_ALLOC_MODE_TRY_ALLOC 2
+-#define IMX_GPIO_ALLOC_MODE_ALLOC_ONLY        4
+-#define IMX_GPIO_ALLOC_MODE_RELEASE   8
+-
+-extern int imx_gpio_request(unsigned gpio, const char *label);
+-
+-extern void imx_gpio_free(unsigned gpio);
+-
+-extern int imx_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
+-                                      int alloc_mode, const char *label);
+-
+-extern int imx_gpio_direction_input(unsigned gpio);
+-
+-extern int imx_gpio_direction_output(unsigned gpio, int value);
+-
+-extern void __imx_gpio_set_value(unsigned gpio, int value);
+-
+-static inline int imx_gpio_get_value(unsigned gpio)
+-{
+-      return SSR(gpio >> GPIO_PORT_SHIFT) & (1 << (gpio & GPIO_PIN_MASK));
+-}
+-
+-static inline void imx_gpio_set_value_inline(unsigned gpio, int value)
+-{
+-      unsigned long flags;
+-
+-      raw_local_irq_save(flags);
+-      if(value)
+-              DR(gpio >> GPIO_PORT_SHIFT) |= (1 << (gpio & GPIO_PIN_MASK));
+-      else
+-              DR(gpio >> GPIO_PORT_SHIFT) &= ~(1 << (gpio & GPIO_PIN_MASK));
+-      raw_local_irq_restore(flags);
+-}
+-
+-static inline void imx_gpio_set_value(unsigned gpio, int value)
+-{
+-      if(__builtin_constant_p(gpio))
+-              imx_gpio_set_value_inline(gpio, value);
+-      else
+-              __imx_gpio_set_value(gpio, value);
+-}
+-
+-extern int imx_gpio_to_irq(unsigned gpio);
+-
+-extern int imx_irq_to_gpio(unsigned irq);
+-
+-/*-------------------------------------------------------------------------*/
+-
+-/* Wrappers for "new style" GPIO calls. These calls i.MX specific versions
+- * to allow future extension of GPIO logic.
+- */
+-
+-static inline int gpio_request(unsigned gpio, const char *label)
+-{
+-      return imx_gpio_request(gpio, label);
+-}
+-
+-static inline void gpio_free(unsigned gpio)
+-{
+-      might_sleep();
+-
+-      imx_gpio_free(gpio);
+-}
+-
+-static inline  int gpio_direction_input(unsigned gpio)
+-{
+-      return imx_gpio_direction_input(gpio);
+-}
+-
+-static inline int gpio_direction_output(unsigned gpio, int value)
+-{
+-      return imx_gpio_direction_output(gpio, value);
+-}
+-
+-static inline int gpio_get_value(unsigned gpio)
+-{
+-      return imx_gpio_get_value(gpio);
+-}
+-
+-static inline void gpio_set_value(unsigned gpio, int value)
+-{
+-      imx_gpio_set_value(gpio, value);
+-}
+-
+-#include <asm-generic/gpio.h>         /* cansleep wrappers */
+-
+-static inline int gpio_to_irq(unsigned gpio)
+-{
+-      return imx_gpio_to_irq(gpio);
+-}
+-
+-static inline int irq_to_gpio(unsigned irq)
+-{
+-      return imx_irq_to_gpio(irq);
+-}
+-
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/hardware.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/hardware.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/hardware.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/hardware.h     1970-01-01 01:00:00.000000000 +0100
+@@ -1,91 +0,0 @@
+-/*
+- *  arch/arm/mach-imx/include/mach/hardware.h
+- *
+- *  Copyright (C) 1999 ARM Limited.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-#ifndef __ASM_ARCH_HARDWARE_H
+-#define __ASM_ARCH_HARDWARE_H
+-
+-#include <asm/sizes.h>
+-#include "imx-regs.h"
+-
+-#ifndef __ASSEMBLY__
+-# define __REG(x)     (*((volatile u32 *)IO_ADDRESS(x)))
+-
+-# define __REG2(x,y)        (*(volatile u32 *)((u32)&__REG(x) + (y)))
+-#endif
+-
+-/*
+- * Memory map
+- */
+-
+-#define IMX_IO_PHYS           0x00200000
+-#define IMX_IO_SIZE           0x00100000
+-#define IMX_IO_BASE           0xe0000000
+-
+-#define IMX_CS0_PHYS          0x10000000
+-#define IMX_CS0_SIZE          0x02000000
+-#define IMX_CS0_VIRT          0xe8000000
+-
+-#define IMX_CS1_PHYS          0x12000000
+-#define IMX_CS1_SIZE          0x01000000
+-#define IMX_CS1_VIRT          0xea000000
+-
+-#define IMX_CS2_PHYS          0x13000000
+-#define IMX_CS2_SIZE          0x01000000
+-#define IMX_CS2_VIRT          0xeb000000
+-
+-#define IMX_CS3_PHYS          0x14000000
+-#define IMX_CS3_SIZE          0x01000000
+-#define IMX_CS3_VIRT          0xec000000
+-
+-#define IMX_CS4_PHYS          0x15000000
+-#define IMX_CS4_SIZE          0x01000000
+-#define IMX_CS4_VIRT          0xed000000
+-
+-#define IMX_CS5_PHYS          0x16000000
+-#define IMX_CS5_SIZE          0x01000000
+-#define IMX_CS5_VIRT          0xee000000
+-
+-#define IMX_FB_VIRT           0xF1000000
+-#define IMX_FB_SIZE           (256*1024)
+-
+-/* macro to get at IO space when running virtually */
+-#define IO_ADDRESS(x) ((x) | IMX_IO_BASE)
+-
+-#ifndef __ASSEMBLY__
+-/*
+- * Handy routine to set GPIO functions
+- */
+-extern void imx_gpio_mode( int gpio_mode );
+-
+-#endif
+-
+-#define MAXIRQNUM                       62
+-#define MAXFIQNUM                       62
+-#define MAXSWINUM                       62
+-
+-/*
+- * Use SDRAM for memory
+- */
+-#define MEM_SIZE              0x01000000
+-
+-#ifdef CONFIG_ARCH_MX1ADS
+-#include "mx1ads.h"
+-#endif
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-dma.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-dma.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-dma.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-dma.h      1970-01-01 01:00:00.000000000 +0100
+@@ -1,98 +0,0 @@
+-/*
+- *  linux/include/asm-arm/imxads/dma.h
+- *
+- *  Copyright (C) 1997,1998 Russell King
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#include <mach/dma.h>
+-
+-#ifndef __ASM_ARCH_IMX_DMA_H
+-#define __ASM_ARCH_IMX_DMA_H
+-
+-#define IMX_DMA_CHANNELS  11
+-
+-/*
+- * struct imx_dma_channel - i.MX specific DMA extension
+- * @name: name specified by DMA client
+- * @irq_handler: client callback for end of transfer
+- * @err_handler: client callback for error condition
+- * @data: clients context data for callbacks
+- * @dma_mode: direction of the transfer %DMA_MODE_READ or %DMA_MODE_WRITE
+- * @sg: pointer to the actual read/written chunk for scatter-gather emulation
+- * @sgbc: counter of processed bytes in the actual read/written chunk
+- * @resbytes: total residual number of bytes to transfer
+- *            (it can be lower or same as sum of SG mapped chunk sizes)
+- * @sgcount: number of chunks to be read/written
+- *
+- * Structure is used for IMX DMA processing. It would be probably good
+- * @struct dma_struct in the future for external interfacing and use
+- * @struct imx_dma_channel only as extension to it.
+- */
+-
+-struct imx_dma_channel {
+-      const char *name;
+-      void (*irq_handler) (int, void *);
+-      void (*err_handler) (int, void *, int errcode);
+-      void *data;
+-      unsigned int  dma_mode;
+-      struct scatterlist *sg;
+-      unsigned int sgbc;
+-      unsigned int sgcount;
+-      unsigned int resbytes;
+-      int dma_num;
+-};
+-
+-extern struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS];
+-
+-#define IMX_DMA_ERR_BURST     1
+-#define IMX_DMA_ERR_REQUEST   2
+-#define IMX_DMA_ERR_TRANSFER  4
+-#define IMX_DMA_ERR_BUFFER    8
+-
+-/* The type to distinguish channel numbers parameter from ordinal int type */
+-typedef int imx_dmach_t;
+-
+-#define DMA_MODE_READ         0
+-#define DMA_MODE_WRITE                1
+-#define DMA_MODE_MASK         1
+-
+-int
+-imx_dma_setup_single(imx_dmach_t dma_ch, dma_addr_t dma_address,
+-              unsigned int dma_length, unsigned int dev_addr, unsigned int dmamode);
+-
+-int
+-imx_dma_setup_sg(imx_dmach_t dma_ch,
+-               struct scatterlist *sg, unsigned int sgcount, unsigned int dma_length,
+-               unsigned int dev_addr, unsigned int dmamode);
+-
+-int
+-imx_dma_setup_handlers(imx_dmach_t dma_ch,
+-              void (*irq_handler) (int, void *),
+-              void (*err_handler) (int, void *, int), void *data);
+-
+-void imx_dma_enable(imx_dmach_t dma_ch);
+-
+-void imx_dma_disable(imx_dmach_t dma_ch);
+-
+-int imx_dma_request(imx_dmach_t dma_ch, const char *name);
+-
+-void imx_dma_free(imx_dmach_t dma_ch);
+-
+-imx_dmach_t imx_dma_request_by_prio(const char *name, imx_dma_prio prio);
+-
+-
+-#endif        /* _ASM_ARCH_IMX_DMA_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-regs.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-regs.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-regs.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-regs.h     1970-01-01 01:00:00.000000000 +0100
+@@ -1,376 +0,0 @@
+-#ifndef _IMX_REGS_H
+-#define _IMX_REGS_H
+-/* ------------------------------------------------------------------------
+- *  Motorola IMX system registers
+- * ------------------------------------------------------------------------
+- *
+- */
+-
+-/*
+- *  Register BASEs, based on OFFSETs
+- *
+- */
+-#define IMX_AIPI1_BASE             (0x00000 + IMX_IO_BASE)
+-#define IMX_WDT_BASE               (0x01000 + IMX_IO_BASE)
+-#define IMX_TIM1_BASE              (0x02000 + IMX_IO_BASE)
+-#define IMX_TIM2_BASE              (0x03000 + IMX_IO_BASE)
+-#define IMX_RTC_BASE               (0x04000 + IMX_IO_BASE)
+-#define IMX_LCDC_BASE              (0x05000 + IMX_IO_BASE)
+-#define IMX_UART1_BASE             (0x06000 + IMX_IO_BASE)
+-#define IMX_UART2_BASE             (0x07000 + IMX_IO_BASE)
+-#define IMX_PWM_BASE               (0x08000 + IMX_IO_BASE)
+-#define IMX_DMAC_BASE              (0x09000 + IMX_IO_BASE)
+-#define IMX_AIPI2_BASE             (0x10000 + IMX_IO_BASE)
+-#define IMX_SIM_BASE               (0x11000 + IMX_IO_BASE)
+-#define IMX_USBD_BASE              (0x12000 + IMX_IO_BASE)
+-#define IMX_SPI1_BASE              (0x13000 + IMX_IO_BASE)
+-#define IMX_MMC_BASE               (0x14000 + IMX_IO_BASE)
+-#define IMX_ASP_BASE               (0x15000 + IMX_IO_BASE)
+-#define IMX_BTA_BASE               (0x16000 + IMX_IO_BASE)
+-#define IMX_I2C_BASE               (0x17000 + IMX_IO_BASE)
+-#define IMX_SSI_BASE               (0x18000 + IMX_IO_BASE)
+-#define IMX_SPI2_BASE              (0x19000 + IMX_IO_BASE)
+-#define IMX_MSHC_BASE              (0x1A000 + IMX_IO_BASE)
+-#define IMX_PLL_BASE               (0x1B000 + IMX_IO_BASE)
+-#define IMX_GPIO_BASE              (0x1C000 + IMX_IO_BASE)
+-#define IMX_EIM_BASE               (0x20000 + IMX_IO_BASE)
+-#define IMX_SDRAMC_BASE            (0x21000 + IMX_IO_BASE)
+-#define IMX_MMA_BASE               (0x22000 + IMX_IO_BASE)
+-#define IMX_AITC_BASE              (0x23000 + IMX_IO_BASE)
+-#define IMX_CSI_BASE               (0x24000 + IMX_IO_BASE)
+-
+-/* PLL registers */
+-#define CSCR   __REG(IMX_PLL_BASE)        /* Clock Source Control Register */
+-#define CSCR_SPLL_RESTART     (1<<22)
+-#define CSCR_MPLL_RESTART     (1<<21)
+-#define CSCR_SYSTEM_SEL               (1<<16)
+-#define CSCR_BCLK_DIV         (0xf<<10)
+-#define CSCR_MPU_PRESC                (1<<15)
+-#define CSCR_SPEN             (1<<1)
+-#define CSCR_MPEN             (1<<0)
+-
+-#define MPCTL0 __REG(IMX_PLL_BASE + 0x4)  /* MCU PLL Control Register 0 */
+-#define MPCTL1 __REG(IMX_PLL_BASE + 0x8)  /* MCU PLL and System Clock Register 1 */
+-#define SPCTL0 __REG(IMX_PLL_BASE + 0xc)  /* System PLL Control Register 0 */
+-#define SPCTL1 __REG(IMX_PLL_BASE + 0x10) /* System PLL Control Register 1 */
+-#define PCDR   __REG(IMX_PLL_BASE + 0x20) /* Peripheral Clock Divider Register */
+-
+-/*
+- *  GPIO Module and I/O Multiplexer
+- *  x = 0..3 for reg_A, reg_B, reg_C, reg_D
+- */
+-#define DDIR(x)    __REG2(IMX_GPIO_BASE + 0x00, ((x) & 3) << 8)
+-#define OCR1(x)    __REG2(IMX_GPIO_BASE + 0x04, ((x) & 3) << 8)
+-#define OCR2(x)    __REG2(IMX_GPIO_BASE + 0x08, ((x) & 3) << 8)
+-#define ICONFA1(x) __REG2(IMX_GPIO_BASE + 0x0c, ((x) & 3) << 8)
+-#define ICONFA2(x) __REG2(IMX_GPIO_BASE + 0x10, ((x) & 3) << 8)
+-#define ICONFB1(x) __REG2(IMX_GPIO_BASE + 0x14, ((x) & 3) << 8)
+-#define ICONFB2(x) __REG2(IMX_GPIO_BASE + 0x18, ((x) & 3) << 8)
+-#define DR(x)      __REG2(IMX_GPIO_BASE + 0x1c, ((x) & 3) << 8)
+-#define GIUS(x)    __REG2(IMX_GPIO_BASE + 0x20, ((x) & 3) << 8)
+-#define SSR(x)     __REG2(IMX_GPIO_BASE + 0x24, ((x) & 3) << 8)
+-#define ICR1(x)    __REG2(IMX_GPIO_BASE + 0x28, ((x) & 3) << 8)
+-#define ICR2(x)    __REG2(IMX_GPIO_BASE + 0x2c, ((x) & 3) << 8)
+-#define IMR(x)     __REG2(IMX_GPIO_BASE + 0x30, ((x) & 3) << 8)
+-#define ISR(x)     __REG2(IMX_GPIO_BASE + 0x34, ((x) & 3) << 8)
+-#define GPR(x)     __REG2(IMX_GPIO_BASE + 0x38, ((x) & 3) << 8)
+-#define SWR(x)     __REG2(IMX_GPIO_BASE + 0x3c, ((x) & 3) << 8)
+-#define PUEN(x)    __REG2(IMX_GPIO_BASE + 0x40, ((x) & 3) << 8)
+-
+-#define GPIO_PORT_MAX  3
+-
+-#define GPIO_PIN_MASK 0x1f
+-#define GPIO_PORT_MASK (0x3 << 5)
+-
+-#define GPIO_PORT_SHIFT 5
+-#define GPIO_PORTA (0<<5)
+-#define GPIO_PORTB (1<<5)
+-#define GPIO_PORTC (2<<5)
+-#define GPIO_PORTD (3<<5)
+-
+-#define GPIO_OUT   (1<<7)
+-#define GPIO_IN    (0<<7)
+-#define GPIO_PUEN  (1<<8)
+-
+-#define GPIO_PF    (0<<9)
+-#define GPIO_AF    (1<<9)
+-
+-#define GPIO_OCR_SHIFT 10
+-#define GPIO_OCR_MASK (3<<10)
+-#define GPIO_AIN   (0<<10)
+-#define GPIO_BIN   (1<<10)
+-#define GPIO_CIN   (2<<10)
+-#define GPIO_DR    (3<<10)
+-
+-#define GPIO_AOUT_SHIFT 12
+-#define GPIO_AOUT_MASK (3<<12)
+-#define GPIO_AOUT     (0<<12)
+-#define GPIO_AOUT_ISR (1<<12)
+-#define GPIO_AOUT_0   (2<<12)
+-#define GPIO_AOUT_1   (3<<12)
+-
+-#define GPIO_BOUT_SHIFT 14
+-#define GPIO_BOUT_MASK (3<<14)
+-#define GPIO_BOUT      (0<<14)
+-#define GPIO_BOUT_ISR  (1<<14)
+-#define GPIO_BOUT_0    (2<<14)
+-#define GPIO_BOUT_1    (3<<14)
+-
+-#define GPIO_GIUS      (1<<16)
+-
+-/* assignements for GPIO alternate/primary functions */
+-
+-/* FIXME: This list is not completed. The correct directions are
+- * missing on some (many) pins
+- */
+-#define PA0_AIN_SPI2_CLK     ( GPIO_GIUS | GPIO_PORTA | GPIO_OUT | 0 )
+-#define PA0_AF_ETMTRACESYNC  ( GPIO_PORTA | GPIO_AF | 0 )
+-#define PA1_AOUT_SPI2_RXD    ( GPIO_GIUS | GPIO_PORTA | GPIO_IN | 1 )
+-#define PA1_PF_TIN           ( GPIO_PORTA | GPIO_PF | 1 )
+-#define PA2_PF_PWM0          ( GPIO_PORTA | GPIO_OUT | GPIO_PF | 2 )
+-#define PA3_PF_CSI_MCLK      ( GPIO_PORTA | GPIO_PF | 3 )
+-#define PA4_PF_CSI_D0        ( GPIO_PORTA | GPIO_PF | 4 )
+-#define PA5_PF_CSI_D1        ( GPIO_PORTA | GPIO_PF | 5 )
+-#define PA6_PF_CSI_D2        ( GPIO_PORTA | GPIO_PF | 6 )
+-#define PA7_PF_CSI_D3        ( GPIO_PORTA | GPIO_PF | 7 )
+-#define PA8_PF_CSI_D4        ( GPIO_PORTA | GPIO_PF | 8 )
+-#define PA9_PF_CSI_D5        ( GPIO_PORTA | GPIO_PF | 9 )
+-#define PA10_PF_CSI_D6       ( GPIO_PORTA | GPIO_PF | 10 )
+-#define PA11_PF_CSI_D7       ( GPIO_PORTA | GPIO_PF | 11 )
+-#define PA12_PF_CSI_VSYNC    ( GPIO_PORTA | GPIO_PF | 12 )
+-#define PA13_PF_CSI_HSYNC    ( GPIO_PORTA | GPIO_PF | 13 )
+-#define PA14_PF_CSI_PIXCLK   ( GPIO_PORTA | GPIO_PF | 14 )
+-#define PA15_PF_I2C_SDA      ( GPIO_PORTA | GPIO_OUT | GPIO_PF | 15 )
+-#define PA16_PF_I2C_SCL      ( GPIO_PORTA | GPIO_OUT | GPIO_PF | 16 )
+-#define PA17_AF_ETMTRACEPKT4 ( GPIO_PORTA | GPIO_AF | 17 )
+-#define PA17_AIN_SPI2_SS     ( GPIO_GIUS | GPIO_PORTA | GPIO_OUT | 17 )
+-#define PA18_AF_ETMTRACEPKT5 ( GPIO_PORTA | GPIO_AF | 18 )
+-#define PA19_AF_ETMTRACEPKT6 ( GPIO_PORTA | GPIO_AF | 19 )
+-#define PA20_AF_ETMTRACEPKT7 ( GPIO_PORTA | GPIO_AF | 20 )
+-#define PA21_PF_A0           ( GPIO_PORTA | GPIO_PF | 21 )
+-#define PA22_PF_CS4          ( GPIO_PORTA | GPIO_PF | 22 )
+-#define PA23_PF_CS5          ( GPIO_PORTA | GPIO_PF | 23 )
+-#define PA24_PF_A16          ( GPIO_PORTA | GPIO_PF | 24 )
+-#define PA24_AF_ETMTRACEPKT0 ( GPIO_PORTA | GPIO_AF | 24 )
+-#define PA25_PF_A17          ( GPIO_PORTA | GPIO_PF | 25 )
+-#define PA25_AF_ETMTRACEPKT1 ( GPIO_PORTA | GPIO_AF | 25 )
+-#define PA26_PF_A18          ( GPIO_PORTA | GPIO_PF | 26 )
+-#define PA26_AF_ETMTRACEPKT2 ( GPIO_PORTA | GPIO_AF | 26 )
+-#define PA27_PF_A19          ( GPIO_PORTA | GPIO_PF | 27 )
+-#define PA27_AF_ETMTRACEPKT3 ( GPIO_PORTA | GPIO_AF | 27 )
+-#define PA28_PF_A20          ( GPIO_PORTA | GPIO_PF | 28 )
+-#define PA28_AF_ETMPIPESTAT0 ( GPIO_PORTA | GPIO_AF | 28 )
+-#define PA29_PF_A21          ( GPIO_PORTA | GPIO_PF | 29 )
+-#define PA29_AF_ETMPIPESTAT1 ( GPIO_PORTA | GPIO_AF | 29 )
+-#define PA30_PF_A22          ( GPIO_PORTA | GPIO_PF | 30 )
+-#define PA30_AF_ETMPIPESTAT2 ( GPIO_PORTA | GPIO_AF | 30 )
+-#define PA31_PF_A23          ( GPIO_PORTA | GPIO_PF | 31 )
+-#define PA31_AF_ETMTRACECLK  ( GPIO_PORTA | GPIO_AF | 31 )
+-#define PB8_PF_SD_DAT0       ( GPIO_PORTB | GPIO_PF | GPIO_PUEN | 8 )
+-#define PB8_AF_MS_PIO        ( GPIO_PORTB | GPIO_AF | 8 )
+-#define PB9_PF_SD_DAT1       ( GPIO_PORTB | GPIO_PF | GPIO_PUEN  | 9 )
+-#define PB9_AF_MS_PI1        ( GPIO_PORTB | GPIO_AF | 9 )
+-#define PB10_PF_SD_DAT2      ( GPIO_PORTB | GPIO_PF | GPIO_PUEN  | 10 )
+-#define PB10_AF_MS_SCLKI     ( GPIO_PORTB | GPIO_AF | 10 )
+-#define PB11_PF_SD_DAT3      ( GPIO_PORTB | GPIO_PF | 11 )
+-#define PB11_AF_MS_SDIO      ( GPIO_PORTB | GPIO_AF | 11 )
+-#define PB12_PF_SD_CLK       ( GPIO_PORTB | GPIO_PF | 12 )
+-#define PB12_AF_MS_SCLK0     ( GPIO_PORTB | GPIO_AF | 12 )
+-#define PB13_PF_SD_CMD       ( GPIO_PORTB | GPIO_PF | GPIO_PUEN | 13 )
+-#define PB13_AF_MS_BS        ( GPIO_PORTB | GPIO_AF | 13 )
+-#define PB14_AF_SSI_RXFS     ( GPIO_PORTB | GPIO_AF | 14 )
+-#define PB15_AF_SSI_RXCLK    ( GPIO_PORTB | GPIO_AF | 15 )
+-#define PB16_AF_SSI_RXDAT    ( GPIO_PORTB | GPIO_IN | GPIO_AF | 16 )
+-#define PB17_AF_SSI_TXDAT    ( GPIO_PORTB | GPIO_OUT | GPIO_AF | 17 )
+-#define PB18_AF_SSI_TXFS     ( GPIO_PORTB | GPIO_AF | 18 )
+-#define PB19_AF_SSI_TXCLK    ( GPIO_PORTB | GPIO_AF | 19 )
+-#define PB20_PF_USBD_AFE     ( GPIO_PORTB | GPIO_PF | 20 )
+-#define PB21_PF_USBD_OE      ( GPIO_PORTB | GPIO_PF | 21 )
+-#define PB22_PFUSBD_RCV      ( GPIO_PORTB | GPIO_PF | 22 )
+-#define PB23_PF_USBD_SUSPND  ( GPIO_PORTB | GPIO_PF | 23 )
+-#define PB24_PF_USBD_VP      ( GPIO_PORTB | GPIO_PF | 24 )
+-#define PB25_PF_USBD_VM      ( GPIO_PORTB | GPIO_PF | 25 )
+-#define PB26_PF_USBD_VPO     ( GPIO_PORTB | GPIO_PF | 26 )
+-#define PB27_PF_USBD_VMO     ( GPIO_PORTB | GPIO_PF | 27 )
+-#define PB28_PF_UART2_CTS    ( GPIO_PORTB | GPIO_OUT | GPIO_PF | 28 )
+-#define PB29_PF_UART2_RTS    ( GPIO_PORTB | GPIO_IN | GPIO_PF | 29 )
+-#define PB30_PF_UART2_TXD    ( GPIO_PORTB | GPIO_OUT | GPIO_PF | 30 )
+-#define PB31_PF_UART2_RXD    ( GPIO_PORTB | GPIO_IN | GPIO_PF | 31 )
+-#define PC3_PF_SSI_RXFS      ( GPIO_PORTC | GPIO_PF | 3 )
+-#define PC4_PF_SSI_RXCLK     ( GPIO_PORTC | GPIO_PF | 4 )
+-#define PC5_PF_SSI_RXDAT     ( GPIO_PORTC | GPIO_IN | GPIO_PF | 5 )
+-#define PC6_PF_SSI_TXDAT     ( GPIO_PORTC | GPIO_OUT | GPIO_PF | 6 )
+-#define PC7_PF_SSI_TXFS      ( GPIO_PORTC | GPIO_PF | 7 )
+-#define PC8_PF_SSI_TXCLK     ( GPIO_PORTC | GPIO_PF | 8 )
+-#define PC9_PF_UART1_CTS     ( GPIO_PORTC | GPIO_OUT | GPIO_PF | 9 )
+-#define PC10_PF_UART1_RTS    ( GPIO_PORTC | GPIO_IN | GPIO_PF | 10 )
+-#define PC11_PF_UART1_TXD    ( GPIO_PORTC | GPIO_OUT | GPIO_PF | 11 )
+-#define PC12_PF_UART1_RXD    ( GPIO_PORTC | GPIO_IN | GPIO_PF | 12 )
+-#define PC13_PF_SPI1_SPI_RDY ( GPIO_PORTC | GPIO_PF | 13 )
+-#define PC14_PF_SPI1_SCLK    ( GPIO_PORTC | GPIO_PF | 14 )
+-#define PC15_PF_SPI1_SS      ( GPIO_PORTC | GPIO_PF | 15 )
+-#define PC16_PF_SPI1_MISO    ( GPIO_PORTC | GPIO_PF | 16 )
+-#define PC17_PF_SPI1_MOSI    ( GPIO_PORTC | GPIO_PF | 17 )
+-#define PC24_BIN_UART3_RI    ( GPIO_GIUS | GPIO_PORTC | GPIO_OUT | GPIO_BIN | 24 )
+-#define PC25_BIN_UART3_DSR   ( GPIO_GIUS | GPIO_PORTC | GPIO_OUT | GPIO_BIN | 25 )
+-#define PC26_AOUT_UART3_DTR  ( GPIO_GIUS | GPIO_PORTC | GPIO_IN | 26 )
+-#define PC27_BIN_UART3_DCD   ( GPIO_GIUS | GPIO_PORTC | GPIO_OUT | GPIO_BIN | 27 )
+-#define PC28_BIN_UART3_CTS   ( GPIO_GIUS | GPIO_PORTC | GPIO_OUT | GPIO_BIN | 28 )
+-#define PC29_AOUT_UART3_RTS  ( GPIO_GIUS | GPIO_PORTC | GPIO_IN | 29 )
+-#define PC30_BIN_UART3_TX    ( GPIO_GIUS | GPIO_PORTC | GPIO_BIN | 30 )
+-#define PC31_AOUT_UART3_RX   ( GPIO_GIUS | GPIO_PORTC | GPIO_IN | 31)
+-#define PD6_PF_LSCLK         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 6 )
+-#define PD7_PF_REV           ( GPIO_PORTD | GPIO_PF | 7 )
+-#define PD7_AF_UART2_DTR     ( GPIO_GIUS | GPIO_PORTD | GPIO_IN | GPIO_AF | 7 )
+-#define PD7_AIN_SPI2_SCLK    ( GPIO_GIUS | GPIO_PORTD | GPIO_AIN | 7 )
+-#define PD8_PF_CLS           ( GPIO_PORTD | GPIO_PF | 8 )
+-#define PD8_AF_UART2_DCD     ( GPIO_PORTD | GPIO_OUT | GPIO_AF | 8 )
+-#define PD8_AIN_SPI2_SS      ( GPIO_GIUS | GPIO_PORTD | GPIO_AIN | 8 )
+-#define PD9_PF_PS            ( GPIO_PORTD | GPIO_PF | 9 )
+-#define PD9_AF_UART2_RI      ( GPIO_PORTD | GPIO_OUT | GPIO_AF | 9 )
+-#define PD9_AOUT_SPI2_RXD    ( GPIO_GIUS | GPIO_PORTD | GPIO_IN | 9 )
+-#define PD10_PF_SPL_SPR      ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 10 )
+-#define PD10_AF_UART2_DSR    ( GPIO_PORTD | GPIO_OUT | GPIO_AF | 10 )
+-#define PD10_AIN_SPI2_TXD    ( GPIO_GIUS | GPIO_PORTD | GPIO_OUT | 10 )
+-#define PD11_PF_CONTRAST     ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 11 )
+-#define PD12_PF_ACD_OE       ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 12 )
+-#define PD13_PF_LP_HSYNC     ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 13 )
+-#define PD14_PF_FLM_VSYNC    ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 14 )
+-#define PD15_PF_LD0          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 15 )
+-#define PD16_PF_LD1          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 16 )
+-#define PD17_PF_LD2          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 17 )
+-#define PD18_PF_LD3          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 18 )
+-#define PD19_PF_LD4          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 19 )
+-#define PD20_PF_LD5          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 20 )
+-#define PD21_PF_LD6          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 21 )
+-#define PD22_PF_LD7          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 22 )
+-#define PD23_PF_LD8          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 23 )
+-#define PD24_PF_LD9          ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 24 )
+-#define PD25_PF_LD10         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 25 )
+-#define PD26_PF_LD11         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 26 )
+-#define PD27_PF_LD12         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 27 )
+-#define PD28_PF_LD13         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 28 )
+-#define PD29_PF_LD14         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 29 )
+-#define PD30_PF_LD15         ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 30 )
+-#define PD31_PF_TMR2OUT      ( GPIO_PORTD | GPIO_PF | 31 )
+-#define PD31_BIN_SPI2_TXD    ( GPIO_GIUS | GPIO_PORTD | GPIO_BIN | 31 )
+-
+-/*
+- * PWM controller
+- */
+-#define PWMC  __REG(IMX_PWM_BASE + 0x00)      /* PWM Control Register         */
+-#define PWMS  __REG(IMX_PWM_BASE + 0x04)      /* PWM Sample Register          */
+-#define PWMP  __REG(IMX_PWM_BASE + 0x08)      /* PWM Period Register          */
+-#define PWMCNT        __REG(IMX_PWM_BASE + 0x0C)      /* PWM Counter Register         */
+-
+-#define PWMC_HCTR             (0x01<<18)              /* Halfword FIFO Data Swapping  */
+-#define PWMC_BCTR             (0x01<<17)              /* Byte FIFO Data Swapping      */
+-#define PWMC_SWR              (0x01<<16)              /* Software Reset               */
+-#define PWMC_CLKSRC           (0x01<<15)              /* Clock Source                 */
+-#define PWMC_PRESCALER(x)     (((x-1) & 0x7F) << 8)   /* PRESCALER                    */
+-#define PWMC_IRQ              (0x01<< 7)              /* Interrupt Request            */
+-#define PWMC_IRQEN            (0x01<< 6)              /* Interrupt Request Enable     */
+-#define PWMC_FIFOAV           (0x01<< 5)              /* FIFO Available               */
+-#define PWMC_EN                       (0x01<< 4)              /* Enables/Disables the PWM     */
+-#define PWMC_REPEAT(x)                (((x) & 0x03) << 2)     /* Sample Repeats               */
+-#define PWMC_CLKSEL(x)                (((x) & 0x03) << 0)     /* Clock Selection              */
+-
+-#define PWMS_SAMPLE(x)                ((x) & 0xFFFF)          /* Contains a two-sample word   */
+-#define PWMP_PERIOD(x)                ((x) & 0xFFFF)          /* Represents the PWM's period  */
+-#define PWMC_COUNTER(x)               ((x) & 0xFFFF)          /* Represents the current count value   */
+-
+-/*
+- *  DMA Controller
+- */
+-#define DCR     __REG(IMX_DMAC_BASE +0x00)    /* DMA Control Register */
+-#define DISR    __REG(IMX_DMAC_BASE +0x04)    /* DMA Interrupt status Register */
+-#define DIMR    __REG(IMX_DMAC_BASE +0x08)    /* DMA Interrupt mask Register */
+-#define DBTOSR  __REG(IMX_DMAC_BASE +0x0c)    /* DMA Burst timeout status Register */
+-#define DRTOSR  __REG(IMX_DMAC_BASE +0x10)    /* DMA Request timeout Register */
+-#define DSESR   __REG(IMX_DMAC_BASE +0x14)    /* DMA Transfer Error Status Register */
+-#define DBOSR   __REG(IMX_DMAC_BASE +0x18)    /* DMA Buffer overflow status Register */
+-#define DBTOCR  __REG(IMX_DMAC_BASE +0x1c)    /* DMA Burst timeout control Register */
+-#define WSRA    __REG(IMX_DMAC_BASE +0x40)    /* W-Size Register A */
+-#define XSRA    __REG(IMX_DMAC_BASE +0x44)    /* X-Size Register A */
+-#define YSRA    __REG(IMX_DMAC_BASE +0x48)    /* Y-Size Register A */
+-#define WSRB    __REG(IMX_DMAC_BASE +0x4c)    /* W-Size Register B */
+-#define XSRB    __REG(IMX_DMAC_BASE +0x50)    /* X-Size Register B */
+-#define YSRB    __REG(IMX_DMAC_BASE +0x54)    /* Y-Size Register B */
+-#define SAR(x)  __REG2( IMX_DMAC_BASE + 0x80, (x) << 6)       /* Source Address Registers */
+-#define DAR(x)  __REG2( IMX_DMAC_BASE + 0x84, (x) << 6)       /* Destination Address Registers */
+-#define CNTR(x) __REG2( IMX_DMAC_BASE + 0x88, (x) << 6)       /* Count Registers */
+-#define CCR(x)  __REG2( IMX_DMAC_BASE + 0x8c, (x) << 6)       /* Control Registers */
+-#define RSSR(x) __REG2( IMX_DMAC_BASE + 0x90, (x) << 6)       /* Request source select Registers */
+-#define BLR(x)  __REG2( IMX_DMAC_BASE + 0x94, (x) << 6)       /* Burst length Registers */
+-#define RTOR(x) __REG2( IMX_DMAC_BASE + 0x98, (x) << 6)       /* Request timeout Registers */
+-#define BUCR(x) __REG2( IMX_DMAC_BASE + 0x98, (x) << 6)       /* Bus Utilization Registers */
+-
+-#define DCR_DRST           (1<<1)
+-#define DCR_DEN            (1<<0)
+-#define DBTOCR_EN          (1<<15)
+-#define DBTOCR_CNT(x)      ((x) & 0x7fff )
+-#define CNTR_CNT(x)        ((x) & 0xffffff )
+-#define CCR_DMOD_LINEAR    ( 0x0 << 12 )
+-#define CCR_DMOD_2D        ( 0x1 << 12 )
+-#define CCR_DMOD_FIFO      ( 0x2 << 12 )
+-#define CCR_DMOD_EOBFIFO   ( 0x3 << 12 )
+-#define CCR_SMOD_LINEAR    ( 0x0 << 10 )
+-#define CCR_SMOD_2D        ( 0x1 << 10 )
+-#define CCR_SMOD_FIFO      ( 0x2 << 10 )
+-#define CCR_SMOD_EOBFIFO   ( 0x3 << 10 )
+-#define CCR_MDIR_DEC       (1<<9)
+-#define CCR_MSEL_B         (1<<8)
+-#define CCR_DSIZ_32        ( 0x0 << 6 )
+-#define CCR_DSIZ_8         ( 0x1 << 6 )
+-#define CCR_DSIZ_16        ( 0x2 << 6 )
+-#define CCR_SSIZ_32        ( 0x0 << 4 )
+-#define CCR_SSIZ_8         ( 0x1 << 4 )
+-#define CCR_SSIZ_16        ( 0x2 << 4 )
+-#define CCR_REN            (1<<3)
+-#define CCR_RPT            (1<<2)
+-#define CCR_FRC            (1<<1)
+-#define CCR_CEN            (1<<0)
+-#define RTOR_EN            (1<<15)
+-#define RTOR_CLK           (1<<14)
+-#define RTOR_PSC           (1<<13)
+-
+-/*
+- *  Interrupt controller
+- */
+-
+-#define IMX_INTCNTL        __REG(IMX_AITC_BASE+0x00)
+-#define INTCNTL_FIAD       (1<<19)
+-#define INTCNTL_NIAD       (1<<20)
+-
+-#define IMX_NIMASK         __REG(IMX_AITC_BASE+0x04)
+-#define IMX_INTENNUM       __REG(IMX_AITC_BASE+0x08)
+-#define IMX_INTDISNUM      __REG(IMX_AITC_BASE+0x0c)
+-#define IMX_INTENABLEH     __REG(IMX_AITC_BASE+0x10)
+-#define IMX_INTENABLEL     __REG(IMX_AITC_BASE+0x14)
+-
+-/*
+- *  General purpose timers
+- */
+-#define IMX_TCTL(x)        __REG( 0x00 + (x))
+-#define TCTL_SWR           (1<<15)
+-#define TCTL_FRR           (1<<8)
+-#define TCTL_CAP_RIS       (1<<6)
+-#define TCTL_CAP_FAL       (2<<6)
+-#define TCTL_CAP_RIS_FAL   (3<<6)
+-#define TCTL_OM            (1<<5)
+-#define TCTL_IRQEN         (1<<4)
+-#define TCTL_CLK_PCLK1     (1<<1)
+-#define TCTL_CLK_PCLK1_16  (2<<1)
+-#define TCTL_CLK_TIN       (3<<1)
+-#define TCTL_CLK_32        (4<<1)
+-#define TCTL_TEN           (1<<0)
+-
+-#define IMX_TPRER(x)       __REG( 0x04 + (x))
+-#define IMX_TCMP(x)        __REG( 0x08 + (x))
+-#define IMX_TCR(x)         __REG( 0x0C + (x))
+-#define IMX_TCN(x)         __REG( 0x10 + (x))
+-#define IMX_TSTAT(x)       __REG( 0x14 + (x))
+-#define TSTAT_CAPT         (1<<1)
+-#define TSTAT_COMP         (1<<0)
+-
+-#endif                                // _IMX_REGS_H
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-uart.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-uart.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/imx-uart.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/imx-uart.h     1970-01-01 01:00:00.000000000 +0100
+@@ -1,12 +0,0 @@
+-#ifndef ASMARM_ARCH_UART_H
+-#define ASMARM_ARCH_UART_H
+-
+-#define IMXUART_HAVE_RTSCTS (1<<0)
+-
+-struct imxuart_platform_data {
+-      int (*init)(struct platform_device *pdev);
+-      void (*exit)(struct platform_device *pdev);
+-      unsigned int flags;
+-};
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/io.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/io.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/io.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/io.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,28 +0,0 @@
+-/*
+- *  arch/arm/mach-imxads/include/mach/io.h
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-#ifndef __ASM_ARM_ARCH_IO_H
+-#define __ASM_ARM_ARCH_IO_H
+-
+-#define IO_SPACE_LIMIT 0xffffffff
+-
+-#define __io(a)               __typesafe_io(a)
+-#define __mem_pci(a)  (a)
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/irqs.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/irqs.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/irqs.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,121 +0,0 @@
+-/*
+- *  arch/arm/mach-imxads/include/mach/irqs.h
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#ifndef __ARM_IRQS_H__
+-#define __ARM_IRQS_H__
+-
+-/* Use the imx definitions */
+-#include <mach/hardware.h>
+-
+-/*
+- *  IMX Interrupt numbers
+- *
+- */
+-#define INT_SOFTINT                 0
+-#define CSI_INT                     6
+-#define DSPA_MAC_INT                7
+-#define DSPA_INT                    8
+-#define COMP_INT                    9
+-#define MSHC_XINT                   10
+-#define GPIO_INT_PORTA              11
+-#define GPIO_INT_PORTB              12
+-#define GPIO_INT_PORTC              13
+-#define LCDC_INT                    14
+-#define SIM_INT                     15
+-#define SIM_DATA_INT                16
+-#define RTC_INT                     17
+-#define RTC_SAMINT                  18
+-#define UART2_MINT_PFERR            19
+-#define UART2_MINT_RTS              20
+-#define UART2_MINT_DTR              21
+-#define UART2_MINT_UARTC            22
+-#define UART2_MINT_TX               23
+-#define UART2_MINT_RX               24
+-#define UART1_MINT_PFERR            25
+-#define UART1_MINT_RTS              26
+-#define UART1_MINT_DTR              27
+-#define UART1_MINT_UARTC            28
+-#define UART1_MINT_TX               29
+-#define UART1_MINT_RX               30
+-#define VOICE_DAC_INT               31
+-#define VOICE_ADC_INT               32
+-#define PEN_DATA_INT                33
+-#define PWM_INT                     34
+-#define SDHC_INT                    35
+-#define I2C_INT                     39
+-#define CSPI_INT                    41
+-#define SSI_TX_INT                  42
+-#define SSI_TX_ERR_INT              43
+-#define SSI_RX_INT                  44
+-#define SSI_RX_ERR_INT              45
+-#define TOUCH_INT                   46
+-#define USBD_INT0                   47
+-#define USBD_INT1                   48
+-#define USBD_INT2                   49
+-#define USBD_INT3                   50
+-#define USBD_INT4                   51
+-#define USBD_INT5                   52
+-#define USBD_INT6                   53
+-#define BTSYS_INT                   55
+-#define BTTIM_INT                   56
+-#define BTWUI_INT                   57
+-#define TIM2_INT                    58
+-#define TIM1_INT                    59
+-#define DMA_ERR                     60
+-#define DMA_INT                     61
+-#define GPIO_INT_PORTD              62
+-
+-#define IMX_IRQS                         (64)
+-
+-/* note: the IMX has four gpio ports (A-D), but only
+- *       the following pins are connected to the outside
+- *       world:
+- *
+- * PORT A: bits 0-31
+- * PORT B: bits 8-31
+- * PORT C: bits 3-17
+- * PORT D: bits 6-31
+- *
+- * We map these interrupts straight on. As a result we have
+- * several holes in the interrupt mapping. We do this for two
+- * reasons:
+- *   - mapping the interrupts without holes would get
+- *     far more complicated
+- *   - Motorola could well decide to bring some processor
+- *     with more pins connected
+- */
+-
+-#define IRQ_GPIOA(x)  (IMX_IRQS + x)
+-#define IRQ_GPIOB(x)  (IRQ_GPIOA(32) + x)
+-#define IRQ_GPIOC(x)  (IRQ_GPIOB(32) + x)
+-#define IRQ_GPIOD(x)  (IRQ_GPIOC(32) + x)
+-
+-/* decode irq number to use with IMR(x), ISR(x) and friends */
+-#define IRQ_TO_REG(irq) ((irq - IMX_IRQS) >> 5)
+-
+-/* all normal IRQs can be FIQs */
+-#define FIQ_START     0
+-/* switch betwean IRQ and FIQ */
+-extern int imx_set_irq_fiq(unsigned int irq, unsigned int type);
+-
+-#define NR_IRQS (IRQ_GPIOD(32) + 1)
+-#define IRQ_GPIO(x)
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/memory.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/memory.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/memory.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/memory.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1,26 +0,0 @@
+-/*
+- *  arch/arm/mach-imx/include/mach/memory.h
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-#ifndef __ASM_ARCH_MMU_H
+-#define __ASM_ARCH_MMU_H
+-
+-#define PHYS_OFFSET   UL(0x08000000)
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/mmc.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/mmc.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/mmc.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/mmc.h  1970-01-01 01:00:00.000000000 +0100
+@@ -1,15 +0,0 @@
+-#ifndef ASMARM_ARCH_MMC_H
+-#define ASMARM_ARCH_MMC_H
+-
+-#include <linux/mmc/host.h>
+-
+-struct device;
+-
+-struct imxmmc_platform_data {
+-      int (*card_present)(struct device *);
+-      int (*get_ro)(struct device *);
+-};
+-
+-extern void imx_set_mmc_info(struct imxmmc_platform_data *info);
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/mx1ads.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/mx1ads.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/mx1ads.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/mx1ads.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1,36 +0,0 @@
+-/*
+- * arch/arm/mach-imx/include/mach/mx1ads.h
+- *
+- * Copyright (C) 2004 Robert Schwebel, Pengutronix
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- *
+- */
+-
+-#ifndef __ASM_ARCH_MX1ADS_H
+-#define __ASM_ARCH_MX1ADS_H
+-
+-/* ------------------------------------------------------------------------ */
+-/* Memory Map for the M9328MX1ADS (MX1ADS) Board                            */
+-/* ------------------------------------------------------------------------ */
+-
+-#define MX1ADS_FLASH_PHYS             0x10000000
+-#define MX1ADS_FLASH_SIZE             (16*1024*1024)
+-
+-#define IMX_FB_PHYS                   (0x0C000000 - 0x40000)
+-
+-#define CLK32 32000
+-
+-#endif /* __ASM_ARCH_MX1ADS_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/spi_imx.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/spi_imx.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/spi_imx.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/spi_imx.h      1970-01-01 01:00:00.000000000 +0100
+@@ -1,72 +0,0 @@
+-/*
+- * arch/arm/mach-imx/include/mach/spi_imx.h
+- *
+- * Copyright (C) 2006 SWAPP
+- *    Andrea Paterniani <a.paterniani@swapp-eng.it>
+- *
+- * Initial version inspired by:
+- *    linux-2.6.17-rc3-mm1/arch/arm/mach-pxa/include/mach/pxa2xx_spi.h
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+- */
+-
+-#ifndef SPI_IMX_H_
+-#define SPI_IMX_H_
+-
+-
+-/*-------------------------------------------------------------------------*/
+-/**
+- * struct spi_imx_master - device.platform_data for SPI controller devices.
+- * @num_chipselect: chipselects are used to distinguish individual
+- *    SPI slaves, and are numbered from zero to num_chipselects - 1.
+- *    each slave has a chipselect signal, but it's common that not
+- *    every chipselect is connected to a slave.
+- * @enable_dma: if true enables DMA driven transfers.
+-*/
+-struct spi_imx_master {
+-      u8 num_chipselect;
+-      u8 enable_dma:1;
+-};
+-/*-------------------------------------------------------------------------*/
+-
+-
+-/*-------------------------------------------------------------------------*/
+-/**
+- * struct spi_imx_chip - spi_board_info.controller_data for SPI
+- * slave devices, copied to spi_device.controller_data.
+- * @enable_loopback : used for test purpouse to internally connect RX and TX
+- *    sections.
+- * @enable_dma : enables dma transfer (provided that controller driver has
+- *    dma enabled too).
+- * @ins_ss_pulse : enable /SS pulse insertion between SPI burst.
+- * @bclk_wait : number of bclk waits between each bits_per_word SPI burst.
+- * @cs_control : function pointer to board-specific function to assert/deassert
+- *    I/O port to control HW generation of devices chip-select.
+-*/
+-struct spi_imx_chip {
+-      u8      enable_loopback:1;
+-      u8      enable_dma:1;
+-      u8      ins_ss_pulse:1;
+-      u16     bclk_wait:15;
+-      void (*cs_control)(u32 control);
+-};
+-
+-/* Chip-select state */
+-#define SPI_CS_ASSERT                 (1 << 0)
+-#define SPI_CS_DEASSERT                       (1 << 1)
+-/*-------------------------------------------------------------------------*/
+-
+-
+-#endif /* SPI_IMX_H_*/
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/system.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/system.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/system.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/system.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1,40 +0,0 @@
+-/*
+- *  arch/arm/mach-imxads/include/mach/system.h
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *  Copyright (C) 2000 Deep Blue Solutions Ltd
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-#ifndef __ASM_ARCH_SYSTEM_H
+-#define __ASM_ARCH_SYSTEM_H
+-
+-static void
+-arch_idle(void)
+-{
+-      /*
+-       * This should do all the clock switching
+-       * and wait for interrupt tricks
+-       */
+-      cpu_do_idle();
+-}
+-
+-static inline void
+-arch_reset(char mode, const char *cmd)
+-{
+-      cpu_reset(0);
+-}
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/timex.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/timex.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/timex.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/timex.h        1970-01-01 01:00:00.000000000 +0100
+@@ -1,26 +0,0 @@
+-/*
+- *  linux/include/asm-arm/imx/timex.h
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#ifndef __ASM_ARCH_TIMEX_H
+-#define __ASM_ARCH_TIMEX_H
+-
+-#define CLOCK_TICK_RATE               (16000000)
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/uncompress.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/uncompress.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/uncompress.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/uncompress.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,71 +0,0 @@
+-/*
+- *  arch/arm/mach-imxads/include/mach/uncompress.h
+- *
+- *
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *  Copyright (C) Shane Nay (shane@minirl.com)
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#define UART(x) (*(volatile unsigned long *)(serial_port + (x)))
+-
+-#define UART1_BASE 0x206000
+-#define UART2_BASE 0x207000
+-#define USR2 0x98
+-#define USR2_TXFE (1<<14)
+-#define TXR  0x40
+-#define UCR1 0x80
+-#define UCR1_UARTEN 1
+-
+-/*
+- * The following code assumes the serial port has already been
+- * initialized by the bootloader.  We search for the first enabled
+- * port in the most probable order.  If you didn't setup a port in
+- * your bootloader then nothing will appear (which might be desired).
+- *
+- * This does not append a newline
+- */
+-static void putc(int c)
+-{
+-      unsigned long serial_port;
+-
+-      do {
+-              serial_port = UART1_BASE;
+-              if ( UART(UCR1) & UCR1_UARTEN )
+-                      break;
+-              serial_port = UART2_BASE;
+-              if ( UART(UCR1) & UCR1_UARTEN )
+-                      break;
+-              return;
+-      } while(0);
+-
+-      while (!(UART(USR2) & USR2_TXFE))
+-              barrier();
+-
+-      UART(TXR) = c;
+-}
+-
+-static inline void flush(void)
+-{
+-}
+-
+-/*
+- * nothing to do
+- */
+-#define arch_decomp_setup()
+-
+-#define arch_decomp_wdog()
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/vmalloc.h linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/vmalloc.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/include/mach/vmalloc.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/include/mach/vmalloc.h      1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-/*
+- *  arch/arm/mach-imx/include/mach/vmalloc.h
+- *
+- *  Copyright (C) 2000 Russell King.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-#define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/irq.c linux-2.6.30-rc4-git/arch/arm/mach-imx/irq.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/irq.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/irq.c       1970-01-01 01:00:00.000000000 +0100
+@@ -1,311 +0,0 @@
+-/*
+- *  linux/arch/arm/mach-imx/irq.c
+- *
+- *  Copyright (C) 1999 ARM Limited
+- *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- *
+- *  03/03/2004   Sascha Hauer <sascha@saschahauer.de>
+- *               Copied from the motorola bsp package and added gpio demux
+- *               interrupt handler
+- */
+-
+-#include <linux/init.h>
+-#include <linux/list.h>
+-#include <linux/timer.h>
+-#include <linux/io.h>
+-
+-#include <mach/hardware.h>
+-#include <asm/irq.h>
+-
+-#include <asm/mach/irq.h>
+-
+-/*
+- *
+- * We simply use the ENABLE DISABLE registers inside of the IMX
+- * to turn on/off specific interrupts.
+- *
+- */
+-
+-#define INTCNTL_OFF               0x00
+-#define NIMASK_OFF                0x04
+-#define INTENNUM_OFF              0x08
+-#define INTDISNUM_OFF             0x0C
+-#define INTENABLEH_OFF            0x10
+-#define INTENABLEL_OFF            0x14
+-#define INTTYPEH_OFF              0x18
+-#define INTTYPEL_OFF              0x1C
+-#define NIPRIORITY_OFF(x)         (0x20+4*(7-(x)))
+-#define NIVECSR_OFF               0x40
+-#define FIVECSR_OFF               0x44
+-#define INTSRCH_OFF               0x48
+-#define INTSRCL_OFF               0x4C
+-#define INTFRCH_OFF               0x50
+-#define INTFRCL_OFF               0x54
+-#define NIPNDH_OFF                0x58
+-#define NIPNDL_OFF                0x5C
+-#define FIPNDH_OFF                0x60
+-#define FIPNDL_OFF                0x64
+-
+-#define VA_AITC_BASE              IO_ADDRESS(IMX_AITC_BASE)
+-#define IMX_AITC_INTCNTL         (VA_AITC_BASE + INTCNTL_OFF)
+-#define IMX_AITC_NIMASK          (VA_AITC_BASE + NIMASK_OFF)
+-#define IMX_AITC_INTENNUM        (VA_AITC_BASE + INTENNUM_OFF)
+-#define IMX_AITC_INTDISNUM       (VA_AITC_BASE + INTDISNUM_OFF)
+-#define IMX_AITC_INTENABLEH      (VA_AITC_BASE + INTENABLEH_OFF)
+-#define IMX_AITC_INTENABLEL      (VA_AITC_BASE + INTENABLEL_OFF)
+-#define IMX_AITC_INTTYPEH        (VA_AITC_BASE + INTTYPEH_OFF)
+-#define IMX_AITC_INTTYPEL        (VA_AITC_BASE + INTTYPEL_OFF)
+-#define IMX_AITC_NIPRIORITY(x)   (VA_AITC_BASE + NIPRIORITY_OFF(x))
+-#define IMX_AITC_NIVECSR         (VA_AITC_BASE + NIVECSR_OFF)
+-#define IMX_AITC_FIVECSR         (VA_AITC_BASE + FIVECSR_OFF)
+-#define IMX_AITC_INTSRCH         (VA_AITC_BASE + INTSRCH_OFF)
+-#define IMX_AITC_INTSRCL         (VA_AITC_BASE + INTSRCL_OFF)
+-#define IMX_AITC_INTFRCH         (VA_AITC_BASE + INTFRCH_OFF)
+-#define IMX_AITC_INTFRCL         (VA_AITC_BASE + INTFRCL_OFF)
+-#define IMX_AITC_NIPNDH          (VA_AITC_BASE + NIPNDH_OFF)
+-#define IMX_AITC_NIPNDL          (VA_AITC_BASE + NIPNDL_OFF)
+-#define IMX_AITC_FIPNDH          (VA_AITC_BASE + FIPNDH_OFF)
+-#define IMX_AITC_FIPNDL          (VA_AITC_BASE + FIPNDL_OFF)
+-
+-#if 0
+-#define DEBUG_IRQ(fmt...)     printk(fmt)
+-#else
+-#define DEBUG_IRQ(fmt...)     do { } while (0)
+-#endif
+-
+-static void
+-imx_mask_irq(unsigned int irq)
+-{
+-      __raw_writel(irq, IMX_AITC_INTDISNUM);
+-}
+-
+-static void
+-imx_unmask_irq(unsigned int irq)
+-{
+-      __raw_writel(irq, IMX_AITC_INTENNUM);
+-}
+-
+-#ifdef CONFIG_FIQ
+-int imx_set_irq_fiq(unsigned int irq, unsigned int type)
+-{
+-      unsigned int irqt;
+-
+-      if (irq >= IMX_IRQS)
+-              return -EINVAL;
+-
+-      if (irq < IMX_IRQS / 2) {
+-              irqt = __raw_readl(IMX_AITC_INTTYPEL) & ~(1 << irq);
+-              __raw_writel(irqt | (!!type << irq), IMX_AITC_INTTYPEL);
+-      } else {
+-              irq -= IMX_IRQS / 2;
+-              irqt = __raw_readl(IMX_AITC_INTTYPEH) & ~(1 << irq);
+-              __raw_writel(irqt | (!!type << irq), IMX_AITC_INTTYPEH);
+-      }
+-
+-      return 0;
+-}
+-EXPORT_SYMBOL(imx_set_irq_fiq);
+-#endif /* CONFIG_FIQ */
+-
+-static int
+-imx_gpio_irq_type(unsigned int _irq, unsigned int type)
+-{
+-      unsigned int irq_type = 0, irq, reg, bit;
+-
+-      irq = _irq - IRQ_GPIOA(0);
+-      reg = irq >> 5;
+-      bit = 1 << (irq % 32);
+-
+-      if (type == IRQ_TYPE_PROBE) {
+-              /* Don't mess with enabled GPIOs using preconfigured edges or
+-                 GPIOs set to alternate function during probe */
+-              /* TODO: support probe */
+-//              if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx]) &
+-//                  GPIO_bit(gpio))
+-//                      return 0;
+-//              if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2)))
+-//                      return 0;
+-//              type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
+-      }
+-
+-      GIUS(reg) |= bit;
+-      DDIR(reg) &= ~(bit);
+-
+-      DEBUG_IRQ("setting type of irq %d to ", _irq);
+-
+-      if (type & IRQ_TYPE_EDGE_RISING) {
+-              DEBUG_IRQ("rising edges\n");
+-              irq_type = 0x0;
+-      }
+-      if (type & IRQ_TYPE_EDGE_FALLING) {
+-              DEBUG_IRQ("falling edges\n");
+-              irq_type = 0x1;
+-      }
+-      if (type & IRQ_TYPE_LEVEL_LOW) {
+-              DEBUG_IRQ("low level\n");
+-              irq_type = 0x3;
+-      }
+-      if (type & IRQ_TYPE_LEVEL_HIGH) {
+-              DEBUG_IRQ("high level\n");
+-              irq_type = 0x2;
+-      }
+-
+-      if (irq % 32 < 16) {
+-              ICR1(reg) = (ICR1(reg) & ~(0x3 << ((irq % 16) * 2))) |
+-                  (irq_type << ((irq % 16) * 2));
+-      } else {
+-              ICR2(reg) = (ICR2(reg) & ~(0x3 << ((irq % 16) * 2))) |
+-                  (irq_type << ((irq % 16) * 2));
+-      }
+-
+-      return 0;
+-
+-}
+-
+-static void
+-imx_gpio_ack_irq(unsigned int irq)
+-{
+-      DEBUG_IRQ("%s: irq %d\n", __func__, irq);
+-      ISR(IRQ_TO_REG(irq)) = 1 << ((irq - IRQ_GPIOA(0)) % 32);
+-}
+-
+-static void
+-imx_gpio_mask_irq(unsigned int irq)
+-{
+-      DEBUG_IRQ("%s: irq %d\n", __func__, irq);
+-      IMR(IRQ_TO_REG(irq)) &= ~( 1 << ((irq - IRQ_GPIOA(0)) % 32));
+-}
+-
+-static void
+-imx_gpio_unmask_irq(unsigned int irq)
+-{
+-      DEBUG_IRQ("%s: irq %d\n", __func__, irq);
+-      IMR(IRQ_TO_REG(irq)) |= 1 << ((irq - IRQ_GPIOA(0)) % 32);
+-}
+-
+-static void
+-imx_gpio_handler(unsigned int mask, unsigned int irq,
+-                 struct irq_desc *desc)
+-{
+-      while (mask) {
+-              if (mask & 1) {
+-                      DEBUG_IRQ("handling irq %d\n", irq);
+-                      generic_handle_irq(irq);
+-              }
+-              irq++;
+-              mask >>= 1;
+-      }
+-}
+-
+-static void
+-imx_gpioa_demux_handler(unsigned int irq_unused, struct irq_desc *desc)
+-{
+-      unsigned int mask, irq;
+-
+-      mask = ISR(0);
+-      irq = IRQ_GPIOA(0);
+-      imx_gpio_handler(mask, irq, desc);
+-}
+-
+-static void
+-imx_gpiob_demux_handler(unsigned int irq_unused, struct irq_desc *desc)
+-{
+-      unsigned int mask, irq;
+-
+-      mask = ISR(1);
+-      irq = IRQ_GPIOB(0);
+-      imx_gpio_handler(mask, irq, desc);
+-}
+-
+-static void
+-imx_gpioc_demux_handler(unsigned int irq_unused, struct irq_desc *desc)
+-{
+-      unsigned int mask, irq;
+-
+-      mask = ISR(2);
+-      irq = IRQ_GPIOC(0);
+-      imx_gpio_handler(mask, irq, desc);
+-}
+-
+-static void
+-imx_gpiod_demux_handler(unsigned int irq_unused, struct irq_desc *desc)
+-{
+-      unsigned int mask, irq;
+-
+-      mask = ISR(3);
+-      irq = IRQ_GPIOD(0);
+-      imx_gpio_handler(mask, irq, desc);
+-}
+-
+-static struct irq_chip imx_internal_chip = {
+-      .name = "MPU",
+-      .ack = imx_mask_irq,
+-      .mask = imx_mask_irq,
+-      .unmask = imx_unmask_irq,
+-};
+-
+-static struct irq_chip imx_gpio_chip = {
+-      .name = "GPIO",
+-      .ack = imx_gpio_ack_irq,
+-      .mask = imx_gpio_mask_irq,
+-      .unmask = imx_gpio_unmask_irq,
+-      .set_type = imx_gpio_irq_type,
+-};
+-
+-void __init
+-imx_init_irq(void)
+-{
+-      unsigned int irq;
+-
+-      DEBUG_IRQ("Initializing imx interrupts\n");
+-
+-      /* Disable all interrupts initially. */
+-      /* Do not rely on the bootloader. */
+-      __raw_writel(0, IMX_AITC_INTENABLEH);
+-      __raw_writel(0, IMX_AITC_INTENABLEL);
+-
+-      /* Mask all GPIO interrupts as well */
+-      IMR(0) = 0;
+-      IMR(1) = 0;
+-      IMR(2) = 0;
+-      IMR(3) = 0;
+-
+-      for (irq = 0; irq < IMX_IRQS; irq++) {
+-              set_irq_chip(irq, &imx_internal_chip);
+-              set_irq_handler(irq, handle_level_irq);
+-              set_irq_flags(irq, IRQF_VALID);
+-      }
+-
+-      for (irq = IRQ_GPIOA(0); irq < IRQ_GPIOD(32); irq++) {
+-              set_irq_chip(irq, &imx_gpio_chip);
+-              set_irq_handler(irq, handle_edge_irq);
+-              set_irq_flags(irq, IRQF_VALID);
+-      }
+-
+-      set_irq_chained_handler(GPIO_INT_PORTA, imx_gpioa_demux_handler);
+-      set_irq_chained_handler(GPIO_INT_PORTB, imx_gpiob_demux_handler);
+-      set_irq_chained_handler(GPIO_INT_PORTC, imx_gpioc_demux_handler);
+-      set_irq_chained_handler(GPIO_INT_PORTD, imx_gpiod_demux_handler);
+-
+-      /* Release masking of interrupts according to priority */
+-      __raw_writel(-1, IMX_AITC_NIMASK);
+-
+-#ifdef CONFIG_FIQ
+-      /* Initialize FIQ */
+-      init_FIQ();
+-#endif
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/Kconfig linux-2.6.30-rc4-git/arch/arm/mach-imx/Kconfig
+--- linux-2.6.30-rc4/arch/arm/mach-imx/Kconfig 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/Kconfig     1970-01-01 01:00:00.000000000 +0100
+@@ -1,11 +0,0 @@
+-menu "IMX Implementations"
+-      depends on ARCH_IMX
+-
+-config ARCH_MX1ADS
+-      bool "mx1ads"
+-      depends on ARCH_IMX
+-      select ISA
+-      help
+-        Say Y here if you are using the Motorola MX1ADS board
+-
+-endmenu
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/leds.c linux-2.6.30-rc4-git/arch/arm/mach-imx/leds.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/leds.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/leds.c      1970-01-01 01:00:00.000000000 +0100
+@@ -1,31 +0,0 @@
+-/*
+- * linux/arch/arm/mach-imx/leds.c
+- *
+- * Copyright (C) 2004 Sascha Hauer <sascha@saschahauer.de>
+- *
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-
+-#include <asm/leds.h>
+-#include <asm/mach-types.h>
+-
+-#include "leds.h"
+-
+-static int __init
+-leds_init(void)
+-{
+-      if (machine_is_mx1ads()) {
+-              leds_event = mx1ads_leds_event;
+-      }
+-
+-      return 0;
+-}
+-
+-__initcall(leds_init);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/leds.h linux-2.6.30-rc4-git/arch/arm/mach-imx/leds.h
+--- linux-2.6.30-rc4/arch/arm/mach-imx/leds.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/leds.h      1970-01-01 01:00:00.000000000 +0100
+@@ -1,9 +0,0 @@
+-/*
+- * arch/arm/mach-imx/leds.h
+- *
+- * Copyright (c) 2004 Sascha Hauer <sascha@saschahauer.de>
+- *
+- * blinky lights for IMX-based systems
+- *
+- */
+-extern void mx1ads_leds_event(led_event_t evt);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/leds-mx1ads.c linux-2.6.30-rc4-git/arch/arm/mach-imx/leds-mx1ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/leds-mx1ads.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/leds-mx1ads.c       1970-01-01 01:00:00.000000000 +0100
+@@ -1,53 +0,0 @@
+-/*
+- * linux/arch/arm/mach-imx/leds-mx1ads.c
+- *
+- * Copyright (c) 2004 Sascha Hauer <sascha@saschahauer.de>
+- *
+- * Original (leds-footbridge.c) by 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.
+- *
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/io.h>
+-#include <mach/hardware.h>
+-#include <asm/system.h>
+-#include <asm/leds.h>
+-#include "leds.h"
+-
+-/*
+- * The MX1ADS Board has only one usable LED,
+- * so select only the timer led or the
+- * cpu usage led
+- */
+-void
+-mx1ads_leds_event(led_event_t ledevt)
+-{
+-      unsigned long flags;
+-
+-      local_irq_save(flags);
+-
+-      switch (ledevt) {
+-#ifdef CONFIG_LEDS_CPU
+-      case led_idle_start:
+-              DR(0) &= ~(1<<2);
+-              break;
+-
+-      case led_idle_end:
+-              DR(0) |= 1<<2;
+-              break;
+-#endif
+-
+-#ifdef CONFIG_LEDS_TIMER
+-      case led_timer:
+-              DR(0) ^= 1<<2;
+-#endif
+-      default:
+-              break;
+-      }
+-      local_irq_restore(flags);
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/Makefile linux-2.6.30-rc4-git/arch/arm/mach-imx/Makefile
+--- linux-2.6.30-rc4/arch/arm/mach-imx/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/Makefile    1970-01-01 01:00:00.000000000 +0100
+@@ -1,18 +0,0 @@
+-#
+-# Makefile for the linux kernel.
+-#
+-
+-# Object file lists.
+-
+-obj-y                 += irq.o time.o dma.o generic.o clock.o
+-
+-obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o
+-
+-# Specific board support
+-obj-$(CONFIG_ARCH_MX1ADS) += mx1ads.o
+-
+-# Support for blinky lights
+-led-y := leds.o
+-
+-obj-$(CONFIG_LEDS)    +=  $(led-y)
+-led-$(CONFIG_ARCH_MX1ADS) += leds-mx1ads.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/Makefile.boot linux-2.6.30-rc4-git/arch/arm/mach-imx/Makefile.boot
+--- linux-2.6.30-rc4/arch/arm/mach-imx/Makefile.boot   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/Makefile.boot       1970-01-01 01:00:00.000000000 +0100
+@@ -1,2 +0,0 @@
+-    zreladdr-$(CONFIG_ARCH_MX1ADS)    := 0x08008000
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/mx1ads.c linux-2.6.30-rc4-git/arch/arm/mach-imx/mx1ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/mx1ads.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/mx1ads.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,180 +0,0 @@
+-/*
+- * arch/arm/mach-imx/mx1ads.c
+- *
+- * Initially based on:
+- *    linux-2.6.7-imx/arch/arm/mach-imx/scb9328.c
+- *    Copyright (c) 2004 Sascha Hauer <sascha@saschahauer.de>
+- *
+- * 2004 (c) MontaVista Software, Inc.
+- *
+- * This file is licensed under the terms of the GNU General Public
+- * License version 2. This program is licensed "as is" without any
+- * warranty of any kind, whether express or implied.
+- */
+-
+-#include <linux/device.h>
+-#include <linux/init.h>
+-#include <linux/platform_device.h>
+-#include <asm/system.h>
+-#include <mach/hardware.h>
+-#include <asm/irq.h>
+-#include <asm/pgtable.h>
+-#include <asm/page.h>
+-
+-#include <asm/mach/map.h>
+-#include <asm/mach-types.h>
+-
+-#include <asm/mach/arch.h>
+-#include <mach/mmc.h>
+-#include <mach/imx-uart.h>
+-#include <linux/interrupt.h>
+-#include "generic.h"
+-
+-static struct resource cs89x0_resources[] = {
+-      [0] = {
+-              .start  = IMX_CS4_PHYS + 0x300,
+-              .end    = IMX_CS4_PHYS + 0x300 + 16,
+-              .flags  = IORESOURCE_MEM,
+-      },
+-      [1] = {
+-              .start  = IRQ_GPIOC(17),
+-              .end    = IRQ_GPIOC(17),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct platform_device cs89x0_device = {
+-      .name           = "cirrus-cs89x0",
+-      .num_resources  = ARRAY_SIZE(cs89x0_resources),
+-      .resource       = cs89x0_resources,
+-};
+-
+-static struct imxuart_platform_data uart_pdata = {
+-      .flags = IMXUART_HAVE_RTSCTS,
+-};
+-
+-static struct resource imx_uart1_resources[] = {
+-      [0] = {
+-              .start  = 0x00206000,
+-              .end    = 0x002060FF,
+-              .flags  = IORESOURCE_MEM,
+-      },
+-      [1] = {
+-              .start  = (UART1_MINT_RX),
+-              .end    = (UART1_MINT_RX),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-      [2] = {
+-              .start  = (UART1_MINT_TX),
+-              .end    = (UART1_MINT_TX),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-      [3] = {
+-              .start  = UART1_MINT_RTS,
+-              .end    = UART1_MINT_RTS,
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct platform_device imx_uart1_device = {
+-      .name           = "imx-uart",
+-      .id             = 0,
+-      .num_resources  = ARRAY_SIZE(imx_uart1_resources),
+-      .resource       = imx_uart1_resources,
+-      .dev = {
+-              .platform_data = &uart_pdata,
+-      }
+-};
+-
+-static struct resource imx_uart2_resources[] = {
+-      [0] = {
+-              .start  = 0x00207000,
+-              .end    = 0x002070FF,
+-              .flags  = IORESOURCE_MEM,
+-      },
+-      [1] = {
+-              .start  = (UART2_MINT_RX),
+-              .end    = (UART2_MINT_RX),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-      [2] = {
+-              .start  = (UART2_MINT_TX),
+-              .end    = (UART2_MINT_TX),
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-      [3] = {
+-              .start  = UART2_MINT_RTS,
+-              .end    = UART2_MINT_RTS,
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct platform_device imx_uart2_device = {
+-      .name           = "imx-uart",
+-      .id             = 1,
+-      .num_resources  = ARRAY_SIZE(imx_uart2_resources),
+-      .resource       = imx_uart2_resources,
+-      .dev = {
+-              .platform_data = &uart_pdata,
+-      }
+-};
+-
+-static struct platform_device *devices[] __initdata = {
+-      &cs89x0_device,
+-      &imx_uart1_device,
+-      &imx_uart2_device,
+-};
+-
+-#if defined(CONFIG_MMC_IMX) || defined(CONFIG_MMC_IMX_MODULE)
+-static int mx1ads_mmc_card_present(struct device *dev)
+-{
+-      /* MMC/SD Card Detect is PB 20 on MX1ADS V1.0.7 */
+-      return (SSR(1) & (1 << 20) ? 0 : 1);
+-}
+-
+-static struct imxmmc_platform_data mx1ads_mmc_info = {
+-       .card_present = mx1ads_mmc_card_present,
+-};
+-#endif
+-
+-static void __init
+-mx1ads_init(void)
+-{
+-#ifdef CONFIG_LEDS
+-      imx_gpio_mode(GPIO_PORTA | GPIO_OUT | 2);
+-#endif
+-#if defined(CONFIG_MMC_IMX) || defined(CONFIG_MMC_IMX_MODULE)
+-      /* SD/MMC card detect */
+-      imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_IN | 20);
+-      imx_set_mmc_info(&mx1ads_mmc_info);
+-#endif
+-
+-      imx_gpio_mode(PC9_PF_UART1_CTS);
+-      imx_gpio_mode(PC10_PF_UART1_RTS);
+-      imx_gpio_mode(PC11_PF_UART1_TXD);
+-      imx_gpio_mode(PC12_PF_UART1_RXD);
+-
+-      imx_gpio_mode(PB28_PF_UART2_CTS);
+-      imx_gpio_mode(PB29_PF_UART2_RTS);
+-      imx_gpio_mode(PB30_PF_UART2_TXD);
+-      imx_gpio_mode(PB31_PF_UART2_RXD);
+-
+-      platform_add_devices(devices, ARRAY_SIZE(devices));
+-}
+-
+-static void __init
+-mx1ads_map_io(void)
+-{
+-      imx_map_io();
+-}
+-
+-MACHINE_START(MX1ADS, "Motorola MX1ADS")
+-      /* Maintainer: Sascha Hauer, Pengutronix */
+-      .phys_io        = 0x00200000,
+-      .io_pg_offst    = ((0xe0000000) >> 18) & 0xfffc,
+-      .boot_params    = 0x08000100,
+-      .map_io         = mx1ads_map_io,
+-      .init_irq       = imx_init_irq,
+-      .timer          = &imx_timer,
+-      .init_machine   = mx1ads_init,
+-MACHINE_END
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-imx/time.c linux-2.6.30-rc4-git/arch/arm/mach-imx/time.c
+--- linux-2.6.30-rc4/arch/arm/mach-imx/time.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-imx/time.c      1970-01-01 01:00:00.000000000 +0100
+@@ -1,220 +0,0 @@
+-/*
+- *  linux/arch/arm/mach-imx/time.c
+- *
+- *  Copyright (C) 2000-2001 Deep Blue Solutions
+- *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+- *  Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.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/kernel.h>
+-#include <linux/sched.h>
+-#include <linux/init.h>
+-#include <linux/interrupt.h>
+-#include <linux/irq.h>
+-#include <linux/time.h>
+-#include <linux/clocksource.h>
+-#include <linux/clockchips.h>
+-#include <linux/clk.h>
+-#include <linux/io.h>
+-
+-#include <mach/hardware.h>
+-#include <asm/leds.h>
+-#include <asm/irq.h>
+-#include <asm/mach/time.h>
+-
+-/* Use timer 1 as system timer */
+-#define TIMER_BASE IMX_TIM1_BASE
+-
+-static struct clock_event_device clockevent_imx;
+-static enum clock_event_mode clockevent_mode = CLOCK_EVT_MODE_UNUSED;
+-
+-/*
+- * IRQ handler for the timer
+- */
+-static irqreturn_t
+-imx_timer_interrupt(int irq, void *dev_id)
+-{
+-      struct clock_event_device *evt = &clockevent_imx;
+-      uint32_t tstat;
+-      irqreturn_t ret = IRQ_NONE;
+-
+-      /* clear the interrupt */
+-      tstat = IMX_TSTAT(TIMER_BASE);
+-      IMX_TSTAT(TIMER_BASE) = 0;
+-
+-      if (tstat & TSTAT_COMP) {
+-              evt->event_handler(evt);
+-              ret = IRQ_HANDLED;
+-      }
+-
+-      return ret;
+-}
+-
+-static struct irqaction imx_timer_irq = {
+-      .name           = "i.MX Timer Tick",
+-      .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+-      .handler        = imx_timer_interrupt,
+-};
+-
+-/*
+- * Set up timer hardware into expected mode and state.
+- */
+-static void __init imx_timer_hardware_init(void)
+-{
+-      /*
+-       * Initialise to a known state (all timers off, and timing reset)
+-       */
+-      IMX_TCTL(TIMER_BASE) = 0;
+-      IMX_TPRER(TIMER_BASE) = 0;
+-
+-      IMX_TCTL(TIMER_BASE) = TCTL_FRR | TCTL_CLK_PCLK1 | TCTL_TEN;
+-}
+-
+-cycle_t imx_get_cycles(struct clocksource *cs)
+-{
+-      return IMX_TCN(TIMER_BASE);
+-}
+-
+-static struct clocksource clocksource_imx = {
+-      .name           = "imx_timer1",
+-      .rating         = 200,
+-      .read           = imx_get_cycles,
+-      .mask           = 0xFFFFFFFF,
+-      .shift          = 20,
+-      .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+-};
+-
+-static int __init imx_clocksource_init(unsigned long rate)
+-{
+-      clocksource_imx.mult =
+-              clocksource_hz2mult(rate, clocksource_imx.shift);
+-      clocksource_register(&clocksource_imx);
+-
+-      return 0;
+-}
+-
+-static int imx_set_next_event(unsigned long evt,
+-                                struct clock_event_device *unused)
+-{
+-      unsigned long tcmp;
+-
+-      tcmp = IMX_TCN(TIMER_BASE) + evt;
+-      IMX_TCMP(TIMER_BASE) = tcmp;
+-
+-      return (int32_t)(tcmp - IMX_TCN(TIMER_BASE)) < 0 ? -ETIME : 0;
+-}
+-
+-#ifdef DEBUG
+-static const char *clock_event_mode_label[]={
+-      [CLOCK_EVT_MODE_PERIODIC] = "CLOCK_EVT_MODE_PERIODIC",
+-      [CLOCK_EVT_MODE_ONESHOT]  = "CLOCK_EVT_MODE_ONESHOT",
+-      [CLOCK_EVT_MODE_SHUTDOWN] = "CLOCK_EVT_MODE_SHUTDOWN",
+-      [CLOCK_EVT_MODE_UNUSED]   = "CLOCK_EVT_MODE_UNUSED"
+-};
+-#endif /*DEBUG*/
+-
+-static void imx_set_mode(enum clock_event_mode mode, struct clock_event_device *evt)
+-{
+-      unsigned long flags;
+-
+-      /*
+-       * The timer interrupt generation is disabled at least
+-       * for enough time to call imx_set_next_event()
+-       */
+-      local_irq_save(flags);
+-      /* Disable interrupt in GPT module */
+-      IMX_TCTL(TIMER_BASE) &= ~TCTL_IRQEN;
+-      if (mode != clockevent_mode) {
+-              /* Set event time into far-far future */
+-              IMX_TCMP(TIMER_BASE) = IMX_TCN(TIMER_BASE) - 3;
+-              /* Clear pending interrupt */
+-              IMX_TSTAT(TIMER_BASE) &= ~TSTAT_COMP;
+-      }
+-
+-#ifdef DEBUG
+-      printk(KERN_INFO "imx_set_mode: changing mode from %s to %s\n",
+-              clock_event_mode_label[clockevent_mode], clock_event_mode_label[mode]);
+-#endif /*DEBUG*/
+-
+-      /* Remember timer mode */
+-      clockevent_mode = mode;
+-      local_irq_restore(flags);
+-
+-      switch (mode) {
+-      case CLOCK_EVT_MODE_PERIODIC:
+-              printk(KERN_ERR "imx_set_mode: Periodic mode is not supported for i.MX\n");
+-              break;
+-      case CLOCK_EVT_MODE_ONESHOT:
+-              /*
+-               * Do not put overhead of interrupt enable/disable into
+-               * imx_set_next_event(), the core has about 4 minutes
+-               * to call imx_set_next_event() or shutdown clock after
+-               * mode switching
+-               */
+-              local_irq_save(flags);
+-              IMX_TCTL(TIMER_BASE) |= TCTL_IRQEN;
+-              local_irq_restore(flags);
+-              break;
+-      case CLOCK_EVT_MODE_SHUTDOWN:
+-      case CLOCK_EVT_MODE_UNUSED:
+-      case CLOCK_EVT_MODE_RESUME:
+-              /* Left event sources disabled, no more interrupts appears */
+-              break;
+-      }
+-}
+-
+-static struct clock_event_device clockevent_imx = {
+-      .name           = "imx_timer1",
+-      .features       = CLOCK_EVT_FEAT_ONESHOT,
+-      .shift          = 32,
+-      .set_mode       = imx_set_mode,
+-      .set_next_event = imx_set_next_event,
+-      .rating         = 200,
+-};
+-
+-static int __init imx_clockevent_init(unsigned long rate)
+-{
+-      clockevent_imx.mult = div_sc(rate, NSEC_PER_SEC,
+-                                      clockevent_imx.shift);
+-      clockevent_imx.max_delta_ns =
+-              clockevent_delta2ns(0xfffffffe, &clockevent_imx);
+-      clockevent_imx.min_delta_ns =
+-              clockevent_delta2ns(0xf, &clockevent_imx);
+-
+-      clockevent_imx.cpumask = cpumask_of(0);
+-
+-      clockevents_register_device(&clockevent_imx);
+-
+-      return 0;
+-}
+-
+-extern int imx_clocks_init(void);
+-
+-static void __init imx_timer_init(void)
+-{
+-      struct clk *clk;
+-      unsigned long rate;
+-
+-      imx_clocks_init();
+-
+-      clk = clk_get(NULL, "perclk1");
+-      clk_enable(clk);
+-      rate = clk_get_rate(clk);
+-
+-      imx_timer_hardware_init();
+-      imx_clocksource_init(rate);
+-
+-      imx_clockevent_init(rate);
+-
+-      /*
+-       * Make irqs happen for the system timer
+-       */
+-      setup_irq(TIM1_INT, &imx_timer_irq);
+-}
+-
+-struct sys_timer imx_timer = {
+-      .init           = imx_timer_init,
+-};
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx1/generic.c linux-2.6.30-rc4-git/arch/arm/mach-mx1/generic.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx1/generic.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx1/generic.c   2009-05-13 09:46:19.000000000 +0200
+@@ -26,6 +26,7 @@
+ #include <asm/mach/map.h>
++#include <mach/common.h>
+ #include <mach/hardware.h>
+ static struct map_desc imx_io_desc[] __initdata = {
+@@ -37,7 +38,9 @@ static struct map_desc imx_io_desc[] __i
+       }
+ };
+-void __init mxc_map_io(void)
++void __init mx1_map_io(void)
+ {
++      mxc_set_cpu_type(MXC_CPU_MX1);
++
+       iotable_init(imx_io_desc, ARRAY_SIZE(imx_io_desc));
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx1/mx1ads.c linux-2.6.30-rc4-git/arch/arm/mach-mx1/mx1ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx1/mx1ads.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx1/mx1ads.c    2009-05-13 09:46:19.000000000 +0200
+@@ -12,77 +12,56 @@
+  * warranty of any kind, whether express or implied.
+  */
+-#include <linux/kernel.h>
++#include <linux/i2c.h>
++#include <linux/i2c/pcf857x.h>
+ #include <linux/init.h>
++#include <linux/kernel.h>
+ #include <linux/platform_device.h>
+ #include <linux/mtd/physmap.h>
+-#include <linux/i2c.h>
+-#include <linux/i2c/pcf857x.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ #include <asm/mach/time.h>
+-#include <mach/irqs.h>
+-#include <mach/hardware.h>
+ #include <mach/common.h>
+-#include <mach/imx-uart.h>
+-#include <mach/irqs.h>
++#include <mach/hardware.h>
+ #include <mach/i2c.h>
++#include <mach/imx-uart.h>
+ #include <mach/iomux.h>
++#include <mach/irqs.h>
++
+ #include "devices.h"
+-/*
+- * UARTs platform data
+- */
+-static int mxc_uart1_pins[] = {
++static int mx1ads_pins[] = {
++      /* UART1 */
+       PC9_PF_UART1_CTS,
+       PC10_PF_UART1_RTS,
+       PC11_PF_UART1_TXD,
+       PC12_PF_UART1_RXD,
+-};
+-
+-static int uart1_mxc_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins), "UART1");
+-}
+-
+-static int uart1_mxc_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins));
+-      return 0;
+-}
+-
+-static int mxc_uart2_pins[] = {
++      /* UART2 */
+       PB28_PF_UART2_CTS,
+       PB29_PF_UART2_RTS,
+       PB30_PF_UART2_TXD,
+       PB31_PF_UART2_RXD,
++      /* I2C */
++      PA15_PF_I2C_SDA,
++      PA16_PF_I2C_SCL,
++      /* SPI */
++      PC13_PF_SPI1_SPI_RDY,
++      PC14_PF_SPI1_SCLK,
++      PC15_PF_SPI1_SS,
++      PC16_PF_SPI1_MISO,
++      PC17_PF_SPI1_MOSI,
+ };
+-static int uart2_mxc_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins), "UART2");
+-}
+-
+-static int uart2_mxc_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins));
+-      return 0;
+-}
++/*
++ * UARTs platform data
++ */
+ static struct imxuart_platform_data uart_pdata[] = {
+       {
+-              .init = uart1_mxc_init,
+-              .exit = uart1_mxc_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart2_mxc_init,
+-              .exit = uart2_mxc_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       },
+ };
+@@ -111,24 +90,6 @@ static struct platform_device flash_devi
+ /*
+  * I2C
+  */
+-
+-static int i2c_pins[] = {
+-      PA15_PF_I2C_SDA,
+-      PA16_PF_I2C_SCL,
+-};
+-
+-static int i2c_init(struct device *dev)
+-{
+-      return mxc_gpio_setup_multiple_pins(i2c_pins,
+-                      ARRAY_SIZE(i2c_pins), "I2C");
+-}
+-
+-static void i2c_exit(struct device *dev)
+-{
+-      mxc_gpio_release_multiple_pins(i2c_pins,
+-                      ARRAY_SIZE(i2c_pins));
+-}
+-
+ static struct pcf857x_platform_data pcf857x_data[] = {
+       {
+               .gpio_base = 4 * 32,
+@@ -139,8 +100,6 @@ static struct pcf857x_platform_data pcf8
+ static struct imxi2c_platform_data mx1ads_i2c_data = {
+       .bitrate = 100000,
+-      .init = i2c_init,
+-      .exit = i2c_exit,
+ };
+ static struct i2c_board_info mx1ads_i2c_devices[] = {
+@@ -160,6 +119,9 @@ static struct i2c_board_info mx1ads_i2c_
+  */
+ static void __init mx1ads_init(void)
+ {
++      mxc_gpio_setup_multiple_pins(mx1ads_pins,
++              ARRAY_SIZE(mx1ads_pins), "mx1ads");
++
+       /* UART */
+       mxc_register_device(&imx_uart1_device, &uart_pdata[0]);
+       mxc_register_device(&imx_uart2_device, &uart_pdata[1]);
+@@ -188,7 +150,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS"
+       .phys_io        = IMX_IO_PHYS,
+       .io_pg_offst    = (IMX_IO_BASE >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx1_map_io,
+       .init_irq       = mxc_init_irq,
+       .timer          = &mx1ads_timer,
+       .init_machine   = mx1ads_init,
+@@ -198,7 +160,7 @@ MACHINE_START(MXLADS, "Freescale MXLADS"
+       .phys_io        = IMX_IO_PHYS,
+       .io_pg_offst    = (IMX_IO_BASE >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx1_map_io,
+       .init_irq       = mxc_init_irq,
+       .timer          = &mx1ads_timer,
+       .init_machine   = mx1ads_init,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx1/scb9328.c linux-2.6.30-rc4-git/arch/arm/mach-mx1/scb9328.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx1/scb9328.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx1/scb9328.c   2009-05-13 09:46:19.000000000 +0200
+@@ -153,7 +153,7 @@ MACHINE_START(SCB9328, "Synertronixx scb
+       .phys_io        = 0x00200000,
+       .io_pg_offst    = ((0xe0200000) >> 18) & 0xfffc,
+       .boot_params    = 0x08000100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx1_map_io,
+       .init_irq       = mxc_init_irq,
+       .timer          = &scb9328_timer,
+       .init_machine   = scb9328_init,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/generic.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/generic.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/generic.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/generic.c   2009-05-13 09:46:19.000000000 +0200
+@@ -69,7 +69,17 @@ static struct map_desc mxc_io_desc[] __i
+  * system startup to create static physical to virtual
+  * memory map for the IO modules.
+  */
+-void __init mxc_map_io(void)
++void __init mx21_map_io(void)
+ {
++      mxc_set_cpu_type(MXC_CPU_MX21);
++
+       iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc));
+ }
++
++void __init mx27_map_io(void)
++{
++      mxc_set_cpu_type(MXC_CPU_MX27);
++
++      iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc));
++}
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/Kconfig linux-2.6.30-rc4-git/arch/arm/mach-mx2/Kconfig
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/Kconfig 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/Kconfig     2009-05-13 09:46:19.000000000 +0200
+@@ -18,6 +18,13 @@ endchoice
+ comment "MX2 platforms:"
++config MACH_MX21ADS
++      bool "MX21ADS platform"
++      depends on MACH_MX21
++      help
++        Include support for MX21ADS platform. This includes specific
++        configurations for the board and its peripherals.
++
+ config MACH_MX27ADS
+       bool "MX27ADS platform"
+       depends on MACH_MX27
+@@ -46,4 +53,10 @@ config MACH_PCM970_BASEBOARD
+ endchoice
++config MACH_MX27_3DS
++      bool "MX27PDK platform"
++      depends on MACH_MX27
++      help
++        Include support for MX27PDK platform. This includes specific
++        configurations for the board and its peripherals.
+ endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile linux-2.6.30-rc4-git/arch/arm/mach-mx2/Makefile
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -11,6 +11,8 @@ obj-$(CONFIG_MACH_MX21) += clock_imx21.o
+ obj-$(CONFIG_MACH_MX27) += cpu_imx27.o
+ obj-$(CONFIG_MACH_MX27) += clock_imx27.o
++obj-$(CONFIG_MACH_MX21ADS) += mx21ads.o
+ obj-$(CONFIG_MACH_MX27ADS) += mx27ads.o
+ obj-$(CONFIG_MACH_PCM038) += pcm038.o
+ obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o
++obj-$(CONFIG_MACH_MX27_3DS) += mx27pdk.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/mx21ads.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx21ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/mx21ads.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx21ads.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,286 @@
++/*
++ *  Copyright (C) 2000 Deep Blue Solutions Ltd
++ *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
++ *  Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/physmap.h>
++#include <linux/gpio.h>
++#include <mach/common.h>
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++#include <asm/mach/map.h>
++#include <mach/imx-uart.h>
++#include <mach/imxfb.h>
++#include <mach/iomux.h>
++#include <mach/mxc_nand.h>
++#include <mach/mmc.h>
++#include <mach/board-mx21ads.h>
++
++#include "devices.h"
++
++static unsigned int mx21ads_pins[] = {
++
++      /* CS8900A */
++      (GPIO_PORTE | GPIO_GPIO | GPIO_IN | 11),
++
++      /* UART1 */
++      PE12_PF_UART1_TXD,
++      PE13_PF_UART1_RXD,
++      PE14_PF_UART1_CTS,
++      PE15_PF_UART1_RTS,
++
++      /* UART3 (IrDA) - only TXD and RXD */
++      PE8_PF_UART3_TXD,
++      PE9_PF_UART3_RXD,
++
++      /* UART4 */
++      PB26_AF_UART4_RTS,
++      PB28_AF_UART4_TXD,
++      PB29_AF_UART4_CTS,
++      PB31_AF_UART4_RXD,
++
++      /* LCDC */
++      PA5_PF_LSCLK,
++      PA6_PF_LD0,
++      PA7_PF_LD1,
++      PA8_PF_LD2,
++      PA9_PF_LD3,
++      PA10_PF_LD4,
++      PA11_PF_LD5,
++      PA12_PF_LD6,
++      PA13_PF_LD7,
++      PA14_PF_LD8,
++      PA15_PF_LD9,
++      PA16_PF_LD10,
++      PA17_PF_LD11,
++      PA18_PF_LD12,
++      PA19_PF_LD13,
++      PA20_PF_LD14,
++      PA21_PF_LD15,
++      PA22_PF_LD16,
++      PA24_PF_REV,     /* Sharp panel dedicated signal */
++      PA25_PF_CLS,     /* Sharp panel dedicated signal */
++      PA26_PF_PS,      /* Sharp panel dedicated signal */
++      PA27_PF_SPL_SPR, /* Sharp panel dedicated signal */
++      PA28_PF_HSYNC,
++      PA29_PF_VSYNC,
++      PA30_PF_CONTRAST,
++      PA31_PF_OE_ACD,
++
++      /* MMC/SDHC */
++      PE18_PF_SD1_D0,
++      PE19_PF_SD1_D1,
++      PE20_PF_SD1_D2,
++      PE21_PF_SD1_D3,
++      PE22_PF_SD1_CMD,
++      PE23_PF_SD1_CLK,
++
++      /* NFC */
++      PF0_PF_NRFB,
++      PF1_PF_NFCE,
++      PF2_PF_NFWP,
++      PF3_PF_NFCLE,
++      PF4_PF_NFALE,
++      PF5_PF_NFRE,
++      PF6_PF_NFWE,
++      PF7_PF_NFIO0,
++      PF8_PF_NFIO1,
++      PF9_PF_NFIO2,
++      PF10_PF_NFIO3,
++      PF11_PF_NFIO4,
++      PF12_PF_NFIO5,
++      PF13_PF_NFIO6,
++      PF14_PF_NFIO7,
++};
++
++/* ADS's NOR flash: 2x AM29BDS128HE9VKI on 32-bit bus */
++static struct physmap_flash_data mx21ads_flash_data = {
++      .width = 4,
++};
++
++static struct resource mx21ads_flash_resource = {
++      .start = CS0_BASE_ADDR,
++      .end = CS0_BASE_ADDR + 0x02000000 - 1,
++      .flags = IORESOURCE_MEM,
++};
++
++static struct platform_device mx21ads_nor_mtd_device = {
++      .name = "physmap-flash",
++      .id = 0,
++      .dev = {
++              .platform_data = &mx21ads_flash_data,
++      },
++      .num_resources = 1,
++      .resource = &mx21ads_flash_resource,
++};
++
++static struct imxuart_platform_data uart_pdata = {
++      .flags = IMXUART_HAVE_RTSCTS,
++};
++
++static struct imxuart_platform_data uart_norts_pdata = {
++};
++
++
++static int mx21ads_fb_init(struct platform_device *pdev)
++{
++      u16 tmp;
++
++      tmp = __raw_readw(MX21ADS_IO_REG);
++      tmp |= MX21ADS_IO_LCDON;
++      __raw_writew(tmp, MX21ADS_IO_REG);
++      return 0;
++}
++
++static void mx21ads_fb_exit(struct platform_device *pdev)
++{
++      u16 tmp;
++
++      tmp = __raw_readw(MX21ADS_IO_REG);
++      tmp &= ~MX21ADS_IO_LCDON;
++      __raw_writew(tmp, MX21ADS_IO_REG);
++}
++
++/*
++ * Connected is a portrait Sharp-QVGA display
++ * of type: LQ035Q7DB02
++ */
++static struct imx_fb_platform_data mx21ads_fb_data = {
++      .pixclock       = 188679, /* in ps */
++      .xres           = 240,
++      .yres           = 320,
++
++      .bpp            = 16,
++      .hsync_len      = 2,
++      .left_margin    = 6,
++      .right_margin   = 16,
++
++      .vsync_len      = 1,
++      .upper_margin   = 8,
++      .lower_margin   = 10,
++      .fixed_screen_cpu = 0,
++
++      .pcr            = 0xFB108BC7,
++      .pwmr           = 0x00A901ff,
++      .lscr1          = 0x00120300,
++      .dmacr          = 0x00020008,
++
++      .init = mx21ads_fb_init,
++      .exit = mx21ads_fb_exit,
++};
++
++static int mx21ads_sdhc_get_ro(struct device *dev)
++{
++      return (__raw_readw(MX21ADS_IO_REG) & MX21ADS_IO_SD_WP) ? 1 : 0;
++}
++
++static int mx21ads_sdhc_init(struct device *dev, irq_handler_t detect_irq,
++      void *data)
++{
++      int ret;
++
++      ret = request_irq(IRQ_GPIOD(25), detect_irq,
++              IRQF_TRIGGER_FALLING, "mmc-detect", data);
++      if (ret)
++              goto out;
++      return 0;
++out:
++      return ret;
++}
++
++static void mx21ads_sdhc_exit(struct device *dev, void *data)
++{
++      free_irq(IRQ_GPIOD(25), data);
++}
++
++static struct imxmmc_platform_data mx21ads_sdhc_pdata = {
++      .ocr_avail = MMC_VDD_29_30 | MMC_VDD_30_31, /* 3.0V */
++      .get_ro = mx21ads_sdhc_get_ro,
++      .init = mx21ads_sdhc_init,
++      .exit = mx21ads_sdhc_exit,
++};
++
++static struct mxc_nand_platform_data mx21ads_nand_board_info = {
++      .width = 1,
++      .hw_ecc = 1,
++};
++
++static struct map_desc mx21ads_io_desc[] __initdata = {
++      /*
++       * Memory-mapped I/O on MX21ADS Base board:
++       *   - CS8900A Ethernet controller
++       *   - ST16C2552CJ UART
++       *   - CPU and Base board version
++       *   - Base board I/O register
++       */
++      {
++              .virtual = MX21ADS_MMIO_BASE_ADDR,
++              .pfn = __phys_to_pfn(CS1_BASE_ADDR),
++              .length = MX21ADS_MMIO_SIZE,
++              .type = MT_DEVICE,
++      },
++};
++
++static void __init mx21ads_map_io(void)
++{
++      mx21_map_io();
++      iotable_init(mx21ads_io_desc, ARRAY_SIZE(mx21ads_io_desc));
++}
++
++static struct platform_device *platform_devices[] __initdata = {
++      &mx21ads_nor_mtd_device,
++};
++
++static void __init mx21ads_board_init(void)
++{
++      mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins),
++                      "mx21ads");
++
++      mxc_register_device(&mxc_uart_device0, &uart_pdata);
++      mxc_register_device(&mxc_uart_device2, &uart_norts_pdata);
++      mxc_register_device(&mxc_uart_device3, &uart_pdata);
++      mxc_register_device(&mxc_fb_device, &mx21ads_fb_data);
++      mxc_register_device(&mxc_sdhc_device0, &mx21ads_sdhc_pdata);
++      mxc_register_device(&mxc_nand_device, &mx21ads_nand_board_info);
++
++      platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
++}
++
++static void __init mx21ads_timer_init(void)
++{
++      mx21_clocks_init(32768, 26000000);
++}
++
++static struct sys_timer mx21ads_timer = {
++      .init   = mx21ads_timer_init,
++};
++
++MACHINE_START(MX21ADS, "Freescale i.MX21ADS")
++      /* maintainer: Freescale Semiconductor, Inc. */
++      .phys_io        = AIPI_BASE_ADDR,
++      .io_pg_offst    = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
++      .boot_params    = PHYS_OFFSET + 0x100,
++      .map_io         = mx21ads_map_io,
++      .init_irq       = mxc_init_irq,
++      .init_machine   = mx21ads_board_init,
++      .timer          = &mx21ads_timer,
++MACHINE_END
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/mx27ads.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx27ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/mx27ads.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx27ads.c   2009-05-13 09:46:19.000000000 +0200
+@@ -23,6 +23,8 @@
+ #include <linux/mtd/map.h>
+ #include <linux/mtd/partitions.h>
+ #include <linux/mtd/physmap.h>
++#include <linux/i2c.h>
++#include <linux/irq.h>
+ #include <mach/common.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+@@ -33,9 +35,117 @@
+ #include <mach/imx-uart.h>
+ #include <mach/iomux.h>
+ #include <mach/board-mx27ads.h>
++#include <mach/mxc_nand.h>
++#include <mach/i2c.h>
++#include <mach/imxfb.h>
++#include <mach/mmc.h>
+ #include "devices.h"
++static unsigned int mx27ads_pins[] = {
++      /* UART0 */
++      PE12_PF_UART1_TXD,
++      PE13_PF_UART1_RXD,
++      PE14_PF_UART1_CTS,
++      PE15_PF_UART1_RTS,
++      /* UART1 */
++      PE3_PF_UART2_CTS,
++      PE4_PF_UART2_RTS,
++      PE6_PF_UART2_TXD,
++      PE7_PF_UART2_RXD,
++      /* UART2 */
++      PE8_PF_UART3_TXD,
++      PE9_PF_UART3_RXD,
++      PE10_PF_UART3_CTS,
++      PE11_PF_UART3_RTS,
++      /* UART3 */
++      PB26_AF_UART4_RTS,
++      PB28_AF_UART4_TXD,
++      PB29_AF_UART4_CTS,
++      PB31_AF_UART4_RXD,
++      /* UART4 */
++      PB18_AF_UART5_TXD,
++      PB19_AF_UART5_RXD,
++      PB20_AF_UART5_CTS,
++      PB21_AF_UART5_RTS,
++      /* UART5 */
++      PB10_AF_UART6_TXD,
++      PB12_AF_UART6_CTS,
++      PB11_AF_UART6_RXD,
++      PB13_AF_UART6_RTS,
++      /* FEC */
++      PD0_AIN_FEC_TXD0,
++      PD1_AIN_FEC_TXD1,
++      PD2_AIN_FEC_TXD2,
++      PD3_AIN_FEC_TXD3,
++      PD4_AOUT_FEC_RX_ER,
++      PD5_AOUT_FEC_RXD1,
++      PD6_AOUT_FEC_RXD2,
++      PD7_AOUT_FEC_RXD3,
++      PD8_AF_FEC_MDIO,
++      PD9_AIN_FEC_MDC,
++      PD10_AOUT_FEC_CRS,
++      PD11_AOUT_FEC_TX_CLK,
++      PD12_AOUT_FEC_RXD0,
++      PD13_AOUT_FEC_RX_DV,
++      PD14_AOUT_FEC_RX_CLK,
++      PD15_AOUT_FEC_COL,
++      PD16_AIN_FEC_TX_ER,
++      PF23_AIN_FEC_TX_EN,
++      /* I2C2 */
++      PC5_PF_I2C2_SDA,
++      PC6_PF_I2C2_SCL,
++      /* FB */
++      PA5_PF_LSCLK,
++      PA6_PF_LD0,
++      PA7_PF_LD1,
++      PA8_PF_LD2,
++      PA9_PF_LD3,
++      PA10_PF_LD4,
++      PA11_PF_LD5,
++      PA12_PF_LD6,
++      PA13_PF_LD7,
++      PA14_PF_LD8,
++      PA15_PF_LD9,
++      PA16_PF_LD10,
++      PA17_PF_LD11,
++      PA18_PF_LD12,
++      PA19_PF_LD13,
++      PA20_PF_LD14,
++      PA21_PF_LD15,
++      PA22_PF_LD16,
++      PA23_PF_LD17,
++      PA24_PF_REV,
++      PA25_PF_CLS,
++      PA26_PF_PS,
++      PA27_PF_SPL_SPR,
++      PA28_PF_HSYNC,
++      PA29_PF_VSYNC,
++      PA30_PF_CONTRAST,
++      PA31_PF_OE_ACD,
++      /* OWIRE */
++      PE16_AF_OWIRE,
++      /* SDHC1*/
++      PE18_PF_SD1_D0,
++      PE19_PF_SD1_D1,
++      PE20_PF_SD1_D2,
++      PE21_PF_SD1_D3,
++      PE22_PF_SD1_CMD,
++      PE23_PF_SD1_CLK,
++      /* SDHC2*/
++      PB4_PF_SD2_D0,
++      PB5_PF_SD2_D1,
++      PB6_PF_SD2_D2,
++      PB7_PF_SD2_D3,
++      PB8_PF_SD2_CMD,
++      PB9_PF_SD2_CLK,
++};
++
++static struct mxc_nand_platform_data mx27ads_nand_board_info = {
++      .width = 1,
++      .hw_ecc = 1,
++};
++
+ /* ADS's NOR flash */
+ static struct physmap_flash_data mx27ads_flash_data = {
+       .width = 2,
+@@ -58,189 +168,113 @@ static struct platform_device mx27ads_no
+       .resource = &mx27ads_flash_resource,
+ };
+-static int mxc_uart0_pins[] = {
+-      PE12_PF_UART1_TXD,
+-      PE13_PF_UART1_RXD,
+-      PE14_PF_UART1_CTS,
+-      PE15_PF_UART1_RTS
++static struct imxi2c_platform_data mx27ads_i2c_data = {
++      .bitrate = 100000,
+ };
+-static int uart_mxc_port0_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
+-                      ARRAY_SIZE(mxc_uart0_pins), "UART0");
+-}
+-
+-static int uart_mxc_port0_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart0_pins,
+-                      ARRAY_SIZE(mxc_uart0_pins));
+-      return 0;
+-}
+-
+-static int mxc_uart1_pins[] = {
+-      PE3_PF_UART2_CTS,
+-      PE4_PF_UART2_RTS,
+-      PE6_PF_UART2_TXD,
+-      PE7_PF_UART2_RXD
++static struct i2c_board_info mx27ads_i2c_devices[] = {
+ };
+-static int uart_mxc_port1_init(struct platform_device *pdev)
++void lcd_power(int on)
+ {
+-      return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins), "UART1");
++      if (on)
++              __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG);
++      else
++              __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG);
+ }
+-static int uart_mxc_port1_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins));
+-      return 0;
+-}
++static struct imx_fb_platform_data mx27ads_fb_data = {
++      .pixclock       = 188679,
++      .xres           = 240,
++      .yres           = 320,
+-static int mxc_uart2_pins[] = {
+-      PE8_PF_UART3_TXD,
+-      PE9_PF_UART3_RXD,
+-      PE10_PF_UART3_CTS,
+-      PE11_PF_UART3_RTS
+-};
++      .bpp            = 16,
++      .hsync_len      = 1,
++      .left_margin    = 9,
++      .right_margin   = 16,
+-static int uart_mxc_port2_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins), "UART2");
+-}
++      .vsync_len      = 1,
++      .upper_margin   = 7,
++      .lower_margin   = 9,
++      .fixed_screen_cpu = 0,
+-static int uart_mxc_port2_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins));
+-      return 0;
+-}
++      /*
++       * - HSYNC active high
++       * - VSYNC active high
++       * - clk notenabled while idle
++       * - clock inverted
++       * - data not inverted
++       * - data enable low active
++       * - enable sharp mode
++       */
++      .pcr            = 0xFB008BC0,
++      .pwmr           = 0x00A903FF,
++      .lscr1          = 0x00120300,
++      .dmacr          = 0x00020010,
+-static int mxc_uart3_pins[] = {
+-      PB26_AF_UART4_RTS,
+-      PB28_AF_UART4_TXD,
+-      PB29_AF_UART4_CTS,
+-      PB31_AF_UART4_RXD
++      .lcd_power      = lcd_power,
+ };
+-static int uart_mxc_port3_init(struct platform_device *pdev)
++static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
++                            void *data)
+ {
+-      return mxc_gpio_setup_multiple_pins(mxc_uart3_pins,
+-                      ARRAY_SIZE(mxc_uart3_pins), "UART3");
++      return request_irq(IRQ_GPIOE(21), detect_irq, IRQF_TRIGGER_RISING,
++                         "sdhc1-card-detect", data);
+ }
+-static int uart_mxc_port3_exit(struct platform_device *pdev)
++static int mx27ads_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
++                            void *data)
+ {
+-      mxc_gpio_release_multiple_pins(mxc_uart3_pins,
+-                      ARRAY_SIZE(mxc_uart3_pins));
+-      return 0;
++      return request_irq(IRQ_GPIOB(7), detect_irq, IRQF_TRIGGER_RISING,
++                         "sdhc2-card-detect", data);
+ }
+-static int mxc_uart4_pins[] = {
+-      PB18_AF_UART5_TXD,
+-      PB19_AF_UART5_RXD,
+-      PB20_AF_UART5_CTS,
+-      PB21_AF_UART5_RTS
+-};
+-
+-static int uart_mxc_port4_init(struct platform_device *pdev)
++static void mx27ads_sdhc1_exit(struct device *dev, void *data)
+ {
+-      return mxc_gpio_setup_multiple_pins(mxc_uart4_pins,
+-                      ARRAY_SIZE(mxc_uart4_pins), "UART4");
++      free_irq(IRQ_GPIOE(21), data);
+ }
+-static int uart_mxc_port4_exit(struct platform_device *pdev)
++static void mx27ads_sdhc2_exit(struct device *dev, void *data)
+ {
+-      mxc_gpio_release_multiple_pins(mxc_uart4_pins,
+-                      ARRAY_SIZE(mxc_uart4_pins));
+-      return 0;
++      free_irq(IRQ_GPIOB(7), data);
+ }
+-static int mxc_uart5_pins[] = {
+-      PB10_AF_UART6_TXD,
+-      PB12_AF_UART6_CTS,
+-      PB11_AF_UART6_RXD,
+-      PB13_AF_UART6_RTS
++static struct imxmmc_platform_data sdhc1_pdata = {
++      .init = mx27ads_sdhc1_init,
++      .exit = mx27ads_sdhc1_exit,
+ };
+-static int uart_mxc_port5_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart5_pins,
+-                      ARRAY_SIZE(mxc_uart5_pins), "UART5");
+-}
+-
+-static int uart_mxc_port5_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart5_pins,
+-                      ARRAY_SIZE(mxc_uart5_pins));
+-      return 0;
+-}
++static struct imxmmc_platform_data sdhc2_pdata = {
++      .init = mx27ads_sdhc2_init,
++      .exit = mx27ads_sdhc2_exit,
++};
+ static struct platform_device *platform_devices[] __initdata = {
+       &mx27ads_nor_mtd_device,
+       &mxc_fec_device,
++      &mxc_w1_master_device,
+ };
+-static int mxc_fec_pins[] = {
+-      PD0_AIN_FEC_TXD0,
+-      PD1_AIN_FEC_TXD1,
+-      PD2_AIN_FEC_TXD2,
+-      PD3_AIN_FEC_TXD3,
+-      PD4_AOUT_FEC_RX_ER,
+-      PD5_AOUT_FEC_RXD1,
+-      PD6_AOUT_FEC_RXD2,
+-      PD7_AOUT_FEC_RXD3,
+-      PD8_AF_FEC_MDIO,
+-      PD9_AIN_FEC_MDC,
+-      PD10_AOUT_FEC_CRS,
+-      PD11_AOUT_FEC_TX_CLK,
+-      PD12_AOUT_FEC_RXD0,
+-      PD13_AOUT_FEC_RX_DV,
+-      PD14_AOUT_FEC_RX_CLK,
+-      PD15_AOUT_FEC_COL,
+-      PD16_AIN_FEC_TX_ER,
+-      PF23_AIN_FEC_TX_EN
+-};
+-
+-static void gpio_fec_active(void)
+-{
+-      mxc_gpio_setup_multiple_pins(mxc_fec_pins,
+-                      ARRAY_SIZE(mxc_fec_pins), "FEC");
+-}
+-
+ static struct imxuart_platform_data uart_pdata[] = {
+       {
+-              .init = uart_mxc_port0_init,
+-              .exit = uart_mxc_port0_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port1_init,
+-              .exit = uart_mxc_port1_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port2_init,
+-              .exit = uart_mxc_port2_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port3_init,
+-              .exit = uart_mxc_port3_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port4_init,
+-              .exit = uart_mxc_port4_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port5_init,
+-              .exit = uart_mxc_port5_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       },
+ };
+ static void __init mx27ads_board_init(void)
+ {
+-      gpio_fec_active();
++      mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
++                      "mx27ads");
+       mxc_register_device(&mxc_uart_device0, &uart_pdata[0]);
+       mxc_register_device(&mxc_uart_device1, &uart_pdata[1]);
+@@ -248,6 +282,15 @@ static void __init mx27ads_board_init(vo
+       mxc_register_device(&mxc_uart_device3, &uart_pdata[3]);
+       mxc_register_device(&mxc_uart_device4, &uart_pdata[4]);
+       mxc_register_device(&mxc_uart_device5, &uart_pdata[5]);
++      mxc_register_device(&mxc_nand_device, &mx27ads_nand_board_info);
++
++      /* only the i2c master 1 is used on this CPU card */
++      i2c_register_board_info(1, mx27ads_i2c_devices,
++                              ARRAY_SIZE(mx27ads_i2c_devices));
++      mxc_register_device(&mxc_i2c_device1, &mx27ads_i2c_data);
++      mxc_register_device(&mxc_fb_device, &mx27ads_fb_data);
++      mxc_register_device(&mxc_sdhc_device0, &sdhc1_pdata);
++      mxc_register_device(&mxc_sdhc_device1, &sdhc2_pdata);
+       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+ }
+@@ -277,7 +320,7 @@ static struct map_desc mx27ads_io_desc[]
+ static void __init mx27ads_map_io(void)
+ {
+-      mxc_map_io();
++      mx27_map_io();
+       iotable_init(mx27ads_io_desc, ARRAY_SIZE(mx27ads_io_desc));
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/mx27pdk.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx27pdk.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/mx27pdk.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/mx27pdk.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,95 @@
++/*
++ * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
++ *
++ * Author: Fabio Estevam <fabio.estevam@freescale.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++#include <mach/hardware.h>
++#include <mach/common.h>
++#include <mach/imx-uart.h>
++#include <mach/iomux.h>
++#include <mach/board-mx27pdk.h>
++
++#include "devices.h"
++
++static unsigned int mx27pdk_pins[] = {
++      /* UART1 */
++      PE12_PF_UART1_TXD,
++      PE13_PF_UART1_RXD,
++      PE14_PF_UART1_CTS,
++      PE15_PF_UART1_RTS,
++      /* FEC */
++      PD0_AIN_FEC_TXD0,
++      PD1_AIN_FEC_TXD1,
++      PD2_AIN_FEC_TXD2,
++      PD3_AIN_FEC_TXD3,
++      PD4_AOUT_FEC_RX_ER,
++      PD5_AOUT_FEC_RXD1,
++      PD6_AOUT_FEC_RXD2,
++      PD7_AOUT_FEC_RXD3,
++      PD8_AF_FEC_MDIO,
++      PD9_AIN_FEC_MDC,
++      PD10_AOUT_FEC_CRS,
++      PD11_AOUT_FEC_TX_CLK,
++      PD12_AOUT_FEC_RXD0,
++      PD13_AOUT_FEC_RX_DV,
++      PD14_AOUT_FEC_RX_CLK,
++      PD15_AOUT_FEC_COL,
++      PD16_AIN_FEC_TX_ER,
++      PF23_AIN_FEC_TX_EN,
++};
++
++static struct imxuart_platform_data uart_pdata = {
++      .flags = IMXUART_HAVE_RTSCTS,
++};
++
++static struct platform_device *platform_devices[] __initdata = {
++      &mxc_fec_device,
++};
++
++static void __init mx27pdk_init(void)
++{
++      mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),
++              "mx27pdk");
++      mxc_register_device(&mxc_uart_device0, &uart_pdata);
++      platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
++}
++
++static void __init mx27pdk_timer_init(void)
++{
++      mx27_clocks_init(26000000);
++}
++
++static struct sys_timer mx27pdk_timer = {
++      .init   = mx27pdk_timer_init,
++};
++
++MACHINE_START(MX27_3DS, "Freescale MX27PDK")
++      /* maintainer: Freescale Semiconductor, Inc. */
++      .phys_io        = AIPI_BASE_ADDR,
++      .io_pg_offst    = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
++      .boot_params    = PHYS_OFFSET + 0x100,
++      .map_io         = mxc_map_io,
++      .init_irq       = mxc_init_irq,
++      .init_machine   = mx27pdk_init,
++      .timer          = &mx27pdk_timer,
++MACHINE_END
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/pcm038.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/pcm038.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/pcm038.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/pcm038.c    2009-05-13 09:46:19.000000000 +0200
+@@ -17,28 +17,84 @@
+  * MA 02110-1301, USA.
+  */
+-#include <linux/platform_device.h>
+-#include <linux/mtd/physmap.h>
+-#include <linux/mtd/plat-ram.h>
+-#include <linux/io.h>
+ #include <linux/i2c.h>
+ #include <linux/i2c/at24.h>
++#include <linux/io.h>
++#include <linux/mtd/plat-ram.h>
++#include <linux/mtd/physmap.h>
++#include <linux/platform_device.h>
+-#include <asm/mach/arch.h>
+ #include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++
++#include <mach/board-pcm038.h>
+ #include <mach/common.h>
+ #include <mach/hardware.h>
+-#include <mach/iomux.h>
+-#ifdef CONFIG_I2C_IMX
+ #include <mach/i2c.h>
+-#endif
+-#include <asm/mach/time.h>
++#include <mach/iomux.h>
+ #include <mach/imx-uart.h>
+-#include <mach/board-pcm038.h>
+ #include <mach/mxc_nand.h>
+ #include "devices.h"
++static int pcm038_pins[] = {
++      /* UART1 */
++      PE12_PF_UART1_TXD,
++      PE13_PF_UART1_RXD,
++      PE14_PF_UART1_CTS,
++      PE15_PF_UART1_RTS,
++      /* UART2 */
++      PE3_PF_UART2_CTS,
++      PE4_PF_UART2_RTS,
++      PE6_PF_UART2_TXD,
++      PE7_PF_UART2_RXD,
++      /* UART3 */
++      PE8_PF_UART3_TXD,
++      PE9_PF_UART3_RXD,
++      PE10_PF_UART3_CTS,
++      PE11_PF_UART3_RTS,
++      /* FEC */
++      PD0_AIN_FEC_TXD0,
++      PD1_AIN_FEC_TXD1,
++      PD2_AIN_FEC_TXD2,
++      PD3_AIN_FEC_TXD3,
++      PD4_AOUT_FEC_RX_ER,
++      PD5_AOUT_FEC_RXD1,
++      PD6_AOUT_FEC_RXD2,
++      PD7_AOUT_FEC_RXD3,
++      PD8_AF_FEC_MDIO,
++      PD9_AIN_FEC_MDC,
++      PD10_AOUT_FEC_CRS,
++      PD11_AOUT_FEC_TX_CLK,
++      PD12_AOUT_FEC_RXD0,
++      PD13_AOUT_FEC_RX_DV,
++      PD14_AOUT_FEC_RX_CLK,
++      PD15_AOUT_FEC_COL,
++      PD16_AIN_FEC_TX_ER,
++      PF23_AIN_FEC_TX_EN,
++      /* I2C2 */
++      PC5_PF_I2C2_SDA,
++      PC6_PF_I2C2_SCL,
++      /* SPI1 */
++      PD25_PF_CSPI1_RDY,
++      PD27_PF_CSPI1_SS1,
++      PD28_PF_CSPI1_SS0,
++      PD29_PF_CSPI1_SCLK,
++      PD30_PF_CSPI1_MISO,
++      PD31_PF_CSPI1_MOSI,
++      /* SSI1 */
++      PC20_PF_SSI1_FS,
++      PC21_PF_SSI1_RXD,
++      PC22_PF_SSI1_TXD,
++      PC23_PF_SSI1_CLK,
++      /* SSI4 */
++      PC16_PF_SSI4_FS,
++      PC17_PF_SSI4_RXD,
++      PC18_PF_SSI4_TXD,
++      PC19_PF_SSI4_CLK,
++};
++
+ /*
+  * Phytec's PCM038 comes with 2MiB battery buffered SRAM,
+  * 16 bit width
+@@ -88,107 +144,16 @@ static struct platform_device pcm038_nor
+       .resource = &pcm038_flash_resource,
+ };
+-static int mxc_uart0_pins[] = {
+-      PE12_PF_UART1_TXD,
+-      PE13_PF_UART1_RXD,
+-      PE14_PF_UART1_CTS,
+-      PE15_PF_UART1_RTS
+-};
+-
+-static int uart_mxc_port0_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
+-                      ARRAY_SIZE(mxc_uart0_pins), "UART0");
+-}
+-
+-static int uart_mxc_port0_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart0_pins,
+-                      ARRAY_SIZE(mxc_uart0_pins));
+-      return 0;
+-}
+-
+-static int mxc_uart1_pins[] = {
+-      PE3_PF_UART2_CTS,
+-      PE4_PF_UART2_RTS,
+-      PE6_PF_UART2_TXD,
+-      PE7_PF_UART2_RXD
+-};
+-
+-static int uart_mxc_port1_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins), "UART1");
+-}
+-
+-static int uart_mxc_port1_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart1_pins,
+-                      ARRAY_SIZE(mxc_uart1_pins));
+-      return 0;
+-}
+-
+-static int mxc_uart2_pins[] = { PE8_PF_UART3_TXD,
+-                              PE9_PF_UART3_RXD,
+-                              PE10_PF_UART3_CTS,
+-                              PE11_PF_UART3_RTS };
+-
+-static int uart_mxc_port2_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins), "UART2");
+-}
+-
+-static int uart_mxc_port2_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_uart2_pins,
+-                      ARRAY_SIZE(mxc_uart2_pins));
+-      return 0;
+-}
+-
+ static struct imxuart_platform_data uart_pdata[] = {
+       {
+-              .init = uart_mxc_port0_init,
+-              .exit = uart_mxc_port0_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port1_init,
+-              .exit = uart_mxc_port1_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       }, {
+-              .init = uart_mxc_port2_init,
+-              .exit = uart_mxc_port2_exit,
+               .flags = IMXUART_HAVE_RTSCTS,
+       },
+ };
+-static int mxc_fec_pins[] = {
+-      PD0_AIN_FEC_TXD0,
+-      PD1_AIN_FEC_TXD1,
+-      PD2_AIN_FEC_TXD2,
+-      PD3_AIN_FEC_TXD3,
+-      PD4_AOUT_FEC_RX_ER,
+-      PD5_AOUT_FEC_RXD1,
+-      PD6_AOUT_FEC_RXD2,
+-      PD7_AOUT_FEC_RXD3,
+-      PD8_AF_FEC_MDIO,
+-      PD9_AIN_FEC_MDC,
+-      PD10_AOUT_FEC_CRS,
+-      PD11_AOUT_FEC_TX_CLK,
+-      PD12_AOUT_FEC_RXD0,
+-      PD13_AOUT_FEC_RX_DV,
+-      PD14_AOUT_FEC_RX_CLK,
+-      PD15_AOUT_FEC_COL,
+-      PD16_AIN_FEC_TX_ER,
+-      PF23_AIN_FEC_TX_EN
+-};
+-
+-static void gpio_fec_active(void)
+-{
+-      mxc_gpio_setup_multiple_pins(mxc_fec_pins,
+-                      ARRAY_SIZE(mxc_fec_pins), "FEC");
+-}
+-
+ static struct mxc_nand_platform_data pcm038_nand_board_info = {
+       .width = 1,
+       .hw_ecc = 1,
+@@ -210,27 +175,8 @@ static void __init pcm038_init_sram(void
+       __raw_writel(0x22220a00, CSCR_A(1));
+ }
+-#ifdef CONFIG_I2C_IMX
+-static int mxc_i2c1_pins[] = {
+-      PC5_PF_I2C2_SDA,
+-      PC6_PF_I2C2_SCL
+-};
+-
+-static int pcm038_i2c_1_init(struct device *dev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_i2c1_pins, ARRAY_SIZE(mxc_i2c1_pins),
+-                      "I2C1");
+-}
+-
+-static void pcm038_i2c_1_exit(struct device *dev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_i2c1_pins, ARRAY_SIZE(mxc_i2c1_pins));
+-}
+-
+ static struct imxi2c_platform_data pcm038_i2c_1_data = {
+       .bitrate = 100000,
+-      .init = pcm038_i2c_1_init,
+-      .exit = pcm038_i2c_1_exit,
+ };
+ static struct at24_platform_data board_eeprom = {
+@@ -253,11 +199,12 @@ static struct i2c_board_info pcm038_i2c_
+               .type = "lm75"
+       }
+ };
+-#endif
+ static void __init pcm038_init(void)
+ {
+-      gpio_fec_active();
++      mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
++                      "PCM038");
++
+       pcm038_init_sram();
+       mxc_register_device(&mxc_uart_device0, &uart_pdata[0]);
+@@ -267,13 +214,11 @@ static void __init pcm038_init(void)
+       mxc_gpio_mode(PE16_AF_OWIRE);
+       mxc_register_device(&mxc_nand_device, &pcm038_nand_board_info);
+-#ifdef CONFIG_I2C_IMX
+       /* only the i2c master 1 is used on this CPU card */
+       i2c_register_board_info(1, pcm038_i2c_devices,
+                               ARRAY_SIZE(pcm038_i2c_devices));
+       mxc_register_device(&mxc_i2c_device1, &pcm038_i2c_1_data);
+-#endif
+       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+@@ -295,7 +240,7 @@ MACHINE_START(PCM038, "phyCORE-i.MX27")
+       .phys_io        = AIPI_BASE_ADDR,
+       .io_pg_offst    = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx27_map_io,
+       .init_irq       = mxc_init_irq,
+       .init_machine   = pcm038_init,
+       .timer          = &pcm038_timer,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx2/pcm970-baseboard.c linux-2.6.30-rc4-git/arch/arm/mach-mx2/pcm970-baseboard.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/pcm970-baseboard.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx2/pcm970-baseboard.c  2009-05-13 09:46:19.000000000 +0200
+@@ -16,71 +16,107 @@
+  * MA 02110-1301, USA.
+  */
+-#include <linux/platform_device.h>
+ #include <linux/gpio.h>
+ #include <linux/irq.h>
++#include <linux/platform_device.h>
+ #include <asm/mach/arch.h>
+-#include <mach/hardware.h>
+ #include <mach/common.h>
+-#include <mach/mmc.h>
+-#include <mach/imxfb.h>
+ #include <mach/iomux.h>
++#include <mach/imxfb.h>
++#include <mach/hardware.h>
++#include <mach/mmc.h>
+ #include "devices.h"
+-static int pcm970_sdhc2_get_ro(struct device *dev)
+-{
+-      return gpio_get_value(GPIO_PORTC + 28);
+-}
+-
+-static int pcm970_sdhc2_pins[] = {
++static int pcm970_pins[] = {
++      /* SDHC */
+       PB4_PF_SD2_D0,
+       PB5_PF_SD2_D1,
+       PB6_PF_SD2_D2,
+       PB7_PF_SD2_D3,
+       PB8_PF_SD2_CMD,
+       PB9_PF_SD2_CLK,
++      GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN, /* card detect */
++      /* display */
++      PA5_PF_LSCLK,
++      PA6_PF_LD0,
++      PA7_PF_LD1,
++      PA8_PF_LD2,
++      PA9_PF_LD3,
++      PA10_PF_LD4,
++      PA11_PF_LD5,
++      PA12_PF_LD6,
++      PA13_PF_LD7,
++      PA14_PF_LD8,
++      PA15_PF_LD9,
++      PA16_PF_LD10,
++      PA17_PF_LD11,
++      PA18_PF_LD12,
++      PA19_PF_LD13,
++      PA20_PF_LD14,
++      PA21_PF_LD15,
++      PA22_PF_LD16,
++      PA23_PF_LD17,
++      PA24_PF_REV,
++      PA25_PF_CLS,
++      PA26_PF_PS,
++      PA27_PF_SPL_SPR,
++      PA28_PF_HSYNC,
++      PA29_PF_VSYNC,
++      PA30_PF_CONTRAST,
++      PA31_PF_OE_ACD,
++      /*
++       * it seems the data line misses a pullup, so we must enable
++       * the internal pullup as a local workaround
++       */
++      PD17_PF_I2C_DATA | GPIO_PUEN,
++      PD18_PF_I2C_CLK,
++      /* Camera */
++      PB10_PF_CSI_D0,
++      PB11_PF_CSI_D1,
++      PB12_PF_CSI_D2,
++      PB13_PF_CSI_D3,
++      PB14_PF_CSI_D4,
++      PB15_PF_CSI_MCLK,
++      PB16_PF_CSI_PIXCLK,
++      PB17_PF_CSI_D5,
++      PB18_PF_CSI_D6,
++      PB19_PF_CSI_D7,
++      PB20_PF_CSI_VSYNC,
++      PB21_PF_CSI_HSYNC,
+ };
++static int pcm970_sdhc2_get_ro(struct device *dev)
++{
++      return gpio_get_value(GPIO_PORTC + 28);
++}
++
+ static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void *data)
+ {
+       int ret;
+-      ret = mxc_gpio_setup_multiple_pins(pcm970_sdhc2_pins,
+-              ARRAY_SIZE(pcm970_sdhc2_pins), "sdhc2");
+-      if(ret)
+-              return ret;
+-
+-      ret = request_irq(IRQ_GPIOC(29), detect_irq, 0,
++      ret = request_irq(IRQ_GPIOC(29), detect_irq, IRQF_TRIGGER_FALLING,
+                               "imx-mmc-detect", data);
+       if (ret)
+-              goto out_release_gpio;
+-
+-      set_irq_type(IRQ_GPIOC(29), IRQF_TRIGGER_FALLING);
++              return ret;
+       ret = gpio_request(GPIO_PORTC + 28, "imx-mmc-ro");
+-      if (ret)
+-              goto out_release_gpio;
++      if (ret) {
++              free_irq(IRQ_GPIOC(29), data);
++              return ret;
++      }
+-      mxc_gpio_mode((GPIO_PORTC | 28) | GPIO_GPIO | GPIO_IN);
+       gpio_direction_input(GPIO_PORTC + 28);
+       return 0;
+-
+-out_release_gpio:
+-      mxc_gpio_release_multiple_pins(pcm970_sdhc2_pins,
+-                      ARRAY_SIZE(pcm970_sdhc2_pins));
+-      return ret;
+ }
+ static void pcm970_sdhc2_exit(struct device *dev, void *data)
+ {
+       free_irq(IRQ_GPIOC(29), data);
+       gpio_free(GPIO_PORTC + 28);
+-      mxc_gpio_release_multiple_pins(pcm970_sdhc2_pins,
+-                      ARRAY_SIZE(pcm970_sdhc2_pins));
+ }
+ static struct imxmmc_platform_data sdhc_pdata = {
+@@ -89,29 +125,6 @@ static struct imxmmc_platform_data sdhc_
+       .exit = pcm970_sdhc2_exit,
+ };
+-static int mxc_fb_pins[] = {
+-      PA5_PF_LSCLK,   PA6_PF_LD0,     PA7_PF_LD1,     PA8_PF_LD2,
+-      PA9_PF_LD3,     PA10_PF_LD4,    PA11_PF_LD5,    PA12_PF_LD6,
+-      PA13_PF_LD7,    PA14_PF_LD8,    PA15_PF_LD9,    PA16_PF_LD10,
+-      PA17_PF_LD11,   PA18_PF_LD12,   PA19_PF_LD13,   PA20_PF_LD14,
+-      PA21_PF_LD15,   PA22_PF_LD16,   PA23_PF_LD17,   PA24_PF_REV,
+-      PA25_PF_CLS,    PA26_PF_PS,     PA27_PF_SPL_SPR, PA28_PF_HSYNC,
+-      PA29_PF_VSYNC,  PA30_PF_CONTRAST, PA31_PF_OE_ACD
+-};
+-
+-static int pcm038_fb_init(struct platform_device *pdev)
+-{
+-      return mxc_gpio_setup_multiple_pins(mxc_fb_pins,
+-                      ARRAY_SIZE(mxc_fb_pins), "FB");
+-}
+-
+-static int pcm038_fb_exit(struct platform_device *pdev)
+-{
+-      mxc_gpio_release_multiple_pins(mxc_fb_pins, ARRAY_SIZE(mxc_fb_pins));
+-
+-      return 0;
+-}
+-
+ /*
+  * Connected is a portrait Sharp-QVGA display
+  * of type: LQ035Q7DH06
+@@ -144,9 +157,6 @@ static struct imx_fb_platform_data pcm03
+       .pwmr           = 0x00A903FF,
+       .lscr1          = 0x00120300,
+       .dmacr          = 0x00020010,
+-
+-      .init = pcm038_fb_init,
+-      .exit = pcm038_fb_exit,
+ };
+ /*
+@@ -157,6 +167,9 @@ static struct imx_fb_platform_data pcm03
+  */
+ void __init pcm970_baseboard_init(void)
+ {
++      mxc_gpio_setup_multiple_pins(pcm970_pins, ARRAY_SIZE(pcm970_pins),
++                      "PCM970");
++
+       mxc_register_device(&mxc_fb_device, &pcm038_fb_data);
+       mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/clock.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/clock.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/clock.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/clock.c     2009-05-13 09:46:19.000000000 +0200
+@@ -566,8 +566,6 @@ int __init mx31_clocks_init(unsigned lon
+       u32 reg;
+       int i;
+-      mxc_set_cpu_type(MXC_CPU_MX31);
+-
+       ckih_rate = fref;
+       for (i = 0; i < ARRAY_SIZE(lookups); i++)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/clock-imx35.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/clock-imx35.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/clock-imx35.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/clock-imx35.c       2009-05-13 09:46:19.000000000 +0200
+@@ -147,34 +147,16 @@ static struct arm_ahb_div clk_consumer[]
+       { .arm = 0, .ahb = 0, .sel = 0},
+ };
+-static struct arm_ahb_div clk_automotive[] = {
+-      { .arm = 1, .ahb = 3, .sel = 0},
+-      { .arm = 1, .ahb = 2, .sel = 1},
+-      { .arm = 2, .ahb = 1, .sel = 1},
+-      { .arm = 0, .ahb = 0, .sel = 0},
+-      { .arm = 1, .ahb = 6, .sel = 0},
+-      { .arm = 1, .ahb = 4, .sel = 1},
+-      { .arm = 2, .ahb = 2, .sel = 1},
+-      { .arm = 0, .ahb = 0, .sel = 0},
+-};
+-
+ static unsigned long get_rate_arm(void)
+ {
+       unsigned long pdr0 = __raw_readl(CCM_BASE + CCM_PDR0);
+       struct arm_ahb_div *aad;
+       unsigned long fref = get_rate_mpll();
+-      if (pdr0 & 1) {
+-              /* consumer path */
+-              aad = &clk_consumer[(pdr0 >> 16) & 0xf];
+-              if (aad->sel)
+-                      fref = fref * 2 / 3;
+-      } else {
+-              /* auto path */
+-              aad = &clk_automotive[(pdr0 >> 9) & 0x7];
+-              if (aad->sel)
+-                      fref = fref * 3 / 4;
+-      }
++      aad = &clk_consumer[(pdr0 >> 16) & 0xf];
++      if (aad->sel)
++              fref = fref * 2 / 3;
++
+       return fref / aad->arm;
+ }
+@@ -184,12 +166,7 @@ static unsigned long get_rate_ahb(struct
+       struct arm_ahb_div *aad;
+       unsigned long fref = get_rate_mpll();
+-      if (pdr0 & 1)
+-              /* consumer path */
+-              aad = &clk_consumer[(pdr0 >> 16) & 0xf];
+-      else
+-              /* auto path */
+-              aad = &clk_automotive[(pdr0 >> 9) & 0x7];
++      aad = &clk_consumer[(pdr0 >> 16) & 0xf];
+       return fref / aad->ahb;
+ }
+@@ -430,7 +407,8 @@ static struct clk_lookup lookups[] __ini
+       _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
+       _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_clk)
+       _REGISTER_CLOCK(NULL, "iomuxc", iomuxc_clk)
+-      _REGISTER_CLOCK(NULL, "ipu", ipu_clk)
++      _REGISTER_CLOCK("ipu-core", NULL, ipu_clk)
++      _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk)
+       _REGISTER_CLOCK(NULL, "kpp", kpp_clk)
+       _REGISTER_CLOCK(NULL, "mlb", mlb_clk)
+       _REGISTER_CLOCK(NULL, "mshc", mshc_clk)
+@@ -462,8 +440,6 @@ int __init mx35_clocks_init()
+       int i;
+       unsigned int ll = 0;
+-      mxc_set_cpu_type(MXC_CPU_MX35);
+-
+ #ifdef CONFIG_DEBUG_LL_CONSOLE
+       ll = (3 << 16);
+ #endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/devices.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/devices.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/devices.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/devices.c   2009-05-13 09:46:19.000000000 +0200
+@@ -17,13 +17,17 @@
+  * Boston, MA  02110-1301, USA.
+  */
++#include <linux/dma-mapping.h>
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
+ #include <linux/serial.h>
+ #include <linux/gpio.h>
++#include <linux/dma-mapping.h>
+ #include <mach/hardware.h>
+ #include <mach/irqs.h>
++#include <mach/common.h>
+ #include <mach/imx-uart.h>
++#include <mach/mx3_camera.h>
+ #include "devices.h"
+@@ -283,6 +287,21 @@ struct platform_device mxcsdhc_device1 =
+       .num_resources = ARRAY_SIZE(mxcsdhc1_resources),
+       .resource = mxcsdhc1_resources,
+ };
++
++static struct resource rnga_resources[] = {
++      {
++              .start = RNGA_BASE_ADDR,
++              .end = RNGA_BASE_ADDR + 0x28,
++              .flags = IORESOURCE_MEM,
++      },
++};
++
++struct platform_device mxc_rnga_device = {
++      .name = "mxc_rnga",
++      .id = -1,
++      .num_resources = 1,
++      .resource = rnga_resources,
++};
+ #endif /* CONFIG_ARCH_MX31 */
+ /* i.MX31 Image Processing Unit */
+@@ -329,10 +348,54 @@ struct platform_device mx3_fb = {
+       .num_resources  = ARRAY_SIZE(fb_resources),
+       .resource       = fb_resources,
+       .dev            = {
+-              .coherent_dma_mask = 0xffffffff,
++              .coherent_dma_mask = DMA_BIT_MASK(32),
+        },
+ };
++static struct resource camera_resources[] = {
++      {
++              .start  = IPU_CTRL_BASE_ADDR + 0x60,
++              .end    = IPU_CTRL_BASE_ADDR + 0x87,
++              .flags  = IORESOURCE_MEM,
++      },
++};
++
++struct platform_device mx3_camera = {
++      .name           = "mx3-camera",
++      .id             = 0,
++      .num_resources  = ARRAY_SIZE(camera_resources),
++      .resource       = camera_resources,
++      .dev            = {
++              .coherent_dma_mask = DMA_BIT_MASK(32),
++      },
++};
++
++static struct resource otg_resources[] = {
++      {
++              .start  = OTG_BASE_ADDR,
++              .end    = OTG_BASE_ADDR + 0x1ff,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = MXC_INT_USB3,
++              .end    = MXC_INT_USB3,
++              .flags  = IORESOURCE_IRQ,
++      },
++};
++
++static u64 otg_dmamask = DMA_BIT_MASK(32);
++
++/* OTG gadget device */
++struct platform_device mxc_otg_udc_device = {
++      .name           = "fsl-usb2-udc",
++      .id             = -1,
++      .dev            = {
++              .dma_mask               = &otg_dmamask,
++              .coherent_dma_mask      = DMA_BIT_MASK(32),
++      },
++      .resource       = otg_resources,
++      .num_resources  = ARRAY_SIZE(otg_resources),
++};
++
+ #ifdef CONFIG_ARCH_MX35
+ static struct resource mxc_fec_resources[] = {
+       {
+@@ -359,6 +422,7 @@ static int mx3_devices_init(void)
+       if (cpu_is_mx31()) {
+               mxc_nand_resources[0].start = MX31_NFC_BASE_ADDR;
+               mxc_nand_resources[0].end = MX31_NFC_BASE_ADDR + 0xfff;
++              mxc_register_device(&mxc_rnga_device, NULL);
+       }
+       if (cpu_is_mx35()) {
+               mxc_nand_resources[0].start = MX35_NFC_BASE_ADDR;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/devices.h linux-2.6.30-rc4-git/arch/arm/mach-mx3/devices.h
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/devices.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/devices.h   2009-05-13 09:46:19.000000000 +0200
+@@ -11,6 +11,8 @@ extern struct platform_device mxc_i2c_de
+ extern struct platform_device mxc_i2c_device2;
+ extern struct platform_device mx3_ipu;
+ extern struct platform_device mx3_fb;
++extern struct platform_device mx3_camera;
+ extern struct platform_device mxc_fec_device;
+ extern struct platform_device mxcsdhc_device0;
+ extern struct platform_device mxcsdhc_device1;
++extern struct platform_device mxc_otg_udc_device;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/iomux.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/iomux.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/iomux.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/iomux.c     2009-05-13 09:46:19.000000000 +0200
+@@ -21,7 +21,6 @@
+ #include <linux/module.h>
+ #include <linux/spinlock.h>
+ #include <linux/io.h>
+-#include <linux/gpio.h>
+ #include <linux/kernel.h>
+ #include <mach/hardware.h>
+ #include <mach/gpio.h>
+@@ -94,15 +93,13 @@ void mxc_iomux_set_pad(enum iomux_pins p
+ EXPORT_SYMBOL(mxc_iomux_set_pad);
+ /*
+- * setups a single pin:
++ * allocs a single pin:
+  *    - reserves the pin so that it is not claimed by another driver
+  *    - setups the iomux according to the configuration
+- *    - if the pin is configured as a GPIO, we claim it through kernel gpiolib
+  */
+-int mxc_iomux_setup_pin(const unsigned int pin, const char *label)
++int mxc_iomux_alloc_pin(const unsigned int pin, const char *label)
+ {
+       unsigned pad = pin & IOMUX_PADNUM_MASK;
+-      unsigned gpio;
+       if (pad >= (PIN_MAX + 1)) {
+               printk(KERN_ERR "mxc_iomux: Attempt to request nonexistant pin %u for \"%s\"\n",
+@@ -113,19 +110,13 @@ int mxc_iomux_setup_pin(const unsigned i
+       if (test_and_set_bit(pad, mxc_pin_alloc_map)) {
+               printk(KERN_ERR "mxc_iomux: pin %u already used. Allocation for \"%s\" failed\n",
+                       pad, label ? label : "?");
+-              return -EINVAL;
++              return -EBUSY;
+       }
+       mxc_iomux_mode(pin);
+-      /* if we have a gpio, we can allocate it */
+-      gpio = (pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT;
+-      if (gpio < (GPIO_PORT_MAX + 1) * 32)
+-              if (gpio_request(gpio, label))
+-                      return -EINVAL;
+-
+       return 0;
+ }
+-EXPORT_SYMBOL(mxc_iomux_setup_pin);
++EXPORT_SYMBOL(mxc_iomux_alloc_pin);
+ int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count,
+               const char *label)
+@@ -135,7 +126,8 @@ int mxc_iomux_setup_multiple_pins(unsign
+       int ret = -EINVAL;
+       for (i = 0; i < count; i++) {
+-              if (mxc_iomux_setup_pin(*p, label))
++              ret = mxc_iomux_alloc_pin(*p, label);
++              if (ret)
+                       goto setup_error;
+               p++;
+       }
+@@ -150,14 +142,9 @@ EXPORT_SYMBOL(mxc_iomux_setup_multiple_p
+ void mxc_iomux_release_pin(const unsigned int pin)
+ {
+       unsigned pad = pin & IOMUX_PADNUM_MASK;
+-      unsigned gpio;
+       if (pad < (PIN_MAX + 1))
+               clear_bit(pad, mxc_pin_alloc_map);
+-
+-      gpio = (pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT;
+-      if (gpio < (GPIO_PORT_MAX + 1) * 32)
+-              gpio_free(gpio);
+ }
+ EXPORT_SYMBOL(mxc_iomux_release_pin);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/Kconfig linux-2.6.30-rc4-git/arch/arm/mach-mx3/Kconfig
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/Kconfig 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/Kconfig     2009-05-13 09:46:19.000000000 +0200
+@@ -1,10 +1,12 @@
+ if ARCH_MX3
+ config ARCH_MX31
++      select ARCH_HAS_RNGA
+       bool
+ config ARCH_MX35
+       bool
++      select ARCH_MXC_IOMUX_V3
+ comment "MX3 platforms:"
+@@ -66,4 +68,11 @@ config MACH_QONG
+         Include support for Dave/DENX QongEVB-LITE platform. This includes
+         specific configurations for the board and its peripherals.
++config MACH_PCM043
++      bool "Support Phytec pcm043 (i.MX35) platforms"
++      select ARCH_MX35
++      help
++        Include support for Phytec pcm043 platform. This includes
++        specific configurations for the board and its peripherals.
++
+ endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/Makefile linux-2.6.30-rc4-git/arch/arm/mach-mx3/Makefile
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -14,3 +14,4 @@ obj-$(CONFIG_MACH_MX31_3DS)  += mx31pdk.o
+ obj-$(CONFIG_MACH_MX31MOBOARD)        += mx31moboard.o mx31moboard-devboard.o \
+                                  mx31moboard-marxbot.o
+ obj-$(CONFIG_MACH_QONG)               += qong.o
++obj-$(CONFIG_MACH_PCM043)     += pcm043.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mm.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mm.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mm.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mm.c        2009-05-13 09:46:19.000000000 +0200
+@@ -72,8 +72,17 @@ static struct map_desc mxc_io_desc[] __i
+  * system startup to create static physical to virtual memory mappings
+  * for the IO modules.
+  */
+-void __init mxc_map_io(void)
++void __init mx31_map_io(void)
+ {
++      mxc_set_cpu_type(MXC_CPU_MX31);
++
++      iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc));
++}
++
++void __init mx35_map_io(void)
++{
++      mxc_set_cpu_type(MXC_CPU_MX35);
++
+       iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc));
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31ads.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31ads.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31ads.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31ads.c   2009-05-13 09:46:19.000000000 +0200
+@@ -187,7 +187,7 @@ static void __init mx31ads_init_expio(vo
+       /*
+        * Configure INT line as GPIO input
+        */
+-      mxc_iomux_setup_pin(IOMUX_MODE(MX31_PIN_GPIO1_4, IOMUX_CONFIG_GPIO), "expio");
++      mxc_iomux_alloc_pin(IOMUX_MODE(MX31_PIN_GPIO1_4, IOMUX_CONFIG_GPIO), "expio");
+       /* disable the interrupt and clear the status */
+       __raw_writew(0xFFFF, PBC_INTMASK_CLEAR_REG);
+@@ -511,7 +511,7 @@ static struct map_desc mx31ads_io_desc[]
+  */
+ static void __init mx31ads_map_io(void)
+ {
+-      mxc_map_io();
++      mx31_map_io();
+       iotable_init(mx31ads_io_desc, ARRAY_SIZE(mx31ads_io_desc));
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31lite.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31lite.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31lite.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31lite.c  2009-05-13 09:46:19.000000000 +0200
+@@ -22,6 +22,9 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/memory.h>
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++#include <linux/smsc911x.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+@@ -32,11 +35,58 @@
+ #include <asm/page.h>
+ #include <asm/setup.h>
+ #include <mach/board-mx31lite.h>
++#include <mach/imx-uart.h>
++#include <mach/iomux-mx3.h>
++#include <mach/irqs.h>
++#include "devices.h"
+ /*
+  * This file contains the board-specific initialization routines.
+  */
++static unsigned int mx31lite_pins[] = {
++      /* UART1 */
++      MX31_PIN_CTS1__CTS1,
++      MX31_PIN_RTS1__RTS1,
++      MX31_PIN_TXD1__TXD1,
++      MX31_PIN_RXD1__RXD1,
++      /* LAN9117 IRQ pin */
++      IOMUX_MODE(MX31_PIN_SFS6, IOMUX_CONFIG_GPIO),
++};
++
++static struct imxuart_platform_data uart_pdata = {
++      .flags = IMXUART_HAVE_RTSCTS,
++};
++
++static struct smsc911x_platform_config smsc911x_config = {
++      .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
++      .irq_type       = SMSC911X_IRQ_TYPE_PUSH_PULL,
++      .flags          = SMSC911X_USE_16BIT,
++};
++
++static struct resource smsc911x_resources[] = {
++      [0] = {
++              .start          = CS4_BASE_ADDR,
++              .end            = CS4_BASE_ADDR + 0x100,
++              .flags          = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start          = IOMUX_TO_IRQ(MX31_PIN_SFS6),
++              .end            = IOMUX_TO_IRQ(MX31_PIN_SFS6),
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device smsc911x_device = {
++      .name           = "smsc911x",
++      .id             = -1,
++      .num_resources  = ARRAY_SIZE(smsc911x_resources),
++      .resource       = smsc911x_resources,
++      .dev            = {
++              .platform_data = &smsc911x_config,
++      },
++};
++
+ /*
+  * This structure defines the MX31 memory map.
+  */
+@@ -59,7 +109,7 @@ static struct map_desc mx31lite_io_desc[
+  */
+ void __init mx31lite_map_io(void)
+ {
+-      mxc_map_io();
++      mx31_map_io();
+       iotable_init(mx31lite_io_desc, ARRAY_SIZE(mx31lite_io_desc));
+ }
+@@ -68,6 +118,21 @@ void __init mx31lite_map_io(void)
+  */
+ static void __init mxc_board_init(void)
+ {
++      int ret;
++
++      mxc_iomux_setup_multiple_pins(mx31lite_pins, ARRAY_SIZE(mx31lite_pins),
++                                    "mx31lite");
++
++      mxc_register_device(&mxc_uart_device0, &uart_pdata);
++
++      /* SMSC9117 IRQ pin */
++      ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq");
++      if (ret)
++              pr_warning("could not get LAN irq gpio\n");
++      else {
++              gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_SFS6));
++              platform_device_register(&smsc911x_device);
++      }
+ }
+ static void __init mx31lite_timer_init(void)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard.c       2009-05-13 09:46:19.000000000 +0200
+@@ -16,26 +16,47 @@
+  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+-#include <linux/types.h>
++#include <linux/gpio.h>
+ #include <linux/init.h>
+-
+-#include <linux/platform_device.h>
++#include <linux/interrupt.h>
++#include <linux/memory.h>
+ #include <linux/mtd/physmap.h>
+ #include <linux/mtd/partitions.h>
+-#include <linux/memory.h>
++#include <linux/platform_device.h>
++#include <linux/types.h>
+-#include <mach/hardware.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ #include <asm/mach/time.h>
+ #include <asm/mach/map.h>
++#include <mach/board-mx31moboard.h>
+ #include <mach/common.h>
++#include <mach/hardware.h>
+ #include <mach/imx-uart.h>
+ #include <mach/iomux-mx3.h>
+-#include <mach/board-mx31moboard.h>
++#include <mach/i2c.h>
++#include <mach/mmc.h>
+ #include "devices.h"
++static unsigned int moboard_pins[] = {
++      /* UART0 */
++      MX31_PIN_CTS1__CTS1, MX31_PIN_RTS1__RTS1,
++      MX31_PIN_TXD1__TXD1, MX31_PIN_RXD1__RXD1,
++      /* UART4 */
++      MX31_PIN_PC_RST__CTS5, MX31_PIN_PC_VS2__RTS5,
++      MX31_PIN_PC_BVD2__TXD5, MX31_PIN_PC_BVD1__RXD5,
++      /* I2C0 */
++      MX31_PIN_I2C_DAT__I2C1_SDA, MX31_PIN_I2C_CLK__I2C1_SCL,
++      /* I2C1 */
++      MX31_PIN_DCD_DTE1__I2C2_SDA, MX31_PIN_RI_DTE1__I2C2_SCL,
++      /* SDHC1 */
++      MX31_PIN_SD1_DATA3__SD1_DATA3, MX31_PIN_SD1_DATA2__SD1_DATA2,
++      MX31_PIN_SD1_DATA1__SD1_DATA1, MX31_PIN_SD1_DATA0__SD1_DATA0,
++      MX31_PIN_SD1_CLK__SD1_CLK, MX31_PIN_SD1_CMD__SD1_CMD,
++      MX31_PIN_ATA_CS0__GPIO3_26, MX31_PIN_ATA_CS1__GPIO3_27,
++};
++
+ static struct physmap_flash_data mx31moboard_flash_data = {
+       .width          = 2,
+ };
+@@ -60,17 +81,69 @@ static struct imxuart_platform_data uart
+       .flags = IMXUART_HAVE_RTSCTS,
+ };
+-static struct platform_device *devices[] __initdata = {
+-      &mx31moboard_flash,
++static struct imxi2c_platform_data moboard_i2c0_pdata = {
++      .bitrate = 400000,
+ };
+-static int mxc_uart0_pins[] = {
+-      MX31_PIN_CTS1__CTS1, MX31_PIN_RTS1__RTS1,
+-      MX31_PIN_TXD1__TXD1, MX31_PIN_RXD1__RXD1,
++static struct imxi2c_platform_data moboard_i2c1_pdata = {
++      .bitrate = 100000,
+ };
+-static int mxc_uart4_pins[] = {
+-      MX31_PIN_PC_RST__CTS5, MX31_PIN_PC_VS2__RTS5,
+-      MX31_PIN_PC_BVD2__TXD5, MX31_PIN_PC_BVD1__RXD5,
++
++#define SDHC1_CD IOMUX_TO_GPIO(MX31_PIN_ATA_CS0)
++#define SDHC1_WP IOMUX_TO_GPIO(MX31_PIN_ATA_CS1)
++
++static int moboard_sdhc1_get_ro(struct device *dev)
++{
++      return gpio_get_value(SDHC1_WP);
++}
++
++static int moboard_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
++              void *data)
++{
++      int ret;
++
++      ret = gpio_request(SDHC1_CD, "sdhc-detect");
++      if (ret)
++              return ret;
++
++      gpio_direction_input(SDHC1_CD);
++
++      ret = gpio_request(SDHC1_WP, "sdhc-wp");
++      if (ret)
++              goto err_gpio_free;
++      gpio_direction_input(SDHC1_WP);
++
++      ret = request_irq(gpio_to_irq(SDHC1_CD), detect_irq,
++              IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
++              "sdhc1-card-detect", data);
++      if (ret)
++              goto err_gpio_free_2;
++
++      return 0;
++
++err_gpio_free_2:
++      gpio_free(SDHC1_WP);
++err_gpio_free:
++      gpio_free(SDHC1_CD);
++
++      return ret;
++}
++
++static void moboard_sdhc1_exit(struct device *dev, void *data)
++{
++      free_irq(gpio_to_irq(SDHC1_CD), data);
++      gpio_free(SDHC1_WP);
++      gpio_free(SDHC1_CD);
++}
++
++static struct imxmmc_platform_data sdhc1_pdata = {
++      .get_ro = moboard_sdhc1_get_ro,
++      .init   = moboard_sdhc1_init,
++      .exit   = moboard_sdhc1_exit,
++};
++
++static struct platform_device *devices[] __initdata = {
++      &mx31moboard_flash,
+ };
+ static int mx31moboard_baseboard;
+@@ -81,14 +154,19 @@ core_param(mx31moboard_baseboard, mx31mo
+  */
+ static void __init mxc_board_init(void)
+ {
++      mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins),
++              "moboard");
++
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+-      mxc_iomux_setup_multiple_pins(mxc_uart0_pins, ARRAY_SIZE(mxc_uart0_pins), "uart0");
+       mxc_register_device(&mxc_uart_device0, &uart_pdata);
+-
+-      mxc_iomux_setup_multiple_pins(mxc_uart4_pins, ARRAY_SIZE(mxc_uart4_pins), "uart4");
+       mxc_register_device(&mxc_uart_device4, &uart_pdata);
++      mxc_register_device(&mxc_i2c_device0, &moboard_i2c0_pdata);
++      mxc_register_device(&mxc_i2c_device1, &moboard_i2c1_pdata);
++
++      mxc_register_device(&mxcsdhc_device0, &sdhc1_pdata);
++
+       switch (mx31moboard_baseboard) {
+       case MX31NOBOARD:
+               break;
+@@ -99,7 +177,8 @@ static void __init mxc_board_init(void)
+               mx31moboard_marxbot_init();
+               break;
+       default:
+-              printk(KERN_ERR "Illegal mx31moboard_baseboard type %d\n", mx31moboard_baseboard);
++              printk(KERN_ERR "Illegal mx31moboard_baseboard type %d\n",
++                      mx31moboard_baseboard);
+       }
+ }
+@@ -117,7 +196,7 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots 
+       .phys_io        = AIPS1_BASE_ADDR,
+       .io_pg_offst    = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx31_map_io,
+       .init_irq       = mxc_init_irq,
+       .init_machine   = mxc_board_init,
+       .timer          = &mx31moboard_timer,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard-devboard.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard-devboard.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard-devboard.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard-devboard.c      2009-05-13 09:46:19.000000000 +0200
+@@ -16,33 +16,142 @@
+  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+-#include <linux/types.h>
++#include <linux/fsl_devices.h>
++#include <linux/gpio.h>
+ #include <linux/init.h>
+-
++#include <linux/interrupt.h>
+ #include <linux/platform_device.h>
++#include <linux/types.h>
+-#include <mach/hardware.h>
+ #include <mach/common.h>
+ #include <mach/imx-uart.h>
+ #include <mach/iomux-mx3.h>
++#include <mach/hardware.h>
++#include <mach/mmc.h>
+ #include "devices.h"
++static unsigned int devboard_pins[] = {
++      /* UART1 */
++      MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2,
++      MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2,
++      /* SDHC2 */
++      MX31_PIN_PC_PWRON__SD2_DATA3, MX31_PIN_PC_VS1__SD2_DATA2,
++      MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0,
++      MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD,
++      MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29,
++      /* USB OTG */
++      MX31_PIN_USBOTG_DATA0__USBOTG_DATA0,
++      MX31_PIN_USBOTG_DATA1__USBOTG_DATA1,
++      MX31_PIN_USBOTG_DATA2__USBOTG_DATA2,
++      MX31_PIN_USBOTG_DATA3__USBOTG_DATA3,
++      MX31_PIN_USBOTG_DATA4__USBOTG_DATA4,
++      MX31_PIN_USBOTG_DATA5__USBOTG_DATA5,
++      MX31_PIN_USBOTG_DATA6__USBOTG_DATA6,
++      MX31_PIN_USBOTG_DATA7__USBOTG_DATA7,
++      MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR,
++      MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP,
++      MX31_PIN_USB_OC__GPIO1_30,
++};
++
+ static struct imxuart_platform_data uart_pdata = {
+       .flags = IMXUART_HAVE_RTSCTS,
+ };
+-static int mxc_uart1_pins[] = {
+-      MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2,
+-      MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2,
++#define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR)
++#define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW)
++
++static int devboard_sdhc2_get_ro(struct device *dev)
++{
++      return gpio_get_value(SDHC2_WP);
++}
++
++static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
++              void *data)
++{
++      int ret;
++
++      ret = gpio_request(SDHC2_CD, "sdhc-detect");
++      if (ret)
++              return ret;
++
++      gpio_direction_input(SDHC2_CD);
++
++      ret = gpio_request(SDHC2_WP, "sdhc-wp");
++      if (ret)
++              goto err_gpio_free;
++      gpio_direction_input(SDHC2_WP);
++
++      ret = request_irq(gpio_to_irq(SDHC2_CD), detect_irq,
++              IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
++              "sdhc2-card-detect", data);
++      if (ret)
++              goto err_gpio_free_2;
++
++      return 0;
++
++err_gpio_free_2:
++      gpio_free(SDHC2_WP);
++err_gpio_free:
++      gpio_free(SDHC2_CD);
++
++      return ret;
++}
++
++static void devboard_sdhc2_exit(struct device *dev, void *data)
++{
++      free_irq(gpio_to_irq(SDHC2_CD), data);
++      gpio_free(SDHC2_WP);
++      gpio_free(SDHC2_CD);
++}
++
++static struct imxmmc_platform_data sdhc2_pdata = {
++      .get_ro = devboard_sdhc2_get_ro,
++      .init   = devboard_sdhc2_init,
++      .exit   = devboard_sdhc2_exit,
++};
++
++static struct fsl_usb2_platform_data usb_pdata = {
++      .operating_mode = FSL_USB2_DR_DEVICE,
++      .phy_mode       = FSL_USB2_PHY_ULPI,
+ };
++#define OTG_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST)
++#define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC)
++
++static void devboard_usbotg_init(void)
++{
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, OTG_PAD_CFG);
++
++      gpio_request(OTG_EN_B, "usb-udc-en");
++      gpio_direction_output(OTG_EN_B, 0);
++}
++
+ /*
+  * system init for baseboard usage. Will be called by mx31moboard init.
+  */
+ void __init mx31moboard_devboard_init(void)
+ {
+       printk(KERN_INFO "Initializing mx31devboard peripherals\n");
+-      mxc_iomux_setup_multiple_pins(mxc_uart1_pins, ARRAY_SIZE(mxc_uart1_pins), "uart1");
++
++      mxc_iomux_setup_multiple_pins(devboard_pins, ARRAY_SIZE(devboard_pins),
++              "devboard");
++
+       mxc_register_device(&mxc_uart_device1, &uart_pdata);
++
++      mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata);
++
++      devboard_usbotg_init();
++      mxc_register_device(&mxc_otg_udc_device, &usb_pdata);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard-marxbot.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard-marxbot.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31moboard-marxbot.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31moboard-marxbot.c       2009-05-13 09:46:19.000000000 +0200
+@@ -16,22 +16,144 @@
+  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+-#include <linux/types.h>
++#include <linux/fsl_devices.h>
++#include <linux/gpio.h>
+ #include <linux/init.h>
+-
++#include <linux/interrupt.h>
+ #include <linux/platform_device.h>
++#include <linux/types.h>
+-#include <mach/hardware.h>
+ #include <mach/common.h>
++#include <mach/hardware.h>
+ #include <mach/imx-uart.h>
+ #include <mach/iomux-mx3.h>
++#include <mach/mmc.h>
+ #include "devices.h"
++static unsigned int marxbot_pins[] = {
++      /* SDHC2 */
++      MX31_PIN_PC_PWRON__SD2_DATA3, MX31_PIN_PC_VS1__SD2_DATA2,
++      MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0,
++      MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD,
++      MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29,
++      /* CSI */
++      MX31_PIN_CSI_D4__CSI_D4, MX31_PIN_CSI_D5__CSI_D5,
++      MX31_PIN_CSI_D6__CSI_D6, MX31_PIN_CSI_D7__CSI_D7,
++      MX31_PIN_CSI_D8__CSI_D8, MX31_PIN_CSI_D9__CSI_D9,
++      MX31_PIN_CSI_D10__CSI_D10, MX31_PIN_CSI_D11__CSI_D11,
++      MX31_PIN_CSI_D12__CSI_D12, MX31_PIN_CSI_D13__CSI_D13,
++      MX31_PIN_CSI_D14__CSI_D14, MX31_PIN_CSI_D15__CSI_D15,
++      MX31_PIN_CSI_HSYNC__CSI_HSYNC, MX31_PIN_CSI_MCLK__CSI_MCLK,
++      MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC,
++      MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1,
++      MX31_PIN_TXD2__GPIO1_28,
++      /* USB OTG */
++      MX31_PIN_USBOTG_DATA0__USBOTG_DATA0,
++      MX31_PIN_USBOTG_DATA1__USBOTG_DATA1,
++      MX31_PIN_USBOTG_DATA2__USBOTG_DATA2,
++      MX31_PIN_USBOTG_DATA3__USBOTG_DATA3,
++      MX31_PIN_USBOTG_DATA4__USBOTG_DATA4,
++      MX31_PIN_USBOTG_DATA5__USBOTG_DATA5,
++      MX31_PIN_USBOTG_DATA6__USBOTG_DATA6,
++      MX31_PIN_USBOTG_DATA7__USBOTG_DATA7,
++      MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR,
++      MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP,
++      MX31_PIN_USB_OC__GPIO1_30,
++};
++
++#define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR)
++#define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW)
++
++static int marxbot_sdhc2_get_ro(struct device *dev)
++{
++      return gpio_get_value(SDHC2_WP);
++}
++
++static int marxbot_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
++              void *data)
++{
++      int ret;
++
++      ret = gpio_request(SDHC2_CD, "sdhc-detect");
++      if (ret)
++              return ret;
++
++      gpio_direction_input(SDHC2_CD);
++
++      ret = gpio_request(SDHC2_WP, "sdhc-wp");
++      if (ret)
++              goto err_gpio_free;
++      gpio_direction_input(SDHC2_WP);
++
++      ret = request_irq(gpio_to_irq(SDHC2_CD), detect_irq,
++              IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
++              "sdhc2-card-detect", data);
++      if (ret)
++              goto err_gpio_free_2;
++
++      return 0;
++
++err_gpio_free_2:
++      gpio_free(SDHC2_WP);
++err_gpio_free:
++      gpio_free(SDHC2_CD);
++
++      return ret;
++}
++
++static void marxbot_sdhc2_exit(struct device *dev, void *data)
++{
++      free_irq(gpio_to_irq(SDHC2_CD), data);
++      gpio_free(SDHC2_WP);
++      gpio_free(SDHC2_CD);
++}
++
++static struct imxmmc_platform_data sdhc2_pdata = {
++      .get_ro = marxbot_sdhc2_get_ro,
++      .init   = marxbot_sdhc2_init,
++      .exit   = marxbot_sdhc2_exit,
++};
++
++static struct fsl_usb2_platform_data usb_pdata = {
++      .operating_mode = FSL_USB2_DR_DEVICE,
++      .phy_mode       = FSL_USB2_PHY_ULPI,
++};
++
++#define OTG_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST)
++#define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC)
++
++static void marxbot_usbotg_init(void)
++{
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, OTG_PAD_CFG);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, OTG_PAD_CFG);
++
++      gpio_request(OTG_EN_B, "usb-udc-en");
++      gpio_direction_output(OTG_EN_B, 0);
++}
++
+ /*
+  * system init for baseboard usage. Will be called by mx31moboard init.
+  */
+ void __init mx31moboard_marxbot_init(void)
+ {
+       printk(KERN_INFO "Initializing mx31marxbot peripherals\n");
++
++      mxc_iomux_setup_multiple_pins(marxbot_pins, ARRAY_SIZE(marxbot_pins),
++              "marxbot");
++
++      mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata);
++
++      marxbot_usbotg_init();
++      mxc_register_device(&mxc_otg_udc_device, &usb_pdata);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/mx31pdk.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31pdk.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/mx31pdk.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/mx31pdk.c   2009-05-13 09:46:19.000000000 +0200
+@@ -84,7 +84,7 @@ MACHINE_START(MX31_3DS, "Freescale MX31P
+       .phys_io        = AIPS1_BASE_ADDR,
+       .io_pg_offst    = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx31_map_io,
+       .init_irq       = mxc_init_irq,
+       .init_machine   = mxc_board_init,
+       .timer          = &mx31pdk_timer,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/pcm037.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/pcm037.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/pcm037.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/pcm037.c    2009-05-13 09:46:19.000000000 +0200
+@@ -28,6 +28,10 @@
+ #include <linux/interrupt.h>
+ #include <linux/i2c.h>
+ #include <linux/i2c/at24.h>
++#include <linux/delay.h>
++#include <linux/spi/spi.h>
++#include <linux/irq.h>
++#include <linux/fsl_devices.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+@@ -37,7 +41,9 @@
+ #include <mach/common.h>
+ #include <mach/imx-uart.h>
+ #include <mach/iomux-mx3.h>
++#include <mach/ipu.h>
+ #include <mach/board-pcm037.h>
++#include <mach/mx3fb.h>
+ #include <mach/mxc_nand.h>
+ #include <mach/mmc.h>
+ #ifdef CONFIG_I2C_IMX
+@@ -46,6 +52,76 @@
+ #include "devices.h"
++static unsigned int pcm037_pins[] = {
++      /* I2C */
++      MX31_PIN_CSPI2_MOSI__SCL,
++      MX31_PIN_CSPI2_MISO__SDA,
++      /* SDHC1 */
++      MX31_PIN_SD1_DATA3__SD1_DATA3,
++      MX31_PIN_SD1_DATA2__SD1_DATA2,
++      MX31_PIN_SD1_DATA1__SD1_DATA1,
++      MX31_PIN_SD1_DATA0__SD1_DATA0,
++      MX31_PIN_SD1_CLK__SD1_CLK,
++      MX31_PIN_SD1_CMD__SD1_CMD,
++      IOMUX_MODE(MX31_PIN_SCK6, IOMUX_CONFIG_GPIO), /* card detect */
++      IOMUX_MODE(MX31_PIN_SFS6, IOMUX_CONFIG_GPIO), /* write protect */
++      /* SPI1 */
++      MX31_PIN_CSPI1_MOSI__MOSI,
++      MX31_PIN_CSPI1_MISO__MISO,
++      MX31_PIN_CSPI1_SCLK__SCLK,
++      MX31_PIN_CSPI1_SPI_RDY__SPI_RDY,
++      MX31_PIN_CSPI1_SS0__SS0,
++      MX31_PIN_CSPI1_SS1__SS1,
++      MX31_PIN_CSPI1_SS2__SS2,
++      /* UART1 */
++      MX31_PIN_CTS1__CTS1,
++      MX31_PIN_RTS1__RTS1,
++      MX31_PIN_TXD1__TXD1,
++      MX31_PIN_RXD1__RXD1,
++      /* UART2 */
++      MX31_PIN_TXD2__TXD2,
++      MX31_PIN_RXD2__RXD2,
++      MX31_PIN_CTS2__CTS2,
++      MX31_PIN_RTS2__RTS2,
++      /* UART3 */
++      MX31_PIN_CSPI3_MOSI__RXD3,
++      MX31_PIN_CSPI3_MISO__TXD3,
++      MX31_PIN_CSPI3_SCLK__RTS3,
++      MX31_PIN_CSPI3_SPI_RDY__CTS3,
++      /* LAN9217 irq pin */
++      IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO),
++      /* Onewire */
++      MX31_PIN_BATT_LINE__OWIRE,
++      /* Framebuffer */
++      MX31_PIN_LD0__LD0,
++      MX31_PIN_LD1__LD1,
++      MX31_PIN_LD2__LD2,
++      MX31_PIN_LD3__LD3,
++      MX31_PIN_LD4__LD4,
++      MX31_PIN_LD5__LD5,
++      MX31_PIN_LD6__LD6,
++      MX31_PIN_LD7__LD7,
++      MX31_PIN_LD8__LD8,
++      MX31_PIN_LD9__LD9,
++      MX31_PIN_LD10__LD10,
++      MX31_PIN_LD11__LD11,
++      MX31_PIN_LD12__LD12,
++      MX31_PIN_LD13__LD13,
++      MX31_PIN_LD14__LD14,
++      MX31_PIN_LD15__LD15,
++      MX31_PIN_LD16__LD16,
++      MX31_PIN_LD17__LD17,
++      MX31_PIN_VSYNC3__VSYNC3,
++      MX31_PIN_HSYNC__HSYNC,
++      MX31_PIN_FPSHIFT__FPSHIFT,
++      MX31_PIN_DRDY0__DRDY0,
++      MX31_PIN_D3_REV__D3_REV,
++      MX31_PIN_CONTRAST__CONTRAST,
++      MX31_PIN_D3_SPL__D3_SPL,
++      MX31_PIN_D3_CLS__D3_CLS,
++      MX31_PIN_LCS0__GPI03_23,
++};
++
+ static struct physmap_flash_data pcm037_flash_data = {
+       .width  = 2,
+ };
+@@ -56,6 +132,54 @@ static struct resource pcm037_flash_reso
+       .flags  = IORESOURCE_MEM,
+ };
++static int usbotg_pins[] = {
++      MX31_PIN_USBOTG_DATA0__USBOTG_DATA0,
++      MX31_PIN_USBOTG_DATA1__USBOTG_DATA1,
++      MX31_PIN_USBOTG_DATA2__USBOTG_DATA2,
++      MX31_PIN_USBOTG_DATA3__USBOTG_DATA3,
++      MX31_PIN_USBOTG_DATA4__USBOTG_DATA4,
++      MX31_PIN_USBOTG_DATA5__USBOTG_DATA5,
++      MX31_PIN_USBOTG_DATA6__USBOTG_DATA6,
++      MX31_PIN_USBOTG_DATA7__USBOTG_DATA7,
++      MX31_PIN_USBOTG_CLK__USBOTG_CLK,
++      MX31_PIN_USBOTG_DIR__USBOTG_DIR,
++      MX31_PIN_USBOTG_NXT__USBOTG_NXT,
++      MX31_PIN_USBOTG_STP__USBOTG_STP,
++};
++
++/* USB OTG HS port */
++static int __init gpio_usbotg_hs_activate(void)
++{
++      int ret = mxc_iomux_setup_multiple_pins(usbotg_pins,
++                                      ARRAY_SIZE(usbotg_pins), "usbotg");
++
++      if (ret < 0) {
++              printk(KERN_ERR "Cannot set up OTG pins\n");
++              return ret;
++      }
++
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK,   PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR,   PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT,   PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++      mxc_iomux_set_pad(MX31_PIN_USBOTG_STP,   PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
++
++      return 0;
++}
++
++/* OTG config */
++static struct fsl_usb2_platform_data usb_pdata = {
++      .operating_mode = FSL_USB2_DR_DEVICE,
++      .phy_mode       = FSL_USB2_PHY_ULPI,
++};
++
+ static struct platform_device pcm037_flash = {
+       .name   = "physmap-flash",
+       .id     = 0,
+@@ -127,26 +251,8 @@ static struct mxc_nand_platform_data pcm
+ };
+ #ifdef CONFIG_I2C_IMX
+-static int i2c_1_pins[] = {
+-      MX31_PIN_CSPI2_MOSI__SCL,
+-      MX31_PIN_CSPI2_MISO__SDA,
+-};
+-
+-static int pcm037_i2c_1_init(struct device *dev)
+-{
+-      return mxc_iomux_setup_multiple_pins(i2c_1_pins, ARRAY_SIZE(i2c_1_pins),
+-                      "i2c-1");
+-}
+-
+-static void pcm037_i2c_1_exit(struct device *dev)
+-{
+-      mxc_iomux_release_multiple_pins(i2c_1_pins, ARRAY_SIZE(i2c_1_pins));
+-}
+-
+ static struct imxi2c_platform_data pcm037_i2c_1_data = {
+       .bitrate = 100000,
+-      .init = pcm037_i2c_1_init,
+-      .exit = pcm037_i2c_1_exit,
+ };
+ static struct at24_platform_data board_eeprom = {
+@@ -166,48 +272,119 @@ static struct i2c_board_info pcm037_i2c_
+ };
+ #endif
+-static int sdhc1_pins[] = {
+-      MX31_PIN_SD1_DATA3__SD1_DATA3,
+-      MX31_PIN_SD1_DATA2__SD1_DATA2,
+-      MX31_PIN_SD1_DATA1__SD1_DATA1,
+-      MX31_PIN_SD1_DATA0__SD1_DATA0,
+-      MX31_PIN_SD1_CLK__SD1_CLK,
+-      MX31_PIN_SD1_CMD__SD1_CMD,
+-};
++/* Not connected by default */
++#ifdef PCM970_SDHC_RW_SWITCH
++static int pcm970_sdhc1_get_ro(struct device *dev)
++{
++      return gpio_get_value(IOMUX_TO_GPIO(MX31_PIN_SFS6));
++}
++#endif
+-static int pcm970_sdhc1_init(struct device *dev, irq_handler_t h, void *data)
++#define SDHC1_GPIO_WP IOMUX_TO_GPIO(MX31_PIN_SFS6)
++#define SDHC1_GPIO_DET        IOMUX_TO_GPIO(MX31_PIN_SCK6)
++
++static int pcm970_sdhc1_init(struct device *dev, irq_handler_t detect_irq,
++              void *data)
+ {
+-      return mxc_iomux_setup_multiple_pins(sdhc1_pins, ARRAY_SIZE(sdhc1_pins),
+-                              "sdhc-1");
++      int ret;
++
++      ret = gpio_request(SDHC1_GPIO_DET, "sdhc-detect");
++      if (ret)
++              return ret;
++
++      gpio_direction_input(SDHC1_GPIO_DET);
++
++#ifdef PCM970_SDHC_RW_SWITCH
++      ret = gpio_request(SDHC1_GPIO_WP, "sdhc-wp");
++      if (ret)
++              goto err_gpio_free;
++      gpio_direction_input(SDHC1_GPIO_WP);
++#endif
++
++      ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_SCK6), detect_irq,
++                      IRQF_DISABLED | IRQF_TRIGGER_FALLING,
++                              "sdhc-detect", data);
++      if (ret)
++              goto err_gpio_free_2;
++
++      return 0;
++
++err_gpio_free_2:
++#ifdef PCM970_SDHC_RW_SWITCH
++      gpio_free(SDHC1_GPIO_WP);
++err_gpio_free:
++#endif
++      gpio_free(SDHC1_GPIO_DET);
++
++      return ret;
+ }
+ static void pcm970_sdhc1_exit(struct device *dev, void *data)
+ {
+-      mxc_iomux_release_multiple_pins(sdhc1_pins, ARRAY_SIZE(sdhc1_pins));
++      free_irq(IOMUX_TO_IRQ(MX31_PIN_SCK6), data);
++      gpio_free(SDHC1_GPIO_DET);
++      gpio_free(SDHC1_GPIO_WP);
+ }
+-/* No card and rw detection at the moment */
+ static struct imxmmc_platform_data sdhc_pdata = {
++#ifdef PCM970_SDHC_RW_SWITCH
++      .get_ro = pcm970_sdhc1_get_ro,
++#endif
+       .init = pcm970_sdhc1_init,
+       .exit = pcm970_sdhc1_exit,
+ };
+ static struct platform_device *devices[] __initdata = {
+       &pcm037_flash,
+-      &pcm037_eth,
+       &pcm037_sram_device,
+ };
+-static int uart0_pins[] = {
+-      MX31_PIN_CTS1__CTS1,
+-      MX31_PIN_RTS1__RTS1,
+-      MX31_PIN_TXD1__TXD1,
+-      MX31_PIN_RXD1__RXD1
++static struct ipu_platform_data mx3_ipu_data = {
++      .irq_base = MXC_IPU_IRQ_START,
+ };
+-static int uart2_pins[] = {
+-      MX31_PIN_CSPI3_MOSI__RXD3,
+-      MX31_PIN_CSPI3_MISO__TXD3
++static const struct fb_videomode fb_modedb[] = {
++      {
++              /* 240x320 @ 60 Hz Sharp */
++              .name           = "Sharp-LQ035Q7DH06-QVGA",
++              .refresh        = 60,
++              .xres           = 240,
++              .yres           = 320,
++              .pixclock       = 185925,
++              .left_margin    = 9,
++              .right_margin   = 16,
++              .upper_margin   = 7,
++              .lower_margin   = 9,
++              .hsync_len      = 1,
++              .vsync_len      = 1,
++              .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_SHARP_MODE |
++                                FB_SYNC_CLK_INVERT | FB_SYNC_CLK_IDLE_EN,
++              .vmode          = FB_VMODE_NONINTERLACED,
++              .flag           = 0,
++      }, {
++              /* 240x320 @ 60 Hz */
++              .name           = "TX090",
++              .refresh        = 60,
++              .xres           = 240,
++              .yres           = 320,
++              .pixclock       = 38255,
++              .left_margin    = 144,
++              .right_margin   = 0,
++              .upper_margin   = 7,
++              .lower_margin   = 40,
++              .hsync_len      = 96,
++              .vsync_len      = 1,
++              .sync           = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_OE_ACT_HIGH,
++              .vmode          = FB_VMODE_NONINTERLACED,
++              .flag           = 0,
++      },
++};
++
++static struct mx3fb_platform_data mx3fb_pdata = {
++      .dma_dev        = &mx3_ipu.dev,
++      .name           = "Sharp-LQ035Q7DH06-QVGA",
++      .mode           = fb_modedb,
++      .num_modes      = ARRAY_SIZE(fb_modedb),
+ };
+ /*
+@@ -215,21 +392,28 @@ static int uart2_pins[] = {
+  */
+ static void __init mxc_board_init(void)
+ {
++      int ret;
++
++      mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins),
++                      "pcm037");
++
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+-      mxc_iomux_setup_multiple_pins(uart0_pins, ARRAY_SIZE(uart0_pins), "uart-0");
+       mxc_register_device(&mxc_uart_device0, &uart_pdata);
+-
+-      mxc_iomux_setup_multiple_pins(uart2_pins, ARRAY_SIZE(uart2_pins), "uart-2");
++      mxc_register_device(&mxc_uart_device1, &uart_pdata);
+       mxc_register_device(&mxc_uart_device2, &uart_pdata);
+-      mxc_iomux_setup_pin(MX31_PIN_BATT_LINE__OWIRE, "batt-0wire");
+       mxc_register_device(&mxc_w1_master_device, NULL);
+       /* LAN9217 IRQ pin */
+-      if (!mxc_iomux_setup_pin(IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO),
+-                              "pcm037-eth"))
++      ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1), "lan9217-irq");
++      if (ret)
++              pr_warning("could not get LAN irq gpio\n");
++      else {
+               gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1));
++              platform_device_register(&pcm037_eth);
++      }
++
+ #ifdef CONFIG_I2C_IMX
+       i2c_register_board_info(1, pcm037_i2c_devices,
+@@ -239,6 +423,10 @@ static void __init mxc_board_init(void)
+ #endif
+       mxc_register_device(&mxc_nand_device, &pcm037_nand_board_info);
+       mxc_register_device(&mxcsdhc_device0, &sdhc_pdata);
++      mxc_register_device(&mx3_ipu, &mx3_ipu_data);
++      mxc_register_device(&mx3_fb, &mx3fb_pdata);
++      if (!gpio_usbotg_hs_activate())
++              mxc_register_device(&mxc_otg_udc_device, &usb_pdata);
+ }
+ static void __init pcm037_timer_init(void)
+@@ -255,7 +443,7 @@ MACHINE_START(PCM037, "Phytec Phycore pc
+       .phys_io        = AIPS1_BASE_ADDR,
+       .io_pg_offst    = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx31_map_io,
+       .init_irq       = mxc_init_irq,
+       .init_machine   = mxc_board_init,
+       .timer          = &pcm037_timer,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/pcm043.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/pcm043.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/pcm043.c        1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/pcm043.c    2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,252 @@
++/*
++ *  Copyright (C) 2009 Sascha Hauer, Pengutronix
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <linux/types.h>
++#include <linux/init.h>
++
++#include <linux/platform_device.h>
++#include <linux/mtd/physmap.h>
++#include <linux/mtd/plat-ram.h>
++#include <linux/memory.h>
++#include <linux/gpio.h>
++#include <linux/smc911x.h>
++#include <linux/interrupt.h>
++#include <linux/i2c.h>
++#include <linux/i2c/at24.h>
++
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++#include <asm/mach/map.h>
++
++#include <mach/hardware.h>
++#include <mach/common.h>
++#include <mach/imx-uart.h>
++#if defined CONFIG_I2C_IMX || defined CONFIG_I2C_IMX_MODULE
++#include <mach/i2c.h>
++#endif
++#include <mach/iomux-mx35.h>
++#include <mach/ipu.h>
++#include <mach/mx3fb.h>
++
++#include "devices.h"
++
++static const struct fb_videomode fb_modedb[] = {
++      {
++              /* 240x320 @ 60 Hz */
++              .name           = "Sharp-LQ035Q7",
++              .refresh        = 60,
++              .xres           = 240,
++              .yres           = 320,
++              .pixclock       = 185925,
++              .left_margin    = 9,
++              .right_margin   = 16,
++              .upper_margin   = 7,
++              .lower_margin   = 9,
++              .hsync_len      = 1,
++              .vsync_len      = 1,
++              .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_SHARP_MODE | FB_SYNC_CLK_INVERT | FB_SYNC_CLK_IDLE_EN,
++              .vmode          = FB_VMODE_NONINTERLACED,
++              .flag           = 0,
++      }, {
++              /* 240x320 @ 60 Hz */
++              .name           = "TX090",
++              .refresh        = 60,
++              .xres           = 240,
++              .yres           = 320,
++              .pixclock       = 38255,
++              .left_margin    = 144,
++              .right_margin   = 0,
++              .upper_margin   = 7,
++              .lower_margin   = 40,
++              .hsync_len      = 96,
++              .vsync_len      = 1,
++              .sync           = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_OE_ACT_HIGH,
++              .vmode          = FB_VMODE_NONINTERLACED,
++              .flag           = 0,
++      },
++};
++
++static struct ipu_platform_data mx3_ipu_data = {
++      .irq_base = MXC_IPU_IRQ_START,
++};
++
++static struct mx3fb_platform_data mx3fb_pdata = {
++      .dma_dev        = &mx3_ipu.dev,
++      .name           = "Sharp-LQ035Q7",
++      .mode           = fb_modedb,
++      .num_modes      = ARRAY_SIZE(fb_modedb),
++};
++
++static struct physmap_flash_data pcm043_flash_data = {
++      .width  = 2,
++};
++
++static struct resource pcm043_flash_resource = {
++      .start  = 0xa0000000,
++      .end    = 0xa1ffffff,
++      .flags  = IORESOURCE_MEM,
++};
++
++static struct platform_device pcm043_flash = {
++      .name   = "physmap-flash",
++      .id     = 0,
++      .dev    = {
++              .platform_data  = &pcm043_flash_data,
++      },
++      .resource = &pcm043_flash_resource,
++      .num_resources = 1,
++};
++
++static struct imxuart_platform_data uart_pdata = {
++      .flags = IMXUART_HAVE_RTSCTS,
++};
++
++#if defined CONFIG_I2C_IMX || defined CONFIG_I2C_IMX_MODULE
++static struct imxi2c_platform_data pcm043_i2c_1_data = {
++      .bitrate = 50000,
++};
++
++static struct at24_platform_data board_eeprom = {
++      .byte_len = 4096,
++      .page_size = 32,
++      .flags = AT24_FLAG_ADDR16,
++};
++
++static struct i2c_board_info pcm043_i2c_devices[] = {
++       {
++              I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
++              .platform_data = &board_eeprom,
++      }, {
++              I2C_BOARD_INFO("rtc-pcf8563", 0x51),
++              .type = "pcf8563",
++      }
++};
++#endif
++
++static struct platform_device *devices[] __initdata = {
++      &pcm043_flash,
++      &mxc_fec_device,
++};
++
++static struct pad_desc pcm043_pads[] = {
++      /* UART1 */
++      MX35_PAD_CTS1__UART1_CTS,
++      MX35_PAD_RTS1__UART1_RTS,
++      MX35_PAD_TXD1__UART1_TXD_MUX,
++      MX35_PAD_RXD1__UART1_RXD_MUX,
++      /* UART2 */
++      MX35_PAD_CTS2__UART2_CTS,
++      MX35_PAD_RTS2__UART2_RTS,
++      MX35_PAD_TXD2__UART2_TXD_MUX,
++      MX35_PAD_RXD2__UART2_RXD_MUX,
++      /* FEC */
++      MX35_PAD_FEC_TX_CLK__FEC_TX_CLK,
++      MX35_PAD_FEC_RX_CLK__FEC_RX_CLK,
++      MX35_PAD_FEC_RX_DV__FEC_RX_DV,
++      MX35_PAD_FEC_COL__FEC_COL,
++      MX35_PAD_FEC_RDATA0__FEC_RDATA_0,
++      MX35_PAD_FEC_TDATA0__FEC_TDATA_0,
++      MX35_PAD_FEC_TX_EN__FEC_TX_EN,
++      MX35_PAD_FEC_MDC__FEC_MDC,
++      MX35_PAD_FEC_MDIO__FEC_MDIO,
++      MX35_PAD_FEC_TX_ERR__FEC_TX_ERR,
++      MX35_PAD_FEC_RX_ERR__FEC_RX_ERR,
++      MX35_PAD_FEC_CRS__FEC_CRS,
++      MX35_PAD_FEC_RDATA1__FEC_RDATA_1,
++      MX35_PAD_FEC_TDATA1__FEC_TDATA_1,
++      MX35_PAD_FEC_RDATA2__FEC_RDATA_2,
++      MX35_PAD_FEC_TDATA2__FEC_TDATA_2,
++      MX35_PAD_FEC_RDATA3__FEC_RDATA_3,
++      MX35_PAD_FEC_TDATA3__FEC_TDATA_3,
++      /* I2C1 */
++      MX35_PAD_I2C1_CLK__I2C1_SCL,
++      MX35_PAD_I2C1_DAT__I2C1_SDA,
++      /* Display */
++      MX35_PAD_LD0__IPU_DISPB_DAT_0,
++      MX35_PAD_LD1__IPU_DISPB_DAT_1,
++      MX35_PAD_LD2__IPU_DISPB_DAT_2,
++      MX35_PAD_LD3__IPU_DISPB_DAT_3,
++      MX35_PAD_LD4__IPU_DISPB_DAT_4,
++      MX35_PAD_LD5__IPU_DISPB_DAT_5,
++      MX35_PAD_LD6__IPU_DISPB_DAT_6,
++      MX35_PAD_LD7__IPU_DISPB_DAT_7,
++      MX35_PAD_LD8__IPU_DISPB_DAT_8,
++      MX35_PAD_LD9__IPU_DISPB_DAT_9,
++      MX35_PAD_LD10__IPU_DISPB_DAT_10,
++      MX35_PAD_LD11__IPU_DISPB_DAT_11,
++      MX35_PAD_LD12__IPU_DISPB_DAT_12,
++      MX35_PAD_LD13__IPU_DISPB_DAT_13,
++      MX35_PAD_LD14__IPU_DISPB_DAT_14,
++      MX35_PAD_LD15__IPU_DISPB_DAT_15,
++      MX35_PAD_LD16__IPU_DISPB_DAT_16,
++      MX35_PAD_LD17__IPU_DISPB_DAT_17,
++      MX35_PAD_D3_HSYNC__IPU_DISPB_D3_HSYNC,
++      MX35_PAD_D3_FPSHIFT__IPU_DISPB_D3_CLK,
++      MX35_PAD_D3_DRDY__IPU_DISPB_D3_DRDY,
++      MX35_PAD_CONTRAST__IPU_DISPB_CONTR,
++      MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC,
++      MX35_PAD_D3_REV__IPU_DISPB_D3_REV,
++      MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS,
++      MX35_PAD_D3_SPL__IPU_DISPB_D3_SPL
++};
++
++/*
++ * Board specific initialization.
++ */
++static void __init mxc_board_init(void)
++{
++      mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads));
++
++      platform_add_devices(devices, ARRAY_SIZE(devices));
++
++      mxc_register_device(&mxc_uart_device0, &uart_pdata);
++
++      mxc_register_device(&mxc_uart_device1, &uart_pdata);
++
++#if defined CONFIG_I2C_IMX || defined CONFIG_I2C_IMX_MODULE
++      i2c_register_board_info(0, pcm043_i2c_devices,
++                      ARRAY_SIZE(pcm043_i2c_devices));
++
++      mxc_register_device(&mxc_i2c_device0, &pcm043_i2c_1_data);
++#endif
++
++      mxc_register_device(&mx3_ipu, &mx3_ipu_data);
++      mxc_register_device(&mx3_fb, &mx3fb_pdata);
++}
++
++static void __init pcm043_timer_init(void)
++{
++      mx35_clocks_init();
++}
++
++struct sys_timer pcm043_timer = {
++      .init   = pcm043_timer_init,
++};
++
++MACHINE_START(PCM043, "Phytec Phycore pcm043")
++      /* Maintainer: Pengutronix */
++      .phys_io        = AIPS1_BASE_ADDR,
++      .io_pg_offst    = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
++      .boot_params    = PHYS_OFFSET + 0x100,
++      .map_io         = mx35_map_io,
++      .init_irq       = mxc_init_irq,
++      .init_machine   = mxc_board_init,
++      .timer          = &pcm043_timer,
++MACHINE_END
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-mx3/qong.c linux-2.6.30-rc4-git/arch/arm/mach-mx3/qong.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/qong.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-mx3/qong.c      2009-05-13 09:46:19.000000000 +0200
+@@ -279,7 +279,7 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-L
+       .phys_io        = AIPS1_BASE_ADDR,
+       .io_pg_offst    = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x100,
+-      .map_io         = mxc_map_io,
++      .map_io         = mx31_map_io,
+       .init_irq       = mxc_init_irq,
+       .init_machine   = mxc_board_init,
+       .timer          = &qong_timer,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap1/board-h2-mmc.c linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h2-mmc.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap1/board-h2-mmc.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h2-mmc.c    2009-05-13 09:46:19.000000000 +0200
+@@ -26,19 +26,13 @@
+ static int mmc_set_power(struct device *dev, int slot, int power_on,
+                               int vdd)
+ {
+-      if (power_on)
+-              gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 1);
+-      else
+-              gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);
+-
++      gpio_set_value(H2_TPS_GPIO_MMC_PWR_EN, power_on);
+       return 0;
+ }
+ static int mmc_late_init(struct device *dev)
+ {
+-      int ret;
+-
+-      ret = gpio_request(H2_TPS_GPIO_MMC_PWR_EN, "MMC power");
++      int ret = gpio_request(H2_TPS_GPIO_MMC_PWR_EN, "MMC power");
+       if (ret < 0)
+               return ret;
+@@ -47,7 +41,7 @@ static int mmc_late_init(struct device *
+       return ret;
+ }
+-static void mmc_shutdown(struct device *dev)
++static void mmc_cleanup(struct device *dev)
+ {
+       gpio_free(H2_TPS_GPIO_MMC_PWR_EN);
+ }
+@@ -60,7 +54,7 @@ static void mmc_shutdown(struct device *
+ static struct omap_mmc_platform_data mmc1_data = {
+       .nr_slots                       = 1,
+       .init                           = mmc_late_init,
+-      .shutdown                       = mmc_shutdown,
++      .cleanup                        = mmc_cleanup,
+       .dma_mask                       = 0xffffffff,
+       .slots[0]       = {
+               .set_power              = mmc_set_power,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap1/board-h3.c linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h3.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap1/board-h3.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h3.c        2009-05-13 09:46:19.000000000 +0200
+@@ -39,12 +39,10 @@
+ #include <asm/mach/flash.h>
+ #include <asm/mach/map.h>
+-#include <mach/gpioexpander.h>
+ #include <mach/irqs.h>
+ #include <mach/mux.h>
+ #include <mach/tc.h>
+ #include <mach/nand.h>
+-#include <mach/irda.h>
+ #include <mach/usb.h>
+ #include <mach/keypad.h>
+ #include <mach/dma.h>
+@@ -276,104 +274,6 @@ static struct platform_device h3_kp_devi
+       .resource       = h3_kp_resources,
+ };
+-
+-/* Select between the IrDA and aGPS module
+- */
+-static int h3_select_irda(struct device *dev, int state)
+-{
+-      unsigned char expa;
+-      int err = 0;
+-
+-      if ((err = read_gpio_expa(&expa, 0x26))) {
+-              printk(KERN_ERR "Error reading from I/O EXPANDER \n");
+-              return err;
+-      }
+-
+-      /* 'P6' enable/disable IRDA_TX and IRDA_RX */
+-      if (state & IR_SEL) { /* IrDA */
+-              if ((err = write_gpio_expa(expa | 0x40, 0x26))) {
+-                      printk(KERN_ERR "Error writing to I/O EXPANDER \n");
+-                      return err;
+-              }
+-      } else {
+-              if ((err = write_gpio_expa(expa & ~0x40, 0x26))) {
+-                      printk(KERN_ERR "Error writing to I/O EXPANDER \n");
+-                      return err;
+-              }
+-      }
+-      return err;
+-}
+-
+-static void set_trans_mode(struct work_struct *work)
+-{
+-      struct omap_irda_config *irda_config =
+-              container_of(work, struct omap_irda_config, gpio_expa.work);
+-      int mode = irda_config->mode;
+-      unsigned char expa;
+-      int err = 0;
+-
+-      if ((err = read_gpio_expa(&expa, 0x27)) != 0) {
+-              printk(KERN_ERR "Error reading from I/O expander\n");
+-      }
+-
+-      expa &= ~0x03;
+-
+-      if (mode & IR_SIRMODE) {
+-              expa |= 0x01;
+-      } else { /* MIR/FIR */
+-              expa |= 0x03;
+-      }
+-
+-      if ((err = write_gpio_expa(expa, 0x27)) != 0) {
+-              printk(KERN_ERR "Error writing to I/O expander\n");
+-      }
+-}
+-
+-static int h3_transceiver_mode(struct device *dev, int mode)
+-{
+-      struct omap_irda_config *irda_config = dev->platform_data;
+-
+-      irda_config->mode = mode;
+-      cancel_delayed_work(&irda_config->gpio_expa);
+-      PREPARE_DELAYED_WORK(&irda_config->gpio_expa, set_trans_mode);
+-      schedule_delayed_work(&irda_config->gpio_expa, 0);
+-
+-      return 0;
+-}
+-
+-static struct omap_irda_config h3_irda_data = {
+-      .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
+-      .transceiver_mode       = h3_transceiver_mode,
+-      .select_irda            = h3_select_irda,
+-      .rx_channel             = OMAP_DMA_UART3_RX,
+-      .tx_channel             = OMAP_DMA_UART3_TX,
+-      .dest_start             = UART3_THR,
+-      .src_start              = UART3_RHR,
+-      .tx_trigger             = 0,
+-      .rx_trigger             = 0,
+-};
+-
+-static struct resource h3_irda_resources[] = {
+-      [0] = {
+-              .start  = INT_UART3,
+-              .end    = INT_UART3,
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static u64 irda_dmamask = 0xffffffff;
+-
+-static struct platform_device h3_irda_device = {
+-      .name           = "omapirda",
+-      .id             = 0,
+-      .dev            = {
+-              .platform_data  = &h3_irda_data,
+-              .dma_mask       = &irda_dmamask,
+-      },
+-      .num_resources  = ARRAY_SIZE(h3_irda_resources),
+-      .resource       = h3_irda_resources,
+-};
+-
+ static struct platform_device h3_lcd_device = {
+       .name           = "lcd_h3",
+       .id             = -1,
+@@ -395,7 +295,6 @@ static struct platform_device *devices[]
+       &nand_device,
+         &smc91x_device,
+       &intlat_device,
+-      &h3_irda_device,
+       &h3_kp_device,
+       &h3_lcd_device,
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap1/board-h3-mmc.c linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h3-mmc.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap1/board-h3-mmc.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-h3-mmc.c    2009-05-13 09:46:19.000000000 +0200
+@@ -26,11 +26,7 @@
+ static int mmc_set_power(struct device *dev, int slot, int power_on,
+                               int vdd)
+ {
+-      if (power_on)
+-              gpio_direction_output(H3_TPS_GPIO_MMC_PWR_EN, 1);
+-      else
+-              gpio_direction_output(H3_TPS_GPIO_MMC_PWR_EN, 0);
+-
++      gpio_set_value(H3_TPS_GPIO_MMC_PWR_EN, power_on);
+       return 0;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap1/board-nokia770.c linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-nokia770.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap1/board-nokia770.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap1/board-nokia770.c  2009-05-13 09:46:19.000000000 +0200
+@@ -181,11 +181,7 @@ static struct omap_usb_config nokia770_u
+ static int nokia770_mmc_set_power(struct device *dev, int slot, int power_on,
+                               int vdd)
+ {
+-      if (power_on)
+-              gpio_set_value(NOKIA770_GPIO_MMC_POWER, 1);
+-      else
+-              gpio_set_value(NOKIA770_GPIO_MMC_POWER, 0);
+-
++      gpio_set_value(NOKIA770_GPIO_MMC_POWER, power_on);
+       return 0;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap1/mcbsp.c linux-2.6.30-rc4-git/arch/arm/mach-omap1/mcbsp.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap1/mcbsp.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap1/mcbsp.c   2009-05-13 09:46:19.000000000 +0200
+@@ -40,8 +40,8 @@ static void omap1_mcbsp_request(unsigned
+        */
+       if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) {
+               if (dsp_use++ == 0) {
+-                      api_clk = clk_get(NULL, "api_clk");
+-                      dsp_clk = clk_get(NULL, "dsp_clk");
++                      api_clk = clk_get(NULL, "api_ck");
++                      dsp_clk = clk_get(NULL, "dsp_ck");
+                       if (!IS_ERR(api_clk) && !IS_ERR(dsp_clk)) {
+                               clk_enable(api_clk);
+                               clk_enable(dsp_clk);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/board-h4.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-h4.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/board-h4.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-h4.c        2009-05-13 09:46:19.000000000 +0200
+@@ -33,10 +33,8 @@
+ #include <mach/control.h>
+ #include <mach/gpio.h>
+-#include <mach/gpioexpander.h>
+ #include <mach/mux.h>
+ #include <mach/usb.h>
+-#include <mach/irda.h>
+ #include <mach/board.h>
+ #include <mach/common.h>
+ #include <mach/keypad.h>
+@@ -138,98 +136,6 @@ static struct platform_device h4_flash_d
+       .resource       = &h4_flash_resource,
+ };
+-/* Select between the IrDA and aGPS module
+- */
+-static int h4_select_irda(struct device *dev, int state)
+-{
+-      unsigned char expa;
+-      int err = 0;
+-
+-      if ((err = read_gpio_expa(&expa, 0x21))) {
+-              printk(KERN_ERR "Error reading from I/O expander\n");
+-              return err;
+-      }
+-
+-      /* 'P6' enable/disable IRDA_TX and IRDA_RX */
+-      if (state & IR_SEL) {   /* IrDa */
+-              if ((err = write_gpio_expa(expa | 0x01, 0x21))) {
+-                      printk(KERN_ERR "Error writing to I/O expander\n");
+-                      return err;
+-              }
+-      } else {
+-              if ((err = write_gpio_expa(expa & ~0x01, 0x21))) {
+-                      printk(KERN_ERR "Error writing to I/O expander\n");
+-                      return err;
+-              }
+-      }
+-      return err;
+-}
+-
+-static void set_trans_mode(struct work_struct *work)
+-{
+-      struct omap_irda_config *irda_config =
+-              container_of(work, struct omap_irda_config, gpio_expa.work);
+-      int mode = irda_config->mode;
+-      unsigned char expa;
+-      int err = 0;
+-
+-      if ((err = read_gpio_expa(&expa, 0x20)) != 0) {
+-              printk(KERN_ERR "Error reading from I/O expander\n");
+-      }
+-
+-      expa &= ~0x01;
+-
+-      if (!(mode & IR_SIRMODE)) { /* MIR/FIR */
+-              expa |= 0x01;
+-      }
+-
+-      if ((err = write_gpio_expa(expa, 0x20)) != 0) {
+-              printk(KERN_ERR "Error writing to I/O expander\n");
+-      }
+-}
+-
+-static int h4_transceiver_mode(struct device *dev, int mode)
+-{
+-      struct omap_irda_config *irda_config = dev->platform_data;
+-
+-      irda_config->mode = mode;
+-      cancel_delayed_work(&irda_config->gpio_expa);
+-      PREPARE_DELAYED_WORK(&irda_config->gpio_expa, set_trans_mode);
+-      schedule_delayed_work(&irda_config->gpio_expa, 0);
+-
+-      return 0;
+-}
+-
+-static struct omap_irda_config h4_irda_data = {
+-      .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
+-      .transceiver_mode       = h4_transceiver_mode,
+-      .select_irda            = h4_select_irda,
+-      .rx_channel             = OMAP24XX_DMA_UART3_RX,
+-      .tx_channel             = OMAP24XX_DMA_UART3_TX,
+-      .dest_start             = OMAP_UART3_BASE,
+-      .src_start              = OMAP_UART3_BASE,
+-      .tx_trigger             = OMAP24XX_DMA_UART3_TX,
+-      .rx_trigger             = OMAP24XX_DMA_UART3_RX,
+-};
+-
+-static struct resource h4_irda_resources[] = {
+-      [0] = {
+-              .start  = INT_24XX_UART3_IRQ,
+-              .end    = INT_24XX_UART3_IRQ,
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct platform_device h4_irda_device = {
+-      .name           = "omapirda",
+-      .id             = -1,
+-      .dev            = {
+-              .platform_data  = &h4_irda_data,
+-      },
+-      .num_resources  = 1,
+-      .resource       = h4_irda_resources,
+-};
+-
+ static struct omap_kp_platform_data h4_kp_data = {
+       .rows           = 6,
+       .cols           = 7,
+@@ -255,7 +161,6 @@ static struct platform_device h4_lcd_dev
+ static struct platform_device *h4_devices[] __initdata = {
+       &h4_flash_device,
+-      &h4_irda_device,
+       &h4_kp_device,
+       &h4_lcd_device,
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/board-omap3beagle.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-omap3beagle.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/board-omap3beagle.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-omap3beagle.c       2009-05-13 09:46:19.000000000 +0200
+@@ -42,6 +42,7 @@
+ #include <mach/nand.h>
+ #include <mach/mux.h>
+ #include <mach/usb.h>
++#include <mach/timer-gp.h>
+ #include "mmc-twl4030.h"
+@@ -186,6 +187,9 @@ static void __init omap3_beagle_init_irq
+ {
+       omap2_init_common_hw(NULL);
+       omap_init_irq();
++#ifdef CONFIG_OMAP_32K_TIMER
++      omap2_gp_clockevent_set_gptimer(12);
++#endif
+       omap_gpio_init();
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/board-rx51.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-rx51.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/board-rx51.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/board-rx51.c      2009-05-13 09:46:19.000000000 +0200
+@@ -15,7 +15,6 @@
+ #include <linux/err.h>
+ #include <linux/clk.h>
+ #include <linux/io.h>
+-#include <linux/delay.h>
+ #include <linux/gpio.h>
+ #include <mach/hardware.h>
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/clock24xx.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock24xx.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/clock24xx.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock24xx.c       2009-05-13 09:46:19.000000000 +0200
+@@ -60,12 +60,13 @@ struct omap_clk {
+               },                      \
+       }
+-#define CK_243X       (1 << 0)
+-#define CK_242X       (1 << 1)
++#define CK_243X                       RATE_IN_243X
++#define CK_242X                       RATE_IN_242X
+ static struct omap_clk omap24xx_clks[] = {
+       /* external root sources */
+       CLK(NULL,       "func_32k_ck",  &func_32k_ck,   CK_243X | CK_242X),
++      CLK(NULL,       "secure_32k_ck", &secure_32k_ck, CK_243X | CK_242X),
+       CLK(NULL,       "osc_ck",       &osc_ck,        CK_243X | CK_242X),
+       CLK(NULL,       "sys_ck",       &sys_ck,        CK_243X | CK_242X),
+       CLK(NULL,       "alt_ck",       &alt_ck,        CK_243X | CK_242X),
+@@ -711,7 +712,7 @@ int __init omap2_clk_init(void)
+ {
+       struct prcm_config *prcm;
+       struct omap_clk *c;
+-      u32 clkrate, cpu_mask;
++      u32 clkrate;
+       if (cpu_is_omap242x())
+               cpu_mask = RATE_IN_242X;
+@@ -720,21 +721,15 @@ int __init omap2_clk_init(void)
+       clk_init(&omap2_clk_functions);
++      for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
++              clk_init_one(c->lk.clk);
++
+       osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
+       propagate_rate(&osc_ck);
+       sys_ck.rate = omap2_sys_clk_recalc(&sys_ck);
+       propagate_rate(&sys_ck);
+       for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
+-              clk_init_one(c->lk.clk);
+-
+-      cpu_mask = 0;
+-      if (cpu_is_omap2420())
+-              cpu_mask |= CK_242X;
+-      if (cpu_is_omap2430())
+-              cpu_mask |= CK_243X;
+-
+-      for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
+               if (c->cpu & cpu_mask) {
+                       clkdev_add(&c->lk);
+                       clk_register(c->lk.clk);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/clock24xx.h linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock24xx.h
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/clock24xx.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock24xx.h       2009-05-13 09:46:19.000000000 +0200
+@@ -625,6 +625,14 @@ static struct clk func_32k_ck = {
+       .clkdm_name     = "wkup_clkdm",
+ };
++static struct clk secure_32k_ck = {
++      .name           = "secure_32k_ck",
++      .ops            = &clkops_null,
++      .rate           = 32768,
++      .flags          = RATE_FIXED,
++      .clkdm_name     = "wkup_clkdm",
++};
++
+ /* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
+ static struct clk osc_ck = {          /* (*12, *13, 19.2, *26, 38.4)MHz */
+       .name           = "osc_ck",
+@@ -1790,7 +1798,7 @@ static struct clk gpt12_ick = {
+ static struct clk gpt12_fck = {
+       .name           = "gpt12_fck",
+       .ops            = &clkops_omap2_dflt_wait,
+-      .parent         = &func_32k_ck,
++      .parent         = &secure_32k_ck,
+       .clkdm_name     = "core_l4_clkdm",
+       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
+       .enable_bit     = OMAP24XX_EN_GPT12_SHIFT,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/clock34xx.h linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock34xx.h
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/clock34xx.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/clock34xx.h       2009-05-13 09:46:19.000000000 +0200
+@@ -2052,7 +2052,7 @@ static struct clk dss_ick = {
+ static struct clk cam_mclk = {
+       .name           = "cam_mclk",
+-      .ops            = &clkops_omap2_dflt_wait,
++      .ops            = &clkops_omap2_dflt,
+       .parent         = &dpll4_m5x2_ck,
+       .enable_reg     = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
+       .enable_bit     = OMAP3430_EN_CAM_SHIFT,
+@@ -2063,7 +2063,7 @@ static struct clk cam_mclk = {
+ static struct clk cam_ick = {
+       /* Handles both L3 and L4 clocks */
+       .name           = "cam_ick",
+-      .ops            = &clkops_omap2_dflt_wait,
++      .ops            = &clkops_omap2_dflt,
+       .parent         = &l4_ick,
+       .init           = &omap2_init_clk_clkdm,
+       .enable_reg     = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN),
+@@ -2074,7 +2074,7 @@ static struct clk cam_ick = {
+ static struct clk csi2_96m_fck = {
+       .name           = "csi2_96m_fck",
+-      .ops            = &clkops_omap2_dflt_wait,
++      .ops            = &clkops_omap2_dflt,
+       .parent         = &core_96m_fck,
+       .init           = &omap2_init_clk_clkdm,
+       .enable_reg     = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
+@@ -2901,7 +2901,6 @@ static struct clk sr_l4_ick = {
+ /* SECURE_32K_FCK clocks */
+-/* XXX This clock no longer exists in 3430 TRM rev F */
+ static struct clk gpt12_fck = {
+       .name           = "gpt12_fck",
+       .ops            = &clkops_null,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/devices.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/devices.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/devices.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/devices.c 2009-05-13 09:46:19.000000000 +0200
+@@ -25,7 +25,6 @@
+ #include <mach/board.h>
+ #include <mach/mux.h>
+ #include <mach/gpio.h>
+-#include <mach/eac.h>
+ #include <mach/mmc.h>
+ #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
+@@ -366,38 +365,6 @@ static void omap_init_mcspi(void)
+ static inline void omap_init_mcspi(void) {}
+ #endif
+-#ifdef CONFIG_SND_OMAP24XX_EAC
+-
+-#define OMAP2_EAC_BASE                        0x48090000
+-
+-static struct resource omap2_eac_resources[] = {
+-      {
+-              .start          = OMAP2_EAC_BASE,
+-              .end            = OMAP2_EAC_BASE + 0x109,
+-              .flags          = IORESOURCE_MEM,
+-      },
+-};
+-
+-static struct platform_device omap2_eac_device = {
+-      .name           = "omap24xx-eac",
+-      .id             = -1,
+-      .num_resources  = ARRAY_SIZE(omap2_eac_resources),
+-      .resource       = omap2_eac_resources,
+-      .dev = {
+-              .platform_data = NULL,
+-      },
+-};
+-
+-void omap_init_eac(struct eac_platform_data *pdata)
+-{
+-      omap2_eac_device.dev.platform_data = pdata;
+-      platform_device_register(&omap2_eac_device);
+-}
+-
+-#else
+-void omap_init_eac(struct eac_platform_data *pdata) {}
+-#endif
+-
+ #ifdef CONFIG_OMAP_SHA1_MD5
+ static struct resource sha1_md5_resources[] = {
+       {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/irq.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/irq.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/irq.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/irq.c     2009-05-13 09:46:19.000000000 +0200
+@@ -73,9 +73,9 @@ static int omap_check_spurious(unsigned 
+       u32 sir, spurious;
+       sir = intc_bank_read_reg(&irq_banks[0], INTC_SIR);
+-      spurious = sir >> 6;
++      spurious = sir >> 7;
+-      if (spurious > 1) {
++      if (spurious) {
+               printk(KERN_WARNING "Spurious irq %i: 0x%08x, please flush "
+                                       "posted write for irq %i\n",
+                                       irq, sir, previous_irq);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/timer-gp.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/timer-gp.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/timer-gp.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/timer-gp.c        2009-05-13 09:46:19.000000000 +0200
+@@ -3,6 +3,8 @@
+  *
+  * OMAP2 GP timer support.
+  *
++ * Copyright (C) 2009 Nokia Corporation
++ *
+  * Update to use new clocksource/clockevent layers
+  * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
+  * Copyright (C) 2007 MontaVista Software, Inc.
+@@ -36,8 +38,13 @@
+ #include <asm/mach/time.h>
+ #include <mach/dmtimer.h>
++/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
++#define MAX_GPTIMER_ID                12
++
+ static struct omap_dm_timer *gptimer;
+ static struct clock_event_device clockevent_gpt;
++static u8 __initdata gptimer_id = 1;
++static u8 __initdata inited;
+ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
+ {
+@@ -95,20 +102,53 @@ static struct clock_event_device clockev
+       .set_mode       = omap2_gp_timer_set_mode,
+ };
++/**
++ * omap2_gp_clockevent_set_gptimer - set which GPTIMER is used for clockevents
++ * @id: GPTIMER to use (1..MAX_GPTIMER_ID)
++ *
++ * Define the GPTIMER that the system should use for the tick timer.
++ * Meant to be called from board-*.c files in the event that GPTIMER1, the
++ * default, is unsuitable.  Returns -EINVAL on error or 0 on success.
++ */
++int __init omap2_gp_clockevent_set_gptimer(u8 id)
++{
++      if (id < 1 || id > MAX_GPTIMER_ID)
++              return -EINVAL;
++
++      BUG_ON(inited);
++
++      gptimer_id = id;
++
++      return 0;
++}
++
+ static void __init omap2_gp_clockevent_init(void)
+ {
+       u32 tick_rate;
++      int src;
+-      gptimer = omap_dm_timer_request_specific(1);
++      inited = 1;
++
++      gptimer = omap_dm_timer_request_specific(gptimer_id);
+       BUG_ON(gptimer == NULL);
+ #if defined(CONFIG_OMAP_32K_TIMER)
+-      omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
++      src = OMAP_TIMER_SRC_32_KHZ;
+ #else
+-      omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK);
++      src = OMAP_TIMER_SRC_SYS_CLK;
++      WARN(gptimer_id == 12, "WARNING: GPTIMER12 can only use the "
++           "secure 32KiHz clock source\n");
+ #endif
++
++      if (gptimer_id != 12)
++              WARN(IS_ERR_VALUE(omap_dm_timer_set_source(gptimer, src)),
++                   "timer-gp: omap_dm_timer_set_source() failed\n");
++
+       tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer));
++      pr_info("OMAP clockevent source: GPTIMER%d at %u Hz\n",
++              gptimer_id, tick_rate);
++
+       omap2_gp_timer_irq.dev_id = (void *)gptimer;
+       setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq);
+       omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
+@@ -125,6 +165,8 @@ static void __init omap2_gp_clockevent_i
+       clockevents_register_device(&clockevent_gpt);
+ }
++/* Clocksource code */
++
+ #ifdef CONFIG_OMAP_32K_TIMER
+ /* 
+  * When 32k-timer is enabled, don't use GPTimer for clocksource
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-omap2/usb-tusb6010.c linux-2.6.30-rc4-git/arch/arm/mach-omap2/usb-tusb6010.c
+--- linux-2.6.30-rc4/arch/arm/mach-omap2/usb-tusb6010.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-omap2/usb-tusb6010.c    2009-05-13 09:46:19.000000000 +0200
+@@ -187,7 +187,7 @@ int tusb6010_platform_retime(unsigned is
+       unsigned        sysclk_ps;
+       int             status;
+-      if (!refclk_psec)
++      if (!refclk_psec || sysclk_ps == 0)
+               return -ENODEV;
+       sysclk_ps = is_refclk ? refclk_psec : TUSB6010_OSCCLK_60;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-pxa/corgi.c linux-2.6.30-rc4-git/arch/arm/mach-pxa/corgi.c
+--- linux-2.6.30-rc4/arch/arm/mach-pxa/corgi.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-pxa/corgi.c     2009-05-13 09:46:19.000000000 +0200
+@@ -427,12 +427,22 @@ static struct pxa2xx_spi_master corgi_sp
+       .num_chipselect = 3,
+ };
++static void corgi_wait_for_hsync(void)
++{
++      while (gpio_get_value(CORGI_GPIO_HSYNC))
++              cpu_relax();
++
++      while (!gpio_get_value(CORGI_GPIO_HSYNC))
++              cpu_relax();
++}
++
+ static struct ads7846_platform_data corgi_ads7846_info = {
+       .model                  = 7846,
+       .vref_delay_usecs       = 100,
+       .x_plate_ohms           = 419,
+       .y_plate_ohms           = 486,
+       .gpio_pendown           = CORGI_GPIO_TP_INT,
++      .wait_for_sync          = corgi_wait_for_hsync,
+ };
+ static void corgi_ads7846_cs(u32 command)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-pxa/littleton.c linux-2.6.30-rc4-git/arch/arm/mach-pxa/littleton.c
+--- linux-2.6.30-rc4/arch/arm/mach-pxa/littleton.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-pxa/littleton.c 2009-05-13 09:46:19.000000000 +0200
+@@ -334,6 +334,11 @@ static struct led_info littleton_da9034_
+       },
+ };
++static struct da9034_touch_pdata littleton_da9034_touch = {
++      .x_inverted     = 1,
++      .interval_ms    = 20,
++};
++
+ static struct da903x_subdev_info littleton_da9034_subdevs[] = {
+       {
+               .name           = "da903x-led",
+@@ -350,6 +355,10 @@ static struct da903x_subdev_info littlet
+       }, {
+               .name           = "da903x-backlight",
+               .id             = DA9034_ID_WLED,
++      }, {
++              .name           = "da9034-touch",
++              .id             = DA9034_ID_TOUCH,
++              .platform_data  = &littleton_da9034_touch,
+       },
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-pxa/spitz.c linux-2.6.30-rc4-git/arch/arm/mach-pxa/spitz.c
+--- linux-2.6.30-rc4/arch/arm/mach-pxa/spitz.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-pxa/spitz.c     2009-05-13 09:46:19.000000000 +0200
+@@ -299,12 +299,22 @@ static struct pxa2xx_spi_master spitz_sp
+       .num_chipselect = 3,
+ };
++static void spitz_wait_for_hsync(void)
++{
++      while (gpio_get_value(SPITZ_GPIO_HSYNC))
++              cpu_relax();
++
++      while (!gpio_get_value(SPITZ_GPIO_HSYNC))
++              cpu_relax();
++}
++
+ static struct ads7846_platform_data spitz_ads7846_info = {
+       .model                  = 7846,
+       .vref_delay_usecs       = 100,
+       .x_plate_ohms           = 419,
+       .y_plate_ohms           = 486,
+       .gpio_pendown           = SPITZ_GPIO_TP_INT,
++      .wait_for_sync          = spitz_wait_for_hsync,
+ };
+ static void spitz_ads7846_cs(u32 command)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-pxa/zylonite_pxa300.c linux-2.6.30-rc4-git/arch/arm/mach-pxa/zylonite_pxa300.c
+--- linux-2.6.30-rc4/arch/arm/mach-pxa/zylonite_pxa300.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-pxa/zylonite_pxa300.c   2009-05-13 09:46:19.000000000 +0200
+@@ -72,6 +72,7 @@ static mfp_cfg_t common_mfp_cfg[] __init
+       GPIO25_AC97_SDATA_IN_0,
+       GPIO27_AC97_SDATA_OUT,
+       GPIO28_AC97_SYNC,
++      GPIO17_GPIO,    /* SDATA_IN_1 but unused - configure to GPIO */
+       /* SSP3 */
+       GPIO91_SSP3_SCLK,
+@@ -126,6 +127,10 @@ static mfp_cfg_t common_mfp_cfg[] __init
+       /* Standard I2C */
+       GPIO21_I2C_SCL,
+       GPIO22_I2C_SDA,
++
++      /* GPIO */
++      GPIO18_GPIO,    /* GPIO Expander #0 INT_N */
++      GPIO19_GPIO,    /* GPIO Expander #1 INT_N */
+ };
+ static mfp_cfg_t pxa300_mfp_cfg[] __initdata = {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-pxa/zylonite_pxa320.c linux-2.6.30-rc4-git/arch/arm/mach-pxa/zylonite_pxa320.c
+--- linux-2.6.30-rc4/arch/arm/mach-pxa/zylonite_pxa320.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-pxa/zylonite_pxa320.c   2009-05-13 09:46:19.000000000 +0200
+@@ -68,6 +68,7 @@ static mfp_cfg_t mfp_cfg[] __initdata = 
+       GPIO38_AC97_SYNC,
+       GPIO39_AC97_BITCLK,
+       GPIO40_AC97_nACRESET,
++      GPIO36_GPIO,    /* SDATA_IN_1 but unused - configure to GPIO */
+       /* SSP3 */
+       GPIO89_SSP3_SCLK,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mach-sa1100/lart.c linux-2.6.30-rc4-git/arch/arm/mach-sa1100/lart.c
+--- linux-2.6.30-rc4/arch/arm/mach-sa1100/lart.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mach-sa1100/lart.c   2009-05-13 09:46:19.000000000 +0200
+@@ -9,6 +9,7 @@
+ #include <mach/hardware.h>
+ #include <asm/setup.h>
+ #include <asm/mach-types.h>
++#include <asm/page.h>
+ #include <asm/mach/arch.h>
+ #include <asm/mach/map.h>
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/Makefile linux-2.6.30-rc4-git/arch/arm/Makefile
+--- linux-2.6.30-rc4/arch/arm/Makefile 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/Makefile     2009-05-13 09:46:19.000000000 +0200
+@@ -135,7 +135,6 @@ endif
+     plat-$(CONFIG_PLAT_S3C64XX)          := s3c64xx s3c
+  machine-$(CONFIG_ARCH_LH7A40X)          := lh7a40x
+  machine-$(CONFIG_ARCH_VERSATILE)  := versatile
+- machine-$(CONFIG_ARCH_IMX)      := imx
+  machine-$(CONFIG_ARCH_H720X)    := h720x
+  machine-$(CONFIG_ARCH_AAEC2000)   := aaec2000
+  machine-$(CONFIG_ARCH_REALVIEW)   := realview
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mm/cache-v6.S linux-2.6.30-rc4-git/arch/arm/mm/cache-v6.S
+--- linux-2.6.30-rc4/arch/arm/mm/cache-v6.S    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mm/cache-v6.S        2009-05-13 09:46:19.000000000 +0200
+@@ -20,6 +20,31 @@
+ #define D_CACHE_LINE_SIZE     32
+ #define BTB_FLUSH_SIZE                8
++#ifdef CONFIG_ARM_ERRATA_411920
++/*
++ * Invalidate the entire I cache (this code is a workaround for the ARM1136
++ * erratum 411920 - Invalidate Instruction Cache operation can fail. This
++ * erratum is present in 1136, 1156 and 1176. It does not affect the MPCore.
++ *
++ * Registers:
++ *   r0 - set to 0
++ *   r1 - corrupted
++ */
++ENTRY(v6_icache_inval_all)
++      mov     r0, #0
++      mrs     r1, cpsr
++      cpsid   ifa                             @ disable interrupts
++      mcr     p15, 0, r0, c7, c5, 0           @ invalidate entire I-cache
++      mcr     p15, 0, r0, c7, c5, 0           @ invalidate entire I-cache
++      mcr     p15, 0, r0, c7, c5, 0           @ invalidate entire I-cache
++      mcr     p15, 0, r0, c7, c5, 0           @ invalidate entire I-cache
++      msr     cpsr_cx, r1                     @ restore interrupts
++      .rept   11                              @ ARM Ltd recommends at least
++      nop                                     @ 11 NOPs
++      .endr
++      mov     pc, lr
++#endif
++
+ /*
+  *    v6_flush_cache_all()
+  *
+@@ -31,8 +56,12 @@ ENTRY(v6_flush_kern_cache_all)
+       mov     r0, #0
+ #ifdef HARVARD_CACHE
+       mcr     p15, 0, r0, c7, c14, 0          @ D cache clean+invalidate
++#ifndef CONFIG_ARM_ERRATA_411920
+       mcr     p15, 0, r0, c7, c5, 0           @ I+BTB cache invalidate
+ #else
++      b       v6_icache_inval_all
++#endif
++#else
+       mcr     p15, 0, r0, c7, c15, 0          @ Cache clean+invalidate
+ #endif
+       mov     pc, lr
+@@ -103,8 +132,12 @@ ENTRY(v6_coherent_user_range)
+       mov     r0, #0
+ #ifdef HARVARD_CACHE
+       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer
++#ifndef CONFIG_ARM_ERRATA_411920
+       mcr     p15, 0, r0, c7, c5, 0           @ I+BTB cache invalidate
+ #else
++      b       v6_icache_inval_all
++#endif
++#else
+       mcr     p15, 0, r0, c7, c5, 6           @ invalidate BTB
+ #endif
+       mov     pc, lr
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mm/flush.c linux-2.6.30-rc4-git/arch/arm/mm/flush.c
+--- linux-2.6.30-rc4/arch/arm/mm/flush.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mm/flush.c   2009-05-13 09:46:19.000000000 +0200
+@@ -18,6 +18,10 @@
+ #include "mm.h"
++#ifdef CONFIG_ARM_ERRATA_411920
++extern void v6_icache_inval_all(void);
++#endif
++
+ #ifdef CONFIG_CPU_CACHE_VIPT
+ #define ALIAS_FLUSH_START     0xffff4000
+@@ -32,10 +36,15 @@ static void flush_pfn_alias(unsigned lon
+       asm(    "mcrr   p15, 0, %1, %0, c14\n"
+       "       mcr     p15, 0, %2, c7, c10, 4\n"
++#ifndef CONFIG_ARM_ERRATA_411920
+       "       mcr     p15, 0, %2, c7, c5, 0\n"
++#endif
+           :
+           : "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES), "r" (zero)
+           : "cc");
++#ifdef CONFIG_ARM_ERRATA_411920
++      v6_icache_inval_all();
++#endif
+ }
+ void flush_cache_mm(struct mm_struct *mm)
+@@ -48,11 +57,16 @@ void flush_cache_mm(struct mm_struct *mm
+       if (cache_is_vipt_aliasing()) {
+               asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
++              "       mcr     p15, 0, %0, c7, c10, 4\n"
++#ifndef CONFIG_ARM_ERRATA_411920
+               "       mcr     p15, 0, %0, c7, c5, 0\n"
+-              "       mcr     p15, 0, %0, c7, c10, 4"
++#endif
+                   :
+                   : "r" (0)
+                   : "cc");
++#ifdef CONFIG_ARM_ERRATA_411920
++              v6_icache_inval_all();
++#endif
+       }
+ }
+@@ -67,11 +81,16 @@ void flush_cache_range(struct vm_area_st
+       if (cache_is_vipt_aliasing()) {
+               asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
++              "       mcr     p15, 0, %0, c7, c10, 4\n"
++#ifndef CONFIG_ARM_ERRATA_411920
+               "       mcr     p15, 0, %0, c7, c5, 0\n"
+-              "       mcr     p15, 0, %0, c7, c10, 4"
++#endif
+                   :
+                   : "r" (0)
+                   : "cc");
++#ifdef CONFIG_ARM_ERRATA_411920
++              v6_icache_inval_all();
++#endif
+       }
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/mm/proc-v7.S linux-2.6.30-rc4-git/arch/arm/mm/proc-v7.S
+--- linux-2.6.30-rc4/arch/arm/mm/proc-v7.S     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/mm/proc-v7.S 2009-05-13 09:46:19.000000000 +0200
+@@ -96,6 +96,9 @@ ENTRY(cpu_v7_switch_mm)
+       mov     r2, #0
+       ldr     r1, [r1, #MM_CONTEXT_ID]        @ get mm->context.id
+       orr     r0, r0, #TTB_FLAGS
++#ifdef CONFIG_ARM_ERRATA_430973
++      mcr     p15, 0, r2, c7, c5, 6           @ flush BTAC/BTB
++#endif
+       mcr     p15, 0, r2, c13, c0, 1          @ set reserved context ID
+       isb
+ 1:    mcr     p15, 0, r0, c2, c0, 0           @ set TTB 0
+@@ -181,6 +184,22 @@ __v7_setup:
+       stmia   r12, {r0-r5, r7, r9, r11, lr}
+       bl      v7_flush_dcache_all
+       ldmia   r12, {r0-r5, r7, r9, r11, lr}
++#ifdef CONFIG_ARM_ERRATA_430973
++      mrc     p15, 0, r10, c1, c0, 1          @ read aux control register
++      orr     r10, r10, #(1 << 6)             @ set IBE to 1
++      mcr     p15, 0, r10, c1, c0, 1          @ write aux control register
++#endif
++#ifdef CONFIG_ARM_ERRATA_458693
++      mrc     p15, 0, r10, c1, c0, 1          @ read aux control register
++      orr     r10, r10, #(1 << 5)             @ set L1NEON to 1
++      orr     r10, r10, #(1 << 9)             @ set PLDNOP to 1
++      mcr     p15, 0, r10, c1, c0, 1          @ write aux control register
++#endif
++#ifdef CONFIG_ARM_ERRATA_460075
++      mrc     p15, 1, r10, c9, c0, 2          @ read L2 cache aux ctrl register
++      orr     r10, r10, #(1 << 22)            @ set the Write Allocate disable bit
++      mcr     p15, 1, r10, c9, c0, 2          @ write the L2 cache aux ctrl register
++#endif
+       mov     r10, #0
+ #ifdef HARVARD_CACHE
+       mcr     p15, 0, r10, c7, c5, 0          @ I+BTB cache invalidate
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/dma-mx1-mx2.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/dma-mx1-mx2.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/dma-mx1-mx2.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/dma-mx1-mx2.c       2009-05-13 09:46:19.000000000 +0200
+@@ -693,12 +693,15 @@ int imx_dma_request(int channel, const c
+               local_irq_restore(flags);
+               return -EBUSY;
+       }
++      memset(imxdma, 0, sizeof(imxdma));
++      imxdma->name = name;
++      local_irq_restore(flags); /* request_irq() can block */
+ #ifdef CONFIG_ARCH_MX2
+       ret = request_irq(MXC_INT_DMACH0 + channel, dma_irq_handler, 0, "DMA",
+                       NULL);
+       if (ret) {
+-              local_irq_restore(flags);
++              imxdma->name = NULL;
+               printk(KERN_CRIT "Can't register IRQ %d for DMA channel %d\n",
+                               MXC_INT_DMACH0 + channel, channel);
+               return ret;
+@@ -708,13 +711,6 @@ int imx_dma_request(int channel, const c
+       imxdma->watchdog.data = channel;
+ #endif
+-      imxdma->name = name;
+-      imxdma->irq_handler = NULL;
+-      imxdma->err_handler = NULL;
+-      imxdma->data = NULL;
+-      imxdma->sg = NULL;
+-
+-      local_irq_restore(flags);
+       return ret;
+ }
+ EXPORT_SYMBOL(imx_dma_request);
+@@ -737,10 +733,7 @@ void imx_dma_free(int channel)
+       local_irq_save(flags);
+       /* Disable interrupts */
+-      __raw_writel(__raw_readl(DMA_BASE + DMA_DIMR) | (1 << channel),
+-              DMA_BASE + DMA_DIMR);
+-      __raw_writel(__raw_readl(DMA_BASE + DMA_CCR(channel)) & ~CCR_CEN,
+-              DMA_BASE + DMA_CCR(channel));
++      imx_dma_disable(channel);
+       imxdma->name = NULL;
+ #ifdef CONFIG_ARCH_MX2
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/gpio.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/gpio.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/gpio.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/gpio.c      2009-05-13 09:46:19.000000000 +0200
+@@ -64,6 +64,8 @@ static void gpio_unmask_irq(u32 irq)
+       _set_gpio_irqenable(&mxc_gpio_ports[gpio / 32], gpio & 0x1f, 1);
+ }
++static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset);
++
+ static int gpio_set_irq_type(u32 irq, u32 type)
+ {
+       u32 gpio = irq_to_gpio(irq);
+@@ -72,6 +74,7 @@ static int gpio_set_irq_type(u32 irq, u3
+       int edge;
+       void __iomem *reg = port->base;
++      port->both_edges &= ~(1 << (gpio & 31));
+       switch (type) {
+       case IRQ_TYPE_EDGE_RISING:
+               edge = GPIO_INT_RISE_EDGE;
+@@ -79,13 +82,24 @@ static int gpio_set_irq_type(u32 irq, u3
+       case IRQ_TYPE_EDGE_FALLING:
+               edge = GPIO_INT_FALL_EDGE;
+               break;
++      case IRQ_TYPE_EDGE_BOTH:
++              val = mxc_gpio_get(&port->chip, gpio & 31);
++              if (val) {
++                      edge = GPIO_INT_LOW_LEV;
++                      pr_debug("mxc: set GPIO %d to low trigger\n", gpio);
++              } else {
++                      edge = GPIO_INT_HIGH_LEV;
++                      pr_debug("mxc: set GPIO %d to high trigger\n", gpio);
++              }
++              port->both_edges |= 1 << (gpio & 31);
++              break;
+       case IRQ_TYPE_LEVEL_LOW:
+               edge = GPIO_INT_LOW_LEV;
+               break;
+       case IRQ_TYPE_LEVEL_HIGH:
+               edge = GPIO_INT_HIGH_LEV;
+               break;
+-      default:        /* this includes IRQ_TYPE_EDGE_BOTH */
++      default:
+               return -EINVAL;
+       }
+@@ -98,6 +112,34 @@ static int gpio_set_irq_type(u32 irq, u3
+       return 0;
+ }
++static void mxc_flip_edge(struct mxc_gpio_port *port, u32 gpio)
++{
++      void __iomem *reg = port->base;
++      u32 bit, val;
++      int edge;
++
++      reg += GPIO_ICR1 + ((gpio & 0x10) >> 2); /* lower or upper register */
++      bit = gpio & 0xf;
++      val = __raw_readl(reg);
++      edge = (val >> (bit << 1)) & 3;
++      val &= ~(0x3 << (bit << 1));
++      switch (edge) {
++      case GPIO_INT_HIGH_LEV:
++              edge = GPIO_INT_LOW_LEV;
++              pr_debug("mxc: switch GPIO %d to low trigger\n", gpio);
++              break;
++      case GPIO_INT_LOW_LEV:
++              edge = GPIO_INT_HIGH_LEV;
++              pr_debug("mxc: switch GPIO %d to high trigger\n", gpio);
++              break;
++      default:
++              pr_err("mxc: invalid configuration for GPIO %d: %x\n",
++                     gpio, edge);
++              return;
++      }
++      __raw_writel(val | (edge << (bit << 1)), reg);
++}
++
+ /* handle n interrupts in one status register */
+ static void mxc_gpio_irq_handler(struct mxc_gpio_port *port, u32 irq_stat)
+ {
+@@ -105,11 +147,16 @@ static void mxc_gpio_irq_handler(struct 
+       gpio_irq_no = port->virtual_irq_start;
+       for (; irq_stat != 0; irq_stat >>= 1, gpio_irq_no++) {
++              u32 gpio = irq_to_gpio(gpio_irq_no);
+               if ((irq_stat & 1) == 0)
+                       continue;
+               BUG_ON(!(irq_desc[gpio_irq_no].handle_irq));
++
++              if (port->both_edges & (1 << (gpio & 31)))
++                      mxc_flip_edge(port, gpio);
++
+               irq_desc[gpio_irq_no].handle_irq(gpio_irq_no,
+                               &irq_desc[gpio_irq_no]);
+       }
+@@ -124,7 +171,7 @@ static void mx3_gpio_irq_handler(u32 irq
+       irq_stat = __raw_readl(port->base + GPIO_ISR) &
+                       __raw_readl(port->base + GPIO_IMR);
+-      BUG_ON(!irq_stat);
++
+       mxc_gpio_irq_handler(port, irq_stat);
+ }
+ #endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx21ads.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx21ads.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx21ads.h    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx21ads.h        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,58 @@
++/*
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#ifndef __ASM_ARCH_MXC_BOARD_MX21ADS_H__
++#define __ASM_ARCH_MXC_BOARD_MX21ADS_H__
++
++/*
++ * MXC UART EVB board level configurations
++ */
++#define MXC_LL_UART_PADDR       UART1_BASE_ADDR
++#define MXC_LL_UART_VADDR       AIPI_IO_ADDRESS(UART1_BASE_ADDR)
++
++/*
++ * Memory-mapped I/O on MX21ADS base board
++ */
++#define MX21ADS_MMIO_BASE_ADDR   0xF5000000
++#define MX21ADS_MMIO_SIZE        SZ_16M
++
++#define MX21ADS_REG_ADDR(offset)    (void __force __iomem *) \
++              (MX21ADS_MMIO_BASE_ADDR + (offset))
++
++#define MX21ADS_CS8900A_IRQ         IRQ_GPIOE(11)
++#define MX21ADS_CS8900A_IOBASE_REG  MX21ADS_REG_ADDR(0x000000)
++#define MX21ADS_ST16C255_IOBASE_REG MX21ADS_REG_ADDR(0x200000)
++#define MX21ADS_VERSION_REG         MX21ADS_REG_ADDR(0x400000)
++#define MX21ADS_IO_REG              MX21ADS_REG_ADDR(0x800000)
++
++/* MX21ADS_IO_REG bit definitions */
++#define MX21ADS_IO_SD_WP        0x0001 /* read */
++#define MX21ADS_IO_TP6          0x0001 /* write */
++#define MX21ADS_IO_SW_SEL       0x0002 /* read */
++#define MX21ADS_IO_TP7          0x0002 /* write */
++#define MX21ADS_IO_RESET_E_UART 0x0004
++#define MX21ADS_IO_RESET_BASE   0x0008
++#define MX21ADS_IO_CSI_CTL2     0x0010
++#define MX21ADS_IO_CSI_CTL1     0x0020
++#define MX21ADS_IO_CSI_CTL0     0x0040
++#define MX21ADS_IO_UART1_EN     0x0080
++#define MX21ADS_IO_UART4_EN     0x0100
++#define MX21ADS_IO_LCDON        0x0200
++#define MX21ADS_IO_IRDA_EN      0x0400
++#define MX21ADS_IO_IRDA_FIR_SEL 0x0800
++#define MX21ADS_IO_IRDA_MD0_B   0x1000
++#define MX21ADS_IO_IRDA_MD1     0x2000
++#define MX21ADS_IO_LED4_ON      0x4000
++#define MX21ADS_IO_LED3_ON      0x8000
++
++#endif                                /* __ASM_ARCH_MXC_BOARD_MX21ADS_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx27ads.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx27ads.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx27ads.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx27ads.h        2009-05-13 09:46:19.000000000 +0200
+@@ -47,7 +47,7 @@
+ /*
+  * Base address of PBC controller, CS4
+  */
+-#define PBC_BASE_ADDRESS        0xEB000000
++#define PBC_BASE_ADDRESS        0xf4300000
+ #define PBC_REG_ADDR(offset)    (void __force __iomem *) \
+               (PBC_BASE_ADDRESS + (offset))
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx27pdk.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx27pdk.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx27pdk.h    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx27pdk.h        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,19 @@
++/*
++ * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#ifndef __ASM_ARCH_MXC_BOARD_MX27PDK_H__
++#define __ASM_ARCH_MXC_BOARD_MX27PDK_H__
++
++/* mandatory for CONFIG_DEBUG_LL */
++
++#define MXC_LL_UART_PADDR     UART1_BASE_ADDR
++#define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
++
++#endif /* __ASM_ARCH_MXC_BOARD_MX27PDK_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31ads.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31ads.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31ads.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31ads.h        2009-05-13 09:46:19.000000000 +0200
+@@ -114,7 +114,7 @@
+ #define MXC_MAX_EXP_IO_LINES  16
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31lite.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31lite.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31lite.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31lite.h       2009-05-13 09:46:19.000000000 +0200
+@@ -11,28 +11,8 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_MX31LITE_H__
+ #define __ASM_ARCH_MXC_BOARD_MX31LITE_H__
+-#define MXC_MAX_EXP_IO_LINES  16
+-
+-
+-/*
+- * Memory Size parameters
+- */
+-
+-/*
+- * Size of SDRAM memory
+- */
+-#define SDRAM_MEM_SIZE                SZ_128M
+-/*
+- * Size of MBX buffer memory
+- */
+-#define MXC_MBX_MEM_SIZE      SZ_16M
+-/*
+- * Size of memory available to kernel
+- */
+-#define MEM_SIZE              (SDRAM_MEM_SIZE - MXC_MBX_MEM_SIZE)
+-
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+-#endif /* __ASM_ARCH_MXC_BOARD_MX31ADS_H__ */
++#endif /* __ASM_ARCH_MXC_BOARD_MX31LITE_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31moboard.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31moboard.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31moboard.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31moboard.h    2009-05-13 09:46:19.000000000 +0200
+@@ -19,7 +19,7 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__
+ #define __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     (AIPI_BASE_ADDR_VIRT + 0x0A000)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31pdk.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31pdk.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-mx31pdk.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-mx31pdk.h        2009-05-13 09:46:19.000000000 +0200
+@@ -11,7 +11,7 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_MX31PDK_H__
+ #define __ASM_ARCH_MXC_BOARD_MX31PDK_H__
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm037.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm037.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm037.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm037.h 2009-05-13 09:46:19.000000000 +0200
+@@ -19,7 +19,7 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_PCM037_H__
+ #define __ASM_ARCH_MXC_BOARD_PCM037_H__
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm038.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm038.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm038.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm038.h 2009-05-13 09:46:19.000000000 +0200
+@@ -19,7 +19,7 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_PCM038_H__
+ #define __ASM_ARCH_MXC_BOARD_PCM038_H__
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     (AIPI_BASE_ADDR_VIRT + 0x0A000)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm043.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm043.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-pcm043.h     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-pcm043.h 2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,27 @@
++/*
++ *  Copyright (C) 2008 Sascha Hauer, Pengutronix
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef __ASM_ARCH_MXC_BOARD_PCM043_H__
++#define __ASM_ARCH_MXC_BOARD_PCM043_H__
++
++/* mandatory for CONFIG_LL_DEBUG */
++
++#define MXC_LL_UART_PADDR     UART1_BASE_ADDR
++#define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
++
++#endif /* __ASM_ARCH_MXC_BOARD_PCM043_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-qong.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-qong.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-qong.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/board-qong.h   2009-05-13 09:46:19.000000000 +0200
+@@ -11,7 +11,7 @@
+ #ifndef __ASM_ARCH_MXC_BOARD_QONG_H__
+ #define __ASM_ARCH_MXC_BOARD_QONG_H__
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/common.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/common.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/common.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/common.h       2009-05-13 09:46:19.000000000 +0200
+@@ -14,7 +14,11 @@
+ struct platform_device;
+ struct clk;
+-extern void mxc_map_io(void);
++extern void mx1_map_io(void);
++extern void mx21_map_io(void);
++extern void mx27_map_io(void);
++extern void mx31_map_io(void);
++extern void mx35_map_io(void);
+ extern void mxc_init_irq(void);
+ extern void mxc_timer_init(struct clk *timer_clk);
+ extern int mx1_clocks_init(unsigned long fref);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/debug-macro.S linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/debug-macro.S
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/debug-macro.S      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/debug-macro.S  2009-05-13 09:46:19.000000000 +0200
+@@ -25,6 +25,9 @@
+ #ifdef CONFIG_MACH_MX27ADS
+ #include <mach/board-mx27ads.h>
+ #endif
++#ifdef CONFIG_MACH_MX21ADS
++#include <mach/board-mx21ads.h>
++#endif
+ #ifdef CONFIG_MACH_PCM038
+ #include <mach/board-pcm038.h>
+ #endif
+@@ -34,6 +37,12 @@
+ #ifdef CONFIG_MACH_QONG
+ #include <mach/board-qong.h>
+ #endif
++#ifdef CONFIG_MACH_PCM043
++#include <mach/board-pcm043.h>
++#endif
++#ifdef CONFIG_MACH_MX27_3DS
++#include <mach/board-mx27pdk.h>
++#endif
+               .macro  addruart,rx
+               mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                 @ MMU enabled?
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/gpio.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/gpio.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/gpio.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/gpio.h 2009-05-13 09:46:19.000000000 +0200
+@@ -35,6 +35,7 @@ struct mxc_gpio_port {
+       int irq;
+       int virtual_irq_start;
+       struct gpio_chip chip;
++      u32 both_edges;
+ };
+ int mxc_gpio_init(struct mxc_gpio_port*, int);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imxfb.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/imxfb.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imxfb.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/imxfb.h        2009-05-13 09:46:19.000000000 +0200
+@@ -76,8 +76,8 @@ struct imx_fb_platform_data {
+       u_char * fixed_screen_cpu;
+       dma_addr_t fixed_screen_dma;
+-      int (*init)(struct platform_device*);
+-      int (*exit)(struct platform_device*);
++      int (*init)(struct platform_device *);
++      void (*exit)(struct platform_device *);
+       void (*lcd_power)(int);
+       void (*backlight_power)(int);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imx-uart.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/imx-uart.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imx-uart.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/imx-uart.h     2009-05-13 09:46:19.000000000 +0200
+@@ -23,7 +23,7 @@
+ struct imxuart_platform_data {
+       int (*init)(struct platform_device *pdev);
+-      int (*exit)(struct platform_device *pdev);
++      void (*exit)(struct platform_device *pdev);
+       unsigned int flags;
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx35.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-mx35.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx35.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-mx35.h   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,1267 @@
++/*
++ * Copyright (C, NO_PAD_CTRL) 2009 by Jan Weitzel Phytec Messtechnik GmbH <armlinux@phytec.de>
++ *
++ * 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, NO_PAD_CTRL) 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., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301, USA.
++ */
++
++#ifndef __MACH_IOMUX_MX35_H__
++#define __MACH_IOMUX_MX35_H__
++
++#include <mach/iomux-v3.h>
++
++/*
++ * The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
++ * If <padname> or <padmode> refers to a GPIO, it is named
++ * GPIO_<unit>_<num> see also iomux-v3.h
++ */
++
++/*                                                                      PAD    MUX   ALT INPSE PATH */
++#define MX35_PAD_CAPTURE__GPT_CAPIN1                          IOMUX_PAD(0x328, 0x004, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CAPTURE__GPT_CMPOUT2                         IOMUX_PAD(0x328, 0x004, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CAPTURE__CSPI2_SS1                           IOMUX_PAD(0x328, 0x004, 2, 0x7f4, 0, NO_PAD_CTRL)
++#define MX35_PAD_CAPTURE__EPIT1_EPITO                         IOMUX_PAD(0x328, 0x004, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CAPTURE__CCM_CLK32K                          IOMUX_PAD(0x328, 0x004, 4, 0x7d0, 0, NO_PAD_CTRL)
++#define MX35_PAD_CAPTURE__GPIO1_4                             IOMUX_PAD(0x328, 0x004, 5, 0x850, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_COMPARE__GPT_CMPOUT1                         IOMUX_PAD(0x32c, 0x008, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_COMPARE__GPT_CAPIN2                          IOMUX_PAD(0x32c, 0x008, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_COMPARE__GPT_CMPOUT3                         IOMUX_PAD(0x32c, 0x008, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_COMPARE__EPIT2_EPITO                         IOMUX_PAD(0x32c, 0x008, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_COMPARE__GPIO1_5                             IOMUX_PAD(0x32c, 0x008, 5, 0x854, 0, NO_PAD_CTRL)
++#define MX35_PAD_COMPARE__SDMA_EXTDMA_2                               IOMUX_PAD(0x32c, 0x008, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_WDOG_RST__WDOG_WDOG_B                                IOMUX_PAD(0x330, 0x00c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_WDOG_RST__IPU_FLASH_STROBE                   IOMUX_PAD(0x330, 0x00c, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_WDOG_RST__GPIO1_6                            IOMUX_PAD(0x330, 0x00c, 5, 0x858, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_GPIO1_0__GPIO1_0                             IOMUX_PAD(0x334, 0x010, 0, 0x82c, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_0__CCM_PMIC_RDY                                IOMUX_PAD(0x334, 0x010, 1, 0x7d4, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_0__OWIRE_LINE                          IOMUX_PAD(0x334, 0x010, 2, 0x990, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_0__SDMA_EXTDMA_0                               IOMUX_PAD(0x334, 0x010, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_GPIO1_1__GPIO1_1                             IOMUX_PAD(0x338, 0x014, 0, 0x838, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_1__PWM_PWMO                            IOMUX_PAD(0x338, 0x014, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_1__CSPI1_SS2                           IOMUX_PAD(0x338, 0x014, 3, 0x7d8, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_1__SCC_TAMPER_DETECT                   IOMUX_PAD(0x338, 0x014, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO1_1__SDMA_EXTDMA_1                               IOMUX_PAD(0x338, 0x014, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_GPIO2_0__GPIO2_0                             IOMUX_PAD(0x33c, 0x018, 0, 0x868, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO2_0__USB_TOP_USBOTG_CLK                  IOMUX_PAD(0x33c, 0x018, 1, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_GPIO3_0__GPIO3_0                             IOMUX_PAD(0x340, 0x01c, 0, 0x8e8, 0, NO_PAD_CTRL)
++#define MX35_PAD_GPIO3_0__USB_TOP_USBH2_CLK                   IOMUX_PAD(0x340, 0x01c, 1, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RESET_IN_B__CCM_RESET_IN_B                   IOMUX_PAD(0x344, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_POR_B__CCM_POR_B                             IOMUX_PAD(0x348, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CLKO__CCM_CLKO                                       IOMUX_PAD(0x34c, 0x020, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CLKO__GPIO1_8                                        IOMUX_PAD(0x34c, 0x020, 5, 0x860, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_BOOT_MODE0__CCM_BOOT_MODE_0                  IOMUX_PAD(0x350, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_BOOT_MODE1__CCM_BOOT_MODE_1                  IOMUX_PAD(0x354, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CLK_MODE0__CCM_CLK_MODE_0                    IOMUX_PAD(0x358, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CLK_MODE1__CCM_CLK_MODE_1                    IOMUX_PAD(0x35c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_POWER_FAIL__CCM_DSM_WAKEUP_INT_26            IOMUX_PAD(0x360, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_VSTBY__CCM_VSTBY                             IOMUX_PAD(0x364, 0x024, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_VSTBY__GPIO1_7                                       IOMUX_PAD(0x364, 0x024, 5, 0x85c, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_A0__EMI_EIM_DA_L_0                           IOMUX_PAD(0x368, 0x028, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A1__EMI_EIM_DA_L_1                           IOMUX_PAD(0x36c, 0x02c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A2__EMI_EIM_DA_L_2                           IOMUX_PAD(0x370, 0x030, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A3__EMI_EIM_DA_L_3                           IOMUX_PAD(0x374, 0x034, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A4__EMI_EIM_DA_L_4                           IOMUX_PAD(0x378, 0x038, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A5__EMI_EIM_DA_L_5                           IOMUX_PAD(0x37c, 0x03c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A6__EMI_EIM_DA_L_6                           IOMUX_PAD(0x380, 0x040, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A7__EMI_EIM_DA_L_7                           IOMUX_PAD(0x384, 0x044, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A8__EMI_EIM_DA_H_8                           IOMUX_PAD(0x388, 0x048, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A9__EMI_EIM_DA_H_9                           IOMUX_PAD(0x38c, 0x04c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A10__EMI_EIM_DA_H_10                         IOMUX_PAD(0x390, 0x050, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_MA10__EMI_MA10                                       IOMUX_PAD(0x394, 0x054, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A11__EMI_EIM_DA_H_11                         IOMUX_PAD(0x398, 0x058, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A12__EMI_EIM_DA_H_12                         IOMUX_PAD(0x39c, 0x05c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A13__EMI_EIM_DA_H_13                         IOMUX_PAD(0x3a0, 0x060, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A14__EMI_EIM_DA_H2_14                                IOMUX_PAD(0x3a4, 0x064, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A15__EMI_EIM_DA_H2_15                                IOMUX_PAD(0x3a8, 0x068, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A16__EMI_EIM_A_16                            IOMUX_PAD(0x3ac, 0x06c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A17__EMI_EIM_A_17                            IOMUX_PAD(0x3b0, 0x070, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A18__EMI_EIM_A_18                            IOMUX_PAD(0x3b4, 0x074, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A19__EMI_EIM_A_19                            IOMUX_PAD(0x3b8, 0x078, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A20__EMI_EIM_A_20                            IOMUX_PAD(0x3bc, 0x07c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A21__EMI_EIM_A_21                            IOMUX_PAD(0x3c0, 0x080, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A22__EMI_EIM_A_22                            IOMUX_PAD(0x3c4, 0x084, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A23__EMI_EIM_A_23                            IOMUX_PAD(0x3c8, 0x088, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A24__EMI_EIM_A_24                            IOMUX_PAD(0x3cc, 0x08c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_A25__EMI_EIM_A_25                            IOMUX_PAD(0x3d0, 0x090, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDBA1__EMI_EIM_SDBA1                         IOMUX_PAD(0x3d4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDBA0__EMI_EIM_SDBA0                         IOMUX_PAD(0x3d8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD0__EMI_DRAM_D_0                            IOMUX_PAD(0x3dc, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1__EMI_DRAM_D_1                            IOMUX_PAD(0x3e0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2__EMI_DRAM_D_2                            IOMUX_PAD(0x3e4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD3__EMI_DRAM_D_3                            IOMUX_PAD(0x3e8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD4__EMI_DRAM_D_4                            IOMUX_PAD(0x3ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD5__EMI_DRAM_D_5                            IOMUX_PAD(0x3f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD6__EMI_DRAM_D_6                            IOMUX_PAD(0x3f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD7__EMI_DRAM_D_7                            IOMUX_PAD(0x3f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD8__EMI_DRAM_D_8                            IOMUX_PAD(0x3fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD9__EMI_DRAM_D_9                            IOMUX_PAD(0x400, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD10__EMI_DRAM_D_10                          IOMUX_PAD(0x404, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD11__EMI_DRAM_D_11                          IOMUX_PAD(0x408, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD12__EMI_DRAM_D_12                          IOMUX_PAD(0x40c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD13__EMI_DRAM_D_13                          IOMUX_PAD(0x410, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD14__EMI_DRAM_D_14                          IOMUX_PAD(0x414, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD15__EMI_DRAM_D_15                          IOMUX_PAD(0x418, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD16__EMI_DRAM_D_16                          IOMUX_PAD(0x41c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD17__EMI_DRAM_D_17                          IOMUX_PAD(0x420, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD18__EMI_DRAM_D_18                          IOMUX_PAD(0x424, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD19__EMI_DRAM_D_19                          IOMUX_PAD(0x428, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD20__EMI_DRAM_D_20                          IOMUX_PAD(0x42c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD21__EMI_DRAM_D_21                          IOMUX_PAD(0x430, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD22__EMI_DRAM_D_22                          IOMUX_PAD(0x434, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD23__EMI_DRAM_D_23                          IOMUX_PAD(0x438, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD24__EMI_DRAM_D_24                          IOMUX_PAD(0x43c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD25__EMI_DRAM_D_25                          IOMUX_PAD(0x440, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD26__EMI_DRAM_D_26                          IOMUX_PAD(0x444, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD27__EMI_DRAM_D_27                          IOMUX_PAD(0x448, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD28__EMI_DRAM_D_28                          IOMUX_PAD(0x44c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD29__EMI_DRAM_D_29                          IOMUX_PAD(0x450, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD30__EMI_DRAM_D_30                          IOMUX_PAD(0x454, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD31__EMI_DRAM_D_31                          IOMUX_PAD(0x458, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_DQM0__EMI_DRAM_DQM_0                         IOMUX_PAD(0x45c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_DQM1__EMI_DRAM_DQM_1                         IOMUX_PAD(0x460, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_DQM2__EMI_DRAM_DQM_2                         IOMUX_PAD(0x464, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_DQM3__EMI_DRAM_DQM_3                         IOMUX_PAD(0x468, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_EB0__EMI_EIM_EB0_B                           IOMUX_PAD(0x46c, 0x094, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_EB1__EMI_EIM_EB1_B                           IOMUX_PAD(0x470, 0x098, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_OE__EMI_EIM_OE                                       IOMUX_PAD(0x474, 0x09c, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS0__EMI_EIM_CS0                             IOMUX_PAD(0x478, 0x0a0, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS1__EMI_EIM_CS1                             IOMUX_PAD(0x47c, 0x0a4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CS1__EMI_NANDF_CE3                           IOMUX_PAD(0x47c, 0x0a4, 3, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS2__EMI_EIM_CS2                             IOMUX_PAD(0x480, 0x0a8, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS3__EMI_EIM_CS3                             IOMUX_PAD(0x484, 0x0ac, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS4__EMI_EIM_CS4                             IOMUX_PAD(0x488, 0x0b0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CS4__EMI_DTACK_B                             IOMUX_PAD(0x488, 0x0b0, 1, 0x800, 0, NO_PAD_CTRL)
++#define MX35_PAD_CS4__EMI_NANDF_CE1                           IOMUX_PAD(0x488, 0x0b0, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CS4__GPIO1_20                                        IOMUX_PAD(0x488, 0x0b0, 5, 0x83c, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_CS5__EMI_EIM_CS5                             IOMUX_PAD(0x48c, 0x0b4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CS5__CSPI2_SS2                                       IOMUX_PAD(0x48c, 0x0b4, 1, 0x7f8, 0, NO_PAD_CTRL)
++#define MX35_PAD_CS5__CSPI1_SS2                                       IOMUX_PAD(0x48c, 0x0b4, 2, 0x7d8, 1, NO_PAD_CTRL)
++#define MX35_PAD_CS5__EMI_NANDF_CE2                           IOMUX_PAD(0x48c, 0x0b4, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CS5__GPIO1_21                                        IOMUX_PAD(0x48c, 0x0b4, 5, 0x840, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_NF_CE0__EMI_NANDF_CE0                                IOMUX_PAD(0x490, 0x0b8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NF_CE0__GPIO1_22                             IOMUX_PAD(0x490, 0x0b8, 5, 0x844, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_ECB__EMI_EIM_ECB                             IOMUX_PAD(0x494, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LBA__EMI_EIM_LBA                             IOMUX_PAD(0x498, 0x0bc, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_BCLK__EMI_EIM_BCLK                           IOMUX_PAD(0x49c, 0x0c0, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RW__EMI_EIM_RW                                       IOMUX_PAD(0x4a0, 0x0c4, 0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RAS__EMI_DRAM_RAS                            IOMUX_PAD(0x4a4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CAS__EMI_DRAM_CAS                            IOMUX_PAD(0x4a8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDWE__EMI_DRAM_SDWE                          IOMUX_PAD(0x4ac, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDCKE0__EMI_DRAM_SDCKE_0                     IOMUX_PAD(0x4b0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDCKE1__EMI_DRAM_SDCKE_1                     IOMUX_PAD(0x4b4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDCLK__EMI_DRAM_SDCLK                                IOMUX_PAD(0x4b8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDQS0__EMI_DRAM_SDQS_0                               IOMUX_PAD(0x4bc, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDQS1__EMI_DRAM_SDQS_1                               IOMUX_PAD(0x4c0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDQS2__EMI_DRAM_SDQS_2                               IOMUX_PAD(0x4c4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SDQS3__EMI_DRAM_SDQS_3                               IOMUX_PAD(0x4c8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFWE_B__EMI_NANDF_WE_B                               IOMUX_PAD(0x4cc, 0x0c8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFWE_B__USB_TOP_USBH2_DATA_3                 IOMUX_PAD(0x4cc, 0x0c8, 1, 0x9d8, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFWE_B__IPU_DISPB_D0_VSYNC                   IOMUX_PAD(0x4cc, 0x0c8, 2, 0x924, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFWE_B__GPIO2_18                             IOMUX_PAD(0x4cc, 0x0c8, 5, 0x88c, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFWE_B__ARM11P_TOP_TRACE_0                   IOMUX_PAD(0x4cc, 0x0c8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFRE_B__EMI_NANDF_RE_B                               IOMUX_PAD(0x4d0, 0x0cc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFRE_B__USB_TOP_USBH2_DIR                    IOMUX_PAD(0x4d0, 0x0cc, 1, 0x9ec, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFRE_B__IPU_DISPB_BCLK                               IOMUX_PAD(0x4d0, 0x0cc, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFRE_B__GPIO2_19                             IOMUX_PAD(0x4d0, 0x0cc, 5, 0x890, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFRE_B__ARM11P_TOP_TRACE_1                   IOMUX_PAD(0x4d0, 0x0cc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFALE__EMI_NANDF_ALE                         IOMUX_PAD(0x4d4, 0x0d0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFALE__USB_TOP_USBH2_STP                     IOMUX_PAD(0x4d4, 0x0d0, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFALE__IPU_DISPB_CS0                         IOMUX_PAD(0x4d4, 0x0d0, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFALE__GPIO2_20                              IOMUX_PAD(0x4d4, 0x0d0, 5, 0x898, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFALE__ARM11P_TOP_TRACE_2                    IOMUX_PAD(0x4d4, 0x0d0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFCLE__EMI_NANDF_CLE                         IOMUX_PAD(0x4d8, 0x0d4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFCLE__USB_TOP_USBH2_NXT                     IOMUX_PAD(0x4d8, 0x0d4, 1, 0x9f0, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFCLE__IPU_DISPB_PAR_RS                      IOMUX_PAD(0x4d8, 0x0d4, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFCLE__GPIO2_21                              IOMUX_PAD(0x4d8, 0x0d4, 5, 0x89c, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFCLE__ARM11P_TOP_TRACE_3                    IOMUX_PAD(0x4d8, 0x0d4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFWP_B__EMI_NANDF_WP_B                               IOMUX_PAD(0x4dc, 0x0d8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFWP_B__USB_TOP_USBH2_DATA_7                 IOMUX_PAD(0x4dc, 0x0d8, 1, 0x9e8, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFWP_B__IPU_DISPB_WR                         IOMUX_PAD(0x4dc, 0x0d8, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFWP_B__GPIO2_22                             IOMUX_PAD(0x4dc, 0x0d8, 5, 0x8a0, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFWP_B__ARM11P_TOP_TRCTL                     IOMUX_PAD(0x4dc, 0x0d8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_NFRB__EMI_NANDF_RB                           IOMUX_PAD(0x4e0, 0x0dc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFRB__IPU_DISPB_RD                           IOMUX_PAD(0x4e0, 0x0dc, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_NFRB__GPIO2_23                                       IOMUX_PAD(0x4e0, 0x0dc, 5, 0x8a4, 0, NO_PAD_CTRL)
++#define MX35_PAD_NFRB__ARM11P_TOP_TRCLK                               IOMUX_PAD(0x4e0, 0x0dc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D15__EMI_EIM_D_15                            IOMUX_PAD(0x4e4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D14__EMI_EIM_D_14                            IOMUX_PAD(0x4e8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D13__EMI_EIM_D_13                            IOMUX_PAD(0x4ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D12__EMI_EIM_D_12                            IOMUX_PAD(0x4f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D11__EMI_EIM_D_11                            IOMUX_PAD(0x4f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D10__EMI_EIM_D_10                            IOMUX_PAD(0x4f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D9__EMI_EIM_D_9                              IOMUX_PAD(0x4fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D8__EMI_EIM_D_8                              IOMUX_PAD(0x500, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D7__EMI_EIM_D_7                              IOMUX_PAD(0x504, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D6__EMI_EIM_D_6                              IOMUX_PAD(0x508, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D5__EMI_EIM_D_5                              IOMUX_PAD(0x50c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D4__EMI_EIM_D_4                              IOMUX_PAD(0x510, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3__EMI_EIM_D_3                              IOMUX_PAD(0x514, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D2__EMI_EIM_D_2                              IOMUX_PAD(0x518, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D1__EMI_EIM_D_1                              IOMUX_PAD(0x51c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D0__EMI_EIM_D_0                              IOMUX_PAD(0x520, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D8__IPU_CSI_D_8                          IOMUX_PAD(0x524, 0x0e0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D8__KPP_COL_0                            IOMUX_PAD(0x524, 0x0e0, 1, 0x950, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D8__GPIO1_20                             IOMUX_PAD(0x524, 0x0e0, 5, 0x83c, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D8__ARM11P_TOP_EVNTBUS_13                        IOMUX_PAD(0x524, 0x0e0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D9__IPU_CSI_D_9                          IOMUX_PAD(0x528, 0x0e4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D9__KPP_COL_1                            IOMUX_PAD(0x528, 0x0e4, 1, 0x954, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D9__GPIO1_21                             IOMUX_PAD(0x528, 0x0e4, 5, 0x840, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D9__ARM11P_TOP_EVNTBUS_14                        IOMUX_PAD(0x528, 0x0e4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D10__IPU_CSI_D_10                                IOMUX_PAD(0x52c, 0x0e8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D10__KPP_COL_2                           IOMUX_PAD(0x52c, 0x0e8, 1, 0x958, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D10__GPIO1_22                            IOMUX_PAD(0x52c, 0x0e8, 5, 0x844, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D10__ARM11P_TOP_EVNTBUS_15                       IOMUX_PAD(0x52c, 0x0e8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D11__IPU_CSI_D_11                                IOMUX_PAD(0x530, 0x0ec, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D11__KPP_COL_3                           IOMUX_PAD(0x530, 0x0ec, 1, 0x95c, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D11__GPIO1_23                            IOMUX_PAD(0x530, 0x0ec, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D12__IPU_CSI_D_12                                IOMUX_PAD(0x534, 0x0f0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D12__KPP_ROW_0                           IOMUX_PAD(0x534, 0x0f0, 1, 0x970, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D12__GPIO1_24                            IOMUX_PAD(0x534, 0x0f0, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D13__IPU_CSI_D_13                                IOMUX_PAD(0x538, 0x0f4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D13__KPP_ROW_1                           IOMUX_PAD(0x538, 0x0f4, 1, 0x974, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D13__GPIO1_25                            IOMUX_PAD(0x538, 0x0f4, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D14__IPU_CSI_D_14                                IOMUX_PAD(0x53c, 0x0f8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D14__KPP_ROW_2                           IOMUX_PAD(0x53c, 0x0f8, 1, 0x978, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D14__GPIO1_26                            IOMUX_PAD(0x53c, 0x0f8, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_D15__IPU_CSI_D_15                                IOMUX_PAD(0x540, 0x0fc, 0, 0x97c, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D15__KPP_ROW_3                           IOMUX_PAD(0x540, 0x0fc, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_D15__GPIO1_27                            IOMUX_PAD(0x540, 0x0fc, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_MCLK__IPU_CSI_MCLK                               IOMUX_PAD(0x544, 0x100, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_MCLK__GPIO1_28                           IOMUX_PAD(0x544, 0x100, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_VSYNC__IPU_CSI_VSYNC                     IOMUX_PAD(0x548, 0x104, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_VSYNC__GPIO1_29                          IOMUX_PAD(0x548, 0x104, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_HSYNC__IPU_CSI_HSYNC                     IOMUX_PAD(0x54c, 0x108, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_HSYNC__GPIO1_30                          IOMUX_PAD(0x54c, 0x108, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSI_PIXCLK__IPU_CSI_PIXCLK                   IOMUX_PAD(0x550, 0x10c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSI_PIXCLK__GPIO1_31                         IOMUX_PAD(0x550, 0x10c, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_I2C1_CLK__I2C1_SCL                           IOMUX_PAD(0x554, 0x110, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C1_CLK__GPIO2_24                           IOMUX_PAD(0x554, 0x110, 5, 0x8a8, 0, NO_PAD_CTRL)
++#define MX35_PAD_I2C1_CLK__CCM_USB_BYP_CLK                    IOMUX_PAD(0x554, 0x110, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_I2C1_DAT__I2C1_SDA                           IOMUX_PAD(0x558, 0x114, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C1_DAT__GPIO2_25                           IOMUX_PAD(0x558, 0x114, 5, 0x8ac, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_I2C2_CLK__I2C2_SCL                           IOMUX_PAD(0x55c, 0x118, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_CLK__CAN1_TXCAN                         IOMUX_PAD(0x55c, 0x118, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_CLK__USB_TOP_USBH2_PWR                  IOMUX_PAD(0x55c, 0x118, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_CLK__GPIO2_26                           IOMUX_PAD(0x55c, 0x118, 5, 0x8b0, 0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_CLK__SDMA_DEBUG_BUS_DEVICE_2            IOMUX_PAD(0x55c, 0x118, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_I2C2_DAT__I2C2_SDA                           IOMUX_PAD(0x560, 0x11c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_DAT__CAN1_RXCAN                         IOMUX_PAD(0x560, 0x11c, 1, 0x7c8, 0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_DAT__USB_TOP_USBH2_OC                   IOMUX_PAD(0x560, 0x11c, 2, 0x9f4, 0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_DAT__GPIO2_27                           IOMUX_PAD(0x560, 0x11c, 5, 0x8b4, 0, NO_PAD_CTRL)
++#define MX35_PAD_I2C2_DAT__SDMA_DEBUG_BUS_DEVICE_3            IOMUX_PAD(0x560, 0x11c, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_STXD4__AUDMUX_AUD4_TXD                               IOMUX_PAD(0x564, 0x120, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_STXD4__GPIO2_28                              IOMUX_PAD(0x564, 0x120, 5, 0x8b8, 0, NO_PAD_CTRL)
++#define MX35_PAD_STXD4__ARM11P_TOP_ARM_COREASID0              IOMUX_PAD(0x564, 0x120, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SRXD4__AUDMUX_AUD4_RXD                               IOMUX_PAD(0x568, 0x124, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SRXD4__GPIO2_29                              IOMUX_PAD(0x568, 0x124, 5, 0x8bc, 0, NO_PAD_CTRL)
++#define MX35_PAD_SRXD4__ARM11P_TOP_ARM_COREASID1              IOMUX_PAD(0x568, 0x124, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SCK4__AUDMUX_AUD4_TXC                                IOMUX_PAD(0x56c, 0x128, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SCK4__GPIO2_30                                       IOMUX_PAD(0x56c, 0x128, 5, 0x8c4, 0, NO_PAD_CTRL)
++#define MX35_PAD_SCK4__ARM11P_TOP_ARM_COREASID2                       IOMUX_PAD(0x56c, 0x128, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_STXFS4__AUDMUX_AUD4_TXFS                     IOMUX_PAD(0x570, 0x12c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_STXFS4__GPIO2_31                             IOMUX_PAD(0x570, 0x12c, 5, 0x8c8, 0, NO_PAD_CTRL)
++#define MX35_PAD_STXFS4__ARM11P_TOP_ARM_COREASID3             IOMUX_PAD(0x570, 0x12c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_STXD5__AUDMUX_AUD5_TXD                               IOMUX_PAD(0x574, 0x130, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_STXD5__SPDIF_SPDIF_OUT1                      IOMUX_PAD(0x574, 0x130, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_STXD5__CSPI2_MOSI                            IOMUX_PAD(0x574, 0x130, 2, 0x7ec, 0, NO_PAD_CTRL)
++#define MX35_PAD_STXD5__GPIO1_0                                       IOMUX_PAD(0x574, 0x130, 5, 0x82c, 1, NO_PAD_CTRL)
++#define MX35_PAD_STXD5__ARM11P_TOP_ARM_COREASID4              IOMUX_PAD(0x574, 0x130, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SRXD5__AUDMUX_AUD5_RXD                               IOMUX_PAD(0x578, 0x134, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SRXD5__SPDIF_SPDIF_IN1                               IOMUX_PAD(0x578, 0x134, 1, 0x998, 0, NO_PAD_CTRL)
++#define MX35_PAD_SRXD5__CSPI2_MISO                            IOMUX_PAD(0x578, 0x134, 2, 0x7e8, 0, NO_PAD_CTRL)
++#define MX35_PAD_SRXD5__GPIO1_1                                       IOMUX_PAD(0x578, 0x134, 5, 0x838, 1, NO_PAD_CTRL)
++#define MX35_PAD_SRXD5__ARM11P_TOP_ARM_COREASID5              IOMUX_PAD(0x578, 0x134, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SCK5__AUDMUX_AUD5_TXC                                IOMUX_PAD(0x57c, 0x138, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SCK5__SPDIF_SPDIF_EXTCLK                     IOMUX_PAD(0x57c, 0x138, 1, 0x994, 0, NO_PAD_CTRL)
++#define MX35_PAD_SCK5__CSPI2_SCLK                             IOMUX_PAD(0x57c, 0x138, 2, 0x7e0, 0, NO_PAD_CTRL)
++#define MX35_PAD_SCK5__GPIO1_2                                        IOMUX_PAD(0x57c, 0x138, 5, 0x848, 0, NO_PAD_CTRL)
++#define MX35_PAD_SCK5__ARM11P_TOP_ARM_COREASID6                       IOMUX_PAD(0x57c, 0x138, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_STXFS5__AUDMUX_AUD5_TXFS                     IOMUX_PAD(0x580, 0x13c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_STXFS5__CSPI2_RDY                            IOMUX_PAD(0x580, 0x13c, 2, 0x7e4, 0, NO_PAD_CTRL)
++#define MX35_PAD_STXFS5__GPIO1_3                              IOMUX_PAD(0x580, 0x13c, 5, 0x84c, 0, NO_PAD_CTRL)
++#define MX35_PAD_STXFS5__ARM11P_TOP_ARM_COREASID7             IOMUX_PAD(0x580, 0x13c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SCKR__ESAI_SCKR                              IOMUX_PAD(0x584, 0x140, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SCKR__GPIO1_4                                        IOMUX_PAD(0x584, 0x140, 5, 0x850, 1, NO_PAD_CTRL)
++#define MX35_PAD_SCKR__ARM11P_TOP_EVNTBUS_10                  IOMUX_PAD(0x584, 0x140, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FSR__ESAI_FSR                                        IOMUX_PAD(0x588, 0x144, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FSR__GPIO1_5                                 IOMUX_PAD(0x588, 0x144, 5, 0x854, 1, NO_PAD_CTRL)
++#define MX35_PAD_FSR__ARM11P_TOP_EVNTBUS_11                   IOMUX_PAD(0x588, 0x144, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_HCKR__ESAI_HCKR                              IOMUX_PAD(0x58c, 0x148, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_HCKR__AUDMUX_AUD5_RXFS                               IOMUX_PAD(0x58c, 0x148, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_HCKR__CSPI2_SS0                              IOMUX_PAD(0x58c, 0x148, 2, 0x7f0, 0, NO_PAD_CTRL)
++#define MX35_PAD_HCKR__IPU_FLASH_STROBE                               IOMUX_PAD(0x58c, 0x148, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_HCKR__GPIO1_6                                        IOMUX_PAD(0x58c, 0x148, 5, 0x858, 1, NO_PAD_CTRL)
++#define MX35_PAD_HCKR__ARM11P_TOP_EVNTBUS_12                  IOMUX_PAD(0x58c, 0x148, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SCKT__ESAI_SCKT                              IOMUX_PAD(0x590, 0x14c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SCKT__GPIO1_7                                        IOMUX_PAD(0x590, 0x14c, 5, 0x85c, 1, NO_PAD_CTRL)
++#define MX35_PAD_SCKT__IPU_CSI_D_0                            IOMUX_PAD(0x590, 0x14c, 6, 0x930, 0, NO_PAD_CTRL)
++#define MX35_PAD_SCKT__KPP_ROW_2                              IOMUX_PAD(0x590, 0x14c, 7, 0x978, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_FST__ESAI_FST                                        IOMUX_PAD(0x594, 0x150, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FST__GPIO1_8                                 IOMUX_PAD(0x594, 0x150, 5, 0x860, 1, NO_PAD_CTRL)
++#define MX35_PAD_FST__IPU_CSI_D_1                             IOMUX_PAD(0x594, 0x150, 6, 0x934, 0, NO_PAD_CTRL)
++#define MX35_PAD_FST__KPP_ROW_3                                       IOMUX_PAD(0x594, 0x150, 7, 0x97c, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_HCKT__ESAI_HCKT                              IOMUX_PAD(0x598, 0x154, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_HCKT__AUDMUX_AUD5_RXC                                IOMUX_PAD(0x598, 0x154, 1, 0x7a8, 0, NO_PAD_CTRL)
++#define MX35_PAD_HCKT__GPIO1_9                                        IOMUX_PAD(0x598, 0x154, 5, 0x864, 0, NO_PAD_CTRL)
++#define MX35_PAD_HCKT__IPU_CSI_D_2                            IOMUX_PAD(0x598, 0x154, 6, 0x938, 0, NO_PAD_CTRL)
++#define MX35_PAD_HCKT__KPP_COL_3                              IOMUX_PAD(0x598, 0x154, 7, 0x95c, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_TX5_RX0__ESAI_TX5_RX0                                IOMUX_PAD(0x59c, 0x158, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__AUDMUX_AUD4_RXC                     IOMUX_PAD(0x59c, 0x158, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__CSPI2_SS2                           IOMUX_PAD(0x59c, 0x158, 2, 0x7f8, 1, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__CAN2_TXCAN                          IOMUX_PAD(0x59c, 0x158, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__UART2_DTR                           IOMUX_PAD(0x59c, 0x158, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__GPIO1_10                            IOMUX_PAD(0x59c, 0x158, 5, 0x830, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX5_RX0__EMI_M3IF_CHOSEN_MASTER_0            IOMUX_PAD(0x59c, 0x158, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TX4_RX1__ESAI_TX4_RX1                                IOMUX_PAD(0x5a0, 0x15c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__AUDMUX_AUD4_RXFS                    IOMUX_PAD(0x5a0, 0x15c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__CSPI2_SS3                           IOMUX_PAD(0x5a0, 0x15c, 2, 0x7fc, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__CAN2_RXCAN                          IOMUX_PAD(0x5a0, 0x15c, 3, 0x7cc, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__UART2_DSR                           IOMUX_PAD(0x5a0, 0x15c, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__GPIO1_11                            IOMUX_PAD(0x5a0, 0x15c, 5, 0x834, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__IPU_CSI_D_3                         IOMUX_PAD(0x5a0, 0x15c, 6, 0x93c, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX4_RX1__KPP_ROW_0                           IOMUX_PAD(0x5a0, 0x15c, 7, 0x970, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_TX3_RX2__ESAI_TX3_RX2                                IOMUX_PAD(0x5a4, 0x160, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX3_RX2__I2C3_SCL                            IOMUX_PAD(0x5a4, 0x160, 1, 0x91c, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX3_RX2__EMI_NANDF_CE1                               IOMUX_PAD(0x5a4, 0x160, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX3_RX2__GPIO1_12                            IOMUX_PAD(0x5a4, 0x160, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX3_RX2__IPU_CSI_D_4                         IOMUX_PAD(0x5a4, 0x160, 6, 0x940, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX3_RX2__KPP_ROW_1                           IOMUX_PAD(0x5a4, 0x160, 7, 0x974, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_TX2_RX3__ESAI_TX2_RX3                                IOMUX_PAD(0x5a8, 0x164, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX2_RX3__I2C3_SDA                            IOMUX_PAD(0x5a8, 0x164, 1, 0x920, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX2_RX3__EMI_NANDF_CE2                               IOMUX_PAD(0x5a8, 0x164, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX2_RX3__GPIO1_13                            IOMUX_PAD(0x5a8, 0x164, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX2_RX3__IPU_CSI_D_5                         IOMUX_PAD(0x5a8, 0x164, 6, 0x944, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX2_RX3__KPP_COL_0                           IOMUX_PAD(0x5a8, 0x164, 7, 0x950, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_TX1__ESAI_TX1                                        IOMUX_PAD(0x5ac, 0x168, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX1__CCM_PMIC_RDY                            IOMUX_PAD(0x5ac, 0x168, 1, 0x7d4, 1, NO_PAD_CTRL)
++#define MX35_PAD_TX1__CSPI1_SS2                                       IOMUX_PAD(0x5ac, 0x168, 2, 0x7d8, 2, NO_PAD_CTRL)
++#define MX35_PAD_TX1__EMI_NANDF_CE3                           IOMUX_PAD(0x5ac, 0x168, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX1__UART2_RI                                        IOMUX_PAD(0x5ac, 0x168, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX1__GPIO1_14                                        IOMUX_PAD(0x5ac, 0x168, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX1__IPU_CSI_D_6                             IOMUX_PAD(0x5ac, 0x168, 6, 0x948, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX1__KPP_COL_1                                       IOMUX_PAD(0x5ac, 0x168, 7, 0x954, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_TX0__ESAI_TX0                                        IOMUX_PAD(0x5b0, 0x16c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX0__SPDIF_SPDIF_EXTCLK                      IOMUX_PAD(0x5b0, 0x16c, 1, 0x994, 1, NO_PAD_CTRL)
++#define MX35_PAD_TX0__CSPI1_SS3                                       IOMUX_PAD(0x5b0, 0x16c, 2, 0x7dc, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX0__EMI_DTACK_B                             IOMUX_PAD(0x5b0, 0x16c, 3, 0x800, 1, NO_PAD_CTRL)
++#define MX35_PAD_TX0__UART2_DCD                                       IOMUX_PAD(0x5b0, 0x16c, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX0__GPIO1_15                                        IOMUX_PAD(0x5b0, 0x16c, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TX0__IPU_CSI_D_7                             IOMUX_PAD(0x5b0, 0x16c, 6, 0x94c, 0, NO_PAD_CTRL)
++#define MX35_PAD_TX0__KPP_COL_2                                       IOMUX_PAD(0x5b0, 0x16c, 7, 0x958, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_MOSI__CSPI1_MOSI                               IOMUX_PAD(0x5b4, 0x170, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_MOSI__GPIO1_16                         IOMUX_PAD(0x5b4, 0x170, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_MOSI__ECT_CTI_TRIG_OUT1_2              IOMUX_PAD(0x5b4, 0x170, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_MISO__CSPI1_MISO                               IOMUX_PAD(0x5b8, 0x174, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_MISO__GPIO1_17                         IOMUX_PAD(0x5b8, 0x174, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_MISO__ECT_CTI_TRIG_OUT1_3              IOMUX_PAD(0x5b8, 0x174, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_SS0__CSPI1_SS0                         IOMUX_PAD(0x5bc, 0x178, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS0__OWIRE_LINE                                IOMUX_PAD(0x5bc, 0x178, 1, 0x990, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS0__CSPI2_SS3                         IOMUX_PAD(0x5bc, 0x178, 2, 0x7fc, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS0__GPIO1_18                          IOMUX_PAD(0x5bc, 0x178, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS0__ECT_CTI_TRIG_OUT1_4                       IOMUX_PAD(0x5bc, 0x178, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_SS1__CSPI1_SS1                         IOMUX_PAD(0x5c0, 0x17c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS1__PWM_PWMO                          IOMUX_PAD(0x5c0, 0x17c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS1__CCM_CLK32K                                IOMUX_PAD(0x5c0, 0x17c, 2, 0x7d0, 1, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS1__GPIO1_19                          IOMUX_PAD(0x5c0, 0x17c, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS1__IPU_DIAGB_29                      IOMUX_PAD(0x5c0, 0x17c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SS1__ECT_CTI_TRIG_OUT1_5                       IOMUX_PAD(0x5c0, 0x17c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_SCLK__CSPI1_SCLK                               IOMUX_PAD(0x5c4, 0x180, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SCLK__GPIO3_4                          IOMUX_PAD(0x5c4, 0x180, 5, 0x904, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SCLK__IPU_DIAGB_30                     IOMUX_PAD(0x5c4, 0x180, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SCLK__EMI_M3IF_CHOSEN_MASTER_1         IOMUX_PAD(0x5c4, 0x180, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CSPI1_SPI_RDY__CSPI1_RDY                     IOMUX_PAD(0x5c8, 0x184, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SPI_RDY__GPIO3_5                               IOMUX_PAD(0x5c8, 0x184, 5, 0x908, 0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SPI_RDY__IPU_DIAGB_31                  IOMUX_PAD(0x5c8, 0x184, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CSPI1_SPI_RDY__EMI_M3IF_CHOSEN_MASTER_2      IOMUX_PAD(0x5c8, 0x184, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RXD1__UART1_RXD_MUX                          IOMUX_PAD(0x5cc, 0x188, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RXD1__CSPI2_MOSI                             IOMUX_PAD(0x5cc, 0x188, 1, 0x7ec, 1, NO_PAD_CTRL)
++#define MX35_PAD_RXD1__KPP_COL_4                              IOMUX_PAD(0x5cc, 0x188, 4, 0x960, 0, NO_PAD_CTRL)
++#define MX35_PAD_RXD1__GPIO3_6                                        IOMUX_PAD(0x5cc, 0x188, 5, 0x90c, 0, NO_PAD_CTRL)
++#define MX35_PAD_RXD1__ARM11P_TOP_EVNTBUS_16                  IOMUX_PAD(0x5cc, 0x188, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TXD1__UART1_TXD_MUX                          IOMUX_PAD(0x5d0, 0x18c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TXD1__CSPI2_MISO                             IOMUX_PAD(0x5d0, 0x18c, 1, 0x7e8, 1, NO_PAD_CTRL)
++#define MX35_PAD_TXD1__KPP_COL_5                              IOMUX_PAD(0x5d0, 0x18c, 4, 0x964, 0, NO_PAD_CTRL)
++#define MX35_PAD_TXD1__GPIO3_7                                        IOMUX_PAD(0x5d0, 0x18c, 5, 0x910, 0, NO_PAD_CTRL)
++#define MX35_PAD_TXD1__ARM11P_TOP_EVNTBUS_17                  IOMUX_PAD(0x5d0, 0x18c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RTS1__UART1_RTS                              IOMUX_PAD(0x5d4, 0x190, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__CSPI2_SCLK                             IOMUX_PAD(0x5d4, 0x190, 1, 0x7e0, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__I2C3_SCL                                       IOMUX_PAD(0x5d4, 0x190, 2, 0x91c, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__IPU_CSI_D_0                            IOMUX_PAD(0x5d4, 0x190, 3, 0x930, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__KPP_COL_6                              IOMUX_PAD(0x5d4, 0x190, 4, 0x968, 0, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__GPIO3_8                                        IOMUX_PAD(0x5d4, 0x190, 5, 0x914, 0, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__EMI_NANDF_CE1                          IOMUX_PAD(0x5d4, 0x190, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RTS1__ARM11P_TOP_EVNTBUS_18                  IOMUX_PAD(0x5d4, 0x190, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CTS1__UART1_CTS                              IOMUX_PAD(0x5d8, 0x194, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__CSPI2_RDY                              IOMUX_PAD(0x5d8, 0x194, 1, 0x7e4, 1, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__I2C3_SDA                                       IOMUX_PAD(0x5d8, 0x194, 2, 0x920, 1, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__IPU_CSI_D_1                            IOMUX_PAD(0x5d8, 0x194, 3, 0x934, 1, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__KPP_COL_7                              IOMUX_PAD(0x5d8, 0x194, 4, 0x96c, 0, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__GPIO3_9                                        IOMUX_PAD(0x5d8, 0x194, 5, 0x918, 0, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__EMI_NANDF_CE2                          IOMUX_PAD(0x5d8, 0x194, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS1__ARM11P_TOP_EVNTBUS_19                  IOMUX_PAD(0x5d8, 0x194, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RXD2__UART2_RXD_MUX                          IOMUX_PAD(0x5dc, 0x198, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RXD2__KPP_ROW_4                              IOMUX_PAD(0x5dc, 0x198, 4, 0x980, 0, NO_PAD_CTRL)
++#define MX35_PAD_RXD2__GPIO3_10                                       IOMUX_PAD(0x5dc, 0x198, 5, 0x8ec, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_TXD2__UART2_TXD_MUX                          IOMUX_PAD(0x5e0, 0x19c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_TXD2__SPDIF_SPDIF_EXTCLK                     IOMUX_PAD(0x5e0, 0x19c, 1, 0x994, 2, NO_PAD_CTRL)
++#define MX35_PAD_TXD2__KPP_ROW_5                              IOMUX_PAD(0x5e0, 0x19c, 4, 0x984, 0, NO_PAD_CTRL)
++#define MX35_PAD_TXD2__GPIO3_11                                       IOMUX_PAD(0x5e0, 0x19c, 5, 0x8f0, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_RTS2__UART2_RTS                              IOMUX_PAD(0x5e4, 0x1a0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__SPDIF_SPDIF_IN1                                IOMUX_PAD(0x5e4, 0x1a0, 1, 0x998, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__CAN2_RXCAN                             IOMUX_PAD(0x5e4, 0x1a0, 2, 0x7cc, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__IPU_CSI_D_2                            IOMUX_PAD(0x5e4, 0x1a0, 3, 0x938, 1, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__KPP_ROW_6                              IOMUX_PAD(0x5e4, 0x1a0, 4, 0x988, 0, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__GPIO3_12                                       IOMUX_PAD(0x5e4, 0x1a0, 5, 0x8f4, 0, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__AUDMUX_AUD5_RXC                                IOMUX_PAD(0x5e4, 0x1a0, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_RTS2__UART3_RXD_MUX                          IOMUX_PAD(0x5e4, 0x1a0, 7, 0x9a0, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_CTS2__UART2_CTS                              IOMUX_PAD(0x5e8, 0x1a4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__SPDIF_SPDIF_OUT1                               IOMUX_PAD(0x5e8, 0x1a4, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__CAN2_TXCAN                             IOMUX_PAD(0x5e8, 0x1a4, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__IPU_CSI_D_3                            IOMUX_PAD(0x5e8, 0x1a4, 3, 0x93c, 1, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__KPP_ROW_7                              IOMUX_PAD(0x5e8, 0x1a4, 4, 0x98c, 0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__GPIO3_13                                       IOMUX_PAD(0x5e8, 0x1a4, 5, 0x8f8, 0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__AUDMUX_AUD5_RXFS                               IOMUX_PAD(0x5e8, 0x1a4, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CTS2__UART3_TXD_MUX                          IOMUX_PAD(0x5e8, 0x1a4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_RTCK__ARM11P_TOP_RTCK                                IOMUX_PAD(0x5ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TCK__SJC_TCK                                 IOMUX_PAD(0x5f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TMS__SJC_TMS                                 IOMUX_PAD(0x5f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TDI__SJC_TDI                                 IOMUX_PAD(0x5f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TDO__SJC_TDO                                 IOMUX_PAD(0x5fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TRSTB__SJC_TRSTB                             IOMUX_PAD(0x600, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_DE_B__SJC_DE_B                                       IOMUX_PAD(0x604, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SJC_MOD__SJC_MOD                             IOMUX_PAD(0x608, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_USBOTG_PWR__USB_TOP_USBOTG_PWR                       IOMUX_PAD(0x60c, 0x1a8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_USBOTG_PWR__USB_TOP_USBH2_PWR                        IOMUX_PAD(0x60c, 0x1a8, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_USBOTG_PWR__GPIO3_14                         IOMUX_PAD(0x60c, 0x1a8, 5, 0x8fc, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_USBOTG_OC__USB_TOP_USBOTG_OC                 IOMUX_PAD(0x610, 0x1ac, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_USBOTG_OC__USB_TOP_USBH2_OC                  IOMUX_PAD(0x610, 0x1ac, 1, 0x9f4, 1, NO_PAD_CTRL)
++#define MX35_PAD_USBOTG_OC__GPIO3_15                          IOMUX_PAD(0x610, 0x1ac, 5, 0x900, 0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD0__IPU_DISPB_DAT_0                         IOMUX_PAD(0x614, 0x1b0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD0__GPIO2_0                                 IOMUX_PAD(0x614, 0x1b0, 5, 0x868, 1, NO_PAD_CTRL)
++#define MX35_PAD_LD0__SDMA_SDMA_DEBUG_PC_0                    IOMUX_PAD(0x614, 0x1b0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD1__IPU_DISPB_DAT_1                         IOMUX_PAD(0x618, 0x1b4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD1__GPIO2_1                                 IOMUX_PAD(0x618, 0x1b4, 5, 0x894, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD1__SDMA_SDMA_DEBUG_PC_1                    IOMUX_PAD(0x618, 0x1b4, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD2__IPU_DISPB_DAT_2                         IOMUX_PAD(0x61c, 0x1b8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD2__GPIO2_2                                 IOMUX_PAD(0x61c, 0x1b8, 5, 0x8c0, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD2__SDMA_SDMA_DEBUG_PC_2                    IOMUX_PAD(0x61c, 0x1b8, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD3__IPU_DISPB_DAT_3                         IOMUX_PAD(0x620, 0x1bc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD3__GPIO2_3                                 IOMUX_PAD(0x620, 0x1bc, 5, 0x8cc, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD3__SDMA_SDMA_DEBUG_PC_3                    IOMUX_PAD(0x620, 0x1bc, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD4__IPU_DISPB_DAT_4                         IOMUX_PAD(0x624, 0x1c0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD4__GPIO2_4                                 IOMUX_PAD(0x624, 0x1c0, 5, 0x8d0, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD4__SDMA_SDMA_DEBUG_PC_4                    IOMUX_PAD(0x624, 0x1c0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD5__IPU_DISPB_DAT_5                         IOMUX_PAD(0x628, 0x1c4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD5__GPIO2_5                                 IOMUX_PAD(0x628, 0x1c4, 5, 0x8d4, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD5__SDMA_SDMA_DEBUG_PC_5                    IOMUX_PAD(0x628, 0x1c4, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD6__IPU_DISPB_DAT_6                         IOMUX_PAD(0x62c, 0x1c8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD6__GPIO2_6                                 IOMUX_PAD(0x62c, 0x1c8, 5, 0x8d8, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD6__SDMA_SDMA_DEBUG_PC_6                    IOMUX_PAD(0x62c, 0x1c8, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD7__IPU_DISPB_DAT_7                         IOMUX_PAD(0x630, 0x1cc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD7__GPIO2_7                                 IOMUX_PAD(0x630, 0x1cc, 5, 0x8dc, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD7__SDMA_SDMA_DEBUG_PC_7                    IOMUX_PAD(0x630, 0x1cc, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD8__IPU_DISPB_DAT_8                         IOMUX_PAD(0x634, 0x1d0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD8__GPIO2_8                                 IOMUX_PAD(0x634, 0x1d0, 5, 0x8e0, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD8__SDMA_SDMA_DEBUG_PC_8                    IOMUX_PAD(0x634, 0x1d0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD9__IPU_DISPB_DAT_9                         IOMUX_PAD(0x638, 0x1d4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD9__GPIO2_9                                 IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4  0, NO_PAD_CTRL)
++#define MX35_PAD_LD9__SDMA_SDMA_DEBUG_PC_9                    IOMUX_PAD(0x638, 0x1d4, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD10__IPU_DISPB_DAT_10                               IOMUX_PAD(0x63c, 0x1d8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD10__GPIO2_10                                       IOMUX_PAD(0x63c, 0x1d8, 5, 0x86c, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD10__SDMA_SDMA_DEBUG_PC_10                  IOMUX_PAD(0x63c, 0x1d8, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD11__IPU_DISPB_DAT_11                               IOMUX_PAD(0x640, 0x1dc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD11__GPIO2_11                                       IOMUX_PAD(0x640, 0x1dc, 5, 0x870, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD11__SDMA_SDMA_DEBUG_PC_11                  IOMUX_PAD(0x640, 0x1dc, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD11__ARM11P_TOP_TRACE_4                     IOMUX_PAD(0x640, 0x1dc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD12__IPU_DISPB_DAT_12                               IOMUX_PAD(0x644, 0x1e0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD12__GPIO2_12                                       IOMUX_PAD(0x644, 0x1e0, 5, 0x874, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD12__SDMA_SDMA_DEBUG_PC_12                  IOMUX_PAD(0x644, 0x1e0, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD12__ARM11P_TOP_TRACE_5                     IOMUX_PAD(0x644, 0x1e0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD13__IPU_DISPB_DAT_13                               IOMUX_PAD(0x648, 0x1e4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD13__GPIO2_13                                       IOMUX_PAD(0x648, 0x1e4, 5, 0x878, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD13__SDMA_SDMA_DEBUG_PC_13                  IOMUX_PAD(0x648, 0x1e4, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD13__ARM11P_TOP_TRACE_6                     IOMUX_PAD(0x648, 0x1e4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD14__IPU_DISPB_DAT_14                               IOMUX_PAD(0x64c, 0x1e8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD14__GPIO2_14                                       IOMUX_PAD(0x64c, 0x1e8, 5, 0x87c, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD14__SDMA_SDMA_DEBUG_EVENT_CHANNEL_0                IOMUX_PAD(0x64c, 0x1e8, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD14__ARM11P_TOP_TRACE_7                     IOMUX_PAD(0x64c, 0x1e8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD15__IPU_DISPB_DAT_15                               IOMUX_PAD(0x650, 0x1ec, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD15__GPIO2_15                                       IOMUX_PAD(0x650, 0x1ec, 5, 0x880, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD15__SDMA_SDMA_DEBUG_EVENT_CHANNEL_1                IOMUX_PAD(0x650, 0x1ec, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD15__ARM11P_TOP_TRACE_8                     IOMUX_PAD(0x650, 0x1ec, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD16__IPU_DISPB_DAT_16                               IOMUX_PAD(0x654, 0x1f0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD16__IPU_DISPB_D12_VSYNC                    IOMUX_PAD(0x654, 0x1f0, 2, 0x928, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD16__GPIO2_16                                       IOMUX_PAD(0x654, 0x1f0, 5, 0x884, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD16__SDMA_SDMA_DEBUG_EVENT_CHANNEL_2                IOMUX_PAD(0x654, 0x1f0, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD16__ARM11P_TOP_TRACE_9                     IOMUX_PAD(0x654, 0x1f0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD17__IPU_DISPB_DAT_17                               IOMUX_PAD(0x658, 0x1f4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD17__IPU_DISPB_CS2                          IOMUX_PAD(0x658, 0x1f4, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD17__GPIO2_17                                       IOMUX_PAD(0x658, 0x1f4, 5, 0x888, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD17__SDMA_SDMA_DEBUG_EVENT_CHANNEL_3                IOMUX_PAD(0x658, 0x1f4, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD17__ARM11P_TOP_TRACE_10                    IOMUX_PAD(0x658, 0x1f4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD18__IPU_DISPB_DAT_18                               IOMUX_PAD(0x65c, 0x1f8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD18__IPU_DISPB_D0_VSYNC                     IOMUX_PAD(0x65c, 0x1f8, 1, 0x924, 1, NO_PAD_CTRL)
++#define MX35_PAD_LD18__IPU_DISPB_D12_VSYNC                    IOMUX_PAD(0x65c, 0x1f8, 2, 0x928, 1, NO_PAD_CTRL)
++#define MX35_PAD_LD18__ESDHC3_CMD                             IOMUX_PAD(0x65c, 0x1f8, 3, 0x818, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD18__USB_TOP_USBOTG_DATA_3                  IOMUX_PAD(0x65c, 0x1f8, 4, 0x9b0, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD18__GPIO3_24                                       IOMUX_PAD(0x65c, 0x1f8, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD18__SDMA_SDMA_DEBUG_EVENT_CHANNEL_4                IOMUX_PAD(0x65c, 0x1f8, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD18__ARM11P_TOP_TRACE_11                    IOMUX_PAD(0x65c, 0x1f8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD19__IPU_DISPB_DAT_19                               IOMUX_PAD(0x660, 0x1fc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__IPU_DISPB_BCLK                         IOMUX_PAD(0x660, 0x1fc, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__IPU_DISPB_CS1                          IOMUX_PAD(0x660, 0x1fc, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__ESDHC3_CLK                             IOMUX_PAD(0x660, 0x1fc, 3, 0x814, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__USB_TOP_USBOTG_DIR                     IOMUX_PAD(0x660, 0x1fc, 4, 0x9c4, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__GPIO3_25                                       IOMUX_PAD(0x660, 0x1fc, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__SDMA_SDMA_DEBUG_EVENT_CHANNEL_5                IOMUX_PAD(0x660, 0x1fc, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD19__ARM11P_TOP_TRACE_12                    IOMUX_PAD(0x660, 0x1fc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD20__IPU_DISPB_DAT_20                               IOMUX_PAD(0x664, 0x200, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__IPU_DISPB_CS0                          IOMUX_PAD(0x664, 0x200, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__IPU_DISPB_SD_CLK                               IOMUX_PAD(0x664, 0x200, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__ESDHC3_DAT0                            IOMUX_PAD(0x664, 0x200, 3, 0x81c, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__GPIO3_26                                       IOMUX_PAD(0x664, 0x200, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__SDMA_SDMA_DEBUG_CORE_STATUS_3          IOMUX_PAD(0x664, 0x200, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD20__ARM11P_TOP_TRACE_13                    IOMUX_PAD(0x664, 0x200, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD21__IPU_DISPB_DAT_21                               IOMUX_PAD(0x668, 0x204, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__IPU_DISPB_PAR_RS                               IOMUX_PAD(0x668, 0x204, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__IPU_DISPB_SER_RS                               IOMUX_PAD(0x668, 0x204, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__ESDHC3_DAT1                            IOMUX_PAD(0x668, 0x204, 3, 0x820, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__USB_TOP_USBOTG_STP                     IOMUX_PAD(0x668, 0x204, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__GPIO3_27                                       IOMUX_PAD(0x668, 0x204, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__SDMA_DEBUG_EVENT_CHANNEL_SEL           IOMUX_PAD(0x668, 0x204, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD21__ARM11P_TOP_TRACE_14                    IOMUX_PAD(0x668, 0x204, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD22__IPU_DISPB_DAT_22                               IOMUX_PAD(0x66c, 0x208, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__IPU_DISPB_WR                           IOMUX_PAD(0x66c, 0x208, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__IPU_DISPB_SD_D_I                               IOMUX_PAD(0x66c, 0x208, 2, 0x92c, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__ESDHC3_DAT2                            IOMUX_PAD(0x66c, 0x208, 3, 0x824, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__USB_TOP_USBOTG_NXT                     IOMUX_PAD(0x66c, 0x208, 4, 0x9c8, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__GPIO3_28                                       IOMUX_PAD(0x66c, 0x208, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__SDMA_DEBUG_BUS_ERROR                   IOMUX_PAD(0x66c, 0x208, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD22__ARM11P_TOP_TRCTL                               IOMUX_PAD(0x66c, 0x208, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_LD23__IPU_DISPB_DAT_23                               IOMUX_PAD(0x670, 0x20c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__IPU_DISPB_RD                           IOMUX_PAD(0x670, 0x20c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__IPU_DISPB_SD_D_IO                      IOMUX_PAD(0x670, 0x20c, 2, 0x92c, 1, NO_PAD_CTRL)
++#define MX35_PAD_LD23__ESDHC3_DAT3                            IOMUX_PAD(0x670, 0x20c, 3, 0x828, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__USB_TOP_USBOTG_DATA_7                  IOMUX_PAD(0x670, 0x20c, 4, 0x9c0, 0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__GPIO3_29                                       IOMUX_PAD(0x670, 0x20c, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__SDMA_DEBUG_MATCHED_DMBUS                       IOMUX_PAD(0x670, 0x20c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_LD23__ARM11P_TOP_TRCLK                               IOMUX_PAD(0x670, 0x20c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_HSYNC__IPU_DISPB_D3_HSYNC                 IOMUX_PAD(0x674, 0x210, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_HSYNC__IPU_DISPB_SD_D_IO                  IOMUX_PAD(0x674, 0x210, 2, 0x92c, 2, NO_PAD_CTRL)
++#define MX35_PAD_D3_HSYNC__GPIO3_30                           IOMUX_PAD(0x674, 0x210, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_HSYNC__SDMA_DEBUG_RTBUFFER_WRITE          IOMUX_PAD(0x674, 0x210, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_HSYNC__ARM11P_TOP_TRACE_15                        IOMUX_PAD(0x674, 0x210, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_FPSHIFT__IPU_DISPB_D3_CLK                 IOMUX_PAD(0x678, 0x214, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_FPSHIFT__IPU_DISPB_SD_CLK                 IOMUX_PAD(0x678, 0x214, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_FPSHIFT__GPIO3_31                         IOMUX_PAD(0x678, 0x214, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_FPSHIFT__SDMA_SDMA_DEBUG_CORE_STATUS_0    IOMUX_PAD(0x678, 0x214, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_FPSHIFT__ARM11P_TOP_TRACE_16              IOMUX_PAD(0x678, 0x214, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_DRDY__IPU_DISPB_D3_DRDY                   IOMUX_PAD(0x67c, 0x218, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_DRDY__IPU_DISPB_SD_D_O                    IOMUX_PAD(0x67c, 0x218, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_DRDY__GPIO1_0                             IOMUX_PAD(0x67c, 0x218, 5, 0x82c, 2, NO_PAD_CTRL)
++#define MX35_PAD_D3_DRDY__SDMA_SDMA_DEBUG_CORE_STATUS_1               IOMUX_PAD(0x67c, 0x218, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_DRDY__ARM11P_TOP_TRACE_17                 IOMUX_PAD(0x67c, 0x218, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_CONTRAST__IPU_DISPB_CONTR                    IOMUX_PAD(0x680, 0x21c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CONTRAST__GPIO1_1                            IOMUX_PAD(0x680, 0x21c, 5, 0x838, 2, NO_PAD_CTRL)
++#define MX35_PAD_CONTRAST__SDMA_SDMA_DEBUG_CORE_STATUS_2      IOMUX_PAD(0x680, 0x21c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_CONTRAST__ARM11P_TOP_TRACE_18                        IOMUX_PAD(0x680, 0x21c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC                 IOMUX_PAD(0x684, 0x220, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_VSYNC__IPU_DISPB_CS1                      IOMUX_PAD(0x684, 0x220, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_VSYNC__GPIO1_2                            IOMUX_PAD(0x684, 0x220, 5, 0x848, 1, NO_PAD_CTRL)
++#define MX35_PAD_D3_VSYNC__SDMA_DEBUG_YIELD                   IOMUX_PAD(0x684, 0x220, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_VSYNC__ARM11P_TOP_TRACE_19                        IOMUX_PAD(0x684, 0x220, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_REV__IPU_DISPB_D3_REV                     IOMUX_PAD(0x688, 0x224, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_REV__IPU_DISPB_SER_RS                     IOMUX_PAD(0x688, 0x224, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_REV__GPIO1_3                              IOMUX_PAD(0x688, 0x224, 5, 0x84c, 1, NO_PAD_CTRL)
++#define MX35_PAD_D3_REV__SDMA_DEBUG_BUS_RWB                   IOMUX_PAD(0x688, 0x224, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_REV__ARM11P_TOP_TRACE_20                  IOMUX_PAD(0x688, 0x224, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS                     IOMUX_PAD(0x68c, 0x228, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_CLS__IPU_DISPB_CS2                                IOMUX_PAD(0x68c, 0x228, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_CLS__GPIO1_4                              IOMUX_PAD(0x68c, 0x228, 5, 0x850, 2, NO_PAD_CTRL)
++#define MX35_PAD_D3_CLS__SDMA_DEBUG_BUS_DEVICE_0              IOMUX_PAD(0x68c, 0x228, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_CLS__ARM11P_TOP_TRACE_21                  IOMUX_PAD(0x68c, 0x228, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_D3_SPL__IPU_DISPB_D3_SPL                     IOMUX_PAD(0x690, 0x22c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_SPL__IPU_DISPB_D12_VSYNC                  IOMUX_PAD(0x690, 0x22c, 2, 0x928, 2, NO_PAD_CTRL)
++#define MX35_PAD_D3_SPL__GPIO1_5                              IOMUX_PAD(0x690, 0x22c, 5, 0x854, 2, NO_PAD_CTRL)
++#define MX35_PAD_D3_SPL__SDMA_DEBUG_BUS_DEVICE_1              IOMUX_PAD(0x690, 0x22c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_D3_SPL__ARM11P_TOP_TRACE_22                  IOMUX_PAD(0x690, 0x22c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_CMD__ESDHC1_CMD                          IOMUX_PAD(0x694, 0x230, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CMD__MSHC_SCLK                           IOMUX_PAD(0x694, 0x230, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CMD__IPU_DISPB_D0_VSYNC                  IOMUX_PAD(0x694, 0x230, 3, 0x924, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CMD__USB_TOP_USBOTG_DATA_4                       IOMUX_PAD(0x694, 0x230, 4, 0x9b4, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CMD__GPIO1_6                             IOMUX_PAD(0x694, 0x230, 5, 0x858, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CMD__ARM11P_TOP_TRCTL                    IOMUX_PAD(0x694, 0x230, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_CLK__ESDHC1_CLK                          IOMUX_PAD(0x698, 0x234, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CLK__MSHC_BS                             IOMUX_PAD(0x698, 0x234, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CLK__IPU_DISPB_BCLK                      IOMUX_PAD(0x698, 0x234, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CLK__USB_TOP_USBOTG_DATA_5                       IOMUX_PAD(0x698, 0x234, 4, 0x9b8, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CLK__GPIO1_7                             IOMUX_PAD(0x698, 0x234, 5, 0x85c, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD1_CLK__ARM11P_TOP_TRCLK                    IOMUX_PAD(0x698, 0x234, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_DATA0__ESDHC1_DAT0                               IOMUX_PAD(0x69c, 0x238, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA0__MSHC_DATA_0                               IOMUX_PAD(0x69c, 0x238, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA0__IPU_DISPB_CS0                     IOMUX_PAD(0x69c, 0x238, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA0__USB_TOP_USBOTG_DATA_6             IOMUX_PAD(0x69c, 0x238, 4, 0x9bc, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA0__GPIO1_8                           IOMUX_PAD(0x69c, 0x238, 5, 0x860, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA0__ARM11P_TOP_TRACE_23                       IOMUX_PAD(0x69c, 0x238, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_DATA1__ESDHC1_DAT1                               IOMUX_PAD(0x6a0, 0x23c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA1__MSHC_DATA_1                               IOMUX_PAD(0x6a0, 0x23c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA1__IPU_DISPB_PAR_RS                  IOMUX_PAD(0x6a0, 0x23c, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA1__USB_TOP_USBOTG_DATA_0             IOMUX_PAD(0x6a0, 0x23c, 4, 0x9a4, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA1__GPIO1_9                           IOMUX_PAD(0x6a0, 0x23c, 5, 0x864, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA1__ARM11P_TOP_TRACE_24                       IOMUX_PAD(0x6a0, 0x23c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_DATA2__ESDHC1_DAT2                               IOMUX_PAD(0x6a4, 0x240, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA2__MSHC_DATA_2                               IOMUX_PAD(0x6a4, 0x240, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA2__IPU_DISPB_WR                      IOMUX_PAD(0x6a4, 0x240, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA2__USB_TOP_USBOTG_DATA_1             IOMUX_PAD(0x6a4, 0x240, 4, 0x9a8, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA2__GPIO1_10                          IOMUX_PAD(0x6a4, 0x240, 5, 0x830, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA2__ARM11P_TOP_TRACE_25                       IOMUX_PAD(0x6a4, 0x240, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD1_DATA3__ESDHC1_DAT3                               IOMUX_PAD(0x6a8, 0x244, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA3__MSHC_DATA_3                               IOMUX_PAD(0x6a8, 0x244, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA3__IPU_DISPB_RD                      IOMUX_PAD(0x6a8, 0x244, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA3__USB_TOP_USBOTG_DATA_2             IOMUX_PAD(0x6a8, 0x244, 4, 0x9ac, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA3__GPIO1_11                          IOMUX_PAD(0x6a8, 0x244, 5, 0x834, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD1_DATA3__ARM11P_TOP_TRACE_26                       IOMUX_PAD(0x6a8, 0x244, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_CMD__ESDHC2_CMD                          IOMUX_PAD(0x6ac, 0x248, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__I2C3_SCL                            IOMUX_PAD(0x6ac, 0x248, 1, 0x91c, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__ESDHC1_DAT4                         IOMUX_PAD(0x6ac, 0x248, 2, 0x804, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__IPU_CSI_D_2                         IOMUX_PAD(0x6ac, 0x248, 3, 0x938, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__USB_TOP_USBH2_DATA_4                        IOMUX_PAD(0x6ac, 0x248, 4, 0x9dc, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__GPIO2_0                             IOMUX_PAD(0x6ac, 0x248, 5, 0x868, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__SPDIF_SPDIF_OUT1                    IOMUX_PAD(0x6ac, 0x248, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CMD__IPU_DISPB_D12_VSYNC                 IOMUX_PAD(0x6ac, 0x248, 7, 0x928, 3, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_CLK__ESDHC2_CLK                          IOMUX_PAD(0x6b0, 0x24c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__I2C3_SDA                            IOMUX_PAD(0x6b0, 0x24c, 1, 0x920, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__ESDHC1_DAT5                         IOMUX_PAD(0x6b0, 0x24c, 2, 0x808, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__IPU_CSI_D_3                         IOMUX_PAD(0x6b0, 0x24c, 3, 0x93c, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__USB_TOP_USBH2_DATA_5                        IOMUX_PAD(0x6b0, 0x24c, 4, 0x9e0, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__GPIO2_1                             IOMUX_PAD(0x6b0, 0x24c, 5, 0x894, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__SPDIF_SPDIF_IN1                     IOMUX_PAD(0x6b0, 0x24c, 6, 0x998, 2, NO_PAD_CTRL)
++#define MX35_PAD_SD2_CLK__IPU_DISPB_CS2                               IOMUX_PAD(0x6b0, 0x24c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_DATA0__ESDHC2_DAT0                               IOMUX_PAD(0x6b4, 0x250, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__UART3_RXD_MUX                     IOMUX_PAD(0x6b4, 0x250, 1, 0x9a0, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__ESDHC1_DAT6                               IOMUX_PAD(0x6b4, 0x250, 2, 0x80c, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__IPU_CSI_D_4                               IOMUX_PAD(0x6b4, 0x250, 3, 0x940, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__USB_TOP_USBH2_DATA_6              IOMUX_PAD(0x6b4, 0x250, 4, 0x9e4, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__GPIO2_2                           IOMUX_PAD(0x6b4, 0x250, 5, 0x8c0, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA0__SPDIF_SPDIF_EXTCLK                        IOMUX_PAD(0x6b4, 0x250, 6, 0x994, 3, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_DATA1__ESDHC2_DAT1                               IOMUX_PAD(0x6b8, 0x254, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA1__UART3_TXD_MUX                     IOMUX_PAD(0x6b8, 0x254, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA1__ESDHC1_DAT7                               IOMUX_PAD(0x6b8, 0x254, 2, 0x810, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA1__IPU_CSI_D_5                               IOMUX_PAD(0x6b8, 0x254, 3, 0x944, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA1__USB_TOP_USBH2_DATA_0              IOMUX_PAD(0x6b8, 0x254, 4, 0x9cc, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA1__GPIO2_3                           IOMUX_PAD(0x6b8, 0x254, 5, 0x8cc, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_DATA2__ESDHC2_DAT2                               IOMUX_PAD(0x6bc, 0x258, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA2__UART3_RTS                         IOMUX_PAD(0x6bc, 0x258, 1, 0x99c, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA2__CAN1_RXCAN                                IOMUX_PAD(0x6bc, 0x258, 2, 0x7c8, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA2__IPU_CSI_D_6                               IOMUX_PAD(0x6bc, 0x258, 3, 0x948, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA2__USB_TOP_USBH2_DATA_1              IOMUX_PAD(0x6bc, 0x258, 4, 0x9d0, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA2__GPIO2_4                           IOMUX_PAD(0x6bc, 0x258, 5, 0x8d0, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_SD2_DATA3__ESDHC2_DAT3                               IOMUX_PAD(0x6c0, 0x25c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA3__UART3_CTS                         IOMUX_PAD(0x6c0, 0x25c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA3__CAN1_TXCAN                                IOMUX_PAD(0x6c0, 0x25c, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA3__IPU_CSI_D_7                               IOMUX_PAD(0x6c0, 0x25c, 3, 0x94c, 1, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA3__USB_TOP_USBH2_DATA_2              IOMUX_PAD(0x6c0, 0x25c, 4, 0x9d4, 0, NO_PAD_CTRL)
++#define MX35_PAD_SD2_DATA3__GPIO2_5                           IOMUX_PAD(0x6c0, 0x25c, 5, 0x8d4, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_CS0__ATA_CS0                             IOMUX_PAD(0x6c4, 0x260, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS0__CSPI1_SS3                           IOMUX_PAD(0x6c4, 0x260, 1, 0x7dc, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS0__IPU_DISPB_CS1                               IOMUX_PAD(0x6c4, 0x260, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS0__GPIO2_6                             IOMUX_PAD(0x6c4, 0x260, 5, 0x8d8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS0__IPU_DIAGB_0                         IOMUX_PAD(0x6c4, 0x260, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS0__ARM11P_TOP_MAX1_HMASTER_0           IOMUX_PAD(0x6c4, 0x260, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_CS1__ATA_CS1                             IOMUX_PAD(0x6c8, 0x264, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS1__IPU_DISPB_CS2                               IOMUX_PAD(0x6c8, 0x264, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS1__CSPI2_SS0                           IOMUX_PAD(0x6c8, 0x264, 4, 0x7f0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS1__GPIO2_7                             IOMUX_PAD(0x6c8, 0x264, 5, 0x8dc, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS1__IPU_DIAGB_1                         IOMUX_PAD(0x6c8, 0x264, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_CS1__ARM11P_TOP_MAX1_HMASTER_1           IOMUX_PAD(0x6c8, 0x264, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DIOR__ATA_DIOR                           IOMUX_PAD(0x6cc, 0x268, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__ESDHC3_DAT0                                IOMUX_PAD(0x6cc, 0x268, 1, 0x81c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__USB_TOP_USBOTG_DIR                 IOMUX_PAD(0x6cc, 0x268, 2, 0x9c4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__IPU_DISPB_BE0                      IOMUX_PAD(0x6cc, 0x268, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__CSPI2_SS1                          IOMUX_PAD(0x6cc, 0x268, 4, 0x7f4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__GPIO2_8                            IOMUX_PAD(0x6cc, 0x268, 5, 0x8e0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__IPU_DIAGB_2                                IOMUX_PAD(0x6cc, 0x268, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOR__ARM11P_TOP_MAX1_HMASTER_2          IOMUX_PAD(0x6cc, 0x268, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DIOW__ATA_DIOW                           IOMUX_PAD(0x6d0, 0x26c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__ESDHC3_DAT1                                IOMUX_PAD(0x6d0, 0x26c, 1, 0x820, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__USB_TOP_USBOTG_STP                 IOMUX_PAD(0x6d0, 0x26c, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__IPU_DISPB_BE1                      IOMUX_PAD(0x6d0, 0x26c, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__CSPI2_MOSI                         IOMUX_PAD(0x6d0, 0x26c, 4, 0x7ec, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__GPIO2_9                            IOMUX_PAD(0x6d0, 0x26c, 5, 0x8e4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__IPU_DIAGB_3                                IOMUX_PAD(0x6d0, 0x26c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DIOW__ARM11P_TOP_MAX1_HMASTER_3          IOMUX_PAD(0x6d0, 0x26c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DMACK__ATA_DMACK                         IOMUX_PAD(0x6d4, 0x270, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__ESDHC3_DAT2                               IOMUX_PAD(0x6d4, 0x270, 1, 0x824, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__USB_TOP_USBOTG_NXT                        IOMUX_PAD(0x6d4, 0x270, 2, 0x9c8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__CSPI2_MISO                                IOMUX_PAD(0x6d4, 0x270, 4, 0x7e8, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__GPIO2_10                          IOMUX_PAD(0x6d4, 0x270, 5, 0x86c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__IPU_DIAGB_4                               IOMUX_PAD(0x6d4, 0x270, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMACK__ARM11P_TOP_MAX0_HMASTER_0         IOMUX_PAD(0x6d4, 0x270, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_RESET_B__ATA_RESET_B                     IOMUX_PAD(0x6d8, 0x274, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__ESDHC3_DAT3                     IOMUX_PAD(0x6d8, 0x274, 1, 0x828, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__USB_TOP_USBOTG_DATA_0           IOMUX_PAD(0x6d8, 0x274, 2, 0x9a4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__IPU_DISPB_SD_D_O                        IOMUX_PAD(0x6d8, 0x274, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__CSPI2_RDY                               IOMUX_PAD(0x6d8, 0x274, 4, 0x7e4, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__GPIO2_11                                IOMUX_PAD(0x6d8, 0x274, 5, 0x870, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__IPU_DIAGB_5                     IOMUX_PAD(0x6d8, 0x274, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_RESET_B__ARM11P_TOP_MAX0_HMASTER_1               IOMUX_PAD(0x6d8, 0x274, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_IORDY__ATA_IORDY                         IOMUX_PAD(0x6dc, 0x278, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__ESDHC3_DAT4                               IOMUX_PAD(0x6dc, 0x278, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__USB_TOP_USBOTG_DATA_1             IOMUX_PAD(0x6dc, 0x278, 2, 0x9a8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__IPU_DISPB_SD_D_IO                 IOMUX_PAD(0x6dc, 0x278, 3, 0x92c, 3, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__ESDHC2_DAT4                               IOMUX_PAD(0x6dc, 0x278, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__GPIO2_12                          IOMUX_PAD(0x6dc, 0x278, 5, 0x874, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__IPU_DIAGB_6                               IOMUX_PAD(0x6dc, 0x278, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_IORDY__ARM11P_TOP_MAX0_HMASTER_2         IOMUX_PAD(0x6dc, 0x278, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA0__ATA_DATA_0                                IOMUX_PAD(0x6e0, 0x27c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__ESDHC3_DAT5                               IOMUX_PAD(0x6e0, 0x27c, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__USB_TOP_USBOTG_DATA_2             IOMUX_PAD(0x6e0, 0x27c, 2, 0x9ac, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__IPU_DISPB_D12_VSYNC                       IOMUX_PAD(0x6e0, 0x27c, 3, 0x928, 4, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__ESDHC2_DAT5                               IOMUX_PAD(0x6e0, 0x27c, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__GPIO2_13                          IOMUX_PAD(0x6e0, 0x27c, 5, 0x878, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__IPU_DIAGB_7                               IOMUX_PAD(0x6e0, 0x27c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA0__ARM11P_TOP_MAX0_HMASTER_3         IOMUX_PAD(0x6e0, 0x27c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA1__ATA_DATA_1                                IOMUX_PAD(0x6e4, 0x280, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__ESDHC3_DAT6                               IOMUX_PAD(0x6e4, 0x280, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__USB_TOP_USBOTG_DATA_3             IOMUX_PAD(0x6e4, 0x280, 2, 0x9b0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__IPU_DISPB_SD_CLK                  IOMUX_PAD(0x6e4, 0x280, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__ESDHC2_DAT6                               IOMUX_PAD(0x6e4, 0x280, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__GPIO2_14                          IOMUX_PAD(0x6e4, 0x280, 5, 0x87c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__IPU_DIAGB_8                               IOMUX_PAD(0x6e4, 0x280, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA1__ARM11P_TOP_TRACE_27                       IOMUX_PAD(0x6e4, 0x280, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA2__ATA_DATA_2                                IOMUX_PAD(0x6e8, 0x284, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__ESDHC3_DAT7                               IOMUX_PAD(0x6e8, 0x284, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__USB_TOP_USBOTG_DATA_4             IOMUX_PAD(0x6e8, 0x284, 2, 0x9b4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__IPU_DISPB_SER_RS                  IOMUX_PAD(0x6e8, 0x284, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__ESDHC2_DAT7                               IOMUX_PAD(0x6e8, 0x284, 4, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__GPIO2_15                          IOMUX_PAD(0x6e8, 0x284, 5, 0x880, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__IPU_DIAGB_9                               IOMUX_PAD(0x6e8, 0x284, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA2__ARM11P_TOP_TRACE_28                       IOMUX_PAD(0x6e8, 0x284, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA3__ATA_DATA_3                                IOMUX_PAD(0x6e8, 0x288, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__ESDHC3_CLK                                IOMUX_PAD(0x6e8, 0x288, 1, 0x814, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__USB_TOP_USBOTG_DATA_5             IOMUX_PAD(0x6e8, 0x288, 2, 0x9b8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__CSPI2_SCLK                                IOMUX_PAD(0x6e8, 0x288, 4, 0x7e0, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__GPIO2_16                          IOMUX_PAD(0x6e8, 0x288, 5, 0x884, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__IPU_DIAGB_10                      IOMUX_PAD(0x6e8, 0x288, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA3__ARM11P_TOP_TRACE_29                       IOMUX_PAD(0x6e8, 0x288, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA4__ATA_DATA_4                                IOMUX_PAD(0x6f0, 0x28c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA4__ESDHC3_CMD                                IOMUX_PAD(0x6f0, 0x28c, 1, 0x818, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA4__USB_TOP_USBOTG_DATA_6             IOMUX_PAD(0x6f0, 0x28c, 2, 0x9bc, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA4__GPIO2_17                          IOMUX_PAD(0x6f0, 0x28c, 5, 0x888, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA4__IPU_DIAGB_11                      IOMUX_PAD(0x6f0, 0x28c, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA4__ARM11P_TOP_TRACE_30                       IOMUX_PAD(0x6f0, 0x28c, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA5__ATA_DATA_5                                IOMUX_PAD(0x6f4, 0x290, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA5__USB_TOP_USBOTG_DATA_7             IOMUX_PAD(0x6f4, 0x290, 2, 0x9c0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA5__GPIO2_18                          IOMUX_PAD(0x6f4, 0x290, 5, 0x88c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA5__IPU_DIAGB_12                      IOMUX_PAD(0x6f4, 0x290, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA5__ARM11P_TOP_TRACE_31                       IOMUX_PAD(0x6f4, 0x290, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA6__ATA_DATA_6                                IOMUX_PAD(0x6f8, 0x294, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA6__CAN1_TXCAN                                IOMUX_PAD(0x6f8, 0x294, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA6__UART1_DTR                         IOMUX_PAD(0x6f8, 0x294, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA6__AUDMUX_AUD6_TXD                   IOMUX_PAD(0x6f8, 0x294, 3, 0x7b4, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA6__GPIO2_19                          IOMUX_PAD(0x6f8, 0x294, 5, 0x890, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA6__IPU_DIAGB_13                      IOMUX_PAD(0x6f8, 0x294, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA7__ATA_DATA_7                                IOMUX_PAD(0x6fc, 0x298, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA7__CAN1_RXCAN                                IOMUX_PAD(0x6fc, 0x298, 1, 0x7c8, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA7__UART1_DSR                         IOMUX_PAD(0x6fc, 0x298, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA7__AUDMUX_AUD6_RXD                   IOMUX_PAD(0x6fc, 0x298, 3, 0x7b0, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA7__GPIO2_20                          IOMUX_PAD(0x6fc, 0x298, 5, 0x898, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA7__IPU_DIAGB_14                      IOMUX_PAD(0x6fc, 0x298, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA8__ATA_DATA_8                                IOMUX_PAD(0x700, 0x29c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA8__UART3_RTS                         IOMUX_PAD(0x700, 0x29c, 1, 0x99c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA8__UART1_RI                          IOMUX_PAD(0x700, 0x29c, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA8__AUDMUX_AUD6_TXC                   IOMUX_PAD(0x700, 0x29c, 3, 0x7c0, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA8__GPIO2_21                          IOMUX_PAD(0x700, 0x29c, 5, 0x89c, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA8__IPU_DIAGB_15                      IOMUX_PAD(0x700, 0x29c, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA9__ATA_DATA_9                                IOMUX_PAD(0x704, 0x2a0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA9__UART3_CTS                         IOMUX_PAD(0x704, 0x2a0, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA9__UART1_DCD                         IOMUX_PAD(0x704, 0x2a0, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA9__AUDMUX_AUD6_TXFS                  IOMUX_PAD(0x704, 0x2a0, 3, 0x7c4, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA9__GPIO2_22                          IOMUX_PAD(0x704, 0x2a0, 5, 0x8a0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA9__IPU_DIAGB_16                      IOMUX_PAD(0x704, 0x2a0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA10__ATA_DATA_10                      IOMUX_PAD(0x708, 0x2a4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA10__UART3_RXD_MUX                    IOMUX_PAD(0x708, 0x2a4, 1, 0x9a0, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA10__AUDMUX_AUD6_RXC                  IOMUX_PAD(0x708, 0x2a4, 3, 0x7b8, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA10__GPIO2_23                         IOMUX_PAD(0x708, 0x2a4, 5, 0x8a4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA10__IPU_DIAGB_17                     IOMUX_PAD(0x708, 0x2a4, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA11__ATA_DATA_11                      IOMUX_PAD(0x70c, 0x2a8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA11__UART3_TXD_MUX                    IOMUX_PAD(0x70c, 0x2a8, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA11__AUDMUX_AUD6_RXFS                 IOMUX_PAD(0x70c, 0x2a8, 3, 0x7bc, 0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA11__GPIO2_24                         IOMUX_PAD(0x70c, 0x2a8, 5, 0x8a8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA11__IPU_DIAGB_18                     IOMUX_PAD(0x70c, 0x2a8, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA12__ATA_DATA_12                      IOMUX_PAD(0x710, 0x2ac, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA12__I2C3_SCL                         IOMUX_PAD(0x710, 0x2ac, 1, 0x91c, 3, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA12__GPIO2_25                         IOMUX_PAD(0x710, 0x2ac, 5, 0x8ac, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA12__IPU_DIAGB_19                     IOMUX_PAD(0x710, 0x2ac, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA13__ATA_DATA_13                      IOMUX_PAD(0x714, 0x2b0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA13__I2C3_SDA                         IOMUX_PAD(0x714, 0x2b0, 1, 0x920, 3, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA13__GPIO2_26                         IOMUX_PAD(0x714, 0x2b0, 5, 0x8b0, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA13__IPU_DIAGB_20                     IOMUX_PAD(0x714, 0x2b0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA14__ATA_DATA_14                      IOMUX_PAD(0x718, 0x2b4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA14__IPU_CSI_D_0                      IOMUX_PAD(0x718, 0x2b4, 1, 0x930, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA14__KPP_ROW_0                                IOMUX_PAD(0x718, 0x2b4, 3, 0x970, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA14__GPIO2_27                         IOMUX_PAD(0x718, 0x2b4, 5, 0x8b4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA14__IPU_DIAGB_21                     IOMUX_PAD(0x718, 0x2b4, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DATA15__ATA_DATA_15                      IOMUX_PAD(0x71c, 0x2b8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA15__IPU_CSI_D_1                      IOMUX_PAD(0x71c, 0x2b8, 1, 0x934, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA15__KPP_ROW_1                                IOMUX_PAD(0x71c, 0x2b8, 3, 0x974, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA15__GPIO2_28                         IOMUX_PAD(0x71c, 0x2b8, 5, 0x8b8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DATA15__IPU_DIAGB_22                     IOMUX_PAD(0x71c, 0x2b8, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_INTRQ__ATA_INTRQ                         IOMUX_PAD(0x720, 0x2bc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_INTRQ__IPU_CSI_D_2                               IOMUX_PAD(0x720, 0x2bc, 1, 0x938, 3, NO_PAD_CTRL)
++#define MX35_PAD_ATA_INTRQ__KPP_ROW_2                         IOMUX_PAD(0x720, 0x2bc, 3, 0x978, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_INTRQ__GPIO2_29                          IOMUX_PAD(0x720, 0x2bc, 5, 0x8bc, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_INTRQ__IPU_DIAGB_23                      IOMUX_PAD(0x720, 0x2bc, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_BUFF_EN__ATA_BUFFER_EN                   IOMUX_PAD(0x724, 0x2c0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_BUFF_EN__IPU_CSI_D_3                     IOMUX_PAD(0x724, 0x2c0, 1, 0x93c, 3, NO_PAD_CTRL)
++#define MX35_PAD_ATA_BUFF_EN__KPP_ROW_3                               IOMUX_PAD(0x724, 0x2c0, 3, 0x97c, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_BUFF_EN__GPIO2_30                                IOMUX_PAD(0x724, 0x2c0, 5, 0x8c4, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_BUFF_EN__IPU_DIAGB_24                    IOMUX_PAD(0x724, 0x2c0, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DMARQ__ATA_DMARQ                         IOMUX_PAD(0x728, 0x2c4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMARQ__IPU_CSI_D_4                               IOMUX_PAD(0x728, 0x2c4, 1, 0x940, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMARQ__KPP_COL_0                         IOMUX_PAD(0x728, 0x2c4, 3, 0x950, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMARQ__GPIO2_31                          IOMUX_PAD(0x728, 0x2c4, 5, 0x8c8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMARQ__IPU_DIAGB_25                      IOMUX_PAD(0x728, 0x2c4, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DMARQ__ECT_CTI_TRIG_IN1_4                        IOMUX_PAD(0x728, 0x2c4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DA0__ATA_DA_0                            IOMUX_PAD(0x72c, 0x2c8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA0__IPU_CSI_D_5                         IOMUX_PAD(0x72c, 0x2c8, 1, 0x944, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA0__KPP_COL_1                           IOMUX_PAD(0x72c, 0x2c8, 3, 0x954, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA0__GPIO3_0                             IOMUX_PAD(0x72c, 0x2c8, 5, 0x8e8, 1, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA0__IPU_DIAGB_26                                IOMUX_PAD(0x72c, 0x2c8, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA0__ECT_CTI_TRIG_IN1_5                  IOMUX_PAD(0x72c, 0x2c8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DA1__ATA_DA_1                            IOMUX_PAD(0x730, 0x2cc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA1__IPU_CSI_D_6                         IOMUX_PAD(0x730, 0x2cc, 1, 0x948, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA1__KPP_COL_2                           IOMUX_PAD(0x730, 0x2cc, 3, 0x958, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA1__GPIO3_1                             IOMUX_PAD(0x730, 0x2cc, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA1__IPU_DIAGB_27                                IOMUX_PAD(0x730, 0x2cc, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA1__ECT_CTI_TRIG_IN1_6                  IOMUX_PAD(0x730, 0x2cc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_ATA_DA2__ATA_DA_2                            IOMUX_PAD(0x734, 0x2d0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA2__IPU_CSI_D_7                         IOMUX_PAD(0x734, 0x2d0, 1, 0x94c, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA2__KPP_COL_3                           IOMUX_PAD(0x734, 0x2d0, 3, 0x95c, 2, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA2__GPIO3_2                             IOMUX_PAD(0x734, 0x2d0, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA2__IPU_DIAGB_28                                IOMUX_PAD(0x734, 0x2d0, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_ATA_DA2__ECT_CTI_TRIG_IN1_7                  IOMUX_PAD(0x734, 0x2d0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_MLB_CLK__MLB_MLBCLK                          IOMUX_PAD(0x738, 0x2d4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_MLB_CLK__GPIO3_3                             IOMUX_PAD(0x738, 0x2d4, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_MLB_DAT__MLB_MLBDAT                          IOMUX_PAD(0x73c, 0x2d8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_MLB_DAT__GPIO3_4                             IOMUX_PAD(0x73c, 0x2d8, 5, 0x904, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_MLB_SIG__MLB_MLBSIG                          IOMUX_PAD(0x740, 0x2dc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_MLB_SIG__GPIO3_5                             IOMUX_PAD(0x740, 0x2dc, 5, 0x908, 1, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TX_CLK__FEC_TX_CLK                               IOMUX_PAD(0x744, 0x2e0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__ESDHC1_DAT4                      IOMUX_PAD(0x744, 0x2e0, 1, 0x804, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__UART3_RXD_MUX                    IOMUX_PAD(0x744, 0x2e0, 2, 0x9a0, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__USB_TOP_USBH2_DIR                        IOMUX_PAD(0x744, 0x2e0, 3, 0x9ec, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__CSPI2_MOSI                               IOMUX_PAD(0x744, 0x2e0, 4, 0x7ec, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__GPIO3_6                          IOMUX_PAD(0x744, 0x2e0, 5, 0x90c, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__IPU_DISPB_D12_VSYNC              IOMUX_PAD(0x744, 0x2e0, 6, 0x928, 5, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_CLK__ARM11P_TOP_EVNTBUS_0             IOMUX_PAD(0x744, 0x2e0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RX_CLK__FEC_RX_CLK                               IOMUX_PAD(0x748, 0x2e4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__ESDHC1_DAT5                      IOMUX_PAD(0x748, 0x2e4, 1, 0x808, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__UART3_TXD_MUX                    IOMUX_PAD(0x748, 0x2e4, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__USB_TOP_USBH2_STP                        IOMUX_PAD(0x748, 0x2e4, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__CSPI2_MISO                               IOMUX_PAD(0x748, 0x2e4, 4, 0x7e8, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__GPIO3_7                          IOMUX_PAD(0x748, 0x2e4, 5, 0x910, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__IPU_DISPB_SD_D_I                 IOMUX_PAD(0x748, 0x2e4, 6, 0x92c, 4, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_CLK__ARM11P_TOP_EVNTBUS_1             IOMUX_PAD(0x748, 0x2e4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RX_DV__FEC_RX_DV                         IOMUX_PAD(0x74c, 0x2e8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__ESDHC1_DAT6                               IOMUX_PAD(0x74c, 0x2e8, 1, 0x80c, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__UART3_RTS                         IOMUX_PAD(0x74c, 0x2e8, 2, 0x99c, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__USB_TOP_USBH2_NXT                 IOMUX_PAD(0x74c, 0x2e8, 3, 0x9f0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__CSPI2_SCLK                                IOMUX_PAD(0x74c, 0x2e8, 4, 0x7e0, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__GPIO3_8                           IOMUX_PAD(0x74c, 0x2e8, 5, 0x914, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__IPU_DISPB_SD_CLK                  IOMUX_PAD(0x74c, 0x2e8, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_DV__ARM11P_TOP_EVNTBUS_2              IOMUX_PAD(0x74c, 0x2e8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_COL__FEC_COL                             IOMUX_PAD(0x750, 0x2ec, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__ESDHC1_DAT7                         IOMUX_PAD(0x750, 0x2ec, 1, 0x810, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__UART3_CTS                           IOMUX_PAD(0x750, 0x2ec, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__USB_TOP_USBH2_DATA_0                        IOMUX_PAD(0x750, 0x2ec, 3, 0x9cc, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__CSPI2_RDY                           IOMUX_PAD(0x750, 0x2ec, 4, 0x7e4, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__GPIO3_9                             IOMUX_PAD(0x750, 0x2ec, 5, 0x918, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__IPU_DISPB_SER_RS                    IOMUX_PAD(0x750, 0x2ec, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_COL__ARM11P_TOP_EVNTBUS_3                        IOMUX_PAD(0x750, 0x2ec, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RDATA0__FEC_RDATA_0                      IOMUX_PAD(0x754, 0x2f0, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__PWM_PWMO                         IOMUX_PAD(0x754, 0x2f0, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__UART3_DTR                                IOMUX_PAD(0x754, 0x2f0, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__USB_TOP_USBH2_DATA_1             IOMUX_PAD(0x754, 0x2f0, 3, 0x9d0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__CSPI2_SS0                                IOMUX_PAD(0x754, 0x2f0, 4, 0x7f0, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__GPIO3_10                         IOMUX_PAD(0x754, 0x2f0, 5, 0x8ec, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__IPU_DISPB_CS1                    IOMUX_PAD(0x754, 0x2f0, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA0__ARM11P_TOP_EVNTBUS_4             IOMUX_PAD(0x754, 0x2f0, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TDATA0__FEC_TDATA_0                      IOMUX_PAD(0x758, 0x2f4, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__SPDIF_SPDIF_OUT1                 IOMUX_PAD(0x758, 0x2f4, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__UART3_DSR                                IOMUX_PAD(0x758, 0x2f4, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__USB_TOP_USBH2_DATA_2             IOMUX_PAD(0x758, 0x2f4, 3, 0x9d4, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__CSPI2_SS1                                IOMUX_PAD(0x758, 0x2f4, 4, 0x7f4, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__GPIO3_11                         IOMUX_PAD(0x758, 0x2f4, 5, 0x8f0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__IPU_DISPB_CS0                    IOMUX_PAD(0x758, 0x2f4, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA0__ARM11P_TOP_EVNTBUS_5             IOMUX_PAD(0x758, 0x2f4, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TX_EN__FEC_TX_EN                         IOMUX_PAD(0x75c, 0x2f8, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__SPDIF_SPDIF_IN1                   IOMUX_PAD(0x75c, 0x2f8, 1, 0x998, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__UART3_RI                          IOMUX_PAD(0x75c, 0x2f8, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__USB_TOP_USBH2_DATA_3              IOMUX_PAD(0x75c, 0x2f8, 3, 0x9d8, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__GPIO3_12                          IOMUX_PAD(0x75c, 0x2f8, 5, 0x8f4, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__IPU_DISPB_PAR_RS                  IOMUX_PAD(0x75c, 0x2f8, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_EN__ARM11P_TOP_EVNTBUS_6              IOMUX_PAD(0x75c, 0x2f8, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_MDC__FEC_MDC                             IOMUX_PAD(0x760, 0x2fc, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__CAN2_TXCAN                          IOMUX_PAD(0x760, 0x2fc, 1, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__UART3_DCD                           IOMUX_PAD(0x760, 0x2fc, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__USB_TOP_USBH2_DATA_4                        IOMUX_PAD(0x760, 0x2fc, 3, 0x9dc, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__GPIO3_13                            IOMUX_PAD(0x760, 0x2fc, 5, 0x8f8, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__IPU_DISPB_WR                                IOMUX_PAD(0x760, 0x2fc, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDC__ARM11P_TOP_EVNTBUS_7                        IOMUX_PAD(0x760, 0x2fc, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_MDIO__FEC_MDIO                           IOMUX_PAD(0x764, 0x300, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDIO__CAN2_RXCAN                         IOMUX_PAD(0x764, 0x300, 1, 0x7cc, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDIO__USB_TOP_USBH2_DATA_5                       IOMUX_PAD(0x764, 0x300, 3, 0x9e0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDIO__GPIO3_14                           IOMUX_PAD(0x764, 0x300, 5, 0x8fc, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDIO__IPU_DISPB_RD                               IOMUX_PAD(0x764, 0x300, 6, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_MDIO__ARM11P_TOP_EVNTBUS_8                       IOMUX_PAD(0x764, 0x300, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TX_ERR__FEC_TX_ERR                               IOMUX_PAD(0x768, 0x304, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__OWIRE_LINE                               IOMUX_PAD(0x768, 0x304, 1, 0x990, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__SPDIF_SPDIF_EXTCLK                       IOMUX_PAD(0x768, 0x304, 2, 0x994, 4, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__USB_TOP_USBH2_DATA_6             IOMUX_PAD(0x768, 0x304, 3, 0x9e4, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__GPIO3_15                         IOMUX_PAD(0x768, 0x304, 5, 0x900, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__IPU_DISPB_D0_VSYNC                       IOMUX_PAD(0x768, 0x304, 6, 0x924, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TX_ERR__ARM11P_TOP_EVNTBUS_9             IOMUX_PAD(0x768, 0x304, 7, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RX_ERR__FEC_RX_ERR                               IOMUX_PAD(0x76c, 0x308, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_ERR__IPU_CSI_D_0                      IOMUX_PAD(0x76c, 0x308, 1, 0x930, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_ERR__USB_TOP_USBH2_DATA_7             IOMUX_PAD(0x76c, 0x308, 3, 0x9e8, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_ERR__KPP_COL_4                                IOMUX_PAD(0x76c, 0x308, 4, 0x960, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_ERR__GPIO3_16                         IOMUX_PAD(0x76c, 0x308, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RX_ERR__IPU_DISPB_SD_D_IO                        IOMUX_PAD(0x76c, 0x308, 6, 0x92c, 5, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_CRS__FEC_CRS                             IOMUX_PAD(0x770, 0x30c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_CRS__IPU_CSI_D_1                         IOMUX_PAD(0x770, 0x30c, 1, 0x934, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_CRS__USB_TOP_USBH2_PWR                   IOMUX_PAD(0x770, 0x30c, 3, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_CRS__KPP_COL_5                           IOMUX_PAD(0x770, 0x30c, 4, 0x964, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_CRS__GPIO3_17                            IOMUX_PAD(0x770, 0x30c, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_CRS__IPU_FLASH_STROBE                    IOMUX_PAD(0x770, 0x30c, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RDATA1__FEC_RDATA_1                      IOMUX_PAD(0x774, 0x310, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__IPU_CSI_D_2                      IOMUX_PAD(0x774, 0x310, 1, 0x938, 4, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__AUDMUX_AUD6_RXC                  IOMUX_PAD(0x774, 0x310, 2, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__USB_TOP_USBH2_OC                 IOMUX_PAD(0x774, 0x310, 3, 0x9f4, 2, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__KPP_COL_6                                IOMUX_PAD(0x774, 0x310, 4, 0x968, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__GPIO3_18                         IOMUX_PAD(0x774, 0x310, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA1__IPU_DISPB_BE0                    IOMUX_PAD(0x774, 0x310, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TDATA1__FEC_TDATA_1                      IOMUX_PAD(0x778, 0x314, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA1__IPU_CSI_D_3                      IOMUX_PAD(0x778, 0x314, 1, 0x93c, 4, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA1__AUDMUX_AUD6_RXFS                 IOMUX_PAD(0x778, 0x314, 2, 0x7bc, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA1__KPP_COL_7                                IOMUX_PAD(0x778, 0x314, 4, 0x96c, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA1__GPIO3_19                         IOMUX_PAD(0x778, 0x314, 5, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA1__IPU_DISPB_BE1                    IOMUX_PAD(0x778, 0x314, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RDATA2__FEC_RDATA_2                      IOMUX_PAD(0x77c, 0x318, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA2__IPU_CSI_D_4                      IOMUX_PAD(0x77c, 0x318, 1, 0x940, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA2__AUDMUX_AUD6_TXD                  IOMUX_PAD(0x77c, 0x318, 2, 0x7b4, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA2__KPP_ROW_4                                IOMUX_PAD(0x77c, 0x318, 4, 0x980, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA2__GPIO3_20                         IOMUX_PAD(0x77c, 0x318, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TDATA2__FEC_TDATA_2                      IOMUX_PAD(0x780, 0x31c, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA2__IPU_CSI_D_5                      IOMUX_PAD(0x780, 0x31c, 1, 0x944, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA2__AUDMUX_AUD6_RXD                  IOMUX_PAD(0x780, 0x31c, 2, 0x7b0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA2__KPP_ROW_5                                IOMUX_PAD(0x780, 0x31c, 4, 0x984, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA2__GPIO3_21                         IOMUX_PAD(0x780, 0x31c, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_RDATA3__FEC_RDATA_3                      IOMUX_PAD(0x784, 0x320, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA3__IPU_CSI_D_6                      IOMUX_PAD(0x784, 0x320, 1, 0x948, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA3__AUDMUX_AUD6_TXC                  IOMUX_PAD(0x784, 0x320, 2, 0x7c0, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA3__KPP_ROW_6                                IOMUX_PAD(0x784, 0x320, 4, 0x988, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_RDATA3__GPIO3_22                         IOMUX_PAD(0x784, 0x320, 6, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_FEC_TDATA3__FEC_TDATA_3                      IOMUX_PAD(0x788, 0x324, 0, 0x0,   0, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA3__IPU_CSI_D_7                      IOMUX_PAD(0x788, 0x324, 1, 0x94c, 3, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA3__AUDMUX_AUD6_TXFS                 IOMUX_PAD(0x788, 0x324, 2, 0x7c4, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA3__KPP_ROW_7                                IOMUX_PAD(0x788, 0x324, 4, 0x98c, 1, NO_PAD_CTRL)
++#define MX35_PAD_FEC_TDATA3__GPIO3_23                         IOMUX_PAD(0x788, 0x324, 5, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_EXT_ARMCLK__CCM_EXT_ARMCLK                   IOMUX_PAD(0x78c, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++#define MX35_PAD_TEST_MODE__TCU_TEST_MODE                     IOMUX_PAD(0x790, 0x0,   0, 0x0,   0, NO_PAD_CTRL)
++
++
++#endif /* __MACH_IOMUX_MX35_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx3.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-mx3.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx3.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-mx3.h    2009-05-13 09:46:19.000000000 +0200
+@@ -114,7 +114,7 @@ enum iomux_gp_func {
+  *    - setups the iomux according to the configuration
+  *    - if the pin is configured as a GPIO, we claim it throug kernel gpiolib
+  */
+-int mxc_iomux_setup_pin(const unsigned int pin, const char *label);
++int mxc_iomux_alloc_pin(const unsigned int pin, const char *label);
+ /*
+  * setups mutliple pins
+  * convenient way to call the above function with tables
+@@ -633,6 +633,40 @@ enum iomux_pins {
+ #define MX31_PIN_USBOTG_DIR__USBOTG_DIR        IOMUX_MODE(MX31_PIN_USBOTG_DIR, IOMUX_CONFIG_FUNC)
+ #define MX31_PIN_USBOTG_NXT__USBOTG_NXT        IOMUX_MODE(MX31_PIN_USBOTG_NXT, IOMUX_CONFIG_FUNC)
+ #define MX31_PIN_USBOTG_STP__USBOTG_STP        IOMUX_MODE(MX31_PIN_USBOTG_STP, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_USB_OC__GPIO1_30     IOMUX_MODE(MX31_PIN_USB_OC, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_I2C_DAT__I2C1_SDA    IOMUX_MODE(MX31_PIN_I2C_DAT, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_I2C_CLK__I2C1_SCL    IOMUX_MODE(MX31_PIN_I2C_CLK, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_DCD_DTE1__I2C2_SDA   IOMUX_MODE(MX31_PIN_DCD_DTE1, IOMUX_CONFIG_ALT2)
++#define MX31_PIN_RI_DTE1__I2C2_SCL    IOMUX_MODE(MX31_PIN_RI_DTE1, IOMUX_CONFIG_ALT2)
++#define MX31_PIN_ATA_CS0__GPIO3_26    IOMUX_MODE(MX31_PIN_ATA_CS0, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_ATA_CS1__GPIO3_27    IOMUX_MODE(MX31_PIN_ATA_CS1, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_PC_PWRON__SD2_DATA3  IOMUX_MODE(MX31_PIN_PC_PWRON, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_PC_VS1__SD2_DATA2    IOMUX_MODE(MX31_PIN_PC_VS1, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_PC_READY__SD2_DATA1  IOMUX_MODE(MX31_PIN_PC_READY, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_PC_WAIT_B__SD2_DATA0 IOMUX_MODE(MX31_PIN_PC_WAIT_B, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_PC_CD2_B__SD2_CLK    IOMUX_MODE(MX31_PIN_PC_CD2_B, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_PC_CD1_B__SD2_CMD    IOMUX_MODE(MX31_PIN_PC_CD1_B, IOMUX_CONFIG_ALT1)
++#define MX31_PIN_ATA_DIOR__GPIO3_28   IOMUX_MODE(MX31_PIN_ATA_DIOR, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_ATA_DIOW__GPIO3_29   IOMUX_MODE(MX31_PIN_ATA_DIOW, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_CSI_D4__CSI_D4               IOMUX_MODE(MX31_PIN_CSI_D4, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D5__CSI_D5               IOMUX_MODE(MX31_PIN_CSI_D5, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D6__CSI_D6               IOMUX_MODE(MX31_PIN_CSI_D6, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D7__CSI_D7               IOMUX_MODE(MX31_PIN_CSI_D7, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D8__CSI_D8               IOMUX_MODE(MX31_PIN_CSI_D8, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D9__CSI_D9               IOMUX_MODE(MX31_PIN_CSI_D9, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D10__CSI_D10     IOMUX_MODE(MX31_PIN_CSI_D10, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D11__CSI_D11     IOMUX_MODE(MX31_PIN_CSI_D11, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D12__CSI_D12     IOMUX_MODE(MX31_PIN_CSI_D12, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D13__CSI_D13     IOMUX_MODE(MX31_PIN_CSI_D13, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D14__CSI_D14     IOMUX_MODE(MX31_PIN_CSI_D14, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_D15__CSI_D15     IOMUX_MODE(MX31_PIN_CSI_D15, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_HSYNC__CSI_HSYNC IOMUX_MODE(MX31_PIN_CSI_HSYNC, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_MCLK__CSI_MCLK   IOMUX_MODE(MX31_PIN_CSI_MCLK, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_PIXCLK__CSI_PIXCLK       IOMUX_MODE(MX31_PIN_CSI_PIXCLK, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_CSI_VSYNC__CSI_VSYNC IOMUX_MODE(MX31_PIN_CSI_VSYNC, IOMUX_CONFIG_FUNC)
++#define MX31_PIN_GPIO3_0__GPIO3_0     IOMUX_MODE(MX31_PIN_GPIO3_0, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_GPIO3_1__GPIO3_1     IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO)
++#define MX31_PIN_TXD2__GPIO1_28               IOMUX_MODE(MX31_PIN_TXD2, IOMUX_CONFIG_GPIO)
+ /*XXX: The SS0, SS1, SS2, SS3 lines of spi3 are multiplexed by cspi2_ss0, cspi2_ss1, cspi1_ss0
+  * cspi1_ss1*/
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-v3.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-v3.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-v3.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/iomux-v3.h     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,121 @@
++/*
++ * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
++ *                    <armlinux@phytec.de>
++ *
++ * 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., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301, USA.
++ */
++
++#ifndef __MACH_IOMUX_V3_H__
++#define __MACH_IOMUX_V3_H__
++
++/*
++ *    build IOMUX_PAD structure
++ *
++ * This iomux scheme is based around pads, which are the physical balls
++ * on the processor.
++ *
++ * - Each pad has a pad control register (IOMUXC_SW_PAD_CTRL_x) which controls
++ *   things like driving strength and pullup/pulldown.
++ * - Each pad can have but not necessarily does have an output routing register
++ *   (IOMUXC_SW_MUX_CTL_PAD_x).
++ * - Each pad can have but not necessarily does have an input routing register
++ *   (IOMUXC_x_SELECT_INPUT)
++ *
++ * The three register sets do not have a fixed offset to each other,
++ * hence we order this table by pad control registers (which all pads
++ * have) and put the optional i/o routing registers into additional
++ * fields.
++ *
++ * The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
++ * If <padname> or <padmode> refers to a GPIO, it is named
++ * GPIO_<unit>_<num>
++ *
++ */
++
++struct pad_desc {
++      unsigned mux_ctrl_ofs:12; /* IOMUXC_SW_MUX_CTL_PAD offset */
++      unsigned mux_mode:8;
++      unsigned pad_ctrl_ofs:12; /* IOMUXC_SW_PAD_CTRL offset */
++#define       NO_PAD_CTRL     (1 << 16)
++      unsigned pad_ctrl:17;
++      unsigned select_input_ofs:12; /* IOMUXC_SELECT_INPUT offset */
++      unsigned select_input:3;
++};
++
++#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _select_input_ofs, \
++              _select_input, _pad_ctrl)                               \
++              {                                                       \
++                      .mux_ctrl_ofs     = _mux_ctrl_ofs,              \
++                      .mux_mode         = _mux_mode,                  \
++                      .pad_ctrl_ofs     = _pad_ctrl_ofs,              \
++                      .pad_ctrl         = _pad_ctrl,                  \
++                      .select_input_ofs = _select_input_ofs,          \
++                      .select_input     = _select_input,              \
++              }
++
++/*
++ * Use to set PAD control
++ */
++#define PAD_CTL_DRIVE_VOLTAGE_3_3_V   0
++#define PAD_CTL_DRIVE_VOLTAGE_1_8_V   1
++
++#define PAD_CTL_NO_HYSTERESIS         0
++#define PAD_CTL_HYSTERESIS            1
++
++#define PAD_CTL_PULL_DISABLED         0x0
++#define PAD_CTL_PULL_KEEPER           0xa
++#define PAD_CTL_PULL_DOWN_100K                0xc
++#define PAD_CTL_PULL_UP_47K           0xd
++#define PAD_CTL_PULL_UP_100K          0xe
++#define PAD_CTL_PULL_UP_22K           0xf
++
++#define PAD_CTL_OUTPUT_CMOS           0
++#define PAD_CTL_OUTPUT_OPEN_DRAIN     1
++
++#define PAD_CTL_DRIVE_STRENGTH_NORM   0
++#define PAD_CTL_DRIVE_STRENGTH_HIGH   1
++#define PAD_CTL_DRIVE_STRENGTH_MAX    2
++
++#define PAD_CTL_SLEW_RATE_SLOW                0
++#define PAD_CTL_SLEW_RATE_FAST                1
++
++/*
++ * setups a single pad:
++ *    - reserves the pad so that it is not claimed by another driver
++ *    - setups the iomux according to the configuration
++ */
++int mxc_iomux_v3_setup_pad(struct pad_desc *pad);
++
++/*
++ * setups mutliple pads
++ * convenient way to call the above function with tables
++ */
++int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count);
++
++/*
++ * releases a single pad:
++ *    - make it available for a future use by another driver
++ *    - DOES NOT reconfigure the IOMUX in its reset state
++ */
++void mxc_iomux_v3_release_pad(struct pad_desc *pad);
++
++/*
++ * releases multiple pads
++ * convenvient way to call the above function with tables
++ */
++void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count);
++
++#endif /* __MACH_IOMUX_V3_H__*/
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/memory.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/memory.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/memory.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/memory.h       2009-05-13 09:46:19.000000000 +0200
+@@ -32,4 +32,12 @@
+ #define CONSISTENT_DMA_SIZE SZ_4M
+ #endif /* CONFIG_MX1_VIDEO */
++#if defined(CONFIG_MX3_VIDEO)
++/*
++ * Increase size of DMA-consistent memory region.
++ * This is required for mx3 camera driver to capture at least two QXGA frames.
++ */
++#define CONSISTENT_DMA_SIZE SZ_8M
++#endif /* CONFIG_MX3_VIDEO */
++
+ #endif /* __ASM_ARCH_MXC_MEMORY_H__ */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx1.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/mx1.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx1.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/mx1.h  2009-05-13 09:46:19.000000000 +0200
+@@ -179,7 +179,7 @@
+ #define DMA_REQ_UART1_T               30
+ #define DMA_REQ_UART1_R               31
+-/* mandatory for CONFIG_LL_DEBUG */
++/* mandatory for CONFIG_DEBUG_LL */
+ #define MXC_LL_UART_PADDR     UART1_BASE_ADDR
+ #define MXC_LL_UART_VADDR     IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mxc_timer.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/mxc_timer.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mxc_timer.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/mxc_timer.h    1970-01-01 01:00:00.000000000 +0100
+@@ -1,158 +0,0 @@
+-/*
+- * mxc_timer.h
+- *
+- * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
+- *
+- * Platform independent (i.MX1, i.MX2, i.MX3) definition for timer handling.
+- *
+- * 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., 51 Franklin Street, Fifth Floor,
+- * Boston, MA  02110-1301, USA.
+- */
+-
+-#ifndef __PLAT_MXC_TIMER_H
+-#define __PLAT_MXC_TIMER_H
+-
+-#include <linux/clk.h>
+-#include <mach/hardware.h>
+-
+-#ifdef CONFIG_ARCH_MX1
+-#define TIMER_BASE            IO_ADDRESS(TIM1_BASE_ADDR)
+-#define TIMER_INTERRUPT               TIM1_INT
+-
+-#define TCTL_VAL              TCTL_CLK_PCLK1
+-#define TCTL_IRQEN            (1<<4)
+-#define TCTL_FRR              (1<<8)
+-#define TCTL_CLK_PCLK1                (1<<1)
+-#define TCTL_CLK_PCLK1_4      (2<<1)
+-#define TCTL_CLK_TIN          (3<<1)
+-#define TCTL_CLK_32           (4<<1)
+-
+-#define MXC_TCTL   0x00
+-#define MXC_TPRER  0x04
+-#define MXC_TCMP   0x08
+-#define MXC_TCR    0x0c
+-#define MXC_TCN    0x10
+-#define MXC_TSTAT  0x14
+-#define TSTAT_CAPT            (1<<1)
+-#define TSTAT_COMP            (1<<0)
+-
+-static inline void gpt_irq_disable(void)
+-{
+-      unsigned int tmp;
+-
+-      tmp = __raw_readl(TIMER_BASE + MXC_TCTL);
+-      __raw_writel(tmp & ~TCTL_IRQEN, TIMER_BASE + MXC_TCTL);
+-}
+-
+-static inline void gpt_irq_enable(void)
+-{
+-      __raw_writel(__raw_readl(TIMER_BASE + MXC_TCTL) | TCTL_IRQEN,
+-                              TIMER_BASE + MXC_TCTL);
+-}
+-
+-static void gpt_irq_acknowledge(void)
+-{
+-      __raw_writel(0, TIMER_BASE + MXC_TSTAT);
+-}
+-#endif /* CONFIG_ARCH_MX1 */
+-
+-#ifdef CONFIG_ARCH_MX2
+-#define TIMER_BASE            IO_ADDRESS(GPT1_BASE_ADDR)
+-#define TIMER_INTERRUPT               MXC_INT_GPT1
+-
+-#define MXC_TCTL   0x00
+-#define TCTL_VAL              TCTL_CLK_PCLK1
+-#define TCTL_CLK_PCLK1                (1<<1)
+-#define TCTL_CLK_PCLK1_4      (2<<1)
+-#define TCTL_IRQEN            (1<<4)
+-#define TCTL_FRR              (1<<8)
+-#define MXC_TPRER  0x04
+-#define MXC_TCMP   0x08
+-#define MXC_TCR    0x0c
+-#define MXC_TCN    0x10
+-#define MXC_TSTAT  0x14
+-#define TSTAT_CAPT            (1<<1)
+-#define TSTAT_COMP            (1<<0)
+-
+-static inline void gpt_irq_disable(void)
+-{
+-      unsigned int tmp;
+-
+-      tmp = __raw_readl(TIMER_BASE + MXC_TCTL);
+-      __raw_writel(tmp & ~TCTL_IRQEN, TIMER_BASE + MXC_TCTL);
+-}
+-
+-static inline void gpt_irq_enable(void)
+-{
+-      __raw_writel(__raw_readl(TIMER_BASE + MXC_TCTL) | TCTL_IRQEN,
+-                              TIMER_BASE + MXC_TCTL);
+-}
+-
+-static void gpt_irq_acknowledge(void)
+-{
+-      __raw_writel(TSTAT_CAPT | TSTAT_COMP, TIMER_BASE + MXC_TSTAT);
+-}
+-#endif /* CONFIG_ARCH_MX2 */
+-
+-#ifdef CONFIG_ARCH_MX3
+-#define TIMER_BASE            IO_ADDRESS(GPT1_BASE_ADDR)
+-#define TIMER_INTERRUPT               MXC_INT_GPT
+-
+-#define MXC_TCTL   0x00
+-#define TCTL_VAL              (TCTL_CLK_IPG | TCTL_WAITEN)
+-#define TCTL_CLK_IPG          (1<<6)
+-#define TCTL_FRR              (1<<9)
+-#define TCTL_WAITEN           (1<<3)
+-
+-#define MXC_TPRER  0x04
+-#define MXC_TSTAT  0x08
+-#define TSTAT_OF1             (1<<0)
+-#define TSTAT_OF2             (1<<1)
+-#define TSTAT_OF3             (1<<2)
+-#define TSTAT_IF1             (1<<3)
+-#define TSTAT_IF2             (1<<4)
+-#define TSTAT_ROV             (1<<5)
+-#define MXC_IR     0x0c
+-#define MXC_TCMP   0x10
+-#define MXC_TCMP2  0x14
+-#define MXC_TCMP3  0x18
+-#define MXC_TCR    0x1c
+-#define MXC_TCN    0x24
+-
+-static inline void gpt_irq_disable(void)
+-{
+-      __raw_writel(0, TIMER_BASE + MXC_IR);
+-}
+-
+-static inline void gpt_irq_enable(void)
+-{
+-      __raw_writel(1<<0, TIMER_BASE + MXC_IR);
+-}
+-
+-static inline void gpt_irq_acknowledge(void)
+-{
+-      __raw_writel(TSTAT_OF1, TIMER_BASE + MXC_TSTAT);
+-}
+-#endif /* CONFIG_ARCH_MX3 */
+-
+-#define TCTL_SWR              (1<<15)
+-#define TCTL_CC                       (1<<10)
+-#define TCTL_OM                       (1<<9)
+-#define TCTL_CAP_RIS          (1<<6)
+-#define TCTL_CAP_FAL          (2<<6)
+-#define TCTL_CAP_RIS_FAL      (3<<6)
+-#define TCTL_CAP_ENA          (1<<5)
+-#define TCTL_TEN              (1<<0)
+-
+-#endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/usb.h linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/usb.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/usb.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/include/mach/usb.h  2009-05-13 09:46:19.000000000 +0200
+@@ -17,7 +17,7 @@
+ struct imxusb_platform_data {
+       int (*init)(struct device *);
+-      int (*exit)(struct device *);
++      void (*exit)(struct device *);
+ };
+ #endif /* __ASM_ARCH_MXC_USB */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-v3.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/iomux-v3.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-v3.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/iomux-v3.c  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,98 @@
++/*
++ * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved.
++ * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de>
++ * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
++ *                       <armlinux@phytec.de>
++ *
++ * 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., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301, USA.
++ */
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/string.h>
++#include <linux/gpio.h>
++
++#include <mach/hardware.h>
++#include <asm/mach/map.h>
++#include <mach/iomux-v3.h>
++
++#define IOMUX_BASE    IO_ADDRESS(IOMUXC_BASE_ADDR)
++
++static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG];
++
++/*
++ * setups a single pin:
++ *    - reserves the pin so that it is not claimed by another driver
++ *    - setups the iomux according to the configuration
++ */
++int mxc_iomux_v3_setup_pad(struct pad_desc *pad)
++{
++      unsigned int pad_ofs = pad->pad_ctrl_ofs;
++
++      if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map))
++              return -EBUSY;
++      if (pad->mux_ctrl_ofs)
++              __raw_writel(pad->mux_mode, IOMUX_BASE + pad->mux_ctrl_ofs);
++
++      if (pad->select_input_ofs)
++              __raw_writel(pad->select_input,
++                              IOMUX_BASE + pad->select_input_ofs);
++
++      if (!(pad->pad_ctrl & NO_PAD_CTRL))
++              __raw_writel(pad->pad_ctrl, IOMUX_BASE + pad->pad_ctrl_ofs);
++      return 0;
++}
++EXPORT_SYMBOL(mxc_iomux_v3_setup_pad);
++
++int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count)
++{
++      struct pad_desc *p = pad_list;
++      int i;
++      int ret;
++
++      for (i = 0; i < count; i++) {
++              ret = mxc_iomux_v3_setup_pad(p);
++              if (ret)
++                      goto setup_error;
++              p++;
++      }
++      return 0;
++
++setup_error:
++      mxc_iomux_v3_release_multiple_pads(pad_list, i);
++      return ret;
++}
++EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);
++
++void mxc_iomux_v3_release_pad(struct pad_desc *pad)
++{
++      unsigned int pad_ofs = pad->pad_ctrl_ofs;
++
++      clear_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map);
++}
++EXPORT_SYMBOL(mxc_iomux_v3_release_pad);
++
++void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count)
++{
++      struct pad_desc *p = pad_list;
++      int i;
++
++      for (i = 0; i < count; i++) {
++              mxc_iomux_v3_release_pad(p);
++              p++;
++      }
++}
++EXPORT_SYMBOL(mxc_iomux_v3_release_multiple_pads);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/irq.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/irq.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/irq.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/irq.c       2009-05-13 09:46:19.000000000 +0200
+@@ -24,31 +24,27 @@
+ #include <asm/mach/irq.h>
+ #include <mach/hardware.h>
+-#define AVIC_BASE             IO_ADDRESS(AVIC_BASE_ADDR)
+-#define AVIC_INTCNTL          (AVIC_BASE + 0x00)      /* int control reg */
+-#define AVIC_NIMASK           (AVIC_BASE + 0x04)      /* int mask reg */
+-#define AVIC_INTENNUM         (AVIC_BASE + 0x08)      /* int enable number reg */
+-#define AVIC_INTDISNUM                (AVIC_BASE + 0x0C)      /* int disable number reg */
+-#define AVIC_INTENABLEH               (AVIC_BASE + 0x10)      /* int enable reg high */
+-#define AVIC_INTENABLEL               (AVIC_BASE + 0x14)      /* int enable reg low */
+-#define AVIC_INTTYPEH         (AVIC_BASE + 0x18)      /* int type reg high */
+-#define AVIC_INTTYPEL         (AVIC_BASE + 0x1C)      /* int type reg low */
+-#define AVIC_NIPRIORITY(x)    (AVIC_BASE + (0x20 + 4 * (7 - (x)))) /* int priority */
+-#define AVIC_NIVECSR          (AVIC_BASE + 0x40)      /* norm int vector/status */
+-#define AVIC_FIVECSR          (AVIC_BASE + 0x44)      /* fast int vector/status */
+-#define AVIC_INTSRCH          (AVIC_BASE + 0x48)      /* int source reg high */
+-#define AVIC_INTSRCL          (AVIC_BASE + 0x4C)      /* int source reg low */
+-#define AVIC_INTFRCH          (AVIC_BASE + 0x50)      /* int force reg high */
+-#define AVIC_INTFRCL          (AVIC_BASE + 0x54)      /* int force reg low */
+-#define AVIC_NIPNDH           (AVIC_BASE + 0x58)      /* norm int pending high */
+-#define AVIC_NIPNDL           (AVIC_BASE + 0x5C)      /* norm int pending low */
+-#define AVIC_FIPNDH           (AVIC_BASE + 0x60)      /* fast int pending high */
+-#define AVIC_FIPNDL           (AVIC_BASE + 0x64)      /* fast int pending low */
+-
+-#define SYSTEM_PREV_REG               IO_ADDRESS(IIM_BASE_ADDR + 0x20)
+-#define SYSTEM_SREV_REG               IO_ADDRESS(IIM_BASE_ADDR + 0x24)
+-#define IIM_PROD_REV_SH               3
+-#define IIM_PROD_REV_LEN      5
++#define AVIC_INTCNTL          0x00    /* int control reg */
++#define AVIC_NIMASK           0x04    /* int mask reg */
++#define AVIC_INTENNUM         0x08    /* int enable number reg */
++#define AVIC_INTDISNUM                0x0C    /* int disable number reg */
++#define AVIC_INTENABLEH               0x10    /* int enable reg high */
++#define AVIC_INTENABLEL               0x14    /* int enable reg low */
++#define AVIC_INTTYPEH         0x18    /* int type reg high */
++#define AVIC_INTTYPEL         0x1C    /* int type reg low */
++#define AVIC_NIPRIORITY(x)    (0x20 + 4 * (7 - (x))) /* int priority */
++#define AVIC_NIVECSR          0x40    /* norm int vector/status */
++#define AVIC_FIVECSR          0x44    /* fast int vector/status */
++#define AVIC_INTSRCH          0x48    /* int source reg high */
++#define AVIC_INTSRCL          0x4C    /* int source reg low */
++#define AVIC_INTFRCH          0x50    /* int force reg high */
++#define AVIC_INTFRCL          0x54    /* int force reg low */
++#define AVIC_NIPNDH           0x58    /* norm int pending high */
++#define AVIC_NIPNDL           0x5C    /* norm int pending low */
++#define AVIC_FIPNDH           0x60    /* fast int pending high */
++#define AVIC_FIPNDL           0x64    /* fast int pending low */
++
++static void __iomem *avic_base;
+ int imx_irq_set_priority(unsigned char irq, unsigned char prio)
+ {
+@@ -59,11 +55,11 @@ int imx_irq_set_priority(unsigned char i
+       if (irq >= MXC_INTERNAL_IRQS)
+               return -EINVAL;;
+-      temp = __raw_readl(AVIC_NIPRIORITY(irq / 8));
++      temp = __raw_readl(avic_base + AVIC_NIPRIORITY(irq / 8));
+       temp &= ~mask;
+       temp |= prio & mask;
+-      __raw_writel(temp, AVIC_NIPRIORITY(irq / 8));
++      __raw_writel(temp, avic_base + AVIC_NIPRIORITY(irq / 8));
+       return 0;
+ #else
+@@ -81,12 +77,12 @@ int mxc_set_irq_fiq(unsigned int irq, un
+               return -EINVAL;
+       if (irq < MXC_INTERNAL_IRQS / 2) {
+-              irqt = __raw_readl(AVIC_INTTYPEL) & ~(1 << irq);
+-              __raw_writel(irqt | (!!type << irq), AVIC_INTTYPEL);
++              irqt = __raw_readl(avic_base + AVIC_INTTYPEL) & ~(1 << irq);
++              __raw_writel(irqt | (!!type << irq), avic_base + AVIC_INTTYPEL);
+       } else {
+               irq -= MXC_INTERNAL_IRQS / 2;
+-              irqt = __raw_readl(AVIC_INTTYPEH) & ~(1 << irq);
+-              __raw_writel(irqt | (!!type << irq), AVIC_INTTYPEH);
++              irqt = __raw_readl(avic_base + AVIC_INTTYPEH) & ~(1 << irq);
++              __raw_writel(irqt | (!!type << irq), avic_base + AVIC_INTTYPEH);
+       }
+       return 0;
+@@ -97,13 +93,13 @@ EXPORT_SYMBOL(mxc_set_irq_fiq);
+ /* Disable interrupt number "irq" in the AVIC */
+ static void mxc_mask_irq(unsigned int irq)
+ {
+-      __raw_writel(irq, AVIC_INTDISNUM);
++      __raw_writel(irq, avic_base + AVIC_INTDISNUM);
+ }
+ /* Enable interrupt number "irq" in the AVIC */
+ static void mxc_unmask_irq(unsigned int irq)
+ {
+-      __raw_writel(irq, AVIC_INTENNUM);
++      __raw_writel(irq, avic_base + AVIC_INTENNUM);
+ }
+ static struct irq_chip mxc_avic_chip = {
+@@ -121,19 +117,21 @@ void __init mxc_init_irq(void)
+ {
+       int i;
++      avic_base = IO_ADDRESS(AVIC_BASE_ADDR);
++
+       /* put the AVIC into the reset value with
+        * all interrupts disabled
+        */
+-      __raw_writel(0, AVIC_INTCNTL);
+-      __raw_writel(0x1f, AVIC_NIMASK);
++      __raw_writel(0, avic_base + AVIC_INTCNTL);
++      __raw_writel(0x1f, avic_base + AVIC_NIMASK);
+       /* disable all interrupts */
+-      __raw_writel(0, AVIC_INTENABLEH);
+-      __raw_writel(0, AVIC_INTENABLEL);
++      __raw_writel(0, avic_base + AVIC_INTENABLEH);
++      __raw_writel(0, avic_base + AVIC_INTENABLEL);
+       /* all IRQ no FIQ */
+-      __raw_writel(0, AVIC_INTTYPEH);
+-      __raw_writel(0, AVIC_INTTYPEL);
++      __raw_writel(0, avic_base + AVIC_INTTYPEH);
++      __raw_writel(0, avic_base + AVIC_INTTYPEL);
+       for (i = 0; i < MXC_INTERNAL_IRQS; i++) {
+               set_irq_chip(i, &mxc_avic_chip);
+               set_irq_handler(i, handle_level_irq);
+@@ -142,7 +140,7 @@ void __init mxc_init_irq(void)
+       /* Set default priority value (0) for all IRQ's */
+       for (i = 0; i < 8; i++)
+-              __raw_writel(0, AVIC_NIPRIORITY(i));
++              __raw_writel(0, avic_base + AVIC_NIPRIORITY(i));
+       /* init architectures chained interrupt handler */
+       mxc_register_gpios();
+@@ -154,3 +152,4 @@ void __init mxc_init_irq(void)
+       printk(KERN_INFO "MXC IRQ initialized\n");
+ }
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/Kconfig linux-2.6.30-rc4-git/arch/arm/plat-mxc/Kconfig
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/Kconfig 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/Kconfig     2009-05-13 09:46:19.000000000 +0200
+@@ -48,7 +48,14 @@ config MXC_IRQ_PRIOR
+ config MXC_PWM
+       tristate "Enable PWM driver"
+       depends on ARCH_MXC
++      select HAVE_PWM
+       help
+         Enable support for the i.MX PWM controller(s).
++config ARCH_HAS_RNGA
++      bool
++      depends on ARCH_MXC
++
++config ARCH_MXC_IOMUX_V3
++      bool
+ endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/Makefile linux-2.6.30-rc4-git/arch/arm/plat-mxc/Makefile
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -7,4 +7,5 @@ obj-y := irq.o clock.o gpio.o time.o dev
+ obj-$(CONFIG_ARCH_MX1) += iomux-mx1-mx2.o dma-mx1-mx2.o
+ obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o
++obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
+ obj-$(CONFIG_MXC_PWM)  += pwm.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/pwm.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/pwm.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/pwm.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/pwm.c       2009-05-13 09:46:19.000000000 +0200
+@@ -15,65 +15,26 @@
+ #include <linux/clk.h>
+ #include <linux/io.h>
+ #include <linux/pwm.h>
++#include <mach/hardware.h>
++
++
++/* i.MX1 and i.MX21 share the same PWM function block: */
++
++#define MX1_PWMC    0x00   /* PWM Control Register */
++#define MX1_PWMS    0x04   /* PWM Sample Register */
++#define MX1_PWMP    0x08   /* PWM Period Register */
++
++
++/* i.MX27, i.MX31, i.MX35 share the same PWM function block: */
++
++#define MX3_PWMCR                 0x00    /* PWM Control Register */
++#define MX3_PWMSAR                0x0C    /* PWM Sample Register */
++#define MX3_PWMPR                 0x10    /* PWM Period Register */
++#define MX3_PWMCR_PRESCALER(x)    (((x - 1) & 0xFFF) << 4)
++#define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16)
++#define MX3_PWMCR_EN              (1 << 0)
+-#if defined CONFIG_ARCH_MX1 || defined CONFIG_ARCH_MX21
+-#define PWM_VER_1
+-#define PWMCR 0x00    /* PWM Control Register         */
+-#define PWMSR 0x04    /* PWM Sample Register          */
+-#define PWMPR 0x08    /* PWM Period Register          */
+-#define PWMCNR        0x0C    /* PWM Counter Register         */
+-
+-#define PWMCR_HCTR            (1 << 18)               /* Halfword FIFO Data Swapping  */
+-#define PWMCR_BCTR            (1 << 17)               /* Byte FIFO Data Swapping      */
+-#define PWMCR_SWR             (1 << 16)               /* Software Reset               */
+-#define PWMCR_CLKSRC_PERCLK   (0 << 15)               /* PERCLK Clock Source          */
+-#define PWMCR_CLKSRC_CLK32    (1 << 15)               /* 32KHz Clock Source           */
+-#define PWMCR_PRESCALER(x)    (((x - 1) & 0x7F) << 8) /* PRESCALER                    */
+-#define PWMCR_IRQ             (1 << 7)                /* Interrupt Request            */
+-#define PWMCR_IRQEN           (1 << 6)                /* Interrupt Request Enable     */
+-#define PWMCR_FIFOAV          (1 << 5)                /* FIFO Available               */
+-#define PWMCR_EN              (1 << 4)                /* Enables/Disables the PWM     */
+-#define PWMCR_REPEAT(x)               (((x) & 0x03) << 2)     /* Sample Repeats               */
+-#define PWMCR_DIV(x)          (((x) & 0x03) << 0)     /* Clock divider 2/4/8/16       */
+-
+-#define MAX_DIV                       (128 * 16)
+-#endif
+-
+-#if defined CONFIG_MACH_MX27 || defined CONFIG_ARCH_MX31
+-#define PWM_VER_2
+-
+-#define PWMCR 0x00    /* PWM Control Register         */
+-#define PWMSR 0x04    /* PWM Status Register          */
+-#define PWMIR 0x08    /* PWM Interrupt Register       */
+-#define PWMSAR        0x0C    /* PWM Sample Register          */
+-#define PWMPR 0x10    /* PWM Period Register          */
+-#define PWMCNR        0x14    /* PWM Counter Register         */
+-
+-#define PWMCR_EN              (1 << 0)                /* Enables/Disables the PWM     */
+-#define PWMCR_REPEAT(x)               (((x) & 0x03) << 1)     /* Sample Repeats               */
+-#define PWMCR_SWR             (1 << 3)                /* Software Reset               */
+-#define PWMCR_PRESCALER(x)    (((x - 1) & 0xFFF) << 4)/* PRESCALER                    */
+-#define PWMCR_CLKSRC(x)               (((x) & 0x3) << 16)
+-#define PWMCR_CLKSRC_OFF      (0 << 16)
+-#define PWMCR_CLKSRC_IPG      (1 << 16)
+-#define PWMCR_CLKSRC_IPG_HIGH (2 << 16)
+-#define PWMCR_CLKSRC_CLK32    (3 << 16)
+-#define PWMCR_POUTC
+-#define PWMCR_HCTR            (1 << 20)               /* Halfword FIFO Data Swapping  */
+-#define PWMCR_BCTR            (1 << 21)               /* Byte FIFO Data Swapping      */
+-#define PWMCR_DBGEN           (1 << 22)               /* Debug Mode                   */
+-#define PWMCR_WAITEN          (1 << 23)               /* Wait Mode                    */
+-#define PWMCR_DOZEN           (1 << 24)               /* Doze Mode                    */
+-#define PWMCR_STOPEN          (1 << 25)               /* Stop Mode                    */
+-#define PWMCR_FWM(x)          (((x) & 0x3) << 26)     /* FIFO Water Mark              */
+-
+-#define MAX_DIV 4096
+-#endif
+-
+-#define PWMS_SAMPLE(x)                ((x) & 0xFFFF)          /* Contains a two-sample word   */
+-#define PWMP_PERIOD(x)                ((x) & 0xFFFF)          /* Represents the PWM's period  */
+-#define PWMC_COUNTER(x)               ((x) & 0xFFFF)          /* Represents the current count value   */
+ struct pwm_device {
+       struct list_head        node;
+@@ -91,32 +52,52 @@ struct pwm_device {
+ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
+ {
+-      unsigned long long c;
+-      unsigned long period_cycles, duty_cycles, prescale;
+-
+       if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
+               return -EINVAL;
+-      c = clk_get_rate(pwm->clk);
+-      c = c * period_ns;
+-      do_div(c, 1000000000);
+-      period_cycles = c;
+-
+-      prescale = period_cycles / 0x10000 + 1;
+-
+-      period_cycles /= prescale;
+-      c = (unsigned long long)period_cycles * duty_ns;
+-      do_div(c, period_ns);
+-      duty_cycles = c;
+-
+-#ifdef PWM_VER_2
+-      writel(duty_cycles, pwm->mmio_base + PWMSAR);
+-      writel(period_cycles, pwm->mmio_base + PWMPR);
+-      writel(PWMCR_PRESCALER(prescale - 1) | PWMCR_CLKSRC_IPG_HIGH | PWMCR_EN,
+-                      pwm->mmio_base + PWMCR);
+-#elif defined PWM_VER_1
+-#error PWM not yet working on MX1 / MX21
+-#endif
++      if (cpu_is_mx27() || cpu_is_mx3()) {
++              unsigned long long c;
++              unsigned long period_cycles, duty_cycles, prescale;
++              c = clk_get_rate(pwm->clk);
++              c = c * period_ns;
++              do_div(c, 1000000000);
++              period_cycles = c;
++
++              prescale = period_cycles / 0x10000 + 1;
++
++              period_cycles /= prescale;
++              c = (unsigned long long)period_cycles * duty_ns;
++              do_div(c, period_ns);
++              duty_cycles = c;
++
++              writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR);
++              writel(period_cycles, pwm->mmio_base + MX3_PWMPR);
++              writel(MX3_PWMCR_PRESCALER(prescale - 1) |
++                      MX3_PWMCR_CLKSRC_IPG_HIGH | MX3_PWMCR_EN,
++                      pwm->mmio_base + MX3_PWMCR);
++      } else if (cpu_is_mx1() || cpu_is_mx21()) {
++              /* The PWM subsystem allows for exact frequencies. However,
++               * I cannot connect a scope on my device to the PWM line and
++               * thus cannot provide the program the PWM controller
++               * exactly. Instead, I'm relying on the fact that the
++               * Bootloader (u-boot or WinCE+haret) has programmed the PWM
++               * function group already. So I'll just modify the PWM sample
++               * register to follow the ratio of duty_ns vs. period_ns
++               * accordingly.
++               *
++               * This is good enought for programming the brightness of
++               * the LCD backlight.
++               *
++               * The real implementation would divide PERCLK[0] first by
++               * both the prescaler (/1 .. /128) and then by CLKSEL
++               * (/2 .. /16).
++               */
++              u32 max = readl(pwm->mmio_base + MX1_PWMP);
++              u32 p = max * duty_ns / period_ns;
++              writel(max - p, pwm->mmio_base + MX1_PWMS);
++      } else {
++              BUG();
++      }
+       return 0;
+ }
+@@ -297,4 +278,3 @@ module_exit(mxc_pwm_exit);
+ MODULE_LICENSE("GPL v2");
+ MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-mxc/time.c linux-2.6.30-rc4-git/arch/arm/plat-mxc/time.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/time.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-mxc/time.c      2009-05-13 09:46:19.000000000 +0200
+@@ -29,22 +29,85 @@
+ #include <mach/hardware.h>
+ #include <asm/mach/time.h>
+ #include <mach/common.h>
+-#include <mach/mxc_timer.h>
++
++/* defines common for all i.MX */
++#define MXC_TCTL              0x00
++#define MXC_TCTL_TEN          (1 << 0)
++#define MXC_TPRER             0x04
++
++/* MX1, MX21, MX27 */
++#define MX1_2_TCTL_CLK_PCLK1  (1 << 1)
++#define MX1_2_TCTL_IRQEN      (1 << 4)
++#define MX1_2_TCTL_FRR                (1 << 8)
++#define MX1_2_TCMP            0x08
++#define MX1_2_TCN             0x10
++#define MX1_2_TSTAT           0x14
++
++/* MX21, MX27 */
++#define MX2_TSTAT_CAPT                (1 << 1)
++#define MX2_TSTAT_COMP                (1 << 0)
++
++/* MX31, MX35 */
++#define MX3_TCTL_WAITEN               (1 << 3)
++#define MX3_TCTL_CLK_IPG      (1 << 6)
++#define MX3_TCTL_FRR          (1 << 9)
++#define MX3_IR                        0x0c
++#define MX3_TSTAT             0x08
++#define MX3_TSTAT_OF1         (1 << 0)
++#define MX3_TCN                       0x24
++#define MX3_TCMP              0x10
+ static struct clock_event_device clockevent_mxc;
+ static enum clock_event_mode clockevent_mode = CLOCK_EVT_MODE_UNUSED;
+-/* clock source */
++static void __iomem *timer_base;
+-static cycle_t mxc_get_cycles(struct clocksource *cs)
++static inline void gpt_irq_disable(void)
+ {
+-      return __raw_readl(TIMER_BASE + MXC_TCN);
++      unsigned int tmp;
++
++      if (cpu_is_mx3())
++              __raw_writel(0, timer_base + MX3_IR);
++      else {
++              tmp = __raw_readl(timer_base + MXC_TCTL);
++              __raw_writel(tmp & ~MX1_2_TCTL_IRQEN, timer_base + MXC_TCTL);
++      }
++}
++
++static inline void gpt_irq_enable(void)
++{
++      if (cpu_is_mx3())
++              __raw_writel(1<<0, timer_base + MX3_IR);
++      else {
++              __raw_writel(__raw_readl(timer_base + MXC_TCTL) | MX1_2_TCTL_IRQEN,
++                      timer_base + MXC_TCTL);
++      }
++}
++
++static void gpt_irq_acknowledge(void)
++{
++      if (cpu_is_mx1())
++              __raw_writel(0, timer_base + MX1_2_TSTAT);
++      if (cpu_is_mx2())
++              __raw_writel(MX2_TSTAT_CAPT | MX2_TSTAT_COMP, timer_base + MX1_2_TSTAT);
++      if (cpu_is_mx3())
++              __raw_writel(MX3_TSTAT_OF1, timer_base + MX3_TSTAT);
++}
++
++static cycle_t mx1_2_get_cycles(struct clocksource *cs)
++{
++      return __raw_readl(timer_base + MX1_2_TCN);
++}
++
++static cycle_t mx3_get_cycles(struct clocksource *cs)
++{
++      return __raw_readl(timer_base + MX3_TCN);
+ }
+ static struct clocksource clocksource_mxc = {
+       .name           = "mxc_timer1",
+       .rating         = 200,
+-      .read           = mxc_get_cycles,
++      .read           = mx1_2_get_cycles,
+       .mask           = CLOCKSOURCE_MASK(32),
+       .shift          = 20,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+@@ -54,6 +117,9 @@ static int __init mxc_clocksource_init(s
+ {
+       unsigned int c = clk_get_rate(timer_clk);
++      if (cpu_is_mx3())
++              clocksource_mxc.read = mx3_get_cycles;
++
+       clocksource_mxc.mult = clocksource_hz2mult(c,
+                                       clocksource_mxc.shift);
+       clocksource_register(&clocksource_mxc);
+@@ -63,15 +129,29 @@ static int __init mxc_clocksource_init(s
+ /* clock event */
+-static int mxc_set_next_event(unsigned long evt,
++static int mx1_2_set_next_event(unsigned long evt,
+                             struct clock_event_device *unused)
+ {
+       unsigned long tcmp;
+-      tcmp = __raw_readl(TIMER_BASE + MXC_TCN) + evt;
+-      __raw_writel(tcmp, TIMER_BASE + MXC_TCMP);
++      tcmp = __raw_readl(timer_base + MX1_2_TCN) + evt;
+-      return (int)(tcmp - __raw_readl(TIMER_BASE + MXC_TCN)) < 0 ?
++      __raw_writel(tcmp, timer_base + MX1_2_TCMP);
++
++      return (int)(tcmp - __raw_readl(timer_base + MX1_2_TCN)) < 0 ?
++                              -ETIME : 0;
++}
++
++static int mx3_set_next_event(unsigned long evt,
++                            struct clock_event_device *unused)
++{
++      unsigned long tcmp;
++
++      tcmp = __raw_readl(timer_base + MX3_TCN) + evt;
++
++      __raw_writel(tcmp, timer_base + MX3_TCMP);
++
++      return (int)(tcmp - __raw_readl(timer_base + MX3_TCN)) < 0 ?
+                               -ETIME : 0;
+ }
+@@ -100,8 +180,13 @@ static void mxc_set_mode(enum clock_even
+       if (mode != clockevent_mode) {
+               /* Set event time into far-far future */
+-              __raw_writel(__raw_readl(TIMER_BASE + MXC_TCN) - 3,
+-                              TIMER_BASE + MXC_TCMP);
++              if (cpu_is_mx3())
++                      __raw_writel(__raw_readl(timer_base + MX3_TCN) - 3,
++                                      timer_base + MX3_TCMP);
++              else
++                      __raw_writel(__raw_readl(timer_base + MX1_2_TCN) - 3,
++                                      timer_base + MX1_2_TCMP);
++
+               /* Clear pending interrupt */
+               gpt_irq_acknowledge();
+       }
+@@ -148,7 +233,10 @@ static irqreturn_t mxc_timer_interrupt(i
+       struct clock_event_device *evt = &clockevent_mxc;
+       uint32_t tstat;
+-      tstat = __raw_readl(TIMER_BASE + MXC_TSTAT);
++      if (cpu_is_mx3())
++              tstat = __raw_readl(timer_base + MX3_TSTAT);
++      else
++              tstat = __raw_readl(timer_base + MX1_2_TSTAT);
+       gpt_irq_acknowledge();
+@@ -168,7 +256,7 @@ static struct clock_event_device clockev
+       .features       = CLOCK_EVT_FEAT_ONESHOT,
+       .shift          = 32,
+       .set_mode       = mxc_set_mode,
+-      .set_next_event = mxc_set_next_event,
++      .set_next_event = mx1_2_set_next_event,
+       .rating         = 200,
+ };
+@@ -176,6 +264,9 @@ static int __init mxc_clockevent_init(st
+ {
+       unsigned int c = clk_get_rate(timer_clk);
++      if (cpu_is_mx3())
++              clockevent_mxc.set_next_event = mx3_set_next_event;
++
+       clockevent_mxc.mult = div_sc(c, NSEC_PER_SEC,
+                                       clockevent_mxc.shift);
+       clockevent_mxc.max_delta_ns =
+@@ -192,23 +283,47 @@ static int __init mxc_clockevent_init(st
+ void __init mxc_timer_init(struct clk *timer_clk)
+ {
++      uint32_t tctl_val;
++      int irq;
++
+       clk_enable(timer_clk);
++      if (cpu_is_mx1()) {
++#ifdef CONFIG_ARCH_MX1
++              timer_base = IO_ADDRESS(TIM1_BASE_ADDR);
++              irq = TIM1_INT;
++#endif
++      } else if (cpu_is_mx2()) {
++#ifdef CONFIG_ARCH_MX2
++              timer_base = IO_ADDRESS(GPT1_BASE_ADDR);
++              irq = MXC_INT_GPT1;
++#endif
++      } else if (cpu_is_mx3()) {
++#ifdef CONFIG_ARCH_MX3
++              timer_base = IO_ADDRESS(GPT1_BASE_ADDR);
++              irq = MXC_INT_GPT;
++#endif
++      } else
++              BUG();
++
+       /*
+        * Initialise to a known state (all timers off, and timing reset)
+        */
+-      __raw_writel(0, TIMER_BASE + MXC_TCTL);
+-      __raw_writel(0, TIMER_BASE + MXC_TPRER); /* see datasheet note */
+-      __raw_writel(TCTL_FRR | /* free running */
+-                   TCTL_VAL | /* set clocksource and arch specific bits */
+-                   TCTL_TEN,  /* start the timer */
+-                   TIMER_BASE + MXC_TCTL);
++      __raw_writel(0, timer_base + MXC_TCTL);
++      __raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */
++
++      if (cpu_is_mx3())
++              tctl_val = MX3_TCTL_CLK_IPG | MX3_TCTL_FRR | MX3_TCTL_WAITEN | MXC_TCTL_TEN;
++      else
++              tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN;
++
++      __raw_writel(tctl_val, timer_base + MXC_TCTL);
+       /* init and register the timer to the framework */
+       mxc_clocksource_init(timer_clk);
+       mxc_clockevent_init(timer_clk);
+       /* Make irqs happen */
+-      setup_irq(TIMER_INTERRUPT, &mxc_timer_irq);
++      setup_irq(irq, &mxc_timer_irq);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/clock.c linux-2.6.30-rc4-git/arch/arm/plat-omap/clock.c
+--- linux-2.6.30-rc4/arch/arm/plat-omap/clock.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/clock.c    2009-05-13 09:46:19.000000000 +0200
+@@ -239,6 +239,13 @@ void recalculate_root_clocks(void)
+       }
+ }
++/**
++ * clk_init_one - initialize any fields in the struct clk before clk init
++ * @clk: struct clk * to initialize
++ *
++ * Initialize any struct clk fields needed before normal clk initialization
++ * can run.  No return value.
++ */
+ void clk_init_one(struct clk *clk)
+ {
+       INIT_LIST_HEAD(&clk->children);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/dma.c linux-2.6.30-rc4-git/arch/arm/plat-omap/dma.c
+--- linux-2.6.30-rc4/arch/arm/plat-omap/dma.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/dma.c      2009-05-13 09:46:19.000000000 +0200
+@@ -760,19 +760,12 @@ void omap_free_dma(int lch)
+ {
+       unsigned long flags;
+-      spin_lock_irqsave(&dma_chan_lock, flags);
+       if (dma_chan[lch].dev_id == -1) {
+               pr_err("omap_dma: trying to free unallocated DMA channel %d\n",
+                      lch);
+-              spin_unlock_irqrestore(&dma_chan_lock, flags);
+               return;
+       }
+-      dma_chan[lch].dev_id = -1;
+-      dma_chan[lch].next_lch = -1;
+-      dma_chan[lch].callback = NULL;
+-      spin_unlock_irqrestore(&dma_chan_lock, flags);
+-
+       if (cpu_class_is_omap1()) {
+               /* Disable all DMA interrupts for the channel. */
+               dma_write(0, CICR(lch));
+@@ -798,6 +791,12 @@ void omap_free_dma(int lch)
+               dma_write(0, CCR(lch));
+               omap_clear_dma(lch);
+       }
++
++      spin_lock_irqsave(&dma_chan_lock, flags);
++      dma_chan[lch].dev_id = -1;
++      dma_chan[lch].next_lch = -1;
++      dma_chan[lch].callback = NULL;
++      spin_unlock_irqrestore(&dma_chan_lock, flags);
+ }
+ EXPORT_SYMBOL(omap_free_dma);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/dmtimer.c linux-2.6.30-rc4-git/arch/arm/plat-omap/dmtimer.c
+--- linux-2.6.30-rc4/arch/arm/plat-omap/dmtimer.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/dmtimer.c  2009-05-13 09:46:19.000000000 +0200
+@@ -238,7 +238,7 @@ static struct omap_dm_timer omap3_dm_tim
+       { .phys_base = 0x49040000, .irq = INT_24XX_GPTIMER9 },
+       { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 },
+       { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 },
+-      { .phys_base = 0x48304000, .irq = INT_24XX_GPTIMER12 },
++      { .phys_base = 0x48304000, .irq = INT_34XX_GPT12_IRQ },
+ };
+ static const char *omap3_dm_source_names[] __initdata = {
+@@ -321,11 +321,9 @@ static void omap_dm_timer_reset(struct o
+       l |= 0x2 << 8;   /* Set clock activity to perserve f-clock on idle */
+       /*
+-       * Enable wake-up only for GPT1 on OMAP2 CPUs.
+-       * FIXME: All timers should have wake-up enabled and clear
+-       * PRCM status.
++       * Enable wake-up on OMAP2 CPUs.
+        */
+-      if (cpu_class_is_omap2() && (timer == &dm_timers[0]))
++      if (cpu_class_is_omap2())
+               l |= 1 << 2;
+       omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l);
+@@ -511,7 +509,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_stop);
+ #ifdef CONFIG_ARCH_OMAP1
+-void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
++int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
+ {
+       int n = (timer - dm_timers) << 1;
+       u32 l;
+@@ -519,23 +517,31 @@ void omap_dm_timer_set_source(struct oma
+       l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n);
+       l |= source << n;
+       omap_writel(l, MOD_CONF_CTRL_1);
++
++      return 0;
+ }
+ EXPORT_SYMBOL_GPL(omap_dm_timer_set_source);
+ #else
+-void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
++int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
+ {
++      int ret = -EINVAL;
++
+       if (source < 0 || source >= 3)
+-              return;
++              return -EINVAL;
+       clk_disable(timer->fclk);
+-      clk_set_parent(timer->fclk, dm_source_clocks[source]);
++      ret = clk_set_parent(timer->fclk, dm_source_clocks[source]);
+       clk_enable(timer->fclk);
+-      /* When the functional clock disappears, too quick writes seem to
+-       * cause an abort. */
++      /*
++       * When the functional clock disappears, too quick writes seem
++       * to cause an abort. XXX Is this still necessary?
++       */
+       __delay(150000);
++
++      return ret;
+ }
+ EXPORT_SYMBOL_GPL(omap_dm_timer_set_source);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/gpio.c linux-2.6.30-rc4-git/arch/arm/plat-omap/gpio.c
+--- linux-2.6.30-rc4/arch/arm/plat-omap/gpio.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/gpio.c     2009-05-13 09:46:19.000000000 +0200
+@@ -758,8 +758,12 @@ static void _clear_gpio_irqbank(struct g
+       /* Workaround for clearing DSP GPIO interrupts to allow retention */
+ #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
++      reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
+       if (cpu_is_omap24xx() || cpu_is_omap34xx())
+-              __raw_writel(gpio_mask, bank->base + OMAP24XX_GPIO_IRQSTATUS2);
++              __raw_writel(gpio_mask, reg);
++
++      /* Flush posted write for the irq status to avoid spurious interrupts */
++      __raw_readl(reg);
+ #endif
+ }
+@@ -921,13 +925,10 @@ static int _set_gpio_wakeup(struct gpio_
+       case METHOD_MPUIO:
+       case METHOD_GPIO_1610:
+               spin_lock_irqsave(&bank->lock, flags);
+-              if (enable) {
++              if (enable)
+                       bank->suspend_wakeup |= (1 << gpio);
+-                      enable_irq_wake(bank->irq);
+-              } else {
+-                      disable_irq_wake(bank->irq);
++              else
+                       bank->suspend_wakeup &= ~(1 << gpio);
+-              }
+               spin_unlock_irqrestore(&bank->lock, flags);
+               return 0;
+ #endif
+@@ -940,13 +941,10 @@ static int _set_gpio_wakeup(struct gpio_
+                       return -EINVAL;
+               }
+               spin_lock_irqsave(&bank->lock, flags);
+-              if (enable) {
++              if (enable)
+                       bank->suspend_wakeup |= (1 << gpio);
+-                      enable_irq_wake(bank->irq);
+-              } else {
+-                      disable_irq_wake(bank->irq);
++              else
+                       bank->suspend_wakeup &= ~(1 << gpio);
+-              }
+               spin_unlock_irqrestore(&bank->lock, flags);
+               return 0;
+ #endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/dmtimer.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/dmtimer.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/dmtimer.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/dmtimer.h     2009-05-13 09:46:19.000000000 +0200
+@@ -64,7 +64,7 @@ void omap_dm_timer_trigger(struct omap_d
+ void omap_dm_timer_start(struct omap_dm_timer *timer);
+ void omap_dm_timer_stop(struct omap_dm_timer *timer);
+-void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source);
++int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source);
+ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value);
+ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value);
+ void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/eac.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/eac.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/eac.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/eac.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,100 +0,0 @@
+-/*
+- * arch/arm/plat-omap/include/mach2/eac.h
+- *
+- * Defines for Enhanced Audio Controller
+- *
+- * Contact: Jarkko Nikula <jarkko.nikula@nokia.com>
+- *
+- * Copyright (C) 2006 Nokia Corporation
+- * Copyright (C) 2004 Texas Instruments, 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.
+- *
+- * 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., 51 Franklin St, Fifth Floor, Boston, MA
+- * 02110-1301 USA
+- *
+- */
+-
+-#ifndef __ASM_ARM_ARCH_OMAP2_EAC_H
+-#define __ASM_ARM_ARCH_OMAP2_EAC_H
+-
+-#include <mach/io.h>
+-#include <mach/hardware.h>
+-#include <asm/irq.h>
+-
+-#include <sound/core.h>
+-
+-/* master codec clock source */
+-#define EAC_MCLK_EXT_MASK     0x100
+-enum eac_mclk_src {
+-      EAC_MCLK_INT_11290000, /* internal 96 MHz / 8.5 = 11.29 Mhz */
+-      EAC_MCLK_EXT_11289600 = EAC_MCLK_EXT_MASK,
+-      EAC_MCLK_EXT_12288000,
+-      EAC_MCLK_EXT_2x11289600,
+-      EAC_MCLK_EXT_2x12288000,
+-};
+-
+-/* codec port interface mode */
+-enum eac_codec_mode {
+-      EAC_CODEC_PCM,
+-      EAC_CODEC_AC97,
+-      EAC_CODEC_I2S_MASTER, /* codec port, I.e. EAC is the master */
+-      EAC_CODEC_I2S_SLAVE,
+-};
+-
+-/* configuration structure for I2S mode */
+-struct eac_i2s_conf {
+-      /* if enabled, then first data slot (left channel) is signaled as
+-       * positive level of frame sync EAC.AC_FS */
+-      unsigned        polarity_changed_mode:1;
+-      /* if enabled, then serial data starts one clock cycle after the
+-       * of EAC.AC_FS for first audio slot */
+-      unsigned        sync_delay_enable:1;
+-};
+-
+-/* configuration structure for EAC codec port */
+-struct eac_codec {
+-      enum eac_mclk_src       mclk_src;
+-
+-      enum eac_codec_mode     codec_mode;
+-      union {
+-              struct eac_i2s_conf     i2s;
+-      } codec_conf;
+-
+-      int             default_rate; /* audio sampling rate */
+-
+-      int             (* set_power)(void *private_data, int dac, int adc);
+-      int             (* register_controls)(void *private_data,
+-                                            struct snd_card *card);
+-      const char      *short_name;
+-
+-      void            *private_data;
+-};
+-
+-/* structure for passing platform dependent data to the EAC driver */
+-struct eac_platform_data {
+-        int   (* init)(struct device *eac_dev);
+-      void    (* cleanup)(struct device *eac_dev);
+-      /* these callbacks are used to configure & control external MCLK
+-       * source. NULL if not used */
+-      int     (* enable_ext_clocks)(struct device *eac_dev);
+-      void    (* disable_ext_clocks)(struct device *eac_dev);
+-};
+-
+-extern void omap_init_eac(struct eac_platform_data *pdata);
+-
+-extern int eac_register_codec(struct device *eac_dev, struct eac_codec *codec);
+-extern void eac_unregister_codec(struct device *eac_dev);
+-
+-extern int eac_set_mode(struct device *eac_dev, int play, int rec);
+-
+-#endif /* __ASM_ARM_ARCH_OMAP2_EAC_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/gpioexpander.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/gpioexpander.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/gpioexpander.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/gpioexpander.h        1970-01-01 01:00:00.000000000 +0100
+@@ -1,35 +0,0 @@
+-/*
+- * arch/arm/plat-omap/include/mach/gpioexpander.h
+- *
+- *
+- * Copyright (C) 2004 Texas Instruments, Inc.
+- *
+- * This package is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+- */
+-
+-#ifndef __ASM_ARCH_OMAP_GPIOEXPANDER_H
+-#define __ASM_ARCH_OMAP_GPIOEXPANDER_H
+-
+-/* Function Prototypes for GPIO Expander functions */
+-
+-#ifdef CONFIG_GPIOEXPANDER_OMAP
+-int read_gpio_expa(u8 *, int);
+-int write_gpio_expa(u8 , int);
+-#else
+-static inline int read_gpio_expa(u8 *val, int addr)
+-{
+-      return 0;
+-}
+-static inline int write_gpio_expa(u8 val, int addr)
+-{
+-      return 0;
+-}
+-#endif
+-
+-#endif /* __ASM_ARCH_OMAP_GPIOEXPANDER_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/irda.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/irda.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/irda.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/irda.h        2009-05-13 09:46:19.000000000 +0200
+@@ -21,10 +21,6 @@ struct omap_irda_config {
+       int transceiver_cap;
+       int (*transceiver_mode)(struct device *dev, int mode);
+       int (*select_irda)(struct device *dev, int state);
+-      /* Very specific to the needs of some platforms (h3,h4)
+-       * having calls which can sleep in irda_set_speed.
+-       */
+-      struct delayed_work gpio_expa;
+       int rx_channel;
+       int tx_channel;
+       unsigned long dest_start;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/mmc.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/mmc.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/mmc.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/mmc.h 2009-05-13 09:46:19.000000000 +0200
+@@ -79,7 +79,6 @@ struct omap_mmc_platform_data {
+               /* use the internal clock */
+               unsigned internal_clock:1;
+-              s16 power_pin;
+               int switch_pin;                 /* gpio (card detect) */
+               int gpio_wp;                    /* gpio (write protect) */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/timer-gp.h linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/timer-gp.h
+--- linux-2.6.30-rc4/arch/arm/plat-omap/include/mach/timer-gp.h        1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/arch/arm/plat-omap/include/mach/timer-gp.h    2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,17 @@
++/*
++ * OMAP2/3 GPTIMER support.headers
++ *
++ * Copyright (C) 2009 Nokia Corporation
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++
++#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H
++#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H
++
++int __init omap2_gp_clockevent_set_gptimer(u8 id);
++
++#endif
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/arm/plat-pxa/gpio.c linux-2.6.30-rc4-git/arch/arm/plat-pxa/gpio.c
+--- linux-2.6.30-rc4/arch/arm/plat-pxa/gpio.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/arm/plat-pxa/gpio.c      2009-05-13 09:46:19.000000000 +0200
+@@ -121,6 +121,8 @@ static int __init pxa_init_gpio_chip(int
+               return -ENOMEM;
+       }
++      memset(chips, 0, nbanks * sizeof(struct pxa_gpio_chip));
++
+       for (i = 0, gpio = 0; i < nbanks; i++, gpio += 32) {
+               struct gpio_chip *c = &chips[i].chip;
+@@ -143,6 +145,21 @@ static int __init pxa_init_gpio_chip(int
+       return 0;
+ }
++/* Update only those GRERx and GFERx edge detection register bits if those
++ * bits are set in c->irq_mask
++ */
++static inline void update_edge_detect(struct pxa_gpio_chip *c)
++{
++      uint32_t grer, gfer;
++
++      grer = __raw_readl(c->regbase + GRER_OFFSET) & ~c->irq_mask;
++      gfer = __raw_readl(c->regbase + GFER_OFFSET) & ~c->irq_mask;
++      grer |= c->irq_edge_rise & c->irq_mask;
++      gfer |= c->irq_edge_fall & c->irq_mask;
++      __raw_writel(grer, c->regbase + GRER_OFFSET);
++      __raw_writel(gfer, c->regbase + GFER_OFFSET);
++}
++
+ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type)
+ {
+       struct pxa_gpio_chip *c;
+@@ -181,8 +198,7 @@ static int pxa_gpio_irq_type(unsigned in
+       else
+               c->irq_edge_fall &= ~mask;
+-      __raw_writel(c->irq_edge_rise & c->irq_mask, c->regbase + GRER_OFFSET);
+-      __raw_writel(c->irq_edge_fall & c->irq_mask, c->regbase + GFER_OFFSET);
++      update_edge_detect(c);
+       pr_debug("%s: IRQ%d (GPIO%d) - edge%s%s\n", __func__, irq, gpio,
+               ((type & IRQ_TYPE_EDGE_RISING)  ? " rising"  : ""),
+@@ -244,8 +260,7 @@ static void pxa_unmask_muxed_gpio(unsign
+       struct pxa_gpio_chip *c = gpio_to_chip(gpio);
+       c->irq_mask |= GPIO_bit(gpio);
+-      __raw_writel(c->irq_edge_rise & c->irq_mask, c->regbase + GRER_OFFSET);
+-      __raw_writel(c->irq_edge_fall & c->irq_mask, c->regbase + GFER_OFFSET);
++      update_edge_detect(c);
+ }
+ static struct irq_chip pxa_muxed_gpio_chip = {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/avr32/Makefile linux-2.6.30-rc4-git/arch/avr32/Makefile
+--- linux-2.6.30-rc4/arch/avr32/Makefile       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/avr32/Makefile   2009-05-13 09:46:19.000000000 +0200
+@@ -43,8 +43,6 @@ core-y                                       += arch/avr32/mm/
+ drivers-$(CONFIG_OPROFILE)            += arch/avr32/oprofile/
+ libs-y                                        += arch/avr32/lib/
+-CLEAN_FILES += include/asm-avr32/.arch include/asm-avr32/arch
+-
+ BOOT_TARGETS := vmlinux.elf vmlinux.bin uImage uImage.srec
+ .PHONY: $(BOOT_TARGETS) install
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/m32r/boot/compressed/Makefile linux-2.6.30-rc4-git/arch/m32r/boot/compressed/Makefile
+--- linux-2.6.30-rc4/arch/m32r/boot/compressed/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/m32r/boot/compressed/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -6,7 +6,6 @@
+ targets               := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o \
+                  piggy.o vmlinux.lds
+-EXTRA_AFLAGS  := -traditional
+ OBJECTS = $(obj)/head.o $(obj)/misc.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/m32r/include/asm/assembler.h linux-2.6.30-rc4-git/arch/m32r/include/asm/assembler.h
+--- linux-2.6.30-rc4/arch/m32r/include/asm/assembler.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/m32r/include/asm/assembler.h     2009-05-13 09:46:19.000000000 +0200
+@@ -9,14 +9,15 @@
+  * This file contains M32R architecture specific macro definitions.
+  */
++#include <linux/stringify.h>
++
++#undef __STR
+-#ifndef __STR
+ #ifdef __ASSEMBLY__
+ #define __STR(x) x
+ #else
+-#define __STR(x) #x
++#define __STR(x) __stringify(x)
+ #endif
+-#endif /* __STR */
+ #ifdef CONFIG_SMP
+ #define M32R_LOCK     __STR(lock)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/m32r/kernel/Makefile linux-2.6.30-rc4-git/arch/m32r/kernel/Makefile
+--- linux-2.6.30-rc4/arch/m32r/kernel/Makefile 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/m32r/kernel/Makefile     2009-05-13 09:46:19.000000000 +0200
+@@ -9,5 +9,3 @@ obj-y  := process.o entry.o traps.o align
+ obj-$(CONFIG_SMP)             += smp.o smpboot.o
+ obj-$(CONFIG_MODULES)         += module.o
+-
+-EXTRA_AFLAGS  := -traditional
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/microblaze/include/asm/of_platform.h linux-2.6.30-rc4-git/arch/microblaze/include/asm/of_platform.h
+--- linux-2.6.30-rc4/arch/microblaze/include/asm/of_platform.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/microblaze/include/asm/of_platform.h     2009-05-13 09:46:19.000000000 +0200
+@@ -36,16 +36,6 @@ static const struct of_device_id of_defa
+       {},
+ };
+-/* Platform drivers register/unregister */
+-static inline int of_register_platform_driver(struct of_platform_driver *drv)
+-{
+-      return of_register_driver(drv, &of_platform_bus_type);
+-}
+-static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
+-{
+-      of_unregister_driver(drv);
+-}
+-
+ /* Platform devices and busses creation */
+ extern struct of_device *of_platform_device_create(struct device_node *np,
+                                               const char *bus_id,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/checks.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/checks.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/checks.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/checks.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,587 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2007.
+- *
+- *
+- * 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 "dtc.h"
+-
+-#ifdef TRACE_CHECKS
+-#define TRACE(c, ...) \
+-      do { \
+-              fprintf(stderr, "=== %s: ", (c)->name); \
+-              fprintf(stderr, __VA_ARGS__); \
+-              fprintf(stderr, "\n"); \
+-      } while (0)
+-#else
+-#define TRACE(c, fmt, ...)    do { } while (0)
+-#endif
+-
+-enum checklevel {
+-      IGNORE = 0,
+-      WARN = 1,
+-      ERROR = 2,
+-};
+-
+-enum checkstatus {
+-      UNCHECKED = 0,
+-      PREREQ,
+-      PASSED,
+-      FAILED,
+-};
+-
+-struct check;
+-
+-typedef void (*tree_check_fn)(struct check *c, struct node *dt);
+-typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node);
+-typedef void (*prop_check_fn)(struct check *c, struct node *dt,
+-                            struct node *node, struct property *prop);
+-
+-struct check {
+-      const char *name;
+-      tree_check_fn tree_fn;
+-      node_check_fn node_fn;
+-      prop_check_fn prop_fn;
+-      void *data;
+-      enum checklevel level;
+-      enum checkstatus status;
+-      int inprogress;
+-      int num_prereqs;
+-      struct check **prereq;
+-};
+-
+-#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \
+-      static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \
+-      static struct check nm = { \
+-              .name = #nm, \
+-              .tree_fn = (tfn), \
+-              .node_fn = (nfn), \
+-              .prop_fn = (pfn), \
+-              .data = (d), \
+-              .level = (lvl), \
+-              .status = UNCHECKED, \
+-              .num_prereqs = ARRAY_SIZE(nm##_prereqs), \
+-              .prereq = nm##_prereqs, \
+-      };
+-
+-#define TREE_CHECK(nm, d, lvl, ...) \
+-      CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__)
+-#define NODE_CHECK(nm, d, lvl, ...) \
+-      CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__)
+-#define PROP_CHECK(nm, d, lvl, ...) \
+-      CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__)
+-#define BATCH_CHECK(nm, lvl, ...) \
+-      CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__)
+-
+-#ifdef __GNUC__
+-static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+-#endif
+-static inline void check_msg(struct check *c, const char *fmt, ...)
+-{
+-      va_list ap;
+-      va_start(ap, fmt);
+-
+-      if ((c->level < WARN) || (c->level <= quiet))
+-              return; /* Suppress message */
+-
+-      fprintf(stderr, "%s (%s): ",
+-              (c->level == ERROR) ? "ERROR" : "Warning", c->name);
+-      vfprintf(stderr, fmt, ap);
+-      fprintf(stderr, "\n");
+-}
+-
+-#define FAIL(c, ...) \
+-      do { \
+-              TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
+-              (c)->status = FAILED; \
+-              check_msg((c), __VA_ARGS__); \
+-      } while (0)
+-
+-static void check_nodes_props(struct check *c, struct node *dt, struct node *node)
+-{
+-      struct node *child;
+-      struct property *prop;
+-
+-      TRACE(c, "%s", node->fullpath);
+-      if (c->node_fn)
+-              c->node_fn(c, dt, node);
+-
+-      if (c->prop_fn)
+-              for_each_property(node, prop) {
+-                      TRACE(c, "%s\t'%s'", node->fullpath, prop->name);
+-                      c->prop_fn(c, dt, node, prop);
+-              }
+-
+-      for_each_child(node, child)
+-              check_nodes_props(c, dt, child);
+-}
+-
+-static int run_check(struct check *c, struct node *dt)
+-{
+-      int error = 0;
+-      int i;
+-
+-      assert(!c->inprogress);
+-
+-      if (c->status != UNCHECKED)
+-              goto out;
+-
+-      c->inprogress = 1;
+-
+-      for (i = 0; i < c->num_prereqs; i++) {
+-              struct check *prq = c->prereq[i];
+-              error |= run_check(prq, dt);
+-              if (prq->status != PASSED) {
+-                      c->status = PREREQ;
+-                      check_msg(c, "Failed prerequisite '%s'",
+-                                c->prereq[i]->name);
+-              }
+-      }
+-
+-      if (c->status != UNCHECKED)
+-              goto out;
+-
+-      if (c->node_fn || c->prop_fn)
+-              check_nodes_props(c, dt, dt);
+-
+-      if (c->tree_fn)
+-              c->tree_fn(c, dt);
+-      if (c->status == UNCHECKED)
+-              c->status = PASSED;
+-
+-      TRACE(c, "\tCompleted, status %d", c->status);
+-
+-out:
+-      c->inprogress = 0;
+-      if ((c->status != PASSED) && (c->level == ERROR))
+-              error = 1;
+-      return error;
+-}
+-
+-/*
+- * Utility check functions
+- */
+-
+-static void check_is_string(struct check *c, struct node *root,
+-                          struct node *node)
+-{
+-      struct property *prop;
+-      char *propname = c->data;
+-
+-      prop = get_property(node, propname);
+-      if (!prop)
+-              return; /* Not present, assumed ok */
+-
+-      if (!data_is_one_string(prop->val))
+-              FAIL(c, "\"%s\" property in %s is not a string",
+-                   propname, node->fullpath);
+-}
+-#define CHECK_IS_STRING(nm, propname, lvl) \
+-      CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl))
+-
+-static void check_is_cell(struct check *c, struct node *root,
+-                        struct node *node)
+-{
+-      struct property *prop;
+-      char *propname = c->data;
+-
+-      prop = get_property(node, propname);
+-      if (!prop)
+-              return; /* Not present, assumed ok */
+-
+-      if (prop->val.len != sizeof(cell_t))
+-              FAIL(c, "\"%s\" property in %s is not a single cell",
+-                   propname, node->fullpath);
+-}
+-#define CHECK_IS_CELL(nm, propname, lvl) \
+-      CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl))
+-
+-/*
+- * Structural check functions
+- */
+-
+-static void check_duplicate_node_names(struct check *c, struct node *dt,
+-                                     struct node *node)
+-{
+-      struct node *child, *child2;
+-
+-      for_each_child(node, child)
+-              for (child2 = child->next_sibling;
+-                   child2;
+-                   child2 = child2->next_sibling)
+-                      if (streq(child->name, child2->name))
+-                              FAIL(c, "Duplicate node name %s",
+-                                   child->fullpath);
+-}
+-NODE_CHECK(duplicate_node_names, NULL, ERROR);
+-
+-static void check_duplicate_property_names(struct check *c, struct node *dt,
+-                                         struct node *node)
+-{
+-      struct property *prop, *prop2;
+-
+-      for_each_property(node, prop)
+-              for (prop2 = prop->next; prop2; prop2 = prop2->next)
+-                      if (streq(prop->name, prop2->name))
+-                              FAIL(c, "Duplicate property name %s in %s",
+-                                   prop->name, node->fullpath);
+-}
+-NODE_CHECK(duplicate_property_names, NULL, ERROR);
+-
+-#define LOWERCASE     "abcdefghijklmnopqrstuvwxyz"
+-#define UPPERCASE     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+-#define DIGITS                "0123456789"
+-#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-"
+-
+-static void check_node_name_chars(struct check *c, struct node *dt,
+-                                struct node *node)
+-{
+-      int n = strspn(node->name, c->data);
+-
+-      if (n < strlen(node->name))
+-              FAIL(c, "Bad character '%c' in node %s",
+-                   node->name[n], node->fullpath);
+-}
+-NODE_CHECK(node_name_chars, PROPNODECHARS "@", ERROR);
+-
+-static void check_node_name_format(struct check *c, struct node *dt,
+-                                 struct node *node)
+-{
+-      if (strchr(get_unitname(node), '@'))
+-              FAIL(c, "Node %s has multiple '@' characters in name",
+-                   node->fullpath);
+-}
+-NODE_CHECK(node_name_format, NULL, ERROR, &node_name_chars);
+-
+-static void check_property_name_chars(struct check *c, struct node *dt,
+-                                    struct node *node, struct property *prop)
+-{
+-      int n = strspn(prop->name, c->data);
+-
+-      if (n < strlen(prop->name))
+-              FAIL(c, "Bad character '%c' in property name \"%s\", node %s",
+-                   prop->name[n], prop->name, node->fullpath);
+-}
+-PROP_CHECK(property_name_chars, PROPNODECHARS, ERROR);
+-
+-static void check_explicit_phandles(struct check *c, struct node *root,
+-                                        struct node *node)
+-{
+-      struct property *prop;
+-      struct node *other;
+-      cell_t phandle;
+-
+-      prop = get_property(node, "linux,phandle");
+-      if (! prop)
+-              return; /* No phandle, that's fine */
+-
+-      if (prop->val.len != sizeof(cell_t)) {
+-              FAIL(c, "%s has bad length (%d) linux,phandle property",
+-                   node->fullpath, prop->val.len);
+-              return;
+-      }
+-
+-      phandle = propval_cell(prop);
+-      if ((phandle == 0) || (phandle == -1)) {
+-              FAIL(c, "%s has invalid linux,phandle value 0x%x",
+-                   node->fullpath, phandle);
+-              return;
+-      }
+-
+-      other = get_node_by_phandle(root, phandle);
+-      if (other) {
+-              FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
+-                   node->fullpath, phandle, other->fullpath);
+-              return;
+-      }
+-
+-      node->phandle = phandle;
+-}
+-NODE_CHECK(explicit_phandles, NULL, ERROR);
+-
+-static void check_name_properties(struct check *c, struct node *root,
+-                                struct node *node)
+-{
+-      struct property **pp, *prop = NULL;
+-
+-      for (pp = &node->proplist; *pp; pp = &((*pp)->next))
+-              if (streq((*pp)->name, "name")) {
+-                      prop = *pp;
+-                      break;
+-              }
+-
+-      if (!prop)
+-              return; /* No name property, that's fine */
+-
+-      if ((prop->val.len != node->basenamelen+1)
+-          || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) {
+-              FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
+-                   " of base node name)", node->fullpath, prop->val.val);
+-      } else {
+-              /* The name property is correct, and therefore redundant.
+-               * Delete it */
+-              *pp = prop->next;
+-              free(prop->name);
+-              data_free(prop->val);
+-              free(prop);
+-      }
+-}
+-CHECK_IS_STRING(name_is_string, "name", ERROR);
+-NODE_CHECK(name_properties, NULL, ERROR, &name_is_string);
+-
+-/*
+- * Reference fixup functions
+- */
+-
+-static void fixup_phandle_references(struct check *c, struct node *dt,
+-                                   struct node *node, struct property *prop)
+-{
+-      struct marker *m = prop->val.markers;
+-      struct node *refnode;
+-      cell_t phandle;
+-
+-      for_each_marker_of_type(m, REF_PHANDLE) {
+-              assert(m->offset + sizeof(cell_t) <= prop->val.len);
+-
+-              refnode = get_node_by_ref(dt, m->ref);
+-              if (! refnode) {
+-                      FAIL(c, "Reference to non-existent node or label \"%s\"\n",
+-                           m->ref);
+-                      continue;
+-              }
+-
+-              phandle = get_node_phandle(dt, refnode);
+-              *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
+-      }
+-}
+-CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR,
+-      &duplicate_node_names, &explicit_phandles);
+-
+-static void fixup_path_references(struct check *c, struct node *dt,
+-                                struct node *node, struct property *prop)
+-{
+-      struct marker *m = prop->val.markers;
+-      struct node *refnode;
+-      char *path;
+-
+-      for_each_marker_of_type(m, REF_PATH) {
+-              assert(m->offset <= prop->val.len);
+-
+-              refnode = get_node_by_ref(dt, m->ref);
+-              if (!refnode) {
+-                      FAIL(c, "Reference to non-existent node or label \"%s\"\n",
+-                           m->ref);
+-                      continue;
+-              }
+-
+-              path = refnode->fullpath;
+-              prop->val = data_insert_at_marker(prop->val, m, path,
+-                                                strlen(path) + 1);
+-      }
+-}
+-CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR,
+-      &duplicate_node_names);
+-
+-/*
+- * Semantic checks
+- */
+-CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN);
+-CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN);
+-CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN);
+-
+-CHECK_IS_STRING(device_type_is_string, "device_type", WARN);
+-CHECK_IS_STRING(model_is_string, "model", WARN);
+-CHECK_IS_STRING(status_is_string, "status", WARN);
+-
+-static void fixup_addr_size_cells(struct check *c, struct node *dt,
+-                                struct node *node)
+-{
+-      struct property *prop;
+-
+-      node->addr_cells = -1;
+-      node->size_cells = -1;
+-
+-      prop = get_property(node, "#address-cells");
+-      if (prop)
+-              node->addr_cells = propval_cell(prop);
+-
+-      prop = get_property(node, "#size-cells");
+-      if (prop)
+-              node->size_cells = propval_cell(prop);
+-}
+-CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN,
+-      &address_cells_is_cell, &size_cells_is_cell);
+-
+-#define node_addr_cells(n) \
+-      (((n)->addr_cells == -1) ? 2 : (n)->addr_cells)
+-#define node_size_cells(n) \
+-      (((n)->size_cells == -1) ? 1 : (n)->size_cells)
+-
+-static void check_reg_format(struct check *c, struct node *dt,
+-                           struct node *node)
+-{
+-      struct property *prop;
+-      int addr_cells, size_cells, entrylen;
+-
+-      prop = get_property(node, "reg");
+-      if (!prop)
+-              return; /* No "reg", that's fine */
+-
+-      if (!node->parent) {
+-              FAIL(c, "Root node has a \"reg\" property");
+-              return;
+-      }
+-
+-      if (prop->val.len == 0)
+-              FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
+-
+-      addr_cells = node_addr_cells(node->parent);
+-      size_cells = node_size_cells(node->parent);
+-      entrylen = (addr_cells + size_cells) * sizeof(cell_t);
+-
+-      if ((prop->val.len % entrylen) != 0)
+-              FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
+-                   "(#address-cells == %d, #size-cells == %d)",
+-                   node->fullpath, prop->val.len, addr_cells, size_cells);
+-}
+-NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells);
+-
+-static void check_ranges_format(struct check *c, struct node *dt,
+-                              struct node *node)
+-{
+-      struct property *prop;
+-      int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen;
+-
+-      prop = get_property(node, "ranges");
+-      if (!prop)
+-              return;
+-
+-      if (!node->parent) {
+-              FAIL(c, "Root node has a \"ranges\" property");
+-              return;
+-      }
+-
+-      p_addr_cells = node_addr_cells(node->parent);
+-      p_size_cells = node_size_cells(node->parent);
+-      c_addr_cells = node_addr_cells(node);
+-      c_size_cells = node_size_cells(node);
+-      entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t);
+-
+-      if (prop->val.len == 0) {
+-              if (p_addr_cells != c_addr_cells)
+-                      FAIL(c, "%s has empty \"ranges\" property but its "
+-                           "#address-cells (%d) differs from %s (%d)",
+-                           node->fullpath, c_addr_cells, node->parent->fullpath,
+-                           p_addr_cells);
+-              if (p_size_cells != c_size_cells)
+-                      FAIL(c, "%s has empty \"ranges\" property but its "
+-                           "#size-cells (%d) differs from %s (%d)",
+-                           node->fullpath, c_size_cells, node->parent->fullpath,
+-                           p_size_cells);
+-      } else if ((prop->val.len % entrylen) != 0) {
+-              FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
+-                   "(parent #address-cells == %d, child #address-cells == %d, "
+-                   "#size-cells == %d)", node->fullpath, prop->val.len,
+-                   p_addr_cells, c_addr_cells, c_size_cells);
+-      }
+-}
+-NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells);
+-
+-/*
+- * Style checks
+- */
+-static void check_avoid_default_addr_size(struct check *c, struct node *dt,
+-                                        struct node *node)
+-{
+-      struct property *reg, *ranges;
+-
+-      if (!node->parent)
+-              return; /* Ignore root node */
+-
+-      reg = get_property(node, "reg");
+-      ranges = get_property(node, "ranges");
+-
+-      if (!reg && !ranges)
+-              return;
+-
+-      if ((node->parent->addr_cells == -1))
+-              FAIL(c, "Relying on default #address-cells value for %s",
+-                   node->fullpath);
+-
+-      if ((node->parent->size_cells == -1))
+-              FAIL(c, "Relying on default #size-cells value for %s",
+-                   node->fullpath);
+-}
+-NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells);
+-
+-static void check_obsolete_chosen_interrupt_controller(struct check *c,
+-                                                     struct node *dt)
+-{
+-      struct node *chosen;
+-      struct property *prop;
+-
+-      chosen = get_node_by_path(dt, "/chosen");
+-      if (!chosen)
+-              return;
+-
+-      prop = get_property(chosen, "interrupt-controller");
+-      if (prop)
+-              FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
+-                   "property");
+-}
+-TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN);
+-
+-static struct check *check_table[] = {
+-      &duplicate_node_names, &duplicate_property_names,
+-      &node_name_chars, &node_name_format, &property_name_chars,
+-      &name_is_string, &name_properties,
+-      &explicit_phandles,
+-      &phandle_references, &path_references,
+-
+-      &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
+-      &device_type_is_string, &model_is_string, &status_is_string,
+-
+-      &addr_size_cells, &reg_format, &ranges_format,
+-
+-      &avoid_default_addr_size,
+-      &obsolete_chosen_interrupt_controller,
+-};
+-
+-void process_checks(int force, struct boot_info *bi)
+-{
+-      struct node *dt = bi->dt;
+-      int i;
+-      int error = 0;
+-
+-      for (i = 0; i < ARRAY_SIZE(check_table); i++) {
+-              struct check *c = check_table[i];
+-
+-              if (c->level != IGNORE)
+-                      error = error || run_check(c, dt);
+-      }
+-
+-      if (error) {
+-              if (!force) {
+-                      fprintf(stderr, "ERROR: Input tree has errors, aborting "
+-                              "(use -f to force output)\n");
+-                      exit(2);
+-              } else if (quiet < 3) {
+-                      fprintf(stderr, "Warning: Input tree has errors, "
+-                              "output forced\n");
+-              }
+-      }
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/data.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/data.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/data.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/data.c      1970-01-01 01:00:00.000000000 +0100
+@@ -1,321 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-
+-void data_free(struct data d)
+-{
+-      struct marker *m, *nm;
+-
+-      m = d.markers;
+-      while (m) {
+-              nm = m->next;
+-              free(m->ref);
+-              free(m);
+-              m = nm;
+-      }
+-
+-      if (d.val)
+-              free(d.val);
+-}
+-
+-struct data data_grow_for(struct data d, int xlen)
+-{
+-      struct data nd;
+-      int newsize;
+-
+-      if (xlen == 0)
+-              return d;
+-
+-      nd = d;
+-
+-      newsize = xlen;
+-
+-      while ((d.len + xlen) > newsize)
+-              newsize *= 2;
+-
+-      nd.val = xrealloc(d.val, newsize);
+-
+-      return nd;
+-}
+-
+-struct data data_copy_mem(const char *mem, int len)
+-{
+-      struct data d;
+-
+-      d = data_grow_for(empty_data, len);
+-
+-      d.len = len;
+-      memcpy(d.val, mem, len);
+-
+-      return d;
+-}
+-
+-static char get_oct_char(const char *s, int *i)
+-{
+-      char x[4];
+-      char *endx;
+-      long val;
+-
+-      x[3] = '\0';
+-      strncpy(x, s + *i, 3);
+-
+-      val = strtol(x, &endx, 8);
+-
+-      assert(endx > x);
+-
+-      (*i) += endx - x;
+-      return val;
+-}
+-
+-static char get_hex_char(const char *s, int *i)
+-{
+-      char x[3];
+-      char *endx;
+-      long val;
+-
+-      x[2] = '\0';
+-      strncpy(x, s + *i, 2);
+-
+-      val = strtol(x, &endx, 16);
+-      if (!(endx  > x))
+-              die("\\x used with no following hex digits\n");
+-
+-      (*i) += endx - x;
+-      return val;
+-}
+-
+-struct data data_copy_escape_string(const char *s, int len)
+-{
+-      int i = 0;
+-      struct data d;
+-      char *q;
+-
+-      d = data_grow_for(empty_data, strlen(s)+1);
+-
+-      q = d.val;
+-      while (i < len) {
+-              char c = s[i++];
+-
+-              if (c != '\\') {
+-                      q[d.len++] = c;
+-                      continue;
+-              }
+-
+-              c = s[i++];
+-              assert(c);
+-              switch (c) {
+-              case 'a':
+-                      q[d.len++] = '\a';
+-                      break;
+-              case 'b':
+-                      q[d.len++] = '\b';
+-                      break;
+-              case 't':
+-                      q[d.len++] = '\t';
+-                      break;
+-              case 'n':
+-                      q[d.len++] = '\n';
+-                      break;
+-              case 'v':
+-                      q[d.len++] = '\v';
+-                      break;
+-              case 'f':
+-                      q[d.len++] = '\f';
+-                      break;
+-              case 'r':
+-                      q[d.len++] = '\r';
+-                      break;
+-              case '0':
+-              case '1':
+-              case '2':
+-              case '3':
+-              case '4':
+-              case '5':
+-              case '6':
+-              case '7':
+-                      i--; /* need to re-read the first digit as
+-                            * part of the octal value */
+-                      q[d.len++] = get_oct_char(s, &i);
+-                      break;
+-              case 'x':
+-                      q[d.len++] = get_hex_char(s, &i);
+-                      break;
+-              default:
+-                      q[d.len++] = c;
+-              }
+-      }
+-
+-      q[d.len++] = '\0';
+-      return d;
+-}
+-
+-struct data data_copy_file(FILE *f, size_t maxlen)
+-{
+-      struct data d = empty_data;
+-
+-      while (!feof(f) && (d.len < maxlen)) {
+-              size_t chunksize, ret;
+-
+-              if (maxlen == -1)
+-                      chunksize = 4096;
+-              else
+-                      chunksize = maxlen - d.len;
+-
+-              d = data_grow_for(d, chunksize);
+-              ret = fread(d.val + d.len, 1, chunksize, f);
+-
+-              if (ferror(f))
+-                      die("Error reading file into data: %s", strerror(errno));
+-
+-              if (d.len + ret < d.len)
+-                      die("Overflow reading file into data\n");
+-
+-              d.len += ret;
+-      }
+-
+-      return d;
+-}
+-
+-struct data data_append_data(struct data d, const void *p, int len)
+-{
+-      d = data_grow_for(d, len);
+-      memcpy(d.val + d.len, p, len);
+-      d.len += len;
+-      return d;
+-}
+-
+-struct data data_insert_at_marker(struct data d, struct marker *m,
+-                                const void *p, int len)
+-{
+-      d = data_grow_for(d, len);
+-      memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset);
+-      memcpy(d.val + m->offset, p, len);
+-      d.len += len;
+-
+-      /* Adjust all markers after the one we're inserting at */
+-      m = m->next;
+-      for_each_marker(m)
+-              m->offset += len;
+-      return d;
+-}
+-
+-struct data data_append_markers(struct data d, struct marker *m)
+-{
+-      struct marker **mp = &d.markers;
+-
+-      /* Find the end of the markerlist */
+-      while (*mp)
+-              mp = &((*mp)->next);
+-      *mp = m;
+-      return d;
+-}
+-
+-struct data data_merge(struct data d1, struct data d2)
+-{
+-      struct data d;
+-      struct marker *m2 = d2.markers;
+-
+-      d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2);
+-
+-      /* Adjust for the length of d1 */
+-      for_each_marker(m2)
+-              m2->offset += d1.len;
+-
+-      d2.markers = NULL; /* So data_free() doesn't clobber them */
+-      data_free(d2);
+-
+-      return d;
+-}
+-
+-struct data data_append_cell(struct data d, cell_t word)
+-{
+-      cell_t beword = cpu_to_fdt32(word);
+-
+-      return data_append_data(d, &beword, sizeof(beword));
+-}
+-
+-struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
+-{
+-      struct fdt_reserve_entry bere;
+-
+-      bere.address = cpu_to_fdt64(re->address);
+-      bere.size = cpu_to_fdt64(re->size);
+-
+-      return data_append_data(d, &bere, sizeof(bere));
+-}
+-
+-struct data data_append_addr(struct data d, uint64_t addr)
+-{
+-      uint64_t beaddr = cpu_to_fdt64(addr);
+-
+-      return data_append_data(d, &beaddr, sizeof(beaddr));
+-}
+-
+-struct data data_append_byte(struct data d, uint8_t byte)
+-{
+-      return data_append_data(d, &byte, 1);
+-}
+-
+-struct data data_append_zeroes(struct data d, int len)
+-{
+-      d = data_grow_for(d, len);
+-
+-      memset(d.val + d.len, 0, len);
+-      d.len += len;
+-      return d;
+-}
+-
+-struct data data_append_align(struct data d, int align)
+-{
+-      int newlen = ALIGN(d.len, align);
+-      return data_append_zeroes(d, newlen - d.len);
+-}
+-
+-struct data data_add_marker(struct data d, enum markertype type, char *ref)
+-{
+-      struct marker *m;
+-
+-      m = xmalloc(sizeof(*m));
+-      m->offset = d.len;
+-      m->type = type;
+-      m->ref = ref;
+-      m->next = NULL;
+-
+-      return data_append_markers(d, m);
+-}
+-
+-int data_is_one_string(struct data d)
+-{
+-      int i;
+-      int len = d.len;
+-
+-      if (len == 0)
+-              return 0;
+-
+-      for (i = 0; i < len-1; i++)
+-              if (d.val[i] == '\0')
+-                      return 0;
+-
+-      if (d.val[len-1] != '\0')
+-              return 0;
+-
+-      return 1;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc.c       1970-01-01 01:00:00.000000000 +0100
+@@ -1,226 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-#include "srcpos.h"
+-
+-#include "version_gen.h"
+-
+-/*
+- * Command line options
+- */
+-int quiet;            /* Level of quietness */
+-int reservenum;               /* Number of memory reservation slots */
+-int minsize;          /* Minimum blob size */
+-int padsize;          /* Additional padding to blob */
+-
+-char *join_path(const char *path, const char *name)
+-{
+-      int lenp = strlen(path);
+-      int lenn = strlen(name);
+-      int len;
+-      int needslash = 1;
+-      char *str;
+-
+-      len = lenp + lenn + 2;
+-      if ((lenp > 0) && (path[lenp-1] == '/')) {
+-              needslash = 0;
+-              len--;
+-      }
+-
+-      str = xmalloc(len);
+-      memcpy(str, path, lenp);
+-      if (needslash) {
+-              str[lenp] = '/';
+-              lenp++;
+-      }
+-      memcpy(str+lenp, name, lenn+1);
+-      return str;
+-}
+-
+-static void fill_fullpaths(struct node *tree, const char *prefix)
+-{
+-      struct node *child;
+-      const char *unit;
+-
+-      tree->fullpath = join_path(prefix, tree->name);
+-
+-      unit = strchr(tree->name, '@');
+-      if (unit)
+-              tree->basenamelen = unit - tree->name;
+-      else
+-              tree->basenamelen = strlen(tree->name);
+-
+-      for_each_child(tree, child)
+-              fill_fullpaths(child, tree->fullpath);
+-}
+-
+-static void  __attribute__ ((noreturn)) usage(void)
+-{
+-      fprintf(stderr, "Usage:\n");
+-      fprintf(stderr, "\tdtc [options] <input file>\n");
+-      fprintf(stderr, "\nOptions:\n");
+-      fprintf(stderr, "\t-h\n");
+-      fprintf(stderr, "\t\tThis help text\n");
+-      fprintf(stderr, "\t-q\n");
+-      fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n");
+-      fprintf(stderr, "\t-I <input format>\n");
+-      fprintf(stderr, "\t\tInput formats are:\n");
+-      fprintf(stderr, "\t\t\tdts - device tree source text\n");
+-      fprintf(stderr, "\t\t\tdtb - device tree blob\n");
+-      fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n");
+-      fprintf(stderr, "\t-o <output file>\n");
+-      fprintf(stderr, "\t-O <output format>\n");
+-      fprintf(stderr, "\t\tOutput formats are:\n");
+-      fprintf(stderr, "\t\t\tdts - device tree source text\n");
+-      fprintf(stderr, "\t\t\tdtb - device tree blob\n");
+-      fprintf(stderr, "\t\t\tasm - assembler source\n");
+-      fprintf(stderr, "\t-V <output version>\n");
+-      fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
+-      fprintf(stderr, "\t-R <number>\n");
+-      fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
+-      fprintf(stderr, "\t-S <bytes>\n");
+-      fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)\n");
+-      fprintf(stderr, "\t-p <bytes>\n");
+-      fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)\n");
+-      fprintf(stderr, "\t-b <number>\n");
+-      fprintf(stderr, "\t\tSet the physical boot cpu\n");
+-      fprintf(stderr, "\t-f\n");
+-      fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
+-      fprintf(stderr, "\t-v\n");
+-      fprintf(stderr, "\t\tPrint DTC version and exit\n");
+-      exit(3);
+-}
+-
+-int main(int argc, char *argv[])
+-{
+-      struct boot_info *bi;
+-      const char *inform = "dts";
+-      const char *outform = "dts";
+-      const char *outname = "-";
+-      int force = 0, check = 0;
+-      const char *arg;
+-      int opt;
+-      FILE *outf = NULL;
+-      int outversion = DEFAULT_FDT_VERSION;
+-      long long cmdline_boot_cpuid = -1;
+-
+-      quiet      = 0;
+-      reservenum = 0;
+-      minsize    = 0;
+-      padsize    = 0;
+-
+-      while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) {
+-              switch (opt) {
+-              case 'I':
+-                      inform = optarg;
+-                      break;
+-              case 'O':
+-                      outform = optarg;
+-                      break;
+-              case 'o':
+-                      outname = optarg;
+-                      break;
+-              case 'V':
+-                      outversion = strtol(optarg, NULL, 0);
+-                      break;
+-              case 'R':
+-                      reservenum = strtol(optarg, NULL, 0);
+-                      break;
+-              case 'S':
+-                      minsize = strtol(optarg, NULL, 0);
+-                      break;
+-              case 'p':
+-                      padsize = strtol(optarg, NULL, 0);
+-                      break;
+-              case 'f':
+-                      force = 1;
+-                      break;
+-              case 'c':
+-                      check = 1;
+-                      break;
+-              case 'q':
+-                      quiet++;
+-                      break;
+-              case 'b':
+-                      cmdline_boot_cpuid = strtoll(optarg, NULL, 0);
+-                      break;
+-              case 'v':
+-                      printf("Version: %s\n", DTC_VERSION);
+-                      exit(0);
+-              case 'h':
+-              default:
+-                      usage();
+-              }
+-      }
+-
+-      if (argc > (optind+1))
+-              usage();
+-      else if (argc < (optind+1))
+-              arg = "-";
+-      else
+-              arg = argv[optind];
+-
+-      /* minsize and padsize are mutually exclusive */
+-      if (minsize && padsize)
+-              die("Can't set both -p and -S\n");
+-
+-      fprintf(stderr, "DTC: %s->%s  on file \"%s\"\n",
+-              inform, outform, arg);
+-
+-      if (streq(inform, "dts"))
+-              bi = dt_from_source(arg);
+-      else if (streq(inform, "fs"))
+-              bi = dt_from_fs(arg);
+-      else if(streq(inform, "dtb"))
+-              bi = dt_from_blob(arg);
+-      else
+-              die("Unknown input format \"%s\"\n", inform);
+-
+-      if (cmdline_boot_cpuid != -1)
+-              bi->boot_cpuid_phys = cmdline_boot_cpuid;
+-
+-      fill_fullpaths(bi->dt, "");
+-      process_checks(force, bi);
+-
+-
+-      if (streq(outname, "-")) {
+-              outf = stdout;
+-      } else {
+-              outf = fopen(outname, "w");
+-              if (! outf)
+-                      die("Couldn't open output file %s: %s\n",
+-                          outname, strerror(errno));
+-      }
+-
+-      if (streq(outform, "dts")) {
+-              dt_to_source(outf, bi);
+-      } else if (streq(outform, "dtb")) {
+-              dt_to_blob(outf, bi, outversion);
+-      } else if (streq(outform, "asm")) {
+-              dt_to_asm(outf, bi, outversion);
+-      } else if (streq(outform, "null")) {
+-              /* do nothing */
+-      } else {
+-              die("Unknown output format \"%s\"\n", outform);
+-      }
+-
+-      exit(0);
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc.h linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1,246 +0,0 @@
+-#ifndef _DTC_H
+-#define _DTC_H
+-
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 <stdio.h>
+-#include <string.h>
+-#include <stdlib.h>
+-#include <stdint.h>
+-#include <stdarg.h>
+-#include <assert.h>
+-#include <ctype.h>
+-#include <errno.h>
+-#include <unistd.h>
+-
+-#include <libfdt_env.h>
+-#include <fdt.h>
+-
+-#define DEFAULT_FDT_VERSION   17
+-/*
+- * Command line options
+- */
+-extern int quiet;             /* Level of quietness */
+-extern int reservenum;                /* Number of memory reservation slots */
+-extern int minsize;           /* Minimum blob size */
+-extern int padsize;           /* Additional padding to blob */
+-
+-static inline void __attribute__((noreturn)) die(char * str, ...)
+-{
+-      va_list ap;
+-
+-      va_start(ap, str);
+-      fprintf(stderr, "FATAL ERROR: ");
+-      vfprintf(stderr, str, ap);
+-      exit(1);
+-}
+-
+-static inline void *xmalloc(size_t len)
+-{
+-      void *new = malloc(len);
+-
+-      if (! new)
+-              die("malloc() failed\n");
+-
+-      return new;
+-}
+-
+-static inline void *xrealloc(void *p, size_t len)
+-{
+-      void *new = realloc(p, len);
+-
+-      if (! new)
+-              die("realloc() failed (len=%d)\n", len);
+-
+-      return new;
+-}
+-
+-typedef uint32_t cell_t;
+-
+-
+-#define streq(a, b)   (strcmp((a), (b)) == 0)
+-#define strneq(a, b, n)       (strncmp((a), (b), (n)) == 0)
+-
+-#define ALIGN(x, a)   (((x) + (a) - 1) & ~((a) - 1))
+-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+-
+-/* Data blobs */
+-enum markertype {
+-      REF_PHANDLE,
+-      REF_PATH,
+-      LABEL,
+-};
+-
+-struct  marker {
+-      enum markertype type;
+-      int offset;
+-      char *ref;
+-      struct marker *next;
+-};
+-
+-struct data {
+-      int len;
+-      char *val;
+-      struct marker *markers;
+-};
+-
+-
+-#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
+-
+-#define for_each_marker(m) \
+-      for (; (m); (m) = (m)->next)
+-#define for_each_marker_of_type(m, t) \
+-      for_each_marker(m) \
+-              if ((m)->type == (t))
+-
+-void data_free(struct data d);
+-
+-struct data data_grow_for(struct data d, int xlen);
+-
+-struct data data_copy_mem(const char *mem, int len);
+-struct data data_copy_escape_string(const char *s, int len);
+-struct data data_copy_file(FILE *f, size_t len);
+-
+-struct data data_append_data(struct data d, const void *p, int len);
+-struct data data_insert_at_marker(struct data d, struct marker *m,
+-                                const void *p, int len);
+-struct data data_merge(struct data d1, struct data d2);
+-struct data data_append_cell(struct data d, cell_t word);
+-struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
+-struct data data_append_addr(struct data d, uint64_t addr);
+-struct data data_append_byte(struct data d, uint8_t byte);
+-struct data data_append_zeroes(struct data d, int len);
+-struct data data_append_align(struct data d, int align);
+-
+-struct data data_add_marker(struct data d, enum markertype type, char *ref);
+-
+-int data_is_one_string(struct data d);
+-
+-/* DT constraints */
+-
+-#define MAX_PROPNAME_LEN      31
+-#define MAX_NODENAME_LEN      31
+-
+-/* Live trees */
+-struct property {
+-      char *name;
+-      struct data val;
+-
+-      struct property *next;
+-
+-      char *label;
+-};
+-
+-struct node {
+-      char *name;
+-      struct property *proplist;
+-      struct node *children;
+-
+-      struct node *parent;
+-      struct node *next_sibling;
+-
+-      char *fullpath;
+-      int basenamelen;
+-
+-      cell_t phandle;
+-      int addr_cells, size_cells;
+-
+-      char *label;
+-};
+-
+-#define for_each_property(n, p) \
+-      for ((p) = (n)->proplist; (p); (p) = (p)->next)
+-
+-#define for_each_child(n, c)  \
+-      for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
+-
+-struct property *build_property(char *name, struct data val, char *label);
+-struct property *chain_property(struct property *first, struct property *list);
+-struct property *reverse_properties(struct property *first);
+-
+-struct node *build_node(struct property *proplist, struct node *children);
+-struct node *name_node(struct node *node, char *name, char *label);
+-struct node *chain_node(struct node *first, struct node *list);
+-
+-void add_property(struct node *node, struct property *prop);
+-void add_child(struct node *parent, struct node *child);
+-
+-const char *get_unitname(struct node *node);
+-struct property *get_property(struct node *node, const char *propname);
+-cell_t propval_cell(struct property *prop);
+-struct node *get_subnode(struct node *node, const char *nodename);
+-struct node *get_node_by_path(struct node *tree, const char *path);
+-struct node *get_node_by_label(struct node *tree, const char *label);
+-struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
+-struct node *get_node_by_ref(struct node *tree, const char *ref);
+-cell_t get_node_phandle(struct node *root, struct node *node);
+-
+-/* Boot info (tree plus memreserve information */
+-
+-struct reserve_info {
+-      struct fdt_reserve_entry re;
+-
+-      struct reserve_info *next;
+-
+-      char *label;
+-};
+-
+-struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label);
+-struct reserve_info *chain_reserve_entry(struct reserve_info *first,
+-                                       struct reserve_info *list);
+-struct reserve_info *add_reserve_entry(struct reserve_info *list,
+-                                     struct reserve_info *new);
+-
+-
+-struct boot_info {
+-      struct reserve_info *reservelist;
+-      struct node *dt;                /* the device tree */
+-      uint32_t boot_cpuid_phys;
+-};
+-
+-struct boot_info *build_boot_info(struct reserve_info *reservelist,
+-                                struct node *tree, uint32_t boot_cpuid_phys);
+-
+-/* Checks */
+-
+-void process_checks(int force, struct boot_info *bi);
+-
+-/* Flattened trees */
+-
+-void dt_to_blob(FILE *f, struct boot_info *bi, int version);
+-void dt_to_asm(FILE *f, struct boot_info *bi, int version);
+-
+-struct boot_info *dt_from_blob(const char *fname);
+-
+-/* Tree source */
+-
+-void dt_to_source(FILE *f, struct boot_info *bi);
+-struct boot_info *dt_from_source(const char *f);
+-
+-/* FS trees */
+-
+-struct boot_info *dt_from_fs(const char *dirname);
+-
+-/* misc */
+-
+-char *join_path(const char *path, const char *name);
+-
+-#endif /* _DTC_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-lexer.l linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-lexer.l
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-lexer.l     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-lexer.l 1970-01-01 01:00:00.000000000 +0100
+@@ -1,320 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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
+- */
+-
+-%option noyywrap nounput yylineno
+-
+-%x INCLUDE
+-%x BYTESTRING
+-%x PROPNODENAME
+-%s V1
+-
+-PROPNODECHAR  [a-zA-Z0-9,._+*#?@-]
+-PATHCHAR      ({PROPNODECHAR}|[/])
+-LABEL         [a-zA-Z_][a-zA-Z0-9_]*
+-STRING                \"([^\\"]|\\.)*\"
+-WS            [[:space:]]
+-COMMENT               "/*"([^*]|\*+[^*/])*\*+"/"
+-LINECOMMENT   "//".*\n
+-
+-%{
+-#include "dtc.h"
+-#include "srcpos.h"
+-#include "dtc-parser.tab.h"
+-
+-
+-/*#define LEXDEBUG    1*/
+-
+-#ifdef LEXDEBUG
+-#define DPRINT(fmt, ...)      fprintf(stderr, fmt, ##__VA_ARGS__)
+-#else
+-#define DPRINT(fmt, ...)      do { } while (0)
+-#endif
+-
+-static int dts_version; /* = 0 */
+-
+-#define BEGIN_DEFAULT()       if (dts_version == 0) { \
+-                              DPRINT("<INITIAL>\n"); \
+-                              BEGIN(INITIAL); \
+-                      } else { \
+-                              DPRINT("<V1>\n"); \
+-                              BEGIN(V1); \
+-                      }
+-
+-static void push_input_file(const char *filename);
+-static int pop_input_file(void);
+-%}
+-
+-%%
+-<*>"/include/"{WS}*{STRING} {
+-                      char *name = strchr(yytext, '\"') + 1;
+-                      yytext[yyleng-1] = '\0';
+-                      push_input_file(name);
+-              }
+-
+-<*><<EOF>>            {
+-                      if (!pop_input_file()) {
+-                              yyterminate();
+-                      }
+-              }
+-
+-<*>{STRING}   {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("String: %s\n", yytext);
+-                      yylval.data = data_copy_escape_string(yytext+1,
+-                                      yyleng-2);
+-                      yylloc.first_line = yylineno;
+-                      return DT_STRING;
+-              }
+-
+-<*>"/dts-v1/" {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Keyword: /dts-v1/\n");
+-                      dts_version = 1;
+-                      BEGIN_DEFAULT();
+-                      return DT_V1;
+-              }
+-
+-<*>"/memreserve/"     {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Keyword: /memreserve/\n");
+-                      BEGIN_DEFAULT();
+-                      return DT_MEMRESERVE;
+-              }
+-
+-<*>{LABEL}:   {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Label: %s\n", yytext);
+-                      yylval.labelref = strdup(yytext);
+-                      yylval.labelref[yyleng-1] = '\0';
+-                      return DT_LABEL;
+-              }
+-
+-<INITIAL>[bodh]# {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      if (*yytext == 'b')
+-                              yylval.cbase = 2;
+-                      else if (*yytext == 'o')
+-                              yylval.cbase = 8;
+-                      else if (*yytext == 'd')
+-                              yylval.cbase = 10;
+-                      else
+-                              yylval.cbase = 16;
+-                      DPRINT("Base: %d\n", yylval.cbase);
+-                      return DT_BASE;
+-              }
+-
+-<INITIAL>[0-9a-fA-F]+ {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.literal = strdup(yytext);
+-                      DPRINT("Literal: '%s'\n", yylval.literal);
+-                      return DT_LEGACYLITERAL;
+-              }
+-
+-<V1>[0-9]+|0[xX][0-9a-fA-F]+      {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.literal = strdup(yytext);
+-                      DPRINT("Literal: '%s'\n", yylval.literal);
+-                      return DT_LITERAL;
+-              }
+-
+-\&{LABEL}     {       /* label reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Ref: %s\n", yytext+1);
+-                      yylval.labelref = strdup(yytext+1);
+-                      return DT_REF;
+-              }
+-
+-"&{/"{PATHCHAR}+\}    {       /* new-style path reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yytext[yyleng-1] = '\0';
+-                      DPRINT("Ref: %s\n", yytext+2);
+-                      yylval.labelref = strdup(yytext+2);
+-                      return DT_REF;
+-              }
+-
+-<INITIAL>"&/"{PATHCHAR}+ {    /* old-style path reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Ref: %s\n", yytext+1);
+-                      yylval.labelref = strdup(yytext+1);
+-                      return DT_REF;
+-              }
+-
+-<BYTESTRING>[0-9a-fA-F]{2} {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.byte = strtol(yytext, NULL, 16);
+-                      DPRINT("Byte: %02x\n", (int)yylval.byte);
+-                      return DT_BYTE;
+-              }
+-
+-<BYTESTRING>"]"       {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("/BYTESTRING\n");
+-                      BEGIN_DEFAULT();
+-                      return ']';
+-              }
+-
+-<PROPNODENAME>{PROPNODECHAR}+ {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("PropNodeName: %s\n", yytext);
+-                      yylval.propnodename = strdup(yytext);
+-                      BEGIN_DEFAULT();
+-                      return DT_PROPNODENAME;
+-              }
+-
+-"/incbin/"    {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Binary Include\n");
+-                      return DT_INCBIN;
+-              }
+-
+-<*>{WS}+      /* eat whitespace */
+-<*>{COMMENT}+ /* eat C-style comments */
+-<*>{LINECOMMENT}+ /* eat C++-style comments */
+-
+-<*>.          {
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Char: %c (\\x%02x)\n", yytext[0],
+-                              (unsigned)yytext[0]);
+-                      if (yytext[0] == '[') {
+-                              DPRINT("<BYTESTRING>\n");
+-                              BEGIN(BYTESTRING);
+-                      }
+-                      if ((yytext[0] == '{')
+-                          || (yytext[0] == ';')) {
+-                              DPRINT("<PROPNODENAME>\n");
+-                              BEGIN(PROPNODENAME);
+-                      }
+-                      return yytext[0];
+-              }
+-
+-%%
+-
+-
+-/*
+- * Stack of nested include file contexts.
+- */
+-
+-struct incl_file {
+-      struct dtc_file *file;
+-      YY_BUFFER_STATE yy_prev_buf;
+-      int yy_prev_lineno;
+-      struct incl_file *prev;
+-};
+-
+-static struct incl_file *incl_file_stack;
+-
+-
+-/*
+- * Detect infinite include recursion.
+- */
+-#define MAX_INCLUDE_DEPTH     (100)
+-
+-static int incl_depth = 0;
+-
+-
+-static void push_input_file(const char *filename)
+-{
+-      struct incl_file *incl_file;
+-      struct dtc_file *newfile;
+-      struct search_path search, *searchptr = NULL;
+-
+-      assert(filename);
+-
+-      if (incl_depth++ >= MAX_INCLUDE_DEPTH)
+-              die("Includes nested too deeply");
+-
+-      if (srcpos_file) {
+-              search.dir = srcpos_file->dir;
+-              search.next = NULL;
+-              search.prev = NULL;
+-              searchptr = &search;
+-      }
+-
+-      newfile = dtc_open_file(filename, searchptr);
+-
+-      incl_file = xmalloc(sizeof(struct incl_file));
+-
+-      /*
+-       * Save current context.
+-       */
+-      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
+-      incl_file->yy_prev_lineno = yylineno;
+-      incl_file->file = srcpos_file;
+-      incl_file->prev = incl_file_stack;
+-
+-      incl_file_stack = incl_file;
+-
+-      /*
+-       * Establish new context.
+-       */
+-      srcpos_file = newfile;
+-      yylineno = 1;
+-      yyin = newfile->file;
+-      yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+-}
+-
+-
+-static int pop_input_file(void)
+-{
+-      struct incl_file *incl_file;
+-
+-      if (incl_file_stack == 0)
+-              return 0;
+-
+-      dtc_close_file(srcpos_file);
+-
+-      /*
+-       * Pop.
+-       */
+-      --incl_depth;
+-      incl_file = incl_file_stack;
+-      incl_file_stack = incl_file->prev;
+-
+-      /*
+-       * Recover old context.
+-       */
+-      yy_delete_buffer(YY_CURRENT_BUFFER);
+-      yy_switch_to_buffer(incl_file->yy_prev_buf);
+-      yylineno = incl_file->yy_prev_lineno;
+-      srcpos_file = incl_file->file;
+-      yyin = incl_file->file ? incl_file->file->file : NULL;
+-
+-      /*
+-       * Free old state.
+-       */
+-      free(incl_file);
+-
+-      return 1;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped     1970-01-01 01:00:00.000000000 +0100
+@@ -1,2187 +0,0 @@
+-#line 2 "dtc-lexer.lex.c"
+-
+-#line 4 "dtc-lexer.lex.c"
+-
+-#define  YY_INT_ALIGNED short int
+-
+-/* A lexical scanner generated by flex */
+-
+-#define FLEX_SCANNER
+-#define YY_FLEX_MAJOR_VERSION 2
+-#define YY_FLEX_MINOR_VERSION 5
+-#define YY_FLEX_SUBMINOR_VERSION 34
+-#if YY_FLEX_SUBMINOR_VERSION > 0
+-#define FLEX_BETA
+-#endif
+-
+-/* First, we deal with  platform-specific or compiler-specific issues. */
+-
+-/* begin standard C headers. */
+-#include <stdio.h>
+-#include <string.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-
+-/* end standard C headers. */
+-
+-/* flex integer type definitions */
+-
+-#ifndef FLEXINT_H
+-#define FLEXINT_H
+-
+-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+-
+-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+-
+-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+- * if you want the limit (max/min) macros for int types. 
+- */
+-#ifndef __STDC_LIMIT_MACROS
+-#define __STDC_LIMIT_MACROS 1
+-#endif
+-
+-#include <inttypes.h>
+-typedef int8_t flex_int8_t;
+-typedef uint8_t flex_uint8_t;
+-typedef int16_t flex_int16_t;
+-typedef uint16_t flex_uint16_t;
+-typedef int32_t flex_int32_t;
+-typedef uint32_t flex_uint32_t;
+-#else
+-typedef signed char flex_int8_t;
+-typedef short int flex_int16_t;
+-typedef int flex_int32_t;
+-typedef unsigned char flex_uint8_t; 
+-typedef unsigned short int flex_uint16_t;
+-typedef unsigned int flex_uint32_t;
+-#endif /* ! C99 */
+-
+-/* Limits of integral types. */
+-#ifndef INT8_MIN
+-#define INT8_MIN               (-128)
+-#endif
+-#ifndef INT16_MIN
+-#define INT16_MIN              (-32767-1)
+-#endif
+-#ifndef INT32_MIN
+-#define INT32_MIN              (-2147483647-1)
+-#endif
+-#ifndef INT8_MAX
+-#define INT8_MAX               (127)
+-#endif
+-#ifndef INT16_MAX
+-#define INT16_MAX              (32767)
+-#endif
+-#ifndef INT32_MAX
+-#define INT32_MAX              (2147483647)
+-#endif
+-#ifndef UINT8_MAX
+-#define UINT8_MAX              (255U)
+-#endif
+-#ifndef UINT16_MAX
+-#define UINT16_MAX             (65535U)
+-#endif
+-#ifndef UINT32_MAX
+-#define UINT32_MAX             (4294967295U)
+-#endif
+-
+-#endif /* ! FLEXINT_H */
+-
+-#ifdef __cplusplus
+-
+-/* The "const" storage-class-modifier is valid. */
+-#define YY_USE_CONST
+-
+-#else /* ! __cplusplus */
+-
+-/* C99 requires __STDC__ to be defined as 1. */
+-#if defined (__STDC__)
+-
+-#define YY_USE_CONST
+-
+-#endif        /* defined (__STDC__) */
+-#endif        /* ! __cplusplus */
+-
+-#ifdef YY_USE_CONST
+-#define yyconst const
+-#else
+-#define yyconst
+-#endif
+-
+-/* Returned upon end-of-file. */
+-#define YY_NULL 0
+-
+-/* Promotes a possibly negative, possibly signed char to an unsigned
+- * integer for use as an array index.  If the signed char is negative,
+- * we want to instead treat it as an 8-bit unsigned char, hence the
+- * double cast.
+- */
+-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+-
+-/* Enter a start condition.  This macro really ought to take a parameter,
+- * but we do it the disgusting crufty way forced on us by the ()-less
+- * definition of BEGIN.
+- */
+-#define BEGIN (yy_start) = 1 + 2 *
+-
+-/* Translate the current start state into a value that can be later handed
+- * to BEGIN to return to the state.  The YYSTATE alias is for lex
+- * compatibility.
+- */
+-#define YY_START (((yy_start) - 1) / 2)
+-#define YYSTATE YY_START
+-
+-/* Action number for EOF rule of a given start state. */
+-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+-
+-/* Special action meaning "start processing a new file". */
+-#define YY_NEW_FILE yyrestart(yyin  )
+-
+-#define YY_END_OF_BUFFER_CHAR 0
+-
+-/* Size of default input buffer. */
+-#ifndef YY_BUF_SIZE
+-#define YY_BUF_SIZE 16384
+-#endif
+-
+-/* The state buf must be large enough to hold one state per character in the main buffer.
+- */
+-#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+-
+-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+-#define YY_TYPEDEF_YY_BUFFER_STATE
+-typedef struct yy_buffer_state *YY_BUFFER_STATE;
+-#endif
+-
+-extern int yyleng;
+-
+-extern FILE *yyin, *yyout;
+-
+-#define EOB_ACT_CONTINUE_SCAN 0
+-#define EOB_ACT_END_OF_FILE 1
+-#define EOB_ACT_LAST_MATCH 2
+-
+-    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+-     *       access to the local variable yy_act. Since yyless() is a macro, it would break
+-     *       existing scanners that call yyless() from OUTSIDE yylex. 
+-     *       One obvious solution it to make yy_act a global. I tried that, and saw
+-     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
+-     *       normally declared as a register variable-- so it is not worth it.
+-     */
+-    #define  YY_LESS_LINENO(n) \
+-            do { \
+-                int yyl;\
+-                for ( yyl = n; yyl < yyleng; ++yyl )\
+-                    if ( yytext[yyl] == '\n' )\
+-                        --yylineno;\
+-            }while(0)
+-    
+-/* Return all but the first "n" matched characters back to the input stream. */
+-#define yyless(n) \
+-      do \
+-              { \
+-              /* Undo effects of setting up yytext. */ \
+-        int yyless_macro_arg = (n); \
+-        YY_LESS_LINENO(yyless_macro_arg);\
+-              *yy_cp = (yy_hold_char); \
+-              YY_RESTORE_YY_MORE_OFFSET \
+-              (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+-              YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+-              } \
+-      while ( 0 )
+-
+-#define unput(c) yyunput( c, (yytext_ptr)  )
+-
+-/* The following is because we cannot portably get our hands on size_t
+- * (without autoconf's help, which isn't available because we want
+- * flex-generated scanners to compile on their own).
+- * Given that the standard has decreed that size_t exists since 1989,
+- * I guess we can afford to depend on it. Manoj.
+- */
+-
+-#ifndef YY_TYPEDEF_YY_SIZE_T
+-#define YY_TYPEDEF_YY_SIZE_T
+-typedef size_t yy_size_t;
+-#endif
+-
+-#ifndef YY_STRUCT_YY_BUFFER_STATE
+-#define YY_STRUCT_YY_BUFFER_STATE
+-struct yy_buffer_state
+-      {
+-      FILE *yy_input_file;
+-
+-      char *yy_ch_buf;                /* input buffer */
+-      char *yy_buf_pos;               /* current position in input buffer */
+-
+-      /* Size of input buffer in bytes, not including room for EOB
+-       * characters.
+-       */
+-      yy_size_t yy_buf_size;
+-
+-      /* Number of characters read into yy_ch_buf, not including EOB
+-       * characters.
+-       */
+-      int yy_n_chars;
+-
+-      /* Whether we "own" the buffer - i.e., we know we created it,
+-       * and can realloc() it to grow it, and should free() it to
+-       * delete it.
+-       */
+-      int yy_is_our_buffer;
+-
+-      /* Whether this is an "interactive" input source; if so, and
+-       * if we're using stdio for input, then we want to use getc()
+-       * instead of fread(), to make sure we stop fetching input after
+-       * each newline.
+-       */
+-      int yy_is_interactive;
+-
+-      /* Whether we're considered to be at the beginning of a line.
+-       * If so, '^' rules will be active on the next match, otherwise
+-       * not.
+-       */
+-      int yy_at_bol;
+-
+-    int yy_bs_lineno; /**< The line count. */
+-    int yy_bs_column; /**< The column count. */
+-    
+-      /* Whether to try to fill the input buffer when we reach the
+-       * end of it.
+-       */
+-      int yy_fill_buffer;
+-
+-      int yy_buffer_status;
+-
+-#define YY_BUFFER_NEW 0
+-#define YY_BUFFER_NORMAL 1
+-      /* When an EOF's been seen but there's still some text to process
+-       * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+-       * shouldn't try reading from the input source any more.  We might
+-       * still have a bunch of tokens to match, though, because of
+-       * possible backing-up.
+-       *
+-       * When we actually see the EOF, we change the status to "new"
+-       * (via yyrestart()), so that the user can continue scanning by
+-       * just pointing yyin at a new input file.
+-       */
+-#define YY_BUFFER_EOF_PENDING 2
+-
+-      };
+-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+-
+-/* Stack of input buffers. */
+-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+-
+-/* We provide macros for accessing buffer states in case in the
+- * future we want to put the buffer states in a more general
+- * "scanner state".
+- *
+- * Returns the top of the stack, or NULL.
+- */
+-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+-                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+-                          : NULL)
+-
+-/* Same as previous macro, but useful when we know that the buffer stack is not
+- * NULL or when we need an lvalue. For internal use only.
+- */
+-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+-
+-/* yy_hold_char holds the character lost when yytext is formed. */
+-static char yy_hold_char;
+-static int yy_n_chars;                /* number of characters read into yy_ch_buf */
+-int yyleng;
+-
+-/* Points to current character in buffer. */
+-static char *yy_c_buf_p = (char *) 0;
+-static int yy_init = 0;               /* whether we need to initialize */
+-static int yy_start = 0;      /* start state number */
+-
+-/* Flag which is used to allow yywrap()'s to do buffer switches
+- * instead of setting up a fresh yyin.  A bit of a hack ...
+- */
+-static int yy_did_buffer_switch_on_eof;
+-
+-void yyrestart (FILE *input_file  );
+-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
+-void yy_delete_buffer (YY_BUFFER_STATE b  );
+-void yy_flush_buffer (YY_BUFFER_STATE b  );
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
+-void yypop_buffer_state (void );
+-
+-static void yyensure_buffer_stack (void );
+-static void yy_load_buffer_state (void );
+-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+-
+-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+-
+-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
+-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
+-
+-void *yyalloc (yy_size_t  );
+-void *yyrealloc (void *,yy_size_t  );
+-void yyfree (void *  );
+-
+-#define yy_new_buffer yy_create_buffer
+-
+-#define yy_set_interactive(is_interactive) \
+-      { \
+-      if ( ! YY_CURRENT_BUFFER ){ \
+-        yyensure_buffer_stack (); \
+-              YY_CURRENT_BUFFER_LVALUE =    \
+-            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+-      } \
+-      YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+-      }
+-
+-#define yy_set_bol(at_bol) \
+-      { \
+-      if ( ! YY_CURRENT_BUFFER ){\
+-        yyensure_buffer_stack (); \
+-              YY_CURRENT_BUFFER_LVALUE =    \
+-            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+-      } \
+-      YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+-      }
+-
+-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+-
+-/* Begin user sect3 */
+-
+-#define yywrap(n) 1
+-#define YY_SKIP_YYWRAP
+-
+-typedef unsigned char YY_CHAR;
+-
+-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+-
+-typedef int yy_state_type;
+-
+-extern int yylineno;
+-
+-int yylineno = 1;
+-
+-extern char *yytext;
+-#define yytext_ptr yytext
+-
+-static yy_state_type yy_get_previous_state (void );
+-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+-static int yy_get_next_buffer (void );
+-static void yy_fatal_error (yyconst char msg[]  );
+-
+-/* Done after the current pattern has been matched and before the
+- * corresponding action - sets up yytext.
+- */
+-#define YY_DO_BEFORE_ACTION \
+-      (yytext_ptr) = yy_bp; \
+-      yyleng = (size_t) (yy_cp - yy_bp); \
+-      (yy_hold_char) = *yy_cp; \
+-      *yy_cp = '\0'; \
+-      (yy_c_buf_p) = yy_cp;
+-
+-#define YY_NUM_RULES 20
+-#define YY_END_OF_BUFFER 21
+-/* This struct is not used in this scanner,
+-   but its presence is necessary. */
+-struct yy_trans_info
+-      {
+-      flex_int32_t yy_verify;
+-      flex_int32_t yy_nxt;
+-      };
+-static yyconst flex_int16_t yy_accept[104] =
+-    {   0,
+-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+-       21,   19,   16,   16,   19,   19,   19,    7,    7,   19,
+-        7,   19,   19,   19,   19,   13,   14,   14,   19,    8,
+-        8,   16,    0,    2,    0,    0,    9,    0,    0,    0,
+-        0,    0,    0,    7,    7,    5,    0,    6,    0,   12,
+-       12,   14,   14,    8,    0,   11,    9,    0,    0,    0,
+-        0,   18,    0,    0,    0,    0,    8,    0,   17,    0,
+-        0,    0,    0,    0,   10,    0,    0,    0,    0,    0,
+-        0,    0,    0,    0,    0,    0,    0,    0,    3,   15,
+-        0,    0,    0,    0,    0,    0,    0,    0,    1,    0,
+-
+-        0,    4,    0
+-    } ;
+-
+-static yyconst flex_int32_t yy_ec[256] =
+-    {   0,
+-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+-        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    2,    1,    4,    5,    1,    1,    6,    1,    1,
+-        1,    7,    8,    8,    9,    8,   10,   11,   12,   13,
+-       13,   13,   13,   13,   13,   13,   13,   14,    1,    1,
+-        1,    1,    8,    8,   15,   15,   15,   15,   15,   15,
+-       16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+-       16,   16,   16,   16,   16,   16,   16,   17,   16,   16,
+-        1,   18,   19,    1,   16,    1,   15,   20,   21,   22,
+-
+-       23,   15,   16,   24,   25,   16,   16,   26,   27,   28,
+-       24,   16,   16,   29,   30,   31,   32,   33,   16,   17,
+-       16,   16,   34,    1,   35,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1
+-    } ;
+-
+-static yyconst flex_int32_t yy_meta[36] =
+-    {   0,
+-        1,    1,    1,    1,    2,    1,    2,    2,    2,    3,
+-        4,    4,    4,    5,    6,    7,    7,    1,    1,    6,
+-        6,    6,    6,    7,    7,    7,    7,    7,    7,    7,
+-        7,    7,    7,    8,    1
+-    } ;
+-
+-static yyconst flex_int16_t yy_base[117] =
+-    {   0,
+-        0,    0,   30,    0,   44,    0,   67,    0,   97,  105,
+-      302,  303,   35,   44,   40,   94,  112,    0,  129,  152,
+-      296,  295,  159,    0,  176,  303,    0,  116,   95,  165,
+-       49,   46,  102,  303,  296,    0,    0,  288,  290,  293,
+-      264,  266,  270,    0,    0,  303,    0,  303,  264,  303,
+-        0,    0,  195,  101,    0,    0,    0,    0,  284,  125,
+-      277,  265,  225,  230,  216,  218,    0,  202,  224,  221,
+-      217,  107,  196,  188,  303,  206,  179,  186,  178,  185,
+-      183,  162,  161,  150,  169,  160,  145,  125,  303,  303,
+-      137,  109,  190,  103,  203,  167,  108,  197,  303,  123,
+-
+-       29,  303,  303,  215,  221,  226,  229,  234,  240,  246,
+-      250,  257,  265,  270,  275,  282
+-    } ;
+-
+-static yyconst flex_int16_t yy_def[117] =
+-    {   0,
+-      103,    1,    1,    3,    3,    5,  103,    7,    3,    3,
+-      103,  103,  103,  103,  104,  105,  103,  106,  103,   19,
+-       19,   20,  103,  107,   20,  103,  108,  109,  105,  103,
+-      103,  103,  104,  103,  104,  110,  111,  103,  112,  113,
+-      103,  103,  103,  106,   19,  103,   20,  103,  103,  103,
+-       20,  108,  109,  103,  114,  110,  111,  115,  112,  112,
+-      113,  103,  103,  103,  103,  103,  114,  115,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  116,  103,  116,  103,  116,
+-
+-      103,  103,    0,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103
+-    } ;
+-
+-static yyconst flex_int16_t yy_nxt[339] =
+-    {   0,
+-       12,   13,   14,   15,   12,   16,   12,   12,   12,   17,
+-       18,   18,   18,   12,   19,   20,   20,   12,   12,   21,
+-       19,   21,   19,   22,   20,   20,   20,   20,   20,   20,
+-       20,   20,   20,   12,   12,   12,   32,   32,  102,   23,
+-       12,   12,   12,   34,   20,   32,   32,   32,   32,   20,
+-       20,   20,   20,   20,   24,   24,   24,   35,   25,   54,
+-       54,   54,   26,   25,   25,   25,   25,   12,   13,   14,
+-       15,   27,   12,   27,   27,   27,   23,   27,   27,   27,
+-       12,   28,   28,   28,   12,   12,   28,   28,   28,   28,
+-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+-
+-       12,   12,   29,   36,  103,   34,   17,   30,   31,   31,
+-       29,   54,   54,   54,   17,   30,   31,   31,   39,   35,
+-       52,   40,   52,   52,   52,  103,   78,   38,   38,   46,
+-      101,   60,   79,   41,   69,   97,   42,   94,   43,   45,
+-       45,   45,   46,   45,   47,   47,   93,   92,   45,   45,
+-       45,   45,   47,   47,   47,   47,   47,   47,   47,   47,
+-       47,   47,   47,   47,   47,   39,   47,   91,   40,   90,
+-       99,   47,   47,   47,   47,   54,   54,   54,   89,   88,
+-       41,   55,   87,   49,  100,   43,   51,   51,   51,   86,
+-       51,   95,   95,   96,   85,   51,   51,   51,   51,   52,
+-
+-       99,   52,   52,   52,   95,   95,   96,   84,   46,   83,
+-       82,   81,   39,   79,  100,   33,   33,   33,   33,   33,
+-       33,   33,   33,   37,   80,   77,   37,   37,   37,   44,
+-       40,   44,   50,   76,   50,   52,   75,   52,   74,   52,
+-       52,   53,   73,   53,   53,   53,   53,   56,   56,   56,
+-       72,   56,   56,   57,   71,   57,   57,   59,   59,   59,
+-       59,   59,   59,   59,   59,   61,   61,   61,   61,   61,
+-       61,   61,   61,   67,   70,   67,   68,   68,   68,   62,
+-       68,   68,   98,   98,   98,   98,   98,   98,   98,   98,
+-       60,   66,   65,   64,   63,   62,   60,   58,  103,   48,
+-
+-       48,  103,   11,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103
+-    } ;
+-
+-static yyconst flex_int16_t yy_chk[339] =
+-    {   0,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+-        1,    1,    1,    1,    1,    3,   13,   13,  101,    3,
+-        3,    3,    3,   15,    3,   14,   14,   32,   32,    3,
+-        3,    3,    3,    3,    5,    5,    5,   15,    5,   31,
+-       31,   31,    5,    5,    5,    5,    5,    7,    7,    7,
+-        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+-        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+-        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+-
+-        7,    7,    9,   16,   29,   33,    9,    9,    9,    9,
+-       10,   54,   54,   54,   10,   10,   10,   10,   17,   33,
+-       28,   17,   28,   28,   28,  100,   72,   16,   29,   28,
+-       97,   60,   72,   17,   60,   94,   17,   92,   17,   19,
+-       19,   19,   19,   19,   19,   19,   91,   88,   19,   19,
+-       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
+-       19,   19,   20,   20,   20,   23,   20,   87,   23,   86,
+-       96,   20,   20,   20,   20,   30,   30,   30,   85,   84,
+-       23,   30,   83,   23,   96,   23,   25,   25,   25,   82,
+-       25,   93,   93,   93,   81,   25,   25,   25,   25,   53,
+-
+-       98,   53,   53,   53,   95,   95,   95,   80,   53,   79,
+-       78,   77,   76,   74,   98,  104,  104,  104,  104,  104,
+-      104,  104,  104,  105,   73,   71,  105,  105,  105,  106,
+-       70,  106,  107,   69,  107,  108,   68,  108,   66,  108,
+-      108,  109,   65,  109,  109,  109,  109,  110,  110,  110,
+-       64,  110,  110,  111,   63,  111,  111,  112,  112,  112,
+-      112,  112,  112,  112,  112,  113,  113,  113,  113,  113,
+-      113,  113,  113,  114,   62,  114,  115,  115,  115,   61,
+-      115,  115,  116,  116,  116,  116,  116,  116,  116,  116,
+-       59,   49,   43,   42,   41,   40,   39,   38,   35,   22,
+-
+-       21,   11,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+-      103,  103,  103,  103,  103,  103,  103,  103
+-    } ;
+-
+-/* Table of booleans, true if rule could match eol. */
+-static yyconst flex_int32_t yy_rule_can_match_eol[21] =
+-    {   0,
+-1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
+-    0,     };
+-
+-static yy_state_type yy_last_accepting_state;
+-static char *yy_last_accepting_cpos;
+-
+-extern int yy_flex_debug;
+-int yy_flex_debug = 0;
+-
+-/* The intent behind this definition is that it'll catch
+- * any uses of REJECT which flex missed.
+- */
+-#define REJECT reject_used_but_not_detected
+-#define yymore() yymore_used_but_not_detected
+-#define YY_MORE_ADJ 0
+-#define YY_RESTORE_YY_MORE_OFFSET
+-char *yytext;
+-#line 1 "dtc-lexer.l"
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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
+- */
+-
+-
+-
+-
+-#line 37 "dtc-lexer.l"
+-#include "dtc.h"
+-#include "srcpos.h"
+-#include "dtc-parser.tab.h"
+-
+-
+-/*#define LEXDEBUG    1*/
+-
+-#ifdef LEXDEBUG
+-#define DPRINT(fmt, ...)      fprintf(stderr, fmt, ##__VA_ARGS__)
+-#else
+-#define DPRINT(fmt, ...)      do { } while (0)
+-#endif
+-
+-static int dts_version; /* = 0 */
+-
+-#define BEGIN_DEFAULT()       if (dts_version == 0) { \
+-                              DPRINT("<INITIAL>\n"); \
+-                              BEGIN(INITIAL); \
+-                      } else { \
+-                              DPRINT("<V1>\n"); \
+-                              BEGIN(V1); \
+-                      }
+-
+-static void push_input_file(const char *filename);
+-static int pop_input_file(void);
+-#line 638 "dtc-lexer.lex.c"
+-
+-#define INITIAL 0
+-#define INCLUDE 1
+-#define BYTESTRING 2
+-#define PROPNODENAME 3
+-#define V1 4
+-
+-#ifndef YY_NO_UNISTD_H
+-/* Special case for "unistd.h", since it is non-ANSI. We include it way
+- * down here because we want the user's section 1 to have been scanned first.
+- * The user has a chance to override it with an option.
+- */
+-#include <unistd.h>
+-#endif
+-
+-#ifndef YY_EXTRA_TYPE
+-#define YY_EXTRA_TYPE void *
+-#endif
+-
+-static int yy_init_globals (void );
+-
+-/* Macros after this point can all be overridden by user definitions in
+- * section 1.
+- */
+-
+-#ifndef YY_SKIP_YYWRAP
+-#ifdef __cplusplus
+-extern "C" int yywrap (void );
+-#else
+-extern int yywrap (void );
+-#endif
+-#endif
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char *,yyconst char *,int );
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * );
+-#endif
+-
+-#ifndef YY_NO_INPUT
+-
+-#ifdef __cplusplus
+-static int yyinput (void );
+-#else
+-static int input (void );
+-#endif
+-
+-#endif
+-
+-/* Amount of stuff to slurp up with each read. */
+-#ifndef YY_READ_BUF_SIZE
+-#define YY_READ_BUF_SIZE 8192
+-#endif
+-
+-/* Copy whatever the last rule matched to the standard output. */
+-#ifndef ECHO
+-/* This used to be an fputs(), but since the string might contain NUL's,
+- * we now use fwrite().
+- */
+-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+-#endif
+-
+-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+- * is returned in "result".
+- */
+-#ifndef YY_INPUT
+-#define YY_INPUT(buf,result,max_size) \
+-      if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+-              { \
+-              int c = '*'; \
+-              int n; \
+-              for ( n = 0; n < max_size && \
+-                           (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+-                      buf[n] = (char) c; \
+-              if ( c == '\n' ) \
+-                      buf[n++] = (char) c; \
+-              if ( c == EOF && ferror( yyin ) ) \
+-                      YY_FATAL_ERROR( "input in flex scanner failed" ); \
+-              result = n; \
+-              } \
+-      else \
+-              { \
+-              errno=0; \
+-              while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+-                      { \
+-                      if( errno != EINTR) \
+-                              { \
+-                              YY_FATAL_ERROR( "input in flex scanner failed" ); \
+-                              break; \
+-                              } \
+-                      errno=0; \
+-                      clearerr(yyin); \
+-                      } \
+-              }\
+-\
+-
+-#endif
+-
+-/* No semi-colon after return; correct usage is to write "yyterminate();" -
+- * we don't want an extra ';' after the "return" because that will cause
+- * some compilers to complain about unreachable statements.
+- */
+-#ifndef yyterminate
+-#define yyterminate() return YY_NULL
+-#endif
+-
+-/* Number of entries by which start-condition stack grows. */
+-#ifndef YY_START_STACK_INCR
+-#define YY_START_STACK_INCR 25
+-#endif
+-
+-/* Report a fatal error. */
+-#ifndef YY_FATAL_ERROR
+-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+-#endif
+-
+-/* end tables serialization structures and prototypes */
+-
+-/* Default declaration of generated scanner - a define so the user can
+- * easily add parameters.
+- */
+-#ifndef YY_DECL
+-#define YY_DECL_IS_OURS 1
+-
+-extern int yylex (void);
+-
+-#define YY_DECL int yylex (void)
+-#endif /* !YY_DECL */
+-
+-/* Code executed at the beginning of each rule, after yytext and yyleng
+- * have been set up.
+- */
+-#ifndef YY_USER_ACTION
+-#define YY_USER_ACTION
+-#endif
+-
+-/* Code executed at the end of each rule. */
+-#ifndef YY_BREAK
+-#define YY_BREAK break;
+-#endif
+-
+-#define YY_RULE_SETUP \
+-      YY_USER_ACTION
+-
+-/** The main scanner function which does all the work.
+- */
+-YY_DECL
+-{
+-      register yy_state_type yy_current_state;
+-      register char *yy_cp, *yy_bp;
+-      register int yy_act;
+-    
+-#line 64 "dtc-lexer.l"
+-
+-#line 795 "dtc-lexer.lex.c"
+-
+-      if ( !(yy_init) )
+-              {
+-              (yy_init) = 1;
+-
+-#ifdef YY_USER_INIT
+-              YY_USER_INIT;
+-#endif
+-
+-              if ( ! (yy_start) )
+-                      (yy_start) = 1; /* first start state */
+-
+-              if ( ! yyin )
+-                      yyin = stdin;
+-
+-              if ( ! yyout )
+-                      yyout = stdout;
+-
+-              if ( ! YY_CURRENT_BUFFER ) {
+-                      yyensure_buffer_stack ();
+-                      YY_CURRENT_BUFFER_LVALUE =
+-                              yy_create_buffer(yyin,YY_BUF_SIZE );
+-              }
+-
+-              yy_load_buffer_state( );
+-              }
+-
+-      while ( 1 )             /* loops until end-of-file is reached */
+-              {
+-              yy_cp = (yy_c_buf_p);
+-
+-              /* Support of yytext. */
+-              *yy_cp = (yy_hold_char);
+-
+-              /* yy_bp points to the position in yy_ch_buf of the start of
+-               * the current run.
+-               */
+-              yy_bp = yy_cp;
+-
+-              yy_current_state = (yy_start);
+-yy_match:
+-              do
+-                      {
+-                      register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+-                      if ( yy_accept[yy_current_state] )
+-                              {
+-                              (yy_last_accepting_state) = yy_current_state;
+-                              (yy_last_accepting_cpos) = yy_cp;
+-                              }
+-                      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+-                              {
+-                              yy_current_state = (int) yy_def[yy_current_state];
+-                              if ( yy_current_state >= 104 )
+-                                      yy_c = yy_meta[(unsigned int) yy_c];
+-                              }
+-                      yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+-                      ++yy_cp;
+-                      }
+-              while ( yy_base[yy_current_state] != 303 );
+-
+-yy_find_action:
+-              yy_act = yy_accept[yy_current_state];
+-              if ( yy_act == 0 )
+-                      { /* have to back up */
+-                      yy_cp = (yy_last_accepting_cpos);
+-                      yy_current_state = (yy_last_accepting_state);
+-                      yy_act = yy_accept[yy_current_state];
+-                      }
+-
+-              YY_DO_BEFORE_ACTION;
+-
+-              if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+-                      {
+-                      int yyl;
+-                      for ( yyl = 0; yyl < yyleng; ++yyl )
+-                              if ( yytext[yyl] == '\n' )
+-                                         
+-    yylineno++;
+-;
+-                      }
+-
+-do_action:    /* This label is used only to access EOF actions. */
+-
+-              switch ( yy_act )
+-      { /* beginning of action switch */
+-                      case 0: /* must back up */
+-                      /* undo the effects of YY_DO_BEFORE_ACTION */
+-                      *yy_cp = (yy_hold_char);
+-                      yy_cp = (yy_last_accepting_cpos);
+-                      yy_current_state = (yy_last_accepting_state);
+-                      goto yy_find_action;
+-
+-case 1:
+-/* rule 1 can match eol */
+-YY_RULE_SETUP
+-#line 65 "dtc-lexer.l"
+-{
+-                      char *name = strchr(yytext, '\"') + 1;
+-                      yytext[yyleng-1] = '\0';
+-                      push_input_file(name);
+-              }
+-      YY_BREAK
+-case YY_STATE_EOF(INITIAL):
+-case YY_STATE_EOF(INCLUDE):
+-case YY_STATE_EOF(BYTESTRING):
+-case YY_STATE_EOF(PROPNODENAME):
+-case YY_STATE_EOF(V1):
+-#line 71 "dtc-lexer.l"
+-{
+-                      if (!pop_input_file()) {
+-                              yyterminate();
+-                      }
+-              }
+-      YY_BREAK
+-case 2:
+-/* rule 2 can match eol */
+-YY_RULE_SETUP
+-#line 77 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("String: %s\n", yytext);
+-                      yylval.data = data_copy_escape_string(yytext+1,
+-                                      yyleng-2);
+-                      yylloc.first_line = yylineno;
+-                      return DT_STRING;
+-              }
+-      YY_BREAK
+-case 3:
+-YY_RULE_SETUP
+-#line 87 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Keyword: /dts-v1/\n");
+-                      dts_version = 1;
+-                      BEGIN_DEFAULT();
+-                      return DT_V1;
+-              }
+-      YY_BREAK
+-case 4:
+-YY_RULE_SETUP
+-#line 96 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Keyword: /memreserve/\n");
+-                      BEGIN_DEFAULT();
+-                      return DT_MEMRESERVE;
+-              }
+-      YY_BREAK
+-case 5:
+-YY_RULE_SETUP
+-#line 104 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Label: %s\n", yytext);
+-                      yylval.labelref = strdup(yytext);
+-                      yylval.labelref[yyleng-1] = '\0';
+-                      return DT_LABEL;
+-              }
+-      YY_BREAK
+-case 6:
+-YY_RULE_SETUP
+-#line 113 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      if (*yytext == 'b')
+-                              yylval.cbase = 2;
+-                      else if (*yytext == 'o')
+-                              yylval.cbase = 8;
+-                      else if (*yytext == 'd')
+-                              yylval.cbase = 10;
+-                      else
+-                              yylval.cbase = 16;
+-                      DPRINT("Base: %d\n", yylval.cbase);
+-                      return DT_BASE;
+-              }
+-      YY_BREAK
+-case 7:
+-YY_RULE_SETUP
+-#line 128 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.literal = strdup(yytext);
+-                      DPRINT("Literal: '%s'\n", yylval.literal);
+-                      return DT_LEGACYLITERAL;
+-              }
+-      YY_BREAK
+-case 8:
+-YY_RULE_SETUP
+-#line 136 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.literal = strdup(yytext);
+-                      DPRINT("Literal: '%s'\n", yylval.literal);
+-                      return DT_LITERAL;
+-              }
+-      YY_BREAK
+-case 9:
+-YY_RULE_SETUP
+-#line 144 "dtc-lexer.l"
+-{     /* label reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Ref: %s\n", yytext+1);
+-                      yylval.labelref = strdup(yytext+1);
+-                      return DT_REF;
+-              }
+-      YY_BREAK
+-case 10:
+-YY_RULE_SETUP
+-#line 152 "dtc-lexer.l"
+-{     /* new-style path reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yytext[yyleng-1] = '\0';
+-                      DPRINT("Ref: %s\n", yytext+2);
+-                      yylval.labelref = strdup(yytext+2);
+-                      return DT_REF;
+-              }
+-      YY_BREAK
+-case 11:
+-YY_RULE_SETUP
+-#line 161 "dtc-lexer.l"
+-{     /* old-style path reference */
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Ref: %s\n", yytext+1);
+-                      yylval.labelref = strdup(yytext+1);
+-                      return DT_REF;
+-              }
+-      YY_BREAK
+-case 12:
+-YY_RULE_SETUP
+-#line 169 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      yylval.byte = strtol(yytext, NULL, 16);
+-                      DPRINT("Byte: %02x\n", (int)yylval.byte);
+-                      return DT_BYTE;
+-              }
+-      YY_BREAK
+-case 13:
+-YY_RULE_SETUP
+-#line 177 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("/BYTESTRING\n");
+-                      BEGIN_DEFAULT();
+-                      return ']';
+-              }
+-      YY_BREAK
+-case 14:
+-YY_RULE_SETUP
+-#line 185 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("PropNodeName: %s\n", yytext);
+-                      yylval.propnodename = strdup(yytext);
+-                      BEGIN_DEFAULT();
+-                      return DT_PROPNODENAME;
+-              }
+-      YY_BREAK
+-case 15:
+-YY_RULE_SETUP
+-#line 194 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Binary Include\n");
+-                      return DT_INCBIN;
+-              }
+-      YY_BREAK
+-case 16:
+-/* rule 16 can match eol */
+-YY_RULE_SETUP
+-#line 201 "dtc-lexer.l"
+-/* eat whitespace */
+-      YY_BREAK
+-case 17:
+-/* rule 17 can match eol */
+-YY_RULE_SETUP
+-#line 202 "dtc-lexer.l"
+-/* eat C-style comments */
+-      YY_BREAK
+-case 18:
+-/* rule 18 can match eol */
+-YY_RULE_SETUP
+-#line 203 "dtc-lexer.l"
+-/* eat C++-style comments */
+-      YY_BREAK
+-case 19:
+-YY_RULE_SETUP
+-#line 205 "dtc-lexer.l"
+-{
+-                      yylloc.file = srcpos_file;
+-                      yylloc.first_line = yylineno;
+-                      DPRINT("Char: %c (\\x%02x)\n", yytext[0],
+-                              (unsigned)yytext[0]);
+-                      if (yytext[0] == '[') {
+-                              DPRINT("<BYTESTRING>\n");
+-                              BEGIN(BYTESTRING);
+-                      }
+-                      if ((yytext[0] == '{')
+-                          || (yytext[0] == ';')) {
+-                              DPRINT("<PROPNODENAME>\n");
+-                              BEGIN(PROPNODENAME);
+-                      }
+-                      return yytext[0];
+-              }
+-      YY_BREAK
+-case 20:
+-YY_RULE_SETUP
+-#line 222 "dtc-lexer.l"
+-ECHO;
+-      YY_BREAK
+-#line 1120 "dtc-lexer.lex.c"
+-
+-      case YY_END_OF_BUFFER:
+-              {
+-              /* Amount of text matched not including the EOB char. */
+-              int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+-
+-              /* Undo the effects of YY_DO_BEFORE_ACTION. */
+-              *yy_cp = (yy_hold_char);
+-              YY_RESTORE_YY_MORE_OFFSET
+-
+-              if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+-                      {
+-                      /* We're scanning a new file or input source.  It's
+-                       * possible that this happened because the user
+-                       * just pointed yyin at a new source and called
+-                       * yylex().  If so, then we have to assure
+-                       * consistency between YY_CURRENT_BUFFER and our
+-                       * globals.  Here is the right place to do so, because
+-                       * this is the first action (other than possibly a
+-                       * back-up) that will match for the new input source.
+-                       */
+-                      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+-                      YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+-                      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+-                      }
+-
+-              /* Note that here we test for yy_c_buf_p "<=" to the position
+-               * of the first EOB in the buffer, since yy_c_buf_p will
+-               * already have been incremented past the NUL character
+-               * (since all states make transitions on EOB to the
+-               * end-of-buffer state).  Contrast this with the test
+-               * in input().
+-               */
+-              if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+-                      { /* This was really a NUL. */
+-                      yy_state_type yy_next_state;
+-
+-                      (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+-
+-                      yy_current_state = yy_get_previous_state(  );
+-
+-                      /* Okay, we're now positioned to make the NUL
+-                       * transition.  We couldn't have
+-                       * yy_get_previous_state() go ahead and do it
+-                       * for us because it doesn't know how to deal
+-                       * with the possibility of jamming (and we don't
+-                       * want to build jamming into it because then it
+-                       * will run more slowly).
+-                       */
+-
+-                      yy_next_state = yy_try_NUL_trans( yy_current_state );
+-
+-                      yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+-
+-                      if ( yy_next_state )
+-                              {
+-                              /* Consume the NUL. */
+-                              yy_cp = ++(yy_c_buf_p);
+-                              yy_current_state = yy_next_state;
+-                              goto yy_match;
+-                              }
+-
+-                      else
+-                              {
+-                              yy_cp = (yy_c_buf_p);
+-                              goto yy_find_action;
+-                              }
+-                      }
+-
+-              else switch ( yy_get_next_buffer(  ) )
+-                      {
+-                      case EOB_ACT_END_OF_FILE:
+-                              {
+-                              (yy_did_buffer_switch_on_eof) = 0;
+-
+-                              if ( yywrap( ) )
+-                                      {
+-                                      /* Note: because we've taken care in
+-                                       * yy_get_next_buffer() to have set up
+-                                       * yytext, we can now set up
+-                                       * yy_c_buf_p so that if some total
+-                                       * hoser (like flex itself) wants to
+-                                       * call the scanner after we return the
+-                                       * YY_NULL, it'll still work - another
+-                                       * YY_NULL will get returned.
+-                                       */
+-                                      (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+-
+-                                      yy_act = YY_STATE_EOF(YY_START);
+-                                      goto do_action;
+-                                      }
+-
+-                              else
+-                                      {
+-                                      if ( ! (yy_did_buffer_switch_on_eof) )
+-                                              YY_NEW_FILE;
+-                                      }
+-                              break;
+-                              }
+-
+-                      case EOB_ACT_CONTINUE_SCAN:
+-                              (yy_c_buf_p) =
+-                                      (yytext_ptr) + yy_amount_of_matched_text;
+-
+-                              yy_current_state = yy_get_previous_state(  );
+-
+-                              yy_cp = (yy_c_buf_p);
+-                              yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+-                              goto yy_match;
+-
+-                      case EOB_ACT_LAST_MATCH:
+-                              (yy_c_buf_p) =
+-                              &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+-
+-                              yy_current_state = yy_get_previous_state(  );
+-
+-                              yy_cp = (yy_c_buf_p);
+-                              yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+-                              goto yy_find_action;
+-                      }
+-              break;
+-              }
+-
+-      default:
+-              YY_FATAL_ERROR(
+-                      "fatal flex scanner internal error--no action found" );
+-      } /* end of action switch */
+-              } /* end of scanning one token */
+-} /* end of yylex */
+-
+-/* yy_get_next_buffer - try to read in a new buffer
+- *
+- * Returns a code representing an action:
+- *    EOB_ACT_LAST_MATCH -
+- *    EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+- *    EOB_ACT_END_OF_FILE - end of file
+- */
+-static int yy_get_next_buffer (void)
+-{
+-      register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+-      register char *source = (yytext_ptr);
+-      register int number_to_move, i;
+-      int ret_val;
+-
+-      if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+-              YY_FATAL_ERROR(
+-              "fatal flex scanner internal error--end of buffer missed" );
+-
+-      if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+-              { /* Don't try to fill the buffer, so this is an EOF. */
+-              if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+-                      {
+-                      /* We matched a single character, the EOB, so
+-                       * treat this as a final EOF.
+-                       */
+-                      return EOB_ACT_END_OF_FILE;
+-                      }
+-
+-              else
+-                      {
+-                      /* We matched some text prior to the EOB, first
+-                       * process it.
+-                       */
+-                      return EOB_ACT_LAST_MATCH;
+-                      }
+-              }
+-
+-      /* Try to read more data. */
+-
+-      /* First move last chars to start of buffer. */
+-      number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+-
+-      for ( i = 0; i < number_to_move; ++i )
+-              *(dest++) = *(source++);
+-
+-      if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+-              /* don't do the read, it's not guaranteed to return an EOF,
+-               * just force an EOF
+-               */
+-              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+-
+-      else
+-              {
+-                      int num_to_read =
+-                      YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+-
+-              while ( num_to_read <= 0 )
+-                      { /* Not enough room in the buffer - grow it. */
+-
+-                      /* just a shorter name for the current buffer */
+-                      YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+-
+-                      int yy_c_buf_p_offset =
+-                              (int) ((yy_c_buf_p) - b->yy_ch_buf);
+-
+-                      if ( b->yy_is_our_buffer )
+-                              {
+-                              int new_size = b->yy_buf_size * 2;
+-
+-                              if ( new_size <= 0 )
+-                                      b->yy_buf_size += b->yy_buf_size / 8;
+-                              else
+-                                      b->yy_buf_size *= 2;
+-
+-                              b->yy_ch_buf = (char *)
+-                                      /* Include room in for 2 EOB chars. */
+-                                      yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+-                              }
+-                      else
+-                              /* Can't grow it, we don't own it. */
+-                              b->yy_ch_buf = 0;
+-
+-                      if ( ! b->yy_ch_buf )
+-                              YY_FATAL_ERROR(
+-                              "fatal error - scanner input buffer overflow" );
+-
+-                      (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+-
+-                      num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+-                                              number_to_move - 1;
+-
+-                      }
+-
+-              if ( num_to_read > YY_READ_BUF_SIZE )
+-                      num_to_read = YY_READ_BUF_SIZE;
+-
+-              /* Read in more data. */
+-              YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+-                      (yy_n_chars), (size_t) num_to_read );
+-
+-              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+-              }
+-
+-      if ( (yy_n_chars) == 0 )
+-              {
+-              if ( number_to_move == YY_MORE_ADJ )
+-                      {
+-                      ret_val = EOB_ACT_END_OF_FILE;
+-                      yyrestart(yyin  );
+-                      }
+-
+-              else
+-                      {
+-                      ret_val = EOB_ACT_LAST_MATCH;
+-                      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+-                              YY_BUFFER_EOF_PENDING;
+-                      }
+-              }
+-
+-      else
+-              ret_val = EOB_ACT_CONTINUE_SCAN;
+-
+-      if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+-              /* Extend the array by 50%, plus the number we really need. */
+-              yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+-              YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+-              if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+-                      YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+-      }
+-
+-      (yy_n_chars) += number_to_move;
+-      YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+-      YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+-
+-      (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+-
+-      return ret_val;
+-}
+-
+-/* yy_get_previous_state - get the state just before the EOB char was reached */
+-
+-    static yy_state_type yy_get_previous_state (void)
+-{
+-      register yy_state_type yy_current_state;
+-      register char *yy_cp;
+-    
+-      yy_current_state = (yy_start);
+-
+-      for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+-              {
+-              register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+-              if ( yy_accept[yy_current_state] )
+-                      {
+-                      (yy_last_accepting_state) = yy_current_state;
+-                      (yy_last_accepting_cpos) = yy_cp;
+-                      }
+-              while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+-                      {
+-                      yy_current_state = (int) yy_def[yy_current_state];
+-                      if ( yy_current_state >= 104 )
+-                              yy_c = yy_meta[(unsigned int) yy_c];
+-                      }
+-              yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+-              }
+-
+-      return yy_current_state;
+-}
+-
+-/* yy_try_NUL_trans - try to make a transition on the NUL character
+- *
+- * synopsis
+- *    next_state = yy_try_NUL_trans( current_state );
+- */
+-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+-{
+-      register int yy_is_jam;
+-      register char *yy_cp = (yy_c_buf_p);
+-
+-      register YY_CHAR yy_c = 1;
+-      if ( yy_accept[yy_current_state] )
+-              {
+-              (yy_last_accepting_state) = yy_current_state;
+-              (yy_last_accepting_cpos) = yy_cp;
+-              }
+-      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+-              {
+-              yy_current_state = (int) yy_def[yy_current_state];
+-              if ( yy_current_state >= 104 )
+-                      yy_c = yy_meta[(unsigned int) yy_c];
+-              }
+-      yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+-      yy_is_jam = (yy_current_state == 103);
+-
+-      return yy_is_jam ? 0 : yy_current_state;
+-}
+-
+-#ifndef YY_NO_INPUT
+-#ifdef __cplusplus
+-    static int yyinput (void)
+-#else
+-    static int input  (void)
+-#endif
+-
+-{
+-      int c;
+-    
+-      *(yy_c_buf_p) = (yy_hold_char);
+-
+-      if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+-              {
+-              /* yy_c_buf_p now points to the character we want to return.
+-               * If this occurs *before* the EOB characters, then it's a
+-               * valid NUL; if not, then we've hit the end of the buffer.
+-               */
+-              if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+-                      /* This was really a NUL. */
+-                      *(yy_c_buf_p) = '\0';
+-
+-              else
+-                      { /* need more input */
+-                      int offset = (yy_c_buf_p) - (yytext_ptr);
+-                      ++(yy_c_buf_p);
+-
+-                      switch ( yy_get_next_buffer(  ) )
+-                              {
+-                              case EOB_ACT_LAST_MATCH:
+-                                      /* This happens because yy_g_n_b()
+-                                       * sees that we've accumulated a
+-                                       * token and flags that we need to
+-                                       * try matching the token before
+-                                       * proceeding.  But for input(),
+-                                       * there's no matching to consider.
+-                                       * So convert the EOB_ACT_LAST_MATCH
+-                                       * to EOB_ACT_END_OF_FILE.
+-                                       */
+-
+-                                      /* Reset buffer status. */
+-                                      yyrestart(yyin );
+-
+-                                      /*FALLTHROUGH*/
+-
+-                              case EOB_ACT_END_OF_FILE:
+-                                      {
+-                                      if ( yywrap( ) )
+-                                              return EOF;
+-
+-                                      if ( ! (yy_did_buffer_switch_on_eof) )
+-                                              YY_NEW_FILE;
+-#ifdef __cplusplus
+-                                      return yyinput();
+-#else
+-                                      return input();
+-#endif
+-                                      }
+-
+-                              case EOB_ACT_CONTINUE_SCAN:
+-                                      (yy_c_buf_p) = (yytext_ptr) + offset;
+-                                      break;
+-                              }
+-                      }
+-              }
+-
+-      c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
+-      *(yy_c_buf_p) = '\0';   /* preserve yytext */
+-      (yy_hold_char) = *++(yy_c_buf_p);
+-
+-      if ( c == '\n' )
+-                 
+-    yylineno++;
+-;
+-
+-      return c;
+-}
+-#endif        /* ifndef YY_NO_INPUT */
+-
+-/** Immediately switch to a different input stream.
+- * @param input_file A readable stream.
+- * 
+- * @note This function does not reset the start condition to @c INITIAL .
+- */
+-    void yyrestart  (FILE * input_file )
+-{
+-    
+-      if ( ! YY_CURRENT_BUFFER ){
+-        yyensure_buffer_stack ();
+-              YY_CURRENT_BUFFER_LVALUE =
+-            yy_create_buffer(yyin,YY_BUF_SIZE );
+-      }
+-
+-      yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+-      yy_load_buffer_state( );
+-}
+-
+-/** Switch to a different input buffer.
+- * @param new_buffer The new input buffer.
+- * 
+- */
+-    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+-{
+-    
+-      /* TODO. We should be able to replace this entire function body
+-       * with
+-       *              yypop_buffer_state();
+-       *              yypush_buffer_state(new_buffer);
+-     */
+-      yyensure_buffer_stack ();
+-      if ( YY_CURRENT_BUFFER == new_buffer )
+-              return;
+-
+-      if ( YY_CURRENT_BUFFER )
+-              {
+-              /* Flush out information for old buffer. */
+-              *(yy_c_buf_p) = (yy_hold_char);
+-              YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+-              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+-              }
+-
+-      YY_CURRENT_BUFFER_LVALUE = new_buffer;
+-      yy_load_buffer_state( );
+-
+-      /* We don't actually know whether we did this switch during
+-       * EOF (yywrap()) processing, but the only time this flag
+-       * is looked at is after yywrap() is called, so it's safe
+-       * to go ahead and always set it.
+-       */
+-      (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-static void yy_load_buffer_state  (void)
+-{
+-      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+-      (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+-      yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+-      (yy_hold_char) = *(yy_c_buf_p);
+-}
+-
+-/** Allocate and initialize an input buffer state.
+- * @param file A readable stream.
+- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+- * 
+- * @return the allocated buffer state.
+- */
+-    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
+-{
+-      YY_BUFFER_STATE b;
+-    
+-      b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+-      if ( ! b )
+-              YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+-      b->yy_buf_size = size;
+-
+-      /* yy_ch_buf has to be 2 characters longer than the size given because
+-       * we need to put in 2 end-of-buffer characters.
+-       */
+-      b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
+-      if ( ! b->yy_ch_buf )
+-              YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+-      b->yy_is_our_buffer = 1;
+-
+-      yy_init_buffer(b,file );
+-
+-      return b;
+-}
+-
+-/** Destroy the buffer.
+- * @param b a buffer created with yy_create_buffer()
+- * 
+- */
+-    void yy_delete_buffer (YY_BUFFER_STATE  b )
+-{
+-    
+-      if ( ! b )
+-              return;
+-
+-      if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+-              YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+-
+-      if ( b->yy_is_our_buffer )
+-              yyfree((void *) b->yy_ch_buf  );
+-
+-      yyfree((void *) b  );
+-}
+-
+-#ifndef __cplusplus
+-extern int isatty (int );
+-#endif /* __cplusplus */
+-    
+-/* Initializes or reinitializes a buffer.
+- * This function is sometimes called more than once on the same buffer,
+- * such as during a yyrestart() or at EOF.
+- */
+-    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+-
+-{
+-      int oerrno = errno;
+-    
+-      yy_flush_buffer(b );
+-
+-      b->yy_input_file = file;
+-      b->yy_fill_buffer = 1;
+-
+-    /* If b is the current buffer, then yy_init_buffer was _probably_
+-     * called from yyrestart() or through yy_get_next_buffer.
+-     * In that case, we don't want to reset the lineno or column.
+-     */
+-    if (b != YY_CURRENT_BUFFER){
+-        b->yy_bs_lineno = 1;
+-        b->yy_bs_column = 0;
+-    }
+-
+-        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+-    
+-      errno = oerrno;
+-}
+-
+-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+- * 
+- */
+-    void yy_flush_buffer (YY_BUFFER_STATE  b )
+-{
+-      if ( ! b )
+-              return;
+-
+-      b->yy_n_chars = 0;
+-
+-      /* We always need two end-of-buffer characters.  The first causes
+-       * a transition to the end-of-buffer state.  The second causes
+-       * a jam in that state.
+-       */
+-      b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+-      b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+-
+-      b->yy_buf_pos = &b->yy_ch_buf[0];
+-
+-      b->yy_at_bol = 1;
+-      b->yy_buffer_status = YY_BUFFER_NEW;
+-
+-      if ( b == YY_CURRENT_BUFFER )
+-              yy_load_buffer_state( );
+-}
+-
+-/** Pushes the new state onto the stack. The new state becomes
+- *  the current state. This function will allocate the stack
+- *  if necessary.
+- *  @param new_buffer The new state.
+- *  
+- */
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+-{
+-      if (new_buffer == NULL)
+-              return;
+-
+-      yyensure_buffer_stack();
+-
+-      /* This block is copied from yy_switch_to_buffer. */
+-      if ( YY_CURRENT_BUFFER )
+-              {
+-              /* Flush out information for old buffer. */
+-              *(yy_c_buf_p) = (yy_hold_char);
+-              YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+-              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+-              }
+-
+-      /* Only push if top exists. Otherwise, replace top. */
+-      if (YY_CURRENT_BUFFER)
+-              (yy_buffer_stack_top)++;
+-      YY_CURRENT_BUFFER_LVALUE = new_buffer;
+-
+-      /* copied from yy_switch_to_buffer. */
+-      yy_load_buffer_state( );
+-      (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-/** Removes and deletes the top of the stack, if present.
+- *  The next element becomes the new top.
+- *  
+- */
+-void yypop_buffer_state (void)
+-{
+-      if (!YY_CURRENT_BUFFER)
+-              return;
+-
+-      yy_delete_buffer(YY_CURRENT_BUFFER );
+-      YY_CURRENT_BUFFER_LVALUE = NULL;
+-      if ((yy_buffer_stack_top) > 0)
+-              --(yy_buffer_stack_top);
+-
+-      if (YY_CURRENT_BUFFER) {
+-              yy_load_buffer_state( );
+-              (yy_did_buffer_switch_on_eof) = 1;
+-      }
+-}
+-
+-/* Allocates the stack if it does not exist.
+- *  Guarantees space for at least one push.
+- */
+-static void yyensure_buffer_stack (void)
+-{
+-      int num_to_alloc;
+-    
+-      if (!(yy_buffer_stack)) {
+-
+-              /* First allocation is just for 2 elements, since we don't know if this
+-               * scanner will even need a stack. We use 2 instead of 1 to avoid an
+-               * immediate realloc on the next call.
+-         */
+-              num_to_alloc = 1;
+-              (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+-                                                              (num_to_alloc * sizeof(struct yy_buffer_state*)
+-                                                              );
+-              if ( ! (yy_buffer_stack) )
+-                      YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+-                                                                
+-              memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+-                              
+-              (yy_buffer_stack_max) = num_to_alloc;
+-              (yy_buffer_stack_top) = 0;
+-              return;
+-      }
+-
+-      if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+-
+-              /* Increase the buffer to prepare for a possible push. */
+-              int grow_size = 8 /* arbitrary grow size */;
+-
+-              num_to_alloc = (yy_buffer_stack_max) + grow_size;
+-              (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+-                                                              ((yy_buffer_stack),
+-                                                              num_to_alloc * sizeof(struct yy_buffer_state*)
+-                                                              );
+-              if ( ! (yy_buffer_stack) )
+-                      YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+-
+-              /* zero only the new slots.*/
+-              memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+-              (yy_buffer_stack_max) = num_to_alloc;
+-      }
+-}
+-
+-/** Setup the input buffer state to scan directly from a user-specified character buffer.
+- * @param base the character buffer
+- * @param size the size in bytes of the character buffer
+- * 
+- * @return the newly allocated buffer state object. 
+- */
+-YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
+-{
+-      YY_BUFFER_STATE b;
+-    
+-      if ( size < 2 ||
+-           base[size-2] != YY_END_OF_BUFFER_CHAR ||
+-           base[size-1] != YY_END_OF_BUFFER_CHAR )
+-              /* They forgot to leave room for the EOB's. */
+-              return 0;
+-
+-      b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+-      if ( ! b )
+-              YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+-
+-      b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+-      b->yy_buf_pos = b->yy_ch_buf = base;
+-      b->yy_is_our_buffer = 0;
+-      b->yy_input_file = 0;
+-      b->yy_n_chars = b->yy_buf_size;
+-      b->yy_is_interactive = 0;
+-      b->yy_at_bol = 1;
+-      b->yy_fill_buffer = 0;
+-      b->yy_buffer_status = YY_BUFFER_NEW;
+-
+-      yy_switch_to_buffer(b  );
+-
+-      return b;
+-}
+-
+-/** Setup the input buffer state to scan a string. The next call to yylex() will
+- * scan from a @e copy of @a str.
+- * @param yystr a NUL-terminated string to scan
+- * 
+- * @return the newly allocated buffer state object.
+- * @note If you want to scan bytes that may contain NUL values, then use
+- *       yy_scan_bytes() instead.
+- */
+-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
+-{
+-    
+-      return yy_scan_bytes(yystr,strlen(yystr) );
+-}
+-
+-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+- * scan from a @e copy of @a bytes.
+- * @param bytes the byte buffer to scan
+- * @param len the number of bytes in the buffer pointed to by @a bytes.
+- * 
+- * @return the newly allocated buffer state object.
+- */
+-YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+-{
+-      YY_BUFFER_STATE b;
+-      char *buf;
+-      yy_size_t n;
+-      int i;
+-    
+-      /* Get memory for full buffer, including space for trailing EOB's. */
+-      n = _yybytes_len + 2;
+-      buf = (char *) yyalloc(n  );
+-      if ( ! buf )
+-              YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+-
+-      for ( i = 0; i < _yybytes_len; ++i )
+-              buf[i] = yybytes[i];
+-
+-      buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+-
+-      b = yy_scan_buffer(buf,n );
+-      if ( ! b )
+-              YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+-
+-      /* It's okay to grow etc. this buffer, and we should throw it
+-       * away when we're done.
+-       */
+-      b->yy_is_our_buffer = 1;
+-
+-      return b;
+-}
+-
+-#ifndef YY_EXIT_FAILURE
+-#define YY_EXIT_FAILURE 2
+-#endif
+-
+-static void yy_fatal_error (yyconst char* msg )
+-{
+-      (void) fprintf( stderr, "%s\n", msg );
+-      exit( YY_EXIT_FAILURE );
+-}
+-
+-/* Redefine yyless() so it works in section 3 code. */
+-
+-#undef yyless
+-#define yyless(n) \
+-      do \
+-              { \
+-              /* Undo effects of setting up yytext. */ \
+-        int yyless_macro_arg = (n); \
+-        YY_LESS_LINENO(yyless_macro_arg);\
+-              yytext[yyleng] = (yy_hold_char); \
+-              (yy_c_buf_p) = yytext + yyless_macro_arg; \
+-              (yy_hold_char) = *(yy_c_buf_p); \
+-              *(yy_c_buf_p) = '\0'; \
+-              yyleng = yyless_macro_arg; \
+-              } \
+-      while ( 0 )
+-
+-/* Accessor  methods (get/set functions) to struct members. */
+-
+-/** Get the current line number.
+- * 
+- */
+-int yyget_lineno  (void)
+-{
+-        
+-    return yylineno;
+-}
+-
+-/** Get the input stream.
+- * 
+- */
+-FILE *yyget_in  (void)
+-{
+-        return yyin;
+-}
+-
+-/** Get the output stream.
+- * 
+- */
+-FILE *yyget_out  (void)
+-{
+-        return yyout;
+-}
+-
+-/** Get the length of the current token.
+- * 
+- */
+-int yyget_leng  (void)
+-{
+-        return yyleng;
+-}
+-
+-/** Get the current token.
+- * 
+- */
+-
+-char *yyget_text  (void)
+-{
+-        return yytext;
+-}
+-
+-/** Set the current line number.
+- * @param line_number
+- * 
+- */
+-void yyset_lineno (int  line_number )
+-{
+-    
+-    yylineno = line_number;
+-}
+-
+-/** Set the input stream. This does not discard the current
+- * input buffer.
+- * @param in_str A readable stream.
+- * 
+- * @see yy_switch_to_buffer
+- */
+-void yyset_in (FILE *  in_str )
+-{
+-        yyin = in_str ;
+-}
+-
+-void yyset_out (FILE *  out_str )
+-{
+-        yyout = out_str ;
+-}
+-
+-int yyget_debug  (void)
+-{
+-        return yy_flex_debug;
+-}
+-
+-void yyset_debug (int  bdebug )
+-{
+-        yy_flex_debug = bdebug ;
+-}
+-
+-static int yy_init_globals (void)
+-{
+-        /* Initialization is the same as for the non-reentrant scanner.
+-     * This function is called from yylex_destroy(), so don't allocate here.
+-     */
+-
+-    /* We do not touch yylineno unless the option is enabled. */
+-    yylineno =  1;
+-    
+-    (yy_buffer_stack) = 0;
+-    (yy_buffer_stack_top) = 0;
+-    (yy_buffer_stack_max) = 0;
+-    (yy_c_buf_p) = (char *) 0;
+-    (yy_init) = 0;
+-    (yy_start) = 0;
+-
+-/* Defined in main.c */
+-#ifdef YY_STDINIT
+-    yyin = stdin;
+-    yyout = stdout;
+-#else
+-    yyin = (FILE *) 0;
+-    yyout = (FILE *) 0;
+-#endif
+-
+-    /* For future reference: Set errno on error, since we are called by
+-     * yylex_init()
+-     */
+-    return 0;
+-}
+-
+-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+-int yylex_destroy  (void)
+-{
+-    
+-    /* Pop the buffer stack, destroying each element. */
+-      while(YY_CURRENT_BUFFER){
+-              yy_delete_buffer(YY_CURRENT_BUFFER  );
+-              YY_CURRENT_BUFFER_LVALUE = NULL;
+-              yypop_buffer_state();
+-      }
+-
+-      /* Destroy the stack itself. */
+-      yyfree((yy_buffer_stack) );
+-      (yy_buffer_stack) = NULL;
+-
+-    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+-     * yylex() is called, initialization will occur. */
+-    yy_init_globals( );
+-
+-    return 0;
+-}
+-
+-/*
+- * Internal utility routines.
+- */
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+-{
+-      register int i;
+-      for ( i = 0; i < n; ++i )
+-              s1[i] = s2[i];
+-}
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * s )
+-{
+-      register int n;
+-      for ( n = 0; s[n]; ++n )
+-              ;
+-
+-      return n;
+-}
+-#endif
+-
+-void *yyalloc (yy_size_t  size )
+-{
+-      return (void *) malloc( size );
+-}
+-
+-void *yyrealloc  (void * ptr, yy_size_t  size )
+-{
+-      /* The cast to (char *) in the following accommodates both
+-       * implementations that use char* generic pointers, and those
+-       * that use void* generic pointers.  It works with the latter
+-       * because both ANSI C and C++ allow castless assignment from
+-       * any pointer type to void*, and deal with argument conversions
+-       * as though doing an assignment.
+-       */
+-      return (void *) realloc( (char *) ptr, size );
+-}
+-
+-void yyfree (void * ptr )
+-{
+-      free( (char *) ptr );   /* see yyrealloc() for (char *) cast */
+-}
+-
+-#define YYTABLES_NAME "yytables"
+-
+-#line 222 "dtc-lexer.l"
+-
+-
+-
+-
+-/*
+- * Stack of nested include file contexts.
+- */
+-
+-struct incl_file {
+-      struct dtc_file *file;
+-      YY_BUFFER_STATE yy_prev_buf;
+-      int yy_prev_lineno;
+-      struct incl_file *prev;
+-};
+-
+-static struct incl_file *incl_file_stack;
+-
+-
+-/*
+- * Detect infinite include recursion.
+- */
+-#define MAX_INCLUDE_DEPTH     (100)
+-
+-static int incl_depth = 0;
+-
+-
+-static void push_input_file(const char *filename)
+-{
+-      struct incl_file *incl_file;
+-      struct dtc_file *newfile;
+-      struct search_path search, *searchptr = NULL;
+-
+-      assert(filename);
+-
+-      if (incl_depth++ >= MAX_INCLUDE_DEPTH)
+-              die("Includes nested too deeply");
+-
+-      if (srcpos_file) {
+-              search.dir = srcpos_file->dir;
+-              search.next = NULL;
+-              search.prev = NULL;
+-              searchptr = &search;
+-      }
+-
+-      newfile = dtc_open_file(filename, searchptr);
+-
+-      incl_file = xmalloc(sizeof(struct incl_file));
+-
+-      /*
+-       * Save current context.
+-       */
+-      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
+-      incl_file->yy_prev_lineno = yylineno;
+-      incl_file->file = srcpos_file;
+-      incl_file->prev = incl_file_stack;
+-
+-      incl_file_stack = incl_file;
+-
+-      /*
+-       * Establish new context.
+-       */
+-      srcpos_file = newfile;
+-      yylineno = 1;
+-      yyin = newfile->file;
+-      yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
+-}
+-
+-
+-static int pop_input_file(void)
+-{
+-      struct incl_file *incl_file;
+-
+-      if (incl_file_stack == 0)
+-              return 0;
+-
+-      dtc_close_file(srcpos_file);
+-
+-      /*
+-       * Pop.
+-       */
+-      --incl_depth;
+-      incl_file = incl_file_stack;
+-      incl_file_stack = incl_file->prev;
+-
+-      /*
+-       * Recover old context.
+-       */
+-      yy_delete_buffer(YY_CURRENT_BUFFER);
+-      yy_switch_to_buffer(incl_file->yy_prev_buf);
+-      yylineno = incl_file->yy_prev_lineno;
+-      srcpos_file = incl_file->file;
+-      yyin = incl_file->file ? incl_file->file->file : NULL;
+-
+-      /*
+-       * Free old state.
+-       */
+-      free(incl_file);
+-
+-      return 1;
+-}
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped    1970-01-01 01:00:00.000000000 +0100
+@@ -1,2040 +0,0 @@
+-/* A Bison parser, made by GNU Bison 2.3.  */
+-
+-/* Skeleton implementation for Bison's Yacc-like parsers in C
+-
+-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+-   Free Software Foundation, 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, 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., 51 Franklin Street, Fifth Floor,
+-   Boston, MA 02110-1301, USA.  */
+-
+-/* As a special exception, you may create a larger work that contains
+-   part or all of the Bison parser skeleton and distribute that work
+-   under terms of your choice, so long as that work isn't itself a
+-   parser generator using the skeleton or a modified version thereof
+-   as a parser skeleton.  Alternatively, if you modify or redistribute
+-   the parser skeleton itself, you may (at your option) remove this
+-   special exception, which will cause the skeleton and the resulting
+-   Bison output files to be licensed under the GNU General Public
+-   License without this special exception.
+-
+-   This special exception was added by the Free Software Foundation in
+-   version 2.2 of Bison.  */
+-
+-/* C LALR(1) parser skeleton written by Richard Stallman, by
+-   simplifying the original so-called "semantic" parser.  */
+-
+-/* All symbols defined below should begin with yy or YY, to avoid
+-   infringing on user name space.  This should be done even for local
+-   variables, as they might otherwise be expanded by user macros.
+-   There are some unavoidable exceptions within include files to
+-   define necessary library symbols; they are noted "INFRINGES ON
+-   USER NAME SPACE" below.  */
+-
+-/* Identify Bison output.  */
+-#define YYBISON 1
+-
+-/* Bison version.  */
+-#define YYBISON_VERSION "2.3"
+-
+-/* Skeleton name.  */
+-#define YYSKELETON_NAME "yacc.c"
+-
+-/* Pure parsers.  */
+-#define YYPURE 0
+-
+-/* Using locations.  */
+-#define YYLSP_NEEDED 1
+-
+-
+-
+-/* Tokens.  */
+-#ifndef YYTOKENTYPE
+-# define YYTOKENTYPE
+-   /* Put the tokens into the symbol table, so that GDB and other debuggers
+-      know about them.  */
+-   enum yytokentype {
+-     DT_V1 = 258,
+-     DT_MEMRESERVE = 259,
+-     DT_PROPNODENAME = 260,
+-     DT_LITERAL = 261,
+-     DT_LEGACYLITERAL = 262,
+-     DT_BASE = 263,
+-     DT_BYTE = 264,
+-     DT_STRING = 265,
+-     DT_LABEL = 266,
+-     DT_REF = 267,
+-     DT_INCBIN = 268
+-   };
+-#endif
+-/* Tokens.  */
+-#define DT_V1 258
+-#define DT_MEMRESERVE 259
+-#define DT_PROPNODENAME 260
+-#define DT_LITERAL 261
+-#define DT_LEGACYLITERAL 262
+-#define DT_BASE 263
+-#define DT_BYTE 264
+-#define DT_STRING 265
+-#define DT_LABEL 266
+-#define DT_REF 267
+-#define DT_INCBIN 268
+-
+-
+-
+-
+-/* Copy the first part of user declarations.  */
+-#line 23 "dtc-parser.y"
+-
+-#include <stdio.h>
+-
+-#include "dtc.h"
+-#include "srcpos.h"
+-
+-extern int yylex(void);
+-
+-extern struct boot_info *the_boot_info;
+-extern int treesource_error;
+-
+-static unsigned long long eval_literal(const char *s, int base, int bits);
+-
+-
+-/* Enabling traces.  */
+-#ifndef YYDEBUG
+-# define YYDEBUG 0
+-#endif
+-
+-/* Enabling verbose error messages.  */
+-#ifdef YYERROR_VERBOSE
+-# undef YYERROR_VERBOSE
+-# define YYERROR_VERBOSE 1
+-#else
+-# define YYERROR_VERBOSE 0
+-#endif
+-
+-/* Enabling the token table.  */
+-#ifndef YYTOKEN_TABLE
+-# define YYTOKEN_TABLE 0
+-#endif
+-
+-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+-typedef union YYSTYPE
+-#line 37 "dtc-parser.y"
+-{
+-      char *propnodename;
+-      char *literal;
+-      char *labelref;
+-      unsigned int cbase;
+-      uint8_t byte;
+-      struct data data;
+-
+-      uint64_t addr;
+-      cell_t cell;
+-      struct property *prop;
+-      struct property *proplist;
+-      struct node *node;
+-      struct node *nodelist;
+-      struct reserve_info *re;
+-}
+-/* Line 187 of yacc.c.  */
+-#line 153 "dtc-parser.tab.c"
+-      YYSTYPE;
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+-# define YYSTYPE_IS_DECLARED 1
+-# define YYSTYPE_IS_TRIVIAL 1
+-#endif
+-
+-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
+-typedef struct YYLTYPE
+-{
+-  int first_line;
+-  int first_column;
+-  int last_line;
+-  int last_column;
+-} YYLTYPE;
+-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
+-# define YYLTYPE_IS_DECLARED 1
+-# define YYLTYPE_IS_TRIVIAL 1
+-#endif
+-
+-
+-/* Copy the second part of user declarations.  */
+-
+-
+-/* Line 216 of yacc.c.  */
+-#line 178 "dtc-parser.tab.c"
+-
+-#ifdef short
+-# undef short
+-#endif
+-
+-#ifdef YYTYPE_UINT8
+-typedef YYTYPE_UINT8 yytype_uint8;
+-#else
+-typedef unsigned char yytype_uint8;
+-#endif
+-
+-#ifdef YYTYPE_INT8
+-typedef YYTYPE_INT8 yytype_int8;
+-#elif (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-typedef signed char yytype_int8;
+-#else
+-typedef short int yytype_int8;
+-#endif
+-
+-#ifdef YYTYPE_UINT16
+-typedef YYTYPE_UINT16 yytype_uint16;
+-#else
+-typedef unsigned short int yytype_uint16;
+-#endif
+-
+-#ifdef YYTYPE_INT16
+-typedef YYTYPE_INT16 yytype_int16;
+-#else
+-typedef short int yytype_int16;
+-#endif
+-
+-#ifndef YYSIZE_T
+-# ifdef __SIZE_TYPE__
+-#  define YYSIZE_T __SIZE_TYPE__
+-# elif defined size_t
+-#  define YYSIZE_T size_t
+-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+-#  define YYSIZE_T size_t
+-# else
+-#  define YYSIZE_T unsigned int
+-# endif
+-#endif
+-
+-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+-
+-#ifndef YY_
+-# if YYENABLE_NLS
+-#  if ENABLE_NLS
+-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+-#  endif
+-# endif
+-# ifndef YY_
+-#  define YY_(msgid) msgid
+-# endif
+-#endif
+-
+-/* Suppress unused-variable warnings by "using" E.  */
+-#if ! defined lint || defined __GNUC__
+-# define YYUSE(e) ((void) (e))
+-#else
+-# define YYUSE(e) /* empty */
+-#endif
+-
+-/* Identity function, used to suppress warnings about constant conditions.  */
+-#ifndef lint
+-# define YYID(n) (n)
+-#else
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static int
+-YYID (int i)
+-#else
+-static int
+-YYID (i)
+-    int i;
+-#endif
+-{
+-  return i;
+-}
+-#endif
+-
+-#if ! defined yyoverflow || YYERROR_VERBOSE
+-
+-/* The parser invokes alloca or malloc; define the necessary symbols.  */
+-
+-# ifdef YYSTACK_USE_ALLOCA
+-#  if YYSTACK_USE_ALLOCA
+-#   ifdef __GNUC__
+-#    define YYSTACK_ALLOC __builtin_alloca
+-#   elif defined __BUILTIN_VA_ARG_INCR
+-#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+-#   elif defined _AIX
+-#    define YYSTACK_ALLOC __alloca
+-#   elif defined _MSC_VER
+-#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+-#    define alloca _alloca
+-#   else
+-#    define YYSTACK_ALLOC alloca
+-#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+-#     ifndef _STDLIB_H
+-#      define _STDLIB_H 1
+-#     endif
+-#    endif
+-#   endif
+-#  endif
+-# endif
+-
+-# ifdef YYSTACK_ALLOC
+-   /* Pacify GCC's `empty if-body' warning.  */
+-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+-#  ifndef YYSTACK_ALLOC_MAXIMUM
+-    /* The OS might guarantee only one guard page at the bottom of the stack,
+-       and a page size can be as small as 4096 bytes.  So we cannot safely
+-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+-       to allow for a few compiler-allocated temporary stack slots.  */
+-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+-#  endif
+-# else
+-#  define YYSTACK_ALLOC YYMALLOC
+-#  define YYSTACK_FREE YYFREE
+-#  ifndef YYSTACK_ALLOC_MAXIMUM
+-#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+-#  endif
+-#  if (defined __cplusplus && ! defined _STDLIB_H \
+-       && ! ((defined YYMALLOC || defined malloc) \
+-           && (defined YYFREE || defined free)))
+-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+-#   ifndef _STDLIB_H
+-#    define _STDLIB_H 1
+-#   endif
+-#  endif
+-#  ifndef YYMALLOC
+-#   define YYMALLOC malloc
+-#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+-#   endif
+-#  endif
+-#  ifndef YYFREE
+-#   define YYFREE free
+-#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-void free (void *); /* INFRINGES ON USER NAME SPACE */
+-#   endif
+-#  endif
+-# endif
+-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+-
+-
+-#if (! defined yyoverflow \
+-     && (! defined __cplusplus \
+-       || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
+-           && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+-
+-/* A type that is properly aligned for any stack member.  */
+-union yyalloc
+-{
+-  yytype_int16 yyss;
+-  YYSTYPE yyvs;
+-    YYLTYPE yyls;
+-};
+-
+-/* The size of the maximum gap between one aligned stack and the next.  */
+-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+-
+-/* The size of an array large to enough to hold all stacks, each with
+-   N elements.  */
+-# define YYSTACK_BYTES(N) \
+-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+-      + 2 * YYSTACK_GAP_MAXIMUM)
+-
+-/* Copy COUNT objects from FROM to TO.  The source and destination do
+-   not overlap.  */
+-# ifndef YYCOPY
+-#  if defined __GNUC__ && 1 < __GNUC__
+-#   define YYCOPY(To, From, Count) \
+-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+-#  else
+-#   define YYCOPY(To, From, Count)            \
+-      do                                      \
+-      {                                       \
+-        YYSIZE_T yyi;                         \
+-        for (yyi = 0; yyi < (Count); yyi++)   \
+-          (To)[yyi] = (From)[yyi];            \
+-      }                                       \
+-      while (YYID (0))
+-#  endif
+-# endif
+-
+-/* Relocate STACK from its old location to the new one.  The
+-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+-   elements in the stack, and YYPTR gives the new location of the
+-   stack.  Advance YYPTR to a properly aligned location for the next
+-   stack.  */
+-# define YYSTACK_RELOCATE(Stack)                                      \
+-    do                                                                        \
+-      {                                                                       \
+-      YYSIZE_T yynewbytes;                                            \
+-      YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+-      Stack = &yyptr->Stack;                                          \
+-      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+-      yyptr += yynewbytes / sizeof (*yyptr);                          \
+-      }                                                                       \
+-    while (YYID (0))
+-
+-#endif
+-
+-/* YYFINAL -- State number of the termination state.  */
+-#define YYFINAL  9
+-/* YYLAST -- Last index in YYTABLE.  */
+-#define YYLAST   73
+-
+-/* YYNTOKENS -- Number of terminals.  */
+-#define YYNTOKENS  27
+-/* YYNNTS -- Number of nonterminals.  */
+-#define YYNNTS  20
+-/* YYNRULES -- Number of rules.  */
+-#define YYNRULES  45
+-/* YYNRULES -- Number of states.  */
+-#define YYNSTATES  76
+-
+-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+-#define YYUNDEFTOK  2
+-#define YYMAXUTOK   268
+-
+-#define YYTRANSLATE(YYX)                                              \
+-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+-
+-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+-static const yytype_uint8 yytranslate[] =
+-{
+-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-      24,    26,     2,     2,    25,    15,     2,    16,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,    14,
+-      20,    19,    21,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,    22,     2,    23,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,    17,     2,    18,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+-       5,     6,     7,     8,     9,    10,    11,    12,    13
+-};
+-
+-#if YYDEBUG
+-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+-   YYRHS.  */
+-static const yytype_uint8 yyprhs[] =
+-{
+-       0,     0,     3,     8,    11,    12,    15,    21,    22,    25,
+-      27,    34,    36,    38,    41,    47,    48,    51,    57,    61,
+-      64,    69,    74,    77,    87,    93,    96,    97,   100,   103,
+-     104,   107,   110,   113,   114,   116,   118,   121,   122,   125,
+-     128,   129,   132,   135,   139,   140
+-};
+-
+-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+-static const yytype_int8 yyrhs[] =
+-{
+-      28,     0,    -1,     3,    14,    29,    34,    -1,    31,    34,
+-      -1,    -1,    30,    29,    -1,    46,     4,    33,    33,    14,
+-      -1,    -1,    32,    31,    -1,    30,    -1,    46,     4,    33,
+-      15,    33,    14,    -1,     6,    -1,     7,    -1,    16,    35,
+-      -1,    17,    36,    44,    18,    14,    -1,    -1,    36,    37,
+-      -1,    46,     5,    19,    38,    14,    -1,    46,     5,    14,
+-      -1,    39,    10,    -1,    39,    20,    40,    21,    -1,    39,
+-      22,    43,    23,    -1,    39,    12,    -1,    39,    13,    24,
+-      10,    25,    33,    25,    33,    26,    -1,    39,    13,    24,
+-      10,    26,    -1,    38,    11,    -1,    -1,    38,    25,    -1,
+-      39,    11,    -1,    -1,    40,    42,    -1,    40,    12,    -1,
+-      40,    11,    -1,    -1,     8,    -1,     6,    -1,    41,     7,
+-      -1,    -1,    43,     9,    -1,    43,    11,    -1,    -1,    45,
+-      44,    -1,    45,    37,    -1,    46,     5,    35,    -1,    -1,
+-      11,    -1
+-};
+-
+-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+-static const yytype_uint16 yyrline[] =
+-{
+-       0,    89,    89,    93,   101,   104,   111,   119,   122,   129,
+-     133,   140,   144,   151,   158,   166,   169,   176,   180,   187,
+-     191,   195,   199,   203,   220,   231,   239,   242,   246,   254,
+-     257,   261,   266,   274,   277,   281,   285,   293,   296,   300,
+-     308,   311,   315,   323,   331,   334
+-};
+-#endif
+-
+-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+-static const char *const yytname[] =
+-{
+-  "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE",
+-  "DT_PROPNODENAME", "DT_LITERAL", "DT_LEGACYLITERAL", "DT_BASE",
+-  "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF", "DT_INCBIN", "';'", "'-'",
+-  "'/'", "'{'", "'}'", "'='", "'<'", "'>'", "'['", "']'", "'('", "','",
+-  "')'", "$accept", "sourcefile", "memreserves", "memreserve",
+-  "v0_memreserves", "v0_memreserve", "addr", "devicetree", "nodedef",
+-  "proplist", "propdef", "propdata", "propdataprefix", "celllist",
+-  "cellbase", "cellval", "bytestring", "subnodes", "subnode", "label", 0
+-};
+-#endif
+-
+-# ifdef YYPRINT
+-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+-   token YYLEX-NUM.  */
+-static const yytype_uint16 yytoknum[] =
+-{
+-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+-     265,   266,   267,   268,    59,    45,    47,   123,   125,    61,
+-      60,    62,    91,    93,    40,    44,    41
+-};
+-# endif
+-
+-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+-static const yytype_uint8 yyr1[] =
+-{
+-       0,    27,    28,    28,    29,    29,    30,    31,    31,    32,
+-      32,    33,    33,    34,    35,    36,    36,    37,    37,    38,
+-      38,    38,    38,    38,    38,    38,    39,    39,    39,    40,
+-      40,    40,    40,    41,    41,    42,    42,    43,    43,    43,
+-      44,    44,    44,    45,    46,    46
+-};
+-
+-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+-static const yytype_uint8 yyr2[] =
+-{
+-       0,     2,     4,     2,     0,     2,     5,     0,     2,     1,
+-       6,     1,     1,     2,     5,     0,     2,     5,     3,     2,
+-       4,     4,     2,     9,     5,     2,     0,     2,     2,     0,
+-       2,     2,     2,     0,     1,     1,     2,     0,     2,     2,
+-       0,     2,     2,     3,     0,     1
+-};
+-
+-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+-   means the default is an error.  */
+-static const yytype_uint8 yydefact[] =
+-{
+-       7,     0,    45,     0,     9,     0,     7,     0,     4,     1,
+-       0,     3,     8,     0,     0,     4,     0,    15,    13,    11,
+-      12,     0,     2,     5,     0,    40,     0,     0,     0,    16,
+-       0,    40,     0,     0,     6,     0,    42,    41,     0,    10,
+-      14,    18,    26,    43,     0,     0,    25,    17,    27,    19,
+-      28,    22,     0,    29,    37,     0,    33,     0,     0,    35,
+-      34,    32,    31,    20,     0,    30,    38,    39,    21,     0,
+-      24,    36,     0,     0,     0,    23
+-};
+-
+-/* YYDEFGOTO[NTERM-NUM].  */
+-static const yytype_int8 yydefgoto[] =
+-{
+-      -1,     3,    14,     4,     5,     6,    27,    11,    18,    25,
+-      29,    44,    45,    56,    64,    65,    57,    30,    31,     7
+-};
+-
+-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+-   STATE-NUM.  */
+-#define YYPACT_NINF -14
+-static const yytype_int8 yypact[] =
+-{
+-      30,   -11,   -14,     7,   -14,    -1,    27,    13,    27,   -14,
+-       8,   -14,   -14,    40,    -1,    27,    35,   -14,   -14,   -14,
+-     -14,    21,   -14,   -14,    40,    24,    40,    28,    40,   -14,
+-      32,    24,    46,    38,   -14,    39,   -14,   -14,    26,   -14,
+-     -14,   -14,   -14,   -14,    -9,    10,   -14,   -14,   -14,   -14,
+-     -14,   -14,    31,   -14,   -14,    44,    -2,     3,    23,   -14,
+-     -14,   -14,   -14,   -14,    50,   -14,   -14,   -14,   -14,    40,
+-     -14,   -14,    33,    40,    36,   -14
+-};
+-
+-/* YYPGOTO[NTERM-NUM].  */
+-static const yytype_int8 yypgoto[] =
+-{
+-     -14,   -14,    48,    29,    53,   -14,   -13,    47,    34,   -14,
+-      37,   -14,   -14,   -14,   -14,   -14,   -14,    42,   -14,    -7
+-};
+-
+-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+-   positive, shift that token.  If negative, reduce the rule which
+-   number is the opposite.  If zero, do what YYDEFACT says.
+-   If YYTABLE_NINF, syntax error.  */
+-#define YYTABLE_NINF -45
+-static const yytype_int8 yytable[] =
+-{
+-      21,    16,    46,     8,    59,    47,    60,     9,    16,    61,
+-      62,    28,    66,    33,    67,    10,    48,    13,    32,    63,
+-      49,    50,    51,    52,    32,    17,    68,    19,    20,   -44,
+-      53,   -44,    54,     1,   -44,     2,    26,    15,     2,    24,
+-      41,     2,    34,    17,    15,    42,    19,    20,    69,    70,
+-      35,    38,    39,    40,    58,    55,    72,    71,    73,    12,
+-      74,    22,    75,    23,     0,     0,     0,     0,    36,     0,
+-       0,     0,    43,    37
+-};
+-
+-static const yytype_int8 yycheck[] =
+-{
+-      13,     8,    11,    14,     6,    14,     8,     0,    15,    11,
+-      12,    24,     9,    26,    11,    16,    25,     4,    25,    21,
+-      10,    11,    12,    13,    31,    17,    23,     6,     7,     5,
+-      20,     4,    22,     3,     4,    11,    15,     8,    11,     4,
+-      14,    11,    14,    17,    15,    19,     6,     7,    25,    26,
+-      18,     5,    14,    14,    10,    24,    69,     7,    25,     6,
+-      73,    14,    26,    15,    -1,    -1,    -1,    -1,    31,    -1,
+-      -1,    -1,    38,    31
+-};
+-
+-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+-   symbol of state STATE-NUM.  */
+-static const yytype_uint8 yystos[] =
+-{
+-       0,     3,    11,    28,    30,    31,    32,    46,    14,     0,
+-      16,    34,    31,     4,    29,    30,    46,    17,    35,     6,
+-       7,    33,    34,    29,     4,    36,    15,    33,    33,    37,
+-      44,    45,    46,    33,    14,    18,    37,    44,     5,    14,
+-      14,    14,    19,    35,    38,    39,    11,    14,    25,    10,
+-      11,    12,    13,    20,    22,    24,    40,    43,    10,     6,
+-       8,    11,    12,    21,    41,    42,     9,    11,    23,    25,
+-      26,     7,    33,    25,    33,    26
+-};
+-
+-#define yyerrok               (yyerrstatus = 0)
+-#define yyclearin     (yychar = YYEMPTY)
+-#define YYEMPTY               (-2)
+-#define YYEOF         0
+-
+-#define YYACCEPT      goto yyacceptlab
+-#define YYABORT               goto yyabortlab
+-#define YYERROR               goto yyerrorlab
+-
+-
+-/* Like YYERROR except do call yyerror.  This remains here temporarily
+-   to ease the transition to the new meaning of YYERROR, for GCC.
+-   Once GCC version 2 has supplanted version 1, this can go.  */
+-
+-#define YYFAIL                goto yyerrlab
+-
+-#define YYRECOVERING()  (!!yyerrstatus)
+-
+-#define YYBACKUP(Token, Value)                                        \
+-do                                                            \
+-  if (yychar == YYEMPTY && yylen == 1)                                \
+-    {                                                         \
+-      yychar = (Token);                                               \
+-      yylval = (Value);                                               \
+-      yytoken = YYTRANSLATE (yychar);                         \
+-      YYPOPSTACK (1);                                         \
+-      goto yybackup;                                          \
+-    }                                                         \
+-  else                                                                \
+-    {                                                         \
+-      yyerror (YY_("syntax error: cannot back up")); \
+-      YYERROR;                                                        \
+-    }                                                         \
+-while (YYID (0))
+-
+-
+-#define YYTERROR      1
+-#define YYERRCODE     256
+-
+-
+-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+-   If N is 0, then set CURRENT to the empty location which ends
+-   the previous symbol: RHS[0] (always defined).  */
+-
+-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+-#ifndef YYLLOC_DEFAULT
+-# define YYLLOC_DEFAULT(Current, Rhs, N)                              \
+-    do                                                                        \
+-      if (YYID (N))                                                    \
+-      {                                                               \
+-        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+-        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+-        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+-        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+-      }                                                               \
+-      else                                                            \
+-      {                                                               \
+-        (Current).first_line   = (Current).last_line   =              \
+-          YYRHSLOC (Rhs, 0).last_line;                                \
+-        (Current).first_column = (Current).last_column =              \
+-          YYRHSLOC (Rhs, 0).last_column;                              \
+-      }                                                               \
+-    while (YYID (0))
+-#endif
+-
+-
+-/* YY_LOCATION_PRINT -- Print the location on the stream.
+-   This macro was not mandated originally: define only if we know
+-   we won't break user code: when these are the locations we know.  */
+-
+-#ifndef YY_LOCATION_PRINT
+-# if YYLTYPE_IS_TRIVIAL
+-#  define YY_LOCATION_PRINT(File, Loc)                        \
+-     fprintf (File, "%d.%d-%d.%d",                    \
+-            (Loc).first_line, (Loc).first_column,     \
+-            (Loc).last_line,  (Loc).last_column)
+-# else
+-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+-# endif
+-#endif
+-
+-
+-/* YYLEX -- calling `yylex' with the right arguments.  */
+-
+-#ifdef YYLEX_PARAM
+-# define YYLEX yylex (YYLEX_PARAM)
+-#else
+-# define YYLEX yylex ()
+-#endif
+-
+-/* Enable debugging if requested.  */
+-#if YYDEBUG
+-
+-# ifndef YYFPRINTF
+-#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+-#  define YYFPRINTF fprintf
+-# endif
+-
+-# define YYDPRINTF(Args)                      \
+-do {                                          \
+-  if (yydebug)                                        \
+-    YYFPRINTF Args;                           \
+-} while (YYID (0))
+-
+-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
+-do {                                                                    \
+-  if (yydebug)                                                                  \
+-    {                                                                   \
+-      YYFPRINTF (stderr, "%s ", Title);                                         \
+-      yy_symbol_print (stderr,                                                  \
+-                Type, Value, Location); \
+-      YYFPRINTF (stderr, "\n");                                                 \
+-    }                                                                   \
+-} while (YYID (0))
+-
+-
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT.  |
+-`--------------------------------*/
+-
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
+-#else
+-static void
+-yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
+-    FILE *yyoutput;
+-    int yytype;
+-    YYSTYPE const * const yyvaluep;
+-    YYLTYPE const * const yylocationp;
+-#endif
+-{
+-  if (!yyvaluep)
+-    return;
+-  YYUSE (yylocationp);
+-# ifdef YYPRINT
+-  if (yytype < YYNTOKENS)
+-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+-# else
+-  YYUSE (yyoutput);
+-# endif
+-  switch (yytype)
+-    {
+-      default:
+-      break;
+-    }
+-}
+-
+-
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT.  |
+-`--------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
+-#else
+-static void
+-yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
+-    FILE *yyoutput;
+-    int yytype;
+-    YYSTYPE const * const yyvaluep;
+-    YYLTYPE const * const yylocationp;
+-#endif
+-{
+-  if (yytype < YYNTOKENS)
+-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+-  else
+-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+-
+-  YY_LOCATION_PRINT (yyoutput, *yylocationp);
+-  YYFPRINTF (yyoutput, ": ");
+-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
+-  YYFPRINTF (yyoutput, ")");
+-}
+-
+-/*------------------------------------------------------------------.
+-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+-| TOP (included).                                                   |
+-`------------------------------------------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+-#else
+-static void
+-yy_stack_print (bottom, top)
+-    yytype_int16 *bottom;
+-    yytype_int16 *top;
+-#endif
+-{
+-  YYFPRINTF (stderr, "Stack now");
+-  for (; bottom <= top; ++bottom)
+-    YYFPRINTF (stderr, " %d", *bottom);
+-  YYFPRINTF (stderr, "\n");
+-}
+-
+-# define YY_STACK_PRINT(Bottom, Top)                          \
+-do {                                                          \
+-  if (yydebug)                                                        \
+-    yy_stack_print ((Bottom), (Top));                         \
+-} while (YYID (0))
+-
+-
+-/*------------------------------------------------.
+-| Report that the YYRULE is going to be reduced.  |
+-`------------------------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
+-#else
+-static void
+-yy_reduce_print (yyvsp, yylsp, yyrule)
+-    YYSTYPE *yyvsp;
+-    YYLTYPE *yylsp;
+-    int yyrule;
+-#endif
+-{
+-  int yynrhs = yyr2[yyrule];
+-  int yyi;
+-  unsigned long int yylno = yyrline[yyrule];
+-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+-           yyrule - 1, yylno);
+-  /* The symbols being reduced.  */
+-  for (yyi = 0; yyi < yynrhs; yyi++)
+-    {
+-      fprintf (stderr, "   $%d = ", yyi + 1);
+-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+-                     &(yyvsp[(yyi + 1) - (yynrhs)])
+-                     , &(yylsp[(yyi + 1) - (yynrhs)])                );
+-      fprintf (stderr, "\n");
+-    }
+-}
+-
+-# define YY_REDUCE_PRINT(Rule)                \
+-do {                                  \
+-  if (yydebug)                                \
+-    yy_reduce_print (yyvsp, yylsp, Rule); \
+-} while (YYID (0))
+-
+-/* Nonzero means print parse trace.  It is left uninitialized so that
+-   multiple parsers can coexist.  */
+-int yydebug;
+-#else /* !YYDEBUG */
+-# define YYDPRINTF(Args)
+-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+-# define YY_STACK_PRINT(Bottom, Top)
+-# define YY_REDUCE_PRINT(Rule)
+-#endif /* !YYDEBUG */
+-
+-
+-/* YYINITDEPTH -- initial size of the parser's stacks.  */
+-#ifndef       YYINITDEPTH
+-# define YYINITDEPTH 200
+-#endif
+-
+-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+-   if the built-in stack extension method is used).
+-
+-   Do not make this value too large; the results are undefined if
+-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+-   evaluated with infinite-precision integer arithmetic.  */
+-
+-#ifndef YYMAXDEPTH
+-# define YYMAXDEPTH 10000
+-#endif
+-
+-\f
+-
+-#if YYERROR_VERBOSE
+-
+-# ifndef yystrlen
+-#  if defined __GLIBC__ && defined _STRING_H
+-#   define yystrlen strlen
+-#  else
+-/* Return the length of YYSTR.  */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static YYSIZE_T
+-yystrlen (const char *yystr)
+-#else
+-static YYSIZE_T
+-yystrlen (yystr)
+-    const char *yystr;
+-#endif
+-{
+-  YYSIZE_T yylen;
+-  for (yylen = 0; yystr[yylen]; yylen++)
+-    continue;
+-  return yylen;
+-}
+-#  endif
+-# endif
+-
+-# ifndef yystpcpy
+-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+-#   define yystpcpy stpcpy
+-#  else
+-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+-   YYDEST.  */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static char *
+-yystpcpy (char *yydest, const char *yysrc)
+-#else
+-static char *
+-yystpcpy (yydest, yysrc)
+-    char *yydest;
+-    const char *yysrc;
+-#endif
+-{
+-  char *yyd = yydest;
+-  const char *yys = yysrc;
+-
+-  while ((*yyd++ = *yys++) != '\0')
+-    continue;
+-
+-  return yyd - 1;
+-}
+-#  endif
+-# endif
+-
+-# ifndef yytnamerr
+-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+-   quotes and backslashes, so that it's suitable for yyerror.  The
+-   heuristic is that double-quoting is unnecessary unless the string
+-   contains an apostrophe, a comma, or backslash (other than
+-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+-   null, do not copy; instead, return the length of what the result
+-   would have been.  */
+-static YYSIZE_T
+-yytnamerr (char *yyres, const char *yystr)
+-{
+-  if (*yystr == '"')
+-    {
+-      YYSIZE_T yyn = 0;
+-      char const *yyp = yystr;
+-
+-      for (;;)
+-      switch (*++yyp)
+-        {
+-        case '\'':
+-        case ',':
+-          goto do_not_strip_quotes;
+-
+-        case '\\':
+-          if (*++yyp != '\\')
+-            goto do_not_strip_quotes;
+-          /* Fall through.  */
+-        default:
+-          if (yyres)
+-            yyres[yyn] = *yyp;
+-          yyn++;
+-          break;
+-
+-        case '"':
+-          if (yyres)
+-            yyres[yyn] = '\0';
+-          return yyn;
+-        }
+-    do_not_strip_quotes: ;
+-    }
+-
+-  if (! yyres)
+-    return yystrlen (yystr);
+-
+-  return yystpcpy (yyres, yystr) - yyres;
+-}
+-# endif
+-
+-/* Copy into YYRESULT an error message about the unexpected token
+-   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+-   including the terminating null byte.  If YYRESULT is null, do not
+-   copy anything; just return the number of bytes that would be
+-   copied.  As a special case, return 0 if an ordinary "syntax error"
+-   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+-   size calculation.  */
+-static YYSIZE_T
+-yysyntax_error (char *yyresult, int yystate, int yychar)
+-{
+-  int yyn = yypact[yystate];
+-
+-  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+-    return 0;
+-  else
+-    {
+-      int yytype = YYTRANSLATE (yychar);
+-      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+-      YYSIZE_T yysize = yysize0;
+-      YYSIZE_T yysize1;
+-      int yysize_overflow = 0;
+-      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+-      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+-      int yyx;
+-
+-# if 0
+-      /* This is so xgettext sees the translatable formats that are
+-       constructed on the fly.  */
+-      YY_("syntax error, unexpected %s");
+-      YY_("syntax error, unexpected %s, expecting %s");
+-      YY_("syntax error, unexpected %s, expecting %s or %s");
+-      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+-      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+-# endif
+-      char *yyfmt;
+-      char const *yyf;
+-      static char const yyunexpected[] = "syntax error, unexpected %s";
+-      static char const yyexpecting[] = ", expecting %s";
+-      static char const yyor[] = " or %s";
+-      char yyformat[sizeof yyunexpected
+-                  + sizeof yyexpecting - 1
+-                  + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+-                     * (sizeof yyor - 1))];
+-      char const *yyprefix = yyexpecting;
+-
+-      /* Start YYX at -YYN if negative to avoid negative indexes in
+-       YYCHECK.  */
+-      int yyxbegin = yyn < 0 ? -yyn : 0;
+-
+-      /* Stay within bounds of both yycheck and yytname.  */
+-      int yychecklim = YYLAST - yyn + 1;
+-      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+-      int yycount = 1;
+-
+-      yyarg[0] = yytname[yytype];
+-      yyfmt = yystpcpy (yyformat, yyunexpected);
+-
+-      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+-      if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+-        {
+-          if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+-            {
+-              yycount = 1;
+-              yysize = yysize0;
+-              yyformat[sizeof yyunexpected - 1] = '\0';
+-              break;
+-            }
+-          yyarg[yycount++] = yytname[yyx];
+-          yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+-          yysize_overflow |= (yysize1 < yysize);
+-          yysize = yysize1;
+-          yyfmt = yystpcpy (yyfmt, yyprefix);
+-          yyprefix = yyor;
+-        }
+-
+-      yyf = YY_(yyformat);
+-      yysize1 = yysize + yystrlen (yyf);
+-      yysize_overflow |= (yysize1 < yysize);
+-      yysize = yysize1;
+-
+-      if (yysize_overflow)
+-      return YYSIZE_MAXIMUM;
+-
+-      if (yyresult)
+-      {
+-        /* Avoid sprintf, as that infringes on the user's name space.
+-           Don't have undefined behavior even if the translation
+-           produced a string with the wrong number of "%s"s.  */
+-        char *yyp = yyresult;
+-        int yyi = 0;
+-        while ((*yyp = *yyf) != '\0')
+-          {
+-            if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+-              {
+-                yyp += yytnamerr (yyp, yyarg[yyi++]);
+-                yyf += 2;
+-              }
+-            else
+-              {
+-                yyp++;
+-                yyf++;
+-              }
+-          }
+-      }
+-      return yysize;
+-    }
+-}
+-#endif /* YYERROR_VERBOSE */
+-\f
+-
+-/*-----------------------------------------------.
+-| Release the memory associated to this symbol.  |
+-`-----------------------------------------------*/
+-
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-static void
+-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
+-#else
+-static void
+-yydestruct (yymsg, yytype, yyvaluep, yylocationp)
+-    const char *yymsg;
+-    int yytype;
+-    YYSTYPE *yyvaluep;
+-    YYLTYPE *yylocationp;
+-#endif
+-{
+-  YYUSE (yyvaluep);
+-  YYUSE (yylocationp);
+-
+-  if (!yymsg)
+-    yymsg = "Deleting";
+-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+-
+-  switch (yytype)
+-    {
+-
+-      default:
+-      break;
+-    }
+-}
+-\f
+-
+-/* Prevent warnings from -Wmissing-prototypes.  */
+-
+-#ifdef YYPARSE_PARAM
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void *YYPARSE_PARAM);
+-#else
+-int yyparse ();
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void);
+-#else
+-int yyparse ();
+-#endif
+-#endif /* ! YYPARSE_PARAM */
+-
+-
+-
+-/* The look-ahead symbol.  */
+-int yychar;
+-
+-/* The semantic value of the look-ahead symbol.  */
+-YYSTYPE yylval;
+-
+-/* Number of syntax errors so far.  */
+-int yynerrs;
+-/* Location data for the look-ahead symbol.  */
+-YYLTYPE yylloc;
+-
+-
+-
+-/*----------.
+-| yyparse.  |
+-`----------*/
+-
+-#ifdef YYPARSE_PARAM
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-int
+-yyparse (void *YYPARSE_PARAM)
+-#else
+-int
+-yyparse (YYPARSE_PARAM)
+-    void *YYPARSE_PARAM;
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+-     || defined __cplusplus || defined _MSC_VER)
+-int
+-yyparse (void)
+-#else
+-int
+-yyparse ()
+-
+-#endif
+-#endif
+-{
+-  
+-  int yystate;
+-  int yyn;
+-  int yyresult;
+-  /* Number of tokens to shift before error messages enabled.  */
+-  int yyerrstatus;
+-  /* Look-ahead token as an internal (translated) token number.  */
+-  int yytoken = 0;
+-#if YYERROR_VERBOSE
+-  /* Buffer for error messages, and its allocated size.  */
+-  char yymsgbuf[128];
+-  char *yymsg = yymsgbuf;
+-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+-#endif
+-
+-  /* Three stacks and their tools:
+-     `yyss': related to states,
+-     `yyvs': related to semantic values,
+-     `yyls': related to locations.
+-
+-     Refer to the stacks thru separate pointers, to allow yyoverflow
+-     to reallocate them elsewhere.  */
+-
+-  /* The state stack.  */
+-  yytype_int16 yyssa[YYINITDEPTH];
+-  yytype_int16 *yyss = yyssa;
+-  yytype_int16 *yyssp;
+-
+-  /* The semantic value stack.  */
+-  YYSTYPE yyvsa[YYINITDEPTH];
+-  YYSTYPE *yyvs = yyvsa;
+-  YYSTYPE *yyvsp;
+-
+-  /* The location stack.  */
+-  YYLTYPE yylsa[YYINITDEPTH];
+-  YYLTYPE *yyls = yylsa;
+-  YYLTYPE *yylsp;
+-  /* The locations where the error started and ended.  */
+-  YYLTYPE yyerror_range[2];
+-
+-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
+-
+-  YYSIZE_T yystacksize = YYINITDEPTH;
+-
+-  /* The variables used to return semantic value and location from the
+-     action routines.  */
+-  YYSTYPE yyval;
+-  YYLTYPE yyloc;
+-
+-  /* The number of symbols on the RHS of the reduced rule.
+-     Keep to zero when no symbol should be popped.  */
+-  int yylen = 0;
+-
+-  YYDPRINTF ((stderr, "Starting parse\n"));
+-
+-  yystate = 0;
+-  yyerrstatus = 0;
+-  yynerrs = 0;
+-  yychar = YYEMPTY;           /* Cause a token to be read.  */
+-
+-  /* Initialize stack pointers.
+-     Waste one element of value and location stack
+-     so that they stay on the same level as the state stack.
+-     The wasted elements are never initialized.  */
+-
+-  yyssp = yyss;
+-  yyvsp = yyvs;
+-  yylsp = yyls;
+-#if YYLTYPE_IS_TRIVIAL
+-  /* Initialize the default location before parsing starts.  */
+-  yylloc.first_line   = yylloc.last_line   = 1;
+-  yylloc.first_column = yylloc.last_column = 0;
+-#endif
+-
+-  goto yysetstate;
+-
+-/*------------------------------------------------------------.
+-| yynewstate -- Push a new state, which is found in yystate.  |
+-`------------------------------------------------------------*/
+- yynewstate:
+-  /* In all cases, when you get here, the value and location stacks
+-     have just been pushed.  So pushing a state here evens the stacks.  */
+-  yyssp++;
+-
+- yysetstate:
+-  *yyssp = yystate;
+-
+-  if (yyss + yystacksize - 1 <= yyssp)
+-    {
+-      /* Get the current used size of the three stacks, in elements.  */
+-      YYSIZE_T yysize = yyssp - yyss + 1;
+-
+-#ifdef yyoverflow
+-      {
+-      /* Give user a chance to reallocate the stack.  Use copies of
+-         these so that the &'s don't force the real ones into
+-         memory.  */
+-      YYSTYPE *yyvs1 = yyvs;
+-      yytype_int16 *yyss1 = yyss;
+-      YYLTYPE *yyls1 = yyls;
+-
+-      /* Each stack pointer address is followed by the size of the
+-         data in use in that stack, in bytes.  This used to be a
+-         conditional around just the two extra args, but that might
+-         be undefined if yyoverflow is a macro.  */
+-      yyoverflow (YY_("memory exhausted"),
+-                  &yyss1, yysize * sizeof (*yyssp),
+-                  &yyvs1, yysize * sizeof (*yyvsp),
+-                  &yyls1, yysize * sizeof (*yylsp),
+-                  &yystacksize);
+-      yyls = yyls1;
+-      yyss = yyss1;
+-      yyvs = yyvs1;
+-      }
+-#else /* no yyoverflow */
+-# ifndef YYSTACK_RELOCATE
+-      goto yyexhaustedlab;
+-# else
+-      /* Extend the stack our own way.  */
+-      if (YYMAXDEPTH <= yystacksize)
+-      goto yyexhaustedlab;
+-      yystacksize *= 2;
+-      if (YYMAXDEPTH < yystacksize)
+-      yystacksize = YYMAXDEPTH;
+-
+-      {
+-      yytype_int16 *yyss1 = yyss;
+-      union yyalloc *yyptr =
+-        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+-      if (! yyptr)
+-        goto yyexhaustedlab;
+-      YYSTACK_RELOCATE (yyss);
+-      YYSTACK_RELOCATE (yyvs);
+-      YYSTACK_RELOCATE (yyls);
+-#  undef YYSTACK_RELOCATE
+-      if (yyss1 != yyssa)
+-        YYSTACK_FREE (yyss1);
+-      }
+-# endif
+-#endif /* no yyoverflow */
+-
+-      yyssp = yyss + yysize - 1;
+-      yyvsp = yyvs + yysize - 1;
+-      yylsp = yyls + yysize - 1;
+-
+-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+-                (unsigned long int) yystacksize));
+-
+-      if (yyss + yystacksize - 1 <= yyssp)
+-      YYABORT;
+-    }
+-
+-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+-
+-  goto yybackup;
+-
+-/*-----------.
+-| yybackup.  |
+-`-----------*/
+-yybackup:
+-
+-  /* Do appropriate processing given the current state.  Read a
+-     look-ahead token if we need one and don't already have one.  */
+-
+-  /* First try to decide what to do without reference to look-ahead token.  */
+-  yyn = yypact[yystate];
+-  if (yyn == YYPACT_NINF)
+-    goto yydefault;
+-
+-  /* Not known => get a look-ahead token if don't already have one.  */
+-
+-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+-  if (yychar == YYEMPTY)
+-    {
+-      YYDPRINTF ((stderr, "Reading a token: "));
+-      yychar = YYLEX;
+-    }
+-
+-  if (yychar <= YYEOF)
+-    {
+-      yychar = yytoken = YYEOF;
+-      YYDPRINTF ((stderr, "Now at end of input.\n"));
+-    }
+-  else
+-    {
+-      yytoken = YYTRANSLATE (yychar);
+-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+-    }
+-
+-  /* If the proper action on seeing token YYTOKEN is to reduce or to
+-     detect an error, take that action.  */
+-  yyn += yytoken;
+-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+-    goto yydefault;
+-  yyn = yytable[yyn];
+-  if (yyn <= 0)
+-    {
+-      if (yyn == 0 || yyn == YYTABLE_NINF)
+-      goto yyerrlab;
+-      yyn = -yyn;
+-      goto yyreduce;
+-    }
+-
+-  if (yyn == YYFINAL)
+-    YYACCEPT;
+-
+-  /* Count tokens shifted since error; after three, turn off error
+-     status.  */
+-  if (yyerrstatus)
+-    yyerrstatus--;
+-
+-  /* Shift the look-ahead token.  */
+-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+-
+-  /* Discard the shifted token unless it is eof.  */
+-  if (yychar != YYEOF)
+-    yychar = YYEMPTY;
+-
+-  yystate = yyn;
+-  *++yyvsp = yylval;
+-  *++yylsp = yylloc;
+-  goto yynewstate;
+-
+-
+-/*-----------------------------------------------------------.
+-| yydefault -- do the default action for the current state.  |
+-`-----------------------------------------------------------*/
+-yydefault:
+-  yyn = yydefact[yystate];
+-  if (yyn == 0)
+-    goto yyerrlab;
+-  goto yyreduce;
+-
+-
+-/*-----------------------------.
+-| yyreduce -- Do a reduction.  |
+-`-----------------------------*/
+-yyreduce:
+-  /* yyn is the number of a rule to reduce with.  */
+-  yylen = yyr2[yyn];
+-
+-  /* If YYLEN is nonzero, implement the default value of the action:
+-     `$$ = $1'.
+-
+-     Otherwise, the following line sets YYVAL to garbage.
+-     This behavior is undocumented and Bison
+-     users should not rely upon it.  Assigning to YYVAL
+-     unconditionally makes the parser a bit smaller, and it avoids a
+-     GCC warning that YYVAL may be used uninitialized.  */
+-  yyval = yyvsp[1-yylen];
+-
+-  /* Default location.  */
+-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+-  YY_REDUCE_PRINT (yyn);
+-  switch (yyn)
+-    {
+-        case 2:
+-#line 90 "dtc-parser.y"
+-    {
+-                      the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), 0);
+-              ;}
+-    break;
+-
+-  case 3:
+-#line 94 "dtc-parser.y"
+-    {
+-                      the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node), 0);
+-              ;}
+-    break;
+-
+-  case 4:
+-#line 101 "dtc-parser.y"
+-    {
+-                      (yyval.re) = NULL;
+-              ;}
+-    break;
+-
+-  case 5:
+-#line 105 "dtc-parser.y"
+-    {
+-                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
+-              ;}
+-    break;
+-
+-  case 6:
+-#line 112 "dtc-parser.y"
+-    {
+-                      (yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref));
+-              ;}
+-    break;
+-
+-  case 7:
+-#line 119 "dtc-parser.y"
+-    {
+-                      (yyval.re) = NULL;
+-              ;}
+-    break;
+-
+-  case 8:
+-#line 123 "dtc-parser.y"
+-    {
+-                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
+-              ;}
+-    break;
+-
+-  case 9:
+-#line 130 "dtc-parser.y"
+-    {
+-                      (yyval.re) = (yyvsp[(1) - (1)].re);
+-              ;}
+-    break;
+-
+-  case 10:
+-#line 134 "dtc-parser.y"
+-    {
+-                      (yyval.re) = build_reserve_entry((yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr) - (yyvsp[(3) - (6)].addr) + 1, (yyvsp[(1) - (6)].labelref));
+-              ;}
+-    break;
+-
+-  case 11:
+-#line 141 "dtc-parser.y"
+-    {
+-                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
+-              ;}
+-    break;
+-
+-  case 12:
+-#line 145 "dtc-parser.y"
+-    {
+-                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64);
+-              ;}
+-    break;
+-
+-  case 13:
+-#line 152 "dtc-parser.y"
+-    {
+-                      (yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL);
+-              ;}
+-    break;
+-
+-  case 14:
+-#line 159 "dtc-parser.y"
+-    {
+-                      (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
+-              ;}
+-    break;
+-
+-  case 15:
+-#line 166 "dtc-parser.y"
+-    {
+-                      (yyval.proplist) = NULL;
+-              ;}
+-    break;
+-
+-  case 16:
+-#line 170 "dtc-parser.y"
+-    {
+-                      (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
+-              ;}
+-    break;
+-
+-  case 17:
+-#line 177 "dtc-parser.y"
+-    {
+-                      (yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref));
+-              ;}
+-    break;
+-
+-  case 18:
+-#line 181 "dtc-parser.y"
+-    {
+-                      (yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref));
+-              ;}
+-    break;
+-
+-  case 19:
+-#line 188 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
+-              ;}
+-    break;
+-
+-  case 20:
+-#line 192 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
+-              ;}
+-    break;
+-
+-  case 21:
+-#line 196 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
+-              ;}
+-    break;
+-
+-  case 22:
+-#line 200 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
+-              ;}
+-    break;
+-
+-  case 23:
+-#line 204 "dtc-parser.y"
+-    {
+-                      struct search_path path = { srcpos_file->dir, NULL, NULL };
+-                      struct dtc_file *file = dtc_open_file((yyvsp[(4) - (9)].data).val, &path);
+-                      struct data d = empty_data;
+-
+-                      if ((yyvsp[(6) - (9)].addr) != 0)
+-                              if (fseek(file->file, (yyvsp[(6) - (9)].addr), SEEK_SET) != 0)
+-                                      yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
+-                                               (unsigned long long)(yyvsp[(6) - (9)].addr),
+-                                               (yyvsp[(4) - (9)].data).val, strerror(errno));
+-
+-                      d = data_copy_file(file->file, (yyvsp[(8) - (9)].addr));
+-
+-                      (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d);
+-                      dtc_close_file(file);
+-              ;}
+-    break;
+-
+-  case 24:
+-#line 221 "dtc-parser.y"
+-    {
+-                      struct search_path path = { srcpos_file->dir, NULL, NULL };
+-                      struct dtc_file *file = dtc_open_file((yyvsp[(4) - (5)].data).val, &path);
+-                      struct data d = empty_data;
+-
+-                      d = data_copy_file(file->file, -1);
+-
+-                      (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d);
+-                      dtc_close_file(file);
+-              ;}
+-    break;
+-
+-  case 25:
+-#line 232 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
+-              ;}
+-    break;
+-
+-  case 26:
+-#line 239 "dtc-parser.y"
+-    {
+-                      (yyval.data) = empty_data;
+-              ;}
+-    break;
+-
+-  case 27:
+-#line 243 "dtc-parser.y"
+-    {
+-                      (yyval.data) = (yyvsp[(1) - (2)].data);
+-              ;}
+-    break;
+-
+-  case 28:
+-#line 247 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
+-              ;}
+-    break;
+-
+-  case 29:
+-#line 254 "dtc-parser.y"
+-    {
+-                      (yyval.data) = empty_data;
+-              ;}
+-    break;
+-
+-  case 30:
+-#line 258 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));
+-              ;}
+-    break;
+-
+-  case 31:
+-#line 262 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,
+-                                                            (yyvsp[(2) - (2)].labelref)), -1);
+-              ;}
+-    break;
+-
+-  case 32:
+-#line 267 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
+-              ;}
+-    break;
+-
+-  case 33:
+-#line 274 "dtc-parser.y"
+-    {
+-                      (yyval.cbase) = 16;
+-              ;}
+-    break;
+-
+-  case 35:
+-#line 282 "dtc-parser.y"
+-    {
+-                      (yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);
+-              ;}
+-    break;
+-
+-  case 36:
+-#line 286 "dtc-parser.y"
+-    {
+-                      (yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32);
+-              ;}
+-    break;
+-
+-  case 37:
+-#line 293 "dtc-parser.y"
+-    {
+-                      (yyval.data) = empty_data;
+-              ;}
+-    break;
+-
+-  case 38:
+-#line 297 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
+-              ;}
+-    break;
+-
+-  case 39:
+-#line 301 "dtc-parser.y"
+-    {
+-                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
+-              ;}
+-    break;
+-
+-  case 40:
+-#line 308 "dtc-parser.y"
+-    {
+-                      (yyval.nodelist) = NULL;
+-              ;}
+-    break;
+-
+-  case 41:
+-#line 312 "dtc-parser.y"
+-    {
+-                      (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
+-              ;}
+-    break;
+-
+-  case 42:
+-#line 316 "dtc-parser.y"
+-    {
+-                      yyerror("syntax error: properties must precede subnodes");
+-                      YYERROR;
+-              ;}
+-    break;
+-
+-  case 43:
+-#line 324 "dtc-parser.y"
+-    {
+-                      (yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref));
+-              ;}
+-    break;
+-
+-  case 44:
+-#line 331 "dtc-parser.y"
+-    {
+-                      (yyval.labelref) = NULL;
+-              ;}
+-    break;
+-
+-  case 45:
+-#line 335 "dtc-parser.y"
+-    {
+-                      (yyval.labelref) = (yyvsp[(1) - (1)].labelref);
+-              ;}
+-    break;
+-
+-
+-/* Line 1267 of yacc.c.  */
+-#line 1780 "dtc-parser.tab.c"
+-      default: break;
+-    }
+-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+-
+-  YYPOPSTACK (yylen);
+-  yylen = 0;
+-  YY_STACK_PRINT (yyss, yyssp);
+-
+-  *++yyvsp = yyval;
+-  *++yylsp = yyloc;
+-
+-  /* Now `shift' the result of the reduction.  Determine what state
+-     that goes to, based on the state we popped back to and the rule
+-     number reduced by.  */
+-
+-  yyn = yyr1[yyn];
+-
+-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+-    yystate = yytable[yystate];
+-  else
+-    yystate = yydefgoto[yyn - YYNTOKENS];
+-
+-  goto yynewstate;
+-
+-
+-/*------------------------------------.
+-| yyerrlab -- here on detecting error |
+-`------------------------------------*/
+-yyerrlab:
+-  /* If not already recovering from an error, report this error.  */
+-  if (!yyerrstatus)
+-    {
+-      ++yynerrs;
+-#if ! YYERROR_VERBOSE
+-      yyerror (YY_("syntax error"));
+-#else
+-      {
+-      YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+-      if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+-        {
+-          YYSIZE_T yyalloc = 2 * yysize;
+-          if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+-            yyalloc = YYSTACK_ALLOC_MAXIMUM;
+-          if (yymsg != yymsgbuf)
+-            YYSTACK_FREE (yymsg);
+-          yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+-          if (yymsg)
+-            yymsg_alloc = yyalloc;
+-          else
+-            {
+-              yymsg = yymsgbuf;
+-              yymsg_alloc = sizeof yymsgbuf;
+-            }
+-        }
+-
+-      if (0 < yysize && yysize <= yymsg_alloc)
+-        {
+-          (void) yysyntax_error (yymsg, yystate, yychar);
+-          yyerror (yymsg);
+-        }
+-      else
+-        {
+-          yyerror (YY_("syntax error"));
+-          if (yysize != 0)
+-            goto yyexhaustedlab;
+-        }
+-      }
+-#endif
+-    }
+-
+-  yyerror_range[0] = yylloc;
+-
+-  if (yyerrstatus == 3)
+-    {
+-      /* If just tried and failed to reuse look-ahead token after an
+-       error, discard it.  */
+-
+-      if (yychar <= YYEOF)
+-      {
+-        /* Return failure if at end of input.  */
+-        if (yychar == YYEOF)
+-          YYABORT;
+-      }
+-      else
+-      {
+-        yydestruct ("Error: discarding",
+-                    yytoken, &yylval, &yylloc);
+-        yychar = YYEMPTY;
+-      }
+-    }
+-
+-  /* Else will try to reuse look-ahead token after shifting the error
+-     token.  */
+-  goto yyerrlab1;
+-
+-
+-/*---------------------------------------------------.
+-| yyerrorlab -- error raised explicitly by YYERROR.  |
+-`---------------------------------------------------*/
+-yyerrorlab:
+-
+-  /* Pacify compilers like GCC when the user code never invokes
+-     YYERROR and the label yyerrorlab therefore never appears in user
+-     code.  */
+-  if (/*CONSTCOND*/ 0)
+-     goto yyerrorlab;
+-
+-  yyerror_range[0] = yylsp[1-yylen];
+-  /* Do not reclaim the symbols of the rule which action triggered
+-     this YYERROR.  */
+-  YYPOPSTACK (yylen);
+-  yylen = 0;
+-  YY_STACK_PRINT (yyss, yyssp);
+-  yystate = *yyssp;
+-  goto yyerrlab1;
+-
+-
+-/*-------------------------------------------------------------.
+-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+-`-------------------------------------------------------------*/
+-yyerrlab1:
+-  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
+-
+-  for (;;)
+-    {
+-      yyn = yypact[yystate];
+-      if (yyn != YYPACT_NINF)
+-      {
+-        yyn += YYTERROR;
+-        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+-          {
+-            yyn = yytable[yyn];
+-            if (0 < yyn)
+-              break;
+-          }
+-      }
+-
+-      /* Pop the current state because it cannot handle the error token.  */
+-      if (yyssp == yyss)
+-      YYABORT;
+-
+-      yyerror_range[0] = *yylsp;
+-      yydestruct ("Error: popping",
+-                yystos[yystate], yyvsp, yylsp);
+-      YYPOPSTACK (1);
+-      yystate = *yyssp;
+-      YY_STACK_PRINT (yyss, yyssp);
+-    }
+-
+-  if (yyn == YYFINAL)
+-    YYACCEPT;
+-
+-  *++yyvsp = yylval;
+-
+-  yyerror_range[1] = yylloc;
+-  /* Using YYLLOC is tempting, but would change the location of
+-     the look-ahead.  YYLOC is available though.  */
+-  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
+-  *++yylsp = yyloc;
+-
+-  /* Shift the error token.  */
+-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+-
+-  yystate = yyn;
+-  goto yynewstate;
+-
+-
+-/*-------------------------------------.
+-| yyacceptlab -- YYACCEPT comes here.  |
+-`-------------------------------------*/
+-yyacceptlab:
+-  yyresult = 0;
+-  goto yyreturn;
+-
+-/*-----------------------------------.
+-| yyabortlab -- YYABORT comes here.  |
+-`-----------------------------------*/
+-yyabortlab:
+-  yyresult = 1;
+-  goto yyreturn;
+-
+-#ifndef yyoverflow
+-/*-------------------------------------------------.
+-| yyexhaustedlab -- memory exhaustion comes here.  |
+-`-------------------------------------------------*/
+-yyexhaustedlab:
+-  yyerror (YY_("memory exhausted"));
+-  yyresult = 2;
+-  /* Fall through.  */
+-#endif
+-
+-yyreturn:
+-  if (yychar != YYEOF && yychar != YYEMPTY)
+-     yydestruct ("Cleanup: discarding lookahead",
+-               yytoken, &yylval, &yylloc);
+-  /* Do not reclaim the symbols of the rule which action triggered
+-     this YYABORT or YYACCEPT.  */
+-  YYPOPSTACK (yylen);
+-  YY_STACK_PRINT (yyss, yyssp);
+-  while (yyssp != yyss)
+-    {
+-      yydestruct ("Cleanup: popping",
+-                yystos[*yyssp], yyvsp, yylsp);
+-      YYPOPSTACK (1);
+-    }
+-#ifndef yyoverflow
+-  if (yyss != yyssa)
+-    YYSTACK_FREE (yyss);
+-#endif
+-#if YYERROR_VERBOSE
+-  if (yymsg != yymsgbuf)
+-    YYSTACK_FREE (yymsg);
+-#endif
+-  /* Make sure YYID is used.  */
+-  return YYID (yyresult);
+-}
+-
+-
+-#line 340 "dtc-parser.y"
+-
+-
+-void yyerrorf(char const *s, ...)
+-{
+-      const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
+-      va_list va;
+-      va_start(va, s);
+-
+-      if (strcmp(fname, "-") == 0)
+-              fname = "stdin";
+-
+-      fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
+-      vfprintf(stderr, s, va);
+-      fprintf(stderr, "\n");
+-
+-      treesource_error = 1;
+-      va_end(va);
+-}
+-
+-void yyerror (char const *s)
+-{
+-      yyerrorf("%s", s);
+-}
+-
+-static unsigned long long eval_literal(const char *s, int base, int bits)
+-{
+-      unsigned long long val;
+-      char *e;
+-
+-      errno = 0;
+-      val = strtoull(s, &e, base);
+-      if (*e)
+-              yyerror("bad characters in literal");
+-      else if ((errno == ERANGE)
+-               || ((bits < 64) && (val >= (1ULL << bits))))
+-              yyerror("literal out of range");
+-      else if (errno != 0)
+-              yyerror("bad literal");
+-      return val;
+-}
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped    1970-01-01 01:00:00.000000000 +0100
+@@ -1,113 +0,0 @@
+-/* A Bison parser, made by GNU Bison 2.3.  */
+-
+-/* Skeleton interface for Bison's Yacc-like parsers in C
+-
+-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+-   Free Software Foundation, 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, 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., 51 Franklin Street, Fifth Floor,
+-   Boston, MA 02110-1301, USA.  */
+-
+-/* As a special exception, you may create a larger work that contains
+-   part or all of the Bison parser skeleton and distribute that work
+-   under terms of your choice, so long as that work isn't itself a
+-   parser generator using the skeleton or a modified version thereof
+-   as a parser skeleton.  Alternatively, if you modify or redistribute
+-   the parser skeleton itself, you may (at your option) remove this
+-   special exception, which will cause the skeleton and the resulting
+-   Bison output files to be licensed under the GNU General Public
+-   License without this special exception.
+-
+-   This special exception was added by the Free Software Foundation in
+-   version 2.2 of Bison.  */
+-
+-/* Tokens.  */
+-#ifndef YYTOKENTYPE
+-# define YYTOKENTYPE
+-   /* Put the tokens into the symbol table, so that GDB and other debuggers
+-      know about them.  */
+-   enum yytokentype {
+-     DT_V1 = 258,
+-     DT_MEMRESERVE = 259,
+-     DT_PROPNODENAME = 260,
+-     DT_LITERAL = 261,
+-     DT_LEGACYLITERAL = 262,
+-     DT_BASE = 263,
+-     DT_BYTE = 264,
+-     DT_STRING = 265,
+-     DT_LABEL = 266,
+-     DT_REF = 267,
+-     DT_INCBIN = 268
+-   };
+-#endif
+-/* Tokens.  */
+-#define DT_V1 258
+-#define DT_MEMRESERVE 259
+-#define DT_PROPNODENAME 260
+-#define DT_LITERAL 261
+-#define DT_LEGACYLITERAL 262
+-#define DT_BASE 263
+-#define DT_BYTE 264
+-#define DT_STRING 265
+-#define DT_LABEL 266
+-#define DT_REF 267
+-#define DT_INCBIN 268
+-
+-
+-
+-
+-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+-typedef union YYSTYPE
+-#line 37 "dtc-parser.y"
+-{
+-      char *propnodename;
+-      char *literal;
+-      char *labelref;
+-      unsigned int cbase;
+-      uint8_t byte;
+-      struct data data;
+-
+-      uint64_t addr;
+-      cell_t cell;
+-      struct property *prop;
+-      struct property *proplist;
+-      struct node *node;
+-      struct node *nodelist;
+-      struct reserve_info *re;
+-}
+-/* Line 1489 of yacc.c.  */
+-#line 92 "dtc-parser.tab.h"
+-      YYSTYPE;
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+-# define YYSTYPE_IS_DECLARED 1
+-# define YYSTYPE_IS_TRIVIAL 1
+-#endif
+-
+-extern YYSTYPE yylval;
+-
+-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
+-typedef struct YYLTYPE
+-{
+-  int first_line;
+-  int first_column;
+-  int last_line;
+-  int last_column;
+-} YYLTYPE;
+-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
+-# define YYLTYPE_IS_DECLARED 1
+-# define YYLTYPE_IS_TRIVIAL 1
+-#endif
+-
+-extern YYLTYPE yylloc;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.y linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.y
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/dtc-parser.y    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/dtc-parser.y        1970-01-01 01:00:00.000000000 +0100
+@@ -1,379 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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
+- */
+-
+-%locations
+-
+-%{
+-#include <stdio.h>
+-
+-#include "dtc.h"
+-#include "srcpos.h"
+-
+-extern int yylex(void);
+-
+-extern struct boot_info *the_boot_info;
+-extern int treesource_error;
+-
+-static unsigned long long eval_literal(const char *s, int base, int bits);
+-%}
+-
+-%union {
+-      char *propnodename;
+-      char *literal;
+-      char *labelref;
+-      unsigned int cbase;
+-      uint8_t byte;
+-      struct data data;
+-
+-      uint64_t addr;
+-      cell_t cell;
+-      struct property *prop;
+-      struct property *proplist;
+-      struct node *node;
+-      struct node *nodelist;
+-      struct reserve_info *re;
+-}
+-
+-%token DT_V1
+-%token DT_MEMRESERVE
+-%token <propnodename> DT_PROPNODENAME
+-%token <literal> DT_LITERAL
+-%token <literal> DT_LEGACYLITERAL
+-%token <cbase> DT_BASE
+-%token <byte> DT_BYTE
+-%token <data> DT_STRING
+-%token <labelref> DT_LABEL
+-%token <labelref> DT_REF
+-%token DT_INCBIN
+-
+-%type <data> propdata
+-%type <data> propdataprefix
+-%type <re> memreserve
+-%type <re> memreserves
+-%type <re> v0_memreserve
+-%type <re> v0_memreserves
+-%type <addr> addr
+-%type <data> celllist
+-%type <cbase> cellbase
+-%type <cell> cellval
+-%type <data> bytestring
+-%type <prop> propdef
+-%type <proplist> proplist
+-
+-%type <node> devicetree
+-%type <node> nodedef
+-%type <node> subnode
+-%type <nodelist> subnodes
+-%type <labelref> label
+-
+-%%
+-
+-sourcefile:
+-        DT_V1 ';' memreserves devicetree
+-              {
+-                      the_boot_info = build_boot_info($3, $4, 0);
+-              }
+-      | v0_memreserves devicetree
+-              {
+-                      the_boot_info = build_boot_info($1, $2, 0);
+-              }
+-      ;
+-
+-memreserves:
+-        /* empty */
+-              {
+-                      $$ = NULL;
+-              }
+-      | memreserve memreserves
+-              {
+-                      $$ = chain_reserve_entry($1, $2);
+-              }
+-      ;
+-
+-memreserve:
+-        label DT_MEMRESERVE addr addr ';'
+-              {
+-                      $$ = build_reserve_entry($3, $4, $1);
+-              }
+-      ;
+-
+-v0_memreserves:
+-        /* empty */
+-              {
+-                      $$ = NULL;
+-              }
+-      | v0_memreserve v0_memreserves
+-              {
+-                      $$ = chain_reserve_entry($1, $2);
+-              };
+-      ;
+-
+-v0_memreserve:
+-        memreserve
+-              {
+-                      $$ = $1;
+-              }
+-      | label DT_MEMRESERVE addr '-' addr ';'
+-              {
+-                      $$ = build_reserve_entry($3, $5 - $3 + 1, $1);
+-              }
+-      ;
+-
+-addr:
+-        DT_LITERAL
+-              {
+-                      $$ = eval_literal($1, 0, 64);
+-              }
+-      | DT_LEGACYLITERAL
+-              {
+-                      $$ = eval_literal($1, 16, 64);
+-              }
+-        ;
+-
+-devicetree:
+-        '/' nodedef
+-              {
+-                      $$ = name_node($2, "", NULL);
+-              }
+-      ;
+-
+-nodedef:
+-        '{' proplist subnodes '}' ';'
+-              {
+-                      $$ = build_node($2, $3);
+-              }
+-      ;
+-
+-proplist:
+-        /* empty */
+-              {
+-                      $$ = NULL;
+-              }
+-      | proplist propdef
+-              {
+-                      $$ = chain_property($2, $1);
+-              }
+-      ;
+-
+-propdef:
+-        label DT_PROPNODENAME '=' propdata ';'
+-              {
+-                      $$ = build_property($2, $4, $1);
+-              }
+-      | label DT_PROPNODENAME ';'
+-              {
+-                      $$ = build_property($2, empty_data, $1);
+-              }
+-      ;
+-
+-propdata:
+-        propdataprefix DT_STRING
+-              {
+-                      $$ = data_merge($1, $2);
+-              }
+-      | propdataprefix '<' celllist '>'
+-              {
+-                      $$ = data_merge($1, $3);
+-              }
+-      | propdataprefix '[' bytestring ']'
+-              {
+-                      $$ = data_merge($1, $3);
+-              }
+-      | propdataprefix DT_REF
+-              {
+-                      $$ = data_add_marker($1, REF_PATH, $2);
+-              }
+-      | propdataprefix DT_INCBIN '(' DT_STRING ',' addr ',' addr ')'
+-              {
+-                      struct search_path path = { srcpos_file->dir, NULL, NULL };
+-                      struct dtc_file *file = dtc_open_file($4.val, &path);
+-                      struct data d = empty_data;
+-
+-                      if ($6 != 0)
+-                              if (fseek(file->file, $6, SEEK_SET) != 0)
+-                                      yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
+-                                               (unsigned long long)$6,
+-                                               $4.val, strerror(errno));
+-
+-                      d = data_copy_file(file->file, $8);
+-
+-                      $$ = data_merge($1, d);
+-                      dtc_close_file(file);
+-              }
+-      | propdataprefix DT_INCBIN '(' DT_STRING ')'
+-              {
+-                      struct search_path path = { srcpos_file->dir, NULL, NULL };
+-                      struct dtc_file *file = dtc_open_file($4.val, &path);
+-                      struct data d = empty_data;
+-
+-                      d = data_copy_file(file->file, -1);
+-
+-                      $$ = data_merge($1, d);
+-                      dtc_close_file(file);
+-              }
+-      | propdata DT_LABEL
+-              {
+-                      $$ = data_add_marker($1, LABEL, $2);
+-              }
+-      ;
+-
+-propdataprefix:
+-        /* empty */
+-              {
+-                      $$ = empty_data;
+-              }
+-      | propdata ','
+-              {
+-                      $$ = $1;
+-              }
+-      | propdataprefix DT_LABEL
+-              {
+-                      $$ = data_add_marker($1, LABEL, $2);
+-              }
+-      ;
+-
+-celllist:
+-        /* empty */
+-              {
+-                      $$ = empty_data;
+-              }
+-      | celllist cellval
+-              {
+-                      $$ = data_append_cell($1, $2);
+-              }
+-      | celllist DT_REF
+-              {
+-                      $$ = data_append_cell(data_add_marker($1, REF_PHANDLE,
+-                                                            $2), -1);
+-              }
+-      | celllist DT_LABEL
+-              {
+-                      $$ = data_add_marker($1, LABEL, $2);
+-              }
+-      ;
+-
+-cellbase:
+-        /* empty */
+-              {
+-                      $$ = 16;
+-              }
+-      | DT_BASE
+-      ;
+-
+-cellval:
+-        DT_LITERAL
+-              {
+-                      $$ = eval_literal($1, 0, 32);
+-              }
+-      | cellbase DT_LEGACYLITERAL
+-              {
+-                      $$ = eval_literal($2, $1, 32);
+-              }
+-      ;
+-
+-bytestring:
+-        /* empty */
+-              {
+-                      $$ = empty_data;
+-              }
+-      | bytestring DT_BYTE
+-              {
+-                      $$ = data_append_byte($1, $2);
+-              }
+-      | bytestring DT_LABEL
+-              {
+-                      $$ = data_add_marker($1, LABEL, $2);
+-              }
+-      ;
+-
+-subnodes:
+-        /* empty */
+-              {
+-                      $$ = NULL;
+-              }
+-      |  subnode subnodes
+-              {
+-                      $$ = chain_node($1, $2);
+-              }
+-      | subnode propdef
+-              {
+-                      yyerror("syntax error: properties must precede subnodes");
+-                      YYERROR;
+-              }
+-      ;
+-
+-subnode:
+-        label DT_PROPNODENAME nodedef
+-              {
+-                      $$ = name_node($3, $2, $1);
+-              }
+-      ;
+-
+-label:
+-        /* empty */
+-              {
+-                      $$ = NULL;
+-              }
+-      | DT_LABEL
+-              {
+-                      $$ = $1;
+-              }
+-      ;
+-
+-%%
+-
+-void yyerrorf(char const *s, ...)
+-{
+-      const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
+-      va_list va;
+-      va_start(va, s);
+-
+-      if (strcmp(fname, "-") == 0)
+-              fname = "stdin";
+-
+-      fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
+-      vfprintf(stderr, s, va);
+-      fprintf(stderr, "\n");
+-
+-      treesource_error = 1;
+-      va_end(va);
+-}
+-
+-void yyerror (char const *s)
+-{
+-      yyerrorf("%s", s);
+-}
+-
+-static unsigned long long eval_literal(const char *s, int base, int bits)
+-{
+-      unsigned long long val;
+-      char *e;
+-
+-      errno = 0;
+-      val = strtoull(s, &e, base);
+-      if (*e)
+-              yyerror("bad characters in literal");
+-      else if ((errno == ERANGE)
+-               || ((bits < 64) && (val >= (1ULL << bits))))
+-              yyerror("literal out of range");
+-      else if (errno != 0)
+-              yyerror("bad literal");
+-      return val;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/flattree.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/flattree.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/flattree.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/flattree.c  1970-01-01 01:00:00.000000000 +0100
+@@ -1,906 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-#include "srcpos.h"
+-
+-#define FTF_FULLPATH  0x1
+-#define FTF_VARALIGN  0x2
+-#define FTF_NAMEPROPS 0x4
+-#define FTF_BOOTCPUID 0x8
+-#define FTF_STRTABSIZE        0x10
+-#define FTF_STRUCTSIZE        0x20
+-#define FTF_NOPS      0x40
+-
+-static struct version_info {
+-      int version;
+-      int last_comp_version;
+-      int hdr_size;
+-      int flags;
+-} version_table[] = {
+-      {1, 1, FDT_V1_SIZE,
+-       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS},
+-      {2, 1, FDT_V2_SIZE,
+-       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID},
+-      {3, 1, FDT_V3_SIZE,
+-       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE},
+-      {16, 16, FDT_V3_SIZE,
+-       FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS},
+-      {17, 16, FDT_V17_SIZE,
+-       FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS},
+-};
+-
+-struct emitter {
+-      void (*cell)(void *, cell_t);
+-      void (*string)(void *, char *, int);
+-      void (*align)(void *, int);
+-      void (*data)(void *, struct data);
+-      void (*beginnode)(void *, const char *);
+-      void (*endnode)(void *, const char *);
+-      void (*property)(void *, const char *);
+-};
+-
+-static void bin_emit_cell(void *e, cell_t val)
+-{
+-      struct data *dtbuf = e;
+-
+-      *dtbuf = data_append_cell(*dtbuf, val);
+-}
+-
+-static void bin_emit_string(void *e, char *str, int len)
+-{
+-      struct data *dtbuf = e;
+-
+-      if (len == 0)
+-              len = strlen(str);
+-
+-      *dtbuf = data_append_data(*dtbuf, str, len);
+-      *dtbuf = data_append_byte(*dtbuf, '\0');
+-}
+-
+-static void bin_emit_align(void *e, int a)
+-{
+-      struct data *dtbuf = e;
+-
+-      *dtbuf = data_append_align(*dtbuf, a);
+-}
+-
+-static void bin_emit_data(void *e, struct data d)
+-{
+-      struct data *dtbuf = e;
+-
+-      *dtbuf = data_append_data(*dtbuf, d.val, d.len);
+-}
+-
+-static void bin_emit_beginnode(void *e, const char *label)
+-{
+-      bin_emit_cell(e, FDT_BEGIN_NODE);
+-}
+-
+-static void bin_emit_endnode(void *e, const char *label)
+-{
+-      bin_emit_cell(e, FDT_END_NODE);
+-}
+-
+-static void bin_emit_property(void *e, const char *label)
+-{
+-      bin_emit_cell(e, FDT_PROP);
+-}
+-
+-static struct emitter bin_emitter = {
+-      .cell = bin_emit_cell,
+-      .string = bin_emit_string,
+-      .align = bin_emit_align,
+-      .data = bin_emit_data,
+-      .beginnode = bin_emit_beginnode,
+-      .endnode = bin_emit_endnode,
+-      .property = bin_emit_property,
+-};
+-
+-static void emit_label(FILE *f, const char *prefix, const char *label)
+-{
+-      fprintf(f, "\t.globl\t%s_%s\n", prefix, label);
+-      fprintf(f, "%s_%s:\n", prefix, label);
+-      fprintf(f, "_%s_%s:\n", prefix, label);
+-}
+-
+-static void emit_offset_label(FILE *f, const char *label, int offset)
+-{
+-      fprintf(f, "\t.globl\t%s\n", label);
+-      fprintf(f, "%s\t= . + %d\n", label, offset);
+-}
+-
+-static void asm_emit_cell(void *e, cell_t val)
+-{
+-      FILE *f = e;
+-
+-      fprintf(f, "\t.long\t0x%x\n", val);
+-}
+-
+-static void asm_emit_string(void *e, char *str, int len)
+-{
+-      FILE *f = e;
+-      char c = 0;
+-
+-      if (len != 0) {
+-              /* XXX: ewww */
+-              c = str[len];
+-              str[len] = '\0';
+-      }
+-
+-      fprintf(f, "\t.string\t\"%s\"\n", str);
+-
+-      if (len != 0) {
+-              str[len] = c;
+-      }
+-}
+-
+-static void asm_emit_align(void *e, int a)
+-{
+-      FILE *f = e;
+-
+-      fprintf(f, "\t.balign\t%d\n", a);
+-}
+-
+-static void asm_emit_data(void *e, struct data d)
+-{
+-      FILE *f = e;
+-      int off = 0;
+-      struct marker *m = d.markers;
+-
+-      for_each_marker_of_type(m, LABEL)
+-              emit_offset_label(f, m->ref, m->offset);
+-
+-      while ((d.len - off) >= sizeof(uint32_t)) {
+-              fprintf(f, "\t.long\t0x%x\n",
+-                      fdt32_to_cpu(*((uint32_t *)(d.val+off))));
+-              off += sizeof(uint32_t);
+-      }
+-
+-      while ((d.len - off) >= 1) {
+-              fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]);
+-              off += 1;
+-      }
+-
+-      assert(off == d.len);
+-}
+-
+-static void asm_emit_beginnode(void *e, const char *label)
+-{
+-      FILE *f = e;
+-
+-      if (label) {
+-              fprintf(f, "\t.globl\t%s\n", label);
+-              fprintf(f, "%s:\n", label);
+-      }
+-      fprintf(f, "\t.long\tFDT_BEGIN_NODE\n");
+-}
+-
+-static void asm_emit_endnode(void *e, const char *label)
+-{
+-      FILE *f = e;
+-
+-      fprintf(f, "\t.long\tFDT_END_NODE\n");
+-      if (label) {
+-              fprintf(f, "\t.globl\t%s_end\n", label);
+-              fprintf(f, "%s_end:\n", label);
+-      }
+-}
+-
+-static void asm_emit_property(void *e, const char *label)
+-{
+-      FILE *f = e;
+-
+-      if (label) {
+-              fprintf(f, "\t.globl\t%s\n", label);
+-              fprintf(f, "%s:\n", label);
+-      }
+-      fprintf(f, "\t.long\tFDT_PROP\n");
+-}
+-
+-static struct emitter asm_emitter = {
+-      .cell = asm_emit_cell,
+-      .string = asm_emit_string,
+-      .align = asm_emit_align,
+-      .data = asm_emit_data,
+-      .beginnode = asm_emit_beginnode,
+-      .endnode = asm_emit_endnode,
+-      .property = asm_emit_property,
+-};
+-
+-static int stringtable_insert(struct data *d, const char *str)
+-{
+-      int i;
+-
+-      /* FIXME: do this more efficiently? */
+-
+-      for (i = 0; i < d->len; i++) {
+-              if (streq(str, d->val + i))
+-                      return i;
+-      }
+-
+-      *d = data_append_data(*d, str, strlen(str)+1);
+-      return i;
+-}
+-
+-static void flatten_tree(struct node *tree, struct emitter *emit,
+-                       void *etarget, struct data *strbuf,
+-                       struct version_info *vi)
+-{
+-      struct property *prop;
+-      struct node *child;
+-      int seen_name_prop = 0;
+-
+-      emit->beginnode(etarget, tree->label);
+-
+-      if (vi->flags & FTF_FULLPATH)
+-              emit->string(etarget, tree->fullpath, 0);
+-      else
+-              emit->string(etarget, tree->name, 0);
+-
+-      emit->align(etarget, sizeof(cell_t));
+-
+-      for_each_property(tree, prop) {
+-              int nameoff;
+-
+-              if (streq(prop->name, "name"))
+-                      seen_name_prop = 1;
+-
+-              nameoff = stringtable_insert(strbuf, prop->name);
+-
+-              emit->property(etarget, prop->label);
+-              emit->cell(etarget, prop->val.len);
+-              emit->cell(etarget, nameoff);
+-
+-              if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8))
+-                      emit->align(etarget, 8);
+-
+-              emit->data(etarget, prop->val);
+-              emit->align(etarget, sizeof(cell_t));
+-      }
+-
+-      if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) {
+-              emit->property(etarget, NULL);
+-              emit->cell(etarget, tree->basenamelen+1);
+-              emit->cell(etarget, stringtable_insert(strbuf, "name"));
+-
+-              if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8))
+-                      emit->align(etarget, 8);
+-
+-              emit->string(etarget, tree->name, tree->basenamelen);
+-              emit->align(etarget, sizeof(cell_t));
+-      }
+-
+-      for_each_child(tree, child) {
+-              flatten_tree(child, emit, etarget, strbuf, vi);
+-      }
+-
+-      emit->endnode(etarget, tree->label);
+-}
+-
+-static struct data flatten_reserve_list(struct reserve_info *reservelist,
+-                               struct version_info *vi)
+-{
+-      struct reserve_info *re;
+-      struct data d = empty_data;
+-      static struct fdt_reserve_entry null_re = {0,0};
+-      int    j;
+-
+-      for (re = reservelist; re; re = re->next) {
+-              d = data_append_re(d, &re->re);
+-      }
+-      /*
+-       * Add additional reserved slots if the user asked for them.
+-       */
+-      for (j = 0; j < reservenum; j++) {
+-              d = data_append_re(d, &null_re);
+-      }
+-
+-      return d;
+-}
+-
+-static void make_fdt_header(struct fdt_header *fdt,
+-                          struct version_info *vi,
+-                          int reservesize, int dtsize, int strsize,
+-                          int boot_cpuid_phys)
+-{
+-      int reserve_off;
+-
+-      reservesize += sizeof(struct fdt_reserve_entry);
+-
+-      memset(fdt, 0xff, sizeof(*fdt));
+-
+-      fdt->magic = cpu_to_fdt32(FDT_MAGIC);
+-      fdt->version = cpu_to_fdt32(vi->version);
+-      fdt->last_comp_version = cpu_to_fdt32(vi->last_comp_version);
+-
+-      /* Reserve map should be doubleword aligned */
+-      reserve_off = ALIGN(vi->hdr_size, 8);
+-
+-      fdt->off_mem_rsvmap = cpu_to_fdt32(reserve_off);
+-      fdt->off_dt_struct = cpu_to_fdt32(reserve_off + reservesize);
+-      fdt->off_dt_strings = cpu_to_fdt32(reserve_off + reservesize
+-                                        + dtsize);
+-      fdt->totalsize = cpu_to_fdt32(reserve_off + reservesize + dtsize + strsize);
+-
+-      if (vi->flags & FTF_BOOTCPUID)
+-              fdt->boot_cpuid_phys = cpu_to_fdt32(boot_cpuid_phys);
+-      if (vi->flags & FTF_STRTABSIZE)
+-              fdt->size_dt_strings = cpu_to_fdt32(strsize);
+-      if (vi->flags & FTF_STRUCTSIZE)
+-              fdt->size_dt_struct = cpu_to_fdt32(dtsize);
+-}
+-
+-void dt_to_blob(FILE *f, struct boot_info *bi, int version)
+-{
+-      struct version_info *vi = NULL;
+-      int i;
+-      struct data blob       = empty_data;
+-      struct data reservebuf = empty_data;
+-      struct data dtbuf      = empty_data;
+-      struct data strbuf     = empty_data;
+-      struct fdt_header fdt;
+-      int padlen = 0;
+-
+-      for (i = 0; i < ARRAY_SIZE(version_table); i++) {
+-              if (version_table[i].version == version)
+-                      vi = &version_table[i];
+-      }
+-      if (!vi)
+-              die("Unknown device tree blob version %d\n", version);
+-
+-      flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
+-      bin_emit_cell(&dtbuf, FDT_END);
+-
+-      reservebuf = flatten_reserve_list(bi->reservelist, vi);
+-
+-      /* Make header */
+-      make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
+-                      bi->boot_cpuid_phys);
+-
+-      /*
+-       * If the user asked for more space than is used, adjust the totalsize.
+-       */
+-      if (minsize > 0) {
+-              padlen = minsize - fdt32_to_cpu(fdt.totalsize);
+-              if ((padlen < 0) && (quiet < 1))
+-                      fprintf(stderr,
+-                              "Warning: blob size %d >= minimum size %d\n",
+-                              fdt32_to_cpu(fdt.totalsize), minsize);
+-      }
+-
+-      if (padsize > 0)
+-              padlen = padsize;
+-
+-      if (padlen > 0) {
+-              int tsize = fdt32_to_cpu(fdt.totalsize);
+-              tsize += padlen;
+-              fdt.totalsize = cpu_to_fdt32(tsize);
+-      }
+-
+-      /*
+-       * Assemble the blob: start with the header, add with alignment
+-       * the reserve buffer, add the reserve map terminating zeroes,
+-       * the device tree itself, and finally the strings.
+-       */
+-      blob = data_append_data(blob, &fdt, vi->hdr_size);
+-      blob = data_append_align(blob, 8);
+-      blob = data_merge(blob, reservebuf);
+-      blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
+-      blob = data_merge(blob, dtbuf);
+-      blob = data_merge(blob, strbuf);
+-
+-      /*
+-       * If the user asked for more space than is used, pad out the blob.
+-       */
+-      if (padlen > 0)
+-              blob = data_append_zeroes(blob, padlen);
+-
+-      fwrite(blob.val, blob.len, 1, f);
+-
+-      if (ferror(f))
+-              die("Error writing device tree blob: %s\n", strerror(errno));
+-
+-      /*
+-       * data_merge() frees the right-hand element so only the blob
+-       * remains to be freed.
+-       */
+-      data_free(blob);
+-}
+-
+-static void dump_stringtable_asm(FILE *f, struct data strbuf)
+-{
+-      const char *p;
+-      int len;
+-
+-      p = strbuf.val;
+-
+-      while (p < (strbuf.val + strbuf.len)) {
+-              len = strlen(p);
+-              fprintf(f, "\t.string \"%s\"\n", p);
+-              p += len+1;
+-      }
+-}
+-
+-void dt_to_asm(FILE *f, struct boot_info *bi, int version)
+-{
+-      struct version_info *vi = NULL;
+-      int i;
+-      struct data strbuf = empty_data;
+-      struct reserve_info *re;
+-      const char *symprefix = "dt";
+-
+-      for (i = 0; i < ARRAY_SIZE(version_table); i++) {
+-              if (version_table[i].version == version)
+-                      vi = &version_table[i];
+-      }
+-      if (!vi)
+-              die("Unknown device tree blob version %d\n", version);
+-
+-      fprintf(f, "/* autogenerated by dtc, do not edit */\n\n");
+-      fprintf(f, "#define FDT_MAGIC 0x%x\n", FDT_MAGIC);
+-      fprintf(f, "#define FDT_BEGIN_NODE 0x%x\n", FDT_BEGIN_NODE);
+-      fprintf(f, "#define FDT_END_NODE 0x%x\n", FDT_END_NODE);
+-      fprintf(f, "#define FDT_PROP 0x%x\n", FDT_PROP);
+-      fprintf(f, "#define FDT_END 0x%x\n", FDT_END);
+-      fprintf(f, "\n");
+-
+-      emit_label(f, symprefix, "blob_start");
+-      emit_label(f, symprefix, "header");
+-      fprintf(f, "\t.long\tFDT_MAGIC\t\t\t\t/* magic */\n");
+-      fprintf(f, "\t.long\t_%s_blob_abs_end - _%s_blob_start\t/* totalsize */\n",
+-              symprefix, symprefix);
+-      fprintf(f, "\t.long\t_%s_struct_start - _%s_blob_start\t/* off_dt_struct */\n",
+-              symprefix, symprefix);
+-      fprintf(f, "\t.long\t_%s_strings_start - _%s_blob_start\t/* off_dt_strings */\n",
+-              symprefix, symprefix);
+-      fprintf(f, "\t.long\t_%s_reserve_map - _%s_blob_start\t/* off_dt_strings */\n",
+-              symprefix, symprefix);
+-      fprintf(f, "\t.long\t%d\t\t\t\t\t/* version */\n", vi->version);
+-      fprintf(f, "\t.long\t%d\t\t\t\t\t/* last_comp_version */\n",
+-              vi->last_comp_version);
+-
+-      if (vi->flags & FTF_BOOTCPUID)
+-              fprintf(f, "\t.long\t%i\t\t\t\t\t/* boot_cpuid_phys */\n",
+-                      bi->boot_cpuid_phys);
+-
+-      if (vi->flags & FTF_STRTABSIZE)
+-              fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n",
+-                      symprefix, symprefix);
+-
+-      if (vi->flags & FTF_STRUCTSIZE)
+-              fprintf(f, "\t.long\t_%s_struct_end - _%s_struct_start\t/* size_dt_struct */\n",
+-                      symprefix, symprefix);
+-
+-      /*
+-       * Reserve map entries.
+-       * Align the reserve map to a doubleword boundary.
+-       * Each entry is an (address, size) pair of u64 values.
+-       * Always supply a zero-sized temination entry.
+-       */
+-      asm_emit_align(f, 8);
+-      emit_label(f, symprefix, "reserve_map");
+-
+-      fprintf(f, "/* Memory reserve map from source file */\n");
+-
+-      /*
+-       * Use .long on high and low halfs of u64s to avoid .quad
+-       * as it appears .quad isn't available in some assemblers.
+-       */
+-      for (re = bi->reservelist; re; re = re->next) {
+-              if (re->label) {
+-                      fprintf(f, "\t.globl\t%s\n", re->label);
+-                      fprintf(f, "%s:\n", re->label);
+-              }
+-              fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
+-                      (unsigned int)(re->re.address >> 32),
+-                      (unsigned int)(re->re.address & 0xffffffff));
+-              fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
+-                      (unsigned int)(re->re.size >> 32),
+-                      (unsigned int)(re->re.size & 0xffffffff));
+-      }
+-      for (i = 0; i < reservenum; i++) {
+-              fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
+-      }
+-
+-      fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
+-
+-      emit_label(f, symprefix, "struct_start");
+-      flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
+-      fprintf(f, "\t.long\tFDT_END\n");
+-      emit_label(f, symprefix, "struct_end");
+-
+-      emit_label(f, symprefix, "strings_start");
+-      dump_stringtable_asm(f, strbuf);
+-      emit_label(f, symprefix, "strings_end");
+-
+-      emit_label(f, symprefix, "blob_end");
+-
+-      /*
+-       * If the user asked for more space than is used, pad it out.
+-       */
+-      if (minsize > 0) {
+-              fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n",
+-                      minsize, symprefix, symprefix);
+-      }
+-      if (padsize > 0) {
+-              fprintf(f, "\t.space\t%d, 0\n", padsize);
+-      }
+-      emit_label(f, symprefix, "blob_abs_end");
+-
+-      data_free(strbuf);
+-}
+-
+-struct inbuf {
+-      char *base, *limit, *ptr;
+-};
+-
+-static void inbuf_init(struct inbuf *inb, void *base, void *limit)
+-{
+-      inb->base = base;
+-      inb->limit = limit;
+-      inb->ptr = inb->base;
+-}
+-
+-static void flat_read_chunk(struct inbuf *inb, void *p, int len)
+-{
+-      if ((inb->ptr + len) > inb->limit)
+-              die("Premature end of data parsing flat device tree\n");
+-
+-      memcpy(p, inb->ptr, len);
+-
+-      inb->ptr += len;
+-}
+-
+-static uint32_t flat_read_word(struct inbuf *inb)
+-{
+-      uint32_t val;
+-
+-      assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
+-
+-      flat_read_chunk(inb, &val, sizeof(val));
+-
+-      return fdt32_to_cpu(val);
+-}
+-
+-static void flat_realign(struct inbuf *inb, int align)
+-{
+-      int off = inb->ptr - inb->base;
+-
+-      inb->ptr = inb->base + ALIGN(off, align);
+-      if (inb->ptr > inb->limit)
+-              die("Premature end of data parsing flat device tree\n");
+-}
+-
+-static char *flat_read_string(struct inbuf *inb)
+-{
+-      int len = 0;
+-      const char *p = inb->ptr;
+-      char *str;
+-
+-      do {
+-              if (p >= inb->limit)
+-                      die("Premature end of data parsing flat device tree\n");
+-              len++;
+-      } while ((*p++) != '\0');
+-
+-      str = strdup(inb->ptr);
+-
+-      inb->ptr += len;
+-
+-      flat_realign(inb, sizeof(uint32_t));
+-
+-      return str;
+-}
+-
+-static struct data flat_read_data(struct inbuf *inb, int len)
+-{
+-      struct data d = empty_data;
+-
+-      if (len == 0)
+-              return empty_data;
+-
+-      d = data_grow_for(d, len);
+-      d.len = len;
+-
+-      flat_read_chunk(inb, d.val, len);
+-
+-      flat_realign(inb, sizeof(uint32_t));
+-
+-      return d;
+-}
+-
+-static char *flat_read_stringtable(struct inbuf *inb, int offset)
+-{
+-      const char *p;
+-
+-      p = inb->base + offset;
+-      while (1) {
+-              if (p >= inb->limit || p < inb->base)
+-                      die("String offset %d overruns string table\n",
+-                          offset);
+-
+-              if (*p == '\0')
+-                      break;
+-
+-              p++;
+-      }
+-
+-      return strdup(inb->base + offset);
+-}
+-
+-static struct property *flat_read_property(struct inbuf *dtbuf,
+-                                         struct inbuf *strbuf, int flags)
+-{
+-      uint32_t proplen, stroff;
+-      char *name;
+-      struct data val;
+-
+-      proplen = flat_read_word(dtbuf);
+-      stroff = flat_read_word(dtbuf);
+-
+-      name = flat_read_stringtable(strbuf, stroff);
+-
+-      if ((flags & FTF_VARALIGN) && (proplen >= 8))
+-              flat_realign(dtbuf, 8);
+-
+-      val = flat_read_data(dtbuf, proplen);
+-
+-      return build_property(name, val, NULL);
+-}
+-
+-
+-static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
+-{
+-      struct reserve_info *reservelist = NULL;
+-      struct reserve_info *new;
+-      const char *p;
+-      struct fdt_reserve_entry re;
+-
+-      /*
+-       * Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
+-       * List terminates at an entry with size equal to zero.
+-       *
+-       * First pass, count entries.
+-       */
+-      p = inb->ptr;
+-      while (1) {
+-              flat_read_chunk(inb, &re, sizeof(re));
+-              re.address  = fdt64_to_cpu(re.address);
+-              re.size = fdt64_to_cpu(re.size);
+-              if (re.size == 0)
+-                      break;
+-
+-              new = build_reserve_entry(re.address, re.size, NULL);
+-              reservelist = add_reserve_entry(reservelist, new);
+-      }
+-
+-      return reservelist;
+-}
+-
+-
+-static char *nodename_from_path(const char *ppath, const char *cpath)
+-{
+-      int plen;
+-
+-      plen = strlen(ppath);
+-
+-      if (!strneq(ppath, cpath, plen))
+-              die("Path \"%s\" is not valid as a child of \"%s\"\n",
+-                  cpath, ppath);
+-
+-      /* root node is a special case */
+-      if (!streq(ppath, "/"))
+-              plen++;
+-
+-      return strdup(cpath + plen);
+-}
+-
+-static struct node *unflatten_tree(struct inbuf *dtbuf,
+-                                 struct inbuf *strbuf,
+-                                 const char *parent_flatname, int flags)
+-{
+-      struct node *node;
+-      char *flatname;
+-      uint32_t val;
+-
+-      node = build_node(NULL, NULL);
+-
+-      flatname = flat_read_string(dtbuf);
+-
+-      if (flags & FTF_FULLPATH)
+-              node->name = nodename_from_path(parent_flatname, flatname);
+-      else
+-              node->name = flatname;
+-
+-      do {
+-              struct property *prop;
+-              struct node *child;
+-
+-              val = flat_read_word(dtbuf);
+-              switch (val) {
+-              case FDT_PROP:
+-                      if (node->children)
+-                              fprintf(stderr, "Warning: Flat tree input has "
+-                                      "subnodes preceding a property.\n");
+-                      prop = flat_read_property(dtbuf, strbuf, flags);
+-                      add_property(node, prop);
+-                      break;
+-
+-              case FDT_BEGIN_NODE:
+-                      child = unflatten_tree(dtbuf,strbuf, flatname, flags);
+-                      add_child(node, child);
+-                      break;
+-
+-              case FDT_END_NODE:
+-                      break;
+-
+-              case FDT_END:
+-                      die("Premature FDT_END in device tree blob\n");
+-                      break;
+-
+-              case FDT_NOP:
+-                      if (!(flags & FTF_NOPS))
+-                              fprintf(stderr, "Warning: NOP tag found in flat tree"
+-                                      " version <16\n");
+-
+-                      /* Ignore */
+-                      break;
+-
+-              default:
+-                      die("Invalid opcode word %08x in device tree blob\n",
+-                          val);
+-              }
+-      } while (val != FDT_END_NODE);
+-
+-      return node;
+-}
+-
+-
+-struct boot_info *dt_from_blob(const char *fname)
+-{
+-      struct dtc_file *dtcf;
+-      uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
+-      uint32_t off_dt, off_str, off_mem_rsvmap;
+-      int rc;
+-      char *blob;
+-      struct fdt_header *fdt;
+-      char *p;
+-      struct inbuf dtbuf, strbuf;
+-      struct inbuf memresvbuf;
+-      int sizeleft;
+-      struct reserve_info *reservelist;
+-      struct node *tree;
+-      uint32_t val;
+-      int flags = 0;
+-
+-      dtcf = dtc_open_file(fname, NULL);
+-
+-      rc = fread(&magic, sizeof(magic), 1, dtcf->file);
+-      if (ferror(dtcf->file))
+-              die("Error reading DT blob magic number: %s\n",
+-                  strerror(errno));
+-      if (rc < 1) {
+-              if (feof(dtcf->file))
+-                      die("EOF reading DT blob magic number\n");
+-              else
+-                      die("Mysterious short read reading magic number\n");
+-      }
+-
+-      magic = fdt32_to_cpu(magic);
+-      if (magic != FDT_MAGIC)
+-              die("Blob has incorrect magic number\n");
+-
+-      rc = fread(&totalsize, sizeof(totalsize), 1, dtcf->file);
+-      if (ferror(dtcf->file))
+-              die("Error reading DT blob size: %s\n", strerror(errno));
+-      if (rc < 1) {
+-              if (feof(dtcf->file))
+-                      die("EOF reading DT blob size\n");
+-              else
+-                      die("Mysterious short read reading blob size\n");
+-      }
+-
+-      totalsize = fdt32_to_cpu(totalsize);
+-      if (totalsize < FDT_V1_SIZE)
+-              die("DT blob size (%d) is too small\n", totalsize);
+-
+-      blob = xmalloc(totalsize);
+-
+-      fdt = (struct fdt_header *)blob;
+-      fdt->magic = cpu_to_fdt32(magic);
+-      fdt->totalsize = cpu_to_fdt32(totalsize);
+-
+-      sizeleft = totalsize - sizeof(magic) - sizeof(totalsize);
+-      p = blob + sizeof(magic)  + sizeof(totalsize);
+-
+-      while (sizeleft) {
+-              if (feof(dtcf->file))
+-                      die("EOF before reading %d bytes of DT blob\n",
+-                          totalsize);
+-
+-              rc = fread(p, 1, sizeleft, dtcf->file);
+-              if (ferror(dtcf->file))
+-                      die("Error reading DT blob: %s\n",
+-                          strerror(errno));
+-
+-              sizeleft -= rc;
+-              p += rc;
+-      }
+-
+-      off_dt = fdt32_to_cpu(fdt->off_dt_struct);
+-      off_str = fdt32_to_cpu(fdt->off_dt_strings);
+-      off_mem_rsvmap = fdt32_to_cpu(fdt->off_mem_rsvmap);
+-      version = fdt32_to_cpu(fdt->version);
+-      boot_cpuid_phys = fdt32_to_cpu(fdt->boot_cpuid_phys);
+-
+-      if (off_mem_rsvmap >= totalsize)
+-              die("Mem Reserve structure offset exceeds total size\n");
+-
+-      if (off_dt >= totalsize)
+-              die("DT structure offset exceeds total size\n");
+-
+-      if (off_str > totalsize)
+-              die("String table offset exceeds total size\n");
+-
+-      if (version >= 3) {
+-              uint32_t size_str = fdt32_to_cpu(fdt->size_dt_strings);
+-              if (off_str+size_str > totalsize)
+-                      die("String table extends past total size\n");
+-              inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
+-      } else {
+-              inbuf_init(&strbuf, blob + off_str, blob + totalsize);
+-      }
+-
+-      if (version >= 17) {
+-              size_dt = fdt32_to_cpu(fdt->size_dt_struct);
+-              if (off_dt+size_dt > totalsize)
+-                      die("Structure block extends past total size\n");
+-      }
+-
+-      if (version < 16) {
+-              flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN;
+-      } else {
+-              flags |= FTF_NOPS;
+-      }
+-
+-      inbuf_init(&memresvbuf,
+-                 blob + off_mem_rsvmap, blob + totalsize);
+-      inbuf_init(&dtbuf, blob + off_dt, blob + totalsize);
+-
+-      reservelist = flat_read_mem_reserve(&memresvbuf);
+-
+-      val = flat_read_word(&dtbuf);
+-
+-      if (val != FDT_BEGIN_NODE)
+-              die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val);
+-
+-      tree = unflatten_tree(&dtbuf, &strbuf, "", flags);
+-
+-      val = flat_read_word(&dtbuf);
+-      if (val != FDT_END)
+-              die("Device tree blob doesn't end with FDT_END\n");
+-
+-      free(blob);
+-
+-      dtc_close_file(dtcf);
+-
+-      return build_boot_info(reservelist, tree, boot_cpuid_phys);
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/fstree.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/fstree.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/fstree.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/fstree.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,92 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-
+-#include <dirent.h>
+-#include <sys/stat.h>
+-
+-static struct node *read_fstree(const char *dirname)
+-{
+-      DIR *d;
+-      struct dirent *de;
+-      struct stat st;
+-      struct node *tree;
+-
+-      d = opendir(dirname);
+-      if (!d)
+-              die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
+-
+-      tree = build_node(NULL, NULL);
+-
+-      while ((de = readdir(d)) != NULL) {
+-              char *tmpnam;
+-
+-              if (streq(de->d_name, ".")
+-                  || streq(de->d_name, ".."))
+-                      continue;
+-
+-              tmpnam = join_path(dirname, de->d_name);
+-
+-              if (lstat(tmpnam, &st) < 0)
+-                      die("stat(%s): %s\n", tmpnam, strerror(errno));
+-
+-              if (S_ISREG(st.st_mode)) {
+-                      struct property *prop;
+-                      FILE *pfile;
+-
+-                      pfile = fopen(tmpnam, "r");
+-                      if (! pfile) {
+-                              fprintf(stderr,
+-                                      "WARNING: Cannot open %s: %s\n",
+-                                      tmpnam, strerror(errno));
+-                      } else {
+-                              prop = build_property(strdup(de->d_name),
+-                                                    data_copy_file(pfile,
+-                                                                   st.st_size),
+-                                                    NULL);
+-                              add_property(tree, prop);
+-                              fclose(pfile);
+-                      }
+-              } else if (S_ISDIR(st.st_mode)) {
+-                      struct node *newchild;
+-
+-                      newchild = read_fstree(tmpnam);
+-                      newchild = name_node(newchild, strdup(de->d_name),
+-                                           NULL);
+-                      add_child(tree, newchild);
+-              }
+-
+-              free(tmpnam);
+-      }
+-
+-      return tree;
+-}
+-
+-struct boot_info *dt_from_fs(const char *dirname)
+-{
+-      struct node *tree;
+-
+-      tree = read_fstree(dirname);
+-      tree = name_node(tree, "", NULL);
+-
+-      return build_boot_info(NULL, tree, 0);
+-}
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/libfdt_env.h linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/libfdt_env.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/libfdt_env.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/libfdt_env.h        1970-01-01 01:00:00.000000000 +0100
+@@ -1,23 +0,0 @@
+-#ifndef _LIBFDT_ENV_H
+-#define _LIBFDT_ENV_H
+-
+-#include <stddef.h>
+-#include <stdint.h>
+-#include <string.h>
+-
+-#define _B(n) ((unsigned long long)((uint8_t *)&x)[n])
+-static inline uint32_t fdt32_to_cpu(uint32_t x)
+-{
+-      return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3);
+-}
+-#define cpu_to_fdt32(x) fdt32_to_cpu(x)
+-
+-static inline uint64_t fdt64_to_cpu(uint64_t x)
+-{
+-      return (_B(0) << 56) | (_B(1) << 48) | (_B(2) << 40) | (_B(3) << 32)
+-              | (_B(4) << 24) | (_B(5) << 16) | (_B(6) << 8) | _B(7);
+-}
+-#define cpu_to_fdt64(x) fdt64_to_cpu(x)
+-#undef _B
+-
+-#endif /* _LIBFDT_ENV_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/livetree.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/livetree.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/livetree.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/livetree.c  1970-01-01 01:00:00.000000000 +0100
+@@ -1,308 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-
+-/*
+- * Tree building functions
+- */
+-
+-struct property *build_property(char *name, struct data val, char *label)
+-{
+-      struct property *new = xmalloc(sizeof(*new));
+-
+-      new->name = name;
+-      new->val = val;
+-
+-      new->next = NULL;
+-
+-      new->label = label;
+-
+-      return new;
+-}
+-
+-struct property *chain_property(struct property *first, struct property *list)
+-{
+-      assert(first->next == NULL);
+-
+-      first->next = list;
+-      return first;
+-}
+-
+-struct property *reverse_properties(struct property *first)
+-{
+-      struct property *p = first;
+-      struct property *head = NULL;
+-      struct property *next;
+-
+-      while (p) {
+-              next = p->next;
+-              p->next = head;
+-              head = p;
+-              p = next;
+-      }
+-      return head;
+-}
+-
+-struct node *build_node(struct property *proplist, struct node *children)
+-{
+-      struct node *new = xmalloc(sizeof(*new));
+-      struct node *child;
+-
+-      memset(new, 0, sizeof(*new));
+-
+-      new->proplist = reverse_properties(proplist);
+-      new->children = children;
+-
+-      for_each_child(new, child) {
+-              child->parent = new;
+-      }
+-
+-      return new;
+-}
+-
+-struct node *name_node(struct node *node, char *name, char * label)
+-{
+-      assert(node->name == NULL);
+-
+-      node->name = name;
+-
+-      node->label = label;
+-
+-      return node;
+-}
+-
+-struct node *chain_node(struct node *first, struct node *list)
+-{
+-      assert(first->next_sibling == NULL);
+-
+-      first->next_sibling = list;
+-      return first;
+-}
+-
+-void add_property(struct node *node, struct property *prop)
+-{
+-      struct property **p;
+-
+-      prop->next = NULL;
+-
+-      p = &node->proplist;
+-      while (*p)
+-              p = &((*p)->next);
+-
+-      *p = prop;
+-}
+-
+-void add_child(struct node *parent, struct node *child)
+-{
+-      struct node **p;
+-
+-      child->next_sibling = NULL;
+-      child->parent = parent;
+-
+-      p = &parent->children;
+-      while (*p)
+-              p = &((*p)->next_sibling);
+-
+-      *p = child;
+-}
+-
+-struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size,
+-                                       char *label)
+-{
+-      struct reserve_info *new = xmalloc(sizeof(*new));
+-
+-      new->re.address = address;
+-      new->re.size = size;
+-
+-      new->next = NULL;
+-
+-      new->label = label;
+-
+-      return new;
+-}
+-
+-struct reserve_info *chain_reserve_entry(struct reserve_info *first,
+-                                      struct reserve_info *list)
+-{
+-      assert(first->next == NULL);
+-
+-      first->next = list;
+-      return first;
+-}
+-
+-struct reserve_info *add_reserve_entry(struct reserve_info *list,
+-                                    struct reserve_info *new)
+-{
+-      struct reserve_info *last;
+-
+-      new->next = NULL;
+-
+-      if (! list)
+-              return new;
+-
+-      for (last = list; last->next; last = last->next)
+-              ;
+-
+-      last->next = new;
+-
+-      return list;
+-}
+-
+-struct boot_info *build_boot_info(struct reserve_info *reservelist,
+-                                struct node *tree, uint32_t boot_cpuid_phys)
+-{
+-      struct boot_info *bi;
+-
+-      bi = xmalloc(sizeof(*bi));
+-      bi->reservelist = reservelist;
+-      bi->dt = tree;
+-      bi->boot_cpuid_phys = boot_cpuid_phys;
+-
+-      return bi;
+-}
+-
+-/*
+- * Tree accessor functions
+- */
+-
+-const char *get_unitname(struct node *node)
+-{
+-      if (node->name[node->basenamelen] == '\0')
+-              return "";
+-      else
+-              return node->name + node->basenamelen + 1;
+-}
+-
+-struct property *get_property(struct node *node, const char *propname)
+-{
+-      struct property *prop;
+-
+-      for_each_property(node, prop)
+-              if (streq(prop->name, propname))
+-                      return prop;
+-
+-      return NULL;
+-}
+-
+-cell_t propval_cell(struct property *prop)
+-{
+-      assert(prop->val.len == sizeof(cell_t));
+-      return fdt32_to_cpu(*((cell_t *)prop->val.val));
+-}
+-
+-struct node *get_subnode(struct node *node, const char *nodename)
+-{
+-      struct node *child;
+-
+-      for_each_child(node, child)
+-              if (streq(child->name, nodename))
+-                      return child;
+-
+-      return NULL;
+-}
+-
+-struct node *get_node_by_path(struct node *tree, const char *path)
+-{
+-      const char *p;
+-      struct node *child;
+-
+-      if (!path || ! (*path))
+-              return tree;
+-
+-      while (path[0] == '/')
+-              path++;
+-
+-      p = strchr(path, '/');
+-
+-      for_each_child(tree, child) {
+-              if (p && strneq(path, child->name, p-path))
+-                      return get_node_by_path(child, p+1);
+-              else if (!p && streq(path, child->name))
+-                      return child;
+-      }
+-
+-      return NULL;
+-}
+-
+-struct node *get_node_by_label(struct node *tree, const char *label)
+-{
+-      struct node *child, *node;
+-
+-      assert(label && (strlen(label) > 0));
+-
+-      if (tree->label && streq(tree->label, label))
+-              return tree;
+-
+-      for_each_child(tree, child) {
+-              node = get_node_by_label(child, label);
+-              if (node)
+-                      return node;
+-      }
+-
+-      return NULL;
+-}
+-
+-struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
+-{
+-      struct node *child, *node;
+-
+-      assert((phandle != 0) && (phandle != -1));
+-
+-      if (tree->phandle == phandle)
+-              return tree;
+-
+-      for_each_child(tree, child) {
+-              node = get_node_by_phandle(child, phandle);
+-              if (node)
+-                      return node;
+-      }
+-
+-      return NULL;
+-}
+-
+-struct node *get_node_by_ref(struct node *tree, const char *ref)
+-{
+-      if (ref[0] == '/')
+-              return get_node_by_path(tree, ref);
+-      else
+-              return get_node_by_label(tree, ref);
+-}
+-
+-cell_t get_node_phandle(struct node *root, struct node *node)
+-{
+-      static cell_t phandle = 1; /* FIXME: ick, static local */
+-
+-      if ((node->phandle != 0) && (node->phandle != -1))
+-              return node->phandle;
+-
+-      assert(! get_property(node, "linux,phandle"));
+-
+-      while (get_node_by_phandle(root, phandle))
+-              phandle++;
+-
+-      node->phandle = phandle;
+-      add_property(node,
+-                   build_property("linux,phandle",
+-                                  data_append_cell(empty_data, phandle),
+-                                  NULL));
+-
+-      return node->phandle;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/Makefile.dtc linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/Makefile.dtc
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/Makefile.dtc    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/Makefile.dtc        1970-01-01 01:00:00.000000000 +0100
+@@ -1,9 +0,0 @@
+-# Makefile.dtc
+-#
+-# This is not a complete Makefile of itself.  Instead, it is designed to
+-# be easily embeddable into other systems of Makefiles.
+-#
+-DTC_SRCS = dtc.c flattree.c fstree.c data.c livetree.c treesource.c srcpos.c \
+-      checks.c
+-DTC_GEN_SRCS = dtc-lexer.lex.c dtc-parser.tab.c
+-DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/srcpos.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/srcpos.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/srcpos.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/srcpos.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,116 +0,0 @@
+-/*
+- * Copyright 2007 Jon Loeliger, Freescale Semiconductor, 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 "dtc.h"
+-#include "srcpos.h"
+-
+-/*
+- * Like yylineno, this is the current open file pos.
+- */
+-
+-struct dtc_file *srcpos_file;
+-
+-static int dtc_open_one(struct dtc_file *file,
+-                        const char *search,
+-                        const char *fname)
+-{
+-      char *fullname;
+-
+-      if (search) {
+-              fullname = xmalloc(strlen(search) + strlen(fname) + 2);
+-
+-              strcpy(fullname, search);
+-              strcat(fullname, "/");
+-              strcat(fullname, fname);
+-      } else {
+-              fullname = strdup(fname);
+-      }
+-
+-      file->file = fopen(fullname, "r");
+-      if (!file->file) {
+-              free(fullname);
+-              return 0;
+-      }
+-
+-      file->name = fullname;
+-      return 1;
+-}
+-
+-
+-struct dtc_file *dtc_open_file(const char *fname,
+-                               const struct search_path *search)
+-{
+-      static const struct search_path default_search = { NULL, NULL, NULL };
+-
+-      struct dtc_file *file;
+-      const char *slash;
+-
+-      file = xmalloc(sizeof(struct dtc_file));
+-
+-      slash = strrchr(fname, '/');
+-      if (slash) {
+-              char *dir = xmalloc(slash - fname + 1);
+-
+-              memcpy(dir, fname, slash - fname);
+-              dir[slash - fname] = 0;
+-              file->dir = dir;
+-      } else {
+-              file->dir = NULL;
+-      }
+-
+-      if (streq(fname, "-")) {
+-              file->name = "stdin";
+-              file->file = stdin;
+-              return file;
+-      }
+-
+-      if (fname[0] == '/') {
+-              file->file = fopen(fname, "r");
+-              if (!file->file)
+-                      goto fail;
+-
+-              file->name = strdup(fname);
+-              return file;
+-      }
+-
+-      if (!search)
+-              search = &default_search;
+-
+-      while (search) {
+-              if (dtc_open_one(file, search->dir, fname))
+-                      return file;
+-
+-              if (errno != ENOENT)
+-                      goto fail;
+-
+-              search = search->next;
+-      }
+-
+-fail:
+-      die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
+-}
+-
+-void dtc_close_file(struct dtc_file *file)
+-{
+-      if (fclose(file->file))
+-              die("Error closing \"%s\": %s\n", file->name, strerror(errno));
+-
+-      free(file->dir);
+-      free(file);
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/srcpos.h linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/srcpos.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/srcpos.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/srcpos.h    1970-01-01 01:00:00.000000000 +0100
+@@ -1,85 +0,0 @@
+-/*
+- * Copyright 2007 Jon Loeliger, Freescale Semiconductor, 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
+- */
+-
+-/*
+- * Augment the standard YYLTYPE with a filenum index into an
+- * array of all opened filenames.
+- */
+-
+-#include <stdio.h>
+-
+-struct dtc_file {
+-      char *dir;
+-      const char *name;
+-      FILE *file;
+-};
+-
+-#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
+-typedef struct YYLTYPE {
+-    int first_line;
+-    int first_column;
+-    int last_line;
+-    int last_column;
+-    struct dtc_file *file;
+-} YYLTYPE;
+-
+-#define YYLTYPE_IS_DECLARED   1
+-#define YYLTYPE_IS_TRIVIAL    1
+-#endif
+-
+-/* Cater to old parser templates. */
+-#ifndef YYID
+-#define YYID(n)       (n)
+-#endif
+-
+-#define YYLLOC_DEFAULT(Current, Rhs, N)                                       \
+-    do                                                                        \
+-      if (YYID (N))                                                   \
+-      {                                                               \
+-        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+-        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+-        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+-        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+-        (Current).file         = YYRHSLOC (Rhs, N).file;              \
+-      }                                                               \
+-      else                                                            \
+-      {                                                               \
+-        (Current).first_line   = (Current).last_line   =              \
+-          YYRHSLOC (Rhs, 0).last_line;                                \
+-        (Current).first_column = (Current).last_column =              \
+-          YYRHSLOC (Rhs, 0).last_column;                              \
+-        (Current).file         = YYRHSLOC (Rhs, 0).file;              \
+-      }                                                               \
+-    while (YYID (0))
+-
+-
+-
+-extern void yyerror(char const *);
+-extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2)));
+-
+-extern struct dtc_file *srcpos_file;
+-
+-struct search_path {
+-      const char *dir; /* NULL for current directory */
+-      struct search_path *prev, *next;
+-};
+-
+-extern struct dtc_file *dtc_open_file(const char *fname,
+-                                      const struct search_path *search);
+-extern void dtc_close_file(struct dtc_file *file);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/treesource.c linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/treesource.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/treesource.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/treesource.c        1970-01-01 01:00:00.000000000 +0100
+@@ -1,278 +0,0 @@
+-/*
+- * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+- *
+- *
+- * 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 "dtc.h"
+-#include "srcpos.h"
+-
+-extern FILE *yyin;
+-extern int yyparse(void);
+-
+-struct boot_info *the_boot_info;
+-int treesource_error;
+-
+-struct boot_info *dt_from_source(const char *fname)
+-{
+-      the_boot_info = NULL;
+-      treesource_error = 0;
+-
+-      srcpos_file = dtc_open_file(fname, NULL);
+-      yyin = srcpos_file->file;
+-
+-      if (yyparse() != 0)
+-              die("Unable to parse input tree\n");
+-
+-      if (treesource_error)
+-              die("Syntax error parsing input tree\n");
+-
+-      return the_boot_info;
+-}
+-
+-static void write_prefix(FILE *f, int level)
+-{
+-      int i;
+-
+-      for (i = 0; i < level; i++)
+-              fputc('\t', f);
+-}
+-
+-int isstring(char c)
+-{
+-      return (isprint(c)
+-              || (c == '\0')
+-              || strchr("\a\b\t\n\v\f\r", c));
+-}
+-
+-static void write_propval_string(FILE *f, struct data val)
+-{
+-      const char *str = val.val;
+-      int i;
+-      int newchunk = 1;
+-      struct marker *m = val.markers;
+-
+-      assert(str[val.len-1] == '\0');
+-
+-      for (i = 0; i < (val.len-1); i++) {
+-              char c = str[i];
+-
+-              if (newchunk) {
+-                      while (m && (m->offset <= i)) {
+-                              if (m->type == LABEL) {
+-                                      assert(m->offset == i);
+-                                      fprintf(f, "%s: ", m->ref);
+-                              }
+-                              m = m->next;
+-                      }
+-                      fprintf(f, "\"");
+-                      newchunk = 0;
+-              }
+-
+-              switch (c) {
+-              case '\a':
+-                      fprintf(f, "\\a");
+-                      break;
+-              case '\b':
+-                      fprintf(f, "\\b");
+-                      break;
+-              case '\t':
+-                      fprintf(f, "\\t");
+-                      break;
+-              case '\n':
+-                      fprintf(f, "\\n");
+-                      break;
+-              case '\v':
+-                      fprintf(f, "\\v");
+-                      break;
+-              case '\f':
+-                      fprintf(f, "\\f");
+-                      break;
+-              case '\r':
+-                      fprintf(f, "\\r");
+-                      break;
+-              case '\\':
+-                      fprintf(f, "\\\\");
+-                      break;
+-              case '\"':
+-                      fprintf(f, "\\\"");
+-                      break;
+-              case '\0':
+-                      fprintf(f, "\", ");
+-                      newchunk = 1;
+-                      break;
+-              default:
+-                      if (isprint(c))
+-                              fprintf(f, "%c", c);
+-                      else
+-                              fprintf(f, "\\x%02hhx", c);
+-              }
+-      }
+-      fprintf(f, "\"");
+-
+-      /* Wrap up any labels at the end of the value */
+-      for_each_marker_of_type(m, LABEL) {
+-              assert (m->offset == val.len);
+-              fprintf(f, " %s:", m->ref);
+-      }
+-}
+-
+-static void write_propval_cells(FILE *f, struct data val)
+-{
+-      void *propend = val.val + val.len;
+-      cell_t *cp = (cell_t *)val.val;
+-      struct marker *m = val.markers;
+-
+-      fprintf(f, "<");
+-      for (;;) {
+-              while (m && (m->offset <= ((char *)cp - val.val))) {
+-                      if (m->type == LABEL) {
+-                              assert(m->offset == ((char *)cp - val.val));
+-                              fprintf(f, "%s: ", m->ref);
+-                      }
+-                      m = m->next;
+-              }
+-
+-              fprintf(f, "0x%x", fdt32_to_cpu(*cp++));
+-              if ((void *)cp >= propend)
+-                      break;
+-              fprintf(f, " ");
+-      }
+-
+-      /* Wrap up any labels at the end of the value */
+-      for_each_marker_of_type(m, LABEL) {
+-              assert (m->offset == val.len);
+-              fprintf(f, " %s:", m->ref);
+-      }
+-      fprintf(f, ">");
+-}
+-
+-static void write_propval_bytes(FILE *f, struct data val)
+-{
+-      void *propend = val.val + val.len;
+-      const char *bp = val.val;
+-      struct marker *m = val.markers;
+-
+-      fprintf(f, "[");
+-      for (;;) {
+-              while (m && (m->offset == (bp-val.val))) {
+-                      if (m->type == LABEL)
+-                              fprintf(f, "%s: ", m->ref);
+-                      m = m->next;
+-              }
+-
+-              fprintf(f, "%02hhx", *bp++);
+-              if ((const void *)bp >= propend)
+-                      break;
+-              fprintf(f, " ");
+-      }
+-
+-      /* Wrap up any labels at the end of the value */
+-      for_each_marker_of_type(m, LABEL) {
+-              assert (m->offset == val.len);
+-              fprintf(f, " %s:", m->ref);
+-      }
+-      fprintf(f, "]");
+-}
+-
+-static void write_propval(FILE *f, struct property *prop)
+-{
+-      int len = prop->val.len;
+-      const char *p = prop->val.val;
+-      struct marker *m = prop->val.markers;
+-      int nnotstring = 0, nnul = 0;
+-      int nnotstringlbl = 0, nnotcelllbl = 0;
+-      int i;
+-
+-      if (len == 0) {
+-              fprintf(f, ";\n");
+-              return;
+-      }
+-
+-      for (i = 0; i < len; i++) {
+-              if (! isstring(p[i]))
+-                      nnotstring++;
+-              if (p[i] == '\0')
+-                      nnul++;
+-      }
+-
+-      for_each_marker_of_type(m, LABEL) {
+-              if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0'))
+-                      nnotstringlbl++;
+-              if ((m->offset % sizeof(cell_t)) != 0)
+-                      nnotcelllbl++;
+-      }
+-
+-      fprintf(f, " = ");
+-      if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))
+-          && (nnotstringlbl == 0)) {
+-              write_propval_string(f, prop->val);
+-      } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
+-              write_propval_cells(f, prop->val);
+-      } else {
+-              write_propval_bytes(f, prop->val);
+-      }
+-
+-      fprintf(f, ";\n");
+-}
+-
+-static void write_tree_source_node(FILE *f, struct node *tree, int level)
+-{
+-      struct property *prop;
+-      struct node *child;
+-
+-      write_prefix(f, level);
+-      if (tree->label)
+-              fprintf(f, "%s: ", tree->label);
+-      if (tree->name && (*tree->name))
+-              fprintf(f, "%s {\n", tree->name);
+-      else
+-              fprintf(f, "/ {\n");
+-
+-      for_each_property(tree, prop) {
+-              write_prefix(f, level+1);
+-              if (prop->label)
+-                      fprintf(f, "%s: ", prop->label);
+-              fprintf(f, "%s", prop->name);
+-              write_propval(f, prop);
+-      }
+-      for_each_child(tree, child) {
+-              fprintf(f, "\n");
+-              write_tree_source_node(f, child, level+1);
+-      }
+-      write_prefix(f, level);
+-      fprintf(f, "};\n");
+-}
+-
+-
+-void dt_to_source(FILE *f, struct boot_info *bi)
+-{
+-      struct reserve_info *re;
+-
+-      fprintf(f, "/dts-v1/;\n\n");
+-
+-      for (re = bi->reservelist; re; re = re->next) {
+-              if (re->label)
+-                      fprintf(f, "%s: ", re->label);
+-              fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
+-                      (unsigned long long)re->re.address,
+-                      (unsigned long long)re->re.size);
+-      }
+-
+-      write_tree_source_node(f, bi->dt, 0);
+-}
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/version_gen.h linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/version_gen.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/dtc-src/version_gen.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/dtc-src/version_gen.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-#define DTC_VERSION "DTC 1.2.0"
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt.c        1970-01-01 01:00:00.000000000 +0100
+@@ -1,201 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-int fdt_check_header(const void *fdt)
+-{
+-      if (fdt_magic(fdt) == FDT_MAGIC) {
+-              /* Complete tree */
+-              if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
+-                      return -FDT_ERR_BADVERSION;
+-              if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
+-                      return -FDT_ERR_BADVERSION;
+-      } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {
+-              /* Unfinished sequential-write blob */
+-              if (fdt_size_dt_struct(fdt) == 0)
+-                      return -FDT_ERR_BADSTATE;
+-      } else {
+-              return -FDT_ERR_BADMAGIC;
+-      }
+-
+-      return 0;
+-}
+-
+-const void *fdt_offset_ptr(const void *fdt, int offset, int len)
+-{
+-      const char *p;
+-
+-      if (fdt_version(fdt) >= 0x11)
+-              if (((offset + len) < offset)
+-                  || ((offset + len) > fdt_size_dt_struct(fdt)))
+-                      return NULL;
+-
+-      p = _fdt_offset_ptr(fdt, offset);
+-
+-      if (p + len < p)
+-              return NULL;
+-      return p;
+-}
+-
+-uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
+-{
+-      const uint32_t *tagp, *lenp;
+-      uint32_t tag;
+-      const char *p;
+-
+-      if (offset % FDT_TAGSIZE)
+-              return -1;
+-
+-      tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
+-      if (! tagp)
+-              return FDT_END; /* premature end */
+-      tag = fdt32_to_cpu(*tagp);
+-      offset += FDT_TAGSIZE;
+-
+-      switch (tag) {
+-      case FDT_BEGIN_NODE:
+-              /* skip name */
+-              do {
+-                      p = fdt_offset_ptr(fdt, offset++, 1);
+-              } while (p && (*p != '\0'));
+-              if (! p)
+-                      return FDT_END;
+-              break;
+-      case FDT_PROP:
+-              lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
+-              if (! lenp)
+-                      return FDT_END;
+-              /* skip name offset, length and value */
+-              offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
+-              break;
+-      }
+-
+-      if (nextoffset)
+-              *nextoffset = FDT_TAGALIGN(offset);
+-
+-      return tag;
+-}
+-
+-int _fdt_check_node_offset(const void *fdt, int offset)
+-{
+-      if ((offset < 0) || (offset % FDT_TAGSIZE)
+-          || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE))
+-              return -FDT_ERR_BADOFFSET;
+-
+-      return offset;
+-}
+-
+-int fdt_next_node(const void *fdt, int offset, int *depth)
+-{
+-      int nextoffset = 0;
+-      uint32_t tag;
+-
+-      if (offset >= 0)
+-              if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
+-                      return nextoffset;
+-
+-      do {
+-              offset = nextoffset;
+-              tag = fdt_next_tag(fdt, offset, &nextoffset);
+-
+-              switch (tag) {
+-              case FDT_PROP:
+-              case FDT_NOP:
+-                      break;
+-
+-              case FDT_BEGIN_NODE:
+-                      if (depth)
+-                              (*depth)++;
+-                      break;
+-
+-              case FDT_END_NODE:
+-                      if (depth)
+-                              (*depth)--;
+-                      break;
+-
+-              case FDT_END:
+-                      return -FDT_ERR_NOTFOUND;
+-
+-              default:
+-                      return -FDT_ERR_BADSTRUCTURE;
+-              }
+-      } while (tag != FDT_BEGIN_NODE);
+-
+-      return offset;
+-}
+-
+-const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
+-{
+-      int len = strlen(s) + 1;
+-      const char *last = strtab + tabsize - len;
+-      const char *p;
+-
+-      for (p = strtab; p <= last; p++)
+-              if (memcmp(p, s, len) == 0)
+-                      return p;
+-      return NULL;
+-}
+-
+-int fdt_move(const void *fdt, void *buf, int bufsize)
+-{
+-      FDT_CHECK_HEADER(fdt);
+-
+-      if (fdt_totalsize(fdt) > bufsize)
+-              return -FDT_ERR_NOSPACE;
+-
+-      memmove(buf, fdt, fdt_totalsize(fdt));
+-      return 0;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt.h linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt.h        1970-01-01 01:00:00.000000000 +0100
+@@ -1,60 +0,0 @@
+-#ifndef _FDT_H
+-#define _FDT_H
+-
+-#ifndef __ASSEMBLY__
+-
+-struct fdt_header {
+-      uint32_t magic;                  /* magic word FDT_MAGIC */
+-      uint32_t totalsize;              /* total size of DT block */
+-      uint32_t off_dt_struct;          /* offset to structure */
+-      uint32_t off_dt_strings;         /* offset to strings */
+-      uint32_t off_mem_rsvmap;         /* offset to memory reserve map */
+-      uint32_t version;                /* format version */
+-      uint32_t last_comp_version;      /* last compatible version */
+-
+-      /* version 2 fields below */
+-      uint32_t boot_cpuid_phys;        /* Which physical CPU id we're
+-                                          booting on */
+-      /* version 3 fields below */
+-      uint32_t size_dt_strings;        /* size of the strings block */
+-
+-      /* version 17 fields below */
+-      uint32_t size_dt_struct;         /* size of the structure block */
+-};
+-
+-struct fdt_reserve_entry {
+-      uint64_t address;
+-      uint64_t size;
+-};
+-
+-struct fdt_node_header {
+-      uint32_t tag;
+-      char name[0];
+-};
+-
+-struct fdt_property {
+-      uint32_t tag;
+-      uint32_t len;
+-      uint32_t nameoff;
+-      char data[0];
+-};
+-
+-#endif /* !__ASSEMBLY */
+-
+-#define FDT_MAGIC     0xd00dfeed      /* 4: version, 4: total size */
+-#define FDT_TAGSIZE   sizeof(uint32_t)
+-
+-#define FDT_BEGIN_NODE        0x1             /* Start node: full name */
+-#define FDT_END_NODE  0x2             /* End node */
+-#define FDT_PROP      0x3             /* Property: name off,
+-                                         size, content */
+-#define FDT_NOP               0x4             /* nop */
+-#define FDT_END               0x9
+-
+-#define FDT_V1_SIZE   (7*sizeof(uint32_t))
+-#define FDT_V2_SIZE   (FDT_V1_SIZE + sizeof(uint32_t))
+-#define FDT_V3_SIZE   (FDT_V2_SIZE + sizeof(uint32_t))
+-#define FDT_V16_SIZE  FDT_V3_SIZE
+-#define FDT_V17_SIZE  (FDT_V16_SIZE + sizeof(uint32_t))
+-
+-#endif /* _FDT_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_ro.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_ro.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_ro.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_ro.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,469 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-static int _fdt_nodename_eq(const void *fdt, int offset,
+-                          const char *s, int len)
+-{
+-      const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1);
+-
+-      if (! p)
+-              /* short match */
+-              return 0;
+-
+-      if (memcmp(p, s, len) != 0)
+-              return 0;
+-
+-      if (p[len] == '\0')
+-              return 1;
+-      else if (!memchr(s, '@', len) && (p[len] == '@'))
+-              return 1;
+-      else
+-              return 0;
+-}
+-
+-const char *fdt_string(const void *fdt, int stroffset)
+-{
+-      return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
+-}
+-
+-int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
+-{
+-      FDT_CHECK_HEADER(fdt);
+-      *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address);
+-      *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size);
+-      return 0;
+-}
+-
+-int fdt_num_mem_rsv(const void *fdt)
+-{
+-      int i = 0;
+-
+-      while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
+-              i++;
+-      return i;
+-}
+-
+-int fdt_subnode_offset_namelen(const void *fdt, int offset,
+-                             const char *name, int namelen)
+-{
+-      int depth;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      for (depth = 0, offset = fdt_next_node(fdt, offset, &depth);
+-           (offset >= 0) && (depth > 0);
+-           offset = fdt_next_node(fdt, offset, &depth)) {
+-              if (depth < 0)
+-                      return -FDT_ERR_NOTFOUND;
+-              else if ((depth == 1)
+-                       && _fdt_nodename_eq(fdt, offset, name, namelen))
+-                      return offset;
+-      }
+-
+-      if (offset < 0)
+-              return offset; /* error */
+-      else
+-              return -FDT_ERR_NOTFOUND;
+-}
+-
+-int fdt_subnode_offset(const void *fdt, int parentoffset,
+-                     const char *name)
+-{
+-      return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
+-}
+-
+-int fdt_path_offset(const void *fdt, const char *path)
+-{
+-      const char *end = path + strlen(path);
+-      const char *p = path;
+-      int offset = 0;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      if (*path != '/')
+-              return -FDT_ERR_BADPATH;
+-
+-      while (*p) {
+-              const char *q;
+-
+-              while (*p == '/')
+-                      p++;
+-              if (! *p)
+-                      return offset;
+-              q = strchr(p, '/');
+-              if (! q)
+-                      q = end;
+-
+-              offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
+-              if (offset < 0)
+-                      return offset;
+-
+-              p = q;
+-      }
+-
+-      return offset;
+-}
+-
+-const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
+-{
+-      const struct fdt_node_header *nh = _fdt_offset_ptr(fdt, nodeoffset);
+-      int err;
+-
+-      if (((err = fdt_check_header(fdt)) != 0)
+-          || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0))
+-                      goto fail;
+-
+-      if (len)
+-              *len = strlen(nh->name);
+-
+-      return nh->name;
+-
+- fail:
+-      if (len)
+-              *len = err;
+-      return NULL;
+-}
+-
+-const struct fdt_property *fdt_get_property(const void *fdt,
+-                                          int nodeoffset,
+-                                          const char *name, int *lenp)
+-{
+-      uint32_t tag;
+-      const struct fdt_property *prop;
+-      int namestroff;
+-      int offset, nextoffset;
+-      int err;
+-
+-      if (((err = fdt_check_header(fdt)) != 0)
+-          || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0))
+-                      goto fail;
+-
+-      nextoffset = err;
+-      do {
+-              offset = nextoffset;
+-
+-              tag = fdt_next_tag(fdt, offset, &nextoffset);
+-              switch (tag) {
+-              case FDT_END:
+-                      err = -FDT_ERR_TRUNCATED;
+-                      goto fail;
+-
+-              case FDT_BEGIN_NODE:
+-              case FDT_END_NODE:
+-              case FDT_NOP:
+-                      break;
+-
+-              case FDT_PROP:
+-                      err = -FDT_ERR_BADSTRUCTURE;
+-                      prop = fdt_offset_ptr(fdt, offset, sizeof(*prop));
+-                      if (! prop)
+-                              goto fail;
+-                      namestroff = fdt32_to_cpu(prop->nameoff);
+-                      if (strcmp(fdt_string(fdt, namestroff), name) == 0) {
+-                              /* Found it! */
+-                              int len = fdt32_to_cpu(prop->len);
+-                              prop = fdt_offset_ptr(fdt, offset,
+-                                                    sizeof(*prop)+len);
+-                              if (! prop)
+-                                      goto fail;
+-
+-                              if (lenp)
+-                                      *lenp = len;
+-
+-                              return prop;
+-                      }
+-                      break;
+-
+-              default:
+-                      err = -FDT_ERR_BADSTRUCTURE;
+-                      goto fail;
+-              }
+-      } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE));
+-
+-      err = -FDT_ERR_NOTFOUND;
+- fail:
+-      if (lenp)
+-              *lenp = err;
+-      return NULL;
+-}
+-
+-const void *fdt_getprop(const void *fdt, int nodeoffset,
+-                const char *name, int *lenp)
+-{
+-      const struct fdt_property *prop;
+-
+-      prop = fdt_get_property(fdt, nodeoffset, name, lenp);
+-      if (! prop)
+-              return NULL;
+-
+-      return prop->data;
+-}
+-
+-uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
+-{
+-      const uint32_t *php;
+-      int len;
+-
+-      php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
+-      if (!php || (len != sizeof(*php)))
+-              return 0;
+-
+-      return fdt32_to_cpu(*php);
+-}
+-
+-int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
+-{
+-      int pdepth = 0, p = 0;
+-      int offset, depth, namelen;
+-      const char *name;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      if (buflen < 2)
+-              return -FDT_ERR_NOSPACE;
+-
+-      for (offset = 0, depth = 0;
+-           (offset >= 0) && (offset <= nodeoffset);
+-           offset = fdt_next_node(fdt, offset, &depth)) {
+-              if (pdepth < depth)
+-                      continue; /* overflowed buffer */
+-
+-              while (pdepth > depth) {
+-                      do {
+-                              p--;
+-                      } while (buf[p-1] != '/');
+-                      pdepth--;
+-              }
+-
+-              name = fdt_get_name(fdt, offset, &namelen);
+-              if (!name)
+-                      return namelen;
+-              if ((p + namelen + 1) <= buflen) {
+-                      memcpy(buf + p, name, namelen);
+-                      p += namelen;
+-                      buf[p++] = '/';
+-                      pdepth++;
+-              }
+-
+-              if (offset == nodeoffset) {
+-                      if (pdepth < (depth + 1))
+-                              return -FDT_ERR_NOSPACE;
+-
+-                      if (p > 1) /* special case so that root path is "/", not "" */
+-                              p--;
+-                      buf[p] = '\0';
+-                      return p;
+-              }
+-      }
+-
+-      if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
+-              return -FDT_ERR_BADOFFSET;
+-      else if (offset == -FDT_ERR_BADOFFSET)
+-              return -FDT_ERR_BADSTRUCTURE;
+-
+-      return offset; /* error from fdt_next_node() */
+-}
+-
+-int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
+-                               int supernodedepth, int *nodedepth)
+-{
+-      int offset, depth;
+-      int supernodeoffset = -FDT_ERR_INTERNAL;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      if (supernodedepth < 0)
+-              return -FDT_ERR_NOTFOUND;
+-
+-      for (offset = 0, depth = 0;
+-           (offset >= 0) && (offset <= nodeoffset);
+-           offset = fdt_next_node(fdt, offset, &depth)) {
+-              if (depth == supernodedepth)
+-                      supernodeoffset = offset;
+-
+-              if (offset == nodeoffset) {
+-                      if (nodedepth)
+-                              *nodedepth = depth;
+-
+-                      if (supernodedepth > depth)
+-                              return -FDT_ERR_NOTFOUND;
+-                      else
+-                              return supernodeoffset;
+-              }
+-      }
+-
+-      if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
+-              return -FDT_ERR_BADOFFSET;
+-      else if (offset == -FDT_ERR_BADOFFSET)
+-              return -FDT_ERR_BADSTRUCTURE;
+-
+-      return offset; /* error from fdt_next_node() */
+-}
+-
+-int fdt_node_depth(const void *fdt, int nodeoffset)
+-{
+-      int nodedepth;
+-      int err;
+-
+-      err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth);
+-      if (err)
+-              return (err < 0) ? err : -FDT_ERR_INTERNAL;
+-      return nodedepth;
+-}
+-
+-int fdt_parent_offset(const void *fdt, int nodeoffset)
+-{
+-      int nodedepth = fdt_node_depth(fdt, nodeoffset);
+-
+-      if (nodedepth < 0)
+-              return nodedepth;
+-      return fdt_supernode_atdepth_offset(fdt, nodeoffset,
+-                                          nodedepth - 1, NULL);
+-}
+-
+-int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
+-                                const char *propname,
+-                                const void *propval, int proplen)
+-{
+-      int offset;
+-      const void *val;
+-      int len;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      /* FIXME: The algorithm here is pretty horrible: we scan each
+-       * property of a node in fdt_getprop(), then if that didn't
+-       * find what we want, we scan over them again making our way
+-       * to the next node.  Still it's the easiest to implement
+-       * approach; performance can come later. */
+-      for (offset = fdt_next_node(fdt, startoffset, NULL);
+-           offset >= 0;
+-           offset = fdt_next_node(fdt, offset, NULL)) {
+-              val = fdt_getprop(fdt, offset, propname, &len);
+-              if (val && (len == proplen)
+-                  && (memcmp(val, propval, len) == 0))
+-                      return offset;
+-      }
+-
+-      return offset; /* error from fdt_next_node() */
+-}
+-
+-int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
+-{
+-      if ((phandle == 0) || (phandle == -1))
+-              return -FDT_ERR_BADPHANDLE;
+-      phandle = cpu_to_fdt32(phandle);
+-      return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
+-                                           &phandle, sizeof(phandle));
+-}
+-
+-int _stringlist_contains(const char *strlist, int listlen, const char *str)
+-{
+-      int len = strlen(str);
+-      const char *p;
+-
+-      while (listlen >= len) {
+-              if (memcmp(str, strlist, len+1) == 0)
+-                      return 1;
+-              p = memchr(strlist, '\0', listlen);
+-              if (!p)
+-                      return 0; /* malformed strlist.. */
+-              listlen -= (p-strlist) + 1;
+-              strlist = p + 1;
+-      }
+-      return 0;
+-}
+-
+-int fdt_node_check_compatible(const void *fdt, int nodeoffset,
+-                            const char *compatible)
+-{
+-      const void *prop;
+-      int len;
+-
+-      prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
+-      if (!prop)
+-              return len;
+-      if (_stringlist_contains(prop, len, compatible))
+-              return 0;
+-      else
+-              return 1;
+-}
+-
+-int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
+-                                const char *compatible)
+-{
+-      int offset, err;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      /* FIXME: The algorithm here is pretty horrible: we scan each
+-       * property of a node in fdt_node_check_compatible(), then if
+-       * that didn't find what we want, we scan over them again
+-       * making our way to the next node.  Still it's the easiest to
+-       * implement approach; performance can come later. */
+-      for (offset = fdt_next_node(fdt, startoffset, NULL);
+-           offset >= 0;
+-           offset = fdt_next_node(fdt, offset, NULL)) {
+-              err = fdt_node_check_compatible(fdt, offset, compatible);
+-              if ((err < 0) && (err != -FDT_ERR_NOTFOUND))
+-                      return err;
+-              else if (err == 0)
+-                      return offset;
+-      }
+-
+-      return offset; /* error from fdt_next_node() */
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_rw.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_rw.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_rw.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_rw.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,463 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-static int _fdt_blocks_misordered(const void *fdt,
+-                            int mem_rsv_size, int struct_size)
+-{
+-      return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8))
+-              || (fdt_off_dt_struct(fdt) <
+-                  (fdt_off_mem_rsvmap(fdt) + mem_rsv_size))
+-              || (fdt_off_dt_strings(fdt) <
+-                  (fdt_off_dt_struct(fdt) + struct_size))
+-              || (fdt_totalsize(fdt) <
+-                  (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
+-}
+-
+-static int _fdt_rw_check_header(void *fdt)
+-{
+-      FDT_CHECK_HEADER(fdt);
+-
+-      if (fdt_version(fdt) < 17)
+-              return -FDT_ERR_BADVERSION;
+-      if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
+-                                 fdt_size_dt_struct(fdt)))
+-              return -FDT_ERR_BADLAYOUT;
+-      if (fdt_version(fdt) > 17)
+-              fdt_set_version(fdt, 17);
+-
+-      return 0;
+-}
+-
+-#define FDT_RW_CHECK_HEADER(fdt) \
+-      { \
+-              int err; \
+-              if ((err = _fdt_rw_check_header(fdt)) != 0) \
+-                      return err; \
+-      }
+-
+-static inline int _fdt_data_size(void *fdt)
+-{
+-      return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+-}
+-
+-static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen)
+-{
+-      char *p = splicepoint;
+-      char *end = (char *)fdt + _fdt_data_size(fdt);
+-
+-      if (((p + oldlen) < p) || ((p + oldlen) > end))
+-              return -FDT_ERR_BADOFFSET;
+-      if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
+-              return -FDT_ERR_NOSPACE;
+-      memmove(p + newlen, p + oldlen, end - p - oldlen);
+-      return 0;
+-}
+-
+-static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
+-                             int oldn, int newn)
+-{
+-      int delta = (newn - oldn) * sizeof(*p);
+-      int err;
+-      err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
+-      if (err)
+-              return err;
+-      fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
+-      fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
+-      return 0;
+-}
+-
+-static int _fdt_splice_struct(void *fdt, void *p,
+-                            int oldlen, int newlen)
+-{
+-      int delta = newlen - oldlen;
+-      int err;
+-
+-      if ((err = _fdt_splice(fdt, p, oldlen, newlen)))
+-              return err;
+-
+-      fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
+-      fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
+-      return 0;
+-}
+-
+-static int _fdt_splice_string(void *fdt, int newlen)
+-{
+-      void *p = (char *)fdt
+-              + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+-      int err;
+-
+-      if ((err = _fdt_splice(fdt, p, 0, newlen)))
+-              return err;
+-
+-      fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
+-      return 0;
+-}
+-
+-static int _fdt_find_add_string(void *fdt, const char *s)
+-{
+-      char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
+-      const char *p;
+-      char *new;
+-      int len = strlen(s) + 1;
+-      int err;
+-
+-      p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
+-      if (p)
+-              /* found it */
+-              return (p - strtab);
+-
+-      new = strtab + fdt_size_dt_strings(fdt);
+-      err = _fdt_splice_string(fdt, len);
+-      if (err)
+-              return err;
+-
+-      memcpy(new, s, len);
+-      return (new - strtab);
+-}
+-
+-int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
+-{
+-      struct fdt_reserve_entry *re;
+-      int err;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
+-      err = _fdt_splice_mem_rsv(fdt, re, 0, 1);
+-      if (err)
+-              return err;
+-
+-      re->address = cpu_to_fdt64(address);
+-      re->size = cpu_to_fdt64(size);
+-      return 0;
+-}
+-
+-int fdt_del_mem_rsv(void *fdt, int n)
+-{
+-      struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
+-      int err;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      if (n >= fdt_num_mem_rsv(fdt))
+-              return -FDT_ERR_NOTFOUND;
+-
+-      err = _fdt_splice_mem_rsv(fdt, re, 1, 0);
+-      if (err)
+-              return err;
+-      return 0;
+-}
+-
+-static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,
+-                              int len, struct fdt_property **prop)
+-{
+-      int oldlen;
+-      int err;
+-
+-      *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
+-      if (! (*prop))
+-              return oldlen;
+-
+-      if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),
+-                                    FDT_TAGALIGN(len))))
+-              return err;
+-
+-      (*prop)->len = cpu_to_fdt32(len);
+-      return 0;
+-}
+-
+-static int _fdt_add_property(void *fdt, int nodeoffset, const char *name,
+-                           int len, struct fdt_property **prop)
+-{
+-      int proplen;
+-      int nextoffset;
+-      int namestroff;
+-      int err;
+-
+-      if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
+-              return nextoffset;
+-
+-      namestroff = _fdt_find_add_string(fdt, name);
+-      if (namestroff < 0)
+-              return namestroff;
+-
+-      *prop = _fdt_offset_ptr_w(fdt, nextoffset);
+-      proplen = sizeof(**prop) + FDT_TAGALIGN(len);
+-
+-      err = _fdt_splice_struct(fdt, *prop, 0, proplen);
+-      if (err)
+-              return err;
+-
+-      (*prop)->tag = cpu_to_fdt32(FDT_PROP);
+-      (*prop)->nameoff = cpu_to_fdt32(namestroff);
+-      (*prop)->len = cpu_to_fdt32(len);
+-      return 0;
+-}
+-
+-int fdt_set_name(void *fdt, int nodeoffset, const char *name)
+-{
+-      char *namep;
+-      int oldlen, newlen;
+-      int err;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen);
+-      if (!namep)
+-              return oldlen;
+-
+-      newlen = strlen(name);
+-
+-      err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1),
+-                               FDT_TAGALIGN(newlen+1));
+-      if (err)
+-              return err;
+-
+-      memcpy(namep, name, newlen+1);
+-      return 0;
+-}
+-
+-int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+-              const void *val, int len)
+-{
+-      struct fdt_property *prop;
+-      int err;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop);
+-      if (err == -FDT_ERR_NOTFOUND)
+-              err = _fdt_add_property(fdt, nodeoffset, name, len, &prop);
+-      if (err)
+-              return err;
+-
+-      memcpy(prop->data, val, len);
+-      return 0;
+-}
+-
+-int fdt_delprop(void *fdt, int nodeoffset, const char *name)
+-{
+-      struct fdt_property *prop;
+-      int len, proplen;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
+-      if (! prop)
+-              return len;
+-
+-      proplen = sizeof(*prop) + FDT_TAGALIGN(len);
+-      return _fdt_splice_struct(fdt, prop, proplen, 0);
+-}
+-
+-int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+-                          const char *name, int namelen)
+-{
+-      struct fdt_node_header *nh;
+-      int offset, nextoffset;
+-      int nodelen;
+-      int err;
+-      uint32_t tag;
+-      uint32_t *endtag;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
+-      if (offset >= 0)
+-              return -FDT_ERR_EXISTS;
+-      else if (offset != -FDT_ERR_NOTFOUND)
+-              return offset;
+-
+-      /* Try to place the new node after the parent's properties */
+-      fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
+-      do {
+-              offset = nextoffset;
+-              tag = fdt_next_tag(fdt, offset, &nextoffset);
+-      } while ((tag == FDT_PROP) || (tag == FDT_NOP));
+-
+-      nh = _fdt_offset_ptr_w(fdt, offset);
+-      nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE;
+-
+-      err = _fdt_splice_struct(fdt, nh, 0, nodelen);
+-      if (err)
+-              return err;
+-
+-      nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+-      memset(nh->name, 0, FDT_TAGALIGN(namelen+1));
+-      memcpy(nh->name, name, namelen);
+-      endtag = (uint32_t *)((char *)nh + nodelen - FDT_TAGSIZE);
+-      *endtag = cpu_to_fdt32(FDT_END_NODE);
+-
+-      return offset;
+-}
+-
+-int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
+-{
+-      return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
+-}
+-
+-int fdt_del_node(void *fdt, int nodeoffset)
+-{
+-      int endoffset;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+-      if (endoffset < 0)
+-              return endoffset;
+-
+-      return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
+-                                endoffset - nodeoffset, 0);
+-}
+-
+-static void _fdt_packblocks(const char *old, char *new,
+-                          int mem_rsv_size, int struct_size)
+-{
+-      int mem_rsv_off, struct_off, strings_off;
+-
+-      mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8);
+-      struct_off = mem_rsv_off + mem_rsv_size;
+-      strings_off = struct_off + struct_size;
+-
+-      memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size);
+-      fdt_set_off_mem_rsvmap(new, mem_rsv_off);
+-
+-      memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size);
+-      fdt_set_off_dt_struct(new, struct_off);
+-      fdt_set_size_dt_struct(new, struct_size);
+-
+-      memmove(new + strings_off, old + fdt_off_dt_strings(old),
+-              fdt_size_dt_strings(old));
+-      fdt_set_off_dt_strings(new, strings_off);
+-      fdt_set_size_dt_strings(new, fdt_size_dt_strings(old));
+-}
+-
+-int fdt_open_into(const void *fdt, void *buf, int bufsize)
+-{
+-      int err;
+-      int mem_rsv_size, struct_size;
+-      int newsize;
+-      const char *fdtstart = fdt;
+-      const char *fdtend = fdtstart + fdt_totalsize(fdt);
+-      char *tmp;
+-
+-      FDT_CHECK_HEADER(fdt);
+-
+-      mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
+-              * sizeof(struct fdt_reserve_entry);
+-
+-      if (fdt_version(fdt) >= 17) {
+-              struct_size = fdt_size_dt_struct(fdt);
+-      } else {
+-              struct_size = 0;
+-              while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
+-                      ;
+-      }
+-
+-      if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
+-              /* no further work necessary */
+-              err = fdt_move(fdt, buf, bufsize);
+-              if (err)
+-                      return err;
+-              fdt_set_version(buf, 17);
+-              fdt_set_size_dt_struct(buf, struct_size);
+-              fdt_set_totalsize(buf, bufsize);
+-              return 0;
+-      }
+-
+-      /* Need to reorder */
+-      newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
+-              + struct_size + fdt_size_dt_strings(fdt);
+-
+-      if (bufsize < newsize)
+-              return -FDT_ERR_NOSPACE;
+-
+-      /* First attempt to build converted tree at beginning of buffer */
+-      tmp = buf;
+-      /* But if that overlaps with the old tree... */
+-      if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
+-              /* Try right after the old tree instead */
+-              tmp = (char *)(uintptr_t)fdtend;
+-              if ((tmp + newsize) > ((char *)buf + bufsize))
+-                      return -FDT_ERR_NOSPACE;
+-      }
+-
+-      _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size);
+-      memmove(buf, tmp, newsize);
+-
+-      fdt_set_magic(buf, FDT_MAGIC);
+-      fdt_set_totalsize(buf, bufsize);
+-      fdt_set_version(buf, 17);
+-      fdt_set_last_comp_version(buf, 16);
+-      fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
+-
+-      return 0;
+-}
+-
+-int fdt_pack(void *fdt)
+-{
+-      int mem_rsv_size;
+-
+-      FDT_RW_CHECK_HEADER(fdt);
+-
+-      mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
+-              * sizeof(struct fdt_reserve_entry);
+-      _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
+-      fdt_set_totalsize(fdt, _fdt_data_size(fdt));
+-
+-      return 0;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_strerror.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_strerror.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_strerror.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_strerror.c       1970-01-01 01:00:00.000000000 +0100
+@@ -1,96 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-struct fdt_errtabent {
+-      const char *str;
+-};
+-
+-#define FDT_ERRTABENT(val) \
+-      [(val)] = { .str = #val, }
+-
+-static struct fdt_errtabent fdt_errtable[] = {
+-      FDT_ERRTABENT(FDT_ERR_NOTFOUND),
+-      FDT_ERRTABENT(FDT_ERR_EXISTS),
+-      FDT_ERRTABENT(FDT_ERR_NOSPACE),
+-
+-      FDT_ERRTABENT(FDT_ERR_BADOFFSET),
+-      FDT_ERRTABENT(FDT_ERR_BADPATH),
+-      FDT_ERRTABENT(FDT_ERR_BADSTATE),
+-
+-      FDT_ERRTABENT(FDT_ERR_TRUNCATED),
+-      FDT_ERRTABENT(FDT_ERR_BADMAGIC),
+-      FDT_ERRTABENT(FDT_ERR_BADVERSION),
+-      FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE),
+-      FDT_ERRTABENT(FDT_ERR_BADLAYOUT),
+-};
+-#define FDT_ERRTABSIZE        (sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))
+-
+-const char *fdt_strerror(int errval)
+-{
+-      if (errval > 0)
+-              return "<valid offset/length>";
+-      else if (errval == 0)
+-              return "<no error>";
+-      else if (errval > -FDT_ERRTABSIZE) {
+-              const char *s = fdt_errtable[-errval].str;
+-
+-              if (s)
+-                      return s;
+-      }
+-
+-      return "<unknown error>";
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_sw.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_sw.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_sw.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_sw.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,257 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-static int _fdt_sw_check_header(void *fdt)
+-{
+-      if (fdt_magic(fdt) != FDT_SW_MAGIC)
+-              return -FDT_ERR_BADMAGIC;
+-      /* FIXME: should check more details about the header state */
+-      return 0;
+-}
+-
+-#define FDT_SW_CHECK_HEADER(fdt) \
+-      { \
+-              int err; \
+-              if ((err = _fdt_sw_check_header(fdt)) != 0) \
+-                      return err; \
+-      }
+-
+-static void *_fdt_grab_space(void *fdt, int len)
+-{
+-      int offset = fdt_size_dt_struct(fdt);
+-      int spaceleft;
+-
+-      spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
+-              - fdt_size_dt_strings(fdt);
+-
+-      if ((offset + len < offset) || (offset + len > spaceleft))
+-              return NULL;
+-
+-      fdt_set_size_dt_struct(fdt, offset + len);
+-      return fdt_offset_ptr_w(fdt, offset, len);
+-}
+-
+-int fdt_create(void *buf, int bufsize)
+-{
+-      void *fdt = buf;
+-
+-      if (bufsize < sizeof(struct fdt_header))
+-              return -FDT_ERR_NOSPACE;
+-
+-      memset(buf, 0, bufsize);
+-
+-      fdt_set_magic(fdt, FDT_SW_MAGIC);
+-      fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
+-      fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
+-      fdt_set_totalsize(fdt,  bufsize);
+-
+-      fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header),
+-                                            sizeof(struct fdt_reserve_entry)));
+-      fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
+-      fdt_set_off_dt_strings(fdt, bufsize);
+-
+-      return 0;
+-}
+-
+-int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
+-{
+-      struct fdt_reserve_entry *re;
+-      int offset;
+-
+-      FDT_SW_CHECK_HEADER(fdt);
+-
+-      if (fdt_size_dt_struct(fdt))
+-              return -FDT_ERR_BADSTATE;
+-
+-      offset = fdt_off_dt_struct(fdt);
+-      if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
+-              return -FDT_ERR_NOSPACE;
+-
+-      re = (struct fdt_reserve_entry *)((char *)fdt + offset);
+-      re->address = cpu_to_fdt64(addr);
+-      re->size = cpu_to_fdt64(size);
+-
+-      fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
+-
+-      return 0;
+-}
+-
+-int fdt_finish_reservemap(void *fdt)
+-{
+-      return fdt_add_reservemap_entry(fdt, 0, 0);
+-}
+-
+-int fdt_begin_node(void *fdt, const char *name)
+-{
+-      struct fdt_node_header *nh;
+-      int namelen = strlen(name) + 1;
+-
+-      FDT_SW_CHECK_HEADER(fdt);
+-
+-      nh = _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
+-      if (! nh)
+-              return -FDT_ERR_NOSPACE;
+-
+-      nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+-      memcpy(nh->name, name, namelen);
+-      return 0;
+-}
+-
+-int fdt_end_node(void *fdt)
+-{
+-      uint32_t *en;
+-
+-      FDT_SW_CHECK_HEADER(fdt);
+-
+-      en = _fdt_grab_space(fdt, FDT_TAGSIZE);
+-      if (! en)
+-              return -FDT_ERR_NOSPACE;
+-
+-      *en = cpu_to_fdt32(FDT_END_NODE);
+-      return 0;
+-}
+-
+-static int _fdt_find_add_string(void *fdt, const char *s)
+-{
+-      char *strtab = (char *)fdt + fdt_totalsize(fdt);
+-      const char *p;
+-      int strtabsize = fdt_size_dt_strings(fdt);
+-      int len = strlen(s) + 1;
+-      int struct_top, offset;
+-
+-      p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
+-      if (p)
+-              return p - strtab;
+-
+-      /* Add it */
+-      offset = -strtabsize - len;
+-      struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+-      if (fdt_totalsize(fdt) + offset < struct_top)
+-              return 0; /* no more room :( */
+-
+-      memcpy(strtab + offset, s, len);
+-      fdt_set_size_dt_strings(fdt, strtabsize + len);
+-      return offset;
+-}
+-
+-int fdt_property(void *fdt, const char *name, const void *val, int len)
+-{
+-      struct fdt_property *prop;
+-      int nameoff;
+-
+-      FDT_SW_CHECK_HEADER(fdt);
+-
+-      nameoff = _fdt_find_add_string(fdt, name);
+-      if (nameoff == 0)
+-              return -FDT_ERR_NOSPACE;
+-
+-      prop = _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len));
+-      if (! prop)
+-              return -FDT_ERR_NOSPACE;
+-
+-      prop->tag = cpu_to_fdt32(FDT_PROP);
+-      prop->nameoff = cpu_to_fdt32(nameoff);
+-      prop->len = cpu_to_fdt32(len);
+-      memcpy(prop->data, val, len);
+-      return 0;
+-}
+-
+-int fdt_finish(void *fdt)
+-{
+-      char *p = (char *)fdt;
+-      uint32_t *end;
+-      int oldstroffset, newstroffset;
+-      uint32_t tag;
+-      int offset, nextoffset;
+-
+-      FDT_SW_CHECK_HEADER(fdt);
+-
+-      /* Add terminator */
+-      end = _fdt_grab_space(fdt, sizeof(*end));
+-      if (! end)
+-              return -FDT_ERR_NOSPACE;
+-      *end = cpu_to_fdt32(FDT_END);
+-
+-      /* Relocate the string table */
+-      oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
+-      newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+-      memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
+-      fdt_set_off_dt_strings(fdt, newstroffset);
+-
+-      /* Walk the structure, correcting string offsets */
+-      offset = 0;
+-      while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
+-              if (tag == FDT_PROP) {
+-                      struct fdt_property *prop =
+-                              fdt_offset_ptr_w(fdt, offset, sizeof(*prop));
+-                      int nameoff;
+-
+-                      if (! prop)
+-                              return -FDT_ERR_BADSTRUCTURE;
+-
+-                      nameoff = fdt32_to_cpu(prop->nameoff);
+-                      nameoff += fdt_size_dt_strings(fdt);
+-                      prop->nameoff = cpu_to_fdt32(nameoff);
+-              }
+-              offset = nextoffset;
+-      }
+-
+-      /* Finally, adjust the header */
+-      fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
+-      fdt_set_magic(fdt, FDT_MAGIC);
+-      return 0;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_wip.c linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_wip.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/fdt_wip.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/fdt_wip.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,145 +0,0 @@
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include "libfdt_env.h"
+-
+-#include <fdt.h>
+-#include <libfdt.h>
+-
+-#include "libfdt_internal.h"
+-
+-int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+-                      const void *val, int len)
+-{
+-      void *propval;
+-      int proplen;
+-
+-      propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
+-      if (! propval)
+-              return proplen;
+-
+-      if (proplen != len)
+-              return -FDT_ERR_NOSPACE;
+-
+-      memcpy(propval, val, len);
+-      return 0;
+-}
+-
+-static void _fdt_nop_region(void *start, int len)
+-{
+-      uint32_t *p;
+-
+-      for (p = start; (char *)p < ((char *)start + len); p++)
+-              *p = cpu_to_fdt32(FDT_NOP);
+-}
+-
+-int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
+-{
+-      struct fdt_property *prop;
+-      int len;
+-
+-      prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
+-      if (! prop)
+-              return len;
+-
+-      _fdt_nop_region(prop, len + sizeof(*prop));
+-
+-      return 0;
+-}
+-
+-int _fdt_node_end_offset(void *fdt, int nodeoffset)
+-{
+-      int level = 0;
+-      uint32_t tag;
+-      int offset, nextoffset;
+-
+-      tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
+-      if (tag != FDT_BEGIN_NODE)
+-              return -FDT_ERR_BADOFFSET;
+-      do {
+-              offset = nextoffset;
+-              tag = fdt_next_tag(fdt, offset, &nextoffset);
+-
+-              switch (tag) {
+-              case FDT_END:
+-                      return offset;
+-
+-              case FDT_BEGIN_NODE:
+-                      level++;
+-                      break;
+-
+-              case FDT_END_NODE:
+-                      level--;
+-                      break;
+-
+-              case FDT_PROP:
+-              case FDT_NOP:
+-                      break;
+-
+-              default:
+-                      return -FDT_ERR_BADSTRUCTURE;
+-              }
+-      } while (level >= 0);
+-
+-      return nextoffset;
+-}
+-
+-int fdt_nop_node(void *fdt, int nodeoffset)
+-{
+-      int endoffset;
+-
+-      endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+-      if (endoffset < 0)
+-              return endoffset;
+-
+-      _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
+-                      endoffset - nodeoffset);
+-      return 0;
+-}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/libfdt.h linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/libfdt.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/libfdt.h 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/libfdt.h     1970-01-01 01:00:00.000000000 +0100
+@@ -1,1076 +0,0 @@
+-#ifndef _LIBFDT_H
+-#define _LIBFDT_H
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-
+-#include <libfdt_env.h>
+-#include <fdt.h>
+-
+-#define FDT_FIRST_SUPPORTED_VERSION   0x10
+-#define FDT_LAST_SUPPORTED_VERSION    0x11
+-
+-/* Error codes: informative error codes */
+-#define FDT_ERR_NOTFOUND      1
+-      /* FDT_ERR_NOTFOUND: The requested node or property does not exist */
+-#define FDT_ERR_EXISTS                2
+-      /* FDT_ERR_EXISTS: Attemped to create a node or property which
+-       * already exists */
+-#define FDT_ERR_NOSPACE               3
+-      /* FDT_ERR_NOSPACE: Operation needed to expand the device
+-       * tree, but its buffer did not have sufficient space to
+-       * contain the expanded tree. Use fdt_open_into() to move the
+-       * device tree to a buffer with more space. */
+-
+-/* Error codes: codes for bad parameters */
+-#define FDT_ERR_BADOFFSET     4
+-      /* FDT_ERR_BADOFFSET: Function was passed a structure block
+-       * offset which is out-of-bounds, or which points to an
+-       * unsuitable part of the structure for the operation. */
+-#define FDT_ERR_BADPATH               5
+-      /* FDT_ERR_BADPATH: Function was passed a badly formatted path
+-       * (e.g. missing a leading / for a function which requires an
+-       * absolute path) */
+-#define FDT_ERR_BADPHANDLE    6
+-      /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
+-       * value.  phandle values of 0 and -1 are not permitted. */
+-#define FDT_ERR_BADSTATE      7
+-      /* FDT_ERR_BADSTATE: Function was passed an incomplete device
+-       * tree created by the sequential-write functions, which is
+-       * not sufficiently complete for the requested operation. */
+-
+-/* Error codes: codes for bad device tree blobs */
+-#define FDT_ERR_TRUNCATED     8
+-      /* FDT_ERR_TRUNCATED: Structure block of the given device tree
+-       * ends without an FDT_END tag. */
+-#define FDT_ERR_BADMAGIC      9
+-      /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
+-       * device tree at all - it is missing the flattened device
+-       * tree magic number. */
+-#define FDT_ERR_BADVERSION    10
+-      /* FDT_ERR_BADVERSION: Given device tree has a version which
+-       * can't be handled by the requested operation.  For
+-       * read-write functions, this may mean that fdt_open_into() is
+-       * required to convert the tree to the expected version. */
+-#define FDT_ERR_BADSTRUCTURE  11
+-      /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
+-       * structure block or other serious error (e.g. misnested
+-       * nodes, or subnodes preceding properties). */
+-#define FDT_ERR_BADLAYOUT     12
+-      /* FDT_ERR_BADLAYOUT: For read-write functions, the given
+-       * device tree has it's sub-blocks in an order that the
+-       * function can't handle (memory reserve map, then structure,
+-       * then strings).  Use fdt_open_into() to reorganize the tree
+-       * into a form suitable for the read-write operations. */
+-
+-/* "Can't happen" error indicating a bug in libfdt */
+-#define FDT_ERR_INTERNAL      13
+-      /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
+-       * Should never be returned, if it is, it indicates a bug in
+-       * libfdt itself. */
+-
+-#define FDT_ERR_MAX           13
+-
+-/**********************************************************************/
+-/* Low-level functions (you probably don't need these)                */
+-/**********************************************************************/
+-
+-const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
+-static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
+-{
+-      return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
+-}
+-
+-uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
+-
+-/**********************************************************************/
+-/* Traversal functions                                                */
+-/**********************************************************************/
+-
+-int fdt_next_node(const void *fdt, int offset, int *depth);
+-
+-/**********************************************************************/
+-/* General functions                                                  */
+-/**********************************************************************/
+-
+-#define fdt_get_header(fdt, field) \
+-      (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
+-#define fdt_magic(fdt)                        (fdt_get_header(fdt, magic))
+-#define fdt_totalsize(fdt)            (fdt_get_header(fdt, totalsize))
+-#define fdt_off_dt_struct(fdt)                (fdt_get_header(fdt, off_dt_struct))
+-#define fdt_off_dt_strings(fdt)               (fdt_get_header(fdt, off_dt_strings))
+-#define fdt_off_mem_rsvmap(fdt)               (fdt_get_header(fdt, off_mem_rsvmap))
+-#define fdt_version(fdt)              (fdt_get_header(fdt, version))
+-#define fdt_last_comp_version(fdt)    (fdt_get_header(fdt, last_comp_version))
+-#define fdt_boot_cpuid_phys(fdt)      (fdt_get_header(fdt, boot_cpuid_phys))
+-#define fdt_size_dt_strings(fdt)      (fdt_get_header(fdt, size_dt_strings))
+-#define fdt_size_dt_struct(fdt)               (fdt_get_header(fdt, size_dt_struct))
+-
+-#define __fdt_set_hdr(name) \
+-      static inline void fdt_set_##name(void *fdt, uint32_t val) \
+-      { \
+-              struct fdt_header *fdth = fdt; \
+-              fdth->name = cpu_to_fdt32(val); \
+-      }
+-__fdt_set_hdr(magic);
+-__fdt_set_hdr(totalsize);
+-__fdt_set_hdr(off_dt_struct);
+-__fdt_set_hdr(off_dt_strings);
+-__fdt_set_hdr(off_mem_rsvmap);
+-__fdt_set_hdr(version);
+-__fdt_set_hdr(last_comp_version);
+-__fdt_set_hdr(boot_cpuid_phys);
+-__fdt_set_hdr(size_dt_strings);
+-__fdt_set_hdr(size_dt_struct);
+-#undef __fdt_set_hdr
+-
+-/**
+- * fdt_check_header - sanity check a device tree or possible device tree
+- * @fdt: pointer to data which might be a flattened device tree
+- *
+- * fdt_check_header() checks that the given buffer contains what
+- * appears to be a flattened device tree with sane information in its
+- * header.
+- *
+- * returns:
+- *     0, if the buffer appears to contain a valid device tree
+- *     -FDT_ERR_BADMAGIC,
+- *     -FDT_ERR_BADVERSION,
+- *     -FDT_ERR_BADSTATE, standard meanings, as above
+- */
+-int fdt_check_header(const void *fdt);
+-
+-/**
+- * fdt_move - move a device tree around in memory
+- * @fdt: pointer to the device tree to move
+- * @buf: pointer to memory where the device is to be moved
+- * @bufsize: size of the memory space at buf
+- *
+- * fdt_move() relocates, if possible, the device tree blob located at
+- * fdt to the buffer at buf of size bufsize.  The buffer may overlap
+- * with the existing device tree blob at fdt.  Therefore,
+- *     fdt_move(fdt, fdt, fdt_totalsize(fdt))
+- * should always succeed.
+- *
+- * returns:
+- *     0, on success
+- *     -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
+- *     -FDT_ERR_BADMAGIC,
+- *     -FDT_ERR_BADVERSION,
+- *     -FDT_ERR_BADSTATE, standard meanings
+- */
+-int fdt_move(const void *fdt, void *buf, int bufsize);
+-
+-/**********************************************************************/
+-/* Read-only functions                                                */
+-/**********************************************************************/
+-
+-/**
+- * fdt_string - retrieve a string from the strings block of a device tree
+- * @fdt: pointer to the device tree blob
+- * @stroffset: offset of the string within the strings block (native endian)
+- *
+- * fdt_string() retrieves a pointer to a single string from the
+- * strings block of the device tree blob at fdt.
+- *
+- * returns:
+- *     a pointer to the string, on success
+- *     NULL, if stroffset is out of bounds
+- */
+-const char *fdt_string(const void *fdt, int stroffset);
+-
+-/**
+- * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
+- * @fdt: pointer to the device tree blob
+- *
+- * Returns the number of entries in the device tree blob's memory
+- * reservation map.  This does not include the terminating 0,0 entry
+- * or any other (0,0) entries reserved for expansion.
+- *
+- * returns:
+- *     the number of entries
+- */
+-int fdt_num_mem_rsv(const void *fdt);
+-
+-/**
+- * fdt_get_mem_rsv - retrieve one memory reserve map entry
+- * @fdt: pointer to the device tree blob
+- * @address, @size: pointers to 64-bit variables
+- *
+- * On success, *address and *size will contain the address and size of
+- * the n-th reserve map entry from the device tree blob, in
+- * native-endian format.
+- *
+- * returns:
+- *     0, on success
+- *     -FDT_ERR_BADMAGIC,
+- *     -FDT_ERR_BADVERSION,
+- *     -FDT_ERR_BADSTATE, standard meanings
+- */
+-int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
+-
+-/**
+- * fdt_subnode_offset_namelen - find a subnode based on substring
+- * @fdt: pointer to the device tree blob
+- * @parentoffset: structure block offset of a node
+- * @name: name of the subnode to locate
+- * @namelen: number of characters of name to consider
+- *
+- * Identical to fdt_subnode_offset(), but only examine the first
+- * namelen characters of name for matching the subnode name.  This is
+- * useful for finding subnodes based on a portion of a larger string,
+- * such as a full path.
+- */
+-int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
+-                             const char *name, int namelen);
+-/**
+- * fdt_subnode_offset - find a subnode of a given node
+- * @fdt: pointer to the device tree blob
+- * @parentoffset: structure block offset of a node
+- * @name: name of the subnode to locate
+- *
+- * fdt_subnode_offset() finds a subnode of the node at structure block
+- * offset parentoffset with the given name.  name may include a unit
+- * address, in which case fdt_subnode_offset() will find the subnode
+- * with that unit address, or the unit address may be omitted, in
+- * which case fdt_subnode_offset() will find an arbitrary subnode
+- * whose name excluding unit address matches the given name.
+- *
+- * returns:
+- *    structure block offset of the requested subnode (>=0), on success
+- *    -FDT_ERR_NOTFOUND, if the requested subnode does not exist
+- *    -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
+- *      -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings.
+- */
+-int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
+-
+-/**
+- * fdt_path_offset - find a tree node by its full path
+- * @fdt: pointer to the device tree blob
+- * @path: full path of the node to locate
+- *
+- * fdt_path_offset() finds a node of a given path in the device tree.
+- * Each path component may omit the unit address portion, but the
+- * results of this are undefined if any such path component is
+- * ambiguous (that is if there are multiple nodes at the relevant
+- * level matching the given component, differentiated only by unit
+- * address).
+- *
+- * returns:
+- *    structure block offset of the node with the requested path (>=0), on success
+- *    -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
+- *    -FDT_ERR_NOTFOUND, if the requested node does not exist
+- *      -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings.
+- */
+-int fdt_path_offset(const void *fdt, const char *path);
+-
+-/**
+- * fdt_get_name - retrieve the name of a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: structure block offset of the starting node
+- * @lenp: pointer to an integer variable (will be overwritten) or NULL
+- *
+- * fdt_get_name() retrieves the name (including unit address) of the
+- * device tree node at structure block offset nodeoffset.  If lenp is
+- * non-NULL, the length of this name is also returned, in the integer
+- * pointed to by lenp.
+- *
+- * returns:
+- *    pointer to the node's name, on success
+- *            If lenp is non-NULL, *lenp contains the length of that name (>=0)
+- *    NULL, on error
+- *            if lenp is non-NULL *lenp contains an error code (<0):
+- *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *            -FDT_ERR_BADMAGIC,
+- *            -FDT_ERR_BADVERSION,
+- *            -FDT_ERR_BADSTATE, standard meanings
+- */
+-const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
+-
+-/**
+- * fdt_get_property - find a given property in a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to find
+- * @name: name of the property to find
+- * @lenp: pointer to an integer variable (will be overwritten) or NULL
+- *
+- * fdt_get_property() retrieves a pointer to the fdt_property
+- * structure within the device tree blob corresponding to the property
+- * named 'name' of the node at offset nodeoffset.  If lenp is
+- * non-NULL, the length of the property value is also returned, in the
+- * integer pointed to by lenp.
+- *
+- * returns:
+- *    pointer to the structure representing the property
+- *            if lenp is non-NULL, *lenp contains the length of the property
+- *            value (>=0)
+- *    NULL, on error
+- *            if lenp is non-NULL, *lenp contains an error code (<0):
+- *            -FDT_ERR_NOTFOUND, node does not have named property
+- *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *            -FDT_ERR_BADMAGIC,
+- *            -FDT_ERR_BADVERSION,
+- *            -FDT_ERR_BADSTATE,
+- *            -FDT_ERR_BADSTRUCTURE,
+- *            -FDT_ERR_TRUNCATED, standard meanings
+- */
+-const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
+-                                          const char *name, int *lenp);
+-static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
+-                                                    const char *name,
+-                                                    int *lenp)
+-{
+-      return (struct fdt_property *)(uintptr_t)
+-              fdt_get_property(fdt, nodeoffset, name, lenp);
+-}
+-
+-/**
+- * fdt_getprop - retrieve the value of a given property
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to find
+- * @name: name of the property to find
+- * @lenp: pointer to an integer variable (will be overwritten) or NULL
+- *
+- * fdt_getprop() retrieves a pointer to the value of the property
+- * named 'name' of the node at offset nodeoffset (this will be a
+- * pointer to within the device blob itself, not a copy of the value).
+- * If lenp is non-NULL, the length of the property value is also
+- * returned, in the integer pointed to by lenp.
+- *
+- * returns:
+- *    pointer to the property's value
+- *            if lenp is non-NULL, *lenp contains the length of the property
+- *            value (>=0)
+- *    NULL, on error
+- *            if lenp is non-NULL, *lenp contains an error code (<0):
+- *            -FDT_ERR_NOTFOUND, node does not have named property
+- *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *            -FDT_ERR_BADMAGIC,
+- *            -FDT_ERR_BADVERSION,
+- *            -FDT_ERR_BADSTATE,
+- *            -FDT_ERR_BADSTRUCTURE,
+- *            -FDT_ERR_TRUNCATED, standard meanings
+- */
+-const void *fdt_getprop(const void *fdt, int nodeoffset,
+-                      const char *name, int *lenp);
+-static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
+-                                const char *name, int *lenp)
+-{
+-      return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp);
+-}
+-
+-/**
+- * fdt_get_phandle - retrieve the phandle of a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: structure block offset of the node
+- *
+- * fdt_get_phandle() retrieves the phandle of the device tree node at
+- * structure block offset nodeoffset.
+- *
+- * returns:
+- *    the phandle of the node at nodeoffset, on success (!= 0, != -1)
+- *    0, if the node has no phandle, or another error occurs
+- */
+-uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
+-
+-/**
+- * fdt_get_path - determine the full path of a node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose path to find
+- * @buf: character buffer to contain the returned path (will be overwritten)
+- * @buflen: size of the character buffer at buf
+- *
+- * fdt_get_path() computes the full path of the node at offset
+- * nodeoffset, and records that path in the buffer at buf.
+- *
+- * NOTE: This function is expensive, as it must scan the device tree
+- * structure from the start to nodeoffset.
+- *
+- * returns:
+- *    0, on success
+- *            buf contains the absolute path of the node at
+- *            nodeoffset, as a NUL-terminated string.
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
+- *            characters and will not fit in the given buffer.
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
+-
+-/**
+- * fdt_supernode_atdepth_offset - find a specific ancestor of a node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose parent to find
+- * @supernodedepth: depth of the ancestor to find
+- * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
+- *
+- * fdt_supernode_atdepth_offset() finds an ancestor of the given node
+- * at a specific depth from the root (where the root itself has depth
+- * 0, its immediate subnodes depth 1 and so forth).  So
+- *    fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
+- * will always return 0, the offset of the root node.  If the node at
+- * nodeoffset has depth D, then:
+- *    fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
+- * will return nodeoffset itself.
+- *
+- * NOTE: This function is expensive, as it must scan the device tree
+- * structure from the start to nodeoffset.
+- *
+- * returns:
+-
+- *    structure block offset of the node at node offset's ancestor
+- *            of depth supernodedepth (>=0), on success
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+-*     -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
+-                               int supernodedepth, int *nodedepth);
+-
+-/**
+- * fdt_node_depth - find the depth of a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose parent to find
+- *
+- * fdt_node_depth() finds the depth of a given node.  The root node
+- * has depth 0, its immediate subnodes depth 1 and so forth.
+- *
+- * NOTE: This function is expensive, as it must scan the device tree
+- * structure from the start to nodeoffset.
+- *
+- * returns:
+- *    depth of the node at nodeoffset (>=0), on success
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_node_depth(const void *fdt, int nodeoffset);
+-
+-/**
+- * fdt_parent_offset - find the parent of a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose parent to find
+- *
+- * fdt_parent_offset() locates the parent node of a given node (that
+- * is, it finds the offset of the node which contains the node at
+- * nodeoffset as a subnode).
+- *
+- * NOTE: This function is expensive, as it must scan the device tree
+- * structure from the start to nodeoffset, *twice*.
+- *
+- * returns:
+- *    structure block offset of the parent of the node at nodeoffset
+- *            (>=0), on success
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_parent_offset(const void *fdt, int nodeoffset);
+-
+-/**
+- * fdt_node_offset_by_prop_value - find nodes with a given property value
+- * @fdt: pointer to the device tree blob
+- * @startoffset: only find nodes after this offset
+- * @propname: property name to check
+- * @propval: property value to search for
+- * @proplen: length of the value in propval
+- *
+- * fdt_node_offset_by_prop_value() returns the offset of the first
+- * node after startoffset, which has a property named propname whose
+- * value is of length proplen and has value equal to propval; or if
+- * startoffset is -1, the very first such node in the tree.
+- *
+- * To iterate through all nodes matching the criterion, the following
+- * idiom can be used:
+- *    offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
+- *                                           propval, proplen);
+- *    while (offset != -FDT_ERR_NOTFOUND) {
+- *            // other code here
+- *            offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
+- *                                                   propval, proplen);
+- *    }
+- *
+- * Note the -1 in the first call to the function, if 0 is used here
+- * instead, the function will never locate the root node, even if it
+- * matches the criterion.
+- *
+- * returns:
+- *    structure block offset of the located node (>= 0, >startoffset),
+- *             on success
+- *    -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
+- *            tree after startoffset
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
+-                                const char *propname,
+-                                const void *propval, int proplen);
+-
+-/**
+- * fdt_node_offset_by_phandle - find the node with a given phandle
+- * @fdt: pointer to the device tree blob
+- * @phandle: phandle value
+- *
+- * fdt_node_offset_by_phandle() returns the offset of the node
+- * which has the given phandle value.  If there is more than one node
+- * in the tree with the given phandle (an invalid tree), results are
+- * undefined.
+- *
+- * returns:
+- *    structure block offset of the located node (>= 0), on success
+- *    -FDT_ERR_NOTFOUND, no node with that phandle exists
+- *    -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
+-
+-/**
+- * fdt_node_check_compatible: check a node's compatible property
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of a tree node
+- * @compatible: string to match against
+- *
+- *
+- * fdt_node_check_compatible() returns 0 if the given node contains a
+- * 'compatible' property with the given string as one of its elements,
+- * it returns non-zero otherwise, or on error.
+- *
+- * returns:
+- *    0, if the node has a 'compatible' property listing the given string
+- *    1, if the node has a 'compatible' property, but it does not list
+- *            the given string
+- *    -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
+- *    -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_node_check_compatible(const void *fdt, int nodeoffset,
+-                            const char *compatible);
+-
+-/**
+- * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
+- * @fdt: pointer to the device tree blob
+- * @startoffset: only find nodes after this offset
+- * @compatible: 'compatible' string to match against
+- *
+- * fdt_node_offset_by_compatible() returns the offset of the first
+- * node after startoffset, which has a 'compatible' property which
+- * lists the given compatible string; or if startoffset is -1, the
+- * very first such node in the tree.
+- *
+- * To iterate through all nodes matching the criterion, the following
+- * idiom can be used:
+- *    offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
+- *    while (offset != -FDT_ERR_NOTFOUND) {
+- *            // other code here
+- *            offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
+- *    }
+- *
+- * Note the -1 in the first call to the function, if 0 is used here
+- * instead, the function will never locate the root node, even if it
+- * matches the criterion.
+- *
+- * returns:
+- *    structure block offset of the located node (>= 0, >startoffset),
+- *             on success
+- *    -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
+- *            tree after startoffset
+- *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE, standard meanings
+- */
+-int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
+-                                const char *compatible);
+-
+-/**********************************************************************/
+-/* Write-in-place functions                                           */
+-/**********************************************************************/
+-
+-/**
+- * fdt_setprop_inplace - change a property's value, but not its size
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to change
+- * @name: name of the property to change
+- * @val: pointer to data to replace the property value with
+- * @len: length of the property value
+- *
+- * fdt_setprop_inplace() replaces the value of a given property with
+- * the data in val, of length len.  This function cannot change the
+- * size of a property, and so will only work if len is equal to the
+- * current length of the property.
+- *
+- * This function will alter only the bytes in the blob which contain
+- * the given property value, and will not alter or move any other part
+- * of the tree.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, if len is not equal to the property's current length
+- *    -FDT_ERR_NOTFOUND, node does not have the named property
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+-                      const void *val, int len);
+-
+-/**
+- * fdt_setprop_inplace_cell - change the value of a single-cell property
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to change
+- * @name: name of the property to change
+- * @val: cell (32-bit integer) value to replace the property with
+- *
+- * fdt_setprop_inplace_cell() replaces the value of a given property
+- * with the 32-bit integer cell value in val, converting val to
+- * big-endian if necessary.  This function cannot change the size of a
+- * property, and so will only work if the property already exists and
+- * has length 4.
+- *
+- * This function will alter only the bytes in the blob which contain
+- * the given property value, and will not alter or move any other part
+- * of the tree.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, if the property's length is not equal to 4
+-  *   -FDT_ERR_NOTFOUND, node does not have the named property
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
+-                                         const char *name, uint32_t val)
+-{
+-      val = cpu_to_fdt32(val);
+-      return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
+-}
+-
+-/**
+- * fdt_nop_property - replace a property with nop tags
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to nop
+- * @name: name of the property to nop
+- *
+- * fdt_nop_property() will replace a given property's representation
+- * in the blob with FDT_NOP tags, effectively removing it from the
+- * tree.
+- *
+- * This function will alter only the bytes in the blob which contain
+- * the property, and will not alter or move any other part of the
+- * tree.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOTFOUND, node does not have the named property
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
+-
+-/**
+- * fdt_nop_node - replace a node (subtree) with nop tags
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node to nop
+- *
+- * fdt_nop_node() will replace a given node's representation in the
+- * blob, including all its subnodes, if any, with FDT_NOP tags,
+- * effectively removing it from the tree.
+- *
+- * This function will alter only the bytes in the blob which contain
+- * the node and its properties and subnodes, and will not alter or
+- * move any other part of the tree.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_nop_node(void *fdt, int nodeoffset);
+-
+-/**********************************************************************/
+-/* Sequential write functions                                         */
+-/**********************************************************************/
+-
+-int fdt_create(void *buf, int bufsize);
+-int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
+-int fdt_finish_reservemap(void *fdt);
+-int fdt_begin_node(void *fdt, const char *name);
+-int fdt_property(void *fdt, const char *name, const void *val, int len);
+-static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
+-{
+-      val = cpu_to_fdt32(val);
+-      return fdt_property(fdt, name, &val, sizeof(val));
+-}
+-#define fdt_property_string(fdt, name, str) \
+-      fdt_property(fdt, name, str, strlen(str)+1)
+-int fdt_end_node(void *fdt);
+-int fdt_finish(void *fdt);
+-
+-/**********************************************************************/
+-/* Read-write functions                                               */
+-/**********************************************************************/
+-
+-int fdt_open_into(const void *fdt, void *buf, int bufsize);
+-int fdt_pack(void *fdt);
+-
+-/**
+- * fdt_add_mem_rsv - add one memory reserve map entry
+- * @fdt: pointer to the device tree blob
+- * @address, @size: 64-bit values (native endian)
+- *
+- * Adds a reserve map entry to the given blob reserving a region at
+- * address address of length size.
+- *
+- * This function will insert data into the reserve map and will
+- * therefore change the indexes of some entries in the table.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+- *            contain the new reservation entry
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
+-
+-/**
+- * fdt_del_mem_rsv - remove a memory reserve map entry
+- * @fdt: pointer to the device tree blob
+- * @n: entry to remove
+- *
+- * fdt_del_mem_rsv() removes the n-th memory reserve map entry from
+- * the blob.
+- *
+- * This function will delete data from the reservation table and will
+- * therefore change the indexes of some entries in the table.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there
+- *            are less than n+1 reserve map entries)
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_del_mem_rsv(void *fdt, int n);
+-
+-/**
+- * fdt_set_name - change the name of a given node
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: structure block offset of a node
+- * @name: name to give the node
+- *
+- * fdt_set_name() replaces the name (including unit address, if any)
+- * of the given node with the given string.  NOTE: this function can't
+- * efficiently check if the new name is unique amongst the given
+- * node's siblings; results are undefined if this function is invoked
+- * with a name equal to one of the given node's siblings.
+- *
+- * This function may insert or delete data from the blob, and will
+- * therefore change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob
+- *            to contain the new name
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE, standard meanings
+- */
+-int fdt_set_name(void *fdt, int nodeoffset, const char *name);
+-
+-/**
+- * fdt_setprop - create or change a property
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to change
+- * @name: name of the property to change
+- * @val: pointer to data to set the property value to
+- * @len: length of the property value
+- *
+- * fdt_setprop() sets the value of the named property in the given
+- * node to the given value and length, creating the property if it
+- * does not already exist.
+- *
+- * This function may insert or delete data from the blob, and will
+- * therefore change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+- *            contain the new property value
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+-              const void *val, int len);
+-
+-/**
+- * fdt_setprop_cell - set a property to a single cell value
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to change
+- * @name: name of the property to change
+- * @val: 32-bit integer value for the property (native endian)
+- *
+- * fdt_setprop_cell() sets the value of the named property in the
+- * given node to the given cell value (converting to big-endian if
+- * necessary), or creates a new property with that value if it does
+- * not already exist.
+- *
+- * This function may insert or delete data from the blob, and will
+- * therefore change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+- *            contain the new property value
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
+-                                 uint32_t val)
+-{
+-      val = cpu_to_fdt32(val);
+-      return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
+-}
+-
+-/**
+- * fdt_setprop_string - set a property to a string value
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to change
+- * @name: name of the property to change
+- * @str: string value for the property
+- *
+- * fdt_setprop_string() sets the value of the named property in the
+- * given node to the given string value (using the length of the
+- * string to determine the new length of the property), or creates a
+- * new property with that value if it does not already exist.
+- *
+- * This function may insert or delete data from the blob, and will
+- * therefore change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+- *            contain the new property value
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-#define fdt_setprop_string(fdt, nodeoffset, name, str) \
+-      fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
+-
+-/**
+- * fdt_delprop - delete a property
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node whose property to nop
+- * @name: name of the property to nop
+- *
+- * fdt_del_property() will delete the given property.
+- *
+- * This function will delete data from the blob, and will therefore
+- * change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_NOTFOUND, node does not have the named property
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_delprop(void *fdt, int nodeoffset, const char *name);
+-
+-/**
+- * fdt_add_subnode_namelen - creates a new node based on substring
+- * @fdt: pointer to the device tree blob
+- * @parentoffset: structure block offset of a node
+- * @name: name of the subnode to locate
+- * @namelen: number of characters of name to consider
+- *
+- * Identical to fdt_add_subnode(), but use only the first namelen
+- * characters of name as the name of the new node.  This is useful for
+- * creating subnodes based on a portion of a larger string, such as a
+- * full path.
+- */
+-int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+-                          const char *name, int namelen);
+-
+-/**
+- * fdt_add_subnode - creates a new node
+- * @fdt: pointer to the device tree blob
+- * @parentoffset: structure block offset of a node
+- * @name: name of the subnode to locate
+- *
+- * fdt_add_subnode() creates a new node as a subnode of the node at
+- * structure block offset parentoffset, with the given name (which
+- * should include the unit address, if any).
+- *
+- * This function will insert data into the blob, and will therefore
+- * change the offsets of some existing nodes.
+-
+- * returns:
+- *    structure block offset of the created nodeequested subnode (>=0), on success
+- *    -FDT_ERR_NOTFOUND, if the requested subnode does not exist
+- *    -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
+- *    -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
+- *            the given name
+- *    -FDT_ERR_NOSPACE, if there is insufficient free space in the
+- *            blob to contain the new node
+- *    -FDT_ERR_NOSPACE
+- *    -FDT_ERR_BADLAYOUT
+- *      -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings.
+- */
+-int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
+-
+-/**
+- * fdt_del_node - delete a node (subtree)
+- * @fdt: pointer to the device tree blob
+- * @nodeoffset: offset of the node to nop
+- *
+- * fdt_del_node() will remove the given node, including all its
+- * subnodes if any, from the blob.
+- *
+- * This function will delete data from the blob, and will therefore
+- * change the offsets of some existing nodes.
+- *
+- * returns:
+- *    0, on success
+- *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+- *    -FDT_ERR_BADLAYOUT,
+- *    -FDT_ERR_BADMAGIC,
+- *    -FDT_ERR_BADVERSION,
+- *    -FDT_ERR_BADSTATE,
+- *    -FDT_ERR_BADSTRUCTURE,
+- *    -FDT_ERR_TRUNCATED, standard meanings
+- */
+-int fdt_del_node(void *fdt, int nodeoffset);
+-
+-/**********************************************************************/
+-/* Debugging / informational functions                                */
+-/**********************************************************************/
+-
+-const char *fdt_strerror(int errval);
+-
+-#endif /* _LIBFDT_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/libfdt_internal.h linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/libfdt_internal.h
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/libfdt_internal.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/libfdt_internal.h    1970-01-01 01:00:00.000000000 +0100
+@@ -1,95 +0,0 @@
+-#ifndef _LIBFDT_INTERNAL_H
+-#define _LIBFDT_INTERNAL_H
+-/*
+- * libfdt - Flat Device Tree manipulation
+- * Copyright (C) 2006 David Gibson, IBM Corporation.
+- *
+- * libfdt is dual licensed: you can use it either under the terms of
+- * the GPL, or the BSD license, at your option.
+- *
+- *  a) This library 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 library 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 library; if not, write to the Free
+- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+- *     MA 02110-1301 USA
+- *
+- * Alternatively,
+- *
+- *  b) Redistribution and use in source and binary forms, with or
+- *     without modification, are permitted provided that the following
+- *     conditions are met:
+- *
+- *     1. Redistributions of source code must retain the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer.
+- *     2. Redistributions in binary form must reproduce the above
+- *        copyright notice, this list of conditions and the following
+- *        disclaimer in the documentation and/or other materials
+- *        provided with the distribution.
+- *
+- *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+- *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+- *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+- *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-#include <fdt.h>
+-
+-#define FDT_ALIGN(x, a)               (((x) + (a) - 1) & ~((a) - 1))
+-#define FDT_TAGALIGN(x)               (FDT_ALIGN((x), FDT_TAGSIZE))
+-
+-#define FDT_CHECK_HEADER(fdt) \
+-      { \
+-              int err; \
+-              if ((err = fdt_check_header(fdt)) != 0) \
+-                      return err; \
+-      }
+-
+-uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
+-int _fdt_check_node_offset(const void *fdt, int offset);
+-const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
+-int _fdt_node_end_offset(void *fdt, int nodeoffset);
+-
+-static inline const void *_fdt_offset_ptr(const void *fdt, int offset)
+-{
+-      return (const char *)fdt + fdt_off_dt_struct(fdt) + offset;
+-}
+-
+-static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
+-{
+-      return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset);
+-}
+-
+-static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n)
+-{
+-      const struct fdt_reserve_entry *rsv_table =
+-              (const struct fdt_reserve_entry *)
+-              ((const char *)fdt + fdt_off_mem_rsvmap(fdt));
+-
+-      return rsv_table + n;
+-}
+-static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
+-{
+-      return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n);
+-}
+-
+-#define FDT_SW_MAGIC          (~FDT_MAGIC)
+-
+-#endif /* _LIBFDT_INTERNAL_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/libfdt/Makefile.libfdt linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/Makefile.libfdt
+--- linux-2.6.30-rc4/arch/powerpc/boot/libfdt/Makefile.libfdt  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/libfdt/Makefile.libfdt      1970-01-01 01:00:00.000000000 +0100
+@@ -1,8 +0,0 @@
+-# Makefile.libfdt
+-#
+-# This is not a complete Makefile of itself.  Instead, it is designed to
+-# be easily embeddable into other systems of Makefiles.
+-#
+-LIBFDT_INCLUDES = fdt.h libfdt.h
+-LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
+-LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/Makefile linux-2.6.30-rc4-git/arch/powerpc/boot/Makefile
+--- linux-2.6.30-rc4/arch/powerpc/boot/Makefile        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/Makefile    2009-05-13 09:46:19.000000000 +0200
+@@ -33,7 +33,7 @@ ifeq ($(call cc-option-yn, -fstack-prote
+ BOOTCFLAGS    += -fno-stack-protector
+ endif
+-BOOTCFLAGS    += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt
++BOOTCFLAGS    += -I$(obj) -I$(srctree)/$(obj)
+ DTS_FLAGS     ?= -p 1024
+@@ -53,9 +53,14 @@ zliblinuxheader := zlib.h zconf.h zutil.
+ $(addprefix $(obj)/,$(zlib) cuboot-c2k.o gunzip_util.o main.o prpmc2800.o): \
+       $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
+-src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
++libfdt       := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
++libfdtheader := fdt.h libfdt.h libfdt_internal.h
++
++$(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \
++      $(addprefix $(obj)/,$(libfdtheader))
++
+ src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
+-              $(addprefix libfdt/,$(src-libfdt)) libfdt-wrapper.c \
++              $(libfdt) libfdt-wrapper.c \
+               ns16550.c serial.c simple_alloc.c div64.S util.S \
+               gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
+               4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
+@@ -96,6 +101,12 @@ $(addprefix $(obj)/,$(zlibheader)): $(ob
+ $(addprefix $(obj)/,$(zliblinuxheader)): $(obj)/%: $(srctree)/include/linux/%
+       $(call cmd,copy_zliblinuxheader)
++quiet_cmd_copy_libfdt = COPY    $@
++      cmd_copy_libfdt = cp $< $@
++
++$(addprefix $(obj)/,$(libfdt) $(libfdtheader)): $(obj)/%: $(srctree)/scripts/dtc/libfdt/%
++      $(call cmd,copy_libfdt)
++
+ $(obj)/empty.c:
+       @touch $@
+@@ -103,6 +114,7 @@ $(obj)/zImage.lds $(obj)/zImage.coff.lds
+       @cp $< $@
+ clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \
++              $(libfdt) $(libfdtheader) \
+               empty.c zImage.coff.lds zImage.ps3.lds zImage.lds
+ quiet_cmd_bootcc = BOOTCC  $@
+@@ -114,6 +126,8 @@ quiet_cmd_bootas = BOOTAS  $@
+ quiet_cmd_bootar = BOOTAR  $@
+       cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
++$(obj-libfdt): $(obj)/%.o: $(srctree)/scripts/dtc/libfdt/%.c FORCE
++      $(call if_changed_dep,bootcc)
+ $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE
+       $(Q)mkdir -p $(dir $@)
+       $(call if_changed_dep,bootcc)
+@@ -124,7 +138,7 @@ $(patsubst %.S,%.o, $(filter %.S, $(src-
+ $(obj)/wrapper.a: $(obj-wlib) FORCE
+       $(call if_changed,bootar)
+-hostprogs-y   := addnote addRamDisk hack-coff mktree dtc
++hostprogs-y   := addnote addRamDisk hack-coff mktree
+ targets               += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a)
+ extra-y               := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
+@@ -133,47 +147,10 @@ extra-y          := $(obj)/wrapper.a $(obj-plat)
+ dtstree               := $(srctree)/$(src)/dts
+ wrapper               :=$(srctree)/$(src)/wrapper
+-wrapperbits   := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree dtc) \
++wrapperbits   := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \
+                       $(wrapper) FORCE
+ #############
+-# Bits for building dtc
+-# DTC_GENPARSER      := 1    # Uncomment to rebuild flex/bison output
+-
+-dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o
+-dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
+-dtc-objs := $(addprefix dtc-src/, $(dtc-objs))
+-
+-# prerequisites on generated files needs to be explicit
+-$(obj)/dtc-src/dtc-parser.tab.o: $(obj)/dtc-src/dtc-parser.tab.c $(obj)/dtc-src/dtc-parser.tab.h
+-$(obj)/dtc-src/dtc-lexer.lex.o:  $(obj)/dtc-src/dtc-lexer.lex.c $(obj)/dtc-src/dtc-parser.tab.h
+-
+-HOSTCFLAGS += -I$(src)/dtc-src/ -I$(src)/libfdt/
+-
+-targets += dtc-src/dtc-parser.tab.c
+-targets += dtc-src/dtc-lexer.lex.c
+-
+-clean-files += dtc-src/dtc-parser.tab.h
+-
+-ifdef DTC_GENPARSER
+-BISON = bison
+-FLEX = flex
+-
+-quiet_cmd_bison = BISON   $@
+-      cmd_bison = $(BISON) -o$@ -d $<; cp $@ $@_shipped
+-quiet_cmd_flex = FLEX    $@
+-      cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
+-
+-$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE
+-      $(call if_changed,bison)
+-
+-$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c
+-
+-$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE
+-      $(call if_changed,flex)
+-endif
+-
+-#############
+ # Bits for building various flavours of zImage
+ ifneq ($(CROSS32_COMPILE),)
+@@ -347,8 +324,10 @@ $(obj)/treeImage.%: vmlinux $(obj)/%.dtb
+       $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)
+ # Rule to build device tree blobs
+-$(obj)/%.dtb: $(dtstree)/%.dts $(obj)/dtc
+-      $(obj)/dtc -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts
++DTC = $(objtree)/scripts/dtc/dtc
++
++$(obj)/%.dtb: $(dtstree)/%.dts
++      $(DTC) -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts
+ # If there isn't a platform selected then just strip the vmlinux.
+ ifeq (,$(image-y))
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/boot/simpleboot.c linux-2.6.30-rc4-git/arch/powerpc/boot/simpleboot.c
+--- linux-2.6.30-rc4/arch/powerpc/boot/simpleboot.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/boot/simpleboot.c        2009-05-13 09:46:19.000000000 +0200
+@@ -19,7 +19,7 @@
+ #include "types.h"
+ #include "io.h"
+ #include "stdio.h"
+-#include "libfdt/libfdt.h"
++#include <libfdt.h>
+ BSS_STACK(4*1024);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/include/asm/of_platform.h linux-2.6.30-rc4-git/arch/powerpc/include/asm/of_platform.h
+--- linux-2.6.30-rc4/arch/powerpc/include/asm/of_platform.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/include/asm/of_platform.h        2009-05-13 09:46:19.000000000 +0200
+@@ -11,16 +11,6 @@
+  *
+  */
+-/* Platform drivers register/unregister */
+-static inline int of_register_platform_driver(struct of_platform_driver *drv)
+-{
+-      return of_register_driver(drv, &of_platform_bus_type);
+-}
+-static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
+-{
+-      of_unregister_driver(drv);
+-}
+-
+ /* Platform devices and busses creation */
+ extern struct of_device *of_platform_device_create(struct device_node *np,
+                                                  const char *bus_id,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/powerpc/Kconfig linux-2.6.30-rc4-git/arch/powerpc/Kconfig
+--- linux-2.6.30-rc4/arch/powerpc/Kconfig      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/powerpc/Kconfig  2009-05-13 09:46:19.000000000 +0200
+@@ -181,6 +181,10 @@ config SYS_SUPPORTS_APM_EMULATION
+       default y if PMAC_APM_EMU
+       bool
++config DTC
++       bool
++       default y
++
+ config DEFAULT_UIMAGE
+       bool
+       help
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/x86/include/asm/mce.h linux-2.6.30-rc4-git/arch/x86/include/asm/mce.h
+--- linux-2.6.30-rc4/arch/x86/include/asm/mce.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/x86/include/asm/mce.h    2009-05-13 09:46:19.000000000 +0200
+@@ -137,6 +137,7 @@ DECLARE_PER_CPU(mce_banks_t, mce_poll_ba
+ enum mcp_flags {
+       MCP_TIMESTAMP = (1 << 0),       /* log time stamp */
+       MCP_UC = (1 << 1),              /* log uncorrected errors */
++      MCP_DONTLOG = (1 << 2),         /* only clear, don't log */
+ };
+ extern void machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/arch/x86/kernel/cpu/mcheck/mce_64.c linux-2.6.30-rc4-git/arch/x86/kernel/cpu/mcheck/mce_64.c
+--- linux-2.6.30-rc4/arch/x86/kernel/cpu/mcheck/mce_64.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/arch/x86/kernel/cpu/mcheck/mce_64.c   2009-05-13 09:46:19.000000000 +0200
+@@ -239,9 +239,10 @@ void machine_check_poll(enum mcp_flags f
+                * Don't get the IP here because it's unlikely to
+                * have anything to do with the actual error location.
+                */
+-
+-              mce_log(&m);
+-              add_taint(TAINT_MACHINE_CHECK);
++              if (!(flags & MCP_DONTLOG)) {
++                      mce_log(&m);
++                      add_taint(TAINT_MACHINE_CHECK);
++              }
+               /*
+                * Clear state for this bank.
+@@ -452,13 +453,14 @@ void mce_log_therm_throt_event(__u64 sta
+  */
+ static int check_interval = 5 * 60; /* 5 minutes */
+-static int next_interval; /* in jiffies */
++static DEFINE_PER_CPU(int, next_interval); /* in jiffies */
+ static void mcheck_timer(unsigned long);
+ static DEFINE_PER_CPU(struct timer_list, mce_timer);
+ static void mcheck_timer(unsigned long data)
+ {
+       struct timer_list *t = &per_cpu(mce_timer, data);
++      int *n;
+       WARN_ON(smp_processor_id() != data);
+@@ -470,14 +472,14 @@ static void mcheck_timer(unsigned long d
+        * Alert userspace if needed.  If we logged an MCE, reduce the
+        * polling interval, otherwise increase the polling interval.
+        */
++      n = &__get_cpu_var(next_interval);
+       if (mce_notify_user()) {
+-              next_interval = max(next_interval/2, HZ/100);
++              *n = max(*n/2, HZ/100);
+       } else {
+-              next_interval = min(next_interval * 2,
+-                              (int)round_jiffies_relative(check_interval*HZ));
++              *n = min(*n*2, (int)round_jiffies_relative(check_interval*HZ));
+       }
+-      t->expires = jiffies + next_interval;
++      t->expires = jiffies + *n;
+       add_timer(t);
+ }
+@@ -584,7 +586,7 @@ static void mce_init(void *dummy)
+        * Log the machine checks left over from the previous reset.
+        */
+       bitmap_fill(all_banks, MAX_NR_BANKS);
+-      machine_check_poll(MCP_UC, &all_banks);
++      machine_check_poll(MCP_UC|(!mce_bootlog ? MCP_DONTLOG : 0), &all_banks);
+       set_in_cr4(X86_CR4_MCE);
+@@ -632,14 +634,13 @@ static void mce_cpu_features(struct cpui
+ static void mce_init_timer(void)
+ {
+       struct timer_list *t = &__get_cpu_var(mce_timer);
++      int *n = &__get_cpu_var(next_interval);
+-      /* data race harmless because everyone sets to the same value */
+-      if (!next_interval)
+-              next_interval = check_interval * HZ;
+-      if (!next_interval)
++      *n = check_interval * HZ;
++      if (!*n)
+               return;
+       setup_timer(t, mcheck_timer, smp_processor_id());
+-      t->expires = round_jiffies(jiffies + next_interval);
++      t->expires = round_jiffies(jiffies + *n);
+       add_timer(t);
+ }
+@@ -907,7 +908,6 @@ static void mce_cpu_restart(void *data)
+ /* Reinit MCEs after user configuration changes */
+ static void mce_restart(void)
+ {
+-      next_interval = check_interval * HZ;
+       on_each_cpu(mce_cpu_restart, NULL, 1);
+ }
+@@ -1110,7 +1110,8 @@ static int __cpuinit mce_cpu_callback(st
+               break;
+       case CPU_DOWN_FAILED:
+       case CPU_DOWN_FAILED_FROZEN:
+-              t->expires = round_jiffies(jiffies + next_interval);
++              t->expires = round_jiffies(jiffies +
++                                              __get_cpu_var(next_interval));
+               add_timer_on(t, cpu);
+               smp_call_function_single(cpu, mce_reenable_cpu, &action, 1);
+               break;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/DocBook/Makefile linux-2.6.30-rc4-git/Documentation/DocBook/Makefile
+--- linux-2.6.30-rc4/Documentation/DocBook/Makefile    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/Documentation/DocBook/Makefile        2009-05-13 09:46:19.000000000 +0200
+@@ -143,7 +143,8 @@ quiet_cmd_db2pdf = PDF     $@
+       $(call cmd,db2pdf)
+-main_idx = Documentation/DocBook/index.html
++index = index.html
++main_idx = Documentation/DocBook/$(index)
+ build_main_index = rm -rf $(main_idx) && \
+                  echo '<h1>Linux Kernel HTML Documentation</h1>' >> $(main_idx) && \
+                  echo '<h2>Kernel Version: $(KERNELVERSION)</h2>' >> $(main_idx) && \
+@@ -232,7 +233,7 @@ clean-files := $(DOCBOOKS) \
+       $(patsubst %.xml, %.pdf,  $(DOCBOOKS)) \
+       $(patsubst %.xml, %.html, $(DOCBOOKS)) \
+       $(patsubst %.xml, %.9,    $(DOCBOOKS)) \
+-      $(C-procfs-example)
++      $(C-procfs-example) $(index)
+ clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) man
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/filesystems/Locking linux-2.6.30-rc4-git/Documentation/filesystems/Locking
+--- linux-2.6.30-rc4/Documentation/filesystems/Locking 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/Documentation/filesystems/Locking     2009-05-13 09:46:19.000000000 +0200
+@@ -512,16 +512,24 @@ locking rules:
+               BKL     mmap_sem        PageLocked(page)
+ open:         no      yes
+ close:                no      yes
+-fault:                no      yes
+-page_mkwrite: no      yes             no
++fault:                no      yes             can return with page locked
++page_mkwrite: no      yes             can return with page locked
+ access:               no      yes
+-      ->page_mkwrite() is called when a previously read-only page is
+-about to become writeable. The file system is responsible for
+-protecting against truncate races. Once appropriate action has been
+-taking to lock out truncate, the page range should be verified to be
+-within i_size. The page mapping should also be checked that it is not
+-NULL.
++      ->fault() is called when a previously not present pte is about
++to be faulted in. The filesystem must find and return the page associated
++with the passed in "pgoff" in the vm_fault structure. If it is possible that
++the page may be truncated and/or invalidated, then the filesystem must lock
++the page, then ensure it is not already truncated (the page lock will block
++subsequent truncate), and then return with VM_FAULT_LOCKED, and the page
++locked. The VM will unlock the page.
++
++      ->page_mkwrite() is called when a previously read-only pte is
++about to become writeable. The filesystem again must ensure that there are
++no truncate/invalidate races, and then return with the page locked. If
++the page has been truncated, the filesystem should not look up a new page
++like the ->fault() handler, but simply return with VM_FAULT_NOPAGE, which
++will cause the VM to retry the fault.
+       ->access() is called when get_user_pages() fails in
+ acces_process_vm(), typically used to debug a process through
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/input/bcm5974.txt linux-2.6.30-rc4-git/Documentation/input/bcm5974.txt
+--- linux-2.6.30-rc4/Documentation/input/bcm5974.txt   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/Documentation/input/bcm5974.txt       2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,65 @@
++BCM5974 Driver (bcm5974)
++------------------------
++      Copyright (C) 2008-2009 Henrik Rydberg <rydberg@euromail.se>
++
++The USB initialization and package decoding was made by Scott Shawcroft as
++part of the touchd user-space driver project:
++      Copyright (C) 2008      Scott Shawcroft (scott.shawcroft@gmail.com)
++
++The BCM5974 driver is based on the appletouch driver:
++      Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
++      Copyright (C) 2005      Johannes Berg (johannes@sipsolutions.net)
++      Copyright (C) 2005      Stelian Pop (stelian@popies.net)
++      Copyright (C) 2005      Frank Arnold (frank@scirocco-5v-turbo.de)
++      Copyright (C) 2005      Peter Osterlund (petero2@telia.com)
++      Copyright (C) 2005      Michael Hanselmann (linux-kernel@hansmi.ch)
++      Copyright (C) 2006      Nicolas Boichat (nicolas@boichat.ch)
++
++This driver adds support for the multi-touch trackpad on the new Apple
++Macbook Air and Macbook Pro laptops. It replaces the appletouch driver on
++those computers, and integrates well with the synaptics driver of the Xorg
++system.
++
++Known to work on Macbook Air, Macbook Pro Penryn and the new unibody
++Macbook 5 and Macbook Pro 5.
++
++Usage
++-----
++
++The driver loads automatically for the supported usb device ids, and
++becomes available both as an event device (/dev/input/event*) and as a
++mouse via the mousedev driver (/dev/input/mice).
++
++USB Race
++--------
++
++The Apple multi-touch trackpads report both mouse and keyboard events via
++different interfaces of the same usb device. This creates a race condition
++with the HID driver, which, if not told otherwise, will find the standard
++HID mouse and keyboard, and claim the whole device. To remedy, the usb
++product id must be listed in the mouse_ignore list of the hid driver.
++
++Debug output
++------------
++
++To ease the development for new hardware version, verbose packet output can
++be switched on with the debug kernel module parameter. The range [1-9]
++yields different levels of verbosity. Example (as root):
++
++echo -n 9 > /sys/module/bcm5974/parameters/debug
++
++tail -f /var/log/debug
++
++echo -n 0 > /sys/module/bcm5974/parameters/debug
++
++Trivia
++------
++
++The driver was developed at the ubuntu forums in June 2008 [1], and now has
++a more permanent home at bitmath.org [2].
++
++Links
++-----
++
++[1] http://ubuntuforums.org/showthread.php?t=840040
++[2] http://http://bitmath.org/code/
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/input/multi-touch-protocol.txt linux-2.6.30-rc4-git/Documentation/input/multi-touch-protocol.txt
+--- linux-2.6.30-rc4/Documentation/input/multi-touch-protocol.txt      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/Documentation/input/multi-touch-protocol.txt  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,140 @@
++Multi-touch (MT) Protocol
++-------------------------
++      Copyright (C) 2009      Henrik Rydberg <rydberg@euromail.se>
++
++
++Introduction
++------------
++
++In order to utilize the full power of the new multi-touch devices, a way to
++report detailed finger data to user space is needed. This document
++describes the multi-touch (MT) protocol which allows kernel drivers to
++report details for an arbitrary number of fingers.
++
++
++Usage
++-----
++
++Anonymous finger details are sent sequentially as separate packets of ABS
++events. Only the ABS_MT events are recognized as part of a finger
++packet. The end of a packet is marked by calling the input_mt_sync()
++function, which generates a SYN_MT_REPORT event. The end of multi-touch
++transfer is marked by calling the usual input_sync() function.
++
++A set of ABS_MT events with the desired properties is defined. The events
++are divided into categories, to allow for partial implementation.  The
++minimum set consists of ABS_MT_TOUCH_MAJOR, ABS_MT_POSITION_X and
++ABS_MT_POSITION_Y, which allows for multiple fingers to be tracked.  If the
++device supports it, the ABS_MT_WIDTH_MAJOR may be used to provide the size
++of the approaching finger. Anisotropy and direction may be specified with
++ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION. Devices with
++more granular information may specify general shapes as blobs, i.e., as a
++sequence of rectangular shapes grouped together by an
++ABS_MT_BLOB_ID. Finally, the ABS_MT_TOOL_TYPE may be used to specify
++whether the touching tool is a finger or a pen or something else.
++
++
++Event Semantics
++---------------
++
++The word "contact" is used to describe a tool which is in direct contact
++with the surface. A finger, a pen or a rubber all classify as contacts.
++
++ABS_MT_TOUCH_MAJOR
++
++The length of the major axis of the contact. The length should be given in
++surface units. If the surface has an X times Y resolution, the largest
++possible value of ABS_MT_TOUCH_MAJOR is sqrt(X^2 + Y^2), the diagonal.
++
++ABS_MT_TOUCH_MINOR
++
++The length, in surface units, of the minor axis of the contact. If the
++contact is circular, this event can be omitted.
++
++ABS_MT_WIDTH_MAJOR
++
++The length, in surface units, of the major axis of the approaching
++tool. This should be understood as the size of the tool itself. The
++orientation of the contact and the approaching tool are assumed to be the
++same.
++
++ABS_MT_WIDTH_MINOR
++
++The length, in surface units, of the minor axis of the approaching
++tool. Omit if circular.
++
++The above four values can be used to derive additional information about
++the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates
++the notion of pressure. The fingers of the hand and the palm all have
++different characteristic widths [1].
++
++ABS_MT_ORIENTATION
++
++The orientation of the ellipse. The value should describe half a revolution
++clockwise around the touch center. The scale of the value is arbitrary, but
++zero should be returned for an ellipse aligned along the Y axis of the
++surface. As an example, an index finger placed straight onto the axis could
++return zero orientation, something negative when twisted to the left, and
++something positive when twisted to the right. This value can be omitted if
++the touching object is circular, or if the information is not available in
++the kernel driver.
++
++ABS_MT_POSITION_X
++
++The surface X coordinate of the center of the touching ellipse.
++
++ABS_MT_POSITION_Y
++
++The surface Y coordinate of the center of the touching ellipse.
++
++ABS_MT_TOOL_TYPE
++
++The type of approaching tool. A lot of kernel drivers cannot distinguish
++between different tool types, such as a finger or a pen. In such cases, the
++event should be omitted. The protocol currently supports MT_TOOL_FINGER and
++MT_TOOL_PEN [2].
++
++ABS_MT_BLOB_ID
++
++The BLOB_ID groups several packets together into one arbitrarily shaped
++contact. This is a low-level anonymous grouping, and should not be confused
++with the high-level contactID, explained below. Most kernel drivers will
++not have this capability, and can safely omit the event.
++
++
++Finger Tracking
++---------------
++
++The kernel driver should generate an arbitrary enumeration of the set of
++anonymous contacts currently on the surface. The order in which the packets
++appear in the event stream is not important.
++
++The process of finger tracking, i.e., to assign a unique contactID to each
++initiated contact on the surface, is left to user space; preferably the
++multi-touch X driver [3]. In that driver, the contactID stays the same and
++unique until the contact vanishes (when the finger leaves the surface). The
++problem of assigning a set of anonymous fingers to a set of identified
++fingers is a euclidian bipartite matching problem at each event update, and
++relies on a sufficiently rapid update rate.
++
++Notes
++-----
++
++In order to stay compatible with existing applications, the data
++reported in a finger packet must not be recognized as single-touch
++events. In addition, all finger data must bypass input filtering,
++since subsequent events of the same type refer to different fingers.
++
++The first kernel driver to utilize the MT protocol is the bcm5974 driver,
++where examples can be found.
++
++[1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the
++difference between the contact position and the approaching tool position
++could be used to derive tilt.
++[2] The list can of course be extended.
++[3] The multi-touch X driver is currently in the prototyping stage. At the
++time of writing (April 2009), the MT protocol is not yet merged, and the
++prototype implements finger matching, basic mouse support and two-finger
++scrolling. The project aims at improving the quality of current multi-touch
++functionality available in the synaptics X driver, and in addition
++implement more advanced gestures.
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/kernel-doc-nano-HOWTO.txt linux-2.6.30-rc4-git/Documentation/kernel-doc-nano-HOWTO.txt
+--- linux-2.6.30-rc4/Documentation/kernel-doc-nano-HOWTO.txt   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/Documentation/kernel-doc-nano-HOWTO.txt       2009-05-13 09:46:19.000000000 +0200
+@@ -269,7 +269,10 @@ Use the argument mechanism to document m
+ Inside a struct description, you can use the "private:" and "public:"
+ comment tags.  Structure fields that are inside a "private:" area
+-are not listed in the generated output documentation.
++are not listed in the generated output documentation.  The "private:"
++and "public:" tags must begin immediately following a "/*" comment
++marker.  They may optionally include comments between the ":" and the
++ending "*/" marker.
+ Example:
+@@ -283,7 +286,7 @@ Example:
+ struct my_struct {
+     int a;
+     int b;
+-/* private: */
++/* private: internal use only */
+     int c;
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Documentation/sysctl/vm.txt linux-2.6.30-rc4-git/Documentation/sysctl/vm.txt
+--- linux-2.6.30-rc4/Documentation/sysctl/vm.txt       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/Documentation/sysctl/vm.txt   2009-05-13 09:46:19.000000000 +0200
+@@ -90,6 +90,10 @@ will itself start writeback.
+ If dirty_bytes is written, dirty_ratio becomes a function of its value
+ (dirty_bytes / the amount of dirtyable system memory).
++Note: the minimum value allowed for dirty_bytes is two pages (in bytes); any
++value lower than this limit will be ignored and the old configuration will be
++retained.
++
+ ==============================================================
+ dirty_expire_centisecs
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/acpi/acpica/rscalc.c linux-2.6.30-rc4-git/drivers/acpi/acpica/rscalc.c
+--- linux-2.6.30-rc4/drivers/acpi/acpica/rscalc.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/acpi/acpica/rscalc.c  2009-05-13 09:46:19.000000000 +0200
+@@ -543,6 +543,13 @@ acpi_rs_get_pci_routing_table_length(uni
+               package_element = *top_object_list;
++              /* We must have a valid Package object */
++
++              if (!package_element ||
++                  (package_element->common.type != ACPI_TYPE_PACKAGE)) {
++                      return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
++              }
++
+               /*
+                * The sub_object_list will now point to an array of the
+                * four IRQ elements: Address, Pin, Source and source_index
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/char/hw_random/Kconfig linux-2.6.30-rc4-git/drivers/char/hw_random/Kconfig
+--- linux-2.6.30-rc4/drivers/char/hw_random/Kconfig    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/char/hw_random/Kconfig        2009-05-13 09:46:19.000000000 +0200
+@@ -148,3 +148,15 @@ config HW_RANDOM_VIRTIO
+         To compile this driver as a module, choose M here: the
+         module will be called virtio-rng.  If unsure, say N.
++
++config HW_RANDOM_MXC_RNGA
++      tristate "Freescale i.MX RNGA Random Number Generator"
++      depends on HW_RANDOM && ARCH_HAS_RNGA
++      ---help---
++        This driver provides kernel-side support for the Random Number
++        Generator hardware found on Freescale i.MX processors.
++
++        To compile this driver as a module, choose M here: the
++        module will be called mxc-rnga.
++
++        If unsure, say Y.
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/char/hw_random/Makefile linux-2.6.30-rc4-git/drivers/char/hw_random/Makefile
+--- linux-2.6.30-rc4/drivers/char/hw_random/Makefile   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/char/hw_random/Makefile       2009-05-13 09:46:19.000000000 +0200
+@@ -15,3 +15,4 @@ obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx
+ obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+ obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
+ obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
++obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/char/hw_random/mxc-rnga.c linux-2.6.30-rc4-git/drivers/char/hw_random/mxc-rnga.c
+--- linux-2.6.30-rc4/drivers/char/hw_random/mxc-rnga.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/drivers/char/hw_random/mxc-rnga.c     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,247 @@
++/*
++ * RNG driver for Freescale RNGA
++ *
++ * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
++ * Author: Alan Carvalho de Assis <acassis@gmail.com>
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ *
++ * This driver is based on other RNG drivers.
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/ioport.h>
++#include <linux/platform_device.h>
++#include <linux/hw_random.h>
++#include <linux/io.h>
++
++/* RNGA Registers */
++#define RNGA_CONTROL                  0x00
++#define RNGA_STATUS                   0x04
++#define RNGA_ENTROPY                  0x08
++#define RNGA_OUTPUT_FIFO              0x0c
++#define RNGA_MODE                     0x10
++#define RNGA_VERIFICATION_CONTROL     0x14
++#define RNGA_OSC_CONTROL_COUNTER      0x18
++#define RNGA_OSC1_COUNTER             0x1c
++#define RNGA_OSC2_COUNTER             0x20
++#define RNGA_OSC_COUNTER_STATUS               0x24
++
++/* RNGA Registers Range */
++#define RNG_ADDR_RANGE                        0x28
++
++/* RNGA Control Register */
++#define RNGA_CONTROL_SLEEP            0x00000010
++#define RNGA_CONTROL_CLEAR_INT                0x00000008
++#define RNGA_CONTROL_MASK_INTS                0x00000004
++#define RNGA_CONTROL_HIGH_ASSURANCE   0x00000002
++#define RNGA_CONTROL_GO                       0x00000001
++
++#define RNGA_STATUS_LEVEL_MASK                0x0000ff00
++
++/* RNGA Status Register */
++#define RNGA_STATUS_OSC_DEAD          0x80000000
++#define RNGA_STATUS_SLEEP             0x00000010
++#define RNGA_STATUS_ERROR_INT         0x00000008
++#define RNGA_STATUS_FIFO_UNDERFLOW    0x00000004
++#define RNGA_STATUS_LAST_READ_STATUS  0x00000002
++#define RNGA_STATUS_SECURITY_VIOLATION        0x00000001
++
++static struct platform_device *rng_dev;
++
++static int mxc_rnga_data_present(struct hwrng *rng)
++{
++      int level;
++      void __iomem *rng_base = (void __iomem *)rng->priv;
++
++      /* how many random numbers is in FIFO? [0-16] */
++      level = ((__raw_readl(rng_base + RNGA_STATUS) &
++                      RNGA_STATUS_LEVEL_MASK) >> 8);
++
++      return level > 0 ? 1 : 0;
++}
++
++static int mxc_rnga_data_read(struct hwrng *rng, u32 * data)
++{
++      int err;
++      u32 ctrl;
++      void __iomem *rng_base = (void __iomem *)rng->priv;
++
++      /* retrieve a random number from FIFO */
++      *data = __raw_readl(rng_base + RNGA_OUTPUT_FIFO);
++
++      /* some error while reading this random number? */
++      err = __raw_readl(rng_base + RNGA_STATUS) & RNGA_STATUS_ERROR_INT;
++
++      /* if error: clear error interrupt, but doesn't return random number */
++      if (err) {
++              dev_dbg(&rng_dev->dev, "Error while reading random number!\n");
++              ctrl = __raw_readl(rng_base + RNGA_CONTROL);
++              __raw_writel(ctrl | RNGA_CONTROL_CLEAR_INT,
++                                      rng_base + RNGA_CONTROL);
++              return 0;
++      } else
++              return 4;
++}
++
++static int mxc_rnga_init(struct hwrng *rng)
++{
++      u32 ctrl, osc;
++      void __iomem *rng_base = (void __iomem *)rng->priv;
++
++      /* wake up */
++      ctrl = __raw_readl(rng_base + RNGA_CONTROL);
++      __raw_writel(ctrl & ~RNGA_CONTROL_SLEEP, rng_base + RNGA_CONTROL);
++
++      /* verify if oscillator is working */
++      osc = __raw_readl(rng_base + RNGA_STATUS);
++      if (osc & RNGA_STATUS_OSC_DEAD) {
++              dev_err(&rng_dev->dev, "RNGA Oscillator is dead!\n");
++              return -ENODEV;
++      }
++
++      /* go running */
++      ctrl = __raw_readl(rng_base + RNGA_CONTROL);
++      __raw_writel(ctrl | RNGA_CONTROL_GO, rng_base + RNGA_CONTROL);
++
++      return 0;
++}
++
++static void mxc_rnga_cleanup(struct hwrng *rng)
++{
++      u32 ctrl;
++      void __iomem *rng_base = (void __iomem *)rng->priv;
++
++      ctrl = __raw_readl(rng_base + RNGA_CONTROL);
++
++      /* stop rnga */
++      __raw_writel(ctrl & ~RNGA_CONTROL_GO, rng_base + RNGA_CONTROL);
++}
++
++static struct hwrng mxc_rnga = {
++      .name = "mxc-rnga",
++      .init = mxc_rnga_init,
++      .cleanup = mxc_rnga_cleanup,
++      .data_present = mxc_rnga_data_present,
++      .data_read = mxc_rnga_data_read
++};
++
++static int __init mxc_rnga_probe(struct platform_device *pdev)
++{
++      int err = -ENODEV;
++      struct clk *clk;
++      struct resource *res, *mem;
++      void __iomem *rng_base = NULL;
++
++      if (rng_dev)
++              return -EBUSY;
++
++      clk = clk_get(&pdev->dev, "rng");
++      if (IS_ERR(clk)) {
++              dev_err(&pdev->dev, "Could not get rng_clk!\n");
++              err = PTR_ERR(clk);
++              goto out;
++      }
++
++      clk_enable(clk);
++
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
++              err = -ENOENT;
++              goto err_region;
++      }
++
++      mem = request_mem_region(res->start, resource_size(res), pdev->name);
++      if (mem == NULL) {
++              err = -EBUSY;
++              goto err_region;
++      }
++
++      rng_base = ioremap(res->start, resource_size(res));
++      if (!rng_base) {
++              err = -ENOMEM;
++              goto err_ioremap;
++      }
++
++      mxc_rnga.priv = (unsigned long)rng_base;
++
++      err = hwrng_register(&mxc_rnga);
++      if (err) {
++              dev_err(&pdev->dev, "MXC RNGA registering failed (%d)\n", err);
++              goto err_register;
++      }
++
++      rng_dev = pdev;
++
++      dev_info(&pdev->dev, "MXC RNGA Registered.\n");
++
++      return 0;
++
++err_register:
++      iounmap(rng_base);
++      rng_base = NULL;
++
++err_ioremap:
++      release_mem_region(res->start, resource_size(res));
++
++err_region:
++      clk_disable(clk);
++      clk_put(clk);
++
++out:
++      return err;
++}
++
++static int __exit mxc_rnga_remove(struct platform_device *pdev)
++{
++      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      void __iomem *rng_base = (void __iomem *)mxc_rnga.priv;
++      struct clk *clk = clk_get(&pdev->dev, "rng");
++
++      hwrng_unregister(&mxc_rnga);
++
++      iounmap(rng_base);
++
++      release_mem_region(res->start, resource_size(res));
++
++      clk_disable(clk);
++      clk_put(clk);
++
++      return 0;
++}
++
++static struct platform_driver mxc_rnga_driver = {
++      .driver = {
++                 .name = "mxc_rnga",
++                 .owner = THIS_MODULE,
++                 },
++      .remove = __exit_p(mxc_rnga_remove),
++};
++
++static int __init mod_init(void)
++{
++      return platform_driver_probe(&mxc_rnga_driver, mxc_rnga_probe);
++}
++
++static void __exit mod_exit(void)
++{
++      platform_driver_unregister(&mxc_rnga_driver);
++}
++
++module_init(mod_init);
++module_exit(mod_exit);
++
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("H/W RNGA driver for i.MX");
++MODULE_LICENSE("GPL");
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/firmware/iscsi_ibft.c linux-2.6.30-rc4-git/drivers/firmware/iscsi_ibft.c
+--- linux-2.6.30-rc4/drivers/firmware/iscsi_ibft.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/firmware/iscsi_ibft.c 2009-05-13 09:46:19.000000000 +0200
+@@ -754,11 +754,11 @@ static int __init ibft_check_nic_for(str
+               rc = 1;
+               break;
+       case ibft_eth_ip_addr:
+-              if (!memcmp(nic->dhcp, nulls, sizeof(nic->dhcp)))
++              if (memcmp(nic->ip_addr, nulls, sizeof(nic->ip_addr)))
+                       rc = 1;
+               break;
+       case ibft_eth_subnet_mask:
+-              if (!memcmp(nic->dhcp, nulls, sizeof(nic->dhcp)))
++              if (nic->subnet_mask_prefix)
+                       rc = 1;
+               break;
+       case ibft_eth_origin:
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/hid-apple.c linux-2.6.30-rc4-git/drivers/hid/hid-apple.c
+--- linux-2.6.30-rc4/drivers/hid/hid-apple.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/hid-apple.c       2009-05-13 09:46:19.000000000 +0200
+@@ -151,7 +151,7 @@ static int hidinput_apple_event(struct h
+       if (fnmode) {
+               int do_translate;
+-              trans = apple_find_translation((hid->product < 0x220 ||
++              trans = apple_find_translation((hid->product < 0x21d ||
+                                       hid->product >= 0x300) ?
+                                       powerbook_fn_keys : apple_fn_keys,
+                                       usage->code);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/hid-core.c linux-2.6.30-rc4-git/drivers/hid/hid-core.c
+--- linux-2.6.30-rc4/drivers/hid/hid-core.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/hid-core.c        2009-05-13 09:46:19.000000000 +0200
+@@ -1293,6 +1293,7 @@ static const struct hid_device_id hid_bl
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
+@@ -1824,6 +1825,9 @@ int hid_check_keys_pressed(struct hid_de
+       struct hid_input *hidinput;
+       int i;
++      if (!(hid->claimed & HID_CLAIMED_INPUT))
++              return 0;
++
+       list_for_each_entry(hidinput, &hid->inputs, list) {
+               for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
+                       if (hidinput->input->key[i])
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/hid-ids.h linux-2.6.30-rc4-git/drivers/hid/hid-ids.h
+--- linux-2.6.30-rc4/drivers/hid/hid-ids.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/hid-ids.h 2009-05-13 09:46:19.000000000 +0200
+@@ -292,6 +292,7 @@
+ #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO    0xc286
+ #define USB_DEVICE_ID_LOGITECH_WHEEL  0xc294
+ #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL     0xc295
++#define USB_DEVICE_ID_LOGITECH_G25_WHEEL      0xc299
+ #define USB_DEVICE_ID_LOGITECH_ELITE_KBD      0xc30a
+ #define USB_DEVICE_ID_S510_RECEIVER   0xc50c
+ #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/hid-lg.c linux-2.6.30-rc4-git/drivers/hid/hid-lg.c
+--- linux-2.6.30-rc4/drivers/hid/hid-lg.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/hid-lg.c  2009-05-13 09:46:19.000000000 +0200
+@@ -297,6 +297,8 @@ static const struct hid_device_id lg_dev
+               .driver_data = LG_FF },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2),
+               .driver_data = LG_FF },
++      { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL),
++              .driver_data = LG_FF },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
+               .driver_data = LG_FF2 },
+       { }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/hidraw.c linux-2.6.30-rc4-git/drivers/hid/hidraw.c
+--- linux-2.6.30-rc4/drivers/hid/hidraw.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/hidraw.c  2009-05-13 09:46:19.000000000 +0200
+@@ -285,8 +285,10 @@ static long hidraw_ioctl(struct file *fi
+                               if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
+                                       int len;
+-                                      if (!hid->name)
+-                                              return 0;
++                                      if (!hid->name) {
++                                              ret = 0;
++                                              break;
++                                      }
+                                       len = strlen(hid->name) + 1;
+                                       if (len > _IOC_SIZE(cmd))
+                                               len = _IOC_SIZE(cmd);
+@@ -297,8 +299,10 @@ static long hidraw_ioctl(struct file *fi
+                               if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
+                                       int len;
+-                                      if (!hid->phys)
+-                                              return 0;
++                                      if (!hid->phys) {
++                                              ret = 0;
++                                              break;
++                                      }
+                                       len = strlen(hid->phys) + 1;
+                                       if (len > _IOC_SIZE(cmd))
+                                               len = _IOC_SIZE(cmd);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/hid/usbhid/hid-core.c linux-2.6.30-rc4-git/drivers/hid/usbhid/hid-core.c
+--- linux-2.6.30-rc4/drivers/hid/usbhid/hid-core.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/hid/usbhid/hid-core.c 2009-05-13 09:46:19.000000000 +0200
+@@ -662,8 +662,8 @@ void usbhid_close(struct hid_device *hid
+       spin_lock_irq(&usbhid->lock);
+       if (!--hid->open) {
+               spin_unlock_irq(&usbhid->lock);
++              hid_cancel_delayed_stuff(usbhid);
+               usb_kill_urb(usbhid->urbin);
+-              flush_scheduled_work();
+               usbhid->intf->needs_remote_wakeup = 0;
+       } else {
+               spin_unlock_irq(&usbhid->lock);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/ide/ide-cd.c linux-2.6.30-rc4-git/drivers/ide/ide-cd.c
+--- linux-2.6.30-rc4/drivers/ide/ide-cd.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/ide/ide-cd.c  2009-05-13 09:46:19.000000000 +0200
+@@ -312,7 +312,6 @@ static int cdrom_decode_status(ide_drive
+       ide_hwif_t *hwif = drive->hwif;
+       struct request *rq = hwif->rq;
+       int err, sense_key, do_end_request = 0;
+-      u8 quiet = rq->cmd_flags & REQ_QUIET;
+       /* get the IDE error register */
+       err = ide_read_error(drive);
+@@ -347,7 +346,7 @@ static int cdrom_decode_status(ide_drive
+               } else {
+                       cdrom_saw_media_change(drive);
+-                      if (blk_fs_request(rq) && !quiet)
++                      if (blk_fs_request(rq) && !blk_rq_quiet(rq))
+                               printk(KERN_ERR PFX "%s: tray open\n",
+                                       drive->name);
+               }
+@@ -382,7 +381,7 @@ static int cdrom_decode_status(ide_drive
+                * No point in retrying after an illegal request or data
+                * protect error.
+                */
+-              if (!quiet)
++              if (!blk_rq_quiet(rq))
+                       ide_dump_status(drive, "command error", stat);
+               do_end_request = 1;
+               break;
+@@ -391,14 +390,14 @@ static int cdrom_decode_status(ide_drive
+                * No point in re-trying a zillion times on a bad sector.
+                * If we got here the error is not correctable.
+                */
+-              if (!quiet)
++              if (!blk_rq_quiet(rq))
+                       ide_dump_status(drive, "media error "
+                                       "(bad sector)", stat);
+               do_end_request = 1;
+               break;
+       case BLANK_CHECK:
+               /* disk appears blank? */
+-              if (!quiet)
++              if (!blk_rq_quiet(rq))
+                       ide_dump_status(drive, "media error (blank)",
+                                       stat);
+               do_end_request = 1;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/infiniband/ulp/iser/iscsi_iser.c linux-2.6.30-rc4-git/drivers/infiniband/ulp/iser/iscsi_iser.c
+--- linux-2.6.30-rc4/drivers/infiniband/ulp/iser/iscsi_iser.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/infiniband/ulp/iser/iscsi_iser.c      2009-05-13 09:46:19.000000000 +0200
+@@ -599,6 +599,7 @@ static struct scsi_host_template iscsi_i
+       .eh_abort_handler       = iscsi_eh_abort,
+       .eh_device_reset_handler= iscsi_eh_device_reset,
+       .eh_target_reset_handler= iscsi_eh_target_reset,
++      .target_alloc           = iscsi_target_alloc,
+       .use_clustering         = DISABLE_CLUSTERING,
+       .proc_name              = "iscsi_iser",
+       .this_id                = -1,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/input.c linux-2.6.30-rc4-git/drivers/input/input.c
+--- linux-2.6.30-rc4/drivers/input/input.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/input.c 2009-05-13 09:46:19.000000000 +0200
+@@ -29,6 +29,23 @@ MODULE_LICENSE("GPL");
+ #define INPUT_DEVICES 256
++/*
++ * EV_ABS events which should not be cached are listed here.
++ */
++static unsigned int input_abs_bypass_init_data[] __initdata = {
++      ABS_MT_TOUCH_MAJOR,
++      ABS_MT_TOUCH_MINOR,
++      ABS_MT_WIDTH_MAJOR,
++      ABS_MT_WIDTH_MINOR,
++      ABS_MT_ORIENTATION,
++      ABS_MT_POSITION_X,
++      ABS_MT_POSITION_Y,
++      ABS_MT_TOOL_TYPE,
++      ABS_MT_BLOB_ID,
++      0
++};
++static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
++
+ static LIST_HEAD(input_dev_list);
+ static LIST_HEAD(input_handler_list);
+@@ -161,6 +178,10 @@ static void input_handle_event(struct in
+                               disposition = INPUT_PASS_TO_HANDLERS;
+                       }
+                       break;
++              case SYN_MT_REPORT:
++                      dev->sync = 0;
++                      disposition = INPUT_PASS_TO_HANDLERS;
++                      break;
+               }
+               break;
+@@ -192,6 +213,11 @@ static void input_handle_event(struct in
+       case EV_ABS:
+               if (is_event_supported(code, dev->absbit, ABS_MAX)) {
++                      if (test_bit(code, input_abs_bypass)) {
++                              disposition = INPUT_PASS_TO_HANDLERS;
++                              break;
++                      }
++
+                       value = input_defuzz_abs_event(value,
+                                       dev->abs[code], dev->absfuzz[code]);
+@@ -1634,10 +1660,20 @@ static const struct file_operations inpu
+       .open = input_open_file,
+ };
++static void __init input_init_abs_bypass(void)
++{
++      const unsigned int *p;
++
++      for (p = input_abs_bypass_init_data; *p; p++)
++              input_abs_bypass[BIT_WORD(*p)] |= BIT_MASK(*p);
++}
++
+ static int __init input_init(void)
+ {
+       int err;
++      input_init_abs_bypass();
++
+       err = class_register(&input_class);
+       if (err) {
+               printk(KERN_ERR "input: unable to register input_dev class\n");
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/keyboard/omap-keypad.c linux-2.6.30-rc4-git/drivers/input/keyboard/omap-keypad.c
+--- linux-2.6.30-rc4/drivers/input/keyboard/omap-keypad.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/keyboard/omap-keypad.c  2009-05-13 09:46:19.000000000 +0200
+@@ -100,8 +100,20 @@ static irqreturn_t omap_kp_interrupt(int
+       /* disable keyboard interrupt and schedule for handling */
+       if (cpu_is_omap24xx()) {
+               int i;
+-              for (i = 0; i < omap_kp->rows; i++)
+-                      disable_irq(gpio_to_irq(row_gpios[i]));
++
++              for (i = 0; i < omap_kp->rows; i++) {
++                      int gpio_irq = gpio_to_irq(row_gpios[i]);
++                      /*
++                       * The interrupt which we're currently handling should
++                       * be disabled _nosync() to avoid deadlocks waiting
++                       * for this handler to complete.  All others should
++                       * be disabled the regular way for SMP safety.
++                       */
++                      if (gpio_irq == irq)
++                              disable_irq_nosync(gpio_irq);
++                      else
++                              disable_irq(gpio_irq);
++              }
+       } else
+               /* disable keyboard interrupt and schedule for handling */
+               omap_writew(1, OMAP_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/alps.c linux-2.6.30-rc4-git/drivers/input/mouse/alps.c
+--- linux-2.6.30-rc4/drivers/input/mouse/alps.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/alps.c    2009-05-13 09:46:19.000000000 +0200
+@@ -37,6 +37,7 @@
+ #define ALPS_FW_BK_2  0x40
+ static const struct alps_model_info alps_model_data[] = {
++      { { 0x32, 0x02, 0x14 }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */
+       { { 0x33, 0x02, 0x0a }, 0x88, 0xf8, ALPS_OLDPROTO },            /* UMAX-530T */
+       { { 0x53, 0x02, 0x0a }, 0xf8, 0xf8, 0 },
+       { { 0x53, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/appletouch.c linux-2.6.30-rc4-git/drivers/input/mouse/appletouch.c
+--- linux-2.6.30-rc4/drivers/input/mouse/appletouch.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/appletouch.c      2009-05-13 09:46:19.000000000 +0200
+@@ -255,15 +255,22 @@ MODULE_PARM_DESC(debug, "Activate debugg
+  */
+ static int atp_geyser_init(struct usb_device *udev)
+ {
+-      char data[8];
++      char *data;
+       int size;
+       int i;
++      int ret;
++
++      data = kmalloc(8, GFP_KERNEL);
++      if (!data) {
++              err("Out of memory");
++              return -ENOMEM;
++      }
+       size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+                       ATP_GEYSER_MODE_READ_REQUEST_ID,
+                       USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+                       ATP_GEYSER_MODE_REQUEST_VALUE,
+-                      ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
++                      ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
+       if (size != 8) {
+               dprintk("atp_geyser_init: read error\n");
+@@ -271,7 +278,8 @@ static int atp_geyser_init(struct usb_de
+                       dprintk("appletouch[%d]: %d\n", i, data[i]);
+               err("Failed to read mode from device.");
+-              return -EIO;
++              ret = -EIO;
++              goto out_free;
+       }
+       /* Apply the mode switch */
+@@ -281,7 +289,7 @@ static int atp_geyser_init(struct usb_de
+                       ATP_GEYSER_MODE_WRITE_REQUEST_ID,
+                       USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+                       ATP_GEYSER_MODE_REQUEST_VALUE,
+-                      ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
++                      ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
+       if (size != 8) {
+               dprintk("atp_geyser_init: write error\n");
+@@ -289,9 +297,13 @@ static int atp_geyser_init(struct usb_de
+                       dprintk("appletouch[%d]: %d\n", i, data[i]);
+               err("Failed to request geyser raw mode");
+-              return -EIO;
++              ret = -EIO;
++              goto out_free;
+       }
+-      return 0;
++      ret = 0;
++out_free:
++      kfree(data);
++      return ret;
+ }
+ /*
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/bcm5974.c linux-2.6.30-rc4-git/drivers/input/mouse/bcm5974.c
+--- linux-2.6.30-rc4/drivers/input/mouse/bcm5974.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/bcm5974.c 2009-05-13 09:46:19.000000000 +0200
+@@ -51,6 +51,10 @@
+ #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI  0x0230
+ #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO   0x0231
+ #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS   0x0232
++/* Macbook5,1 (unibody), aka wellspring3 */
++#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI  0x0236
++#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO   0x0237
++#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS   0x0238
+ #define BCM5974_DEVICE(prod) {                                        \
+       .match_flags = (USB_DEVICE_ID_MATCH_DEVICE |            \
+@@ -72,6 +76,10 @@ static const struct usb_device_id bcm597
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS),
++      /* Macbook5,1 */
++      BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
++      BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
++      BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
+       /* Terminating entry */
+       {}
+ };
+@@ -96,14 +104,23 @@ struct bt_data {
+       u8 rel_y;               /* relative y coordinate */
+ };
+-/* trackpad header structure */
+-struct tp_header {
+-      u8 unknown1[16];        /* constants, timers, etc */
+-      u8 fingers;             /* number of fingers on trackpad */
+-      u8 unknown2[9];         /* constants, timers, etc */
++/* trackpad header types */
++enum tp_type {
++      TYPE1,                  /* plain trackpad */
++      TYPE2                   /* button integrated in trackpad */
+ };
+-/* trackpad finger structure */
++/* trackpad finger data offsets, le16-aligned */
++#define FINGER_TYPE1          (13 * sizeof(__le16))
++#define FINGER_TYPE2          (15 * sizeof(__le16))
++
++/* trackpad button data offsets */
++#define BUTTON_TYPE2          15
++
++/* list of device capability bits */
++#define HAS_INTEGRATED_BUTTON 1
++
++/* trackpad finger structure, le16-aligned */
+ struct tp_finger {
+       __le16 origin;          /* zero when switching track finger */
+       __le16 abs_x;           /* absolute x coodinate */
+@@ -117,13 +134,11 @@ struct tp_finger {
+       __le16 force_minor;     /* trackpad force, minor axis? */
+       __le16 unused[3];       /* zeros */
+       __le16 multi;           /* one finger: varies, more fingers: constant */
+-};
++} __attribute__((packed,aligned(2)));
+-/* trackpad data structure, empirically at least ten fingers */
+-struct tp_data {
+-      struct tp_header header;
+-      struct tp_finger finger[16];
+-};
++/* trackpad finger data size, empirically at least ten fingers */
++#define SIZEOF_FINGER         sizeof(struct tp_finger)
++#define SIZEOF_ALL_FINGERS    (16 * SIZEOF_FINGER)
+ /* device-specific parameters */
+ struct bcm5974_param {
+@@ -136,9 +151,12 @@ struct bcm5974_param {
+ /* device-specific configuration */
+ struct bcm5974_config {
+       int ansi, iso, jis;     /* the product id of this device */
++      int caps;               /* device capability bitmask */
+       int bt_ep;              /* the endpoint of the button interface */
+       int bt_datalen;         /* data length of the button interface */
+       int tp_ep;              /* the endpoint of the trackpad interface */
++      enum tp_type tp_type;   /* type of trackpad interface */
++      int tp_offset;          /* offset to trackpad finger data */
+       int tp_datalen;         /* data length of the trackpad interface */
+       struct bcm5974_param p; /* finger pressure limits */
+       struct bcm5974_param w; /* finger width limits */
+@@ -158,7 +176,7 @@ struct bcm5974 {
+       struct urb *bt_urb;             /* button usb request block */
+       struct bt_data *bt_data;        /* button transferred data */
+       struct urb *tp_urb;             /* trackpad usb request block */
+-      struct tp_data *tp_data;        /* trackpad transferred data */
++      u8 *tp_data;                    /* trackpad transferred data */
+       int fingers;                    /* number of fingers on trackpad */
+ };
+@@ -183,8 +201,9 @@ static const struct bcm5974_config bcm59
+               USB_DEVICE_ID_APPLE_WELLSPRING_ANSI,
+               USB_DEVICE_ID_APPLE_WELLSPRING_ISO,
+               USB_DEVICE_ID_APPLE_WELLSPRING_JIS,
++              0,
+               0x84, sizeof(struct bt_data),
+-              0x81, sizeof(struct tp_data),
++              0x81, TYPE1, FINGER_TYPE1, FINGER_TYPE1 + SIZEOF_ALL_FINGERS,
+               { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 },
+               { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
+               { DIM_X, DIM_X / SN_COORD, -4824, 5342 },
+@@ -194,13 +213,26 @@ static const struct bcm5974_config bcm59
+               USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI,
+               USB_DEVICE_ID_APPLE_WELLSPRING2_ISO,
+               USB_DEVICE_ID_APPLE_WELLSPRING2_JIS,
++              0,
+               0x84, sizeof(struct bt_data),
+-              0x81, sizeof(struct tp_data),
++              0x81, TYPE1, FINGER_TYPE1, FINGER_TYPE1 + SIZEOF_ALL_FINGERS,
+               { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 },
+               { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
+               { DIM_X, DIM_X / SN_COORD, -4824, 4824 },
+               { DIM_Y, DIM_Y / SN_COORD, -172, 4290 }
+       },
++      {
++              USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI,
++              USB_DEVICE_ID_APPLE_WELLSPRING3_ISO,
++              USB_DEVICE_ID_APPLE_WELLSPRING3_JIS,
++              HAS_INTEGRATED_BUTTON,
++              0x84, sizeof(struct bt_data),
++              0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
++              { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
++              { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
++              { DIM_X, DIM_X / SN_COORD, -4460, 5166 },
++              { DIM_Y, DIM_Y / SN_COORD, -75, 6700 }
++      },
+       {}
+ };
+@@ -257,6 +289,7 @@ static void setup_events_to_report(struc
+       __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+       __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+       __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
++      __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
+       __set_bit(BTN_LEFT, input_dev->keybit);
+ }
+@@ -266,6 +299,11 @@ static int report_bt_state(struct bcm597
+       if (size != sizeof(struct bt_data))
+               return -EIO;
++      dprintk(7,
++              "bcm5974: button data: %x %x %x %x\n",
++              dev->bt_data->unknown1, dev->bt_data->button,
++              dev->bt_data->rel_x, dev->bt_data->rel_y);
++
+       input_report_key(dev->input, BTN_LEFT, dev->bt_data->button);
+       input_sync(dev->input);
+@@ -276,29 +314,37 @@ static int report_bt_state(struct bcm597
+ static int report_tp_state(struct bcm5974 *dev, int size)
+ {
+       const struct bcm5974_config *c = &dev->cfg;
+-      const struct tp_finger *f = dev->tp_data->finger;
++      const struct tp_finger *f;
+       struct input_dev *input = dev->input;
+-      const int fingers = (size - 26) / 28;
+-      int raw_p, raw_w, raw_x, raw_y;
+-      int ptest = 0, origin = 0, nmin = 0, nmax = 0;
++      int raw_p, raw_w, raw_x, raw_y, raw_n;
++      int ptest = 0, origin = 0, ibt = 0, nmin = 0, nmax = 0;
+       int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0;
+-      if (size < 26 || (size - 26) % 28 != 0)
++      if (size < c->tp_offset || (size - c->tp_offset) % SIZEOF_FINGER != 0)
+               return -EIO;
++      /* finger data, le16-aligned */
++      f = (const struct tp_finger *)(dev->tp_data + c->tp_offset);
++      raw_n = (size - c->tp_offset) / SIZEOF_FINGER;
++
+       /* always track the first finger; when detached, start over */
+-      if (fingers) {
++      if (raw_n) {
+               raw_p = raw2int(f->force_major);
+               raw_w = raw2int(f->size_major);
+               raw_x = raw2int(f->abs_x);
+               raw_y = raw2int(f->abs_y);
+               dprintk(9,
+-                      "bcm5974: raw: p: %+05d w: %+05d x: %+05d y: %+05d\n",
+-                      raw_p, raw_w, raw_x, raw_y);
++                      "bcm5974: "
++                      "raw: p: %+05d w: %+05d x: %+05d y: %+05d n: %d\n",
++                      raw_p, raw_w, raw_x, raw_y, raw_n);
+               ptest = int2bound(&c->p, raw_p);
+               origin = raw2int(f->origin);
++
++              /* set the integrated button if applicable */
++              if (c->tp_type == TYPE2)
++                      ibt = raw2int(dev->tp_data[BUTTON_TYPE2]);
+       }
+       /* while tracking finger still valid, count all fingers */
+@@ -307,12 +353,13 @@ static int report_tp_state(struct bcm597
+               abs_w = int2bound(&c->w, raw_w);
+               abs_x = int2bound(&c->x, raw_x - c->x.devmin);
+               abs_y = int2bound(&c->y, c->y.devmax - raw_y);
+-              for (; f != dev->tp_data->finger + fingers; f++) {
++              while (raw_n--) {
+                       ptest = int2bound(&c->p, raw2int(f->force_major));
+                       if (ptest > PRESSURE_LOW)
+                               nmax++;
+                       if (ptest > PRESSURE_HIGH)
+                               nmin++;
++                      f++;
+               }
+       }
+@@ -324,7 +371,8 @@ static int report_tp_state(struct bcm597
+       input_report_key(input, BTN_TOUCH, dev->fingers > 0);
+       input_report_key(input, BTN_TOOL_FINGER, dev->fingers == 1);
+       input_report_key(input, BTN_TOOL_DOUBLETAP, dev->fingers == 2);
+-      input_report_key(input, BTN_TOOL_TRIPLETAP, dev->fingers > 2);
++      input_report_key(input, BTN_TOOL_TRIPLETAP, dev->fingers == 3);
++      input_report_key(input, BTN_TOOL_QUADTAP, dev->fingers > 3);
+       input_report_abs(input, ABS_PRESSURE, abs_p);
+       input_report_abs(input, ABS_TOOL_WIDTH, abs_w);
+@@ -335,11 +383,15 @@ static int report_tp_state(struct bcm597
+               dprintk(8,
+                       "bcm5974: abs: p: %+05d w: %+05d x: %+05d y: %+05d "
+-                      "nmin: %d nmax: %d n: %d\n",
+-                      abs_p, abs_w, abs_x, abs_y, nmin, nmax, dev->fingers);
++                      "nmin: %d nmax: %d n: %d ibt: %d\n", abs_p, abs_w,
++                      abs_x, abs_y, nmin, nmax, dev->fingers, ibt);
+       }
++      /* type 2 reports button events via ibt only */
++      if (c->tp_type == TYPE2)
++              input_report_key(input, BTN_LEFT, ibt);
++
+       input_sync(input);
+       return 0;
+@@ -649,6 +701,8 @@ static int bcm5974_probe(struct usb_inte
+       input_dev->name = "bcm5974";
+       input_dev->phys = dev->phys;
+       usb_to_input_id(dev->udev, &input_dev->id);
++      /* report driver capabilities via the version field */
++      input_dev->id.version = cfg->caps;
+       input_dev->dev.parent = &iface->dev;
+       input_set_drvdata(input_dev, dev);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/elantech.c linux-2.6.30-rc4-git/drivers/input/mouse/elantech.c
+--- linux-2.6.30-rc4/drivers/input/mouse/elantech.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/elantech.c        2009-05-13 09:46:19.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+- * Elantech Touchpad driver (v5)
++ * Elantech Touchpad driver (v6)
+  *
+- * Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
++ * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
+  *
+  * 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
+@@ -178,6 +178,7 @@ static void elantech_report_absolute_v1(
+       struct elantech_data *etd = psmouse->private;
+       unsigned char *packet = psmouse->packet;
+       int fingers;
++      static int old_fingers;
+       if (etd->fw_version_maj == 0x01) {
+               /* byte 0:  D   U  p1  p2   1  p3   R   L
+@@ -190,6 +191,14 @@ static void elantech_report_absolute_v1(
+               fingers = (packet[0] & 0xc0) >> 6;
+       }
++      if (etd->jumpy_cursor) {
++              /* Discard packets that are likely to have bogus coordinates */
++              if (fingers > old_fingers) {
++                      elantech_debug("elantech.c: discarding packet\n");
++                      goto discard_packet_v1;
++              }
++      }
++
+       input_report_key(dev, BTN_TOUCH, fingers != 0);
+       /* byte 2: x7  x6  x5  x4  x3  x2  x1  x0
+@@ -216,6 +225,9 @@ static void elantech_report_absolute_v1(
+       }
+       input_sync(dev);
++
++ discard_packet_v1:
++      old_fingers = fingers;
+ }
+ /*
+@@ -363,9 +375,14 @@ static int elantech_set_absolute_mode(st
+                       rc = -1;
+                       break;
+               }
++      }
++
++      if (rc == 0) {
+               /*
+-               * Read back reg 0x10. The touchpad is probably initalising
+-               * and not ready until we read back the value we just wrote.
++               * Read back reg 0x10. For hardware version 1 we must make
++               * sure the absolute mode bit is set. For hardware version 2
++               * the touchpad is probably initalising and not ready until
++               * we read back the value we just wrote.
+                */
+               do {
+                       rc = elantech_read_reg(psmouse, 0x10, &val);
+@@ -373,12 +390,18 @@ static int elantech_set_absolute_mode(st
+                               break;
+                       tries--;
+                       elantech_debug("elantech.c: retrying read (%d).\n",
+-                              tries);
++                                      tries);
+                       msleep(ETP_READ_BACK_DELAY);
+               } while (tries > 0);
+-              if (rc)
++
++              if (rc) {
+                       pr_err("elantech.c: failed to read back register 0x10.\n");
+-              break;
++              } else if (etd->hw_version == 1 &&
++                         !(val & ETP_R10_ABSOLUTE_MODE)) {
++                      pr_err("elantech.c: touchpad refuses "
++                              "to switch to absolute mode.\n");
++                      rc = -1;
++              }
+       }
+       if (rc)
+@@ -662,6 +685,17 @@ int elantech_init(struct psmouse *psmous
+               param[0], param[1], param[2]);
+       etd->capabilities = param[0];
++      /*
++       * This firmware seems to suffer from misreporting coordinates when
++       * a touch action starts causing the mouse cursor or scrolled page
++       * to jump. Enable a workaround.
++       */
++      if (etd->fw_version_maj == 0x02 && etd->fw_version_min == 0x22) {
++              pr_info("elantech.c: firmware version 2.34 detected, "
++                      "enabling jumpy cursor workaround\n");
++              etd->jumpy_cursor = 1;
++      }
++
+       if (elantech_set_absolute_mode(psmouse)) {
+               pr_err("elantech.c: failed to put touchpad into absolute mode.\n");
+               goto init_fail;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/elantech.h linux-2.6.30-rc4-git/drivers/input/mouse/elantech.h
+--- linux-2.6.30-rc4/drivers/input/mouse/elantech.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/elantech.h        2009-05-13 09:46:19.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+- * Elantech Touchpad driver (v5)
++ * Elantech Touchpad driver (v6)
+  *
+- * Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
++ * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
+  *
+  * 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
+@@ -104,6 +104,7 @@ struct elantech_data {
+       unsigned char fw_version_min;
+       unsigned char hw_version;
+       unsigned char paritycheck;
++      unsigned char jumpy_cursor;
+       unsigned char parity[256];
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/mouse/lifebook.c linux-2.6.30-rc4-git/drivers/input/mouse/lifebook.c
+--- linux-2.6.30-rc4/drivers/input/mouse/lifebook.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/mouse/lifebook.c        2009-05-13 09:46:19.000000000 +0200
+@@ -61,6 +61,12 @@ static const struct dmi_system_id lifebo
+               },
+       },
+       {
++              .ident = "Lifebook B-2130",
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "ZEPHYR"),
++              },
++      },
++      {
+               .ident = "Lifebook B213x/B2150",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B2131/B2133/B2150"),
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/serio/sa1111ps2.c linux-2.6.30-rc4-git/drivers/input/serio/sa1111ps2.c
+--- linux-2.6.30-rc4/drivers/input/serio/sa1111ps2.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/serio/sa1111ps2.c       2009-05-13 09:46:19.000000000 +0200
+@@ -77,7 +77,7 @@ static irqreturn_t ps2_txint(int irq, vo
+       spin_lock(&ps2if->lock);
+       status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
+       if (ps2if->head == ps2if->tail) {
+-              disable_irq(irq);
++              disable_irq_nosync(irq);
+               /* done */
+       } else if (status & PS2STAT_TXE) {
+               sa1111_writel(ps2if->buf[ps2if->tail], ps2if->base + SA1111_PS2DATA);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/tablet/wacom.h linux-2.6.30-rc4-git/drivers/input/tablet/wacom.h
+--- linux-2.6.30-rc4/drivers/input/tablet/wacom.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/tablet/wacom.h  2009-05-13 09:46:19.000000000 +0200
+@@ -11,7 +11,7 @@
+  *  Copyright (c) 2000 Daniel Egger           <egger@suse.de>
+  *  Copyright (c) 2001 Frederic Lepied                <flepied@mandrakesoft.com>
+  *  Copyright (c) 2004 Panagiotis Issaris     <panagiotis.issaris@mech.kuleuven.ac.be>
+- *  Copyright (c) 2002-2008 Ping Cheng                <pingc@wacom.com>
++ *  Copyright (c) 2002-2009 Ping Cheng                <pingc@wacom.com>
+  *
+  *  ChangeLog:
+  *      v0.1 (vp)  - Initial release
+@@ -67,6 +67,7 @@
+  *      v1.47 (pc) - Added support for Bamboo
+  *      v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
+  *      v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A)
++ *      v1.50 (pc) - Fixed a TabletPC touch bug in 2.6.28
+  */
+ /*
+@@ -87,7 +88,7 @@
+ /*
+  * Version Information
+  */
+-#define DRIVER_VERSION "v1.49"
++#define DRIVER_VERSION "v1.50"
+ #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
+ #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
+ #define DRIVER_LICENSE "GPL"
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/tablet/wacom_sys.c linux-2.6.30-rc4-git/drivers/input/tablet/wacom_sys.c
+--- linux-2.6.30-rc4/drivers/input/tablet/wacom_sys.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/tablet/wacom_sys.c      2009-05-13 09:46:19.000000000 +0200
+@@ -289,6 +289,7 @@ static int wacom_parse_hid(struct usb_in
+                       5000); /* 5 secs */
+       } while (result < 0 && limit++ < 5);
++      /* No need to parse the Descriptor. It isn't an error though */
+       if (result < 0)
+               goto out;
+@@ -368,9 +369,8 @@ static int wacom_parse_hid(struct usb_in
+               }
+       }
+-      result = 0;
+-
+  out:
++      result = 0;
+       kfree(report);
+       return result;
+ }
+@@ -425,6 +425,15 @@ static int wacom_probe(struct usb_interf
+       endpoint = &intf->cur_altsetting->endpoint[0].desc;
++      /* Initialize touch_x_max and touch_y_max in case it is not defined */
++      if (wacom_wac->features->type == TABLETPC) {
++              features->touch_x_max = 1023;
++              features->touch_y_max = 1023;
++      } else {
++              features->touch_x_max = 0;
++              features->touch_y_max = 0;
++      }
++
+       /* TabletPC need to retrieve the physical and logical maximum from report descriptor */
+       if (wacom_wac->features->type == TABLETPC) {
+               if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/touchscreen/tsc2007.c linux-2.6.30-rc4-git/drivers/input/touchscreen/tsc2007.c
+--- linux-2.6.30-rc4/drivers/input/touchscreen/tsc2007.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/touchscreen/tsc2007.c   2009-05-13 09:46:19.000000000 +0200
+@@ -235,7 +235,7 @@ static irqreturn_t tsc2007_irq(int irq, 
+       spin_lock_irqsave(&ts->lock, flags);
+       if (likely(ts->get_pendown_state())) {
+-              disable_irq(ts->irq);
++              disable_irq_nosync(ts->irq);
+               hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
+                                       HRTIMER_MODE_REL);
+       }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/input/touchscreen/ucb1400_ts.c linux-2.6.30-rc4-git/drivers/input/touchscreen/ucb1400_ts.c
+--- linux-2.6.30-rc4/drivers/input/touchscreen/ucb1400_ts.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/input/touchscreen/ucb1400_ts.c        2009-05-13 09:46:19.000000000 +0200
+@@ -256,7 +256,7 @@ static irqreturn_t ucb1400_hard_irq(int 
+       struct ucb1400_ts *ucb = devid;
+       if (irqnr == ucb->irq) {
+-              disable_irq(ucb->irq);
++              disable_irq_nosync(ucb->irq);
+               ucb->irq_pending = 1;
+               wake_up(&ucb->ts_wait);
+               return IRQ_HANDLED;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/media/video/Kconfig linux-2.6.30-rc4-git/drivers/media/video/Kconfig
+--- linux-2.6.30-rc4/drivers/media/video/Kconfig       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/media/video/Kconfig   2009-05-13 09:46:19.000000000 +0200
+@@ -758,10 +758,14 @@ config VIDEO_MX1
+       ---help---
+         This is a v4l2 driver for the i.MX1/i.MXL CMOS Sensor Interface
++config MX3_VIDEO
++      bool
++
+ config VIDEO_MX3
+       tristate "i.MX3x Camera Sensor Interface driver"
+       depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA
+       select VIDEOBUF_DMA_CONTIG
++      select MX3_VIDEO
+       ---help---
+         This is a v4l2 driver for the i.MX3x Camera Sensor Interface
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/mmc/host/Kconfig linux-2.6.30-rc4-git/drivers/mmc/host/Kconfig
+--- linux-2.6.30-rc4/drivers/mmc/host/Kconfig  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/mmc/host/Kconfig      2009-05-13 09:46:19.000000000 +0200
+@@ -155,7 +155,7 @@ config MMC_ATMELMCI_DMA
+ config MMC_IMX
+       tristate "Motorola i.MX Multimedia Card Interface support"
+-      depends on ARCH_IMX
++      depends on ARCH_MX1
+       help
+         This selects the Motorola i.MX Multimedia card Interface.
+         If you have a i.MX platform with a Multimedia Card slot,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/mmc/host/omap.c linux-2.6.30-rc4-git/drivers/mmc/host/omap.c
+--- linux-2.6.30-rc4/drivers/mmc/host/omap.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/mmc/host/omap.c       2009-05-13 09:46:19.000000000 +0200
+@@ -157,8 +157,6 @@ struct mmc_omap_host {
+       struct timer_list       dma_timer;
+       unsigned                dma_len;
+-      short                   power_pin;
+-
+       struct mmc_omap_slot    *slots[OMAP_MMC_MAX_SLOTS];
+       struct mmc_omap_slot    *current_slot;
+       spinlock_t              slot_lock;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_aux.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_aux.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_aux.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_aux.c  2009-05-13 09:46:19.000000000 +0200
+@@ -97,9 +97,7 @@ static void __init zfcp_init_device_conf
+       ccw_device_set_online(adapter->ccw_device);
+       zfcp_erp_wait(adapter);
+-      wait_event(adapter->erp_done_wqh,
+-                 !(atomic_read(&unit->status) &
+-                              ZFCP_STATUS_UNIT_SCSI_WORK_PENDING));
++      flush_work(&unit->scsi_work);
+       down(&zfcp_data.config_sema);
+       zfcp_unit_put(unit);
+@@ -279,6 +277,7 @@ struct zfcp_unit *zfcp_unit_enqueue(stru
+       atomic_set(&unit->refcount, 0);
+       init_waitqueue_head(&unit->remove_wq);
++      INIT_WORK(&unit->scsi_work, zfcp_scsi_scan);
+       unit->port = port;
+       unit->fcp_lun = fcp_lun;
+@@ -525,6 +524,8 @@ int zfcp_adapter_enqueue(struct ccw_devi
+       atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
++      zfcp_fc_nameserver_init(adapter);
++
+       if (!zfcp_adapter_scsi_register(adapter))
+               return 0;
+@@ -553,7 +554,6 @@ void zfcp_adapter_dequeue(struct zfcp_ad
+       cancel_work_sync(&adapter->scan_work);
+       cancel_work_sync(&adapter->stat_work);
+-      cancel_delayed_work_sync(&adapter->nsp.work);
+       zfcp_adapter_scsi_unregister(adapter);
+       sysfs_remove_group(&adapter->ccw_device->dev.kobj,
+                          &zfcp_sysfs_adapter_attrs);
+@@ -671,8 +671,7 @@ void zfcp_port_dequeue(struct zfcp_port 
+       list_del(&port->list);
+       write_unlock_irq(&zfcp_data.config_lock);
+       if (port->rport)
+-              fc_remote_port_delete(port->rport);
+-      port->rport = NULL;
++              port->rport->dd_data = NULL;
+       zfcp_adapter_put(port->adapter);
+       sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);
+       device_unregister(&port->sysfs_device);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_ccw.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_ccw.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_ccw.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_ccw.c  2009-05-13 09:46:19.000000000 +0200
+@@ -108,7 +108,6 @@ static int zfcp_ccw_set_online(struct cc
+       /* initialize request counter */
+       BUG_ON(!zfcp_reqlist_isempty(adapter));
+       adapter->req_no = 0;
+-      zfcp_fc_nameserver_init(adapter);
+       zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
+                                      ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_cfdc.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_cfdc.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_cfdc.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_cfdc.c 2009-05-13 09:46:19.000000000 +0200
+@@ -4,7 +4,7 @@
+  * Userspace interface for accessing the
+  * Access Control Lists / Control File Data Channel
+  *
+- * Copyright IBM Corporation 2008
++ * Copyright IBM Corporation 2008, 2009
+  */
+ #define KMSG_COMPONENT "zfcp"
+@@ -197,6 +197,7 @@ static long zfcp_cfdc_dev_ioctl(struct f
+               retval = -ENXIO;
+               goto free_buffer;
+       }
++      zfcp_adapter_get(adapter);
+       retval = zfcp_cfdc_sg_setup(data->command, fsf_cfdc->sg,
+                                   data_user->control_file);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_def.h linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_def.h
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_def.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_def.h  2009-05-13 09:46:19.000000000 +0200
+@@ -255,7 +255,6 @@ enum zfcp_wka_status {
+ /* logical unit status */
+ #define ZFCP_STATUS_UNIT_SHARED                       0x00000004
+ #define ZFCP_STATUS_UNIT_READONLY             0x00000008
+-#define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING    0x00000020
+ /* FSF request status (this does not have a common part) */
+ #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT    0x00000002
+@@ -530,6 +529,7 @@ struct zfcp_unit {
+       struct zfcp_erp_action erp_action;     /* pending error recovery */
+         atomic_t               erp_counter;
+       struct zfcp_latencies   latencies;
++      struct work_struct      scsi_work;
+ };
+ /* FSF request */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_erp.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_erp.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_erp.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_erp.c  2009-05-13 09:46:19.000000000 +0200
+@@ -719,6 +719,7 @@ static void zfcp_erp_adapter_strategy_cl
+       zfcp_qdio_close(adapter);
+       zfcp_fsf_req_dismiss_all(adapter);
+       adapter->fsf_req_seq_no = 0;
++      zfcp_fc_wka_port_force_offline(&adapter->nsp);
+       /* all ports and units are closed */
+       zfcp_erp_modify_adapter_status(adapter, "erascl1", NULL,
+                                      ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
+@@ -1176,48 +1177,6 @@ static void zfcp_erp_action_dequeue(stru
+       }
+ }
+-struct zfcp_erp_add_work {
+-      struct zfcp_unit  *unit;
+-      struct work_struct work;
+-};
+-
+-static void zfcp_erp_scsi_scan(struct work_struct *work)
+-{
+-      struct zfcp_erp_add_work *p =
+-              container_of(work, struct zfcp_erp_add_work, work);
+-      struct zfcp_unit *unit = p->unit;
+-      struct fc_rport *rport = unit->port->rport;
+-
+-      if (rport && rport->port_state == FC_PORTSTATE_ONLINE)
+-              scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
+-                       scsilun_to_int((struct scsi_lun *)&unit->fcp_lun), 0);
+-      atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
+-      zfcp_unit_put(unit);
+-      wake_up(&unit->port->adapter->erp_done_wqh);
+-      kfree(p);
+-}
+-
+-static void zfcp_erp_schedule_work(struct zfcp_unit *unit)
+-{
+-      struct zfcp_erp_add_work *p;
+-
+-      p = kzalloc(sizeof(*p), GFP_KERNEL);
+-      if (!p) {
+-              dev_err(&unit->port->adapter->ccw_device->dev,
+-                      "Registering unit 0x%016Lx on port 0x%016Lx failed\n",
+-                      (unsigned long long)unit->fcp_lun,
+-                      (unsigned long long)unit->port->wwpn);
+-              return;
+-      }
+-
+-      zfcp_unit_get(unit);
+-      atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
+-      INIT_WORK(&p->work, zfcp_erp_scsi_scan);
+-      p->unit = unit;
+-      if (!queue_work(zfcp_data.work_queue, &p->work))
+-              zfcp_unit_put(unit);
+-}
+-
+ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
+ {
+       struct zfcp_adapter *adapter = act->adapter;
+@@ -1226,11 +1185,11 @@ static void zfcp_erp_action_cleanup(stru
+       switch (act->action) {
+       case ZFCP_ERP_ACTION_REOPEN_UNIT:
+-              flush_work(&port->rport_work);
+               if ((result == ZFCP_ERP_SUCCEEDED) && !unit->device) {
+-                      if (!(atomic_read(&unit->status) &
+-                            ZFCP_STATUS_UNIT_SCSI_WORK_PENDING))
+-                              zfcp_erp_schedule_work(unit);
++                      zfcp_unit_get(unit);
++                      if (scsi_queue_work(unit->port->adapter->scsi_host,
++                                          &unit->scsi_work) <= 0)
++                              zfcp_unit_put(unit);
+               }
+               zfcp_unit_put(unit);
+               break;
+@@ -1352,6 +1311,11 @@ static int zfcp_erp_thread(void *data)
+       while (!(atomic_read(&adapter->status) &
+                ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL)) {
++
++              zfcp_rec_dbf_event_thread_lock("erthrd1", adapter);
++              ignore = down_interruptible(&adapter->erp_ready_sem);
++              zfcp_rec_dbf_event_thread_lock("erthrd2", adapter);
++
+               write_lock_irqsave(&adapter->erp_lock, flags);
+               next = adapter->erp_ready_head.next;
+               write_unlock_irqrestore(&adapter->erp_lock, flags);
+@@ -1363,10 +1327,6 @@ static int zfcp_erp_thread(void *data)
+                       if (zfcp_erp_strategy(act) != ZFCP_ERP_DISMISSED)
+                               zfcp_erp_wakeup(adapter);
+               }
+-
+-              zfcp_rec_dbf_event_thread_lock("erthrd1", adapter);
+-              ignore = down_interruptible(&adapter->erp_ready_sem);
+-              zfcp_rec_dbf_event_thread_lock("erthrd2", adapter);
+       }
+       atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_ext.h linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_ext.h
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_ext.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_ext.h  2009-05-13 09:46:19.000000000 +0200
+@@ -106,6 +106,7 @@ extern void zfcp_fc_plogi_evaluate(struc
+ extern void zfcp_test_link(struct zfcp_port *);
+ extern void zfcp_fc_link_test_work(struct work_struct *);
+ extern void zfcp_fc_nameserver_init(struct zfcp_adapter *);
++extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *);
+ /* zfcp_fsf.c */
+ extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
+@@ -158,6 +159,7 @@ extern void zfcp_scsi_rport_work(struct 
+ extern void zfcp_scsi_schedule_rport_register(struct zfcp_port *);
+ extern void zfcp_scsi_schedule_rport_block(struct zfcp_port *);
+ extern void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *);
++extern void zfcp_scsi_scan(struct work_struct *);
+ /* zfcp_sysfs.c */
+ extern struct attribute_group zfcp_sysfs_unit_attrs;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_fc.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_fc.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_fc.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_fc.c   2009-05-13 09:46:19.000000000 +0200
+@@ -98,13 +98,6 @@ static void zfcp_wka_port_offline(struct
+       struct zfcp_wka_port *wka_port =
+                       container_of(dw, struct zfcp_wka_port, work);
+-      /* Don't wait forvever. If the wka_port is too busy take it offline
+-         through a new call later */
+-      if (!wait_event_timeout(wka_port->completion_wq,
+-                              atomic_read(&wka_port->refcount) == 0,
+-                              HZ >> 1))
+-              return;
+-
+       mutex_lock(&wka_port->mutex);
+       if ((atomic_read(&wka_port->refcount) != 0) ||
+           (wka_port->status != ZFCP_WKA_PORT_ONLINE))
+@@ -142,6 +135,14 @@ void zfcp_fc_nameserver_init(struct zfcp
+       INIT_DELAYED_WORK(&wka_port->work, zfcp_wka_port_offline);
+ }
++void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *wka)
++{
++      cancel_delayed_work_sync(&wka->work);
++      mutex_lock(&wka->mutex);
++      wka->status = ZFCP_WKA_PORT_OFFLINE;
++      mutex_unlock(&wka->mutex);
++}
++
+ static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
+                                  struct fcp_rscn_element *elem)
+ {
+@@ -372,7 +373,8 @@ static void zfcp_fc_adisc_handler(unsign
+       if (adisc->els.status) {
+               /* request rejected or timed out */
+-              zfcp_erp_port_forced_reopen(port, 0, "fcadh_1", NULL);
++              zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
++                                          "fcadh_1", NULL);
+               goto out;
+       }
+@@ -431,11 +433,6 @@ void zfcp_fc_link_test_work(struct work_
+               container_of(work, struct zfcp_port, test_link_work);
+       int retval;
+-      if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_UNBLOCKED)) {
+-              zfcp_port_put(port);
+-              return; /* port erp is running and will update rport status */
+-      }
+-
+       zfcp_port_get(port);
+       port->rport_task = RPORT_DEL;
+       zfcp_scsi_rport_work(&port->rport_work);
+@@ -542,6 +539,9 @@ static void zfcp_validate_port(struct zf
+ {
+       struct zfcp_adapter *adapter = port->adapter;
++      if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC))
++              return;
++
+       atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);
+       if ((port->supported_classes != 0) ||
+@@ -602,10 +602,8 @@ static int zfcp_scan_eval_gpn_ft(struct 
+               if (acc->wwpn == fc_host_port_name(adapter->scsi_host))
+                       continue;
+               port = zfcp_get_port_by_wwpn(adapter, acc->wwpn);
+-              if (port) {
+-                      zfcp_port_get(port);
++              if (port)
+                       continue;
+-              }
+               port = zfcp_port_enqueue(adapter, acc->wwpn,
+                                        ZFCP_STATUS_COMMON_NOESC, d_id);
+@@ -637,7 +635,8 @@ int zfcp_scan_ports(struct zfcp_adapter 
+       max_entries = chain ? ZFCP_GPN_FT_MAX_ENTRIES : ZFCP_GPN_FT_ENTRIES;
+       max_bytes = chain ? ZFCP_GPN_FT_MAX_SIZE : ZFCP_CT_SIZE_ONE_PAGE;
+-      if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
++      if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
++          fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
+               return 0;
+       ret = zfcp_wka_port_get(&adapter->nsp);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_fsf.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_fsf.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_fsf.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_fsf.c  2009-05-13 09:46:19.000000000 +0200
+@@ -172,12 +172,16 @@ static void zfcp_fsf_link_down_info_eval
+                                        struct fsf_link_down_info *link_down)
+ {
+       struct zfcp_adapter *adapter = req->adapter;
++      unsigned long flags;
+       if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
+               return;
+       atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
++
++      read_lock_irqsave(&zfcp_data.config_lock, flags);
+       zfcp_scsi_schedule_rports_block(adapter);
++      read_unlock_irqrestore(&zfcp_data.config_lock, flags);
+       if (!link_down)
+               goto out;
+@@ -645,30 +649,30 @@ static void zfcp_fsf_exchange_port_data_
+       }
+ }
+-static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
+-      __releases(&adapter->req_q_lock)
+-      __acquires(&adapter->req_q_lock)
++static int zfcp_fsf_sbal_check(struct zfcp_adapter *adapter)
+ {
+       struct zfcp_qdio_queue *req_q = &adapter->req_q;
+-      long ret;
+-      if (atomic_read(&req_q->count) <= -REQUEST_LIST_SIZE)
+-              return -EIO;
+-      if (atomic_read(&req_q->count) > 0)
+-              return 0;
++      spin_lock_bh(&adapter->req_q_lock);
++      if (atomic_read(&req_q->count))
++              return 1;
++      spin_unlock_bh(&adapter->req_q_lock);
++      return 0;
++}
++
++static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
++{
++      long ret;
+-      atomic_dec(&req_q->count);
+       spin_unlock_bh(&adapter->req_q_lock);
+       ret = wait_event_interruptible_timeout(adapter->request_wq,
+-                                      atomic_read(&req_q->count) >= 0,
+-                                      5 * HZ);
+-      spin_lock_bh(&adapter->req_q_lock);
+-      atomic_inc(&req_q->count);
+-
++                             zfcp_fsf_sbal_check(adapter), 5 * HZ);
+       if (ret > 0)
+               return 0;
+       if (!ret)
+               atomic_inc(&adapter->qdio_outb_full);
++
++      spin_lock_bh(&adapter->req_q_lock);
+       return -EIO;
+ }
+@@ -766,8 +770,9 @@ static struct zfcp_fsf_req *zfcp_fsf_req
+ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
+ {
+       struct zfcp_adapter *adapter = req->adapter;
+-      unsigned long flags;
+-      int idx;
++      unsigned long        flags;
++      int                  idx;
++      int                  with_qtcb = (req->qtcb != NULL);
+       /* put allocated FSF request into hash table */
+       spin_lock_irqsave(&adapter->req_list_lock, flags);
+@@ -789,7 +794,7 @@ static int zfcp_fsf_req_send(struct zfcp
+       }
+       /* Don't increase for unsolicited status */
+-      if (req->qtcb)
++      if (with_qtcb)
+               adapter->fsf_req_seq_no++;
+       adapter->req_no++;
+@@ -1253,13 +1258,13 @@ int zfcp_fsf_exchange_config_data_sync(s
+       spin_lock_bh(&adapter->req_q_lock);
+       if (zfcp_fsf_req_sbal_get(adapter))
+-              goto out;
++              goto out_unlock;
+       req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
+                                 0, NULL);
+       if (IS_ERR(req)) {
+               retval = PTR_ERR(req);
+-              goto out;
++              goto out_unlock;
+       }
+       sbale = zfcp_qdio_sbale_req(req);
+@@ -1278,14 +1283,16 @@ int zfcp_fsf_exchange_config_data_sync(s
+       zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
+       retval = zfcp_fsf_req_send(req);
+-out:
+       spin_unlock_bh(&adapter->req_q_lock);
+       if (!retval)
+               wait_event(req->completion_wq,
+                          req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+       zfcp_fsf_req_free(req);
++      return retval;
++out_unlock:
++      spin_unlock_bh(&adapter->req_q_lock);
+       return retval;
+ }
+@@ -1352,13 +1359,13 @@ int zfcp_fsf_exchange_port_data_sync(str
+       spin_lock_bh(&adapter->req_q_lock);
+       if (zfcp_fsf_req_sbal_get(adapter))
+-              goto out;
++              goto out_unlock;
+       req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
+                                 NULL);
+       if (IS_ERR(req)) {
+               retval = PTR_ERR(req);
+-              goto out;
++              goto out_unlock;
+       }
+       if (data)
+@@ -1371,14 +1378,18 @@ int zfcp_fsf_exchange_port_data_sync(str
+       req->handler = zfcp_fsf_exchange_port_data_handler;
+       zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
+       retval = zfcp_fsf_req_send(req);
+-out:
+       spin_unlock_bh(&adapter->req_q_lock);
++
+       if (!retval)
+               wait_event(req->completion_wq,
+                          req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+       zfcp_fsf_req_free(req);
+       return retval;
++
++out_unlock:
++      spin_unlock_bh(&adapter->req_q_lock);
++      return retval;
+ }
+ static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req)
+@@ -2472,8 +2483,6 @@ out:
+ static void zfcp_fsf_control_file_handler(struct zfcp_fsf_req *req)
+ {
+-      if (req->qtcb->header.fsf_status != FSF_GOOD)
+-              req->status |= ZFCP_STATUS_FSFREQ_ERROR;
+ }
+ /**
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_scsi.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_scsi.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_scsi.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_scsi.c 2009-05-13 09:46:19.000000000 +0200
+@@ -171,7 +171,7 @@ static int zfcp_scsi_eh_abort_handler(st
+               write_unlock_irqrestore(&adapter->abort_lock, flags);
+               zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL,
+                                         old_req_id);
+-              return SUCCESS;
++              return FAILED; /* completion could be in progress */
+       }
+       old_req->data = NULL;
+@@ -486,10 +486,12 @@ static void zfcp_set_rport_dev_loss_tmo(
+  */
+ static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport)
+ {
+-      struct zfcp_port *port = rport->dd_data;
++      struct zfcp_port *port;
+       write_lock_irq(&zfcp_data.config_lock);
+-      port->rport = NULL;
++      port = rport->dd_data;
++      if (port)
++              port->rport = NULL;
+       write_unlock_irq(&zfcp_data.config_lock);
+ }
+@@ -503,9 +505,18 @@ static void zfcp_scsi_dev_loss_tmo_callb
+  */
+ static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport)
+ {
+-      struct zfcp_port *port = rport->dd_data;
++      struct zfcp_port *port;
++
++      write_lock_irq(&zfcp_data.config_lock);
++      port = rport->dd_data;
++      if (port)
++              zfcp_port_get(port);
++      write_unlock_irq(&zfcp_data.config_lock);
+-      zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL);
++      if (port) {
++              zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL);
++              zfcp_port_put(port);
++      }
+ }
+ static void zfcp_scsi_rport_register(struct zfcp_port *port)
+@@ -534,8 +545,10 @@ static void zfcp_scsi_rport_register(str
+ static void zfcp_scsi_rport_block(struct zfcp_port *port)
+ {
+-      if (port->rport)
+-              fc_remote_port_delete(port->rport);
++      struct fc_rport *rport = port->rport;
++
++      if (rport)
++              fc_remote_port_delete(rport);
+ }
+ void zfcp_scsi_schedule_rport_register(struct zfcp_port *port)
+@@ -583,6 +596,23 @@ void zfcp_scsi_rport_work(struct work_st
+ }
++void zfcp_scsi_scan(struct work_struct *work)
++{
++      struct zfcp_unit *unit = container_of(work, struct zfcp_unit,
++                                            scsi_work);
++      struct fc_rport *rport;
++
++      flush_work(&unit->port->rport_work);
++      rport = unit->port->rport;
++
++      if (rport && rport->port_state == FC_PORTSTATE_ONLINE)
++              scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
++                               scsilun_to_int((struct scsi_lun *)
++                                              &unit->fcp_lun), 0);
++
++      zfcp_unit_put(unit);
++}
++
+ struct fc_function_template zfcp_transport_functions = {
+       .show_starget_port_id = 1,
+       .show_starget_port_name = 1,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/s390/scsi/zfcp_sysfs.c linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_sysfs.c
+--- linux-2.6.30-rc4/drivers/s390/scsi/zfcp_sysfs.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/s390/scsi/zfcp_sysfs.c        2009-05-13 09:46:19.000000000 +0200
+@@ -254,12 +254,21 @@ static ssize_t zfcp_sysfs_unit_remove_st
+       write_lock_irq(&zfcp_data.config_lock);
+       unit = zfcp_get_unit_by_lun(port, fcp_lun);
+-      if (unit && (atomic_read(&unit->refcount) == 0)) {
+-              zfcp_unit_get(unit);
+-              atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
+-              list_move(&unit->list, &unit_remove_lh);
+-      } else
+-              unit = NULL;
++      if (unit) {
++              write_unlock_irq(&zfcp_data.config_lock);
++              /* wait for possible timeout during SCSI probe */
++              flush_work(&unit->scsi_work);
++              write_lock_irq(&zfcp_data.config_lock);
++
++              if (atomic_read(&unit->refcount) == 0) {
++                      zfcp_unit_get(unit);
++                      atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
++                                      &unit->status);
++                      list_move(&unit->list, &unit_remove_lh);
++              } else {
++                      unit = NULL;
++              }
++      }
+       write_unlock_irq(&zfcp_data.config_lock);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_ddp.c linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_ddp.c
+--- linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_ddp.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_ddp.c      2009-05-13 09:46:19.000000000 +0200
+@@ -120,20 +120,26 @@ static void clear_ddp_map(struct cxgb3i_
+ }
+ static inline int ddp_find_unused_entries(struct cxgb3i_ddp_info *ddp,
+-                                        int start, int max, int count,
++                                        unsigned int start, unsigned int max,
++                                        unsigned int count,
+                                         struct cxgb3i_gather_list *gl)
+ {
+-      unsigned int i, j;
++      unsigned int i, j, k;
++      /* not enough entries */
++      if ((max - start) < count)
++              return -EBUSY;
++
++      max -= count;
+       spin_lock(&ddp->map_lock);
+-      for (i = start; i <= max;) {
+-              for (j = 0; j < count; j++) {
+-                      if (ddp->gl_map[i + j])
++      for (i = start; i < max;) {
++              for (j = 0, k = i; j < count; j++, k++) {
++                      if (ddp->gl_map[k])
+                               break;
+               }
+               if (j == count) {
+-                      for (j = 0; j < count; j++)
+-                              ddp->gl_map[i + j] = gl;
++                      for (j = 0, k = i; j < count; j++, k++)
++                              ddp->gl_map[k] = gl;
+                       spin_unlock(&ddp->map_lock);
+                       return i;
+               }
+@@ -354,7 +360,7 @@ int cxgb3i_ddp_tag_reserve(struct t3cdev
+       struct cxgb3i_ddp_info *ddp = tdev->ulp_iscsi;
+       struct pagepod_hdr hdr;
+       unsigned int npods;
+-      int idx = -1, idx_max;
++      int idx = -1;
+       int err = -ENOMEM;
+       u32 sw_tag = *tagp;
+       u32 tag;
+@@ -367,17 +373,17 @@ int cxgb3i_ddp_tag_reserve(struct t3cdev
+       }
+       npods = (gl->nelem + PPOD_PAGES_MAX - 1) >> PPOD_PAGES_SHIFT;
+-      idx_max = ddp->nppods - npods + 1;
+       if (ddp->idx_last == ddp->nppods)
+-              idx = ddp_find_unused_entries(ddp, 0, idx_max, npods, gl);
++              idx = ddp_find_unused_entries(ddp, 0, ddp->nppods, npods, gl);
+       else {
+               idx = ddp_find_unused_entries(ddp, ddp->idx_last + 1,
+-                                            idx_max, npods, gl);
+-              if (idx < 0 && ddp->idx_last >= npods)
++                                            ddp->nppods, npods, gl);
++              if (idx < 0 && ddp->idx_last >= npods) {
+                       idx = ddp_find_unused_entries(ddp, 0,
+-                                                    ddp->idx_last - npods + 1,
++                              min(ddp->idx_last + npods, ddp->nppods),
+                                                     npods, gl);
++              }
+       }
+       if (idx < 0) {
+               ddp_log_debug("xferlen %u, gl %u, npods %u NO DDP.\n",
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i.h
+--- linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i.h  2009-05-13 09:46:19.000000000 +0200
+@@ -34,7 +34,7 @@
+ #include "cxgb3i_offload.h"
+ #include "cxgb3i_ddp.h"
+-#define CXGB3I_SCSI_QDEPTH_DFLT       128
++#define CXGB3I_SCSI_HOST_QDEPTH 1024
+ #define CXGB3I_MAX_TARGET     CXGB3I_MAX_CONN
+ #define CXGB3I_MAX_LUN                512
+ #define ISCSI_PDU_NONPAYLOAD_MAX \
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
+--- linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_iscsi.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_iscsi.c    2009-05-13 09:46:19.000000000 +0200
+@@ -876,13 +876,14 @@ static struct scsi_host_template cxgb3i_
+       .proc_name              = "cxgb3i",
+       .queuecommand           = iscsi_queuecommand,
+       .change_queue_depth     = iscsi_change_queue_depth,
+-      .can_queue              = CXGB3I_SCSI_QDEPTH_DFLT - 1,
++      .can_queue              = CXGB3I_SCSI_HOST_QDEPTH,
+       .sg_tablesize           = SG_ALL,
+       .max_sectors            = 0xFFFF,
+-      .cmd_per_lun            = CXGB3I_SCSI_QDEPTH_DFLT,
++      .cmd_per_lun            = ISCSI_DEF_CMD_PER_LUN,
+       .eh_abort_handler       = iscsi_eh_abort,
+       .eh_device_reset_handler = iscsi_eh_device_reset,
+       .eh_target_reset_handler = iscsi_eh_target_reset,
++      .target_alloc           = iscsi_target_alloc,
+       .use_clustering         = DISABLE_CLUSTERING,
+       .this_id                = -1,
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_offload.c
+--- linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_offload.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_offload.c  2009-05-13 09:46:19.000000000 +0200
+@@ -1737,7 +1737,7 @@ int cxgb3i_c3cn_send_pdus(struct s3_conn
+               c3cn_tx_debug("c3cn 0x%p, snd %u - %u > %u.\n",
+                               c3cn, c3cn->write_seq, c3cn->snd_una,
+                               cxgb3_snd_win);
+-              err = -EAGAIN;
++              err = -ENOBUFS;
+               goto out_err;
+       }
+@@ -1775,6 +1775,8 @@ done:
+ out_err:
+       if (copied == 0 && err == -EPIPE)
+               copied = c3cn->err ? c3cn->err : -EPIPE;
++      else
++              copied = err;
+       goto done;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_pdu.c linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_pdu.c
+--- linux-2.6.30-rc4/drivers/scsi/cxgb3i/cxgb3i_pdu.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/cxgb3i/cxgb3i_pdu.c      2009-05-13 09:46:19.000000000 +0200
+@@ -400,17 +400,18 @@ int cxgb3i_conn_xmit_pdu(struct iscsi_ta
+               return 0;
+       }
+-      if (err < 0 && err != -EAGAIN) {
+-              kfree_skb(skb);
+-              cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
+-                              task->itt, skb, skb->len, skb->data_len, err);
+-              iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
+-              iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
++      if (err == -EAGAIN || err == -ENOBUFS) {
++              /* reset skb to send when we are called again */
++              tdata->skb = skb;
+               return err;
+       }
+-      /* reset skb to send when we are called again */
+-      tdata->skb = skb;
+-      return -EAGAIN;
++
++      kfree_skb(skb);
++      cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
++                      task->itt, skb, skb->len, skb->data_len, err);
++      iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
++      iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
++      return err;
+ }
+ int cxgb3i_pdu_init(void)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/fcoe/fcoe.c linux-2.6.30-rc4-git/drivers/scsi/fcoe/fcoe.c
+--- linux-2.6.30-rc4/drivers/scsi/fcoe/fcoe.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/fcoe/fcoe.c      2009-05-13 09:46:19.000000000 +0200
+@@ -57,7 +57,7 @@ DEFINE_RWLOCK(fcoe_hostlist_lock);
+ DEFINE_TIMER(fcoe_timer, NULL, 0, 0);
+ DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu);
+-/* Function Prototyes */
++/* Function Prototypes */
+ static int fcoe_reset(struct Scsi_Host *shost);
+ static int fcoe_xmit(struct fc_lport *, struct fc_frame *);
+ static int fcoe_rcv(struct sk_buff *, struct net_device *,
+@@ -138,7 +138,6 @@ static struct scsi_host_template fcoe_sh
+ /**
+  * fcoe_lport_config() - sets up the fc_lport
+  * @lp: ptr to the fc_lport
+- * @shost: ptr to the parent scsi host
+  *
+  * Returns: 0 for success
+  */
+@@ -256,6 +255,7 @@ static int fcoe_netdev_config(struct fc_
+       rtnl_lock();
+       memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
+       dev_unicast_add(fc->real_dev, flogi_maddr, ETH_ALEN);
++      dev_mc_add(fc->real_dev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
+       rtnl_unlock();
+       /*
+@@ -380,7 +380,7 @@ static int fcoe_if_destroy(struct net_de
+       dev_mc_delete(fc->real_dev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
+       rtnl_unlock();
+-      /* Free the per-CPU revieve threads */
++      /* Free the per-CPU receive threads */
+       fcoe_percpu_clean(lp);
+       /* Free existing skbs */
+@@ -720,7 +720,7 @@ static void fcoe_percpu_thread_destroy(u
+       }
+ #else
+       /*
+-       * This a non-SMP scenario where the singluar Rx thread is
++       * This a non-SMP scenario where the singular Rx thread is
+        * being removed. Free all skbs and stop the thread.
+        */
+       spin_lock_bh(&p->fcoe_rx_list.lock);
+@@ -777,7 +777,7 @@ static struct notifier_block fcoe_cpu_no
+  * @skb: the receive skb
+  * @dev: associated net device
+  * @ptype: context
+- * @odldev: last device
++ * @olddev: last device
+  *
+  * this function will receive the packet and build fc frame and pass it up
+  *
+@@ -884,7 +884,6 @@ err2:
+       kfree_skb(skb);
+       return -1;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_rcv);
+ /**
+  * fcoe_start_io() - pass to netdev to start xmit for fcoe
+@@ -905,7 +904,7 @@ static inline int fcoe_start_io(struct s
+ }
+ /**
+- * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
++ * fcoe_get_paged_crc_eof() - in case we need to alloc a page for crc_eof
+  * @skb: the skb to be xmitted
+  * @tlen: total len
+  *
+@@ -947,7 +946,7 @@ static int fcoe_get_paged_crc_eof(struct
+ /**
+  * fcoe_fc_crc() - calculates FC CRC in this fcoe skb
+- * @fp: the fc_frame containg data to be checksummed
++ * @fp: the fc_frame containing data to be checksummed
+  *
+  * This uses crc32() to calculate the crc for fc frame
+  * Return   : 32 bit crc
+@@ -1011,7 +1010,7 @@ int fcoe_xmit(struct fc_lport *lp, struc
+       wlen = skb->len / FCOE_WORD_TO_BYTE;
+       if (!lp->link_up) {
+-              kfree(skb);
++              kfree_skb(skb);
+               return 0;
+       }
+@@ -1062,7 +1061,7 @@ int fcoe_xmit(struct fc_lport *lp, struc
+               cp = NULL;
+       }
+-      /* adjust skb netowrk/transport offsets to match mac/fcoe/fc */
++      /* adjust skb network/transport offsets to match mac/fcoe/fc */
+       skb_push(skb, elen + hlen);
+       skb_reset_mac_header(skb);
+       skb_reset_network_header(skb);
+@@ -1123,7 +1122,6 @@ int fcoe_xmit(struct fc_lport *lp, struc
+       return 0;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_xmit);
+ /**
+  * fcoe_percpu_receive_thread() - recv thread per cpu
+@@ -1296,17 +1294,16 @@ void fcoe_watchdog(ulong vp)
+ /**
+- * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
+- * @lp: the fc_port for this skb
+- * @skb: the associated skb to be xmitted
++ * fcoe_check_wait_queue() - attempt to clear the transmit backlog
++ * @lp: the fc_lport
+  *
+  * This empties the wait_queue, dequeue the head of the wait_queue queue
+  * and calls fcoe_start_io() for each packet, if all skb have been
+  * transmitted, return qlen or -1 if a error occurs, then restore
+- * wait_queue and  try again later.
++ * wait_queue and try again later.
+  *
+  * The wait_queue is used when the skb transmit fails. skb will go
+- * in the wait_queue which will be emptied by the time function OR
++ * in the wait_queue which will be emptied by the timer function or
+  * by the next skb transmit.
+  *
+  * Returns: 0 for success
+@@ -1355,10 +1352,6 @@ out:
+  */
+ static void fcoe_dev_setup()
+ {
+-      /*
+-       * here setup a interface specific wd time to
+-       * monitor the link state
+-       */
+       register_netdevice_notifier(&fcoe_notifier);
+ }
+@@ -1437,10 +1430,9 @@ out:
+ /**
+  * fcoe_if_to_netdev() - parse a name buffer to get netdev
+- * @ifname: fixed array for output parsed ifname
+  * @buffer: incoming buffer to be copied
+  *
+- * Returns: NULL or ptr to netdeive
++ * Returns: NULL or ptr to net_device
+  */
+ static struct net_device *fcoe_if_to_netdev(const char *buffer)
+ {
+@@ -1458,7 +1450,7 @@ static struct net_device *fcoe_if_to_net
+ }
+ /**
+- * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
++ * fcoe_netdev_to_module_owner() - finds out the driver module of the netdev
+  * @netdev: the target netdev
+  *
+  * Returns: ptr to the struct module, NULL for failure
+@@ -1488,7 +1480,7 @@ fcoe_netdev_to_module_owner(const struct
+  * Holds the Ethernet driver module by try_module_get() for
+  * the corresponding netdev.
+  *
+- * Returns: 0 for succsss
++ * Returns: 0 for success
+  */
+ static int fcoe_ethdrv_get(const struct net_device *netdev)
+ {
+@@ -1510,7 +1502,7 @@ static int fcoe_ethdrv_get(const struct 
+  * Releases the Ethernet driver module by module_put for
+  * the corresponding netdev.
+  *
+- * Returns: 0 for succsss
++ * Returns: 0 for success
+  */
+ static int fcoe_ethdrv_put(const struct net_device *netdev)
+ {
+@@ -1528,7 +1520,7 @@ static int fcoe_ethdrv_put(const struct 
+ /**
+  * fcoe_destroy() - handles the destroy from sysfs
+- * @buffer: expcted to be a eth if name
++ * @buffer: expected to be an eth if name
+  * @kp: associated kernel param
+  *
+  * Returns: 0 for success
+@@ -1565,7 +1557,7 @@ out_nodev:
+ /**
+  * fcoe_create() - Handles the create call from sysfs
+- * @buffer: expcted to be a eth if name
++ * @buffer: expected to be an eth if name
+  * @kp: associated kernel param
+  *
+  * Returns: 0 for success
+@@ -1652,7 +1644,6 @@ int fcoe_link_ok(struct fc_lport *lp)
+       return rc;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_link_ok);
+ /**
+  * fcoe_percpu_clean() - Clear the pending skbs for an lport
+@@ -1684,7 +1675,6 @@ void fcoe_percpu_clean(struct fc_lport *
+               spin_unlock_bh(&pp->fcoe_rx_list.lock);
+       }
+ }
+-EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
+ /**
+  * fcoe_clean_pending_queue() - Dequeue a skb and free it
+@@ -1705,7 +1695,6 @@ void fcoe_clean_pending_queue(struct fc_
+       }
+       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+ }
+-EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
+ /**
+  * fcoe_reset() - Resets the fcoe
+@@ -1719,11 +1708,10 @@ int fcoe_reset(struct Scsi_Host *shost)
+       fc_lport_reset(lport);
+       return 0;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_reset);
+ /**
+  * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
+- * @device: this is currently ptr to net_device
++ * @dev: this is currently ptr to net_device
+  *
+  * Returns: NULL or the located fcoe_softc
+  */
+@@ -1757,11 +1745,10 @@ struct fc_lport *fcoe_hostlist_lookup(co
+       return (fc) ? fc->ctlr.lp : NULL;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
+ /**
+  * fcoe_hostlist_add() - Add a lport to lports list
+- * @lp: ptr to the fc_lport to badded
++ * @lp: ptr to the fc_lport to be added
+  *
+  * Returns: 0 for success
+  */
+@@ -1778,11 +1765,10 @@ int fcoe_hostlist_add(const struct fc_lp
+       }
+       return 0;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
+ /**
+  * fcoe_hostlist_remove() - remove a lport from lports list
+- * @lp: ptr to the fc_lport to badded
++ * @lp: ptr to the fc_lport to be removed
+  *
+  * Returns: 0 for success
+  */
+@@ -1798,7 +1784,6 @@ int fcoe_hostlist_remove(const struct fc
+       return 0;
+ }
+-EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
+ /**
+  * fcoe_init() - fcoe module loading initialization
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/fcoe/libfcoe.c linux-2.6.30-rc4-git/drivers/scsi/fcoe/libfcoe.c
+--- linux-2.6.30-rc4/drivers/scsi/fcoe/libfcoe.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/fcoe/libfcoe.c   2009-05-13 09:46:19.000000000 +0200
+@@ -122,7 +122,7 @@ static void fcoe_ctlr_reset_fcfs(struct 
+ }
+ /**
+- * fcoe_ctrl_destroy() - Disable and tear-down the FCoE controller.
++ * fcoe_ctlr_destroy() - Disable and tear-down the FCoE controller.
+  * @fip:      FCoE controller.
+  *
+  * This is called by FCoE drivers before freeing the &fcoe_ctlr.
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/ipr.c linux-2.6.30-rc4-git/drivers/scsi/ipr.c
+--- linux-2.6.30-rc4/drivers/scsi/ipr.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/ipr.c    2009-05-13 09:46:19.000000000 +0200
+@@ -3654,6 +3654,7 @@ static int ipr_slave_configure(struct sc
+ {
+       struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
+       struct ipr_resource_entry *res;
++      struct ata_port *ap = NULL;
+       unsigned long lock_flags = 0;
+       spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+@@ -3672,12 +3673,16 @@ static int ipr_slave_configure(struct sc
+               }
+               if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))
+                       sdev->allow_restart = 1;
+-              if (ipr_is_gata(res) && res->sata_port) {
++              if (ipr_is_gata(res) && res->sata_port)
++                      ap = res->sata_port->ap;
++              spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
++
++              if (ap) {
+                       scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN);
+-                      ata_sas_slave_configure(sdev, res->sata_port->ap);
+-              } else {
++                      ata_sas_slave_configure(sdev, ap);
++              } else
+                       scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
+-              }
++              return 0;
+       }
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+       return 0;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/iscsi_tcp.c linux-2.6.30-rc4-git/drivers/scsi/iscsi_tcp.c
+--- linux-2.6.30-rc4/drivers/scsi/iscsi_tcp.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/iscsi_tcp.c      2009-05-13 09:46:19.000000000 +0200
+@@ -463,7 +463,7 @@ static int iscsi_sw_tcp_pdu_init(struct 
+       }
+       if (err) {
+-              iscsi_conn_failure(conn, err);
++              /* got invalid offset/len */
+               return -EIO;
+       }
+       return 0;
+@@ -851,6 +851,7 @@ static struct scsi_host_template iscsi_s
+       .use_clustering         = DISABLE_CLUSTERING,
+       .slave_alloc            = iscsi_sw_tcp_slave_alloc,
+       .slave_configure        = iscsi_sw_tcp_slave_configure,
++      .target_alloc           = iscsi_target_alloc,
+       .proc_name              = "iscsi_tcp",
+       .this_id                = -1,
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libfc/fc_disc.c linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_disc.c
+--- linux-2.6.30-rc4/drivers/scsi/libfc/fc_disc.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_disc.c  2009-05-13 09:46:19.000000000 +0200
+@@ -113,6 +113,11 @@ void fc_disc_stop_rports(struct fc_disc 
+               lport->tt.rport_logoff(rport);
+       }
++      list_for_each_entry_safe(rdata, next, &disc->rogue_rports, peers) {
++              rport = PRIV_TO_RPORT(rdata);
++              lport->tt.rport_logoff(rport);
++      }
++
+       mutex_unlock(&disc->disc_mutex);
+ }
+@@ -131,23 +136,32 @@ static void fc_disc_rport_callback(struc
+ {
+       struct fc_rport_libfc_priv *rdata = rport->dd_data;
+       struct fc_disc *disc = &lport->disc;
+-      int found = 0;
+       FC_DEBUG_DISC("Received a %d event for port (%6x)\n", event,
+                     rport->port_id);
+-      if (event == RPORT_EV_CREATED) {
++      switch (event) {
++      case RPORT_EV_CREATED:
+               if (disc) {
+-                      found = 1;
+                       mutex_lock(&disc->disc_mutex);
+                       list_add_tail(&rdata->peers, &disc->rports);
+                       mutex_unlock(&disc->disc_mutex);
+               }
++              break;
++      case RPORT_EV_LOGO:
++      case RPORT_EV_FAILED:
++      case RPORT_EV_STOP:
++              mutex_lock(&disc->disc_mutex);
++              mutex_lock(&rdata->rp_mutex);
++              if (rdata->trans_state == FC_PORTSTATE_ROGUE)
++                      list_del(&rdata->peers);
++              mutex_unlock(&rdata->rp_mutex);
++              mutex_unlock(&disc->disc_mutex);
++              break;
++      default:
++              break;
+       }
+-      if (!found)
+-              FC_DEBUG_DISC("The rport (%6x) is not maintained "
+-                            "by the discovery layer\n", rport->port_id);
+ }
+ /**
+@@ -439,6 +453,7 @@ static int fc_disc_new_target(struct fc_
+                       rdata = rport->dd_data;
+                       rdata->ops = &fc_disc_rport_ops;
+                       rdata->rp_state = RPORT_ST_INIT;
++                      list_add_tail(&rdata->peers, &disc->rogue_rports);
+                       lport->tt.rport_login(rport);
+               }
+       }
+@@ -461,21 +476,29 @@ static void fc_disc_del_target(struct fc
+ /**
+  * fc_disc_done() - Discovery has been completed
+  * @disc: FC discovery context
++ * Locking Note: This function expects that the disc mutex is locked before
++ * it is called. The discovery callback is then made with the lock released,
++ * and the lock is re-taken before returning from this function
+  */
+ static void fc_disc_done(struct fc_disc *disc)
+ {
+       struct fc_lport *lport = disc->lport;
++      enum fc_disc_event event;
+       FC_DEBUG_DISC("Discovery complete for port (%6x)\n",
+                     fc_host_port_id(lport->host));
+-      disc->disc_callback(lport, disc->event);
++      event = disc->event;
+       disc->event = DISC_EV_NONE;
+       if (disc->requested)
+               fc_disc_gpn_ft_req(disc);
+       else
+               disc->pending = 0;
++
++      mutex_unlock(&disc->disc_mutex);
++      disc->disc_callback(lport, event);
++      mutex_lock(&disc->disc_mutex);
+ }
+ /**
+@@ -622,6 +645,8 @@ static int fc_disc_gpn_ft_parse(struct f
+                               rdata = rport->dd_data;
+                               rdata->ops = &fc_disc_rport_ops;
+                               rdata->local_port = lport;
++                              list_add_tail(&rdata->peers,
++                                            &disc->rogue_rports);
+                               lport->tt.rport_login(rport);
+                       } else
+                               FC_DBG("Failed to allocate memory for "
+@@ -681,8 +706,8 @@ static void fc_disc_timeout(struct work_
+  * @fp: response frame
+  * @lp_arg: Fibre Channel host port instance
+  *
+- * Locking Note: This function expects that the disc_mutex is locked
+- *             before it is called.
++ * Locking Note: This function is called without disc mutex held, and
++ *             should do all its processing with the mutex held
+  */
+ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
+                               void *disc_arg)
+@@ -695,11 +720,13 @@ static void fc_disc_gpn_ft_resp(struct f
+       unsigned int len;
+       int error;
++      mutex_lock(&disc->disc_mutex);
+       FC_DEBUG_DISC("Received a GPN_FT response on port (%6x)\n",
+                     fc_host_port_id(disc->lport->host));
+       if (IS_ERR(fp)) {
+               fc_disc_error(disc, fp);
++              mutex_unlock(&disc->disc_mutex);
+               return;
+       }
+@@ -744,6 +771,8 @@ static void fc_disc_gpn_ft_resp(struct f
+                       disc->seq_count++;
+       }
+       fc_frame_free(fp);
++
++      mutex_unlock(&disc->disc_mutex);
+ }
+ /**
+@@ -757,7 +786,6 @@ static void fc_disc_gpn_ft_resp(struct f
+ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp)
+ {
+       struct fc_lport *lport;
+-      struct fc_rport *rport;
+       struct fc_rport *new_rport;
+       struct fc_rport_libfc_priv *rdata;
+@@ -766,15 +794,12 @@ static void fc_disc_single(struct fc_dis
+       if (dp->ids.port_id == fc_host_port_id(lport->host))
+               goto out;
+-      rport = lport->tt.rport_lookup(lport, dp->ids.port_id);
+-      if (rport)
+-              fc_disc_del_target(disc, rport);
+-
+       new_rport = lport->tt.rport_create(dp);
+       if (new_rport) {
+               rdata = new_rport->dd_data;
+               rdata->ops = &fc_disc_rport_ops;
+               kfree(dp);
++              list_add_tail(&rdata->peers, &disc->rogue_rports);
+               lport->tt.rport_login(new_rport);
+       }
+       return;
+@@ -836,6 +861,7 @@ int fc_disc_init(struct fc_lport *lport)
+       INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
+       mutex_init(&disc->disc_mutex);
+       INIT_LIST_HEAD(&disc->rports);
++      INIT_LIST_HEAD(&disc->rogue_rports);
+       disc->lport = lport;
+       disc->delay = FC_DISC_DELAY;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libfc/fc_elsct.c linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_elsct.c
+--- linux-2.6.30-rc4/drivers/scsi/libfc/fc_elsct.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_elsct.c 2009-05-13 09:46:19.000000000 +0200
+@@ -41,7 +41,7 @@ static struct fc_seq *fc_elsct_send(stru
+                                   void *arg, u32 timer_msec)
+ {
+       enum fc_rctl r_ctl;
+-      u32 did;
++      u32 did = FC_FID_NONE;
+       enum fc_fh_type fh_type;
+       int rc;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libfc/fc_fcp.c linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_fcp.c
+--- linux-2.6.30-rc4/drivers/scsi/libfc/fc_fcp.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_fcp.c   2009-05-13 09:46:19.000000000 +0200
+@@ -713,7 +713,7 @@ done:
+ static void fc_fcp_recv(struct fc_seq *seq, struct fc_frame *fp, void *arg)
+ {
+       struct fc_fcp_pkt *fsp = (struct fc_fcp_pkt *)arg;
+-      struct fc_lport *lp;
++      struct fc_lport *lport = fsp->lp;
+       struct fc_frame_header *fh;
+       struct fcp_txrdy *dd;
+       u8 r_ctl;
+@@ -724,9 +724,8 @@ static void fc_fcp_recv(struct fc_seq *s
+       fh = fc_frame_header_get(fp);
+       r_ctl = fh->fh_r_ctl;
+-      lp = fsp->lp;
+-      if (!(lp->state & LPORT_ST_READY))
++      if (!(lport->state & LPORT_ST_READY))
+               goto out;
+       if (fc_fcp_lock_pkt(fsp))
+               goto out;
+@@ -779,7 +778,7 @@ errout:
+       if (IS_ERR(fp))
+               fc_fcp_error(fsp, fp);
+       else if (rc == -ENOMEM)
+-              fc_fcp_reduce_can_queue(lp);
++              fc_fcp_reduce_can_queue(lport);
+ }
+ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libfc/fc_lport.c linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_lport.c
+--- linux-2.6.30-rc4/drivers/scsi/libfc/fc_lport.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_lport.c 2009-05-13 09:46:19.000000000 +0200
+@@ -618,6 +618,11 @@ int fc_fabric_logoff(struct fc_lport *lp
+ {
+       lport->tt.disc_stop_final(lport);
+       mutex_lock(&lport->lp_mutex);
++      if (lport->dns_rp)
++              lport->tt.rport_logoff(lport->dns_rp);
++      mutex_unlock(&lport->lp_mutex);
++      lport->tt.rport_flush_queue();
++      mutex_lock(&lport->lp_mutex);
+       fc_lport_enter_logo(lport);
+       mutex_unlock(&lport->lp_mutex);
+       cancel_delayed_work_sync(&lport->retry_work);
+@@ -639,7 +644,12 @@ EXPORT_SYMBOL(fc_fabric_logoff);
+  */
+ int fc_lport_destroy(struct fc_lport *lport)
+ {
++      mutex_lock(&lport->lp_mutex);
++      lport->state = LPORT_ST_NONE;
++      lport->link_up = 0;
+       lport->tt.frame_send = fc_frame_drop;
++      mutex_unlock(&lport->lp_mutex);
++
+       lport->tt.fcp_abort_io(lport);
+       lport->tt.exch_mgr_reset(lport, 0, 0);
+       return 0;
+@@ -1032,17 +1042,19 @@ static void fc_lport_rft_id_resp(struct 
+       FC_DEBUG_LPORT("Received a RFT_ID response\n");
+-      if (IS_ERR(fp)) {
+-              fc_lport_error(lport, fp);
+-              goto err;
+-      }
+-
+       if (lport->state != LPORT_ST_RFT_ID) {
+               FC_DBG("Received a RFT_ID response, but in state %s\n",
+                      fc_lport_state(lport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_lport_error(lport, fp);
++              goto err;
++      }
++
+       fh = fc_frame_header_get(fp);
+       ct = fc_frame_payload_get(fp, sizeof(*ct));
+@@ -1084,17 +1096,19 @@ static void fc_lport_rpn_id_resp(struct 
+       FC_DEBUG_LPORT("Received a RPN_ID response\n");
+-      if (IS_ERR(fp)) {
+-              fc_lport_error(lport, fp);
+-              goto err;
+-      }
+-
+       if (lport->state != LPORT_ST_RPN_ID) {
+               FC_DBG("Received a RPN_ID response, but in state %s\n",
+                      fc_lport_state(lport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_lport_error(lport, fp);
++              goto err;
++      }
++
+       fh = fc_frame_header_get(fp);
+       ct = fc_frame_payload_get(fp, sizeof(*ct));
+       if (fh && ct && fh->fh_type == FC_TYPE_CT &&
+@@ -1134,17 +1148,19 @@ static void fc_lport_scr_resp(struct fc_
+       FC_DEBUG_LPORT("Received a SCR response\n");
+-      if (IS_ERR(fp)) {
+-              fc_lport_error(lport, fp);
+-              goto err;
+-      }
+-
+       if (lport->state != LPORT_ST_SCR) {
+               FC_DBG("Received a SCR response, but in state %s\n",
+                      fc_lport_state(lport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_lport_error(lport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC)
+               fc_lport_enter_ready(lport);
+@@ -1360,17 +1376,19 @@ static void fc_lport_logo_resp(struct fc
+       FC_DEBUG_LPORT("Received a LOGO response\n");
+-      if (IS_ERR(fp)) {
+-              fc_lport_error(lport, fp);
+-              goto err;
+-      }
+-
+       if (lport->state != LPORT_ST_LOGO) {
+               FC_DBG("Received a LOGO response, but in state %s\n",
+                      fc_lport_state(lport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_lport_error(lport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC)
+               fc_lport_enter_reset(lport);
+@@ -1400,10 +1418,6 @@ static void fc_lport_enter_logo(struct f
+       fc_lport_state_enter(lport, LPORT_ST_LOGO);
+-      /* DNS session should be closed so we can release it here */
+-      if (lport->dns_rp)
+-              lport->tt.rport_logoff(lport->dns_rp);
+-
+       fp = fc_frame_alloc(lport, sizeof(*logo));
+       if (!fp) {
+               fc_lport_error(lport, fp);
+@@ -1444,17 +1458,19 @@ static void fc_lport_flogi_resp(struct f
+       FC_DEBUG_LPORT("Received a FLOGI response\n");
+-      if (IS_ERR(fp)) {
+-              fc_lport_error(lport, fp);
+-              goto err;
+-      }
+-
+       if (lport->state != LPORT_ST_FLOGI) {
+               FC_DBG("Received a FLOGI response, but in state %s\n",
+                      fc_lport_state(lport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_lport_error(lport, fp);
++              goto err;
++      }
++
+       fh = fc_frame_header_get(fp);
+       did = ntoh24(fh->fh_d_id);
+       if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libfc/fc_rport.c linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_rport.c
+--- linux-2.6.30-rc4/drivers/scsi/libfc/fc_rport.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libfc/fc_rport.c 2009-05-13 09:46:19.000000000 +0200
+@@ -267,6 +267,10 @@ static void fc_rport_work(struct work_st
+                              "(%6x).\n", ids.port_id);
+                       event = RPORT_EV_FAILED;
+               }
++              if (rport->port_id != FC_FID_DIR_SERV)
++                      if (rport_ops->event_callback)
++                              rport_ops->event_callback(lport, rport,
++                                                        RPORT_EV_FAILED);
+               put_device(&rport->dev);
+               rport = new_rport;
+               rdata = new_rport->dd_data;
+@@ -325,11 +329,20 @@ int fc_rport_login(struct fc_rport *rpor
+ int fc_rport_logoff(struct fc_rport *rport)
+ {
+       struct fc_rport_libfc_priv *rdata = rport->dd_data;
++      struct fc_lport *lport = rdata->local_port;
+       mutex_lock(&rdata->rp_mutex);
+       FC_DEBUG_RPORT("Remove port (%6x)\n", rport->port_id);
++      if (rdata->rp_state == RPORT_ST_NONE) {
++              FC_DEBUG_RPORT("(%6x): Port (%6x) in NONE state,"
++                             " not removing", fc_host_port_id(lport->host),
++                             rport->port_id);
++              mutex_unlock(&rdata->rp_mutex);
++              goto out;
++      }
++
+       fc_rport_enter_logo(rport);
+       /*
+@@ -349,6 +362,7 @@ int fc_rport_logoff(struct fc_rport *rpo
+       mutex_unlock(&rdata->rp_mutex);
++out:
+       return 0;
+ }
+@@ -430,6 +444,7 @@ static void fc_rport_error(struct fc_rpo
+       case RPORT_ST_PRLI:
+       case RPORT_ST_LOGO:
+               rdata->event = RPORT_EV_FAILED;
++              fc_rport_state_enter(rport, RPORT_ST_NONE);
+               queue_work(rport_event_queue,
+                          &rdata->event_work);
+               break;
+@@ -494,7 +509,7 @@ static void fc_rport_plogi_resp(struct f
+       struct fc_rport *rport = rp_arg;
+       struct fc_rport_libfc_priv *rdata = rport->dd_data;
+       struct fc_lport *lport = rdata->local_port;
+-      struct fc_els_flogi *plp;
++      struct fc_els_flogi *plp = NULL;
+       unsigned int tov;
+       u16 csp_seq;
+       u16 cssp_seq;
+@@ -505,17 +520,19 @@ static void fc_rport_plogi_resp(struct f
+       FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n",
+                      rport->port_id);
+-      if (IS_ERR(fp)) {
+-              fc_rport_error_retry(rport, fp);
+-              goto err;
+-      }
+-
+       if (rdata->rp_state != RPORT_ST_PLOGI) {
+               FC_DBG("Received a PLOGI response, but in state %s\n",
+                      fc_rport_state(rport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_rport_error_retry(rport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC &&
+           (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) {
+@@ -614,17 +631,19 @@ static void fc_rport_prli_resp(struct fc
+       FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n",
+                      rport->port_id);
+-      if (IS_ERR(fp)) {
+-              fc_rport_error_retry(rport, fp);
+-              goto err;
+-      }
+-
+       if (rdata->rp_state != RPORT_ST_PRLI) {
+               FC_DBG("Received a PRLI response, but in state %s\n",
+                      fc_rport_state(rport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_rport_error_retry(rport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC) {
+               pp = fc_frame_payload_get(fp, sizeof(*pp));
+@@ -646,6 +665,7 @@ static void fc_rport_prli_resp(struct fc
+       } else {
+               FC_DBG("Bad ELS response\n");
+               rdata->event = RPORT_EV_FAILED;
++              fc_rport_state_enter(rport, RPORT_ST_NONE);
+               queue_work(rport_event_queue, &rdata->event_work);
+       }
+@@ -678,23 +698,26 @@ static void fc_rport_logo_resp(struct fc
+       FC_DEBUG_RPORT("Received a LOGO response from port (%6x)\n",
+                      rport->port_id);
+-      if (IS_ERR(fp)) {
+-              fc_rport_error_retry(rport, fp);
+-              goto err;
+-      }
+-
+       if (rdata->rp_state != RPORT_ST_LOGO) {
+               FC_DEBUG_RPORT("Received a LOGO response, but in state %s\n",
+                              fc_rport_state(rport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_rport_error_retry(rport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC) {
+               fc_rport_enter_rtv(rport);
+       } else {
+               FC_DBG("Bad ELS response\n");
+               rdata->event = RPORT_EV_LOGO;
++              fc_rport_state_enter(rport, RPORT_ST_NONE);
+               queue_work(rport_event_queue, &rdata->event_work);
+       }
+@@ -764,17 +787,19 @@ static void fc_rport_rtv_resp(struct fc_
+       FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n",
+                      rport->port_id);
+-      if (IS_ERR(fp)) {
+-              fc_rport_error(rport, fp);
+-              goto err;
+-      }
+-
+       if (rdata->rp_state != RPORT_ST_RTV) {
+               FC_DBG("Received a RTV response, but in state %s\n",
+                      fc_rport_state(rport));
++              if (IS_ERR(fp))
++                      goto err;
+               goto out;
+       }
++      if (IS_ERR(fp)) {
++              fc_rport_error(rport, fp);
++              goto err;
++      }
++
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC) {
+               struct fc_els_rtv_acc *rtv;
+@@ -1007,6 +1032,8 @@ static void fc_rport_recv_plogi_req(stru
+       default:
+               FC_DEBUG_RPORT("incoming PLOGI from %x in unexpected "
+                              "state %d\n", sid, rdata->rp_state);
++              fc_frame_free(fp);
++              return;
+               break;
+       }
+@@ -1098,6 +1125,8 @@ static void fc_rport_recv_prli_req(struc
+               reason = ELS_RJT_NONE;
+               break;
+       default:
++              fc_frame_free(rx_fp);
++              return;
+               break;
+       }
+       len = fr_len(rx_fp) - sizeof(*fh);
+@@ -1227,6 +1256,11 @@ static void fc_rport_recv_prlo_req(struc
+                      "while in state %s\n", ntoh24(fh->fh_s_id),
+                      fc_rport_state(rport));
++      if (rdata->rp_state == RPORT_ST_NONE) {
++              fc_frame_free(fp);
++              return;
++      }
++
+       rjt_data.fp = NULL;
+       rjt_data.reason = ELS_RJT_UNAB;
+       rjt_data.explan = ELS_EXPL_NONE;
+@@ -1256,7 +1290,13 @@ static void fc_rport_recv_logo_req(struc
+                      "while in state %s\n", ntoh24(fh->fh_s_id),
+                      fc_rport_state(rport));
++      if (rdata->rp_state == RPORT_ST_NONE) {
++              fc_frame_free(fp);
++              return;
++      }
++
+       rdata->event = RPORT_EV_LOGO;
++      fc_rport_state_enter(rport, RPORT_ST_NONE);
+       queue_work(rport_event_queue, &rdata->event_work);
+       lport->tt.seq_els_rsp_send(sp, ELS_LS_ACC, NULL);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libiscsi.c linux-2.6.30-rc4-git/drivers/scsi/libiscsi.c
+--- linux-2.6.30-rc4/drivers/scsi/libiscsi.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libiscsi.c       2009-05-13 09:46:19.000000000 +0200
+@@ -1463,6 +1463,16 @@ int iscsi_change_queue_depth(struct scsi
+ }
+ EXPORT_SYMBOL_GPL(iscsi_change_queue_depth);
++int iscsi_target_alloc(struct scsi_target *starget)
++{
++      struct iscsi_cls_session *cls_session = starget_to_session(starget);
++      struct iscsi_session *session = cls_session->dd_data;
++
++      starget->can_queue = session->scsi_cmds_max;
++      return 0;
++}
++EXPORT_SYMBOL_GPL(iscsi_target_alloc);
++
+ void iscsi_session_recovery_timedout(struct iscsi_cls_session *cls_session)
+ {
+       struct iscsi_session *session = cls_session->dd_data;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/libiscsi_tcp.c linux-2.6.30-rc4-git/drivers/scsi/libiscsi_tcp.c
+--- linux-2.6.30-rc4/drivers/scsi/libiscsi_tcp.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/libiscsi_tcp.c   2009-05-13 09:46:19.000000000 +0200
+@@ -1036,8 +1036,11 @@ flush:
+       rc = conn->session->tt->init_pdu(task, r2t->data_offset + r2t->sent,
+                                        r2t->data_count);
+-      if (rc)
++      if (rc) {
++              iscsi_conn_failure(conn, ISCSI_ERR_XMIT_FAILED);
+               return rc;
++      }
++
+       r2t->sent += r2t->data_count;
+       goto flush;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_attr.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_attr.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_attr.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_attr.c 2009-05-13 09:46:19.000000000 +0200
+@@ -51,7 +51,7 @@
+ #define LPFC_LINK_SPEED_STRING "0, 1, 2, 4, 8"
+ /**
+- * lpfc_jedec_to_ascii: Hex to ascii convertor according to JEDEC rules.
++ * lpfc_jedec_to_ascii - Hex to ascii convertor according to JEDEC rules
+  * @incr: integer to convert.
+  * @hdw: ascii string holding converted integer plus a string terminator.
+  *
+@@ -82,7 +82,7 @@ lpfc_jedec_to_ascii(int incr, char hdw[]
+ }
+ /**
+- * lpfc_drvr_version_show: Return the Emulex driver string with version number.
++ * lpfc_drvr_version_show - Return the Emulex driver string with version number
+  * @dev: class unused variable.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the module description text.
+@@ -152,7 +152,7 @@ lpfc_bg_reftag_err_show(struct device *d
+ }
+ /**
+- * lpfc_info_show: Return some pci info about the host in ascii.
++ * lpfc_info_show - Return some pci info about the host in ascii
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the formatted text from lpfc_info().
+@@ -169,7 +169,7 @@ lpfc_info_show(struct device *dev, struc
+ }
+ /**
+- * lpfc_serialnum_show: Return the hba serial number in ascii.
++ * lpfc_serialnum_show - Return the hba serial number in ascii
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the formatted text serial number.
+@@ -188,7 +188,7 @@ lpfc_serialnum_show(struct device *dev, 
+ }
+ /**
+- * lpfc_temp_sensor_show: Return the temperature sensor level.
++ * lpfc_temp_sensor_show - Return the temperature sensor level
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the formatted support level.
+@@ -210,7 +210,7 @@ lpfc_temp_sensor_show(struct device *dev
+ }
+ /**
+- * lpfc_modeldesc_show: Return the model description of the hba.
++ * lpfc_modeldesc_show - Return the model description of the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the scsi vpd model description.
+@@ -229,7 +229,7 @@ lpfc_modeldesc_show(struct device *dev, 
+ }
+ /**
+- * lpfc_modelname_show: Return the model name of the hba.
++ * lpfc_modelname_show - Return the model name of the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the scsi vpd model name.
+@@ -248,7 +248,7 @@ lpfc_modelname_show(struct device *dev, 
+ }
+ /**
+- * lpfc_programtype_show: Return the program type of the hba.
++ * lpfc_programtype_show - Return the program type of the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the scsi vpd program type.
+@@ -267,7 +267,7 @@ lpfc_programtype_show(struct device *dev
+ }
+ /**
+- * lpfc_mlomgmt_show: Return the Menlo Maintenance sli flag.
++ * lpfc_mlomgmt_show - Return the Menlo Maintenance sli flag
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the Menlo Maintenance sli flag.
+@@ -286,7 +286,7 @@ lpfc_mlomgmt_show(struct device *dev, st
+ }
+ /**
+- * lpfc_vportnum_show: Return the port number in ascii of the hba.
++ * lpfc_vportnum_show - Return the port number in ascii of the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains scsi vpd program type.
+@@ -305,7 +305,7 @@ lpfc_vportnum_show(struct device *dev, s
+ }
+ /**
+- * lpfc_fwrev_show: Return the firmware rev running in the hba.
++ * lpfc_fwrev_show - Return the firmware rev running in the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the scsi vpd program type.
+@@ -326,7 +326,7 @@ lpfc_fwrev_show(struct device *dev, stru
+ }
+ /**
+- * lpfc_hdw_show: Return the jedec information about the hba.
++ * lpfc_hdw_show - Return the jedec information about the hba
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the scsi vpd program type.
+@@ -347,7 +347,7 @@ lpfc_hdw_show(struct device *dev, struct
+ }
+ /**
+- * lpfc_option_rom_version_show: Return the adapter ROM FCode version.
++ * lpfc_option_rom_version_show - Return the adapter ROM FCode version
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the ROM and FCode ascii strings.
+@@ -366,7 +366,7 @@ lpfc_option_rom_version_show(struct devi
+ }
+ /**
+- * lpfc_state_show: Return the link state of the port.
++ * lpfc_state_show - Return the link state of the port
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains text describing the state of the link.
+@@ -451,7 +451,7 @@ lpfc_link_state_show(struct device *dev,
+ }
+ /**
+- * lpfc_num_discovered_ports_show: Return sum of mapped and unmapped vports.
++ * lpfc_num_discovered_ports_show - Return sum of mapped and unmapped vports
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the sum of fc mapped and unmapped.
+@@ -474,7 +474,7 @@ lpfc_num_discovered_ports_show(struct de
+ }
+ /**
+- * lpfc_issue_lip: Misnomer, name carried over from long ago.
++ * lpfc_issue_lip - Misnomer, name carried over from long ago
+  * @shost: Scsi_Host pointer.
+  *
+  * Description:
+@@ -529,7 +529,7 @@ lpfc_issue_lip(struct Scsi_Host *shost)
+ }
+ /**
+- * lpfc_do_offline: Issues a mailbox command to bring the link down.
++ * lpfc_do_offline - Issues a mailbox command to bring the link down
+  * @phba: lpfc_hba pointer.
+  * @type: LPFC_EVT_OFFLINE, LPFC_EVT_WARM_START, LPFC_EVT_KILL.
+  *
+@@ -537,7 +537,7 @@ lpfc_issue_lip(struct Scsi_Host *shost)
+  * Assumes any error from lpfc_do_offline() will be negative.
+  * Can wait up to 5 seconds for the port ring buffers count
+  * to reach zero, prints a warning if it is not zero and continues.
+- * lpfc_workq_post_event() returns a non-zero return coce if call fails.
++ * lpfc_workq_post_event() returns a non-zero return code if call fails.
+  *
+  * Returns:
+  * -EIO error posting the event
+@@ -591,7 +591,7 @@ lpfc_do_offline(struct lpfc_hba *phba, u
+ }
+ /**
+- * lpfc_selective_reset: Offline then onlines the port.
++ * lpfc_selective_reset - Offline then onlines the port
+  * @phba: lpfc_hba pointer.
+  *
+  * Description:
+@@ -632,7 +632,7 @@ lpfc_selective_reset(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_issue_reset: Selectively resets an adapter.
++ * lpfc_issue_reset - Selectively resets an adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: containing the string "selective".
+@@ -672,7 +672,7 @@ lpfc_issue_reset(struct device *dev, str
+ }
+ /**
+- * lpfc_nport_evt_cnt_show: Return the number of nport events.
++ * lpfc_nport_evt_cnt_show - Return the number of nport events
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the ascii number of nport events.
+@@ -691,7 +691,7 @@ lpfc_nport_evt_cnt_show(struct device *d
+ }
+ /**
+- * lpfc_board_mode_show: Return the state of the board.
++ * lpfc_board_mode_show - Return the state of the board
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the state of the adapter.
+@@ -720,7 +720,7 @@ lpfc_board_mode_show(struct device *dev,
+ }
+ /**
+- * lpfc_board_mode_store: Puts the hba in online, offline, warm or error state.
++ * lpfc_board_mode_store - Puts the hba in online, offline, warm or error state
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: containing one of the strings "online", "offline", "warm" or "error".
+@@ -766,14 +766,14 @@ lpfc_board_mode_store(struct device *dev
+ }
+ /**
+- * lpfc_get_hba_info: Return various bits of informaton about the adapter.
++ * lpfc_get_hba_info - Return various bits of informaton about the adapter
+  * @phba: pointer to the adapter structure.
+- * @mxri max xri count.
+- * @axri available xri count.
+- * @mrpi max rpi count.
+- * @arpi available rpi count.
+- * @mvpi max vpi count.
+- * @avpi available vpi count.
++ * @mxri: max xri count.
++ * @axri: available xri count.
++ * @mrpi: max rpi count.
++ * @arpi: available rpi count.
++ * @mvpi: max vpi count.
++ * @avpi: available vpi count.
+  *
+  * Description:
+  * If an integer pointer for an count is not null then the value for the
+@@ -846,7 +846,7 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_max_rpi_show: Return maximum rpi.
++ * lpfc_max_rpi_show - Return maximum rpi
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the maximum rpi count in decimal or "Unknown".
+@@ -874,7 +874,7 @@ lpfc_max_rpi_show(struct device *dev, st
+ }
+ /**
+- * lpfc_used_rpi_show: Return maximum rpi minus available rpi.
++ * lpfc_used_rpi_show - Return maximum rpi minus available rpi
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: containing the used rpi count in decimal or "Unknown".
+@@ -902,7 +902,7 @@ lpfc_used_rpi_show(struct device *dev, s
+ }
+ /**
+- * lpfc_max_xri_show: Return maximum xri.
++ * lpfc_max_xri_show - Return maximum xri
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the maximum xri count in decimal or "Unknown".
+@@ -930,7 +930,7 @@ lpfc_max_xri_show(struct device *dev, st
+ }
+ /**
+- * lpfc_used_xri_show: Return maximum xpi minus the available xpi.
++ * lpfc_used_xri_show - Return maximum xpi minus the available xpi
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the used xri count in decimal or "Unknown".
+@@ -958,7 +958,7 @@ lpfc_used_xri_show(struct device *dev, s
+ }
+ /**
+- * lpfc_max_vpi_show: Return maximum vpi.
++ * lpfc_max_vpi_show - Return maximum vpi
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the maximum vpi count in decimal or "Unknown".
+@@ -986,7 +986,7 @@ lpfc_max_vpi_show(struct device *dev, st
+ }
+ /**
+- * lpfc_used_vpi_show: Return maximum vpi minus the available vpi.
++ * lpfc_used_vpi_show - Return maximum vpi minus the available vpi
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the used vpi count in decimal or "Unknown".
+@@ -1014,7 +1014,7 @@ lpfc_used_vpi_show(struct device *dev, s
+ }
+ /**
+- * lpfc_npiv_info_show: Return text about NPIV support for the adapter.
++ * lpfc_npiv_info_show - Return text about NPIV support for the adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: text that must be interpreted to determine if npiv is supported.
+@@ -1042,7 +1042,7 @@ lpfc_npiv_info_show(struct device *dev, 
+ }
+ /**
+- * lpfc_poll_show: Return text about poll support for the adapter.
++ * lpfc_poll_show - Return text about poll support for the adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the cfg_poll in hex.
+@@ -1064,7 +1064,7 @@ lpfc_poll_show(struct device *dev, struc
+ }
+ /**
+- * lpfc_poll_store: Set the value of cfg_poll for the adapter.
++ * lpfc_poll_store - Set the value of cfg_poll for the adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: one or more lpfc_polling_flags values.
+@@ -1136,7 +1136,7 @@ lpfc_poll_store(struct device *dev, stru
+ }
+ /**
+- * lpfc_param_show: Return a cfg attribute value in decimal.
++ * lpfc_param_show - Return a cfg attribute value in decimal
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1164,7 +1164,7 @@ lpfc_##attr##_show(struct device *dev, s
+ }
+ /**
+- * lpfc_param_hex_show: Return a cfg attribute value in hex.
++ * lpfc_param_hex_show - Return a cfg attribute value in hex
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1173,7 +1173,7 @@ lpfc_##attr##_show(struct device *dev, s
+  * lpfc_##attr##_show: Return the hex value of an adapters cfg_xxx field.
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+- * @buf: on return contains the attribute value in hexidecimal.
++ * @buf: on return contains the attribute value in hexadecimal.
+  *
+  * Returns: size of formatted string.
+  **/
+@@ -1192,7 +1192,7 @@ lpfc_##attr##_show(struct device *dev, s
+ }
+ /**
+- * lpfc_param_init: Intializes a cfg attribute.
++ * lpfc_param_init - Intializes a cfg attribute
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1226,7 +1226,7 @@ lpfc_##attr##_init(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_param_set: Set a cfg attribute value.
++ * lpfc_param_set - Set a cfg attribute value
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1260,7 +1260,7 @@ lpfc_##attr##_set(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_param_store: Set a vport attribute value.
++ * lpfc_param_store - Set a vport attribute value
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1300,7 +1300,7 @@ lpfc_##attr##_store(struct device *dev, 
+ }
+ /**
+- * lpfc_vport_param_show: Return decimal formatted cfg attribute value.
++ * lpfc_vport_param_show - Return decimal formatted cfg attribute value
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1326,17 +1326,17 @@ lpfc_##attr##_show(struct device *dev, s
+ }
+ /**
+- * lpfc_vport_param_hex_show: Return hex formatted attribute value.
++ * lpfc_vport_param_hex_show - Return hex formatted attribute value
+  *
+  * Description:
+  * Macro that given an attr e.g.
+  * hba_queue_depth expands into a function with the name
+  * lpfc_hba_queue_depth_show
+  *
+- * lpfc_##attr##_show: prints the attribute value in hexidecimal.
++ * lpfc_##attr##_show: prints the attribute value in hexadecimal.
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+- * @buf: on return contains the attribute value in hexidecimal.
++ * @buf: on return contains the attribute value in hexadecimal.
+  *
+  * Returns: length of formatted string.
+  **/
+@@ -1353,7 +1353,7 @@ lpfc_##attr##_show(struct device *dev, s
+ }
+ /**
+- * lpfc_vport_param_init: Initialize a vport cfg attribute.
++ * lpfc_vport_param_init - Initialize a vport cfg attribute
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1386,7 +1386,7 @@ lpfc_##attr##_init(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_vport_param_set: Set a vport cfg attribute.
++ * lpfc_vport_param_set - Set a vport cfg attribute
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth expands
+@@ -1417,7 +1417,7 @@ lpfc_##attr##_set(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_vport_param_store: Set a vport attribute.
++ * lpfc_vport_param_store - Set a vport attribute
+  *
+  * Description:
+  * Macro that given an attr e.g. hba_queue_depth
+@@ -1576,7 +1576,7 @@ static DEVICE_ATTR(lpfc_temp_sensor, S_I
+ static char *lpfc_soft_wwn_key = "C99G71SL8032A";
+ /**
+- * lpfc_soft_wwn_enable_store: Allows setting of the wwn if the key is valid.
++ * lpfc_soft_wwn_enable_store - Allows setting of the wwn if the key is valid
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+  * @buf: containing the string lpfc_soft_wwn_key.
+@@ -1623,10 +1623,10 @@ static DEVICE_ATTR(lpfc_soft_wwn_enable,
+                  lpfc_soft_wwn_enable_store);
+ /**
+- * lpfc_soft_wwpn_show: Return the cfg soft ww port name of the adapter.
++ * lpfc_soft_wwpn_show - Return the cfg soft ww port name of the adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+- * @buf: on return contains the wwpn in hexidecimal.
++ * @buf: on return contains the wwpn in hexadecimal.
+  *
+  * Returns: size of formatted string.
+  **/
+@@ -1643,10 +1643,10 @@ lpfc_soft_wwpn_show(struct device *dev, 
+ }
+ /**
+- * lpfc_soft_wwpn_store: Set the ww port name of the adapter.
++ * lpfc_soft_wwpn_store - Set the ww port name of the adapter
+  * @dev class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+- * @buf: contains the wwpn in hexidecimal.
++ * @buf: contains the wwpn in hexadecimal.
+  * @count: number of wwpn bytes in buf
+  *
+  * Returns:
+@@ -1729,10 +1729,10 @@ static DEVICE_ATTR(lpfc_soft_wwpn, S_IRU
+                  lpfc_soft_wwpn_show, lpfc_soft_wwpn_store);
+ /**
+- * lpfc_soft_wwnn_show: Return the cfg soft ww node name for the adapter.
++ * lpfc_soft_wwnn_show - Return the cfg soft ww node name for the adapter
+  * @dev: class device that is converted into a Scsi_host.
+  * @attr: device attribute, not used.
+- * @buf: on return contains the wwnn in hexidecimal.
++ * @buf: on return contains the wwnn in hexadecimal.
+  *
+  * Returns: size of formatted string.
+  **/
+@@ -1747,9 +1747,9 @@ lpfc_soft_wwnn_show(struct device *dev, 
+ }
+ /**
+- * lpfc_soft_wwnn_store: sets the ww node name of the adapter.
++ * lpfc_soft_wwnn_store - sets the ww node name of the adapter
+  * @cdev: class device that is converted into a Scsi_host.
+- * @buf: contains the ww node name in hexidecimal.
++ * @buf: contains the ww node name in hexadecimal.
+  * @count: number of wwnn bytes in buf.
+  *
+  * Returns:
+@@ -1845,7 +1845,7 @@ MODULE_PARM_DESC(lpfc_nodev_tmo,
+                "for a device to come back");
+ /**
+- * lpfc_nodev_tmo_show: Return the hba dev loss timeout value.
++ * lpfc_nodev_tmo_show - Return the hba dev loss timeout value
+  * @dev: class converted to a Scsi_host structure.
+  * @attr: device attribute, not used.
+  * @buf: on return contains the dev loss timeout in decimal.
+@@ -1864,7 +1864,7 @@ lpfc_nodev_tmo_show(struct device *dev, 
+ }
+ /**
+- * lpfc_nodev_tmo_init: Set the hba nodev timeout value.
++ * lpfc_nodev_tmo_init - Set the hba nodev timeout value
+  * @vport: lpfc vport structure pointer.
+  * @val: contains the nodev timeout value.
+  *
+@@ -1905,7 +1905,7 @@ lpfc_nodev_tmo_init(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_update_rport_devloss_tmo: Update dev loss tmo value.
++ * lpfc_update_rport_devloss_tmo - Update dev loss tmo value
+  * @vport: lpfc vport structure pointer.
+  *
+  * Description:
+@@ -1926,7 +1926,7 @@ lpfc_update_rport_devloss_tmo(struct lpf
+ }
+ /**
+- * lpfc_nodev_tmo_set: Set the vport nodev tmo and devloss tmo values.
++ * lpfc_nodev_tmo_set - Set the vport nodev tmo and devloss tmo values
+  * @vport: lpfc vport structure pointer.
+  * @val: contains the tmo value.
+  *
+@@ -1982,7 +1982,7 @@ lpfc_vport_param_init(devloss_tmo, LPFC_
+ lpfc_vport_param_show(devloss_tmo)
+ /**
+- * lpfc_devloss_tmo_set: Sets vport nodev tmo, devloss tmo values, changed bit.
++ * lpfc_devloss_tmo_set - Sets vport nodev tmo, devloss tmo values, changed bit
+  * @vport: lpfc vport structure pointer.
+  * @val: contains the tmo value.
+  *
+@@ -2094,7 +2094,7 @@ MODULE_PARM_DESC(lpfc_restrict_login,
+ lpfc_vport_param_show(restrict_login);
+ /**
+- * lpfc_restrict_login_init: Set the vport restrict login flag.
++ * lpfc_restrict_login_init - Set the vport restrict login flag
+  * @vport: lpfc vport structure pointer.
+  * @val: contains the restrict login value.
+  *
+@@ -2128,7 +2128,7 @@ lpfc_restrict_login_init(struct lpfc_vpo
+ }
+ /**
+- * lpfc_restrict_login_set: Set the vport restrict login flag.
++ * lpfc_restrict_login_set - Set the vport restrict login flag
+  * @vport: lpfc vport structure pointer.
+  * @val: contains the restrict login value.
+  *
+@@ -2201,7 +2201,7 @@ LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
+ */
+ /**
+- * lpfc_topology_set: Set the adapters topology field.
++ * lpfc_topology_set - Set the adapters topology field
+  * @phba: lpfc_hba pointer.
+  * @val: topology value.
+  *
+@@ -2216,18 +2216,41 @@ LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
+  * non-zero return value from lpfc_issue_lip()
+  * -EINVAL val out of range
+  **/
+-static int
+-lpfc_topology_set(struct lpfc_hba *phba, int val)
++static ssize_t
++lpfc_topology_store(struct device *dev, struct device_attribute *attr,
++                      const char *buf, size_t count)
+ {
++      struct Scsi_Host  *shost = class_to_shost(dev);
++      struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
++      struct lpfc_hba   *phba = vport->phba;
++      int val = 0;
++      int nolip = 0;
++      const char *val_buf = buf;
+       int err;
+       uint32_t prev_val;
++
++      if (!strncmp(buf, "nolip ", strlen("nolip "))) {
++              nolip = 1;
++              val_buf = &buf[strlen("nolip ")];
++      }
++
++      if (!isdigit(val_buf[0]))
++              return -EINVAL;
++      if (sscanf(val_buf, "%i", &val) != 1)
++              return -EINVAL;
++
+       if (val >= 0 && val <= 6) {
+               prev_val = phba->cfg_topology;
+               phba->cfg_topology = val;
++              if (nolip)
++                      return strlen(buf);
++
+               err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
+-              if (err)
++              if (err) {
+                       phba->cfg_topology = prev_val;
+-              return err;
++                      return -EINVAL;
++              } else
++                      return strlen(buf);
+       }
+       lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+               "%d:0467 lpfc_topology attribute cannot be set to %d, "
+@@ -2240,14 +2263,12 @@ module_param(lpfc_topology, int, 0);
+ MODULE_PARM_DESC(lpfc_topology, "Select Fibre Channel topology");
+ lpfc_param_show(topology)
+ lpfc_param_init(topology, 0, 0, 6)
+-lpfc_param_store(topology)
+ static DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR,
+               lpfc_topology_show, lpfc_topology_store);
+ /**
+- * lpfc_stat_data_ctrl_store: write call back for lpfc_stat_data_ctrl
+- *  sysfs file.
++ * lpfc_stat_data_ctrl_store - write call back for lpfc_stat_data_ctrl sysfs file
+  * @dev: Pointer to class device.
+  * @buf: Data buffer.
+  * @count: Size of the data buffer.
+@@ -2282,7 +2303,7 @@ lpfc_stat_data_ctrl_store(struct device 
+       unsigned long base, step, bucket_type;
+       if (!strncmp(buf, "setbucket", strlen("setbucket"))) {
+-              if (strlen(buf) > LPFC_MAX_DATA_CTRL_LEN)
++              if (strlen(buf) > (LPFC_MAX_DATA_CTRL_LEN - 1))
+                       return -EINVAL;
+               strcpy(bucket_data, buf);
+@@ -2411,8 +2432,7 @@ lpfc_stat_data_ctrl_store(struct device 
+ /**
+- * lpfc_stat_data_ctrl_show: Read callback function for
+- *   lpfc_stat_data_ctrl sysfs file.
++ * lpfc_stat_data_ctrl_show - Read function for lpfc_stat_data_ctrl sysfs file
+  * @dev: Pointer to class device object.
+  * @buf: Data buffer.
+  *
+@@ -2489,8 +2509,7 @@ static DEVICE_ATTR(lpfc_stat_data_ctrl, 
+ /**
+- * sysfs_drvr_stat_data_read: Read callback function for lpfc_drvr_stat_data
+- *  sysfs attribute.
++ * sysfs_drvr_stat_data_read - Read function for lpfc_drvr_stat_data attribute
+  * @kobj: Pointer to the kernel object
+  * @bin_attr: Attribute object
+  * @buff: Buffer pointer
+@@ -2585,7 +2604,7 @@ static struct bin_attribute sysfs_drvr_s
+ */
+ /**
+- * lpfc_link_speed_set: Set the adapters link speed.
++ * lpfc_link_speed_set - Set the adapters link speed
+  * @phba: lpfc_hba pointer.
+  * @val: link speed value.
+  *
+@@ -2601,12 +2620,29 @@ static struct bin_attribute sysfs_drvr_s
+  * non-zero return value from lpfc_issue_lip()
+  * -EINVAL val out of range
+  **/
+-static int
+-lpfc_link_speed_set(struct lpfc_hba *phba, int val)
++static ssize_t
++lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
++              const char *buf, size_t count)
+ {
++      struct Scsi_Host  *shost = class_to_shost(dev);
++      struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
++      struct lpfc_hba   *phba = vport->phba;
++      int val = 0;
++      int nolip = 0;
++      const char *val_buf = buf;
+       int err;
+       uint32_t prev_val;
++      if (!strncmp(buf, "nolip ", strlen("nolip "))) {
++              nolip = 1;
++              val_buf = &buf[strlen("nolip ")];
++      }
++
++      if (!isdigit(val_buf[0]))
++              return -EINVAL;
++      if (sscanf(val_buf, "%i", &val) != 1)
++              return -EINVAL;
++
+       if (((val == LINK_SPEED_1G) && !(phba->lmt & LMT_1Gb)) ||
+               ((val == LINK_SPEED_2G) && !(phba->lmt & LMT_2Gb)) ||
+               ((val == LINK_SPEED_4G) && !(phba->lmt & LMT_4Gb)) ||
+@@ -2614,14 +2650,19 @@ lpfc_link_speed_set(struct lpfc_hba *phb
+               ((val == LINK_SPEED_10G) && !(phba->lmt & LMT_10Gb)))
+               return -EINVAL;
+-      if ((val >= 0 && val <= LPFC_MAX_LINK_SPEED)
++      if ((val >= 0 && val <= 8)
+               && (LPFC_LINK_SPEED_BITMAP & (1 << val))) {
+               prev_val = phba->cfg_link_speed;
+               phba->cfg_link_speed = val;
++              if (nolip)
++                      return strlen(buf);
++
+               err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
+-              if (err)
++              if (err) {
+                       phba->cfg_link_speed = prev_val;
+-              return err;
++                      return -EINVAL;
++              } else
++                      return strlen(buf);
+       }
+       lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+@@ -2637,7 +2678,7 @@ MODULE_PARM_DESC(lpfc_link_speed, "Selec
+ lpfc_param_show(link_speed)
+ /**
+- * lpfc_link_speed_init: Set the adapters link speed.
++ * lpfc_link_speed_init - Set the adapters link speed
+  * @phba: lpfc_hba pointer.
+  * @val: link speed value.
+  *
+@@ -2668,7 +2709,6 @@ lpfc_link_speed_init(struct lpfc_hba *ph
+       return -EINVAL;
+ }
+-lpfc_param_store(link_speed)
+ static DEVICE_ATTR(lpfc_link_speed, S_IRUGO | S_IWUSR,
+               lpfc_link_speed_show, lpfc_link_speed_store);
+@@ -2865,7 +2905,7 @@ MODULE_PARM_DESC(lpfc_prot_guard, "host 
+ /*
+- * lpfc_sg_seg_cnt: Initial Maximum DMA Segment Count
++ * lpfc_sg_seg_cnt - Initial Maximum DMA Segment Count
+  * This value can be set to values between 64 and 256. The default value is
+  * 64, but may be increased to allow for larger Max I/O sizes. The scsi layer
+  * will be allowed to request I/Os of sizes up to (MAX_SEG_COUNT * SEG_SIZE).
+@@ -2967,7 +3007,7 @@ struct device_attribute *lpfc_vport_attr
+ };
+ /**
+- * sysfs_ctlreg_write: Write method for writing to ctlreg.
++ * sysfs_ctlreg_write - Write method for writing to ctlreg
+  * @kobj: kernel kobject that contains the kernel class device.
+  * @bin_attr: kernel attributes passed to us.
+  * @buf: contains the data to be written to the adapter IOREG space.
+@@ -3017,7 +3057,7 @@ sysfs_ctlreg_write(struct kobject *kobj,
+ }
+ /**
+- * sysfs_ctlreg_read: Read method for reading from ctlreg.
++ * sysfs_ctlreg_read - Read method for reading from ctlreg
+  * @kobj: kernel kobject that contains the kernel class device.
+  * @bin_attr: kernel attributes passed to us.
+  * @buf: if succesful contains the data from the adapter IOREG space.
+@@ -3078,7 +3118,7 @@ static struct bin_attribute sysfs_ctlreg
+ };
+ /**
+- * sysfs_mbox_idle: frees the sysfs mailbox.
++ * sysfs_mbox_idle - frees the sysfs mailbox
+  * @phba: lpfc_hba pointer
+  **/
+ static void
+@@ -3095,7 +3135,7 @@ sysfs_mbox_idle(struct lpfc_hba *phba)
+ }
+ /**
+- * sysfs_mbox_write: Write method for writing information via mbox.
++ * sysfs_mbox_write - Write method for writing information via mbox
+  * @kobj: kernel kobject that contains the kernel class device.
+  * @bin_attr: kernel attributes passed to us.
+  * @buf: contains the data to be written to sysfs mbox.
+@@ -3170,7 +3210,7 @@ sysfs_mbox_write(struct kobject *kobj, s
+ }
+ /**
+- * sysfs_mbox_read: Read method for reading information via mbox.
++ * sysfs_mbox_read - Read method for reading information via mbox
+  * @kobj: kernel kobject that contains the kernel class device.
+  * @bin_attr: kernel attributes passed to us.
+  * @buf: contains the data to be read from sysfs mbox.
+@@ -3374,7 +3414,7 @@ static struct bin_attribute sysfs_mbox_a
+ };
+ /**
+- * lpfc_alloc_sysfs_attr: Creates the ctlreg and mbox entries.
++ * lpfc_alloc_sysfs_attr - Creates the ctlreg and mbox entries
+  * @vport: address of lpfc vport structure.
+  *
+  * Return codes:
+@@ -3415,7 +3455,7 @@ out:
+ }
+ /**
+- * lpfc_free_sysfs_attr: Removes the ctlreg and mbox entries.
++ * lpfc_free_sysfs_attr - Removes the ctlreg and mbox entries
+  * @vport: address of lpfc vport structure.
+  **/
+ void
+@@ -3437,7 +3477,7 @@ lpfc_free_sysfs_attr(struct lpfc_vport *
+  */
+ /**
+- * lpfc_get_host_port_id: Copy the vport DID into the scsi host port id.
++ * lpfc_get_host_port_id - Copy the vport DID into the scsi host port id
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3450,7 +3490,7 @@ lpfc_get_host_port_id(struct Scsi_Host *
+ }
+ /**
+- * lpfc_get_host_port_type: Set the value of the scsi host port type.
++ * lpfc_get_host_port_type - Set the value of the scsi host port type
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3482,7 +3522,7 @@ lpfc_get_host_port_type(struct Scsi_Host
+ }
+ /**
+- * lpfc_get_host_port_state: Set the value of the scsi host port state.
++ * lpfc_get_host_port_state - Set the value of the scsi host port state
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3520,7 +3560,7 @@ lpfc_get_host_port_state(struct Scsi_Hos
+ }
+ /**
+- * lpfc_get_host_speed: Set the value of the scsi host speed.
++ * lpfc_get_host_speed - Set the value of the scsi host speed
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3556,7 +3596,7 @@ lpfc_get_host_speed(struct Scsi_Host *sh
+ }
+ /**
+- * lpfc_get_host_fabric_name: Set the value of the scsi host fabric name.
++ * lpfc_get_host_fabric_name - Set the value of the scsi host fabric name
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3582,7 +3622,7 @@ lpfc_get_host_fabric_name (struct Scsi_H
+ }
+ /**
+- * lpfc_get_stats: Return statistical information about the adapter.
++ * lpfc_get_stats - Return statistical information about the adapter
+  * @shost: kernel scsi host pointer.
+  *
+  * Notes:
+@@ -3707,7 +3747,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
+ }
+ /**
+- * lpfc_reset_stats: Copy the adapter link stats information.
++ * lpfc_reset_stats - Copy the adapter link stats information
+  * @shost: kernel scsi host pointer.
+  **/
+ static void
+@@ -3788,7 +3828,7 @@ lpfc_reset_stats(struct Scsi_Host *shost
+  */
+ /**
+- * lpfc_get_node_by_target: Return the nodelist for a target.
++ * lpfc_get_node_by_target - Return the nodelist for a target
+  * @starget: kernel scsi target pointer.
+  *
+  * Returns:
+@@ -3817,7 +3857,7 @@ lpfc_get_node_by_target(struct scsi_targ
+ }
+ /**
+- * lpfc_get_starget_port_id: Set the target port id to the ndlp DID or -1.
++ * lpfc_get_starget_port_id - Set the target port id to the ndlp DID or -1
+  * @starget: kernel scsi target pointer.
+  **/
+ static void
+@@ -3829,7 +3869,7 @@ lpfc_get_starget_port_id(struct scsi_tar
+ }
+ /**
+- * lpfc_get_starget_node_name: Set the target node name.
++ * lpfc_get_starget_node_name - Set the target node name
+  * @starget: kernel scsi target pointer.
+  *
+  * Description: Set the target node name to the ndlp node name wwn or zero.
+@@ -3844,7 +3884,7 @@ lpfc_get_starget_node_name(struct scsi_t
+ }
+ /**
+- * lpfc_get_starget_port_name: Set the target port name.
++ * lpfc_get_starget_port_name - Set the target port name
+  * @starget: kernel scsi target pointer.
+  *
+  * Description:  set the target port name to the ndlp port name wwn or zero.
+@@ -3859,7 +3899,7 @@ lpfc_get_starget_port_name(struct scsi_t
+ }
+ /**
+- * lpfc_set_rport_loss_tmo: Set the rport dev loss tmo.
++ * lpfc_set_rport_loss_tmo - Set the rport dev loss tmo
+  * @rport: fc rport address.
+  * @timeout: new value for dev loss tmo.
+  *
+@@ -3877,7 +3917,7 @@ lpfc_set_rport_loss_tmo(struct fc_rport 
+ }
+ /**
+- * lpfc_rport_show_function: Return rport target information.
++ * lpfc_rport_show_function - Return rport target information
+  *
+  * Description:
+  * Macro that uses field to generate a function with the name lpfc_show_rport_
+@@ -3905,7 +3945,7 @@ lpfc_show_rport_##field (struct device *
+ static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)
+ /**
+- * lpfc_set_vport_symbolic_name: Set the vport's symbolic name.
++ * lpfc_set_vport_symbolic_name - Set the vport's symbolic name
+  * @fc_vport: The fc_vport who's symbolic name has been changed.
+  *
+  * Description:
+@@ -4048,7 +4088,7 @@ struct fc_function_template lpfc_vport_t
+ };
+ /**
+- * lpfc_get_cfgparam: Used during probe_one to init the adapter structure.
++ * lpfc_get_cfgparam - Used during probe_one to init the adapter structure
+  * @phba: lpfc_hba pointer.
+  **/
+ void
+@@ -4097,7 +4137,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_get_vport_cfgparam: Used during port create, init the vport structure.
++ * lpfc_get_vport_cfgparam - Used during port create, init the vport structure
+  * @vport: lpfc_vport pointer.
+  **/
+ void
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_crtn.h linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_crtn.h
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_crtn.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_crtn.h 2009-05-13 09:46:19.000000000 +0200
+@@ -184,6 +184,8 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
+ struct lpfc_iocbq * lpfc_sli_get_iocbq(struct lpfc_hba *);
+ void lpfc_sli_release_iocbq(struct lpfc_hba *, struct lpfc_iocbq *);
+ uint16_t lpfc_sli_next_iotag(struct lpfc_hba *, struct lpfc_iocbq *);
++void lpfc_sli_cancel_iocbs(struct lpfc_hba *, struct list_head *, uint32_t,
++                         uint32_t);
+ void lpfc_reset_barrier(struct lpfc_hba * phba);
+ int lpfc_sli_brdready(struct lpfc_hba *, uint32_t);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_debugfs.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_debugfs.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_debugfs.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_debugfs.c      2009-05-13 09:46:19.000000000 +0200
+@@ -47,7 +47,7 @@
+ #include "lpfc_debugfs.h"
+ #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+-/**
++/*
+  * debugfs interface
+  *
+  * To access this interface the user should:
+@@ -95,7 +95,7 @@ module_param(lpfc_debugfs_max_slow_ring_
+ MODULE_PARM_DESC(lpfc_debugfs_max_slow_ring_trc,
+       "Set debugfs slow ring trace depth");
+-int lpfc_debugfs_mask_disc_trc;
++static int lpfc_debugfs_mask_disc_trc;
+ module_param(lpfc_debugfs_mask_disc_trc, int, 0);
+ MODULE_PARM_DESC(lpfc_debugfs_mask_disc_trc,
+       "Set debugfs discovery trace mask");
+@@ -127,7 +127,7 @@ static atomic_t lpfc_debugfs_seq_trc_cnt
+ static unsigned long lpfc_debugfs_start_time = 0L;
+ /**
+- * lpfc_debugfs_disc_trc_data - Dump discovery logging to a buffer.
++ * lpfc_debugfs_disc_trc_data - Dump discovery logging to a buffer
+  * @vport: The vport to gather the log info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -187,7 +187,7 @@ lpfc_debugfs_disc_trc_data(struct lpfc_v
+ }
+ /**
+- * lpfc_debugfs_slow_ring_trc_data - Dump slow ring logging to a buffer.
++ * lpfc_debugfs_slow_ring_trc_data - Dump slow ring logging to a buffer
+  * @phba: The HBA to gather the log info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -250,7 +250,7 @@ lpfc_debugfs_slow_ring_trc_data(struct l
+ static int lpfc_debugfs_last_hbq = -1;
+ /**
+- * lpfc_debugfs_hbqinfo_data - Dump host buffer queue info to a buffer.
++ * lpfc_debugfs_hbqinfo_data - Dump host buffer queue info to a buffer
+  * @phba: The HBA to gather host buffer info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -369,7 +369,7 @@ skipit:
+ static int lpfc_debugfs_last_hba_slim_off;
+ /**
+- * lpfc_debugfs_dumpHBASlim_data - Dump HBA SLIM info to a buffer.
++ * lpfc_debugfs_dumpHBASlim_data - Dump HBA SLIM info to a buffer
+  * @phba: The HBA to gather SLIM info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -399,8 +399,7 @@ lpfc_debugfs_dumpHBASlim_data(struct lpf
+       len +=  snprintf(buf+len, size-len, "HBA SLIM\n");
+       lpfc_memcpy_from_slim(buffer,
+-              ((uint8_t *)phba->MBslimaddr) + lpfc_debugfs_last_hba_slim_off,
+-              1024);
++              phba->MBslimaddr + lpfc_debugfs_last_hba_slim_off, 1024);
+       ptr = (uint32_t *)&buffer[0];
+       off = lpfc_debugfs_last_hba_slim_off;
+@@ -426,7 +425,7 @@ lpfc_debugfs_dumpHBASlim_data(struct lpf
+ }
+ /**
+- * lpfc_debugfs_dumpHostSlim_data - Dump host SLIM info to a buffer.
++ * lpfc_debugfs_dumpHostSlim_data - Dump host SLIM info to a buffer
+  * @phba: The HBA to gather Host SLIM info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -501,7 +500,7 @@ lpfc_debugfs_dumpHostSlim_data(struct lp
+ }
+ /**
+- * lpfc_debugfs_nodelist_data - Dump target node list to a buffer.
++ * lpfc_debugfs_nodelist_data - Dump target node list to a buffer
+  * @vport: The vport to gather target node info from.
+  * @buf: The buffer to dump log into.
+  * @size: The maximum amount of data to process.
+@@ -599,7 +598,7 @@ lpfc_debugfs_nodelist_data(struct lpfc_v
+ #endif
+ /**
+- * lpfc_debugfs_disc_trc - Store discovery trace log.
++ * lpfc_debugfs_disc_trc - Store discovery trace log
+  * @vport: The vport to associate this trace string with for retrieval.
+  * @mask: Log entry classification.
+  * @fmt: Format string to be displayed when dumping the log.
+@@ -643,7 +642,7 @@ lpfc_debugfs_disc_trc(struct lpfc_vport 
+ }
+ /**
+- * lpfc_debugfs_slow_ring_trc - Store slow ring trace log.
++ * lpfc_debugfs_slow_ring_trc - Store slow ring trace log
+  * @phba: The phba to associate this trace string with for retrieval.
+  * @fmt: Format string to be displayed when dumping the log.
+  * @data1: 1st data parameter to be applied to @fmt.
+@@ -682,7 +681,7 @@ lpfc_debugfs_slow_ring_trc(struct lpfc_h
+ #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+ /**
+- * lpfc_debugfs_disc_trc_open - Open the discovery trace log.
++ * lpfc_debugfs_disc_trc_open - Open the discovery trace log
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -732,7 +731,7 @@ out:
+ }
+ /**
+- * lpfc_debugfs_slow_ring_trc_open - Open the Slow Ring trace log.
++ * lpfc_debugfs_slow_ring_trc_open - Open the Slow Ring trace log
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -782,7 +781,7 @@ out:
+ }
+ /**
+- * lpfc_debugfs_hbqinfo_open - Open the hbqinfo debugfs buffer.
++ * lpfc_debugfs_hbqinfo_open - Open the hbqinfo debugfs buffer
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -824,7 +823,7 @@ out:
+ }
+ /**
+- * lpfc_debugfs_dumpHBASlim_open - Open the Dump HBA SLIM debugfs buffer.
++ * lpfc_debugfs_dumpHBASlim_open - Open the Dump HBA SLIM debugfs buffer
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -866,7 +865,7 @@ out:
+ }
+ /**
+- * lpfc_debugfs_dumpHostSlim_open - Open the Dump Host SLIM debugfs buffer.
++ * lpfc_debugfs_dumpHostSlim_open - Open the Dump Host SLIM debugfs buffer
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -993,7 +992,7 @@ lpfc_debugfs_dumpDataDif_write(struct fi
+ /**
+- * lpfc_debugfs_nodelist_open - Open the nodelist debugfs file.
++ * lpfc_debugfs_nodelist_open - Open the nodelist debugfs file
+  * @inode: The inode pointer that contains a vport pointer.
+  * @file: The file pointer to attach the log output.
+  *
+@@ -1035,7 +1034,7 @@ out:
+ }
+ /**
+- * lpfc_debugfs_lseek - Seek through a debugfs file.
++ * lpfc_debugfs_lseek - Seek through a debugfs file
+  * @file: The file pointer to seek through.
+  * @off: The offset to seek to or the amount to seek by.
+  * @whence: Indicates how to seek.
+@@ -1073,7 +1072,7 @@ lpfc_debugfs_lseek(struct file *file, lo
+ }
+ /**
+- * lpfc_debugfs_read - Read a debugfs file.
++ * lpfc_debugfs_read - Read a debugfs file
+  * @file: The file pointer to read from.
+  * @buf: The buffer to copy the data to.
+  * @nbytes: The number of bytes to read.
+@@ -1098,7 +1097,7 @@ lpfc_debugfs_read(struct file *file, cha
+ }
+ /**
+- * lpfc_debugfs_release - Release the buffer used to store debugfs file data.
++ * lpfc_debugfs_release - Release the buffer used to store debugfs file data
+  * @inode: The inode pointer that contains a vport pointer. (unused)
+  * @file: The file pointer that contains the buffer to release.
+  *
+@@ -1210,7 +1209,7 @@ static atomic_t lpfc_debugfs_hba_count;
+ #endif
+ /**
+- * lpfc_debugfs_initialize - Initialize debugfs for a vport.
++ * lpfc_debugfs_initialize - Initialize debugfs for a vport
+  * @vport: The vport pointer to initialize.
+  *
+  * Description:
+@@ -1434,7 +1433,7 @@ debug_failed:
+ }
+ /**
+- * lpfc_debugfs_terminate -  Tear down debugfs infrastructure for this vport.
++ * lpfc_debugfs_terminate -  Tear down debugfs infrastructure for this vport
+  * @vport: The vport pointer to remove from debugfs.
+  *
+  * Description:
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_disc.h linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_disc.h
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_disc.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_disc.h 2009-05-13 09:46:19.000000000 +0200
+@@ -99,6 +99,7 @@ struct lpfc_nodelist {
+ #define NLP_USG_FREE_ACK_BIT  0x8     /* Indicate ndlp memory free invoked */
+       struct timer_list   nlp_delayfunc;      /* Used for delayed ELS cmds */
++      struct lpfc_hba *phba;
+       struct fc_rport *rport;                 /* Corresponding FC transport
+                                                  port structure */
+       struct lpfc_vport *vport;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_els.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_els.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_els.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_els.c  2009-05-13 09:46:19.000000000 +0200
+@@ -55,7 +55,7 @@ static void lpfc_register_new_vport(stru
+ static int lpfc_max_els_tries = 3;
+ /**
+- * lpfc_els_chk_latt: Check host link attention event for a vport.
++ * lpfc_els_chk_latt - Check host link attention event for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine checks whether there is an outstanding host link
+@@ -116,7 +116,7 @@ lpfc_els_chk_latt(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_prep_els_iocb: Allocate and prepare a lpfc iocb data structure.
++ * lpfc_prep_els_iocb - Allocate and prepare a lpfc iocb data structure
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @expectRsp: flag indicating whether response is expected.
+  * @cmdSize: size of the ELS command.
+@@ -290,7 +290,7 @@ els_iocb_free_pcmb_exit:
+ }
+ /**
+- * lpfc_issue_fabric_reglogin: Issue fabric registration login for a vport.
++ * lpfc_issue_fabric_reglogin - Issue fabric registration login for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine issues a fabric registration login for a @vport. An
+@@ -386,7 +386,7 @@ fail:
+ }
+ /**
+- * lpfc_cmpl_els_flogi_fabric: Completion function for flogi to a fabric port.
++ * lpfc_cmpl_els_flogi_fabric - Completion function for flogi to a fabric port
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @sp: pointer to service parameter data structure.
+@@ -509,7 +509,7 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_v
+ }
+ /**
+- * lpfc_cmpl_els_flogi_nport: Completion function for flogi to an N_Port.
++ * lpfc_cmpl_els_flogi_nport - Completion function for flogi to an N_Port
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @sp: pointer to service parameter data structure.
+@@ -626,7 +626,7 @@ fail:
+ }
+ /**
+- * lpfc_cmpl_els_flogi: Completion callback function for flogi.
++ * lpfc_cmpl_els_flogi - Completion callback function for flogi
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -751,7 +751,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_flogi: Issue an flogi iocb command for a vport.
++ * lpfc_issue_els_flogi - Issue an flogi iocb command for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @retry: number of retries to the command IOCB.
+@@ -849,7 +849,7 @@ lpfc_issue_els_flogi(struct lpfc_vport *
+ }
+ /**
+- * lpfc_els_abort_flogi: Abort all outstanding flogi iocbs.
++ * lpfc_els_abort_flogi - Abort all outstanding flogi iocbs
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine aborts all the outstanding Fabric Login (FLOGI) IOCBs
+@@ -898,7 +898,7 @@ lpfc_els_abort_flogi(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_initial_flogi: Issue an initial fabric login for a vport.
++ * lpfc_initial_flogi - Issue an initial fabric login for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine issues an initial Fabric Login (FLOGI) for the @vport
+@@ -949,7 +949,7 @@ lpfc_initial_flogi(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_initial_fdisc: Issue an initial fabric discovery for a vport.
++ * lpfc_initial_fdisc - Issue an initial fabric discovery for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine issues an initial Fabric Discover (FDISC) for the @vport
+@@ -998,7 +998,7 @@ lpfc_initial_fdisc(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_more_plogi: Check and issue remaining plogis for a vport.
++ * lpfc_more_plogi - Check and issue remaining plogis for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine checks whether there are more remaining Port Logins
+@@ -1031,7 +1031,7 @@ lpfc_more_plogi(struct lpfc_vport *vport
+ }
+ /**
+- * lpfc_plogi_confirm_nport: Confirm pologi wwpn matches stored ndlp.
++ * lpfc_plogi_confirm_nport - Confirm pologi wwpn matches stored ndlp
+  * @phba: pointer to lpfc hba data structure.
+  * @prsp: pointer to response IOCB payload.
+  * @ndlp: pointer to a node-list data structure.
+@@ -1165,7 +1165,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba
+ }
+ /**
+- * lpfc_end_rscn: Check and handle more rscn for a vport.
++ * lpfc_end_rscn - Check and handle more rscn for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine checks whether more Registration State Change
+@@ -1197,7 +1197,7 @@ lpfc_end_rscn(struct lpfc_vport *vport)
+ }
+ /**
+- * lpfc_cmpl_els_plogi: Completion callback function for plogi.
++ * lpfc_cmpl_els_plogi - Completion callback function for plogi
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -1322,7 +1322,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_plogi: Issue an plogi iocb command for a vport.
++ * lpfc_issue_els_plogi - Issue an plogi iocb command for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @did: destination port identifier.
+  * @retry: number of retries to the command IOCB.
+@@ -1401,7 +1401,7 @@ lpfc_issue_els_plogi(struct lpfc_vport *
+ }
+ /**
+- * lpfc_cmpl_els_prli: Completion callback function for prli.
++ * lpfc_cmpl_els_prli - Completion callback function for prli
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -1472,7 +1472,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_prli: Issue a prli iocb command for a vport.
++ * lpfc_issue_els_prli - Issue a prli iocb command for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @retry: number of retries to the command IOCB.
+@@ -1562,7 +1562,7 @@ lpfc_issue_els_prli(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_rscn_disc: Perform rscn discovery for a vport.
++ * lpfc_rscn_disc - Perform rscn discovery for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine performs Registration State Change Notification (RSCN)
+@@ -1588,7 +1588,7 @@ lpfc_rscn_disc(struct lpfc_vport *vport)
+ }
+ /**
+- * lpfc_adisc_done: Complete the adisc phase of discovery.
++ * lpfc_adisc_done - Complete the adisc phase of discovery
+  * @vport: pointer to lpfc_vport hba data structure that finished all ADISCs.
+  *
+  * This function is called when the final ADISC is completed during discovery.
+@@ -1639,7 +1639,7 @@ lpfc_adisc_done(struct lpfc_vport *vport
+ }
+ /**
+- * lpfc_more_adisc: Issue more adisc as needed.
++ * lpfc_more_adisc - Issue more adisc as needed
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine determines whether there are more ndlps on a @vport
+@@ -1672,7 +1672,7 @@ lpfc_more_adisc(struct lpfc_vport *vport
+ }
+ /**
+- * lpfc_cmpl_els_adisc: Completion callback function for adisc.
++ * lpfc_cmpl_els_adisc - Completion callback function for adisc
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -1760,7 +1760,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_adisc: Issue an address discover iocb to an node on a vport.
++ * lpfc_issue_els_adisc - Issue an address discover iocb to an node on a vport
+  * @vport: pointer to a virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @retry: number of retries to the command IOCB.
+@@ -1833,7 +1833,7 @@ lpfc_issue_els_adisc(struct lpfc_vport *
+ }
+ /**
+- * lpfc_cmpl_els_logo: Completion callback function for logo.
++ * lpfc_cmpl_els_logo - Completion callback function for logo
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -1910,7 +1910,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_logo: Issue a logo to an node on a vport.
++ * lpfc_issue_els_logo - Issue a logo to an node on a vport
+  * @vport: pointer to a virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @retry: number of retries to the command IOCB.
+@@ -1991,7 +1991,7 @@ lpfc_issue_els_logo(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_cmpl_els_cmd: Completion callback function for generic els command.
++ * lpfc_cmpl_els_cmd - Completion callback function for generic els command
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -2031,7 +2031,7 @@ lpfc_cmpl_els_cmd(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_issue_els_scr: Issue a scr to an node on a vport.
++ * lpfc_issue_els_scr - Issue a scr to an node on a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @nportid: N_Port identifier to the remote node.
+  * @retry: number of retries to the command IOCB.
+@@ -2125,7 +2125,7 @@ lpfc_issue_els_scr(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_issue_els_farpr: Issue a farp to an node on a vport.
++ * lpfc_issue_els_farpr - Issue a farp to an node on a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @nportid: N_Port identifier to the remote node.
+  * @retry: number of retries to the command IOCB.
+@@ -2236,7 +2236,7 @@ lpfc_issue_els_farpr(struct lpfc_vport *
+ }
+ /**
+- * lpfc_cancel_retry_delay_tmo: Cancel the timer with delayed iocb-cmd retry.
++ * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @nlp: pointer to a node-list data structure.
+  *
+@@ -2291,7 +2291,7 @@ lpfc_cancel_retry_delay_tmo(struct lpfc_
+ }
+ /**
+- * lpfc_els_retry_delay: Timer function with a ndlp delayed function timer.
++ * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
+  * @ptr: holder for the pointer to the timer function associated data (ndlp).
+  *
+  * This routine is invoked by the ndlp delayed-function timer to check
+@@ -2333,7 +2333,7 @@ lpfc_els_retry_delay(unsigned long ptr)
+ }
+ /**
+- * lpfc_els_retry_delay_handler: Work thread handler for ndlp delayed function.
++ * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
+  * @ndlp: pointer to a node-list data structure.
+  *
+  * This routine is the worker-thread handler for processing the @ndlp delayed
+@@ -2404,7 +2404,7 @@ lpfc_els_retry_delay_handler(struct lpfc
+ }
+ /**
+- * lpfc_els_retry: Make retry decision on an els command iocb.
++ * lpfc_els_retry - Make retry decision on an els command iocb
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -2732,7 +2732,7 @@ lpfc_els_retry(struct lpfc_hba *phba, st
+ }
+ /**
+- * lpfc_els_free_data: Free lpfc dma buffer and data structure with an iocb.
++ * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
+  * @phba: pointer to lpfc hba data structure.
+  * @buf_ptr1: pointer to the lpfc DMA buffer data structure.
+  *
+@@ -2764,7 +2764,7 @@ lpfc_els_free_data(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_els_free_bpl: Free lpfc dma buffer and data structure with bpl.
++ * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
+  * @phba: pointer to lpfc hba data structure.
+  * @buf_ptr: pointer to the lpfc dma buffer data structure.
+  *
+@@ -2784,7 +2784,7 @@ lpfc_els_free_bpl(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_els_free_iocb: Free a command iocb and its associated resources.
++ * lpfc_els_free_iocb - Free a command iocb and its associated resources
+  * @phba: pointer to lpfc hba data structure.
+  * @elsiocb: pointer to lpfc els command iocb data structure.
+  *
+@@ -2877,7 +2877,7 @@ lpfc_els_free_iocb(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_cmpl_els_logo_acc: Completion callback function to logo acc response.
++ * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -2931,7 +2931,7 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba *
+ }
+ /**
+- * lpfc_mbx_cmpl_dflt_rpi: Completion callbk func for unreg dflt rpi mbox cmd.
++ * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -2965,7 +2965,7 @@ lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *
+ }
+ /**
+- * lpfc_cmpl_els_rsp: Completion callback function for els response iocb cmd.
++ * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -3136,7 +3136,7 @@ out:
+ }
+ /**
+- * lpfc_els_rsp_acc: Prepare and issue an acc response iocb command.
++ * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @flag: the els command code to be accepted.
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+@@ -3275,7 +3275,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vpor
+ }
+ /**
+- * lpfc_els_rsp_reject: Propare and issue a rjt response iocb command.
++ * lpfc_els_rsp_reject - Propare and issue a rjt response iocb command
+  * @vport: pointer to a virtual N_Port data structure.
+  * @rejectError:
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+@@ -3356,7 +3356,7 @@ lpfc_els_rsp_reject(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_els_rsp_adisc_acc: Prepare and issue acc response to adisc iocb cmd.
++ * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
+  * @vport: pointer to a virtual N_Port data structure.
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -3431,7 +3431,7 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport
+ }
+ /**
+- * lpfc_els_rsp_prli_acc: Prepare and issue acc response to prli iocb cmd.
++ * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
+  * @vport: pointer to a virtual N_Port data structure.
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -3529,7 +3529,7 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport 
+ }
+ /**
+- * lpfc_els_rsp_rnid_acc: Issue rnid acc response iocb command.
++ * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
+  * @vport: pointer to a virtual N_Port data structure.
+  * @format: rnid command format.
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+@@ -3635,7 +3635,7 @@ lpfc_els_rsp_rnid_acc(struct lpfc_vport 
+ }
+ /**
+- * lpfc_els_disc_adisc: Issue remaining adisc iocbs to npr nodes of a vport.
++ * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine issues Address Discover (ADISC) ELS commands to those
+@@ -3693,7 +3693,7 @@ lpfc_els_disc_adisc(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_els_disc_plogi: Issue plogi for all npr nodes of a vport before adisc.
++ * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine issues Port Login (PLOGI) ELS commands to all the N_Ports
+@@ -3752,7 +3752,7 @@ lpfc_els_disc_plogi(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_els_flush_rscn: Clean up any rscn activities with a vport.
++ * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine cleans up any Registration State Change Notification
+@@ -3791,7 +3791,7 @@ lpfc_els_flush_rscn(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_rscn_payload_check: Check whether there is a pending rscn to a did.
++ * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @did: remote destination port identifier.
+  *
+@@ -3866,7 +3866,7 @@ return_did_out:
+ }
+ /**
+- * lpfc_rscn_recovery_check: Send recovery event to vport nodes matching rscn
++ * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine sends recovery (NLP_EVT_DEVICE_RECOVERY) event to the
+@@ -3895,7 +3895,7 @@ lpfc_rscn_recovery_check(struct lpfc_vpo
+ }
+ /**
+- * lpfc_send_rscn_event: Send an RSCN event to management application.
++ * lpfc_send_rscn_event - Send an RSCN event to management application
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  *
+@@ -3938,7 +3938,7 @@ lpfc_send_rscn_event(struct lpfc_vport *
+ }
+ /**
+- * lpfc_els_rcv_rscn: Process an unsolicited rscn iocb.
++ * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4134,7 +4134,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_els_handle_rscn: Handle rscn for a vport.
++ * lpfc_els_handle_rscn - Handle rscn for a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine handles the Registration State Configuration Notification
+@@ -4222,7 +4222,7 @@ lpfc_els_handle_rscn(struct lpfc_vport *
+ }
+ /**
+- * lpfc_els_rcv_flogi: Process an unsolicited flogi iocb.
++ * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4336,7 +4336,7 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_els_rcv_rnid: Process an unsolicited rnid iocb.
++ * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4391,7 +4391,7 @@ lpfc_els_rcv_rnid(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_els_rcv_lirr: Process an unsolicited lirr iocb.
++ * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4419,7 +4419,7 @@ lpfc_els_rcv_lirr(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_els_rsp_rps_acc: Completion callbk func for MBX_READ_LNK_STAT mbox cmd.
++ * lpfc_els_rsp_rps_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -4513,7 +4513,7 @@ lpfc_els_rsp_rps_acc(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_els_rcv_rps: Process an unsolicited rps iocb.
++ * lpfc_els_rcv_rps - Process an unsolicited rps iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4590,7 +4590,7 @@ reject_out:
+ }
+ /**
+- * lpfc_els_rsp_rpl_acc: Issue an accept rpl els command.
++ * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdsize: size of the ELS command.
+  * @oldiocb: pointer to the original lpfc command iocb data structure.
+@@ -4662,7 +4662,7 @@ lpfc_els_rsp_rpl_acc(struct lpfc_vport *
+ }
+ /**
+- * lpfc_els_rcv_rpl: Process an unsolicited rpl iocb.
++ * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4721,7 +4721,7 @@ lpfc_els_rcv_rpl(struct lpfc_vport *vpor
+ }
+ /**
+- * lpfc_els_rcv_farp: Process an unsolicited farp request els command.
++ * lpfc_els_rcv_farp - Process an unsolicited farp request els command
+  * @vport: pointer to a virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4804,7 +4804,7 @@ lpfc_els_rcv_farp(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_els_rcv_farpr: Process an unsolicited farp response iocb.
++ * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -4842,7 +4842,7 @@ lpfc_els_rcv_farpr(struct lpfc_vport *vp
+ }
+ /**
+- * lpfc_els_rcv_fan: Process an unsolicited fan iocb command.
++ * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @fan_ndlp: pointer to a node-list data structure.
+@@ -4890,7 +4890,7 @@ lpfc_els_rcv_fan(struct lpfc_vport *vpor
+ }
+ /**
+- * lpfc_els_timeout: Handler funciton to the els timer.
++ * lpfc_els_timeout - Handler funciton to the els timer
+  * @ptr: holder for the timer function associated data.
+  *
+  * This routine is invoked by the ELS timer after timeout. It posts the ELS
+@@ -4919,7 +4919,7 @@ lpfc_els_timeout(unsigned long ptr)
+ }
+ /**
+- * lpfc_els_timeout_handler: Process an els timeout event.
++ * lpfc_els_timeout_handler - Process an els timeout event
+  * @vport: pointer to a virtual N_Port data structure.
+  *
+  * This routine is the actual handler function that processes an ELS timeout
+@@ -4994,7 +4994,7 @@ lpfc_els_timeout_handler(struct lpfc_vpo
+ }
+ /**
+- * lpfc_els_flush_cmd: Clean up the outstanding els commands to a vport.
++ * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
+  * @vport: pointer to a host virtual N_Port data structure.
+  *
+  * This routine is used to clean up all the outstanding ELS commands on a
+@@ -5058,25 +5058,15 @@ lpfc_els_flush_cmd(struct lpfc_vport *vp
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              piocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              cmd = &piocb->iocb;
+-              list_del_init(&piocb->list);
+-
+-              if (!piocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, piocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (piocb->iocb_cmpl) (phba, piocb, piocb);
+-              }
+-      }
++      /* Cancell all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+       return;
+ }
+ /**
+- * lpfc_els_flush_all_cmd: Clean up all the outstanding els commands to a HBA.
++ * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is used to clean up all the outstanding ELS commands on a
+@@ -5121,23 +5111,16 @@ lpfc_els_flush_all_cmd(struct lpfc_hba  
+               lpfc_sli_issue_abort_iotag(phba, pring, piocb);
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              piocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              cmd = &piocb->iocb;
+-              list_del_init(&piocb->list);
+-              if (!piocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, piocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (piocb->iocb_cmpl) (phba, piocb, piocb);
+-              }
+-      }
++
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
++
+       return;
+ }
+ /**
+- * lpfc_send_els_failure_event: Posts an ELS command failure event.
++ * lpfc_send_els_failure_event - Posts an ELS command failure event
+  * @phba: Pointer to hba context object.
+  * @cmdiocbp: Pointer to command iocb which reported error.
+  * @rspiocbp: Pointer to response iocb which reported error.
+@@ -5204,7 +5187,7 @@ lpfc_send_els_failure_event(struct lpfc_
+ }
+ /**
+- * lpfc_send_els_event: Posts unsolicited els event.
++ * lpfc_send_els_event - Posts unsolicited els event
+  * @vport: Pointer to vport object.
+  * @ndlp: Pointer FC node object.
+  * @cmd: ELS command code.
+@@ -5284,7 +5267,7 @@ lpfc_send_els_event(struct lpfc_vport *v
+ /**
+- * lpfc_els_unsol_buffer: Process an unsolicited event data buffer.
++ * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
+  * @phba: pointer to lpfc hba data structure.
+  * @pring: pointer to a SLI ring.
+  * @vport: pointer to a host virtual N_Port data structure.
+@@ -5592,7 +5575,7 @@ dropit:
+ }
+ /**
+- * lpfc_find_vport_by_vpid: Find a vport on a HBA through vport identifier.
++ * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: host virtual N_Port identifier.
+  *
+@@ -5622,7 +5605,7 @@ lpfc_find_vport_by_vpid(struct lpfc_hba 
+ }
+ /**
+- * lpfc_els_unsol_event: Process an unsolicited event from an els sli ring.
++ * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
+  * @phba: pointer to lpfc hba data structure.
+  * @pring: pointer to a SLI ring.
+  * @elsiocb: pointer to lpfc els iocb data structure.
+@@ -5710,7 +5693,7 @@ lpfc_els_unsol_event(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_do_scr_ns_plogi: Issue a plogi to the name server for scr.
++ * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
+  * @phba: pointer to lpfc hba data structure.
+  * @vport: pointer to a virtual N_Port data structure.
+  *
+@@ -5781,7 +5764,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_cmpl_reg_new_vport: Completion callback function to register new vport.
++ * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -5850,7 +5833,7 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba 
+ }
+ /**
+- * lpfc_register_new_vport: Register a new vport with a HBA.
++ * lpfc_register_new_vport - Register a new vport with a HBA
+  * @phba: pointer to lpfc hba data structure.
+  * @vport: pointer to a host virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+@@ -5899,7 +5882,7 @@ mbox_err_exit:
+ }
+ /**
+- * lpfc_cmpl_els_fdisc: Completion function for fdisc iocb command.
++ * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -6007,7 +5990,7 @@ out:
+ }
+ /**
+- * lpfc_issue_els_fdisc: Issue a fdisc iocb command.
++ * lpfc_issue_els_fdisc - Issue a fdisc iocb command
+  * @vport: pointer to a virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  * @retry: number of retries to the command IOCB.
+@@ -6101,7 +6084,7 @@ lpfc_issue_els_fdisc(struct lpfc_vport *
+ }
+ /**
+- * lpfc_cmpl_els_npiv_logo: Completion function with vport logo.
++ * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -6136,7 +6119,7 @@ lpfc_cmpl_els_npiv_logo(struct lpfc_hba 
+ }
+ /**
+- * lpfc_issue_els_npiv_logo: Issue a logo off a vport.
++ * lpfc_issue_els_npiv_logo - Issue a logo off a vport
+  * @vport: pointer to a virtual N_Port data structure.
+  * @ndlp: pointer to a node-list data structure.
+  *
+@@ -6197,7 +6180,7 @@ lpfc_issue_els_npiv_logo(struct lpfc_vpo
+ }
+ /**
+- * lpfc_fabric_block_timeout: Handler function to the fabric block timer.
++ * lpfc_fabric_block_timeout - Handler function to the fabric block timer
+  * @ptr: holder for the timer function associated data.
+  *
+  * This routine is invoked by the fabric iocb block timer after
+@@ -6226,7 +6209,7 @@ lpfc_fabric_block_timeout(unsigned long 
+ }
+ /**
+- * lpfc_resume_fabric_iocbs: Issue a fabric iocb from driver internal list.
++ * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine issues one fabric iocb from the driver internal list to
+@@ -6285,7 +6268,7 @@ repeat:
+ }
+ /**
+- * lpfc_unblock_fabric_iocbs: Unblock issuing fabric iocb command.
++ * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine unblocks the  issuing fabric iocb command. The function
+@@ -6303,7 +6286,7 @@ lpfc_unblock_fabric_iocbs(struct lpfc_hb
+ }
+ /**
+- * lpfc_block_fabric_iocbs: Block issuing fabric iocb command.
++ * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine blocks the issuing fabric iocb for a specified amount of
+@@ -6325,7 +6308,7 @@ lpfc_block_fabric_iocbs(struct lpfc_hba 
+ }
+ /**
+- * lpfc_cmpl_fabric_iocb: Completion callback function for fabric iocb.
++ * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
+  * @phba: pointer to lpfc hba data structure.
+  * @cmdiocb: pointer to lpfc command iocb data structure.
+  * @rspiocb: pointer to lpfc response iocb data structure.
+@@ -6384,7 +6367,7 @@ lpfc_cmpl_fabric_iocb(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_issue_fabric_iocb: Issue a fabric iocb command.
++ * lpfc_issue_fabric_iocb - Issue a fabric iocb command
+  * @phba: pointer to lpfc hba data structure.
+  * @iocb: pointer to lpfc command iocb data structure.
+  *
+@@ -6453,7 +6436,7 @@ lpfc_issue_fabric_iocb(struct lpfc_hba *
+ }
+ /**
+- * lpfc_fabric_abort_vport: Abort a vport's iocbs from driver fabric iocb list.
++ * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
+  * @vport: pointer to a virtual N_Port data structure.
+  *
+  * This routine aborts all the IOCBs associated with a @vport from the
+@@ -6468,7 +6451,6 @@ static void lpfc_fabric_abort_vport(stru
+       LIST_HEAD(completions);
+       struct lpfc_hba  *phba = vport->phba;
+       struct lpfc_iocbq *tmp_iocb, *piocb;
+-      IOCB_t *cmd;
+       spin_lock_irq(&phba->hbalock);
+       list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
+@@ -6481,19 +6463,13 @@ static void lpfc_fabric_abort_vport(stru
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              piocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              list_del_init(&piocb->list);
+-
+-              cmd = &piocb->iocb;
+-              cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-              cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-              (piocb->iocb_cmpl) (phba, piocb, piocb);
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+ }
+ /**
+- * lpfc_fabric_abort_nport: Abort a ndlp's iocbs from driver fabric iocb list.
++ * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
+  * @ndlp: pointer to a node-list data structure.
+  *
+  * This routine aborts all the IOCBs associated with an @ndlp from the
+@@ -6506,10 +6482,9 @@ static void lpfc_fabric_abort_vport(stru
+ void lpfc_fabric_abort_nport(struct lpfc_nodelist *ndlp)
+ {
+       LIST_HEAD(completions);
+-      struct lpfc_hba  *phba = ndlp->vport->phba;
++      struct lpfc_hba  *phba = ndlp->phba;
+       struct lpfc_iocbq *tmp_iocb, *piocb;
+       struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
+-      IOCB_t *cmd;
+       spin_lock_irq(&phba->hbalock);
+       list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
+@@ -6521,19 +6496,13 @@ void lpfc_fabric_abort_nport(struct lpfc
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              piocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              list_del_init(&piocb->list);
+-
+-              cmd = &piocb->iocb;
+-              cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-              cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-              (piocb->iocb_cmpl) (phba, piocb, piocb);
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+ }
+ /**
+- * lpfc_fabric_abort_hba: Abort all iocbs on driver fabric iocb list.
++ * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine aborts all the IOCBs currently on the driver internal
+@@ -6546,20 +6515,12 @@ void lpfc_fabric_abort_nport(struct lpfc
+ void lpfc_fabric_abort_hba(struct lpfc_hba *phba)
+ {
+       LIST_HEAD(completions);
+-      struct lpfc_iocbq *piocb;
+-      IOCB_t *cmd;
+       spin_lock_irq(&phba->hbalock);
+       list_splice_init(&phba->fabric_iocb_list, &completions);
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              piocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              list_del_init(&piocb->list);
+-
+-              cmd = &piocb->iocb;
+-              cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-              cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-              (piocb->iocb_cmpl) (phba, piocb, piocb);
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc.h linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc.h
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc.h      2009-05-13 09:46:19.000000000 +0200
+@@ -443,6 +443,7 @@ struct lpfc_hba {
+       uint32_t hba_flag;      /* hba generic flags */
+ #define HBA_ERATT_HANDLED     0x1 /* This flag is set when eratt handled */
++#define DEFER_ERATT           0x4 /* Deferred error attention in progress */
+       struct lpfc_dmabuf slim2p;
+       MAILBOX_t *mbox;
+@@ -723,4 +724,3 @@ lpfc_sli_read_hs(struct lpfc_hba *phba)
+       return;
+ }
+-
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_hbadisc.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_hbadisc.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_hbadisc.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_hbadisc.c      2009-05-13 09:46:19.000000000 +0200
+@@ -78,7 +78,7 @@ lpfc_terminate_rport_io(struct fc_rport 
+               return;
+       }
+-      phba  = ndlp->vport->phba;
++      phba  = ndlp->phba;
+       lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_RPORT,
+               "rport terminate: sid:x%x did:x%x flg:x%x",
+@@ -276,7 +276,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_no
+ }
+ /**
+- * lpfc_alloc_fast_evt: Allocates data structure for posting event.
++ * lpfc_alloc_fast_evt - Allocates data structure for posting event
+  * @phba: Pointer to hba context object.
+  *
+  * This function is called from the functions which need to post
+@@ -303,7 +303,7 @@ lpfc_alloc_fast_evt(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_free_fast_evt: Frees event data structure.
++ * lpfc_free_fast_evt - Frees event data structure
+  * @phba: Pointer to hba context object.
+  * @evt:  Event object which need to be freed.
+  *
+@@ -319,7 +319,7 @@ lpfc_free_fast_evt(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_send_fastpath_evt: Posts events generated from fast path.
++ * lpfc_send_fastpath_evt - Posts events generated from fast path
+  * @phba: Pointer to hba context object.
+  * @evtp: Event data structure.
+  *
+@@ -1858,13 +1858,18 @@ lpfc_disable_node(struct lpfc_vport *vpo
+                               NLP_STE_UNUSED_NODE);
+ }
+ /**
+- * lpfc_initialize_node: Initialize all fields of node object.
++ * lpfc_initialize_node - Initialize all fields of node object
+  * @vport: Pointer to Virtual Port object.
+  * @ndlp: Pointer to FC node object.
+  * @did: FC_ID of the node.
+- *    This function is always called when node object need to
+- * be initialized. It initializes all the fields of the node
+- * object.
++ *
++ * This function is always called when node object need to be initialized.
++ * It initializes all the fields of the node object. Although the reference
++ * to phba from @ndlp can be obtained indirectly through it's reference to
++ * @vport, a direct reference to phba is taken here by @ndlp. This is due
++ * to the life-span of the @ndlp might go beyond the existence of @vport as
++ * the final release of ndlp is determined by its reference count. And, the
++ * operation on @ndlp needs the reference to phba.
+  **/
+ static inline void
+ lpfc_initialize_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
+@@ -1877,6 +1882,7 @@ lpfc_initialize_node(struct lpfc_vport *
+       ndlp->nlp_delayfunc.data = (unsigned long)ndlp;
+       ndlp->nlp_DID = did;
+       ndlp->vport = vport;
++      ndlp->phba = vport->phba;
+       ndlp->nlp_sid = NLP_NO_SID;
+       kref_init(&ndlp->kref);
+       NLP_INT_NODE_ACT(ndlp);
+@@ -2086,7 +2092,6 @@ lpfc_no_rpi(struct lpfc_hba *phba, struc
+       struct lpfc_sli *psli;
+       struct lpfc_sli_ring *pring;
+       struct lpfc_iocbq *iocb, *next_iocb;
+-      IOCB_t *icmd;
+       uint32_t rpi, i;
+       lpfc_fabric_abort_nport(ndlp);
+@@ -2122,19 +2127,9 @@ lpfc_no_rpi(struct lpfc_hba *phba, struc
+               }
+       }
+-      while (!list_empty(&completions)) {
+-              iocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      icmd = &iocb->iocb;
+-                      icmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      icmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (iocb->iocb_cmpl)(phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+       return 0;
+ }
+@@ -2186,9 +2181,13 @@ lpfc_unreg_all_rpis(struct lpfc_vport *v
+               mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
+               mbox->context1 = NULL;
+               rc = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
+-              if (rc == MBX_NOT_FINISHED) {
++              if (rc != MBX_TIMEOUT)
+                       mempool_free(mbox, phba->mbox_mem_pool);
+-              }
++
++              if ((rc == MBX_TIMEOUT) || (rc == MBX_NOT_FINISHED))
++                      lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX | LOG_VPORT,
++                              "1836 Could not issue "
++                              "unreg_login(all_rpis) status %d\n", rc);
+       }
+ }
+@@ -2206,12 +2205,14 @@ lpfc_unreg_default_rpis(struct lpfc_vpor
+               mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
+               mbox->context1 = NULL;
+               rc = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
+-              if (rc == MBX_NOT_FINISHED) {
++              if (rc != MBX_TIMEOUT)
++                      mempool_free(mbox, phba->mbox_mem_pool);
++
++              if ((rc == MBX_TIMEOUT) || (rc == MBX_NOT_FINISHED))
+                       lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX | LOG_VPORT,
+                                        "1815 Could not issue "
+-                                       "unreg_did (default rpis)\n");
+-                      mempool_free(mbox, phba->mbox_mem_pool);
+-              }
++                                       "unreg_did (default rpis) status %d\n",
++                                       rc);
+       }
+ }
+@@ -2470,14 +2471,13 @@ lpfc_setup_disc_node(struct lpfc_vport *
+                       if (ndlp->nlp_flag & NLP_RCV_PLOGI)
+                               return NULL;
+-                      spin_lock_irq(shost->host_lock);
+-                      ndlp->nlp_flag |= NLP_NPR_2B_DISC;
+-                      spin_unlock_irq(shost->host_lock);
+-
+                       /* Since this node is marked for discovery,
+                        * delay timeout is not needed.
+                        */
+                       lpfc_cancel_retry_delay_tmo(vport, ndlp);
++                      spin_lock_irq(shost->host_lock);
++                      ndlp->nlp_flag |= NLP_NPR_2B_DISC;
++                      spin_unlock_irq(shost->host_lock);
+               } else
+                       ndlp = NULL;
+       } else {
+@@ -2740,19 +2740,9 @@ lpfc_free_tx(struct lpfc_hba *phba, stru
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              iocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      icmd = &iocb->iocb;
+-                      icmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      icmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+ }
+ static void
+@@ -3173,7 +3163,7 @@ lpfc_nlp_release(struct kref *kref)
+       lpfc_nlp_remove(ndlp->vport, ndlp);
+       /* clear the ndlp active flag for all release cases */
+-      phba = ndlp->vport->phba;
++      phba = ndlp->phba;
+       spin_lock_irqsave(&phba->ndlp_lock, flags);
+       NLP_CLR_NODE_ACT(ndlp);
+       spin_unlock_irqrestore(&phba->ndlp_lock, flags);
+@@ -3181,7 +3171,7 @@ lpfc_nlp_release(struct kref *kref)
+       /* free ndlp memory for final ndlp release */
+       if (NLP_CHK_FREE_REQ(ndlp)) {
+               kfree(ndlp->lat_data);
+-              mempool_free(ndlp, ndlp->vport->phba->nlp_mem_pool);
++              mempool_free(ndlp, ndlp->phba->nlp_mem_pool);
+       }
+ }
+@@ -3204,7 +3194,7 @@ lpfc_nlp_get(struct lpfc_nodelist *ndlp)
+                * ndlp reference count that is in the process of being
+                * released.
+                */
+-              phba = ndlp->vport->phba;
++              phba = ndlp->phba;
+               spin_lock_irqsave(&phba->ndlp_lock, flags);
+               if (!NLP_CHK_NODE_ACT(ndlp) || NLP_CHK_FREE_ACK(ndlp)) {
+                       spin_unlock_irqrestore(&phba->ndlp_lock, flags);
+@@ -3240,7 +3230,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)
+       "node put:        did:x%x flg:x%x refcnt:x%x",
+               ndlp->nlp_DID, ndlp->nlp_flag,
+               atomic_read(&ndlp->kref.refcount));
+-      phba = ndlp->vport->phba;
++      phba = ndlp->phba;
+       spin_lock_irqsave(&phba->ndlp_lock, flags);
+       /* Check the ndlp memory free acknowledge flag to avoid the
+        * possible race condition that kref_put got invoked again
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_init.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_init.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_init.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_init.c 2009-05-13 09:46:19.000000000 +0200
+@@ -60,7 +60,7 @@ static struct scsi_transport_template *l
+ static DEFINE_IDR(lpfc_hba_index);
+ /**
+- * lpfc_config_port_prep: Perform lpfc initialization prior to config port.
++ * lpfc_config_port_prep - Perform lpfc initialization prior to config port
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine will do LPFC initialization prior to issuing the CONFIG_PORT
+@@ -221,7 +221,7 @@ out_free_mbox:
+ }
+ /**
+- * lpfc_config_async_cmpl: Completion handler for config async event mbox cmd.
++ * lpfc_config_async_cmpl - Completion handler for config async event mbox cmd
+  * @phba: pointer to lpfc hba data structure.
+  * @pmboxq: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -242,8 +242,7 @@ lpfc_config_async_cmpl(struct lpfc_hba *
+ }
+ /**
+- * lpfc_dump_wakeup_param_cmpl: Completion handler for dump memory mailbox
+- *     command used for getting wake up parameters.
++ * lpfc_dump_wakeup_param_cmpl - dump memory mailbox command completion handler
+  * @phba: pointer to lpfc hba data structure.
+  * @pmboxq: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -287,7 +286,7 @@ lpfc_dump_wakeup_param_cmpl(struct lpfc_
+ }
+ /**
+- * lpfc_config_port_post: Perform lpfc initialization after config port.
++ * lpfc_config_port_post - Perform lpfc initialization after config port
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine will do LPFC initialization after the CONFIG_PORT mailbox
+@@ -303,6 +302,7 @@ int
+ lpfc_config_port_post(struct lpfc_hba *phba)
+ {
+       struct lpfc_vport *vport = phba->pport;
++      struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
+       LPFC_MBOXQ_t *pmb;
+       MAILBOX_t *mb;
+       struct lpfc_dmabuf *mp;
+@@ -360,6 +360,11 @@ lpfc_config_port_post(struct lpfc_hba *p
+              sizeof (struct lpfc_name));
+       memcpy(&vport->fc_portname, &vport->fc_sparam.portName,
+              sizeof (struct lpfc_name));
++
++      /* Update the fc_host data structures with new wwn. */
++      fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn);
++      fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn);
++
+       /* If no serial number in VPD data, use low 6 bytes of WWNN */
+       /* This should be consolidated into parse_vpd ? - mr */
+       if (phba->SerialNumber[0] == 0) {
+@@ -551,7 +556,7 @@ lpfc_config_port_post(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_hba_down_prep: Perform lpfc uninitialization prior to HBA reset.
++ * lpfc_hba_down_prep - Perform lpfc uninitialization prior to HBA reset
+  * @phba: pointer to lpfc HBA data structure.
+  *
+  * This routine will do LPFC uninitialization before the HBA is reset when
+@@ -583,7 +588,7 @@ lpfc_hba_down_prep(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_hba_down_post: Perform lpfc uninitialization after HBA reset.
++ * lpfc_hba_down_post - Perform lpfc uninitialization after HBA reset
+  * @phba: pointer to lpfc HBA data structure.
+  *
+  * This routine will do uninitialization after the HBA is reset when bring
+@@ -599,8 +604,6 @@ lpfc_hba_down_post(struct lpfc_hba *phba
+       struct lpfc_sli *psli = &phba->sli;
+       struct lpfc_sli_ring *pring;
+       struct lpfc_dmabuf *mp, *next_mp;
+-      struct lpfc_iocbq *iocb;
+-      IOCB_t *cmd = NULL;
+       LIST_HEAD(completions);
+       int i;
+@@ -628,20 +631,9 @@ lpfc_hba_down_post(struct lpfc_hba *phba
+               pring->txcmplq_cnt = 0;
+               spin_unlock_irq(&phba->hbalock);
+-              while (!list_empty(&completions)) {
+-                      iocb = list_get_first(&completions, struct lpfc_iocbq,
+-                              list);
+-                      cmd = &iocb->iocb;
+-                      list_del_init(&iocb->list);
+-
+-                      if (!iocb->iocb_cmpl)
+-                              lpfc_sli_release_iocbq(phba, iocb);
+-                      else {
+-                              cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                              cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                              (iocb->iocb_cmpl) (phba, iocb, iocb);
+-                      }
+-              }
++              /* Cancel all the IOCBs from the completions list */
++              lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                                    IOERR_SLI_ABORTED);
+               lpfc_sli_abort_iocb_ring(phba, pring);
+               spin_lock_irq(&phba->hbalock);
+@@ -652,7 +644,7 @@ lpfc_hba_down_post(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_hb_timeout: The HBA-timer timeout handler.
++ * lpfc_hb_timeout - The HBA-timer timeout handler
+  * @ptr: unsigned long holds the pointer to lpfc hba data structure.
+  *
+  * This is the HBA-timer timeout handler registered to the lpfc driver. When
+@@ -686,7 +678,7 @@ lpfc_hb_timeout(unsigned long ptr)
+ }
+ /**
+- * lpfc_hb_mbox_cmpl: The lpfc heart-beat mailbox command callback function.
++ * lpfc_hb_mbox_cmpl - The lpfc heart-beat mailbox command callback function
+  * @phba: pointer to lpfc hba data structure.
+  * @pmboxq: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -721,7 +713,7 @@ lpfc_hb_mbox_cmpl(struct lpfc_hba * phba
+ }
+ /**
+- * lpfc_hb_timeout_handler: The HBA-timer timeout handler.
++ * lpfc_hb_timeout_handler - The HBA-timer timeout handler
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This is the actual HBA-timer timeout handler to be invoked by the worker
+@@ -830,7 +822,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba 
+ }
+ /**
+- * lpfc_offline_eratt: Bring lpfc offline on hardware error attention.
++ * lpfc_offline_eratt - Bring lpfc offline on hardware error attention
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is called to bring the HBA offline when HBA hardware error
+@@ -857,7 +849,73 @@ lpfc_offline_eratt(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_handle_eratt: The HBA hardware error handler.
++ * lpfc_handle_deferred_eratt - The HBA hardware deferred error handler
++ * @phba: pointer to lpfc hba data structure.
++ *
++ * This routine is invoked to handle the deferred HBA hardware error
++ * conditions. This type of error is indicated by HBA by setting ER1
++ * and another ER bit in the host status register. The driver will
++ * wait until the ER1 bit clears before handling the error condition.
++ **/
++static void
++lpfc_handle_deferred_eratt(struct lpfc_hba *phba)
++{
++      uint32_t old_host_status = phba->work_hs;
++      struct lpfc_sli_ring  *pring;
++      struct lpfc_sli *psli = &phba->sli;
++
++      lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
++              "0479 Deferred Adapter Hardware Error "
++              "Data: x%x x%x x%x\n",
++              phba->work_hs,
++              phba->work_status[0], phba->work_status[1]);
++
++      spin_lock_irq(&phba->hbalock);
++      psli->sli_flag &= ~LPFC_SLI2_ACTIVE;
++      spin_unlock_irq(&phba->hbalock);
++
++
++      /*
++       * Firmware stops when it triggred erratt. That could cause the I/Os
++       * dropped by the firmware. Error iocb (I/O) on txcmplq and let the
++       * SCSI layer retry it after re-establishing link.
++       */
++      pring = &psli->ring[psli->fcp_ring];
++      lpfc_sli_abort_iocb_ring(phba, pring);
++
++      /*
++       * There was a firmware error. Take the hba offline and then
++       * attempt to restart it.
++       */
++      lpfc_offline_prep(phba);
++      lpfc_offline(phba);
++
++      /* Wait for the ER1 bit to clear.*/
++      while (phba->work_hs & HS_FFER1) {
++              msleep(100);
++              phba->work_hs = readl(phba->HSregaddr);
++              /* If driver is unloading let the worker thread continue */
++              if (phba->pport->load_flag & FC_UNLOADING) {
++                      phba->work_hs = 0;
++                      break;
++              }
++      }
++
++      /*
++       * This is to ptrotect against a race condition in which
++       * first write to the host attention register clear the
++       * host status register.
++       */
++      if ((!phba->work_hs) && (!(phba->pport->load_flag & FC_UNLOADING)))
++              phba->work_hs = old_host_status & ~HS_FFER1;
++
++      phba->hba_flag &= ~DEFER_ERATT;
++      phba->work_status[0] = readl(phba->MBslimaddr + 0xa8);
++      phba->work_status[1] = readl(phba->MBslimaddr + 0xac);
++}
++
++/**
++ * lpfc_handle_eratt - The HBA hardware error handler
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to handle the following HBA hardware error
+@@ -895,6 +953,9 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
+                                 (char *) &board_event,
+                                 LPFC_NL_VENDOR_ID);
++      if (phba->hba_flag & DEFER_ERATT)
++              lpfc_handle_deferred_eratt(phba);
++
+       if (phba->work_hs & HS_FFER6) {
+               /* Re-establishing Link */
+               lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT,
+@@ -976,7 +1037,7 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_handle_latt: The HBA link event handler.
++ * lpfc_handle_latt - The HBA link event handler
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked from the worker thread to handle a HBA host
+@@ -1063,7 +1124,7 @@ lpfc_handle_latt_err_exit:
+ }
+ /**
+- * lpfc_parse_vpd: Parse VPD (Vital Product Data).
++ * lpfc_parse_vpd - Parse VPD (Vital Product Data)
+  * @phba: pointer to lpfc hba data structure.
+  * @vpd: pointer to the vital product data.
+  * @len: length of the vital product data in bytes.
+@@ -1213,7 +1274,7 @@ lpfc_parse_vpd(struct lpfc_hba *phba, ui
+ }
+ /**
+- * lpfc_get_hba_model_desc: Retrieve HBA device model name and description.
++ * lpfc_get_hba_model_desc - Retrieve HBA device model name and description
+  * @phba: pointer to lpfc hba data structure.
+  * @mdp: pointer to the data structure to hold the derived model name.
+  * @descp: pointer to the data structure to hold the derived description.
+@@ -1322,7 +1383,8 @@ lpfc_get_hba_model_desc(struct lpfc_hba 
+               m = (typeof(m)){"LPe11000", max_speed, "PCIe"};
+               break;
+       case PCI_DEVICE_ID_ZEPHYR_DCSP:
+-              m = (typeof(m)){"LPe11002-SP", max_speed, "PCIe"};
++              m = (typeof(m)){"LP2105", max_speed, "PCIe"};
++              GE = 1;
+               break;
+       case PCI_DEVICE_ID_ZMID:
+               m = (typeof(m)){"LPe1150", max_speed, "PCIe"};
+@@ -1392,7 +1454,7 @@ lpfc_get_hba_model_desc(struct lpfc_hba 
+ }
+ /**
+- * lpfc_post_buffer: Post IOCB(s) with DMA buffer descriptor(s) to a IOCB ring.
++ * lpfc_post_buffer - Post IOCB(s) with DMA buffer descriptor(s) to a IOCB ring
+  * @phba: pointer to lpfc hba data structure.
+  * @pring: pointer to a IOCB ring.
+  * @cnt: the number of IOCBs to be posted to the IOCB ring.
+@@ -1493,7 +1555,7 @@ lpfc_post_buffer(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_post_rcv_buf: Post the initial receive IOCB buffers to ELS ring.
++ * lpfc_post_rcv_buf - Post the initial receive IOCB buffers to ELS ring
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine posts initial receive IOCB buffers to the ELS ring. The
+@@ -1518,7 +1580,7 @@ lpfc_post_rcv_buf(struct lpfc_hba *phba)
+ #define S(N,V) (((V)<<(N))|((V)>>(32-(N))))
+ /**
+- * lpfc_sha_init: Set up initial array of hash table entries.
++ * lpfc_sha_init - Set up initial array of hash table entries
+  * @HashResultPointer: pointer to an array as hash table.
+  *
+  * This routine sets up the initial values to the array of hash table entries
+@@ -1535,7 +1597,7 @@ lpfc_sha_init(uint32_t * HashResultPoint
+ }
+ /**
+- * lpfc_sha_iterate: Iterate initial hash table with the working hash table.
++ * lpfc_sha_iterate - Iterate initial hash table with the working hash table
+  * @HashResultPointer: pointer to an initial/result hash table.
+  * @HashWorkingPointer: pointer to an working hash table.
+  *
+@@ -1592,7 +1654,7 @@ lpfc_sha_iterate(uint32_t * HashResultPo
+ }
+ /**
+- * lpfc_challenge_key: Create challenge key based on WWPN of the HBA.
++ * lpfc_challenge_key - Create challenge key based on WWPN of the HBA
+  * @RandomChallenge: pointer to the entry of host challenge random number array.
+  * @HashWorking: pointer to the entry of the working hash array.
+  *
+@@ -1608,7 +1670,7 @@ lpfc_challenge_key(uint32_t * RandomChal
+ }
+ /**
+- * lpfc_hba_init: Perform special handling for LC HBA initialization.
++ * lpfc_hba_init - Perform special handling for LC HBA initialization
+  * @phba: pointer to lpfc hba data structure.
+  * @hbainit: pointer to an array of unsigned 32-bit integers.
+  *
+@@ -1637,7 +1699,7 @@ lpfc_hba_init(struct lpfc_hba *phba, uin
+ }
+ /**
+- * lpfc_cleanup: Performs vport cleanups before deleting a vport.
++ * lpfc_cleanup - Performs vport cleanups before deleting a vport
+  * @vport: pointer to a virtual N_Port data structure.
+  *
+  * This routine performs the necessary cleanups before deleting the @vport.
+@@ -1724,7 +1786,7 @@ lpfc_cleanup(struct lpfc_vport *vport)
+ }
+ /**
+- * lpfc_stop_vport_timers: Stop all the timers associated with a vport.
++ * lpfc_stop_vport_timers - Stop all the timers associated with a vport
+  * @vport: pointer to a virtual N_Port data structure.
+  *
+  * This routine stops all the timers associated with a @vport. This function
+@@ -1741,7 +1803,7 @@ lpfc_stop_vport_timers(struct lpfc_vport
+ }
+ /**
+- * lpfc_stop_phba_timers: Stop all the timers associated with an HBA.
++ * lpfc_stop_phba_timers - Stop all the timers associated with an HBA
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine stops all the timers associated with a HBA. This function is
+@@ -1761,7 +1823,7 @@ lpfc_stop_phba_timers(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_block_mgmt_io: Mark a HBA's management interface as blocked.
++ * lpfc_block_mgmt_io - Mark a HBA's management interface as blocked
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine marks a HBA's management interface as blocked. Once the HBA's
+@@ -1781,7 +1843,7 @@ lpfc_block_mgmt_io(struct lpfc_hba * phb
+ }
+ /**
+- * lpfc_online: Initialize and bring a HBA online.
++ * lpfc_online - Initialize and bring a HBA online
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine initializes the HBA and brings a HBA online. During this
+@@ -1839,7 +1901,7 @@ lpfc_online(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_unblock_mgmt_io: Mark a HBA's management interface to be not blocked.
++ * lpfc_unblock_mgmt_io - Mark a HBA's management interface to be not blocked
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine marks a HBA's management interface as not blocked. Once the
+@@ -1860,7 +1922,7 @@ lpfc_unblock_mgmt_io(struct lpfc_hba * p
+ }
+ /**
+- * lpfc_offline_prep: Prepare a HBA to be brought offline.
++ * lpfc_offline_prep - Prepare a HBA to be brought offline
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to prepare a HBA to be brought offline. It performs
+@@ -1917,7 +1979,7 @@ lpfc_offline_prep(struct lpfc_hba * phba
+ }
+ /**
+- * lpfc_offline: Bring a HBA offline.
++ * lpfc_offline - Bring a HBA offline
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine actually brings a HBA offline. It stops all the timers
+@@ -1962,7 +2024,7 @@ lpfc_offline(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_scsi_free: Free all the SCSI buffers and IOCBs from driver lists.
++ * lpfc_scsi_free - Free all the SCSI buffers and IOCBs from driver lists
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is to free all the SCSI buffers and IOCBs from the driver
+@@ -2001,7 +2063,7 @@ lpfc_scsi_free(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_create_port: Create an FC port.
++ * lpfc_create_port - Create an FC port
+  * @phba: pointer to lpfc hba data structure.
+  * @instance: a unique integer ID to this FC port.
+  * @dev: pointer to the device data structure.
+@@ -2091,7 +2153,7 @@ out:
+ }
+ /**
+- * destroy_port: Destroy an FC port.
++ * destroy_port -  destroy an FC port
+  * @vport: pointer to an lpfc virtual N_Port data structure.
+  *
+  * This routine destroys a FC port from the upper layer protocol. All the
+@@ -2116,7 +2178,7 @@ destroy_port(struct lpfc_vport *vport)
+ }
+ /**
+- * lpfc_get_instance: Get a unique integer ID.
++ * lpfc_get_instance - Get a unique integer ID
+  *
+  * This routine allocates a unique integer ID from lpfc_hba_index pool. It
+  * uses the kernel idr facility to perform the task.
+@@ -2139,7 +2201,7 @@ lpfc_get_instance(void)
+ }
+ /**
+- * lpfc_scan_finished: method for SCSI layer to detect whether scan is done.
++ * lpfc_scan_finished - method for SCSI layer to detect whether scan is done
+  * @shost: pointer to SCSI host data structure.
+  * @time: elapsed time of the scan in jiffies.
+  *
+@@ -2197,7 +2259,7 @@ finished:
+ }
+ /**
+- * lpfc_host_attrib_init: Initialize SCSI host attributes on a FC port.
++ * lpfc_host_attrib_init - Initialize SCSI host attributes on a FC port
+  * @shost: pointer to SCSI host data structure.
+  *
+  * This routine initializes a given SCSI host attributes on a FC port. The
+@@ -2252,7 +2314,7 @@ void lpfc_host_attrib_init(struct Scsi_H
+ }
+ /**
+- * lpfc_enable_msix: Enable MSI-X interrupt mode.
++ * lpfc_enable_msix - Enable MSI-X interrupt mode
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to enable the MSI-X interrupt vectors. The kernel
+@@ -2366,7 +2428,7 @@ msi_fail_out:
+ }
+ /**
+- * lpfc_disable_msix: Disable MSI-X interrupt mode.
++ * lpfc_disable_msix - Disable MSI-X interrupt mode
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to release the MSI-X vectors and then disable the
+@@ -2385,7 +2447,7 @@ lpfc_disable_msix(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_enable_msi: Enable MSI interrupt mode.
++ * lpfc_enable_msi - Enable MSI interrupt mode
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to enable the MSI interrupt mode. The kernel
+@@ -2423,7 +2485,7 @@ lpfc_enable_msi(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_disable_msi: Disable MSI interrupt mode.
++ * lpfc_disable_msi - Disable MSI interrupt mode
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to disable the MSI interrupt mode. The driver
+@@ -2441,7 +2503,7 @@ lpfc_disable_msi(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_log_intr_mode: Log the active interrupt mode
++ * lpfc_log_intr_mode - Log the active interrupt mode
+  * @phba: pointer to lpfc hba data structure.
+  * @intr_mode: active interrupt mode adopted.
+  *
+@@ -2490,7 +2552,7 @@ lpfc_stop_port(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_enable_intr: Enable device interrupt.
++ * lpfc_enable_intr - Enable device interrupt
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to enable device interrupt and associate driver's
+@@ -2547,7 +2609,7 @@ lpfc_enable_intr(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_disable_intr: Disable device interrupt.
++ * lpfc_disable_intr - Disable device interrupt
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine is invoked to disable device interrupt and disassociate the
+@@ -2574,7 +2636,7 @@ lpfc_disable_intr(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_pci_probe_one: lpfc PCI probe func to register device to PCI subsystem.
++ * lpfc_pci_probe_one - lpfc PCI probe func to register device to PCI subsystem
+  * @pdev: pointer to PCI device
+  * @pid: pointer to PCI device identifier
+  *
+@@ -3010,7 +3072,7 @@ out:
+ }
+ /**
+- * lpfc_pci_remove_one: lpfc PCI func to unregister device from PCI subsystem.
++ * lpfc_pci_remove_one - lpfc PCI func to unregister device from PCI subsystem
+  * @pdev: pointer to PCI device
+  *
+  * This routine is to be registered to the kernel's PCI subsystem. When an
+@@ -3033,8 +3095,6 @@ lpfc_pci_remove_one(struct pci_dev *pdev
+       lpfc_free_sysfs_attr(vport);
+-      kthread_stop(phba->worker_thread);
+-
+       /* Release all the vports against this physical port */
+       vports = lpfc_create_vport_work_array(phba);
+       if (vports != NULL)
+@@ -3052,7 +3112,12 @@ lpfc_pci_remove_one(struct pci_dev *pdev
+        * clears the rings, discards all mailbox commands, and resets
+        * the HBA.
+        */
++
++      /* HBA interrupt will be diabled after this call */
+       lpfc_sli_hba_down(phba);
++      /* Stop kthread signal shall trigger work_done one more time */
++      kthread_stop(phba->worker_thread);
++      /* Final cleanup of txcmplq and reset the HBA */
+       lpfc_sli_brdrestart(phba);
+       lpfc_stop_phba_timers(phba);
+@@ -3095,7 +3160,7 @@ lpfc_pci_remove_one(struct pci_dev *pdev
+ }
+ /**
+- * lpfc_pci_suspend_one: lpfc PCI func to suspend device for power management.
++ * lpfc_pci_suspend_one - lpfc PCI func to suspend device for power management
+  * @pdev: pointer to PCI device
+  * @msg: power management message
+  *
+@@ -3139,7 +3204,7 @@ lpfc_pci_suspend_one(struct pci_dev *pde
+ }
+ /**
+- * lpfc_pci_resume_one: lpfc PCI func to resume device for power management.
++ * lpfc_pci_resume_one - lpfc PCI func to resume device for power management
+  * @pdev: pointer to PCI device
+  *
+  * This routine is to be registered to the kernel's PCI subsystem to support
+@@ -3204,7 +3269,7 @@ lpfc_pci_resume_one(struct pci_dev *pdev
+ }
+ /**
+- * lpfc_io_error_detected: Driver method for handling PCI I/O error detected.
++ * lpfc_io_error_detected - Driver method for handling PCI I/O error detected
+  * @pdev: pointer to PCI device.
+  * @state: the current PCI connection state.
+  *
+@@ -3254,7 +3319,7 @@ static pci_ers_result_t lpfc_io_error_de
+ }
+ /**
+- * lpfc_io_slot_reset: Restart a PCI device from scratch.
++ * lpfc_io_slot_reset - Restart a PCI device from scratch
+  * @pdev: pointer to PCI device.
+  *
+  * This routine is registered to the PCI subsystem for error handling. This is
+@@ -3313,7 +3378,7 @@ static pci_ers_result_t lpfc_io_slot_res
+ }
+ /**
+- * lpfc_io_resume: Resume PCI I/O operation.
++ * lpfc_io_resume - Resume PCI I/O operation
+  * @pdev: pointer to PCI device
+  *
+  * This routine is registered to the PCI subsystem for error handling. It is
+@@ -3426,7 +3491,7 @@ static struct pci_driver lpfc_driver = {
+ };
+ /**
+- * lpfc_init: lpfc module initialization routine.
++ * lpfc_init - lpfc module initialization routine
+  *
+  * This routine is to be invoked when the lpfc module is loaded into the
+  * kernel. The special kernel macro module_init() is used to indicate the
+@@ -3472,7 +3537,7 @@ lpfc_init(void)
+ }
+ /**
+- * lpfc_exit: lpfc module removal routine.
++ * lpfc_exit - lpfc module removal routine
+  *
+  * This routine is invoked when the lpfc module is removed from the kernel.
+  * The special kernel macro module_exit() is used to indicate the role of
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_logmsg.h linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_logmsg.h
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_logmsg.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_logmsg.h       2009-05-13 09:46:19.000000000 +0200
+@@ -27,7 +27,7 @@
+ #define LOG_FCP                       0x40    /* FCP traffic history */
+ #define LOG_NODE                      0x80    /* Node table events */
+ #define LOG_TEMP                      0x100   /* Temperature sensor events */
+-#define LOG_BG                              0x200     /* BlockBuard events */
++#define LOG_BG                              0x200     /* BlockGuard events */
+ #define LOG_MISC                      0x400   /* Miscellaneous events */
+ #define LOG_SLI                       0x800   /* SLI events */
+ #define LOG_FCP_ERROR                 0x1000  /* log errors, not underruns */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_mbox.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_mbox.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_mbox.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_mbox.c 2009-05-13 09:46:19.000000000 +0200
+@@ -39,7 +39,7 @@
+ #include "lpfc_compat.h"
+ /**
+- * lpfc_dump_mem: Prepare a mailbox command for retrieving HBA's VPD memory.
++ * lpfc_dump_mem - Prepare a mailbox command for retrieving HBA's VPD memory
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  * @offset: offset for dumping VPD memory mailbox command.
+@@ -77,9 +77,10 @@ lpfc_dump_mem(struct lpfc_hba * phba, LP
+ }
+ /**
+- * lpfc_dump_mem: Prepare a mailbox command for retrieving wakeup params.
++ * lpfc_dump_wakeup_param - Prepare mailbox command for retrieving wakeup params
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
++ *
+  * This function create a dump memory mailbox command to dump wake up
+  * parameters.
+  */
+@@ -109,7 +110,7 @@ lpfc_dump_wakeup_param(struct lpfc_hba *
+ }
+ /**
+- * lpfc_read_nv: Prepare a mailbox command for reading HBA's NVRAM param.
++ * lpfc_read_nv - Prepare a mailbox command for reading HBA's NVRAM param
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -132,7 +133,7 @@ lpfc_read_nv(struct lpfc_hba * phba, LPF
+ }
+ /**
+- * lpfc_config_async: Prepare a mailbox command for enabling HBA async event.
++ * lpfc_config_async - Prepare a mailbox command for enabling HBA async event
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  * @ring: ring number for the asynchronous event to be configured.
+@@ -159,7 +160,7 @@ lpfc_config_async(struct lpfc_hba * phba
+ }
+ /**
+- * lpfc_heart_beat: Prepare a mailbox command for heart beat.
++ * lpfc_heart_beat - Prepare a mailbox command for heart beat
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -184,7 +185,7 @@ lpfc_heart_beat(struct lpfc_hba * phba, 
+ }
+ /**
+- * lpfc_read_la: Prepare a mailbox command for reading HBA link attention.
++ * lpfc_read_la - Prepare a mailbox command for reading HBA link attention
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  * @mp: DMA buffer memory for reading the link attention information into.
+@@ -228,7 +229,7 @@ lpfc_read_la(struct lpfc_hba * phba, LPF
+ }
+ /**
+- * lpfc_clear_la: Prepare a mailbox command for clearing HBA link attention.
++ * lpfc_clear_la - Prepare a mailbox command for clearing HBA link attention
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -257,7 +258,7 @@ lpfc_clear_la(struct lpfc_hba * phba, LP
+ }
+ /**
+- * lpfc_config_link: Prepare a mailbox command for configuring link on a HBA.
++ * lpfc_config_link - Prepare a mailbox command for configuring link on a HBA
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -305,7 +306,7 @@ lpfc_config_link(struct lpfc_hba * phba,
+ }
+ /**
+- * lpfc_config_msi: Prepare a mailbox command for configuring msi-x.
++ * lpfc_config_msi - Prepare a mailbox command for configuring msi-x
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -383,7 +384,7 @@ lpfc_config_msi(struct lpfc_hba *phba, L
+ }
+ /**
+- * lpfc_init_link: Prepare a mailbox command for initialize link on a HBA.
++ * lpfc_init_link - Prepare a mailbox command for initialize link on a HBA
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  * @topology: the link topology for the link to be initialized to.
+@@ -463,7 +464,7 @@ lpfc_init_link(struct lpfc_hba * phba,
+ }
+ /**
+- * lpfc_read_sparam: Prepare a mailbox command for reading HBA parameters.
++ * lpfc_read_sparam - Prepare a mailbox command for reading HBA parameters
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  * @vpi: virtual N_Port identifier.
+@@ -523,7 +524,7 @@ lpfc_read_sparam(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_unreg_did: Prepare a mailbox command for unregistering DID.
++ * lpfc_unreg_did - Prepare a mailbox command for unregistering DID
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: virtual N_Port identifier.
+  * @did: remote port identifier.
+@@ -555,7 +556,7 @@ lpfc_unreg_did(struct lpfc_hba * phba, u
+ }
+ /**
+- * lpfc_read_config: Prepare a mailbox command for reading HBA configuration.
++ * lpfc_read_config - Prepare a mailbox command for reading HBA configuration
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -581,7 +582,7 @@ lpfc_read_config(struct lpfc_hba * phba,
+ }
+ /**
+- * lpfc_read_lnk_stat: Prepare a mailbox command for reading HBA link stats.
++ * lpfc_read_lnk_stat - Prepare a mailbox command for reading HBA link stats
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -606,7 +607,7 @@ lpfc_read_lnk_stat(struct lpfc_hba * phb
+ }
+ /**
+- * lpfc_reg_login: Prepare a mailbox command for registering remote login.
++ * lpfc_reg_login - Prepare a mailbox command for registering remote login
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: virtual N_Port identifier.
+  * @did: remote port identifier.
+@@ -677,7 +678,7 @@ lpfc_reg_login(struct lpfc_hba *phba, ui
+ }
+ /**
+- * lpfc_unreg_login: Prepare a mailbox command for unregistering remote login.
++ * lpfc_unreg_login - Prepare a mailbox command for unregistering remote login
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: virtual N_Port identifier.
+  * @rpi: remote port identifier
+@@ -709,7 +710,7 @@ lpfc_unreg_login(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_reg_vpi: Prepare a mailbox command for registering vport identifier.
++ * lpfc_reg_vpi - Prepare a mailbox command for registering vport identifier
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: virtual N_Port identifier.
+  * @sid: Fibre Channel S_ID (N_Port_ID assigned to a virtual N_Port).
+@@ -741,7 +742,7 @@ lpfc_reg_vpi(struct lpfc_hba *phba, uint
+ }
+ /**
+- * lpfc_unreg_vpi: Prepare a mailbox command for unregistering vport id.
++ * lpfc_unreg_vpi - Prepare a mailbox command for unregistering vport id
+  * @phba: pointer to lpfc hba data structure.
+  * @vpi: virtual N_Port identifier.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+@@ -771,7 +772,7 @@ lpfc_unreg_vpi(struct lpfc_hba *phba, ui
+ }
+ /**
+- * lpfc_config_pcb_setup: Set up IOCB rings in the Port Control Block (PCB)
++ * lpfc_config_pcb_setup - Set up IOCB rings in the Port Control Block (PCB)
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * This routine sets up and initializes the IOCB rings in the Port Control
+@@ -835,7 +836,7 @@ lpfc_config_pcb_setup(struct lpfc_hba * 
+ }
+ /**
+- * lpfc_read_rev: Prepare a mailbox command for reading HBA revision.
++ * lpfc_read_rev - Prepare a mailbox command for reading HBA revision
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -861,7 +862,7 @@ lpfc_read_rev(struct lpfc_hba * phba, LP
+ }
+ /**
+- * lpfc_build_hbq_profile2: Set up the HBQ Selection Profile 2.
++ * lpfc_build_hbq_profile2 - Set up the HBQ Selection Profile 2
+  * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
+  * @hbq_desc: pointer to the HBQ selection profile descriptor.
+  *
+@@ -880,7 +881,7 @@ lpfc_build_hbq_profile2(struct config_hb
+ }
+ /**
+- * lpfc_build_hbq_profile3: Set up the HBQ Selection Profile 3.
++ * lpfc_build_hbq_profile3 - Set up the HBQ Selection Profile 3
+  * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
+  * @hbq_desc: pointer to the HBQ selection profile descriptor.
+  *
+@@ -902,7 +903,7 @@ lpfc_build_hbq_profile3(struct config_hb
+ }
+ /**
+- * lpfc_build_hbq_profile5: Set up the HBQ Selection Profile 5.
++ * lpfc_build_hbq_profile5 - Set up the HBQ Selection Profile 5
+  * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
+  * @hbq_desc: pointer to the HBQ selection profile descriptor.
+  *
+@@ -925,7 +926,7 @@ lpfc_build_hbq_profile5(struct config_hb
+ }
+ /**
+- * lpfc_config_hbq: Prepare a mailbox command for configuring an HBQ.
++ * lpfc_config_hbq - Prepare a mailbox command for configuring an HBQ
+  * @phba: pointer to lpfc hba data structure.
+  * @id: HBQ identifier.
+  * @hbq_desc: pointer to the HBA descriptor data structure.
+@@ -999,7 +1000,7 @@ lpfc_config_hbq(struct lpfc_hba *phba, u
+ }
+ /**
+- * lpfc_config_ring: Prepare a mailbox command for configuring an IOCB ring.
++ * lpfc_config_ring - Prepare a mailbox command for configuring an IOCB ring
+  * @phba: pointer to lpfc hba data structure.
+  * @ring:
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+@@ -1057,7 +1058,7 @@ lpfc_config_ring(struct lpfc_hba * phba,
+ }
+ /**
+- * lpfc_config_port: Prepare a mailbox command for configuring port.
++ * lpfc_config_port - Prepare a mailbox command for configuring port
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -1227,7 +1228,7 @@ lpfc_config_port(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_kill_board: Prepare a mailbox command for killing board.
++ * lpfc_kill_board - Prepare a mailbox command for killing board
+  * @phba: pointer to lpfc hba data structure.
+  * @pmb: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -1253,7 +1254,7 @@ lpfc_kill_board(struct lpfc_hba * phba, 
+ }
+ /**
+- * lpfc_mbox_put: Put a mailbox cmd into the tail of driver's mailbox queue.
++ * lpfc_mbox_put - Put a mailbox cmd into the tail of driver's mailbox queue
+  * @phba: pointer to lpfc hba data structure.
+  * @mbq: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -1277,7 +1278,7 @@ lpfc_mbox_put(struct lpfc_hba * phba, LP
+ }
+ /**
+- * lpfc_mbox_get: Remove a mailbox cmd from the head of driver's mailbox queue.
++ * lpfc_mbox_get - Remove a mailbox cmd from the head of driver's mailbox queue
+  * @phba: pointer to lpfc hba data structure.
+  *
+  * Driver maintains a internal mailbox command queue implemented as a linked
+@@ -1304,7 +1305,7 @@ lpfc_mbox_get(struct lpfc_hba * phba)
+ }
+ /**
+- * lpfc_mbox_cmpl_put: Put mailbox command into mailbox command complete list.
++ * lpfc_mbox_cmpl_put - Put mailbox command into mailbox command complete list
+  * @phba: pointer to lpfc hba data structure.
+  * @mbq: pointer to the driver internal queue element for mailbox command.
+  *
+@@ -1327,7 +1328,7 @@ lpfc_mbox_cmpl_put(struct lpfc_hba * phb
+ }
+ /**
+- * lpfc_mbox_tmo_val: Retrieve mailbox command timeout value.
++ * lpfc_mbox_tmo_val - Retrieve mailbox command timeout value
+  * @phba: pointer to lpfc hba data structure.
+  * @cmd: mailbox command code.
+  *
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_mem.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_mem.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_mem.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_mem.c  2009-05-13 09:46:19.000000000 +0200
+@@ -41,7 +41,7 @@
+ /**
+- * lpfc_mem_alloc: create and allocate all PCI and memory pools
++ * lpfc_mem_alloc - create and allocate all PCI and memory pools
+  * @phba: HBA to allocate pools for
+  *
+  * Description: Creates and allocates PCI pools lpfc_scsi_dma_buf_pool,
+@@ -136,12 +136,12 @@ lpfc_mem_alloc(struct lpfc_hba * phba)
+ }
+ /**
+- * lpfc_mem_free: Frees all PCI and memory allocated by lpfc_mem_alloc
++ * lpfc_mem_free - Frees all PCI and memory allocated by lpfc_mem_alloc
+  * @phba: HBA to free memory for
+  *
+  * Description: Frees PCI pools lpfc_scsi_dma_buf_pool, lpfc_mbuf_pool,
+  * lpfc_hbq_pool.  Frees kmalloc-backed mempools for LPFC_MBOXQ_t and
+- * lpfc_nodelist.  Also frees the VPI bitmask.
++ * lpfc_nodelist.  Also frees the VPI bitmask
+  *
+  * Returns: None
+  **/
+@@ -212,7 +212,7 @@ lpfc_mem_free(struct lpfc_hba * phba)
+ }
+ /**
+- * lpfc_mbuf_alloc: Allocate an mbuf from the lpfc_mbuf_pool PCI pool
++ * lpfc_mbuf_alloc - Allocate an mbuf from the lpfc_mbuf_pool PCI pool
+  * @phba: HBA which owns the pool to allocate from
+  * @mem_flags: indicates if this is a priority (MEM_PRI) allocation
+  * @handle: used to return the DMA-mapped address of the mbuf
+@@ -249,7 +249,7 @@ lpfc_mbuf_alloc(struct lpfc_hba *phba, i
+ }
+ /**
+- * __lpfc_mem_free: Free an mbuf from the lpfc_mbuf_pool PCI pool (locked)
++ * __lpfc_mbuf_free - Free an mbuf from the lpfc_mbuf_pool PCI pool (locked)
+  * @phba: HBA which owns the pool to return to
+  * @virt: mbuf to free
+  * @dma: the DMA-mapped address of the lpfc_mbuf_pool to be freed
+@@ -278,7 +278,7 @@ __lpfc_mbuf_free(struct lpfc_hba * phba,
+ }
+ /**
+- * lpfc_mem_free: Free an mbuf from the lpfc_mbuf_pool PCI pool (unlocked)
++ * lpfc_mbuf_free - Free an mbuf from the lpfc_mbuf_pool PCI pool (unlocked)
+  * @phba: HBA which owns the pool to return to
+  * @virt: mbuf to free
+  * @dma: the DMA-mapped address of the lpfc_mbuf_pool to be freed
+@@ -291,7 +291,6 @@ __lpfc_mbuf_free(struct lpfc_hba * phba,
+  * Returns: None
+  **/
+ void
+-
+ lpfc_mbuf_free(struct lpfc_hba * phba, void *virt, dma_addr_t dma)
+ {
+       unsigned long iflags;
+@@ -303,7 +302,7 @@ lpfc_mbuf_free(struct lpfc_hba * phba, v
+ }
+ /**
+- * lpfc_els_hbq_alloc: Allocate an HBQ buffer
++ * lpfc_els_hbq_alloc - Allocate an HBQ buffer
+  * @phba: HBA to allocate HBQ buffer for
+  *
+  * Description: Allocates a DMA-mapped HBQ buffer from the lpfc_hbq_pool PCI
+@@ -335,7 +334,7 @@ lpfc_els_hbq_alloc(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_mem_hbq_free: Frees an HBQ buffer allocated with lpfc_els_hbq_alloc
++ * lpfc_mem_hbq_free - Frees an HBQ buffer allocated with lpfc_els_hbq_alloc
+  * @phba: HBA buffer was allocated for
+  * @hbqbp: HBQ container returned by lpfc_els_hbq_alloc
+  *
+@@ -355,7 +354,7 @@ lpfc_els_hbq_free(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_in_buf_free: Free a DMA buffer
++ * lpfc_in_buf_free - Free a DMA buffer
+  * @phba: HBA buffer is associated with
+  * @mp: Buffer to free
+  *
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_nportdisc.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_nportdisc.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_nportdisc.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_nportdisc.c    2009-05-13 09:46:19.000000000 +0200
+@@ -192,7 +192,6 @@ lpfc_els_abort(struct lpfc_hba *phba, st
+       struct lpfc_sli  *psli = &phba->sli;
+       struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
+       struct lpfc_iocbq *iocb, *next_iocb;
+-      IOCB_t *cmd;
+       /* Abort outstanding I/O on NPort <nlp_DID> */
+       lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY,
+@@ -223,19 +222,10 @@ lpfc_els_abort(struct lpfc_hba *phba, st
+       }
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              iocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              cmd = &iocb->iocb;
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
++
+       lpfc_cancel_retry_delay_tmo(phba->pport, ndlp);
+       return 0;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_scsi.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_scsi.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_scsi.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_scsi.c 2009-05-13 09:46:19.000000000 +0200
+@@ -112,7 +112,7 @@ lpfc_debug_save_dif(struct scsi_cmnd *cm
+ }
+ /**
+- * lpfc_update_stats: Update statistical data for the command completion.
++ * lpfc_update_stats - Update statistical data for the command completion
+  * @phba: Pointer to HBA object.
+  * @lpfc_cmd: lpfc scsi command object pointer.
+  *
+@@ -165,8 +165,7 @@ lpfc_update_stats(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_send_sdev_queuedepth_change_event: Posts a queuedepth change
+- *                   event.
++ * lpfc_send_sdev_queuedepth_change_event - Posts a queuedepth change event
+  * @phba: Pointer to HBA context object.
+  * @vport: Pointer to vport object.
+  * @ndlp: Pointer to FC node associated with the target.
+@@ -220,7 +219,7 @@ lpfc_send_sdev_queuedepth_change_event(s
+ }
+ /**
+- * lpfc_rampdown_queue_depth: Post RAMP_DOWN_QUEUE event to worker thread.
++ * lpfc_rampdown_queue_depth - Post RAMP_DOWN_QUEUE event to worker thread
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine is called when there is resource error in driver or firmware.
+@@ -261,7 +260,7 @@ lpfc_rampdown_queue_depth(struct lpfc_hb
+ }
+ /**
+- * lpfc_rampup_queue_depth: Post RAMP_UP_QUEUE event for worker thread.
++ * lpfc_rampup_queue_depth - Post RAMP_UP_QUEUE event for worker thread
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine post WORKER_RAMP_UP_QUEUE event for @phba vport. This routine
+@@ -273,14 +272,14 @@ lpfc_rampdown_queue_depth(struct lpfc_hb
+  **/
+ static inline void
+ lpfc_rampup_queue_depth(struct lpfc_vport  *vport,
+-                      struct scsi_device *sdev)
++                      uint32_t queue_depth)
+ {
+       unsigned long flags;
+       struct lpfc_hba *phba = vport->phba;
+       uint32_t evt_posted;
+       atomic_inc(&phba->num_cmd_success);
+-      if (vport->cfg_lun_queue_depth <= sdev->queue_depth)
++      if (vport->cfg_lun_queue_depth <= queue_depth)
+               return;
+       spin_lock_irqsave(&phba->hbalock, flags);
+       if (((phba->last_ramp_up_time + QUEUE_RAMP_UP_INTERVAL) > jiffies) ||
+@@ -303,7 +302,7 @@ lpfc_rampup_queue_depth(struct lpfc_vpor
+ }
+ /**
+- * lpfc_ramp_down_queue_handler: WORKER_RAMP_DOWN_QUEUE event handler.
++ * lpfc_ramp_down_queue_handler - WORKER_RAMP_DOWN_QUEUE event handler
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine is called to  process WORKER_RAMP_DOWN_QUEUE event for worker
+@@ -361,7 +360,7 @@ lpfc_ramp_down_queue_handler(struct lpfc
+ }
+ /**
+- * lpfc_ramp_up_queue_handler: WORKER_RAMP_UP_QUEUE event handler.
++ * lpfc_ramp_up_queue_handler - WORKER_RAMP_UP_QUEUE event handler
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine is called to  process WORKER_RAMP_UP_QUEUE event for worker
+@@ -410,7 +409,7 @@ lpfc_ramp_up_queue_handler(struct lpfc_h
+ }
+ /**
+- * lpfc_scsi_dev_block: set all scsi hosts to block state.
++ * lpfc_scsi_dev_block - set all scsi hosts to block state
+  * @phba: Pointer to HBA context object.
+  *
+  * This function walks vport list and set each SCSI host to block state
+@@ -439,7 +438,7 @@ lpfc_scsi_dev_block(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_new_scsi_buf: Scsi buffer allocator.
++ * lpfc_new_scsi_buf - Scsi buffer allocator
+  * @vport: The virtual port for which this call being executed.
+  *
+  * This routine allocates a scsi buffer, which contains all the necessary
+@@ -563,7 +562,7 @@ lpfc_new_scsi_buf(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_get_scsi_buf: Get a scsi buffer from lpfc_scsi_buf_list list of Hba.
++ * lpfc_get_scsi_buf - Get a scsi buffer from lpfc_scsi_buf_list list of Hba
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine removes a scsi buffer from head of @phba lpfc_scsi_buf_list list
+@@ -592,7 +591,7 @@ lpfc_get_scsi_buf(struct lpfc_hba * phba
+ }
+ /**
+- * lpfc_release_scsi_buf: Return a scsi buffer back to hba lpfc_scsi_buf_list list.
++ * lpfc_release_scsi_buf - Return a scsi buffer back to hba's lpfc_scsi_buf_list
+  * @phba: The Hba for which this call is being executed.
+  * @psb: The scsi buffer which is being released.
+  *
+@@ -611,7 +610,7 @@ lpfc_release_scsi_buf(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_scsi_prep_dma_buf: Routine to do DMA mapping for scsi buffer.
++ * lpfc_scsi_prep_dma_buf - Routine to do DMA mapping for scsi buffer
+  * @phba: The Hba for which this call is being executed.
+  * @lpfc_cmd: The scsi buffer which is going to be mapped.
+  *
+@@ -738,7 +737,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
+        * Due to difference in data length between DIF/non-DIF paths,
+        * we need to set word 4 of IOCB here
+        */
+-      iocb_cmd->un.fcpi.fcpi_parm = le32_to_cpu(scsi_bufflen(scsi_cmnd));
++      iocb_cmd->un.fcpi.fcpi_parm = scsi_bufflen(scsi_cmnd);
+       return 0;
+ }
+@@ -823,9 +822,9 @@ lpfc_cmd_blksize(struct scsi_cmnd *sc)
+ /**
+  * lpfc_get_cmd_dif_parms - Extract DIF parameters from SCSI command
+  * @sc:             in: SCSI command
+- * @apptagmask      out: app tag mask
+- * @apptagval       out: app tag value
+- * @reftag          out: ref tag (reference tag)
++ * @apptagmask:     out: app tag mask
++ * @apptagval:      out: app tag value
++ * @reftag:         out: ref tag (reference tag)
+  *
+  * Description:
+  *   Extract DIF paramters from the command if possible.  Otherwise,
+@@ -1413,7 +1412,7 @@ out:
+ }
+ /**
+- * lpfc_send_scsi_error_event: Posts an event when there is SCSI error.
++ * lpfc_send_scsi_error_event - Posts an event when there is SCSI error
+  * @phba: Pointer to hba context object.
+  * @vport: Pointer to vport object.
+  * @lpfc_cmd: Pointer to lpfc scsi command which reported the error.
+@@ -1505,7 +1504,7 @@ lpfc_send_scsi_error_event(struct lpfc_h
+ }
+ /**
+- * lpfc_scsi_unprep_dma_buf: Routine to un-map DMA mapping of scatter gather.
++ * lpfc_scsi_unprep_dma_buf - Routine to un-map DMA mapping of scatter gather
+  * @phba: The Hba for which this call is being executed.
+  * @psb: The scsi buffer which is going to be un-mapped.
+  *
+@@ -1530,7 +1529,7 @@ lpfc_scsi_unprep_dma_buf(struct lpfc_hba
+ }
+ /**
+- * lpfc_handler_fcp_err: FCP response handler.
++ * lpfc_handler_fcp_err - FCP response handler
+  * @vport: The virtual port for which this call is being executed.
+  * @lpfc_cmd: Pointer to lpfc_scsi_buf data structure.
+  * @rsp_iocb: The response IOCB which contains FCP error.
+@@ -1674,7 +1673,7 @@ lpfc_handle_fcp_err(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_scsi_cmd_iocb_cmpl: Scsi cmnd IOCB completion routine.
++ * lpfc_scsi_cmd_iocb_cmpl - Scsi cmnd IOCB completion routine
+  * @phba: The Hba for which this call is being executed.
+  * @pIocbIn: The command IOCBQ for the scsi cmnd.
+  * @pIocbOut: The response IOCBQ for the scsi cmnd .
+@@ -1694,10 +1693,12 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+       struct lpfc_nodelist *pnode = rdata->pnode;
+       struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
+       int result;
+-      struct scsi_device *sdev, *tmp_sdev;
++      struct scsi_device *tmp_sdev;
+       int depth = 0;
+       unsigned long flags;
+       struct lpfc_fast_path_event *fast_path_evt;
++      struct Scsi_Host *shost = cmd->device->host;
++      uint32_t queue_depth, scsi_id;
+       lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4];
+       lpfc_cmd->status = pIocbOut->iocb.ulpStatus;
+@@ -1808,11 +1809,10 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+       lpfc_update_stats(phba, lpfc_cmd);
+       result = cmd->result;
+-      sdev = cmd->device;
+       if (vport->cfg_max_scsicmpl_time &&
+          time_after(jiffies, lpfc_cmd->start_time +
+               msecs_to_jiffies(vport->cfg_max_scsicmpl_time))) {
+-              spin_lock_irqsave(sdev->host->host_lock, flags);
++              spin_lock_irqsave(shost->host_lock, flags);
+               if (pnode && NLP_CHK_NODE_ACT(pnode)) {
+                       if (pnode->cmd_qdepth >
+                               atomic_read(&pnode->cmd_pending) &&
+@@ -1825,22 +1825,26 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+                       pnode->last_change_time = jiffies;
+               }
+-              spin_unlock_irqrestore(sdev->host->host_lock, flags);
++              spin_unlock_irqrestore(shost->host_lock, flags);
+       } else if (pnode && NLP_CHK_NODE_ACT(pnode)) {
+               if ((pnode->cmd_qdepth < LPFC_MAX_TGT_QDEPTH) &&
+                  time_after(jiffies, pnode->last_change_time +
+                             msecs_to_jiffies(LPFC_TGTQ_INTERVAL))) {
+-                      spin_lock_irqsave(sdev->host->host_lock, flags);
++                      spin_lock_irqsave(shost->host_lock, flags);
+                       pnode->cmd_qdepth += pnode->cmd_qdepth *
+                               LPFC_TGTQ_RAMPUP_PCENT / 100;
+                       if (pnode->cmd_qdepth > LPFC_MAX_TGT_QDEPTH)
+                               pnode->cmd_qdepth = LPFC_MAX_TGT_QDEPTH;
+                       pnode->last_change_time = jiffies;
+-                      spin_unlock_irqrestore(sdev->host->host_lock, flags);
++                      spin_unlock_irqrestore(shost->host_lock, flags);
+               }
+       }
+       lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
++
++      /* The sdev is not guaranteed to be valid post scsi_done upcall. */
++      queue_depth = cmd->device->queue_depth;
++      scsi_id = cmd->device->id;
+       cmd->scsi_done(cmd);
+       if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
+@@ -1848,28 +1852,28 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+                * If there is a thread waiting for command completion
+                * wake up the thread.
+                */
+-              spin_lock_irqsave(sdev->host->host_lock, flags);
++              spin_lock_irqsave(shost->host_lock, flags);
+               lpfc_cmd->pCmd = NULL;
+               if (lpfc_cmd->waitq)
+                       wake_up(lpfc_cmd->waitq);
+-              spin_unlock_irqrestore(sdev->host->host_lock, flags);
++              spin_unlock_irqrestore(shost->host_lock, flags);
+               lpfc_release_scsi_buf(phba, lpfc_cmd);
+               return;
+       }
+       if (!result)
+-              lpfc_rampup_queue_depth(vport, sdev);
++              lpfc_rampup_queue_depth(vport, queue_depth);
+       if (!result && pnode && NLP_CHK_NODE_ACT(pnode) &&
+          ((jiffies - pnode->last_ramp_up_time) >
+               LPFC_Q_RAMP_UP_INTERVAL * HZ) &&
+          ((jiffies - pnode->last_q_full_time) >
+               LPFC_Q_RAMP_UP_INTERVAL * HZ) &&
+-         (vport->cfg_lun_queue_depth > sdev->queue_depth)) {
+-              shost_for_each_device(tmp_sdev, sdev->host) {
++         (vport->cfg_lun_queue_depth > queue_depth)) {
++              shost_for_each_device(tmp_sdev, shost) {
+                       if (vport->cfg_lun_queue_depth > tmp_sdev->queue_depth){
+-                              if (tmp_sdev->id != sdev->id)
++                              if (tmp_sdev->id != scsi_id)
+                                       continue;
+                               if (tmp_sdev->ordered_tags)
+                                       scsi_adjust_queue_depth(tmp_sdev,
+@@ -1885,7 +1889,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+               }
+               lpfc_send_sdev_queuedepth_change_event(phba, vport, pnode,
+                       0xFFFFFFFF,
+-                      sdev->queue_depth - 1, sdev->queue_depth);
++                      queue_depth , queue_depth + 1);
+       }
+       /*
+@@ -1896,8 +1900,8 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+           NLP_CHK_NODE_ACT(pnode)) {
+               pnode->last_q_full_time = jiffies;
+-              shost_for_each_device(tmp_sdev, sdev->host) {
+-                      if (tmp_sdev->id != sdev->id)
++              shost_for_each_device(tmp_sdev, shost) {
++                      if (tmp_sdev->id != scsi_id)
+                               continue;
+                       depth = scsi_track_queue_full(tmp_sdev,
+                                       tmp_sdev->queue_depth - 1);
+@@ -1909,7 +1913,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+                * scsi_track_queue_full.
+                */
+               if (depth == -1)
+-                      depth = sdev->host->cmd_per_lun;
++                      depth = shost->cmd_per_lun;
+               if (depth) {
+                       lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
+@@ -1925,17 +1929,17 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba 
+        * If there is a thread waiting for command completion
+        * wake up the thread.
+        */
+-      spin_lock_irqsave(sdev->host->host_lock, flags);
++      spin_lock_irqsave(shost->host_lock, flags);
+       lpfc_cmd->pCmd = NULL;
+       if (lpfc_cmd->waitq)
+               wake_up(lpfc_cmd->waitq);
+-      spin_unlock_irqrestore(sdev->host->host_lock, flags);
++      spin_unlock_irqrestore(shost->host_lock, flags);
+       lpfc_release_scsi_buf(phba, lpfc_cmd);
+ }
+ /**
+- * lpfc_fcpcmd_to_iocb - copy the fcp_cmd data into the IOCB.
++ * lpfc_fcpcmd_to_iocb - copy the fcp_cmd data into the IOCB
+  * @data: A pointer to the immediate command data portion of the IOCB.
+  * @fcp_cmnd: The FCP Command that is provided by the SCSI layer.
+  *
+@@ -1953,7 +1957,7 @@ lpfc_fcpcmd_to_iocb(uint8_t *data, struc
+ }
+ /**
+- * lpfc_scsi_prep_cmnd:  Routine to convert scsi cmnd to FCP information unit.
++ * lpfc_scsi_prep_cmnd -  Routine to convert scsi cmnd to FCP information unit
+  * @vport: The virtual port for which this call is being executed.
+  * @lpfc_cmd: The scsi command which needs to send.
+  * @pnode: Pointer to lpfc_nodelist.
+@@ -2047,7 +2051,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_scsi_prep_task_mgmt_cmnd: Convert scsi TM cmnd to FCP information unit.
++ * lpfc_scsi_prep_task_mgmt_cmnd - Convert scsi TM cmnd to FCP information unit
+  * @vport: The virtual port for which this call is being executed.
+  * @lpfc_cmd: Pointer to lpfc_scsi_buf data structure.
+  * @lun: Logical unit number.
+@@ -2110,7 +2114,7 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc
+ }
+ /**
+- * lpc_taskmgmt_def_cmpl: IOCB completion routine for task management command.
++ * lpfc_taskmgmt_def_cmpl - IOCB completion routine for task management command
+  * @phba: The Hba for which this call is being executed.
+  * @cmdiocbq: Pointer to lpfc_iocbq data structure.
+  * @rspiocbq: Pointer to lpfc_iocbq data structure.
+@@ -2131,7 +2135,7 @@ lpfc_tskmgmt_def_cmpl(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_scsi_tgt_reset: Target reset handler.
++ * lpfc_scsi_tgt_reset - Target reset handler
+  * @lpfc_cmd: Pointer to lpfc_scsi_buf data structure
+  * @vport: The virtual port for which this call is being executed.
+  * @tgt_id: Target ID.
+@@ -2198,7 +2202,7 @@ lpfc_scsi_tgt_reset(struct lpfc_scsi_buf
+ }
+ /**
+- * lpfc_info: Info entry point of scsi_host_template data structure.
++ * lpfc_info - Info entry point of scsi_host_template data structure
+  * @host: The scsi host for which this call is being executed.
+  *
+  * This routine provides module information about hba.
+@@ -2236,7 +2240,7 @@ lpfc_info(struct Scsi_Host *host)
+ }
+ /**
+- * lpfc_poll_rearm_time: Routine to modify fcp_poll timer of hba.
++ * lpfc_poll_rearm_time - Routine to modify fcp_poll timer of hba
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine modifies fcp_poll_timer  field of @phba by cfg_poll_tmo.
+@@ -2253,7 +2257,7 @@ static __inline__ void lpfc_poll_rearm_t
+ }
+ /**
+- * lpfc_poll_start_timer: Routine to start fcp_poll_timer of HBA.
++ * lpfc_poll_start_timer - Routine to start fcp_poll_timer of HBA
+  * @phba: The Hba for which this call is being executed.
+  *
+  * This routine starts the fcp_poll_timer of @phba.
+@@ -2264,7 +2268,7 @@ void lpfc_poll_start_timer(struct lpfc_h
+ }
+ /**
+- * lpfc_poll_timeout: Restart polling timer.
++ * lpfc_poll_timeout - Restart polling timer
+  * @ptr: Map to lpfc_hba data structure pointer.
+  *
+  * This routine restarts fcp_poll timer, when FCP ring  polling is enable
+@@ -2283,8 +2287,7 @@ void lpfc_poll_timeout(unsigned long ptr
+ }
+ /**
+- * lpfc_queuecommand: Queuecommand entry point of Scsi Host Templater data
+- * structure.
++ * lpfc_queuecommand - scsi_host_template queuecommand entry point
+  * @cmnd: Pointer to scsi_cmnd data structure.
+  * @done: Pointer to done routine.
+  *
+@@ -2450,7 +2453,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd
+ }
+ /**
+- * lpfc_block_error_handler: Routine to block error  handler.
++ * lpfc_block_error_handler - Routine to block error  handler
+  * @cmnd: Pointer to scsi_cmnd data structure.
+  *
+  *  This routine blocks execution till fc_rport state is not FC_PORSTAT_BLCOEKD.
+@@ -2472,8 +2475,7 @@ lpfc_block_error_handler(struct scsi_cmn
+ }
+ /**
+- * lpfc_abort_handler: Eh_abort_handler entry point of Scsi Host Template data
+- *structure.
++ * lpfc_abort_handler - scsi_host_template eh_abort_handler entry point
+  * @cmnd: Pointer to scsi_cmnd data structure.
+  *
+  * This routine aborts @cmnd pending in base driver.
+@@ -2578,8 +2580,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmn
+ }
+ /**
+- * lpfc_device_reset_handler: eh_device_reset entry point of Scsi Host Template
+- *data structure.
++ * lpfc_device_reset_handler - scsi_host_template eh_device_reset entry point
+  * @cmnd: Pointer to scsi_cmnd data structure.
+  *
+  * This routine does a device reset by sending a TARGET_RESET task management
+@@ -2587,7 +2588,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmn
+  *
+  * Return code :
+  *  0x2003 - Error
+- *  0ex2002 - Success
++ *  0x2002 - Success
+  **/
+ static int
+ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
+@@ -2707,8 +2708,7 @@ lpfc_device_reset_handler(struct scsi_cm
+ }
+ /**
+- * lpfc_bus_reset_handler: eh_bus_reset_handler entry point of Scsi Host
+- * Template data structure.
++ * lpfc_bus_reset_handler - scsi_host_template eh_bus_reset_handler entry point
+  * @cmnd: Pointer to scsi_cmnd data structure.
+  *
+  * This routine does target reset to all target on @cmnd->device->host.
+@@ -2808,8 +2808,7 @@ lpfc_bus_reset_handler(struct scsi_cmnd 
+ }
+ /**
+- * lpfc_slave_alloc: slave_alloc entry point of Scsi Host Template data
+- * structure.
++ * lpfc_slave_alloc - scsi_host_template slave_alloc entry point
+  * @sdev: Pointer to scsi_device.
+  *
+  * This routine populates the cmds_per_lun count + 2 scsi_bufs into  this host's
+@@ -2883,8 +2882,7 @@ lpfc_slave_alloc(struct scsi_device *sde
+ }
+ /**
+- * lpfc_slave_configure: slave_configure entry point of Scsi Host Templater data
+- *  structure.
++ * lpfc_slave_configure - scsi_host_template slave_configure entry point
+  * @sdev: Pointer to scsi_device.
+  *
+  * This routine configures following items
+@@ -2925,7 +2923,7 @@ lpfc_slave_configure(struct scsi_device 
+ }
+ /**
+- * lpfc_slave_destroy: slave_destroy entry point of SHT data structure.
++ * lpfc_slave_destroy - slave_destroy entry point of SHT data structure
+  * @sdev: Pointer to scsi_device.
+  *
+  * This routine sets @sdev hostatdata filed to null.
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_sli.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_sli.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_sli.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_sli.c  2009-05-13 09:46:19.000000000 +0200
+@@ -68,7 +68,7 @@ typedef enum _lpfc_iocb_type {
+ } lpfc_iocb_type;
+ /**
+- * lpfc_cmd_iocb: Get next command iocb entry in the ring.
++ * lpfc_cmd_iocb - Get next command iocb entry in the ring
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -85,7 +85,7 @@ lpfc_cmd_iocb(struct lpfc_hba *phba, str
+ }
+ /**
+- * lpfc_resp_iocb: Get next response iocb entry in the ring.
++ * lpfc_resp_iocb - Get next response iocb entry in the ring
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -102,7 +102,7 @@ lpfc_resp_iocb(struct lpfc_hba *phba, st
+ }
+ /**
+- * __lpfc_sli_get_iocbq: Allocates an iocb object from iocb pool.
++ * __lpfc_sli_get_iocbq - Allocates an iocb object from iocb pool
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called with hbalock held. This function
+@@ -121,7 +121,7 @@ __lpfc_sli_get_iocbq(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_get_iocbq: Allocates an iocb object from iocb pool.
++ * lpfc_sli_get_iocbq - Allocates an iocb object from iocb pool
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called with no lock held. This function
+@@ -142,7 +142,7 @@ lpfc_sli_get_iocbq(struct lpfc_hba *phba
+ }
+ /**
+- * __lpfc_sli_release_iocbq: Release iocb to the iocb pool.
++ * __lpfc_sli_release_iocbq - Release iocb to the iocb pool
+  * @phba: Pointer to HBA context object.
+  * @iocbq: Pointer to driver iocb object.
+  *
+@@ -164,7 +164,7 @@ __lpfc_sli_release_iocbq(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_release_iocbq: Release iocb to the iocb pool.
++ * lpfc_sli_release_iocbq - Release iocb to the iocb pool
+  * @phba: Pointer to HBA context object.
+  * @iocbq: Pointer to driver iocb object.
+  *
+@@ -185,8 +185,40 @@ lpfc_sli_release_iocbq(struct lpfc_hba *
+ }
+ /**
+- * lpfc_sli_iocb_cmd_type: Get the iocb type.
+- * @iocb_cmnd : iocb command code.
++ * lpfc_sli_cancel_iocbs - Cancel all iocbs from a list.
++ * @phba: Pointer to HBA context object.
++ * @iocblist: List of IOCBs.
++ * @ulpstatus: ULP status in IOCB command field.
++ * @ulpWord4: ULP word-4 in IOCB command field.
++ *
++ * This function is called with a list of IOCBs to cancel. It cancels the IOCB
++ * on the list by invoking the complete callback function associated with the
++ * IOCB with the provided @ulpstatus and @ulpword4 set to the IOCB commond
++ * fields.
++ **/
++void
++lpfc_sli_cancel_iocbs(struct lpfc_hba *phba, struct list_head *iocblist,
++                    uint32_t ulpstatus, uint32_t ulpWord4)
++{
++      struct lpfc_iocbq *piocb;
++
++      while (!list_empty(iocblist)) {
++              list_remove_head(iocblist, piocb, struct lpfc_iocbq, list);
++
++              if (!piocb->iocb_cmpl)
++                      lpfc_sli_release_iocbq(phba, piocb);
++              else {
++                      piocb->iocb.ulpStatus = ulpstatus;
++                      piocb->iocb.un.ulpWord[4] = ulpWord4;
++                      (piocb->iocb_cmpl) (phba, piocb, piocb);
++              }
++      }
++      return;
++}
++
++/**
++ * lpfc_sli_iocb_cmd_type - Get the iocb type
++ * @iocb_cmnd: iocb command code.
+  *
+  * This function is called by ring event handler function to get the iocb type.
+  * This function translates the iocb command to an iocb command type used to
+@@ -295,7 +327,7 @@ lpfc_sli_iocb_cmd_type(uint8_t iocb_cmnd
+ }
+ /**
+- * lpfc_sli_ring_map: Issue config_ring mbox for all rings.
++ * lpfc_sli_ring_map - Issue config_ring mbox for all rings
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called from SLI initialization code
+@@ -338,7 +370,7 @@ lpfc_sli_ring_map(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_sli_ringtxcmpl_put: Adds new iocb to the txcmplq.
++ * lpfc_sli_ringtxcmpl_put - Adds new iocb to the txcmplq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @piocb: Pointer to the driver iocb object.
+@@ -370,7 +402,7 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba 
+ }
+ /**
+- * lpfc_sli_ringtx_get: Get first element of the txq.
++ * lpfc_sli_ringtx_get - Get first element of the txq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -391,7 +423,7 @@ lpfc_sli_ringtx_get(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_sli_next_iocb_slot: Get next iocb slot in the ring.
++ * lpfc_sli_next_iocb_slot - Get next iocb slot in the ring
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -445,7 +477,7 @@ lpfc_sli_next_iocb_slot (struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_next_iotag: Get an iotag for the iocb.
++ * lpfc_sli_next_iotag - Get an iotag for the iocb
+  * @phba: Pointer to HBA context object.
+  * @iocbq: Pointer to driver iocb object.
+  *
+@@ -520,7 +552,7 @@ lpfc_sli_next_iotag(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_sli_submit_iocb: Submit an iocb to the firmware.
++ * lpfc_sli_submit_iocb - Submit an iocb to the firmware
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @iocb: Pointer to iocb slot in the ring.
+@@ -577,7 +609,7 @@ lpfc_sli_submit_iocb(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_update_full_ring: Update the chip attention register.
++ * lpfc_sli_update_full_ring - Update the chip attention register
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -608,7 +640,7 @@ lpfc_sli_update_full_ring(struct lpfc_hb
+ }
+ /**
+- * lpfc_sli_update_ring: Update chip attention register.
++ * lpfc_sli_update_ring - Update chip attention register
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -632,7 +664,7 @@ lpfc_sli_update_ring(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_resume_iocb: Process iocbs in the txq.
++ * lpfc_sli_resume_iocb - Process iocbs in the txq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -672,7 +704,7 @@ lpfc_sli_resume_iocb(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_next_hbq_slot: Get next hbq entry for the HBQ.
++ * lpfc_sli_next_hbq_slot - Get next hbq entry for the HBQ
+  * @phba: Pointer to HBA context object.
+  * @hbqno: HBQ number.
+  *
+@@ -717,7 +749,7 @@ lpfc_sli_next_hbq_slot(struct lpfc_hba *
+ }
+ /**
+- * lpfc_sli_hbqbuf_free_all: Free all the hbq buffers.
++ * lpfc_sli_hbqbuf_free_all - Free all the hbq buffers
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called with no lock held to free all the
+@@ -771,7 +803,7 @@ lpfc_sli_hbqbuf_free_all(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_hbq_to_firmware: Post the hbq buffer to firmware.
++ * lpfc_sli_hbq_to_firmware - Post the hbq buffer to firmware
+  * @phba: Pointer to HBA context object.
+  * @hbqno: HBQ number.
+  * @hbq_buf: Pointer to HBQ buffer.
+@@ -818,8 +850,8 @@ static struct lpfc_hbq_init lpfc_els_hbq
+       .profile = 0,
+       .ring_mask = (1 << LPFC_ELS_RING),
+       .buffer_count = 0,
+-      .init_count = 20,
+-      .add_count = 5,
++      .init_count = 40,
++      .add_count = 40,
+ };
+ /* HBQ for the extra ring if needed */
+@@ -841,7 +873,7 @@ struct lpfc_hbq_init *lpfc_hbq_defs[] = 
+ };
+ /**
+- * lpfc_sli_hbqbuf_fill_hbqs: Post more hbq buffers to HBQ.
++ * lpfc_sli_hbqbuf_fill_hbqs - Post more hbq buffers to HBQ
+  * @phba: Pointer to HBA context object.
+  * @hbqno: HBQ number.
+  * @count: Number of HBQ buffers to be posted.
+@@ -901,7 +933,7 @@ err:
+ }
+ /**
+- * lpfc_sli_hbqbuf_add_hbqs: Post more HBQ buffers to firmware.
++ * lpfc_sli_hbqbuf_add_hbqs - Post more HBQ buffers to firmware
+  * @phba: Pointer to HBA context object.
+  * @qno: HBQ number.
+  *
+@@ -917,7 +949,7 @@ lpfc_sli_hbqbuf_add_hbqs(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_hbqbuf_init_hbqs: Post initial buffers to the HBQ.
++ * lpfc_sli_hbqbuf_init_hbqs - Post initial buffers to the HBQ
+  * @phba: Pointer to HBA context object.
+  * @qno:  HBQ queue number.
+  *
+@@ -933,7 +965,7 @@ lpfc_sli_hbqbuf_init_hbqs(struct lpfc_hb
+ }
+ /**
+- * lpfc_sli_hbqbuf_find: Find the hbq buffer associated with a tag.
++ * lpfc_sli_hbqbuf_find - Find the hbq buffer associated with a tag
+  * @phba: Pointer to HBA context object.
+  * @tag: Tag of the hbq buffer.
+  *
+@@ -966,7 +998,7 @@ lpfc_sli_hbqbuf_find(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_free_hbq: Give back the hbq buffer to firmware.
++ * lpfc_sli_free_hbq - Give back the hbq buffer to firmware
+  * @phba: Pointer to HBA context object.
+  * @hbq_buffer: Pointer to HBQ buffer.
+  *
+@@ -988,7 +1020,7 @@ lpfc_sli_free_hbq(struct lpfc_hba *phba,
+ }
+ /**
+- * lpfc_sli_chk_mbx_command: Check if the mailbox is a legitimate mailbox.
++ * lpfc_sli_chk_mbx_command - Check if the mailbox is a legitimate mailbox
+  * @mbxCommand: mailbox command code.
+  *
+  * This function is called by the mailbox event handler function to verify
+@@ -1064,8 +1096,7 @@ lpfc_sli_chk_mbx_command(uint8_t mbxComm
+ }
+ /**
+- * lpfc_sli_wake_mbox_wait: Completion handler for mbox issued from
+- *          lpfc_sli_issue_mbox_wait.
++ * lpfc_sli_wake_mbox_wait - lpfc_sli_issue_mbox_wait mbox completion handler
+  * @phba: Pointer to HBA context object.
+  * @pmboxq: Pointer to mailbox command.
+  *
+@@ -1096,7 +1127,7 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba 
+ /**
+- * lpfc_sli_def_mbox_cmpl: Default mailbox completion handler.
++ * lpfc_sli_def_mbox_cmpl - Default mailbox completion handler
+  * @phba: Pointer to HBA context object.
+  * @pmb: Pointer to mailbox object.
+  *
+@@ -1140,7 +1171,7 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *
+ }
+ /**
+- * lpfc_sli_handle_mb_event: Handle mailbox completions from firmware.
++ * lpfc_sli_handle_mb_event - Handle mailbox completions from firmware
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called with no lock held. This function processes all
+@@ -1260,7 +1291,7 @@ lpfc_sli_handle_mb_event(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_get_buff: Get the buffer associated with the buffer tag.
++ * lpfc_sli_get_buff - Get the buffer associated with the buffer tag
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @tag: buffer tag.
+@@ -1288,7 +1319,7 @@ lpfc_sli_get_buff(struct lpfc_hba *phba,
+ /**
+- * lpfc_sli_process_unsol_iocb: Unsolicited iocb handler.
++ * lpfc_sli_process_unsol_iocb - Unsolicited iocb handler
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @saveq: Pointer to the unsolicited iocb.
+@@ -1484,7 +1515,7 @@ lpfc_sli_process_unsol_iocb(struct lpfc_
+ }
+ /**
+- * lpfc_sli_iocbq_lookup: Find command iocb for the given response iocb.
++ * lpfc_sli_iocbq_lookup - Find command iocb for the given response iocb
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @prspiocb: Pointer to response iocb object.
+@@ -1521,7 +1552,7 @@ lpfc_sli_iocbq_lookup(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_sli_process_sol_iocb: process solicited iocb completion.
++ * lpfc_sli_process_sol_iocb - process solicited iocb completion
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @saveq: Pointer to the response iocb to be processed.
+@@ -1597,7 +1628,7 @@ lpfc_sli_process_sol_iocb(struct lpfc_hb
+                        * Ring <ringno> handler: unexpected completion IoTag
+                        * <IoTag>
+                        */
+-                      lpfc_printf_vlog(cmdiocbp->vport, KERN_WARNING, LOG_SLI,
++                      lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
+                                        "0322 Ring %d handler: "
+                                        "unexpected completion IoTag x%x "
+                                        "Data: x%x x%x x%x x%x\n",
+@@ -1614,7 +1645,7 @@ lpfc_sli_process_sol_iocb(struct lpfc_hb
+ }
+ /**
+- * lpfc_sli_rsp_pointers_error: Response ring pointer error handler.
++ * lpfc_sli_rsp_pointers_error - Response ring pointer error handler
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -1652,7 +1683,7 @@ lpfc_sli_rsp_pointers_error(struct lpfc_
+ }
+ /**
+- * lpfc_poll_eratt: Error attention polling timer timeout handler.
++ * lpfc_poll_eratt - Error attention polling timer timeout handler
+  * @ptr: Pointer to address of HBA context object.
+  *
+  * This function is invoked by the Error Attention polling timer when the
+@@ -1682,7 +1713,7 @@ void lpfc_poll_eratt(unsigned long ptr)
+ }
+ /**
+- * lpfc_sli_poll_fcp_ring: Handle FCP ring completion in polling mode.
++ * lpfc_sli_poll_fcp_ring - Handle FCP ring completion in polling mode
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called from lpfc_queuecommand, lpfc_poll_timeout,
+@@ -1845,7 +1876,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
+ }
+ /**
+- * lpfc_sli_handle_fast_ring_event: Handle ring events on FCP ring.
++ * lpfc_sli_handle_fast_ring_event - Handle ring events on FCP ring
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @mask: Host attention register mask for this ring.
+@@ -2037,7 +2068,7 @@ lpfc_sli_handle_fast_ring_event(struct l
+ }
+ /**
+- * lpfc_sli_handle_slow_ring_event: Handle ring events for non-FCP rings.
++ * lpfc_sli_handle_slow_ring_event - Handle ring events for non-FCP rings
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @mask: Host attention register mask for this ring.
+@@ -2311,7 +2342,7 @@ lpfc_sli_handle_slow_ring_event(struct l
+ }
+ /**
+- * lpfc_sli_abort_iocb_ring: Abort all iocbs in the ring.
++ * lpfc_sli_abort_iocb_ring - Abort all iocbs in the ring
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  *
+@@ -2325,7 +2356,6 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba
+ {
+       LIST_HEAD(completions);
+       struct lpfc_iocbq *iocb, *next_iocb;
+-      IOCB_t *cmd = NULL;
+       if (pring->ringno == LPFC_ELS_RING) {
+               lpfc_fabric_abort_hba(phba);
+@@ -2344,23 +2374,13 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba
+       spin_unlock_irq(&phba->hbalock);
+-      while (!list_empty(&completions)) {
+-              iocb = list_get_first(&completions, struct lpfc_iocbq, list);
+-              cmd = &iocb->iocb;
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_ABORTED);
+ }
+ /**
+- * lpfc_sli_flush_fcp_rings: flush all iocbs in the fcp ring.
++ * lpfc_sli_flush_fcp_rings - flush all iocbs in the fcp ring
+  * @phba: Pointer to HBA context object.
+  *
+  * This function flushes all iocbs in the fcp ring and frees all the iocb
+@@ -2374,8 +2394,6 @@ lpfc_sli_flush_fcp_rings(struct lpfc_hba
+ {
+       LIST_HEAD(txq);
+       LIST_HEAD(txcmplq);
+-      struct lpfc_iocbq *iocb;
+-      IOCB_t *cmd = NULL;
+       struct lpfc_sli *psli = &phba->sli;
+       struct lpfc_sli_ring  *pring;
+@@ -2393,38 +2411,16 @@ lpfc_sli_flush_fcp_rings(struct lpfc_hba
+       spin_unlock_irq(&phba->hbalock);
+       /* Flush the txq */
+-      while (!list_empty(&txq)) {
+-              iocb = list_get_first(&txq, struct lpfc_iocbq, list);
+-              cmd = &iocb->iocb;
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_DOWN;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      lpfc_sli_cancel_iocbs(phba, &txq, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_DOWN);
+       /* Flush the txcmpq */
+-      while (!list_empty(&txcmplq)) {
+-              iocb = list_get_first(&txcmplq, struct lpfc_iocbq, list);
+-              cmd = &iocb->iocb;
+-              list_del_init(&iocb->list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_DOWN;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      lpfc_sli_cancel_iocbs(phba, &txcmplq, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_DOWN);
+ }
+ /**
+- * lpfc_sli_brdready: Check for host status bits.
++ * lpfc_sli_brdready - Check for host status bits
+  * @phba: Pointer to HBA context object.
+  * @mask: Bit mask to be checked.
+  *
+@@ -2484,7 +2480,7 @@ lpfc_sli_brdready(struct lpfc_hba *phba,
+ #define BARRIER_TEST_PATTERN (0xdeadbeef)
+ /**
+- * lpfc_reset_barrier: Make HBA ready for HBA reset.
++ * lpfc_reset_barrier - Make HBA ready for HBA reset
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called before resetting an HBA. This
+@@ -2564,7 +2560,7 @@ restore_hc:
+ }
+ /**
+- * lpfc_sli_brdkill: Issue a kill_board mailbox command.
++ * lpfc_sli_brdkill - Issue a kill_board mailbox command
+  * @phba: Pointer to HBA context object.
+  *
+  * This function issues a kill_board mailbox command and waits for
+@@ -2651,7 +2647,7 @@ lpfc_sli_brdkill(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_sli_brdreset: Reset the HBA.
++ * lpfc_sli_brdreset - Reset the HBA
+  * @phba: Pointer to HBA context object.
+  *
+  * This function resets the HBA by writing HC_INITFF to the control
+@@ -2714,7 +2710,7 @@ lpfc_sli_brdreset(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_sli_brdrestart: Restart the HBA.
++ * lpfc_sli_brdrestart - Restart the HBA
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called in the SLI initialization code path to
+@@ -2781,7 +2777,7 @@ lpfc_sli_brdrestart(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_sli_chipset_init: Wait for the restart of the HBA after a restart.
++ * lpfc_sli_chipset_init - Wait for the restart of the HBA after a restart
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called after a HBA restart to wait for successful
+@@ -2876,7 +2872,7 @@ lpfc_sli_chipset_init(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_sli_hbq_count: Get the number of HBQs to be configured.
++ * lpfc_sli_hbq_count - Get the number of HBQs to be configured
+  *
+  * This function calculates and returns the number of HBQs required to be
+  * configured.
+@@ -2888,7 +2884,7 @@ lpfc_sli_hbq_count(void)
+ }
+ /**
+- * lpfc_sli_hbq_entry_count: Calculate total number of hbq entries.
++ * lpfc_sli_hbq_entry_count - Calculate total number of hbq entries
+  *
+  * This function adds the number of hbq entries in every HBQ to get
+  * the total number of hbq entries required for the HBA and returns
+@@ -2907,7 +2903,7 @@ lpfc_sli_hbq_entry_count(void)
+ }
+ /**
+- * lpfc_sli_hbq_size: Calculate memory required for all hbq entries.
++ * lpfc_sli_hbq_size - Calculate memory required for all hbq entries
+  *
+  * This function calculates amount of memory required for all hbq entries
+  * to be configured and returns the total memory required.
+@@ -2919,7 +2915,7 @@ lpfc_sli_hbq_size(void)
+ }
+ /**
+- * lpfc_sli_hbq_setup: configure and initialize HBQs.
++ * lpfc_sli_hbq_setup - configure and initialize HBQs
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called during the SLI initialization to configure
+@@ -2988,7 +2984,7 @@ lpfc_sli_hbq_setup(struct lpfc_hba *phba
+ }
+ /**
+- * lpfc_sli_config_port: Issue config port mailbox command.
++ * lpfc_sli_config_port - Issue config port mailbox command
+  * @phba: Pointer to HBA context object.
+  * @sli_mode: sli mode - 2/3
+  *
+@@ -3114,7 +3110,7 @@ do_prep_failed:
+ /**
+- * lpfc_sli_hba_setup: SLI intialization function.
++ * lpfc_sli_hba_setup - SLI intialization function
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is the main SLI intialization function. This function
+@@ -3206,7 +3202,7 @@ lpfc_sli_hba_setup_error:
+ /**
+- * lpfc_mbox_timeout: Timeout call back function for mbox timer.
++ * lpfc_mbox_timeout - Timeout call back function for mbox timer
+  * @ptr: context object - pointer to hba structure.
+  *
+  * This is the callback function for mailbox timer. The mailbox
+@@ -3237,7 +3233,7 @@ lpfc_mbox_timeout(unsigned long ptr)
+ /**
+- * lpfc_mbox_timeout_handler: Worker thread function to handle mailbox timeout.
++ * lpfc_mbox_timeout_handler - Worker thread function to handle mailbox timeout
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called from worker thread when a mailbox command times out.
+@@ -3252,6 +3248,21 @@ lpfc_mbox_timeout_handler(struct lpfc_hb
+       struct lpfc_sli *psli = &phba->sli;
+       struct lpfc_sli_ring *pring;
++      /* Check the pmbox pointer first.  There is a race condition
++       * between the mbox timeout handler getting executed in the
++       * worklist and the mailbox actually completing. When this
++       * race condition occurs, the mbox_active will be NULL.
++       */
++      spin_lock_irq(&phba->hbalock);
++      if (pmbox == NULL) {
++              lpfc_printf_log(phba, KERN_WARNING,
++                              LOG_MBOX | LOG_SLI,
++                              "0353 Active Mailbox cleared - mailbox timeout "
++                              "exiting\n");
++              spin_unlock_irq(&phba->hbalock);
++              return;
++      }
++
+       /* Mbox cmd <mbxCommand> timeout */
+       lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
+                       "0310 Mailbox command x%x timeout Data: x%x x%x x%p\n",
+@@ -3259,6 +3270,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hb
+                       phba->pport->port_state,
+                       phba->sli.sli_flag,
+                       phba->sli.mbox_active);
++      spin_unlock_irq(&phba->hbalock);
+       /* Setting state unknown so lpfc_sli_abort_iocb_ring
+        * would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing
+@@ -3295,7 +3307,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hb
+ }
+ /**
+- * lpfc_sli_issue_mbox: Issue a mailbox command to firmware.
++ * lpfc_sli_issue_mbox - Issue a mailbox command to firmware
+  * @phba: Pointer to HBA context object.
+  * @pmbox: Pointer to mailbox object.
+  * @flag: Flag indicating how the mailbox need to be processed.
+@@ -3365,6 +3377,12 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
+               goto out_not_finished;
+       }
++      /* If HBA has a deferred error attention, fail the iocb. */
++      if (unlikely(phba->hba_flag & DEFER_ERATT)) {
++              spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
++              goto out_not_finished;
++      }
++
+       psli = &phba->sli;
+       mb = &pmbox->mb;
+@@ -3632,7 +3650,7 @@ out_not_finished:
+ }
+ /**
+- * __lpfc_sli_ringtx_put: Add an iocb to the txq.
++ * __lpfc_sli_ringtx_put - Add an iocb to the txq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @piocb: Pointer to address of newly added command iocb.
+@@ -3651,7 +3669,7 @@ __lpfc_sli_ringtx_put(struct lpfc_hba *p
+ }
+ /**
+- * lpfc_sli_next_iocb: Get the next iocb in the txq.
++ * lpfc_sli_next_iocb - Get the next iocb in the txq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @piocb: Pointer to address of newly added command iocb.
+@@ -3683,7 +3701,7 @@ lpfc_sli_next_iocb(struct lpfc_hba *phba
+ }
+ /**
+- * __lpfc_sli_issue_iocb: Lockless version of lpfc_sli_issue_iocb.
++ * __lpfc_sli_issue_iocb - Lockless version of lpfc_sli_issue_iocb
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @piocb: Pointer to command iocb.
+@@ -3729,6 +3747,10 @@ __lpfc_sli_issue_iocb(struct lpfc_hba *p
+       if (unlikely(pci_channel_offline(phba->pcidev)))
+               return IOCB_ERROR;
++      /* If HBA has a deferred error attention, fail the iocb. */
++      if (unlikely(phba->hba_flag & DEFER_ERATT))
++              return IOCB_ERROR;
++
+       /*
+        * We should never get an IOCB if we are in a < LINK_DOWN state
+        */
+@@ -3813,7 +3835,7 @@ __lpfc_sli_issue_iocb(struct lpfc_hba *p
+ /**
+- * lpfc_sli_issue_iocb: Wrapper function for __lpfc_sli_issue_iocb.
++ * lpfc_sli_issue_iocb - Wrapper function for __lpfc_sli_issue_iocb
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @piocb: Pointer to command iocb.
+@@ -3840,7 +3862,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phb
+ }
+ /**
+- * lpfc_extra_ring_setup: Extra ring setup function.
++ * lpfc_extra_ring_setup - Extra ring setup function
+  * @phba: Pointer to HBA context object.
+  *
+  * This function is called while driver attaches with the
+@@ -3886,7 +3908,7 @@ lpfc_extra_ring_setup( struct lpfc_hba *
+ }
+ /**
+- * lpfc_sli_async_event_handler: ASYNC iocb handler function.
++ * lpfc_sli_async_event_handler - ASYNC iocb handler function
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @iocbq: Pointer to iocb object.
+@@ -3907,6 +3929,7 @@ lpfc_sli_async_event_handler(struct lpfc
+       uint16_t temp;
+       struct temp_event temp_event_data;
+       struct Scsi_Host *shost;
++      uint32_t *iocb_w;
+       icmd = &iocbq->iocb;
+       evt_code = icmd->un.asyncstat.evt_code;
+@@ -3914,13 +3937,23 @@ lpfc_sli_async_event_handler(struct lpfc
+       if ((evt_code != ASYNC_TEMP_WARN) &&
+               (evt_code != ASYNC_TEMP_SAFE)) {
++              iocb_w = (uint32_t *) icmd;
+               lpfc_printf_log(phba,
+                       KERN_ERR,
+                       LOG_SLI,
+                       "0346 Ring %d handler: unexpected ASYNC_STATUS"
+-                      " evt_code 0x%x\n",
++                      " evt_code 0x%x \n"
++                      "W0  0x%08x W1  0x%08x W2  0x%08x W3  0x%08x\n"
++                      "W4  0x%08x W5  0x%08x W6  0x%08x W7  0x%08x\n"
++                      "W8  0x%08x W9  0x%08x W10 0x%08x W11 0x%08x\n"
++                      "W12 0x%08x W13 0x%08x W14 0x%08x W15 0x%08x\n",
+                       pring->ringno,
+-                      icmd->un.asyncstat.evt_code);
++                      icmd->un.asyncstat.evt_code,
++                      iocb_w[0], iocb_w[1], iocb_w[2], iocb_w[3],
++                      iocb_w[4], iocb_w[5], iocb_w[6], iocb_w[7],
++                      iocb_w[8], iocb_w[9], iocb_w[10], iocb_w[11],
++                      iocb_w[12], iocb_w[13], iocb_w[14], iocb_w[15]);
++
+               return;
+       }
+       temp_event_data.data = (uint32_t)temp;
+@@ -3954,7 +3987,7 @@ lpfc_sli_async_event_handler(struct lpfc
+ /**
+- * lpfc_sli_setup: SLI ring setup function.
++ * lpfc_sli_setup - SLI ring setup function
+  * @phba: Pointer to HBA context object.
+  *
+  * lpfc_sli_setup sets up rings of the SLI interface with
+@@ -4076,7 +4109,7 @@ lpfc_sli_setup(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_sli_queue_setup: Queue initialization function.
++ * lpfc_sli_queue_setup - Queue initialization function
+  * @phba: Pointer to HBA context object.
+  *
+  * lpfc_sli_queue_setup sets up mailbox queues and iocb queues for each
+@@ -4115,7 +4148,7 @@ lpfc_sli_queue_setup(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_host_down: Vport cleanup function.
++ * lpfc_sli_host_down - Vport cleanup function
+  * @vport: Pointer to virtual port object.
+  *
+  * lpfc_sli_host_down is called to clean up the resources
+@@ -4179,22 +4212,14 @@ lpfc_sli_host_down(struct lpfc_vport *vp
+       spin_unlock_irqrestore(&phba->hbalock, flags);
+-      while (!list_empty(&completions)) {
+-              list_remove_head(&completions, iocb, struct lpfc_iocbq, list);
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      iocb->iocb.ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      iocb->iocb.un.ulpWord[4] = IOERR_SLI_DOWN;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_DOWN);
+       return 1;
+ }
+ /**
+- * lpfc_sli_hba_down: Resource cleanup function for the HBA.
++ * lpfc_sli_hba_down - Resource cleanup function for the HBA
+  * @phba: Pointer to HBA context object.
+  *
+  * This function cleans up all iocb, buffers, mailbox commands
+@@ -4216,8 +4241,6 @@ lpfc_sli_hba_down(struct lpfc_hba *phba)
+       struct lpfc_sli_ring *pring;
+       struct lpfc_dmabuf *buf_ptr;
+       LPFC_MBOXQ_t *pmb;
+-      struct lpfc_iocbq *iocb;
+-      IOCB_t *cmd = NULL;
+       int i;
+       unsigned long flags = 0;
+@@ -4245,18 +4268,9 @@ lpfc_sli_hba_down(struct lpfc_hba *phba)
+       }
+       spin_unlock_irqrestore(&phba->hbalock, flags);
+-      while (!list_empty(&completions)) {
+-              list_remove_head(&completions, iocb, struct lpfc_iocbq, list);
+-              cmd = &iocb->iocb;
+-
+-              if (!iocb->iocb_cmpl)
+-                      lpfc_sli_release_iocbq(phba, iocb);
+-              else {
+-                      cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
+-                      cmd->un.ulpWord[4] = IOERR_SLI_DOWN;
+-                      (iocb->iocb_cmpl) (phba, iocb, iocb);
+-              }
+-      }
++      /* Cancel all the IOCBs from the completions list */
++      lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
++                            IOERR_SLI_DOWN);
+       spin_lock_irqsave(&phba->hbalock, flags);
+       list_splice_init(&phba->elsbuf, &completions);
+@@ -4299,7 +4313,7 @@ lpfc_sli_hba_down(struct lpfc_hba *phba)
+ }
+ /**
+- * lpfc_sli_pcimem_bcopy: SLI memory copy function.
++ * lpfc_sli_pcimem_bcopy - SLI memory copy function
+  * @srcp: Source memory pointer.
+  * @destp: Destination memory pointer.
+  * @cnt: Number of words required to be copied.
+@@ -4329,7 +4343,7 @@ lpfc_sli_pcimem_bcopy(void *srcp, void *
+ /**
+- * lpfc_sli_ringpostbuf_put: Function to add a buffer to postbufq.
++ * lpfc_sli_ringpostbuf_put - Function to add a buffer to postbufq
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @mp: Pointer to driver buffer object.
+@@ -4352,8 +4366,7 @@ lpfc_sli_ringpostbuf_put(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_get_buffer_tag: Tag allocation function for a buffer posted
+- *          using CMD_QUE_XRI64_CX iocb.
++ * lpfc_sli_get_buffer_tag - allocates a tag for a CMD_QUE_XRI64_CX buffer
+  * @phba: Pointer to HBA context object.
+  *
+  * When HBQ is enabled, buffers are searched based on tags. This function
+@@ -4378,8 +4391,7 @@ lpfc_sli_get_buffer_tag(struct lpfc_hba 
+ }
+ /**
+- * lpfc_sli_ring_taggedbuf_get: Search HBQ buffer associated with
+- *              posted using CMD_QUE_XRI64_CX iocb.
++ * lpfc_sli_ring_taggedbuf_get - find HBQ buffer associated with given tag
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @tag: Buffer tag.
+@@ -4422,8 +4434,7 @@ lpfc_sli_ring_taggedbuf_get(struct lpfc_
+ }
+ /**
+- * lpfc_sli_ringpostbuf_get: SLI2 buffer search function for
+- *      unsolicited ct and els events.
++ * lpfc_sli_ringpostbuf_get - search buffers for unsolicited CT and ELS events
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @phys: DMA address of the buffer.
+@@ -4466,7 +4477,7 @@ lpfc_sli_ringpostbuf_get(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_abort_els_cmpl: Completion handler for the els abort iocbs.
++ * lpfc_sli_abort_els_cmpl - Completion handler for the els abort iocbs
+  * @phba: Pointer to HBA context object.
+  * @cmdiocb: Pointer to driver command iocb object.
+  * @rspiocb: Pointer to driver response iocb object.
+@@ -4542,7 +4553,7 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba 
+ }
+ /**
+- * lpfc_ignore_els_cmpl: Completion handler for aborted ELS command.
++ * lpfc_ignore_els_cmpl - Completion handler for aborted ELS command
+  * @phba: Pointer to HBA context object.
+  * @cmdiocb: Pointer to driver command iocb object.
+  * @rspiocb: Pointer to driver response iocb object.
+@@ -4572,7 +4583,7 @@ lpfc_ignore_els_cmpl(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sli_issue_abort_iotag: Abort function for a command iocb.
++ * lpfc_sli_issue_abort_iotag - Abort function for a command iocb
+  * @phba: Pointer to HBA context object.
+  * @pring: Pointer to driver SLI ring object.
+  * @cmdiocb: Pointer to driver command iocb object.
+@@ -4658,15 +4669,14 @@ abort_iotag_exit:
+ }
+ /**
+- * lpfc_sli_validate_fcp_iocb: Filtering function, used to find commands
+- *                    associated with a vport/SCSI target/lun.
++ * lpfc_sli_validate_fcp_iocb - find commands associated with a vport or LUN
+  * @iocbq: Pointer to driver iocb object.
+  * @vport: Pointer to driver virtual port object.
+  * @tgt_id: SCSI ID of the target.
+  * @lun_id: LUN ID of the scsi device.
+  * @ctx_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST
+  *
+- * This function acts as iocb filter for functions which abort or count
++ * This function acts as an iocb filter for functions which abort or count
+  * all FCP iocbs pending on a lun/SCSI target/SCSI host. It will return
+  * 0 if the filtering criteria is met for the given iocb and will return
+  * 1 if the filtering criteria is not met.
+@@ -4724,7 +4734,7 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_i
+ }
+ /**
+- * lpfc_sli_sum_iocb: Function to count the number of FCP iocbs pending.
++ * lpfc_sli_sum_iocb - Function to count the number of FCP iocbs pending
+  * @vport: Pointer to virtual port.
+  * @tgt_id: SCSI ID of the target.
+  * @lun_id: LUN ID of the scsi device.
+@@ -4762,8 +4772,7 @@ lpfc_sli_sum_iocb(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_sli_abort_fcp_cmpl: Completion handler function for an aborted
+- *       FCP iocb.
++ * lpfc_sli_abort_fcp_cmpl - Completion handler function for aborted FCP IOCBs
+  * @phba: Pointer to HBA context object
+  * @cmdiocb: Pointer to command iocb object.
+  * @rspiocb: Pointer to response iocb object.
+@@ -4781,8 +4790,7 @@ lpfc_sli_abort_fcp_cmpl(struct lpfc_hba 
+ }
+ /**
+- * lpfc_sli_abort_iocb: This function issue abort for all SCSI commands
+- *          pending on a SCSI host(vport)/target/lun.
++ * lpfc_sli_abort_iocb - issue abort for all commands on a host/target/LUN
+  * @vport: Pointer to virtual port.
+  * @pring: Pointer to driver SLI ring object.
+  * @tgt_id: SCSI ID of the target.
+@@ -4854,8 +4862,7 @@ lpfc_sli_abort_iocb(struct lpfc_vport *v
+ }
+ /**
+- * lpfc_sli_wake_iocb_wait: iocb completion handler for iocb issued using
+- *                          lpfc_sli_issue_iocb_wait.
++ * lpfc_sli_wake_iocb_wait - lpfc_sli_issue_iocb_wait's completion handler
+  * @phba: Pointer to HBA context object.
+  * @cmdiocbq: Pointer to command iocb.
+  * @rspiocbq: Pointer to response iocb.
+@@ -4893,7 +4900,7 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba 
+ }
+ /**
+- * lpfc_sli_issue_iocb_wait: Synchronous function to issue iocb commands.
++ * lpfc_sli_issue_iocb_wait - Synchronous function to issue iocb commands
+  * @phba: Pointer to HBA context object..
+  * @pring: Pointer to sli ring.
+  * @piocb: Pointer to command iocb.
+@@ -5000,7 +5007,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_issue_mbox_wait: Synchronous function to issue mailbox.
++ * lpfc_sli_issue_mbox_wait - Synchronous function to issue mailbox
+  * @phba: Pointer to HBA context object.
+  * @pmboxq: Pointer to driver mailbox object.
+  * @timeout: Timeout in number of seconds.
+@@ -5070,7 +5077,7 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba
+ }
+ /**
+- * lpfc_sli_flush_mbox_queue: mailbox queue cleanup function.
++ * lpfc_sli_flush_mbox_queue - mailbox queue cleanup function
+  * @phba: Pointer to HBA context.
+  *
+  * This function is called to cleanup any pending mailbox
+@@ -5113,7 +5120,7 @@ lpfc_sli_flush_mbox_queue(struct lpfc_hb
+ }
+ /**
+- * lpfc_sli_check_eratt: check error attention events
++ * lpfc_sli_check_eratt - check error attention events
+  * @phba: Pointer to HBA context.
+  *
+  * This function is called form timer soft interrupt context to check HBA's
+@@ -5145,11 +5152,31 @@ lpfc_sli_check_eratt(struct lpfc_hba *ph
+               return 0;
+       }
++      /*
++       * If there is deferred error attention, do not check for error
++       * attention
++       */
++      if (unlikely(phba->hba_flag & DEFER_ERATT)) {
++              spin_unlock_irq(&phba->hbalock);
++              return 0;
++      }
++
+       /* Read chip Host Attention (HA) register */
+       ha_copy = readl(phba->HAregaddr);
+       if (ha_copy & HA_ERATT) {
+               /* Read host status register to retrieve error event */
+               lpfc_sli_read_hs(phba);
++
++              /* Check if there is a deferred error condition is active */
++              if ((HS_FFER1 & phba->work_hs) &&
++                      ((HS_FFER2 | HS_FFER3 | HS_FFER4 | HS_FFER5 |
++                      HS_FFER6 | HS_FFER7) & phba->work_hs)) {
++                      phba->hba_flag |= DEFER_ERATT;
++                      /* Clear all interrupt enable conditions */
++                      writel(0, phba->HCregaddr);
++                      readl(phba->HCregaddr);
++              }
++
+               /* Set the driver HA work bitmap */
+               phba->work_ha |= HA_ERATT;
+               /* Indicate polling handles this ERATT */
+@@ -5162,7 +5189,7 @@ lpfc_sli_check_eratt(struct lpfc_hba *ph
+ }
+ /**
+- * lpfc_sp_intr_handler: The slow-path interrupt handler of lpfc driver.
++ * lpfc_sp_intr_handler - The slow-path interrupt handler of lpfc driver
+  * @irq: Interrupt number.
+  * @dev_id: The device context pointer.
+  *
+@@ -5238,6 +5265,16 @@ lpfc_sp_intr_handler(int irq, void *dev_
+                               /* Indicate interrupt handler handles ERATT */
+                               phba->hba_flag |= HBA_ERATT_HANDLED;
+               }
++
++              /*
++               * If there is deferred error attention, do not check for any
++               * interrupt.
++               */
++              if (unlikely(phba->hba_flag & DEFER_ERATT)) {
++                      spin_unlock_irq(&phba->hbalock);
++                      return IRQ_NONE;
++              }
++
+               /* Clear up only attention source related to slow-path */
+               writel((ha_copy & (HA_MBATT | HA_R2_CLR_MSK)),
+                       phba->HAregaddr);
+@@ -5309,8 +5346,22 @@ lpfc_sp_intr_handler(int irq, void *dev_
+                       }
+               }
+               spin_lock_irqsave(&phba->hbalock, iflag);
+-              if (work_ha_copy & HA_ERATT)
++              if (work_ha_copy & HA_ERATT) {
+                       lpfc_sli_read_hs(phba);
++                      /*
++                       * Check if there is a deferred error condition
++                       * is active
++                       */
++                      if ((HS_FFER1 & phba->work_hs) &&
++                              ((HS_FFER2 | HS_FFER3 | HS_FFER4 | HS_FFER5 |
++                              HS_FFER6 | HS_FFER7) & phba->work_hs)) {
++                              phba->hba_flag |= DEFER_ERATT;
++                              /* Clear all interrupt enable conditions */
++                              writel(0, phba->HCregaddr);
++                              readl(phba->HCregaddr);
++                      }
++              }
++
+               if ((work_ha_copy & HA_MBATT) && (phba->sli.mbox_active)) {
+                       pmb = phba->sli.mbox_active;
+                       pmbox = &pmb->mb;
+@@ -5423,7 +5474,7 @@ send_current_mbox:
+ } /* lpfc_sp_intr_handler */
+ /**
+- * lpfc_fp_intr_handler: The fast-path interrupt handler of lpfc driver.
++ * lpfc_fp_intr_handler - The fast-path interrupt handler of lpfc driver
+  * @irq: Interrupt number.
+  * @dev_id: The device context pointer.
+  *
+@@ -5474,6 +5525,14 @@ lpfc_fp_intr_handler(int irq, void *dev_
+               ha_copy = readl(phba->HAregaddr);
+               /* Clear up only attention source related to fast-path */
+               spin_lock_irqsave(&phba->hbalock, iflag);
++              /*
++               * If there is deferred error attention, do not check for
++               * any interrupt.
++               */
++              if (unlikely(phba->hba_flag & DEFER_ERATT)) {
++                      spin_unlock_irq(&phba->hbalock);
++                      return IRQ_NONE;
++              }
+               writel((ha_copy & (HA_R0_CLR_MSK | HA_R1_CLR_MSK)),
+                       phba->HAregaddr);
+               readl(phba->HAregaddr); /* flush */
+@@ -5510,7 +5569,7 @@ lpfc_fp_intr_handler(int irq, void *dev_
+ }  /* lpfc_fp_intr_handler */
+ /**
+- * lpfc_intr_handler: The device-level interrupt handler of lpfc driver.
++ * lpfc_intr_handler - The device-level interrupt handler of lpfc driver
+  * @irq: Interrupt number.
+  * @dev_id: The device context pointer.
+  *
+@@ -5566,6 +5625,14 @@ lpfc_intr_handler(int irq, void *dev_id)
+                       phba->hba_flag |= HBA_ERATT_HANDLED;
+       }
++      /*
++       * If there is deferred error attention, do not check for any interrupt.
++       */
++      if (unlikely(phba->hba_flag & DEFER_ERATT)) {
++              spin_unlock_irq(&phba->hbalock);
++              return IRQ_NONE;
++      }
++
+       /* Clear attention sources except link and error attentions */
+       writel((phba->ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr);
+       readl(phba->HAregaddr); /* flush */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_version.h linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_version.h
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_version.h  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_version.h      2009-05-13 09:46:19.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*******************************************************************
+  * This file is part of the Emulex Linux Device Driver for         *
+  * Fibre Channel Host Bus Adapters.                                *
+- * Copyright (C) 2004-2008 Emulex.  All rights reserved.           *
++ * Copyright (C) 2004-2009 Emulex.  All rights reserved.           *
+  * EMULEX and SLI are trademarks of Emulex.                        *
+  * www.emulex.com                                                  *
+  *                                                                 *
+@@ -18,7 +18,7 @@
+  * included with this package.                                     *
+  *******************************************************************/
+-#define LPFC_DRIVER_VERSION "8.3.0"
++#define LPFC_DRIVER_VERSION "8.3.1"
+ #define LPFC_DRIVER_NAME              "lpfc"
+ #define LPFC_SP_DRIVER_HANDLER_NAME   "lpfc:sp"
+@@ -26,4 +26,4 @@
+ #define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \
+               LPFC_DRIVER_VERSION
+-#define LPFC_COPYRIGHT "Copyright(c) 2004-2008 Emulex.  All rights reserved."
++#define LPFC_COPYRIGHT "Copyright(c) 2004-2009 Emulex.  All rights reserved."
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_vport.c linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_vport.c
+--- linux-2.6.30-rc4/drivers/scsi/lpfc/lpfc_vport.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/lpfc/lpfc_vport.c        2009-05-13 09:46:19.000000000 +0200
+@@ -206,7 +206,7 @@ lpfc_unique_wwpn(struct lpfc_hba *phba, 
+ }
+ /**
+- * lpfc_discovery_wait: Wait for driver discovery to quiesce.
++ * lpfc_discovery_wait - Wait for driver discovery to quiesce
+  * @vport: The virtual port for which this call is being executed.
+  *
+  * This driver calls this routine specifically from lpfc_vport_delete
+@@ -741,7 +741,7 @@ lpfc_destroy_vport_work_array(struct lpf
+ /**
+- * lpfc_vport_reset_stat_data: Reset the statistical data for the vport.
++ * lpfc_vport_reset_stat_data - Reset the statistical data for the vport
+  * @vport: Pointer to vport object.
+  *
+  * This function resets the statistical data for the vport. This function
+@@ -763,8 +763,7 @@ lpfc_vport_reset_stat_data(struct lpfc_v
+ /**
+- * lpfc_alloc_bucket: Allocate data buffer required for collecting
+- *  statistical data.
++ * lpfc_alloc_bucket - Allocate data buffer required for statistical data
+  * @vport: Pointer to vport object.
+  *
+  * This function allocates data buffer required for all the FC
+@@ -797,8 +796,7 @@ lpfc_alloc_bucket(struct lpfc_vport *vpo
+ }
+ /**
+- * lpfc_free_bucket: Free data buffer required for collecting
+- *  statistical data.
++ * lpfc_free_bucket - Free data buffer required for statistical data
+  * @vport: Pointer to vport object.
+  *
+  * Th function frees statistical data buffer of all the FC
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_base.c linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_base.c
+--- linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_base.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_base.c   2009-05-13 09:46:19.000000000 +0200
+@@ -636,6 +636,14 @@ _base_unmask_interrupts(struct MPT2SAS_A
+ static irqreturn_t
+ _base_interrupt(int irq, void *bus_id)
+ {
++      union reply_descriptor {
++              u64 word;
++              struct {
++                      u32 low;
++                      u32 high;
++              } u;
++      };
++      union reply_descriptor rd;
+       u32 post_index, post_index_next, completed_cmds;
+       u8 request_desript_type;
+       u16 smid;
+@@ -656,7 +664,8 @@ _base_interrupt(int irq, void *bus_id)
+       completed_cmds = 0;
+       do {
+-              if (ioc->reply_post_free[post_index].Words == ~0ULL)
++              rd.word = ioc->reply_post_free[post_index].Words;
++              if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX)
+                       goto out;
+               reply = 0;
+               cb_idx = 0xFF;
+@@ -721,7 +730,7 @@ _base_interrupt(int irq, void *bus_id)
+       for (i = 0 ; i < completed_cmds; i++) {
+               post_index = post_index_next;
+               /* poison the reply post descriptor */
+-              ioc->reply_post_free[post_index_next].Words = ~0ULL;
++              ioc->reply_post_free[post_index_next].Words = ULLONG_MAX;
+               post_index_next = (post_index ==
+                   (ioc->reply_post_queue_depth - 1))
+                   ? 0 : post_index + 1;
+@@ -1387,6 +1396,64 @@ mpt2sas_base_put_smid_target_assist(stru
+ }
+ /**
++ * _base_display_dell_branding - Disply branding string
++ * @ioc: per adapter object
++ *
++ * Return nothing.
++ */
++static void
++_base_display_dell_branding(struct MPT2SAS_ADAPTER *ioc)
++{
++      char dell_branding[MPT2SAS_DELL_BRANDING_SIZE];
++
++      if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_DELL)
++              return;
++
++      memset(dell_branding, 0, MPT2SAS_DELL_BRANDING_SIZE);
++      switch (ioc->pdev->subsystem_device) {
++      case MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID:
++              strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID:
++              strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID:
++              strncpy(dell_branding,
++                  MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_PERC_H200_MODULAR_SSDID:
++              strncpy(dell_branding,
++                  MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID:
++              strncpy(dell_branding,
++                  MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_PERC_H200_SSDID:
++              strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      case MPT2SAS_DELL_6GBPS_SAS_SSDID:
++              strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_BRANDING,
++                  MPT2SAS_DELL_BRANDING_SIZE - 1);
++              break;
++      default:
++              sprintf(dell_branding, "0x%4X", ioc->pdev->subsystem_device);
++              break;
++      }
++
++      printk(MPT2SAS_INFO_FMT "%s: Vendor(0x%04X), Device(0x%04X),"
++          " SSVID(0x%04X), SSDID(0x%04X)\n", ioc->name, dell_branding,
++          ioc->pdev->vendor, ioc->pdev->device, ioc->pdev->subsystem_vendor,
++          ioc->pdev->subsystem_device);
++}
++
++/**
+  * _base_display_ioc_capabilities - Disply IOC's capabilities.
+  * @ioc: per adapter object
+  *
+@@ -1427,6 +1494,8 @@ _base_display_ioc_capabilities(struct MP
+               i++;
+       }
++      _base_display_dell_branding(ioc);
++
+       i = 0;
+       printk("), ");
+       printk("Capabilities=(");
+@@ -3068,7 +3137,7 @@ _base_make_ioc_operational(struct MPT2SA
+       /* initialize Reply Post Free Queue */
+       for (i = 0; i < ioc->reply_post_queue_depth; i++)
+-              ioc->reply_post_free[i].Words = ~0ULL;
++              ioc->reply_post_free[i].Words = ULLONG_MAX;
+       r = _base_send_ioc_init(ioc, VF_ID, sleep_flag);
+       if (r)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_base.h linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_base.h
+--- linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_base.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_base.h   2009-05-13 09:46:19.000000000 +0200
+@@ -68,11 +68,11 @@
+ #define MPT2SAS_DRIVER_NAME           "mpt2sas"
+ #define MPT2SAS_AUTHOR        "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
+ #define MPT2SAS_DESCRIPTION   "LSI MPT Fusion SAS 2.0 Device Driver"
+-#define MPT2SAS_DRIVER_VERSION                "00.100.11.16"
++#define MPT2SAS_DRIVER_VERSION                "01.100.02.00"
+ #define MPT2SAS_MAJOR_VERSION         00
+ #define MPT2SAS_MINOR_VERSION         100
+-#define MPT2SAS_BUILD_VERSION         11
+-#define MPT2SAS_RELEASE_VERSION               16
++#define MPT2SAS_BUILD_VERSION         02
++#define MPT2SAS_RELEASE_VERSION               00
+ /*
+  * Set MPT2SAS_SG_DEPTH value based on user input.
+@@ -130,6 +130,30 @@
+ #define MPT2SAS_ERR_FMT                       KERN_ERR MPT2SAS_FMT
+ /*
++ * Dell HBA branding
++ */
++#define MPT2SAS_DELL_BRANDING_SIZE                 32
++
++#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING        "Dell 6Gbps SAS HBA"
++#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING    "Dell PERC H200 Adapter"
++#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated"
++#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING    "Dell PERC H200 Modular"
++#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING   "Dell PERC H200 Embedded"
++#define MPT2SAS_DELL_PERC_H200_BRANDING            "Dell PERC H200"
++#define MPT2SAS_DELL_6GBPS_SAS_BRANDING            "Dell 6Gbps SAS"
++
++/*
++ * Dell HBA SSDIDs
++ */
++#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID           0x1F1C
++#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID       0x1F1D
++#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID    0x1F1E
++#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID       0x1F1F
++#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID      0x1F20
++#define MPT2SAS_DELL_PERC_H200_SSDID               0x1F21
++#define MPT2SAS_DELL_6GBPS_SAS_SSDID               0x1F22
++
++/*
+  * per target private data
+  */
+ #define MPT_TARGET_FLAGS_RAID_COMPONENT       0x01
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_ctl.c linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_ctl.c
+--- linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_ctl.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_ctl.c    2009-05-13 09:46:19.000000000 +0200
+@@ -64,6 +64,9 @@
+ static struct fasync_struct *async_queue;
+ static DECLARE_WAIT_QUEUE_HEAD(ctl_poll_wait);
++static int _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type,
++    u8 *issue_reset);
++
+ /**
+  * enum block_state - blocking state
+  * @NON_BLOCKING: non blocking
+@@ -378,10 +381,22 @@ _ctl_verify_adapter(int ioc_number, stru
+ void
+ mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
+ {
++      int i;
++      u8 issue_reset;
++
+       switch (reset_phase) {
+       case MPT2_IOC_PRE_RESET:
+               dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+                   "MPT2_IOC_PRE_RESET\n", ioc->name, __func__));
++              for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
++                      if (!(ioc->diag_buffer_status[i] &
++                          MPT2_DIAG_BUFFER_IS_REGISTERED))
++                              continue;
++                      if ((ioc->diag_buffer_status[i] &
++                          MPT2_DIAG_BUFFER_IS_RELEASED))
++                              continue;
++                      _ctl_send_release(ioc, i, &issue_reset);
++              }
+               break;
+       case MPT2_IOC_AFTER_RESET:
+               dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+@@ -395,6 +410,17 @@ mpt2sas_ctl_reset_handler(struct MPT2SAS
+       case MPT2_IOC_DONE_RESET:
+               dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
+                   "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
++
++              for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
++                      if (!(ioc->diag_buffer_status[i] &
++                          MPT2_DIAG_BUFFER_IS_REGISTERED))
++                              continue;
++                      if ((ioc->diag_buffer_status[i] &
++                          MPT2_DIAG_BUFFER_IS_RELEASED))
++                              continue;
++                      ioc->diag_buffer_status[i] |=
++                          MPT2_DIAG_BUFFER_IS_DIAG_RESET;
++              }
+               break;
+       }
+ }
+@@ -714,8 +740,10 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPT
+               if (tm_request->TaskType ==
+                   MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
+-                      if (_ctl_do_task_abort(ioc, &karg, tm_request))
++                      if (_ctl_do_task_abort(ioc, &karg, tm_request)) {
++                              mpt2sas_base_free_smid(ioc, smid);
+                               goto out;
++                      }
+               }
+               mutex_lock(&ioc->tm_cmds.mutex);
+@@ -915,9 +943,9 @@ _ctl_getiocinfo(void __user *arg)
+       karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn);
+       karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus);
+       karg.firmware_version = ioc->facts.FWVersion.Word;
+-      strncpy(karg.driver_version, MPT2SAS_DRIVER_VERSION,
+-          MPT2_IOCTL_VERSION_LENGTH);
+-      karg.driver_version[MPT2_IOCTL_VERSION_LENGTH - 1] = '\0';
++      strcpy(karg.driver_version, MPT2SAS_DRIVER_NAME);
++      strcat(karg.driver_version, "-");
++      strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION);
+       karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion);
+       if (copy_to_user(arg, &karg, sizeof(karg))) {
+@@ -1551,81 +1579,38 @@ _ctl_diag_query(void __user *arg)
+ }
+ /**
+- * _ctl_diag_release - request to send Diag Release Message to firmware
+- * @arg - user space buffer containing ioctl content
+- * @state - NON_BLOCKING or BLOCKING
++ * _ctl_send_release - Diag Release Message
++ * @ioc: per adapter object
++ * @buffer_type - specifies either TRACE or SNAPSHOT
++ * @issue_reset - specifies whether host reset is required.
+  *
+- * This allows ownership of the specified buffer to returned to the driver,
+- * allowing an application to read the buffer without fear that firmware is
+- * overwritting information in the buffer.
+  */
+-static long
+-_ctl_diag_release(void __user *arg, enum block_state state)
++static int
++_ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, u8 *issue_reset)
+ {
+-      struct mpt2_diag_release karg;
+-      struct MPT2SAS_ADAPTER *ioc;
+-      void *request_data;
+-      int rc;
+       Mpi2DiagReleaseRequest_t *mpi_request;
+       Mpi2DiagReleaseReply_t *mpi_reply;
+-      u8 buffer_type;
+-      unsigned long timeleft;
+       u16 smid;
+       u16 ioc_status;
+-      u8 issue_reset = 0;
+-
+-      if (copy_from_user(&karg, arg, sizeof(karg))) {
+-              printk(KERN_ERR "failure at %s:%d/%s()!\n",
+-                  __FILE__, __LINE__, __func__);
+-              return -EFAULT;
+-      }
+-      if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc)
+-              return -ENODEV;
++      u32 ioc_state;
++      int rc;
++      unsigned long timeleft;
+       dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
+           __func__));
+-      buffer_type = karg.unique_id & 0x000000ff;
+-      if (!_ctl_diag_capability(ioc, buffer_type)) {
+-              printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
+-                  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
+-              return -EPERM;
+-      }
+-
+-      if ((ioc->diag_buffer_status[buffer_type] &
+-          MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
+-              printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not "
+-                  "registered\n", ioc->name, __func__, buffer_type);
+-              return -EINVAL;
+-      }
+-
+-      if (karg.unique_id != ioc->unique_id[buffer_type]) {
+-              printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
+-                  "registered\n", ioc->name, __func__, karg.unique_id);
+-              return -EINVAL;
+-      }
+-
+-      if (ioc->diag_buffer_status[buffer_type] &
+-          MPT2_DIAG_BUFFER_IS_RELEASED) {
+-              printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
+-                  "is already released\n", ioc->name, __func__,
+-                  buffer_type);
+-              return 0;
+-      }
+-
+-      request_data = ioc->diag_buffer[buffer_type];
++      rc = 0;
++      *issue_reset = 0;
+-      if (!request_data) {
+-              printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for "
+-                  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
+-              return -ENOMEM;
++      ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
++      if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
++              dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
++                  "skipping due to FAULT state\n", ioc->name,
++                  __func__));
++              rc = -EAGAIN;
++              goto out;
+       }
+-      if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex))
+-              return -EAGAIN;
+-      else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex))
+-              return -ERESTARTSYS;
+-
+       if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
+               printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
+                   ioc->name, __func__);
+@@ -1641,7 +1626,6 @@ _ctl_diag_release(void __user *arg, enum
+               goto out;
+       }
+-      rc = 0;
+       ioc->ctl_cmds.status = MPT2_CMD_PENDING;
+       memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
+       mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
+@@ -1660,8 +1644,9 @@ _ctl_diag_release(void __user *arg, enum
+               _debug_dump_mf(mpi_request,
+                   sizeof(Mpi2DiagReleaseRequest_t)/4);
+               if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
+-                      issue_reset = 1;
+-              goto issue_host_reset;
++                      *issue_reset = 1;
++              rc = -EFAULT;
++              goto out;
+       }
+       /* process the completed Reply Message Frame */
+@@ -1687,14 +1672,101 @@ _ctl_diag_release(void __user *arg, enum
+               rc = -EFAULT;
+       }
+- issue_host_reset:
++ out:
++      ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
++      return rc;
++}
++
++/**
++ * _ctl_diag_release - request to send Diag Release Message to firmware
++ * @arg - user space buffer containing ioctl content
++ * @state - NON_BLOCKING or BLOCKING
++ *
++ * This allows ownership of the specified buffer to returned to the driver,
++ * allowing an application to read the buffer without fear that firmware is
++ * overwritting information in the buffer.
++ */
++static long
++_ctl_diag_release(void __user *arg, enum block_state state)
++{
++      struct mpt2_diag_release karg;
++      struct MPT2SAS_ADAPTER *ioc;
++      void *request_data;
++      int rc;
++      u8 buffer_type;
++      u8 issue_reset = 0;
++
++      if (copy_from_user(&karg, arg, sizeof(karg))) {
++              printk(KERN_ERR "failure at %s:%d/%s()!\n",
++                  __FILE__, __LINE__, __func__);
++              return -EFAULT;
++      }
++      if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc)
++              return -ENODEV;
++
++      dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
++          __func__));
++
++      buffer_type = karg.unique_id & 0x000000ff;
++      if (!_ctl_diag_capability(ioc, buffer_type)) {
++              printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
++                  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
++              return -EPERM;
++      }
++
++      if ((ioc->diag_buffer_status[buffer_type] &
++          MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
++              printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not "
++                  "registered\n", ioc->name, __func__, buffer_type);
++              return -EINVAL;
++      }
++
++      if (karg.unique_id != ioc->unique_id[buffer_type]) {
++              printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
++                  "registered\n", ioc->name, __func__, karg.unique_id);
++              return -EINVAL;
++      }
++
++      if (ioc->diag_buffer_status[buffer_type] &
++          MPT2_DIAG_BUFFER_IS_RELEASED) {
++              printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
++                  "is already released\n", ioc->name, __func__,
++                  buffer_type);
++              return 0;
++      }
++
++      request_data = ioc->diag_buffer[buffer_type];
++
++      if (!request_data) {
++              printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for "
++                  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
++              return -ENOMEM;
++      }
++
++      /* buffers were released by due to host reset */
++      if ((ioc->diag_buffer_status[buffer_type] &
++          MPT2_DIAG_BUFFER_IS_DIAG_RESET)) {
++              ioc->diag_buffer_status[buffer_type] |=
++                  MPT2_DIAG_BUFFER_IS_RELEASED;
++              ioc->diag_buffer_status[buffer_type] &=
++                  ~MPT2_DIAG_BUFFER_IS_DIAG_RESET;
++              printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
++                  "was released due to host reset\n", ioc->name, __func__,
++                  buffer_type);
++              return 0;
++      }
++
++      if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex))
++              return -EAGAIN;
++      else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex))
++              return -ERESTARTSYS;
++
++      rc = _ctl_send_release(ioc, buffer_type, &issue_reset);
++
+       if (issue_reset)
+               mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
+                   FORCE_BIG_HAMMER);
+- out:
+-
+-      ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
+       mutex_unlock(&ioc->ctl_cmds.mutex);
+       return rc;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_ctl.h linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_ctl.h
+--- linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_ctl.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_ctl.h    2009-05-13 09:46:19.000000000 +0200
+@@ -50,7 +50,7 @@
+ #endif
+ #define MPT2SAS_DEV_NAME      "mpt2ctl"
+-#define MPT2_MAGIC_NUMBER     'm'
++#define MPT2_MAGIC_NUMBER     'L'
+ #define MPT2_IOCTL_DEFAULT_TIMEOUT (10) /* in seconds */
+ /**
+@@ -295,8 +295,9 @@ struct mpt2_ioctl_btdh_mapping {
+ /* status bits for ioc->diag_buffer_status */
+-#define MPT2_DIAG_BUFFER_IS_REGISTERED        (0x01)
+-#define MPT2_DIAG_BUFFER_IS_RELEASED  (0x02)
++#define MPT2_DIAG_BUFFER_IS_REGISTERED        (0x01)
++#define MPT2_DIAG_BUFFER_IS_RELEASED  (0x02)
++#define MPT2_DIAG_BUFFER_IS_DIAG_RESET        (0x04)
+ /* application flags for mpt2_diag_register, mpt2_diag_query */
+ #define MPT2_APP_FLAGS_APP_OWNED      (0x0001)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_scsih.c linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+--- linux-2.6.30-rc4/drivers/scsi/mpt2sas/mpt2sas_scsih.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/mpt2sas/mpt2sas_scsih.c  2009-05-13 09:46:19.000000000 +0200
+@@ -119,7 +119,7 @@ struct sense_info {
+  */
+ struct fw_event_work {
+       struct list_head        list;
+-      struct delayed_work     work;
++      struct work_struct      work;
+       struct MPT2SAS_ADAPTER *ioc;
+       u8                      VF_ID;
+       u8                      host_reset_handling;
+@@ -516,12 +516,8 @@ _scsih_sas_device_add(struct MPT2SAS_ADA
+       handle = sas_device->handle;
+       parent_handle = sas_device->parent_handle;
+       sas_address = sas_device->sas_address;
+-      if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) {
++      if (!mpt2sas_transport_port_add(ioc, handle, parent_handle))
+               _scsih_sas_device_remove(ioc, sas_device);
+-      } else if (!sas_device->starget) {
+-              mpt2sas_transport_port_remove(ioc, sas_address, parent_handle);
+-              _scsih_sas_device_remove(ioc, sas_device);
+-      }
+ }
+ /**
+@@ -1203,7 +1199,9 @@ scsih_target_destroy(struct scsi_target 
+       rphy = dev_to_rphy(starget->dev.parent);
+       sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
+          rphy->identify.sas_address);
+-      if (sas_device)
++      if (sas_device && (sas_device->starget == starget) &&
++          (sas_device->id == starget->id) &&
++          (sas_device->channel == starget->channel))
+               sas_device->starget = NULL;
+       spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
+@@ -2009,8 +2007,8 @@ _scsih_fw_event_add(struct MPT2SAS_ADAPT
+       spin_lock_irqsave(&ioc->fw_event_lock, flags);
+       list_add_tail(&fw_event->list, &ioc->fw_event_list);
+-      INIT_DELAYED_WORK(&fw_event->work, _firmware_event_work);
+-      queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, 1);
++      INIT_WORK(&fw_event->work, _firmware_event_work);
++      queue_work(ioc->firmware_event_thread, &fw_event->work);
+       spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
+ }
+@@ -2054,7 +2052,7 @@ _scsih_fw_event_requeue(struct MPT2SAS_A
+               return;
+       spin_lock_irqsave(&ioc->fw_event_lock, flags);
+-      queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, delay);
++      queue_work(ioc->firmware_event_thread, &fw_event->work);
+       spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
+ }
+@@ -2863,8 +2861,9 @@ scsih_io_done(struct MPT2SAS_ADAPTER *io
+               struct sense_info data;
+               const void *sense_data = mpt2sas_base_get_sense_buffer(ioc,
+                   smid);
+-              memcpy(scmd->sense_buffer, sense_data,
++              u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE,
+                   le32_to_cpu(mpi_reply->SenseCount));
++              memcpy(scmd->sense_buffer, sense_data, sz);
+               _scsih_normalize_sense(scmd->sense_buffer, &data);
+               /* failure prediction threshold exceeded */
+               if (data.asc == 0x5D)
+@@ -3923,7 +3922,7 @@ _scsih_sas_broadcast_primative_event(str
+               mpt2sas_scsih_issue_tm(ioc, handle, lun,
+                   MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30);
+-              termination_count += le32_to_cpu(mpi_reply->TerminationCount);
++              ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
+               if ((mpi_reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) &&
+                   (mpi_reply->ResponseCode ==
+@@ -3933,10 +3932,10 @@ _scsih_sas_broadcast_primative_event(str
+                       continue;
+               mpt2sas_scsih_issue_tm(ioc, handle, lun,
+-                  MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, smid, 30);
++                  MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 30);
++              ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
+               termination_count += le32_to_cpu(mpi_reply->TerminationCount);
+       }
+-      ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
+       ioc->broadcast_aen_busy = 0;
+       mutex_unlock(&ioc->tm_cmds.mutex);
+@@ -4962,7 +4961,7 @@ static void
+ _firmware_event_work(struct work_struct *work)
+ {
+       struct fw_event_work *fw_event = container_of(work,
+-          struct fw_event_work, work.work);
++          struct fw_event_work, work);
+       unsigned long flags;
+       struct MPT2SAS_ADAPTER *ioc = fw_event->ioc;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/osd/osd_initiator.c linux-2.6.30-rc4-git/drivers/scsi/osd/osd_initiator.c
+--- linux-2.6.30-rc4/drivers/scsi/osd/osd_initiator.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/osd/osd_initiator.c      2009-05-13 09:46:19.000000000 +0200
+@@ -205,6 +205,74 @@ static unsigned _osd_req_alist_elem_size
+               osdv2_attr_list_elem_size(len);
+ }
++static void _osd_req_alist_elem_encode(struct osd_request *or,
++      void *attr_last, const struct osd_attr *oa)
++{
++      if (osd_req_is_ver1(or)) {
++              struct osdv1_attributes_list_element *attr = attr_last;
++
++              attr->attr_page = cpu_to_be32(oa->attr_page);
++              attr->attr_id = cpu_to_be32(oa->attr_id);
++              attr->attr_bytes = cpu_to_be16(oa->len);
++              memcpy(attr->attr_val, oa->val_ptr, oa->len);
++      } else {
++              struct osdv2_attributes_list_element *attr = attr_last;
++
++              attr->attr_page = cpu_to_be32(oa->attr_page);
++              attr->attr_id = cpu_to_be32(oa->attr_id);
++              attr->attr_bytes = cpu_to_be16(oa->len);
++              memcpy(attr->attr_val, oa->val_ptr, oa->len);
++      }
++}
++
++static int _osd_req_alist_elem_decode(struct osd_request *or,
++      void *cur_p, struct osd_attr *oa, unsigned max_bytes)
++{
++      unsigned inc;
++      if (osd_req_is_ver1(or)) {
++              struct osdv1_attributes_list_element *attr = cur_p;
++
++              if (max_bytes < sizeof(*attr))
++                      return -1;
++
++              oa->len = be16_to_cpu(attr->attr_bytes);
++              inc = _osd_req_alist_elem_size(or, oa->len);
++              if (inc > max_bytes)
++                      return -1;
++
++              oa->attr_page = be32_to_cpu(attr->attr_page);
++              oa->attr_id = be32_to_cpu(attr->attr_id);
++
++              /* OSD1: On empty attributes we return a pointer to 2 bytes
++               * of zeros. This keeps similar behaviour with OSD2.
++               * (See below)
++               */
++              oa->val_ptr = likely(oa->len) ? attr->attr_val :
++                                              (u8 *)&attr->attr_bytes;
++      } else {
++              struct osdv2_attributes_list_element *attr = cur_p;
++
++              if (max_bytes < sizeof(*attr))
++                      return -1;
++
++              oa->len = be16_to_cpu(attr->attr_bytes);
++              inc = _osd_req_alist_elem_size(or, oa->len);
++              if (inc > max_bytes)
++                      return -1;
++
++              oa->attr_page = be32_to_cpu(attr->attr_page);
++              oa->attr_id = be32_to_cpu(attr->attr_id);
++
++              /* OSD2: For convenience, on empty attributes, we return 8 bytes
++               * of zeros here. This keeps the same behaviour with OSD2r04,
++               * and is nice with null terminating ASCII fields.
++               * oa->val_ptr == NULL marks the end-of-list, or error.
++               */
++              oa->val_ptr = likely(oa->len) ? attr->attr_val : attr->reserved;
++      }
++      return inc;
++}
++
+ static unsigned _osd_req_alist_size(struct osd_request *or, void *list_head)
+ {
+       return osd_req_is_ver1(or) ?
+@@ -282,9 +350,9 @@ _osd_req_sec_params(struct osd_request *
+       struct osd_cdb *ocdb = &or->cdb;
+       if (osd_req_is_ver1(or))
+-              return &ocdb->v1.sec_params;
++              return (struct osd_security_parameters *)&ocdb->v1.sec_params;
+       else
+-              return &ocdb->v2.sec_params;
++              return (struct osd_security_parameters *)&ocdb->v2.sec_params;
+ }
+ void osd_dev_init(struct osd_dev *osdd, struct scsi_device *scsi_device)
+@@ -612,9 +680,9 @@ static int _osd_req_list_objects(struct 
+       WARN_ON(or->in.bio);
+       bio = bio_map_kern(q, list, len, or->alloc_flags);
+-      if (!bio) {
++      if (IS_ERR(bio)) {
+               OSD_ERR("!!! Failed to allocate list_objects BIO\n");
+-              return -ENOMEM;
++              return PTR_ERR(bio);
+       }
+       bio->bi_rw &= ~(1 << BIO_RW);
+@@ -798,7 +866,6 @@ int osd_req_add_set_attr_list(struct osd
+       attr_last = or->set_attr.buff + total_bytes;
+       for (; nelem; --nelem) {
+-              struct osd_attributes_list_element *attr;
+               unsigned elem_size = _osd_req_alist_elem_size(or, oa->len);
+               total_bytes += elem_size;
+@@ -811,11 +878,7 @@ int osd_req_add_set_attr_list(struct osd
+                               or->set_attr.buff + or->set_attr.total_bytes;
+               }
+-              attr = attr_last;
+-              attr->attr_page = cpu_to_be32(oa->attr_page);
+-              attr->attr_id = cpu_to_be32(oa->attr_id);
+-              attr->attr_bytes = cpu_to_be16(oa->len);
+-              memcpy(attr->attr_val, oa->val_ptr, oa->len);
++              _osd_req_alist_elem_encode(or, attr_last, oa);
+               attr_last += elem_size;
+               ++oa;
+@@ -1070,15 +1133,10 @@ int osd_req_decode_get_attr_list(struct 
+       }
+       for (n = 0; (n < *nelem) && (cur_bytes < returned_bytes); ++n) {
+-              struct osd_attributes_list_element *attr = cur_p;
+-              unsigned inc;
++              int inc = _osd_req_alist_elem_decode(or, cur_p, oa,
++                                               returned_bytes - cur_bytes);
+-              oa->len = be16_to_cpu(attr->attr_bytes);
+-              inc = _osd_req_alist_elem_size(or, oa->len);
+-              OSD_DEBUG("oa->len=%d inc=%d cur_bytes=%d\n",
+-                        oa->len, inc, cur_bytes);
+-              cur_bytes += inc;
+-              if (cur_bytes > returned_bytes) {
++              if (inc < 0) {
+                       OSD_ERR("BAD FOOD from target. list not valid!"
+                               "c=%d r=%d n=%d\n",
+                               cur_bytes, returned_bytes, n);
+@@ -1086,10 +1144,7 @@ int osd_req_decode_get_attr_list(struct 
+                       break;
+               }
+-              oa->attr_page = be32_to_cpu(attr->attr_page);
+-              oa->attr_id = be32_to_cpu(attr->attr_id);
+-              oa->val_ptr = attr->attr_val;
+-
++              cur_bytes += inc;
+               cur_p += inc;
+               ++oa;
+       }
+@@ -1159,6 +1214,24 @@ static int _osd_req_finalize_attr_page(s
+       return ret;
+ }
++static inline void osd_sec_parms_set_out_offset(bool is_v1,
++      struct osd_security_parameters *sec_parms, osd_cdb_offset offset)
++{
++      if (is_v1)
++              sec_parms->v1.data_out_integrity_check_offset = offset;
++      else
++              sec_parms->v2.data_out_integrity_check_offset = offset;
++}
++
++static inline void osd_sec_parms_set_in_offset(bool is_v1,
++      struct osd_security_parameters *sec_parms, osd_cdb_offset offset)
++{
++      if (is_v1)
++              sec_parms->v1.data_in_integrity_check_offset = offset;
++      else
++              sec_parms->v2.data_in_integrity_check_offset = offset;
++}
++
+ static int _osd_req_finalize_data_integrity(struct osd_request *or,
+       bool has_in, bool has_out, const u8 *cap_key)
+ {
+@@ -1182,8 +1255,8 @@ static int _osd_req_finalize_data_integr
+               or->out_data_integ.get_attributes_bytes = cpu_to_be64(
+                       or->enc_get_attr.total_bytes);
+-              sec_parms->data_out_integrity_check_offset =
+-                      osd_req_encode_offset(or, or->out.total_bytes, &pad);
++              osd_sec_parms_set_out_offset(osd_req_is_ver1(or), sec_parms,
++                      osd_req_encode_offset(or, or->out.total_bytes, &pad));
+               ret = _req_append_segment(or, pad, &seg, or->out.last_seg,
+                                         &or->out);
+@@ -1203,8 +1276,8 @@ static int _osd_req_finalize_data_integr
+               };
+               unsigned pad;
+-              sec_parms->data_in_integrity_check_offset =
+-                      osd_req_encode_offset(or, or->in.total_bytes, &pad);
++              osd_sec_parms_set_in_offset(osd_req_is_ver1(or), sec_parms,
++                      osd_req_encode_offset(or, or->in.total_bytes, &pad));
+               ret = _req_append_segment(or, pad, &seg, or->in.last_seg,
+                                         &or->in);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/scsi_lib.c linux-2.6.30-rc4-git/drivers/scsi/scsi_lib.c
+--- linux-2.6.30-rc4/drivers/scsi/scsi_lib.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/scsi_lib.c       2009-05-13 09:46:19.000000000 +0200
+@@ -1291,10 +1291,8 @@ static inline int scsi_target_queue_read
+               if (--starget->target_blocked == 0) {
+                       SCSI_LOG_MLQUEUE(3, starget_printk(KERN_INFO, starget,
+                                        "unblocking target at zero depth\n"));
+-              } else {
+-                      blk_plug_device(sdev->request_queue);
++              } else
+                       return 0;
+-              }
+       }
+       if (scsi_target_is_busy(starget)) {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/sd.c linux-2.6.30-rc4-git/drivers/scsi/sd.c
+--- linux-2.6.30-rc4/drivers/scsi/sd.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/sd.c     2009-05-13 09:46:19.000000000 +0200
+@@ -50,6 +50,7 @@
+ #include <linux/string_helpers.h>
+ #include <linux/async.h>
+ #include <asm/uaccess.h>
++#include <asm/unaligned.h>
+ #include <scsi/scsi.h>
+ #include <scsi/scsi_cmnd.h>
+@@ -1344,12 +1345,8 @@ static int read_capacity_16(struct scsi_
+               return -EINVAL;
+       }
+-      sector_size =   (buffer[8] << 24) | (buffer[9] << 16) |
+-                      (buffer[10] << 8) | buffer[11];
+-      lba =  (((u64)buffer[0] << 56) | ((u64)buffer[1] << 48) |
+-              ((u64)buffer[2] << 40) | ((u64)buffer[3] << 32) |
+-              ((u64)buffer[4] << 24) | ((u64)buffer[5] << 16) |
+-              ((u64)buffer[6] << 8) | (u64)buffer[7]);
++      sector_size = get_unaligned_be32(&buffer[8]);
++      lba = get_unaligned_be64(&buffer[0]);
+       sd_read_protection_type(sdkp, buffer);
+@@ -1400,10 +1397,8 @@ static int read_capacity_10(struct scsi_
+               return -EINVAL;
+       }
+-      sector_size =   (buffer[4] << 24) | (buffer[5] << 16) |
+-                      (buffer[6] << 8) | buffer[7];
+-      lba =   (buffer[0] << 24) | (buffer[1] << 16) |
+-              (buffer[2] << 8) | buffer[3];
++      sector_size = get_unaligned_be32(&buffer[4]);
++      lba = get_unaligned_be32(&buffer[0]);
+       if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
+               sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/sg.c linux-2.6.30-rc4-git/drivers/scsi/sg.c
+--- linux-2.6.30-rc4/drivers/scsi/sg.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/sg.c     2009-05-13 09:46:19.000000000 +0200
+@@ -179,7 +179,7 @@ typedef struct sg_device { /* holds the 
+ /* tasklet or soft irq callback */
+ static void sg_rq_end_io(struct request *rq, int uptodate);
+ static int sg_start_req(Sg_request *srp, unsigned char *cmd);
+-static void sg_finish_rem_req(Sg_request * srp);
++static int sg_finish_rem_req(Sg_request * srp);
+ static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
+ static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count,
+                          Sg_request * srp);
+@@ -518,7 +518,7 @@ sg_new_read(Sg_fd * sfp, char __user *bu
+               goto err_out;
+       }
+ err_out:
+-      sg_finish_rem_req(srp);
++      err = sg_finish_rem_req(srp);
+       return (0 == err) ? count : err;
+ }
+@@ -1696,9 +1696,10 @@ static int sg_start_req(Sg_request *srp,
+       return res;
+ }
+-static void
+-sg_finish_rem_req(Sg_request * srp)
++static int sg_finish_rem_req(Sg_request * srp)
+ {
++      int ret = 0;
++
+       Sg_fd *sfp = srp->parentfp;
+       Sg_scatter_hold *req_schp = &srp->data;
+@@ -1710,12 +1711,14 @@ sg_finish_rem_req(Sg_request * srp)
+       if (srp->rq) {
+               if (srp->bio)
+-                      blk_rq_unmap_user(srp->bio);
++                      ret = blk_rq_unmap_user(srp->bio);
+               blk_put_request(srp->rq);
+       }
+       sg_remove_request(sfp, srp);
++
++      return ret;
+ }
+ static int
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/scsi/sr_ioctl.c linux-2.6.30-rc4-git/drivers/scsi/sr_ioctl.c
+--- linux-2.6.30-rc4/drivers/scsi/sr_ioctl.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/scsi/sr_ioctl.c       2009-05-13 09:46:19.000000000 +0200
+@@ -309,6 +309,11 @@ int sr_drive_status(struct cdrom_device_
+       if (0 == sr_test_unit_ready(cd->device, &sshdr))
+               return CDS_DISC_OK;
++      /* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */
++      if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
++                      && sshdr.asc == 0x04 && sshdr.ascq == 0x01)
++              return CDS_DRIVE_NOT_READY;
++
+       if (!cdrom_get_media_event(cdi, &med)) {
+               if (med.media_present)
+                       return CDS_DISC_OK;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/serial/crisv10.c linux-2.6.30-rc4-git/drivers/serial/crisv10.c
+--- linux-2.6.30-rc4/drivers/serial/crisv10.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/serial/crisv10.c      2009-05-13 09:46:19.000000000 +0200
+@@ -23,16 +23,18 @@ static char *serial_version = "$Revision
+ #include <linux/mm.h>
+ #include <linux/slab.h>
+ #include <linux/init.h>
+-#include <asm/uaccess.h>
+ #include <linux/kernel.h>
+ #include <linux/mutex.h>
+ #include <linux/bitops.h>
++#include <linux/seq_file.h>
++#include <linux/delay.h>
++#include <linux/module.h>
++#include <linux/uaccess.h>
++#include <linux/io.h>
+-#include <asm/io.h>
+ #include <asm/irq.h>
+ #include <asm/dma.h>
+ #include <asm/system.h>
+-#include <linux/delay.h>
+ #include <arch/svinto.h>
+@@ -456,7 +458,6 @@ static struct e100_serial rs_table[] = {
+ #define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial))
+-static struct ktermios *serial_termios[NR_PORTS];
+ #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
+ static struct fast_timer fast_timers[NR_PORTS];
+ #endif
+@@ -4257,151 +4258,132 @@ rs_open(struct tty_struct *tty, struct f
+       return 0;
+ }
++#ifdef CONFIG_PROC_FS
+ /*
+  * /proc fs routines....
+  */
+-static int line_info(char *buf, struct e100_serial *info)
++static void seq_line_info(struct seq_file *m, struct e100_serial *info)
+ {
+-      char    stat_buf[30];
+-      int     ret;
+       unsigned long tmp;
+-      ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d",
+-                    info->line, (unsigned long)info->ioport, info->irq);
++      seq_printf(m, "%d: uart:E100 port:%lX irq:%d",
++                 info->line, (unsigned long)info->ioport, info->irq);
+       if (!info->ioport || (info->type == PORT_UNKNOWN)) {
+-              ret += sprintf(buf+ret, "\n");
+-              return ret;
++              seq_printf(m, "\n");
++              return;
+       }
+-      stat_buf[0] = 0;
+-      stat_buf[1] = 0;
+-      if (!E100_RTS_GET(info))
+-              strcat(stat_buf, "|RTS");
+-      if (!E100_CTS_GET(info))
+-              strcat(stat_buf, "|CTS");
+-      if (!E100_DTR_GET(info))
+-              strcat(stat_buf, "|DTR");
+-      if (!E100_DSR_GET(info))
+-              strcat(stat_buf, "|DSR");
+-      if (!E100_CD_GET(info))
+-              strcat(stat_buf, "|CD");
+-      if (!E100_RI_GET(info))
+-              strcat(stat_buf, "|RI");
+-
+-      ret += sprintf(buf+ret, " baud:%d", info->baud);
+-
+-      ret += sprintf(buf+ret, " tx:%lu rx:%lu",
++      seq_printf(m, " baud:%d", info->baud);
++      seq_printf(m, " tx:%lu rx:%lu",
+                      (unsigned long)info->icount.tx,
+                      (unsigned long)info->icount.rx);
+       tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
+-      if (tmp) {
+-              ret += sprintf(buf+ret, " tx_pend:%lu/%lu",
+-                             (unsigned long)tmp,
+-                             (unsigned long)SERIAL_XMIT_SIZE);
+-      }
+-
+-      ret += sprintf(buf+ret, " rx_pend:%lu/%lu",
+-                     (unsigned long)info->recv_cnt,
+-                     (unsigned long)info->max_recv_cnt);
++      if (tmp)
++              seq_printf(m, " tx_pend:%lu/%lu",
++                         (unsigned long)tmp,
++                         (unsigned long)SERIAL_XMIT_SIZE);
++
++      seq_printf(m, " rx_pend:%lu/%lu",
++                 (unsigned long)info->recv_cnt,
++                 (unsigned long)info->max_recv_cnt);
+ #if 1
+       if (info->port.tty) {
+-
+               if (info->port.tty->stopped)
+-                      ret += sprintf(buf+ret, " stopped:%i",
+-                                     (int)info->port.tty->stopped);
++                      seq_printf(m, " stopped:%i",
++                                 (int)info->port.tty->stopped);
+               if (info->port.tty->hw_stopped)
+-                      ret += sprintf(buf+ret, " hw_stopped:%i",
+-                                     (int)info->port.tty->hw_stopped);
++                      seq_printf(m, " hw_stopped:%i",
++                                 (int)info->port.tty->hw_stopped);
+       }
+       {
+               unsigned char rstat = info->ioport[REG_STATUS];
+-              if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) )
+-                      ret += sprintf(buf+ret, " xoff_detect:1");
++              if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect))
++                      seq_printf(m, " xoff_detect:1");
+       }
+ #endif
+-
+-
+-
+       if (info->icount.frame)
+-              ret += sprintf(buf+ret, " fe:%lu",
+-                             (unsigned long)info->icount.frame);
++              seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame);
+       if (info->icount.parity)
+-              ret += sprintf(buf+ret, " pe:%lu",
+-                             (unsigned long)info->icount.parity);
++              seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity);
+       if (info->icount.brk)
+-              ret += sprintf(buf+ret, " brk:%lu",
+-                             (unsigned long)info->icount.brk);
++              seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk);
+       if (info->icount.overrun)
+-              ret += sprintf(buf+ret, " oe:%lu",
+-                             (unsigned long)info->icount.overrun);
++              seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun);
+       /*
+        * Last thing is the RS-232 status lines
+        */
+-      ret += sprintf(buf+ret, " %s\n", stat_buf+1);
+-      return ret;
++      if (!E100_RTS_GET(info))
++              seq_puts(m, "|RTS");
++      if (!E100_CTS_GET(info))
++              seq_puts(m, "|CTS");
++      if (!E100_DTR_GET(info))
++              seq_puts(m, "|DTR");
++      if (!E100_DSR_GET(info))
++              seq_puts(m, "|DSR");
++      if (!E100_CD_GET(info))
++              seq_puts(m, "|CD");
++      if (!E100_RI_GET(info))
++              seq_puts(m, "|RI");
++      seq_puts(m, "\n");
+ }
+-int rs_read_proc(char *page, char **start, off_t off, int count,
+-               int *eof, void *data)
++
++static int crisv10_proc_show(struct seq_file *m, void *v)
+ {
+-      int i, len = 0, l;
+-      off_t   begin = 0;
++      int i;
++
++      seq_printf(m, "serinfo:1.0 driver:%s\n", serial_version);
+-      len += sprintf(page, "serinfo:1.0 driver:%s\n",
+-                     serial_version);
+-      for (i = 0; i < NR_PORTS && len < 4000; i++) {
++      for (i = 0; i < NR_PORTS; i++) {
+               if (!rs_table[i].enabled)
+                       continue;
+-              l = line_info(page + len, &rs_table[i]);
+-              len += l;
+-              if (len+begin > off+count)
+-                      goto done;
+-              if (len+begin < off) {
+-                      begin += len;
+-                      len = 0;
+-              }
++              seq_line_info(m, &rs_table[i]);
+       }
+ #ifdef DEBUG_LOG_INCLUDED
+       for (i = 0; i < debug_log_pos; i++) {
+-              len += sprintf(page + len, "%-4i %lu.%lu ", i, debug_log[i].time, timer_data_to_ns(debug_log[i].timer_data));
+-              len += sprintf(page + len, debug_log[i].string, debug_log[i].value);
+-              if (len+begin > off+count)
+-                      goto done;
+-              if (len+begin < off) {
+-                      begin += len;
+-                      len = 0;
+-              }
++              seq_printf(m, "%-4i %lu.%lu ",
++                       i, debug_log[i].time,
++                       timer_data_to_ns(debug_log[i].timer_data));
++              seq_printf(m, debug_log[i].string, debug_log[i].value);
+       }
+-      len += sprintf(page + len, "debug_log %i/%i  %li bytes\n",
+-                     i, DEBUG_LOG_SIZE, begin+len);
++      seq_printf(m, "debug_log %i/%i\n", i, DEBUG_LOG_SIZE);
+       debug_log_pos = 0;
+ #endif
++      return 0;
++}
+-      *eof = 1;
+-done:
+-      if (off >= len+begin)
+-              return 0;
+-      *start = page + (off-begin);
+-      return ((count < begin+len-off) ? count : begin+len-off);
++static int crisv10_proc_open(struct inode *inode, struct file *file)
++{
++      return single_open(file, crisv10_proc_show, NULL);
+ }
++static const struct file_operations crisv10_proc_fops = {
++      .owner          = THIS_MODULE,
++      .open           = crisv10_proc_open,
++      .read           = seq_read,
++      .llseek         = seq_lseek,
++      .release        = single_release,
++};
++#endif
++
++
+ /* Finally, routines used to initialize the serial driver. */
+-static void
+-show_serial_version(void)
++static void show_serial_version(void)
+ {
+       printk(KERN_INFO
+-             "ETRAX 100LX serial-driver %s, (c) 2000-2004 Axis Communications AB\r\n",
++             "ETRAX 100LX serial-driver %s, "
++             "(c) 2000-2004 Axis Communications AB\r\n",
+              &serial_version[11]); /* "$Revision: x.yy" */
+ }
+@@ -4425,13 +4407,14 @@ static const struct tty_operations rs_op
+       .break_ctl = rs_break,
+       .send_xchar = rs_send_xchar,
+       .wait_until_sent = rs_wait_until_sent,
+-      .read_proc = rs_read_proc,
+       .tiocmget = rs_tiocmget,
+-      .tiocmset = rs_tiocmset
++      .tiocmset = rs_tiocmset,
++#ifdef CONFIG_PROC_FS
++      .proc_fops = &crisv10_proc_fops,
++#endif
+ };
+-static int __init
+-rs_init(void)
++static int __init rs_init(void)
+ {
+       int i;
+       struct e100_serial *info;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/serial/imx.c linux-2.6.30-rc4-git/drivers/serial/imx.c
+--- linux-2.6.30-rc4/drivers/serial/imx.c      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/serial/imx.c  2009-05-13 09:46:19.000000000 +0200
+@@ -66,7 +66,7 @@
+ #define ONEMS 0xb0 /* One Millisecond register */
+ #define UTS   0xb4 /* UART Test Register */
+ #endif
+-#if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1)
++#ifdef CONFIG_ARCH_MX1
+ #define BIPR1 0xb0 /* Incremental Preset Register 1 */
+ #define BIPR2 0xb4 /* Incremental Preset Register 2 */
+ #define BIPR3 0xb8 /* Incremental Preset Register 3 */
+@@ -96,7 +96,7 @@
+ #define  UCR1_RTSDEN     (1<<5)        /* RTS delta interrupt enable */
+ #define  UCR1_SNDBRK     (1<<4)        /* Send break */
+ #define  UCR1_TDMAEN     (1<<3)        /* Transmitter ready DMA enable */
+-#if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1)
++#ifdef CONFIG_ARCH_MX1
+ #define  UCR1_UARTCLKEN  (1<<2)        /* UART clock enabled */
+ #endif
+ #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2
+@@ -127,7 +127,7 @@
+ #define  UCR3_RXDSEN   (1<<6)  /* Receive status interrupt enable */
+ #define  UCR3_AIRINTEN   (1<<5)  /* Async IR wake interrupt enable */
+ #define  UCR3_AWAKEN   (1<<4)  /* Async wake interrupt enable */
+-#ifdef CONFIG_ARCH_IMX
++#ifdef CONFIG_ARCH_MX1
+ #define  UCR3_REF25    (1<<3)  /* Ref freq 25 MHz, only on mx1 */
+ #define  UCR3_REF30    (1<<2)  /* Ref Freq 30 MHz, only on mx1 */
+ #endif
+@@ -180,13 +180,6 @@
+ #define  UTS_SOFTRST   (1<<0)  /* Software reset */
+ /* We've been assigned a range on the "Low-density serial ports" major */
+-#ifdef CONFIG_ARCH_IMX
+-#define SERIAL_IMX_MAJOR      204
+-#define MINOR_START           41
+-#define DEV_NAME              "ttySMX"
+-#define MAX_INTERNAL_IRQ      IMX_IRQS
+-#endif
+-
+ #ifdef CONFIG_ARCH_MXC
+ #define SERIAL_IMX_MAJOR        207
+ #define MINOR_START           16
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/spi/Kconfig linux-2.6.30-rc4-git/drivers/spi/Kconfig
+--- linux-2.6.30-rc4/drivers/spi/Kconfig       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/spi/Kconfig   2009-05-13 09:46:19.000000000 +0200
+@@ -118,7 +118,7 @@ config SPI_GPIO
+ config SPI_IMX
+       tristate "Freescale iMX SPI controller"
+-      depends on ARCH_IMX && EXPERIMENTAL
++      depends on ARCH_MX1 && EXPERIMENTAL
+       help
+         This enables using the Freescale iMX SPI controller in master
+         mode.
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/video/console/vgacon.c linux-2.6.30-rc4-git/drivers/video/console/vgacon.c
+--- linux-2.6.30-rc4/drivers/video/console/vgacon.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/video/console/vgacon.c        2009-05-13 09:46:19.000000000 +0200
+@@ -1282,7 +1282,7 @@ static int vgacon_font_get(struct vc_dat
+       font->charcount = vga_512_chars ? 512 : 256;
+       if (!font->data)
+               return 0;
+-      return vgacon_do_font_op(&state, font->data, 0, 0);
++      return vgacon_do_font_op(&state, font->data, 0, vga_512_chars);
+ }
+ #else
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/video/Kconfig linux-2.6.30-rc4-git/drivers/video/Kconfig
+--- linux-2.6.30-rc4/drivers/video/Kconfig     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/video/Kconfig 2009-05-13 09:46:19.000000000 +0200
+@@ -397,7 +397,7 @@ config FB_SA1100
+ config FB_IMX
+       tristate "Motorola i.MX LCD support"
+-      depends on FB && (ARCH_IMX || ARCH_MX2)
++      depends on FB && (ARCH_MX1 || ARCH_MX2)
+       select FB_CFB_FILLRECT
+       select FB_CFB_COPYAREA
+       select FB_CFB_IMAGEBLIT
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/drivers/video/mx3fb.c linux-2.6.30-rc4-git/drivers/video/mx3fb.c
+--- linux-2.6.30-rc4/drivers/video/mx3fb.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/drivers/video/mx3fb.c 2009-05-13 09:46:19.000000000 +0200
+@@ -706,7 +706,7 @@ static void mx3fb_dma_done(void *arg)
+       dev_dbg(mx3fb->dev, "irq %d callback\n", ichannel->eof_irq);
+       /* We only need one interrupt, it will be re-enabled as needed */
+-      disable_irq(ichannel->eof_irq);
++      disable_irq_nosync(ichannel->eof_irq);
+       complete(&mx3_fbi->flip_cmpl);
+ }
+@@ -1152,11 +1152,11 @@ static struct fb_ops mx3fb_ops = {
+  */
+ static int mx3fb_suspend(struct platform_device *pdev, pm_message_t state)
+ {
+-      struct mx3fb_data *drv_data = platform_get_drvdata(pdev);
+-      struct mx3fb_info *mx3_fbi = drv_data->fbi->par;
++      struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
++      struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
+       acquire_console_sem();
+-      fb_set_suspend(drv_data->fbi, 1);
++      fb_set_suspend(mx3fb->fbi, 1);
+       release_console_sem();
+       if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
+@@ -1172,16 +1172,16 @@ static int mx3fb_suspend(struct platform
+  */
+ static int mx3fb_resume(struct platform_device *pdev)
+ {
+-      struct mx3fb_data *drv_data = platform_get_drvdata(pdev);
+-      struct mx3fb_info *mx3_fbi = drv_data->fbi->par;
++      struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
++      struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
+       if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
+               sdc_enable_channel(mx3_fbi);
+-              sdc_set_brightness(mx3fb, drv_data->backlight_level);
++              sdc_set_brightness(mx3fb, mx3fb->backlight_level);
+       }
+       acquire_console_sem();
+-      fb_set_suspend(drv_data->fbi, 0);
++      fb_set_suspend(mx3fb->fbi, 0);
+       release_console_sem();
+       return 0;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/autofs4/expire.c linux-2.6.30-rc4-git/fs/autofs4/expire.c
+--- linux-2.6.30-rc4/fs/autofs4/expire.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/autofs4/expire.c   2009-05-13 09:46:19.000000000 +0200
+@@ -70,8 +70,10 @@ static int autofs4_mount_busy(struct vfs
+                * Otherwise it's an offset mount and we need to check
+                * if we can umount its mount, if there is one.
+                */
+-              if (!d_mountpoint(dentry))
++              if (!d_mountpoint(dentry)) {
++                      status = 0;
+                       goto done;
++              }
+       }
+       /* Update the expiry counter if fs is busy */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/binfmt_elf_fdpic.c linux-2.6.30-rc4-git/fs/binfmt_elf_fdpic.c
+--- linux-2.6.30-rc4/fs/binfmt_elf_fdpic.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/binfmt_elf_fdpic.c 2009-05-13 09:46:19.000000000 +0200
+@@ -1388,7 +1388,7 @@ static void fill_prstatus(struct elf_prs
+       prstatus->pr_sigpend = p->pending.signal.sig[0];
+       prstatus->pr_sighold = p->blocked.sig[0];
+       prstatus->pr_pid = task_pid_vnr(p);
+-      prstatus->pr_ppid = task_pid_vnr(p->parent);
++      prstatus->pr_ppid = task_pid_vnr(p->real_parent);
+       prstatus->pr_pgrp = task_pgrp_vnr(p);
+       prstatus->pr_sid = task_session_vnr(p);
+       if (thread_group_leader(p)) {
+@@ -1433,7 +1433,7 @@ static int fill_psinfo(struct elf_prpsin
+       psinfo->pr_psargs[len] = 0;
+       psinfo->pr_pid = task_pid_vnr(p);
+-      psinfo->pr_ppid = task_pid_vnr(p->parent);
++      psinfo->pr_ppid = task_pid_vnr(p->real_parent);
+       psinfo->pr_pgrp = task_pgrp_vnr(p);
+       psinfo->pr_sid = task_session_vnr(p);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/buffer.c linux-2.6.30-rc4-git/fs/buffer.c
+--- linux-2.6.30-rc4/fs/buffer.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/buffer.c   2009-05-13 09:46:19.000000000 +0200
+@@ -2397,7 +2397,8 @@ block_page_mkwrite(struct vm_area_struct
+       if ((page->mapping != inode->i_mapping) ||
+           (page_offset(page) > size)) {
+               /* page got truncated out from underneath us */
+-              goto out_unlock;
++              unlock_page(page);
++              goto out;
+       }
+       /* page is wholly or partially inside EOF */
+@@ -2411,14 +2412,15 @@ block_page_mkwrite(struct vm_area_struct
+               ret = block_commit_write(page, 0, end);
+       if (unlikely(ret)) {
++              unlock_page(page);
+               if (ret == -ENOMEM)
+                       ret = VM_FAULT_OOM;
+               else /* -ENOSPC, -EIO, etc */
+                       ret = VM_FAULT_SIGBUS;
+-      }
++      } else
++              ret = VM_FAULT_LOCKED;
+-out_unlock:
+-      unlock_page(page);
++out:
+       return ret;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/configfs/symlink.c linux-2.6.30-rc4-git/fs/configfs/symlink.c
+--- linux-2.6.30-rc4/fs/configfs/symlink.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/configfs/symlink.c 2009-05-13 09:46:19.000000000 +0200
+@@ -135,7 +135,7 @@ int configfs_symlink(struct inode *dir, 
+       struct path path;
+       struct configfs_dirent *sd;
+       struct config_item *parent_item;
+-      struct config_item *target_item;
++      struct config_item *target_item = NULL;
+       struct config_item_type *type;
+       ret = -EPERM;  /* What lack-of-symlink returns */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/exec.c linux-2.6.30-rc4-git/fs/exec.c
+--- linux-2.6.30-rc4/fs/exec.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/exec.c     2009-05-13 09:46:19.000000000 +0200
+@@ -69,17 +69,18 @@ int suid_dumpable = 0;
+ static LIST_HEAD(formats);
+ static DEFINE_RWLOCK(binfmt_lock);
+-int register_binfmt(struct linux_binfmt * fmt)
++int __register_binfmt(struct linux_binfmt * fmt, int insert)
+ {
+       if (!fmt)
+               return -EINVAL;
+       write_lock(&binfmt_lock);
+-      list_add(&fmt->lh, &formats);
++      insert ? list_add(&fmt->lh, &formats) :
++               list_add_tail(&fmt->lh, &formats);
+       write_unlock(&binfmt_lock);
+       return 0;       
+ }
+-EXPORT_SYMBOL(register_binfmt);
++EXPORT_SYMBOL(__register_binfmt);
+ void unregister_binfmt(struct linux_binfmt * fmt)
+ {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/dcache.c linux-2.6.30-rc4-git/fs/ocfs2/dcache.c
+--- linux-2.6.30-rc4/fs/ocfs2/dcache.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/dcache.c     2009-05-13 09:46:19.000000000 +0200
+@@ -290,6 +290,21 @@ out_attach:
+       else
+               mlog_errno(ret);
++      /*
++       * In case of error, manually free the allocation and do the iput().
++       * We need to do this because error here means no d_instantiate(),
++       * which means iput() will not be called during dput(dentry).
++       */
++      if (ret < 0 && !alias) {
++              ocfs2_lock_res_free(&dl->dl_lockres);
++              BUG_ON(dl->dl_count != 1);
++              spin_lock(&dentry_attach_lock);
++              dentry->d_fsdata = NULL;
++              spin_unlock(&dentry_attach_lock);
++              kfree(dl);
++              iput(inode);
++      }
++
+       dput(alias);
+       return ret;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/dir.c linux-2.6.30-rc4-git/fs/ocfs2/dir.c
+--- linux-2.6.30-rc4/fs/ocfs2/dir.c    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/dir.c        2009-05-13 09:46:19.000000000 +0200
+@@ -2697,7 +2697,7 @@ static int ocfs2_dx_dir_index_block(stru
+                                   u32 *num_dx_entries,
+                                   struct buffer_head *dirent_bh)
+ {
+-      int ret, namelen, i;
++      int ret = 0, namelen, i;
+       char *de_buf, *limit;
+       struct ocfs2_dir_entry *de;
+       struct buffer_head *dx_leaf_bh;
+@@ -2934,7 +2934,7 @@ static int ocfs2_expand_inline_dir(struc
+        */
+       BUG_ON(alloc > 2);
+-      ret = ocfs2_reserve_clusters(osb, alloc, &data_ac);
++      ret = ocfs2_reserve_clusters(osb, alloc + dx_alloc, &data_ac);
+       if (ret) {
+               mlog_errno(ret);
+               goto out;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/export.c linux-2.6.30-rc4-git/fs/ocfs2/export.c
+--- linux-2.6.30-rc4/fs/ocfs2/export.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/export.c     2009-05-13 09:46:19.000000000 +0200
+@@ -100,7 +100,8 @@ static struct dentry *ocfs2_get_dentry(s
+       /* If the inode allocator bit is clear, this inode must be stale */
+       if (!set) {
+-              mlog(0, "inode %llu suballoc bit is clear\n", blkno);
++              mlog(0, "inode %llu suballoc bit is clear\n",
++                   (unsigned long long)blkno);
+               status = -ESTALE;
+               goto unlock_nfs_sync;
+       }
+@@ -114,7 +115,7 @@ check_err:
+       if (status < 0) {
+               if (status == -ESTALE) {
+                       mlog(0, "stale inode ino: %llu generation: %u\n",
+-                           blkno, handle->ih_generation);
++                           (unsigned long long)blkno, handle->ih_generation);
+               }
+               result = ERR_PTR(status);
+               goto bail;
+@@ -129,8 +130,8 @@ check_err:
+ check_gen:
+       if (handle->ih_generation != inode->i_generation) {
+               iput(inode);
+-              mlog(0, "stale inode ino: %llu generation: %u\n", blkno,
+-                   handle->ih_generation);
++              mlog(0, "stale inode ino: %llu generation: %u\n",
++                   (unsigned long long)blkno, handle->ih_generation);
+               result = ERR_PTR(-ESTALE);
+               goto bail;
+       }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/journal.h linux-2.6.30-rc4-git/fs/ocfs2/journal.h
+--- linux-2.6.30-rc4/fs/ocfs2/journal.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/journal.h    2009-05-13 09:46:19.000000000 +0200
+@@ -437,8 +437,9 @@ static inline int ocfs2_unlink_credits(s
+ }
+ /* dinode + orphan dir dinode + inode alloc dinode + orphan dir entry +
+- * inode alloc group descriptor + orphan dir index leaf */
+-#define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3)
++ * inode alloc group descriptor + orphan dir index root +
++ * orphan dir index leaf */
++#define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 4)
+ /* dinode update, old dir dinode update, new dir dinode update, old
+  * dir dir entry, new dir dir entry, dir entry update for renaming
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/namei.c linux-2.6.30-rc4-git/fs/ocfs2/namei.c
+--- linux-2.6.30-rc4/fs/ocfs2/namei.c  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/namei.c      2009-05-13 09:46:19.000000000 +0200
+@@ -1025,10 +1025,8 @@ static int ocfs2_rename(struct inode *ol
+       struct inode *orphan_dir = NULL;
+       struct ocfs2_dinode *newfe = NULL;
+       char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
+-      struct buffer_head *orphan_entry_bh = NULL;
+       struct buffer_head *newfe_bh = NULL;
+       struct buffer_head *old_inode_bh = NULL;
+-      struct buffer_head *insert_entry_bh = NULL;
+       struct ocfs2_super *osb = NULL;
+       u64 newfe_blkno, old_de_ino;
+       handle_t *handle = NULL;
+@@ -1455,8 +1453,6 @@ bail:
+       brelse(old_inode_bh);
+       brelse(old_dir_bh);
+       brelse(new_dir_bh);
+-      brelse(orphan_entry_bh);
+-      brelse(insert_entry_bh);
+       mlog_exit(status);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/ocfs2/suballoc.c linux-2.6.30-rc4-git/fs/ocfs2/suballoc.c
+--- linux-2.6.30-rc4/fs/ocfs2/suballoc.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/ocfs2/suballoc.c   2009-05-13 09:46:19.000000000 +0200
+@@ -2197,26 +2197,29 @@ static int ocfs2_get_suballoc_slot_bit(s
+       struct buffer_head *inode_bh = NULL;
+       struct ocfs2_dinode *inode_fe;
+-      mlog_entry("blkno: %llu\n", blkno);
++      mlog_entry("blkno: %llu\n", (unsigned long long)blkno);
+       /* dirty read disk */
+       status = ocfs2_read_blocks_sync(osb, blkno, 1, &inode_bh);
+       if (status < 0) {
+-              mlog(ML_ERROR, "read block %llu failed %d\n", blkno, status);
++              mlog(ML_ERROR, "read block %llu failed %d\n",
++                   (unsigned long long)blkno, status);
+               goto bail;
+       }
+       inode_fe = (struct ocfs2_dinode *) inode_bh->b_data;
+       if (!OCFS2_IS_VALID_DINODE(inode_fe)) {
+-              mlog(ML_ERROR, "invalid inode %llu requested\n", blkno);
++              mlog(ML_ERROR, "invalid inode %llu requested\n",
++                   (unsigned long long)blkno);
+               status = -EINVAL;
+               goto bail;
+       }
+-      if (le16_to_cpu(inode_fe->i_suballoc_slot) != OCFS2_INVALID_SLOT &&
++      if (le16_to_cpu(inode_fe->i_suballoc_slot) != (u16)OCFS2_INVALID_SLOT &&
+           (u32)le16_to_cpu(inode_fe->i_suballoc_slot) > osb->max_slots - 1) {
+               mlog(ML_ERROR, "inode %llu has invalid suballoc slot %u\n",
+-                   blkno, (u32)le16_to_cpu(inode_fe->i_suballoc_slot));
++                   (unsigned long long)blkno,
++                   (u32)le16_to_cpu(inode_fe->i_suballoc_slot));
+               status = -EINVAL;
+               goto bail;
+       }
+@@ -2251,7 +2254,8 @@ static int ocfs2_test_suballoc_bit(struc
+       u64 bg_blkno;
+       int status;
+-      mlog_entry("blkno: %llu bit: %u\n", blkno, (unsigned int)bit);
++      mlog_entry("blkno: %llu bit: %u\n", (unsigned long long)blkno,
++                 (unsigned int)bit);
+       alloc_fe = (struct ocfs2_dinode *)alloc_bh->b_data;
+       if ((bit + 1) > ocfs2_bits_per_group(&alloc_fe->id2.i_chain)) {
+@@ -2266,7 +2270,8 @@ static int ocfs2_test_suballoc_bit(struc
+       status = ocfs2_read_group_descriptor(suballoc, alloc_fe, bg_blkno,
+                                            &group_bh);
+       if (status < 0) {
+-              mlog(ML_ERROR, "read group %llu failed %d\n", bg_blkno, status);
++              mlog(ML_ERROR, "read group %llu failed %d\n",
++                   (unsigned long long)bg_blkno, status);
+               goto bail;
+       }
+@@ -2300,7 +2305,7 @@ int ocfs2_test_inode_bit(struct ocfs2_su
+       struct inode *inode_alloc_inode;
+       struct buffer_head *alloc_bh = NULL;
+-      mlog_entry("blkno: %llu", blkno);
++      mlog_entry("blkno: %llu", (unsigned long long)blkno);
+       status = ocfs2_get_suballoc_slot_bit(osb, blkno, &suballoc_slot,
+                                            &suballoc_bit);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/proc/meminfo.c linux-2.6.30-rc4-git/fs/proc/meminfo.c
+--- linux-2.6.30-rc4/fs/proc/meminfo.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/proc/meminfo.c     2009-05-13 09:46:19.000000000 +0200
+@@ -35,7 +35,7 @@ static int meminfo_proc_show(struct seq_
+ #define K(x) ((x) << (PAGE_SHIFT - 10))
+       si_meminfo(&i);
+       si_swapinfo(&i);
+-      committed = atomic_long_read(&vm_committed_space);
++      committed = percpu_counter_read_positive(&vm_committed_as);
+       allowed = ((totalram_pages - hugetlb_total_pages())
+               * sysctl_overcommit_ratio / 100) + total_swap_pages;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/proc/task_mmu.c linux-2.6.30-rc4-git/fs/proc/task_mmu.c
+--- linux-2.6.30-rc4/fs/proc/task_mmu.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/proc/task_mmu.c    2009-05-13 09:46:19.000000000 +0200
+@@ -665,6 +665,10 @@ static ssize_t pagemap_read(struct file 
+               goto out_task;
+       ret = 0;
++
++      if (!count)
++              goto out_task;
++
+       mm = get_task_mm(task);
+       if (!mm)
+               goto out_task;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/xfs/xfs_bmap.c linux-2.6.30-rc4-git/fs/xfs/xfs_bmap.c
+--- linux-2.6.30-rc4/fs/xfs/xfs_bmap.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/xfs/xfs_bmap.c     2009-05-13 09:46:19.000000000 +0200
+@@ -5880,7 +5880,7 @@ xfs_getbmap(
+       void                    *arg)           /* formatter arg */
+ {
+       __int64_t               bmvend;         /* last block requested */
+-      int                     error;          /* return value */
++      int                     error = 0;      /* return value */
+       __int64_t               fixlen;         /* length for -1 case */
+       int                     i;              /* extent number */
+       int                     lock;           /* lock state */
+@@ -5890,39 +5890,18 @@ xfs_getbmap(
+       int                     nexleft;        /* # of user extents left */
+       int                     subnex;         /* # of bmapi's can do */
+       int                     nmap;           /* number of map entries */
+-      struct getbmapx         out;            /* output structure */
++      struct getbmapx         *out;           /* output structure */
+       int                     whichfork;      /* data or attr fork */
+       int                     prealloced;     /* this is a file with
+                                                * preallocated data space */
+       int                     iflags;         /* interface flags */
+       int                     bmapi_flags;    /* flags for xfs_bmapi */
++      int                     cur_ext = 0;
+       mp = ip->i_mount;
+       iflags = bmv->bmv_iflags;
+-
+       whichfork = iflags & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK;
+-      /*      If the BMV_IF_NO_DMAPI_READ interface bit specified, do not
+-       *      generate a DMAPI read event.  Otherwise, if the DM_EVENT_READ
+-       *      bit is set for the file, generate a read event in order
+-       *      that the DMAPI application may do its thing before we return
+-       *      the extents.  Usually this means restoring user file data to
+-       *      regions of the file that look like holes.
+-       *
+-       *      The "old behavior" (from XFS_IOC_GETBMAP) is to not specify
+-       *      BMV_IF_NO_DMAPI_READ so that read events are generated.
+-       *      If this were not true, callers of ioctl( XFS_IOC_GETBMAP )
+-       *      could misinterpret holes in a DMAPI file as true holes,
+-       *      when in fact they may represent offline user data.
+-       */
+-      if ((iflags & BMV_IF_NO_DMAPI_READ) == 0 &&
+-          DM_EVENT_ENABLED(ip, DM_EVENT_READ) &&
+-          whichfork == XFS_DATA_FORK) {
+-              error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, 0, 0, 0, NULL);
+-              if (error)
+-                      return XFS_ERROR(error);
+-      }
+-
+       if (whichfork == XFS_ATTR_FORK) {
+               if (XFS_IFORK_Q(ip)) {
+                       if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS &&
+@@ -5936,11 +5915,37 @@ xfs_getbmap(
+                                        ip->i_mount);
+                       return XFS_ERROR(EFSCORRUPTED);
+               }
+-      } else if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS &&
+-                 ip->i_d.di_format != XFS_DINODE_FMT_BTREE &&
+-                 ip->i_d.di_format != XFS_DINODE_FMT_LOCAL)
+-              return XFS_ERROR(EINVAL);
+-      if (whichfork == XFS_DATA_FORK) {
++
++              prealloced = 0;
++              fixlen = 1LL << 32;
++      } else {
++              /*
++               * If the BMV_IF_NO_DMAPI_READ interface bit specified, do
++               * not generate a DMAPI read event.  Otherwise, if the
++               * DM_EVENT_READ bit is set for the file, generate a read
++               * event in order that the DMAPI application may do its thing
++               * before we return the extents.  Usually this means restoring
++               * user file data to regions of the file that look like holes.
++               *
++               * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify
++               * BMV_IF_NO_DMAPI_READ so that read events are generated.
++               * If this were not true, callers of ioctl(XFS_IOC_GETBMAP)
++               * could misinterpret holes in a DMAPI file as true holes,
++               * when in fact they may represent offline user data.
++               */
++              if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) &&
++                  !(iflags & BMV_IF_NO_DMAPI_READ)) {
++                      error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip,
++                                            0, 0, 0, NULL);
++                      if (error)
++                              return XFS_ERROR(error);
++              }
++
++              if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS &&
++                  ip->i_d.di_format != XFS_DINODE_FMT_BTREE &&
++                  ip->i_d.di_format != XFS_DINODE_FMT_LOCAL)
++                      return XFS_ERROR(EINVAL);
++
+               if (xfs_get_extsz_hint(ip) ||
+                   ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC|XFS_DIFLAG_APPEND)){
+                       prealloced = 1;
+@@ -5949,42 +5954,41 @@ xfs_getbmap(
+                       prealloced = 0;
+                       fixlen = ip->i_size;
+               }
+-      } else {
+-              prealloced = 0;
+-              fixlen = 1LL << 32;
+       }
+       if (bmv->bmv_length == -1) {
+               fixlen = XFS_FSB_TO_BB(mp, XFS_B_TO_FSB(mp, fixlen));
+-              bmv->bmv_length = MAX( (__int64_t)(fixlen - bmv->bmv_offset),
+-                                      (__int64_t)0);
+-      } else if (bmv->bmv_length < 0)
+-              return XFS_ERROR(EINVAL);
+-      if (bmv->bmv_length == 0) {
++              bmv->bmv_length =
++                      max_t(__int64_t, fixlen - bmv->bmv_offset, 0);
++      } else if (bmv->bmv_length == 0) {
+               bmv->bmv_entries = 0;
+               return 0;
++      } else if (bmv->bmv_length < 0) {
++              return XFS_ERROR(EINVAL);
+       }
++
+       nex = bmv->bmv_count - 1;
+       if (nex <= 0)
+               return XFS_ERROR(EINVAL);
+       bmvend = bmv->bmv_offset + bmv->bmv_length;
+-      xfs_ilock(ip, XFS_IOLOCK_SHARED);
+-      if (((iflags & BMV_IF_DELALLOC) == 0) &&
+-          (whichfork == XFS_DATA_FORK) &&
+-          (ip->i_delayed_blks || ip->i_size > ip->i_d.di_size)) {
+-              /* xfs_fsize_t last_byte = xfs_file_last_byte(ip); */
+-              error = xfs_flush_pages(ip, (xfs_off_t)0,
+-                                             -1, 0, FI_REMAPF);
+-              if (error) {
+-                      xfs_iunlock(ip, XFS_IOLOCK_SHARED);
+-              return error;
++      if (bmv->bmv_count > ULONG_MAX / sizeof(struct getbmapx))
++              return XFS_ERROR(ENOMEM);
++      out = kmem_zalloc(bmv->bmv_count * sizeof(struct getbmapx), KM_MAYFAIL);
++      if (!out)
++              return XFS_ERROR(ENOMEM);
++
++      xfs_ilock(ip, XFS_IOLOCK_SHARED);
++      if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) {
++              if (ip->i_delayed_blks || ip->i_size > ip->i_d.di_size) {
++                      error = xfs_flush_pages(ip, 0, -1, 0, FI_REMAPF);
++                      if (error)
++                              goto out_unlock_iolock;
+               }
+-      }
+-      ASSERT(whichfork == XFS_ATTR_FORK || (iflags & BMV_IF_DELALLOC) ||
+-             ip->i_delayed_blks == 0);
++              ASSERT(ip->i_delayed_blks == 0);
++      }
+       lock = xfs_ilock_map_shared(ip);
+@@ -5995,23 +5999,25 @@ xfs_getbmap(
+       if (nex > XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1)
+               nex = XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1;
+-      bmapi_flags = xfs_bmapi_aflag(whichfork) |
+-                      ((iflags & BMV_IF_PREALLOC) ? 0 : XFS_BMAPI_IGSTATE);
++      bmapi_flags = xfs_bmapi_aflag(whichfork);
++      if (!(iflags & BMV_IF_PREALLOC))
++              bmapi_flags |= XFS_BMAPI_IGSTATE;
+       /*
+        * Allocate enough space to handle "subnex" maps at a time.
+        */
++      error = ENOMEM;
+       subnex = 16;
+-      map = kmem_alloc(subnex * sizeof(*map), KM_SLEEP);
++      map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL);
++      if (!map)
++              goto out_unlock_ilock;
+       bmv->bmv_entries = 0;
+-      if ((XFS_IFORK_NEXTENTS(ip, whichfork) == 0)) {
+-              if (((iflags & BMV_IF_DELALLOC) == 0) ||
+-                  whichfork == XFS_ATTR_FORK) {
+-                      error = 0;
+-                      goto unlock_and_return;
+-              }
++      if (XFS_IFORK_NEXTENTS(ip, whichfork) == 0 &&
++          (whichfork == XFS_ATTR_FORK || !(iflags & BMV_IF_DELALLOC))) {
++              error = 0;
++              goto out_free_map;
+       }
+       nexleft = nex;
+@@ -6023,53 +6029,61 @@ xfs_getbmap(
+                                 bmapi_flags, NULL, 0, map, &nmap,
+                                 NULL, NULL);
+               if (error)
+-                      goto unlock_and_return;
++                      goto out_free_map;
+               ASSERT(nmap <= subnex);
+               for (i = 0; i < nmap && nexleft && bmv->bmv_length; i++) {
+-                      out.bmv_oflags = 0;
++                      out[cur_ext].bmv_oflags = 0;
+                       if (map[i].br_state == XFS_EXT_UNWRITTEN)
+-                              out.bmv_oflags |= BMV_OF_PREALLOC;
++                              out[cur_ext].bmv_oflags |= BMV_OF_PREALLOC;
+                       else if (map[i].br_startblock == DELAYSTARTBLOCK)
+-                              out.bmv_oflags |= BMV_OF_DELALLOC;
+-                      out.bmv_offset = XFS_FSB_TO_BB(mp, map[i].br_startoff);
+-                      out.bmv_length = XFS_FSB_TO_BB(mp, map[i].br_blockcount);
+-                      out.bmv_unused1 = out.bmv_unused2 = 0;
++                              out[cur_ext].bmv_oflags |= BMV_OF_DELALLOC;
++                      out[cur_ext].bmv_offset =
++                              XFS_FSB_TO_BB(mp, map[i].br_startoff);
++                      out[cur_ext].bmv_length =
++                              XFS_FSB_TO_BB(mp, map[i].br_blockcount);
++                      out[cur_ext].bmv_unused1 = 0;
++                      out[cur_ext].bmv_unused2 = 0;
+                       ASSERT(((iflags & BMV_IF_DELALLOC) != 0) ||
+                             (map[i].br_startblock != DELAYSTARTBLOCK));
+                         if (map[i].br_startblock == HOLESTARTBLOCK &&
+                           whichfork == XFS_ATTR_FORK) {
+                               /* came to the end of attribute fork */
+-                              out.bmv_oflags |= BMV_OF_LAST;
+-                              goto unlock_and_return;
+-                      } else {
+-                              int full = 0;   /* user array is full */
+-
+-                              if (!xfs_getbmapx_fix_eof_hole(ip, &out,
+-                                                      prealloced, bmvend,
+-                                                      map[i].br_startblock)) {
+-                                      goto unlock_and_return;
+-                              }
+-
+-                              /* format results & advance arg */
+-                              error = formatter(&arg, &out, &full);
+-                              if (error || full)
+-                                      goto unlock_and_return;
+-                              nexleft--;
+-                              bmv->bmv_offset =
+-                                      out.bmv_offset + out.bmv_length;
+-                              bmv->bmv_length = MAX((__int64_t)0,
+-                                      (__int64_t)(bmvend - bmv->bmv_offset));
+-                              bmv->bmv_entries++;
++                              out[cur_ext].bmv_oflags |= BMV_OF_LAST;
++                              goto out_free_map;
+                       }
++
++                      if (!xfs_getbmapx_fix_eof_hole(ip, &out[cur_ext],
++                                      prealloced, bmvend,
++                                      map[i].br_startblock))
++                              goto out_free_map;
++
++                      nexleft--;
++                      bmv->bmv_offset =
++                              out[cur_ext].bmv_offset +
++                              out[cur_ext].bmv_length;
++                      bmv->bmv_length =
++                              max_t(__int64_t, 0, bmvend - bmv->bmv_offset);
++                      bmv->bmv_entries++;
++                      cur_ext++;
+               }
+       } while (nmap && nexleft && bmv->bmv_length);
+-unlock_and_return:
++ out_free_map:
++      kmem_free(map);
++ out_unlock_ilock:
+       xfs_iunlock_map_shared(ip, lock);
++ out_unlock_iolock:
+       xfs_iunlock(ip, XFS_IOLOCK_SHARED);
+-      kmem_free(map);
++      for (i = 0; i < cur_ext; i++) {
++              int full = 0;   /* user array is full */
++
++              /* format results & advance arg */
++              error = formatter(&arg, &out[i], &full);
++              if (error || full)
++                      break;
++      }
+       return error;
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/xfs/xfs_inode.c linux-2.6.30-rc4-git/fs/xfs/xfs_inode.c
+--- linux-2.6.30-rc4/fs/xfs/xfs_inode.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/xfs/xfs_inode.c    2009-05-13 09:46:19.000000000 +0200
+@@ -1258,8 +1258,10 @@ xfs_file_last_byte(
+        * necessary.
+        */
+       if (ip->i_df.if_flags & XFS_IFEXTENTS) {
++              xfs_ilock(ip, XFS_ILOCK_SHARED);
+               error = xfs_bmap_last_offset(NULL, ip, &last_block,
+                       XFS_DATA_FORK);
++              xfs_iunlock(ip, XFS_ILOCK_SHARED);
+               if (error) {
+                       last_block = 0;
+               }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/fs/xfs/xfs_mount.c linux-2.6.30-rc4-git/fs/xfs/xfs_mount.c
+--- linux-2.6.30-rc4/fs/xfs/xfs_mount.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/fs/xfs/xfs_mount.c    2009-05-13 09:46:19.000000000 +0200
+@@ -291,14 +291,17 @@ xfs_mount_validate_sb(
+           sbp->sb_sectsize > XFS_MAX_SECTORSIZE                       ||
+           sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG                    ||
+           sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG                    ||
++          sbp->sb_sectsize != (1 << sbp->sb_sectlog)                  ||
+           sbp->sb_blocksize < XFS_MIN_BLOCKSIZE                       ||
+           sbp->sb_blocksize > XFS_MAX_BLOCKSIZE                       ||
+           sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG                    ||
+           sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG                    ||
++          sbp->sb_blocksize != (1 << sbp->sb_blocklog)                ||
+           sbp->sb_inodesize < XFS_DINODE_MIN_SIZE                     ||
+           sbp->sb_inodesize > XFS_DINODE_MAX_SIZE                     ||
+           sbp->sb_inodelog < XFS_DINODE_MIN_LOG                       ||
+           sbp->sb_inodelog > XFS_DINODE_MAX_LOG                       ||
++          sbp->sb_inodesize != (1 << sbp->sb_inodelog)                ||
+           (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog)   ||
+           (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE)  ||
+           (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE)  ||
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/asm-generic/atomic.h linux-2.6.30-rc4-git/include/asm-generic/atomic.h
+--- linux-2.6.30-rc4/include/asm-generic/atomic.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/asm-generic/atomic.h  2009-05-13 09:46:19.000000000 +0200
+@@ -132,9 +132,9 @@ static inline long atomic_long_add_unles
+ #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
+ #define atomic_long_cmpxchg(l, old, new) \
+-      (atomic_cmpxchg((atomic64_t *)(l), (old), (new)))
++      (atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
+ #define atomic_long_xchg(v, new) \
+-      (atomic_xchg((atomic64_t *)(l), (new)))
++      (atomic64_xchg((atomic64_t *)(l), (new)))
+ #else  /*  BITS_PER_LONG == 64  */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/binfmts.h linux-2.6.30-rc4-git/include/linux/binfmts.h
+--- linux-2.6.30-rc4/include/linux/binfmts.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/binfmts.h       2009-05-13 09:46:19.000000000 +0200
+@@ -82,7 +82,19 @@ struct linux_binfmt {
+       int hasvdso;
+ };
+-extern int register_binfmt(struct linux_binfmt *);
++extern int __register_binfmt(struct linux_binfmt *fmt, int insert);
++
++/* Registration of default binfmt handlers */
++static inline int register_binfmt(struct linux_binfmt *fmt)
++{
++      return __register_binfmt(fmt, 0);
++}
++/* Same as above, but adds a new binfmt at the top of the list */
++static inline int insert_binfmt(struct linux_binfmt *fmt)
++{
++      return __register_binfmt(fmt, 1);
++}
++
+ extern void unregister_binfmt(struct linux_binfmt *);
+ extern int prepare_binprm(struct linux_binprm *);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/blkdev.h linux-2.6.30-rc4-git/include/linux/blkdev.h
+--- linux-2.6.30-rc4/include/linux/blkdev.h    2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/blkdev.h        2009-05-13 09:46:19.000000000 +0200
+@@ -601,6 +601,7 @@ enum {
+                                blk_failfast_driver(rq))
+ #define blk_rq_started(rq)    ((rq)->cmd_flags & REQ_STARTED)
+ #define blk_rq_io_stat(rq)    ((rq)->cmd_flags & REQ_IO_STAT)
++#define blk_rq_quiet(rq)      ((rq)->cmd_flags & REQ_QUIET)
+ #define blk_account_rq(rq)    (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) 
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/input.h linux-2.6.30-rc4-git/include/linux/input.h
+--- linux-2.6.30-rc4/include/linux/input.h     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/input.h 2009-05-13 09:46:19.000000000 +0200
+@@ -106,6 +106,7 @@ struct input_absinfo {
+ #define SYN_REPORT            0
+ #define SYN_CONFIG            1
++#define SYN_MT_REPORT         2
+ /*
+  * Keys and buttons
+@@ -445,6 +446,7 @@ struct input_absinfo {
+ #define BTN_STYLUS2           0x14c
+ #define BTN_TOOL_DOUBLETAP    0x14d
+ #define BTN_TOOL_TRIPLETAP    0x14e
++#define BTN_TOOL_QUADTAP      0x14f   /* Four fingers on trackpad */
+ #define BTN_WHEEL             0x150
+ #define BTN_GEAR_DOWN         0x150
+@@ -644,6 +646,17 @@ struct input_absinfo {
+ #define ABS_TOOL_WIDTH                0x1c
+ #define ABS_VOLUME            0x20
+ #define ABS_MISC              0x28
++
++#define ABS_MT_TOUCH_MAJOR    0x30    /* Major axis of touching ellipse */
++#define ABS_MT_TOUCH_MINOR    0x31    /* Minor axis (omit if circular) */
++#define ABS_MT_WIDTH_MAJOR    0x32    /* Major axis of approaching ellipse */
++#define ABS_MT_WIDTH_MINOR    0x33    /* Minor axis (omit if circular) */
++#define ABS_MT_ORIENTATION    0x34    /* Ellipse orientation */
++#define ABS_MT_POSITION_X     0x35    /* Center X ellipse position */
++#define ABS_MT_POSITION_Y     0x36    /* Center Y ellipse position */
++#define ABS_MT_TOOL_TYPE      0x37    /* Type of touching device */
++#define ABS_MT_BLOB_ID                0x38    /* Group a set of packets as a blob */
++
+ #define ABS_MAX                       0x3f
+ #define ABS_CNT                       (ABS_MAX+1)
+@@ -743,6 +756,12 @@ struct input_absinfo {
+ #define BUS_ATARI             0x1B
+ /*
++ * MT_TOOL types
++ */
++#define MT_TOOL_FINGER                0
++#define MT_TOOL_PEN           1
++
++/*
+  * Values describing the status of a force-feedback effect
+  */
+ #define FF_STATUS_STOPPED     0x00
+@@ -1311,6 +1330,11 @@ static inline void input_sync(struct inp
+       input_event(dev, EV_SYN, SYN_REPORT, 0);
+ }
++static inline void input_mt_sync(struct input_dev *dev)
++{
++      input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
++}
++
+ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);
+ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/memcontrol.h linux-2.6.30-rc4-git/include/linux/memcontrol.h
+--- linux-2.6.30-rc4/include/linux/memcontrol.h        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/memcontrol.h    2009-05-13 09:46:19.000000000 +0200
+@@ -56,7 +56,7 @@ extern void mem_cgroup_move_lists(struct
+                                 enum lru_list from, enum lru_list to);
+ extern void mem_cgroup_uncharge_page(struct page *page);
+ extern void mem_cgroup_uncharge_cache_page(struct page *page);
+-extern int mem_cgroup_shrink_usage(struct page *page,
++extern int mem_cgroup_shmem_charge_fallback(struct page *page,
+                       struct mm_struct *mm, gfp_t gfp_mask);
+ extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
+@@ -155,7 +155,7 @@ static inline void mem_cgroup_uncharge_c
+ {
+ }
+-static inline int mem_cgroup_shrink_usage(struct page *page,
++static inline int mem_cgroup_shmem_charge_fallback(struct page *page,
+                       struct mm_struct *mm, gfp_t gfp_mask)
+ {
+       return 0;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/mman.h linux-2.6.30-rc4-git/include/linux/mman.h
+--- linux-2.6.30-rc4/include/linux/mman.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/mman.h  2009-05-13 09:46:19.000000000 +0200
+@@ -12,21 +12,18 @@
+ #ifdef __KERNEL__
+ #include <linux/mm.h>
++#include <linux/percpu_counter.h>
+ #include <asm/atomic.h>
+ extern int sysctl_overcommit_memory;
+ extern int sysctl_overcommit_ratio;
+-extern atomic_long_t vm_committed_space;
++extern struct percpu_counter vm_committed_as;
+-#ifdef CONFIG_SMP
+-extern void vm_acct_memory(long pages);
+-#else
+ static inline void vm_acct_memory(long pages)
+ {
+-      atomic_long_add(pages, &vm_committed_space);
++      percpu_counter_add(&vm_committed_as, pages);
+ }
+-#endif
+ static inline void vm_unacct_memory(long pages)
+ {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/of_platform.h linux-2.6.30-rc4-git/include/linux/of_platform.h
+--- linux-2.6.30-rc4/include/linux/of_platform.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/of_platform.h   2009-05-13 09:46:19.000000000 +0200
+@@ -51,6 +51,16 @@ extern int of_register_driver(struct of_
+                             struct bus_type *bus);
+ extern void of_unregister_driver(struct of_platform_driver *drv);
++/* Platform drivers register/unregister */
++static inline int of_register_platform_driver(struct of_platform_driver *drv)
++{
++      return of_register_driver(drv, &of_platform_bus_type);
++}
++static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
++{
++      of_unregister_driver(drv);
++}
++
+ #include <asm/of_platform.h>
+ extern struct of_device *of_find_device_by_node(struct device_node *np);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/linux/sunrpc/xprt.h linux-2.6.30-rc4-git/include/linux/sunrpc/xprt.h
+--- linux-2.6.30-rc4/include/linux/sunrpc/xprt.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/linux/sunrpc/xprt.h   2009-05-13 09:46:19.000000000 +0200
+@@ -261,6 +261,7 @@ void                       xprt_conditional_disconnect(struc
+ #define XPRT_BINDING          (5)
+ #define XPRT_CLOSING          (6)
+ #define XPRT_CONNECTION_ABORT (7)
++#define XPRT_CONNECTION_CLOSE (8)
+ static inline void xprt_set_connected(struct rpc_xprt *xprt)
+ {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/scsi/fc/fc_fs.h linux-2.6.30-rc4-git/include/scsi/fc/fc_fs.h
+--- linux-2.6.30-rc4/include/scsi/fc/fc_fs.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/scsi/fc/fc_fs.h       2009-05-13 09:46:19.000000000 +0200
+@@ -149,6 +149,7 @@ enum fc_rctl {
+  * Well-known fabric addresses.
+  */
+ enum fc_well_known_fid {
++      FC_FID_NONE =           0x000000,       /* No destination */
+       FC_FID_BCAST =          0xffffff,       /* broadcast */
+       FC_FID_FLOGI =          0xfffffe,       /* fabric login */
+       FC_FID_FCTRL =          0xfffffd,       /* fabric controller */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/scsi/libfc.h linux-2.6.30-rc4-git/include/scsi/libfc.h
+--- linux-2.6.30-rc4/include/scsi/libfc.h      2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/scsi/libfc.h  2009-05-13 09:46:19.000000000 +0200
+@@ -637,6 +637,7 @@ struct fc_disc {
+                             enum fc_disc_event);
+       struct list_head         rports;
++      struct list_head         rogue_rports;
+       struct fc_lport         *lport;
+       struct mutex            disc_mutex;
+       struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/scsi/libiscsi.h linux-2.6.30-rc4-git/include/scsi/libiscsi.h
+--- linux-2.6.30-rc4/include/scsi/libiscsi.h   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/scsi/libiscsi.h       2009-05-13 09:46:19.000000000 +0200
+@@ -36,6 +36,7 @@ struct scsi_transport_template;
+ struct scsi_host_template;
+ struct scsi_device;
+ struct Scsi_Host;
++struct scsi_target;
+ struct scsi_cmnd;
+ struct socket;
+ struct iscsi_transport;
+@@ -350,6 +351,7 @@ extern struct Scsi_Host *iscsi_host_allo
+                                         bool xmit_can_sleep);
+ extern void iscsi_host_remove(struct Scsi_Host *shost);
+ extern void iscsi_host_free(struct Scsi_Host *shost);
++extern int iscsi_target_alloc(struct scsi_target *starget);
+ /*
+  * session management
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/include/scsi/osd_protocol.h linux-2.6.30-rc4-git/include/scsi/osd_protocol.h
+--- linux-2.6.30-rc4/include/scsi/osd_protocol.h       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/include/scsi/osd_protocol.h   2009-05-13 09:46:19.000000000 +0200
+@@ -24,17 +24,18 @@ enum {
+       OSDv1_ADDITIONAL_CDB_LENGTH = 192,
+       OSDv1_TOTAL_CDB_LEN = OSDv1_ADDITIONAL_CDB_LENGTH + 8,
+       OSDv1_CAP_LEN = 80,
++
+       /* Latest supported version */
+-/*    OSD_ADDITIONAL_CDB_LENGTH = 216,*/
++      OSDv2_ADDITIONAL_CDB_LENGTH = 228,
+       OSD_ADDITIONAL_CDB_LENGTH =
+-              OSDv1_ADDITIONAL_CDB_LENGTH, /* FIXME: Pete rev-001 sup */
++              OSDv2_ADDITIONAL_CDB_LENGTH,
+       OSD_TOTAL_CDB_LEN = OSD_ADDITIONAL_CDB_LENGTH + 8,
+-/*    OSD_CAP_LEN = 104,*/
+-      OSD_CAP_LEN = OSDv1_CAP_LEN,/* FIXME: Pete rev-001 sup */
++      OSD_CAP_LEN = 104,
+       OSD_SYSTEMID_LEN = 20,
+-      OSD_CRYPTO_KEYID_SIZE = 20,
+-      /*FIXME: OSDv2_CRYPTO_KEYID_SIZE = 32,*/
++      OSDv1_CRYPTO_KEYID_SIZE = 20,
++      OSDv2_CRYPTO_KEYID_SIZE = 32,
++      OSD_CRYPTO_KEYID_SIZE = OSDv2_CRYPTO_KEYID_SIZE,
+       OSD_CRYPTO_SEED_SIZE = 4,
+       OSD_CRYPTO_NONCE_SIZE = 12,
+       OSD_MAX_SENSE_LEN = 252, /* from SPC-3 */
+@@ -164,7 +165,11 @@ struct osd_cdb_head {
+                       /* called allocation_length in some commands */
+ /*32*/                        __be64  length;
+ /*40*/                        __be64  start_address;
+-/*48*/                        __be32 list_identifier;/* Rarely used */
++                      union {
++/*48*/                                __be32 list_identifier;/* Rarely used */
++                              /* OSD2r05 5.2.5 CDB continuation length */
++/*48*/                                __be32 cdb_continuation_length;
++                      };
+               } __packed v2;
+       };
+ /*52*/        union { /* selected attributes mode Page/List/Single */
+@@ -204,29 +209,40 @@ struct osd_cdb_head {
+ /*80*/
+ /*160 v1*/
+-/*184 v2*/
+-struct osd_security_parameters {
+-/*160*/u8     integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
++struct osdv1_security_parameters {
++/*160*/u8     integrity_check_value[OSDv1_CRYPTO_KEYID_SIZE];
+ /*180*/u8     request_nonce[OSD_CRYPTO_NONCE_SIZE];
+ /*192*/osd_cdb_offset data_in_integrity_check_offset;
+ /*196*/osd_cdb_offset data_out_integrity_check_offset;
+ } __packed;
+ /*200 v1*/
+-/*224 v2*/
+-/* FIXME: osdv2_security_parameters */
++/*184 v2*/
++struct osdv2_security_parameters {
++/*184*/u8     integrity_check_value[OSDv2_CRYPTO_KEYID_SIZE];
++/*216*/u8     request_nonce[OSD_CRYPTO_NONCE_SIZE];
++/*228*/osd_cdb_offset data_in_integrity_check_offset;
++/*232*/osd_cdb_offset data_out_integrity_check_offset;
++} __packed;
++/*236 v2*/
++
++struct osd_security_parameters {
++      union {
++              struct osdv1_security_parameters v1;
++              struct osdv2_security_parameters v2;
++      };
++};
+ struct osdv1_cdb {
+       struct osd_cdb_head h;
+       u8 caps[OSDv1_CAP_LEN];
+-      struct osd_security_parameters sec_params;
++      struct osdv1_security_parameters sec_params;
+ } __packed;
+ struct osdv2_cdb {
+       struct osd_cdb_head h;
+       u8 caps[OSD_CAP_LEN];
+-      struct osd_security_parameters sec_params;
+-      /* FIXME: osdv2_security_parameters */
++      struct osdv2_security_parameters sec_params;
+ } __packed;
+ struct osd_cdb {
+@@ -301,14 +317,25 @@ struct osd_attributes_list_attrid {
+ } __packed;
+ /*
++ * NOTE: v1: is not aligned.
++ */
++struct osdv1_attributes_list_element {
++      __be32 attr_page;
++      __be32 attr_id;
++      __be16 attr_bytes; /* valid bytes at attr_val without padding */
++      u8 attr_val[0];
++} __packed;
++
++/*
+  * osd2r03: 7.1.3.3 List entry format for retrieved attributes and
+  *                  for setting attributes
+- * NOTE: v2 is 8-bytes aligned, v1 is not aligned.
++ * NOTE: v2 is 8-bytes aligned
+  */
+-struct osd_attributes_list_element {
++struct osdv2_attributes_list_element {
+       __be32 attr_page;
+       __be32 attr_id;
+-      __be16 attr_bytes;
++      u8 reserved[6];
++      __be16 attr_bytes; /* valid bytes at attr_val without padding */
+       u8 attr_val[0];
+ } __packed;
+@@ -324,13 +351,13 @@ enum {
+ static inline unsigned osdv1_attr_list_elem_size(unsigned len)
+ {
+-      return ALIGN(len + sizeof(struct osd_attributes_list_element),
++      return ALIGN(len + sizeof(struct osdv1_attributes_list_element),
+                    OSDv1_ATTRIBUTES_ELEM_ALIGN);
+ }
+ static inline unsigned osdv2_attr_list_elem_size(unsigned len)
+ {
+-      return ALIGN(len + sizeof(struct osd_attributes_list_element),
++      return ALIGN(len + sizeof(struct osdv2_attributes_list_element),
+                    OSD_ATTRIBUTES_ELEM_ALIGN);
+ }
+@@ -419,15 +446,35 @@ struct osd_data_out_integrity_info {
+       __be64 data_bytes;
+       __be64 set_attributes_bytes;
+       __be64 get_attributes_bytes;
+-      __be64 integrity_check_value;
++      __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
+ } __packed;
++/* Same osd_data_out_integrity_info is used for OSD2/OSD1. The only difference
++ * Is the sizeof the structure since in OSD1 the last array is smaller. Use
++ * below for version independent handling of this structure
++ */
++static inline int osd_data_out_integrity_info_sizeof(bool is_ver1)
++{
++      return sizeof(struct osd_data_out_integrity_info) -
++              (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE));
++}
++
+ struct osd_data_in_integrity_info {
+       __be64 data_bytes;
+       __be64 retrieved_attributes_bytes;
+-      __be64 integrity_check_value;
++      __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
+ } __packed;
++/* Same osd_data_in_integrity_info is used for OSD2/OSD1. The only difference
++ * Is the sizeof the structure since in OSD1 the last array is smaller. Use
++ * below for version independent handling of this structure
++ */
++static inline int osd_data_in_integrity_info_sizeof(bool is_ver1)
++{
++      return sizeof(struct osd_data_in_integrity_info) -
++              (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE));
++}
++
+ struct osd_timestamp {
+       u8 time[6]; /* number of milliseconds since 1/1/1970 UT (big endian) */
+ } __packed;
+@@ -477,7 +524,7 @@ enum osd_capability_bit_masks {
+       OSD_SEC_CAP_NONE1       = BIT(8),
+       OSD_SEC_CAP_NONE2       = BIT(9),
+-      OSD_SEC_CAP_NONE3       = BIT(10),
++      OSD_SEC_GBL_REM         = BIT(10), /*v2 only*/
+       OSD_SEC_CAP_QUERY       = BIT(11), /*v2 only*/
+       OSD_SEC_CAP_M_OBJECT    = BIT(12), /*v2 only*/
+       OSD_SEC_CAP_POL_SEC     = BIT(13),
+@@ -552,8 +599,7 @@ struct osdv1_capability {
+ struct osd_capability {
+       struct osd_capability_head h;
+-/*    struct osd_cap_object_descriptor od;*/
+-      struct osdv1_cap_object_descriptor od; /* FIXME: Pete rev-001 sup */
++      struct osd_cap_object_descriptor od;
+ } __packed;
+ /**
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/kernel/sysctl.c linux-2.6.30-rc4-git/kernel/sysctl.c
+--- linux-2.6.30-rc4/kernel/sysctl.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/kernel/sysctl.c       2009-05-13 09:46:19.000000000 +0200
+@@ -103,6 +103,9 @@ static unsigned long one_ul = 1;
+ static int one_hundred = 100;
+ static int one_thousand = 1000;
++/* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
++static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
++
+ /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
+ static int maxolduid = 65535;
+ static int minolduid;
+@@ -1006,7 +1009,7 @@ static struct ctl_table vm_table[] = {
+               .mode           = 0644,
+               .proc_handler   = &dirty_bytes_handler,
+               .strategy       = &sysctl_intvec,
+-              .extra1         = &one_ul,
++              .extra1         = &dirty_bytes_min,
+       },
+       {
+               .procname       = "dirty_writeback_centisecs",
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/MAINTAINERS linux-2.6.30-rc4-git/MAINTAINERS
+--- linux-2.6.30-rc4/MAINTAINERS       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/MAINTAINERS   2009-05-13 09:46:19.000000000 +0200
+@@ -4189,7 +4189,7 @@ P:       Joel Becker
+ M:    joel.becker@oracle.com
+ L:    ocfs2-devel@oss.oracle.com (moderated for non-subscribers)
+ W:    http://oss.oracle.com/projects/ocfs2/
+-T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2.git
++T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git
+ S:    Supported
+ F:    Documentation/filesystems/ocfs2.txt
+ F:    Documentation/filesystems/dlmfs.txt
+@@ -4521,6 +4521,19 @@ M:      jim@jtan.com
+ L:    cbe-oss-dev@ozlabs.org
+ S:    Maintained
++PTRACE SUPPORT
++P:    Roland McGrath
++M:    roland@redhat.com
++P:    Oleg Nesterov
++M:    oleg@redhat.com
++L:    linux-kernel@vger.kernel.org
++S:    Maintained
++F:    include/asm-generic/syscall.h
++F:    include/linux/ptrace.h
++F:    include/linux/regset.h
++F:    include/linux/tracehook.h
++F:    kernel/ptrace.c
++
+ PVRUSB2 VIDEO4LINUX DRIVER
+ P:    Mike Isely
+ M:    isely@pobox.com
+@@ -4666,13 +4679,13 @@ F:     kernel/rcutorture.c
+ RDC R-321X SoC
+ P:    Florian Fainelli
+-M:    florian.fainelli@telecomint.eu
++M:    florian@openwrt.org
+ L:    linux-kernel@vger.kernel.org
+ S:    Maintained
+ RDC R6040 FAST ETHERNET DRIVER
+ P:    Florian Fainelli
+-M:    florian.fainelli@telecomint.eu
++M:    florian@openwrt.org
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    drivers/net/r6040.c
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/Makefile linux-2.6.30-rc4-git/Makefile
+--- linux-2.6.30-rc4/Makefile  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/Makefile      2009-05-13 09:46:19.000000000 +0200
+@@ -1293,7 +1293,7 @@ help:
+       @echo  '  dir/            - Build all files in dir and below'
+       @echo  '  dir/file.[ois]  - Build specified target only'
+       @echo  '  dir/file.ko     - Build module including final link'
+-      @echo  '  prepare         - Set up for building external modules'
++      @echo  '  modules_prepare - Set up for building external modules'
+       @echo  '  tags/TAGS       - Generate tags file for editors'
+       @echo  '  cscope          - Generate cscope index'
+       @echo  '  kernelrelease   - Output the release version string'
+@@ -1421,7 +1421,9 @@ $(clean-dirs):
+       $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+ clean:        rm-dirs := $(MODVERDIR)
+-clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers
++clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
++                   $(KBUILD_EXTMOD)/Module.markers \
++                   $(KBUILD_EXTMOD)/modules.order
+ clean: $(clean-dirs)
+       $(call cmd,rmdirs)
+       $(call cmd,rmfiles)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/memcontrol.c linux-2.6.30-rc4-git/mm/memcontrol.c
+--- linux-2.6.30-rc4/mm/memcontrol.c   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/memcontrol.c       2009-05-13 09:46:19.000000000 +0200
+@@ -1024,9 +1024,7 @@ static struct mem_cgroup *try_get_mem_cg
+               return NULL;
+       pc = lookup_page_cgroup(page);
+-      /*
+-       * Used bit of swapcache is solid under page lock.
+-       */
++      lock_page_cgroup(pc);
+       if (PageCgroupUsed(pc)) {
+               mem = pc->mem_cgroup;
+               if (mem && !css_tryget(&mem->css))
+@@ -1040,6 +1038,7 @@ static struct mem_cgroup *try_get_mem_cg
+                       mem = NULL;
+               rcu_read_unlock();
+       }
++      unlock_page_cgroup(pc);
+       return mem;
+ }
+@@ -1618,37 +1617,28 @@ void mem_cgroup_end_migration(struct mem
+ }
+ /*
+- * A call to try to shrink memory usage under specified resource controller.
+- * This is typically used for page reclaiming for shmem for reducing side
+- * effect of page allocation from shmem, which is used by some mem_cgroup.
++ * A call to try to shrink memory usage on charge failure at shmem's swapin.
++ * Calling hierarchical_reclaim is not enough because we should update
++ * last_oom_jiffies to prevent pagefault_out_of_memory from invoking global OOM.
++ * Moreover considering hierarchy, we should reclaim from the mem_over_limit,
++ * not from the memcg which this page would be charged to.
++ * try_charge_swapin does all of these works properly.
+  */
+-int mem_cgroup_shrink_usage(struct page *page,
++int mem_cgroup_shmem_charge_fallback(struct page *page,
+                           struct mm_struct *mm,
+                           gfp_t gfp_mask)
+ {
+       struct mem_cgroup *mem = NULL;
+-      int progress = 0;
+-      int retry = MEM_CGROUP_RECLAIM_RETRIES;
++      int ret;
+       if (mem_cgroup_disabled())
+               return 0;
+-      if (page)
+-              mem = try_get_mem_cgroup_from_swapcache(page);
+-      if (!mem && mm)
+-              mem = try_get_mem_cgroup_from_mm(mm);
+-      if (unlikely(!mem))
+-              return 0;
+-      do {
+-              progress = mem_cgroup_hierarchical_reclaim(mem,
+-                                      gfp_mask, true, false);
+-              progress += mem_cgroup_check_under_limit(mem);
+-      } while (!progress && --retry);
++      ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &mem);
++      if (!ret)
++              mem_cgroup_cancel_charge_swapin(mem); /* it does !mem check */
+-      css_put(&mem->css);
+-      if (!retry)
+-              return -ENOMEM;
+-      return 0;
++      return ret;
+ }
+ static DEFINE_MUTEX(set_limit_mutex);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/memory.c linux-2.6.30-rc4-git/mm/memory.c
+--- linux-2.6.30-rc4/mm/memory.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/memory.c   2009-05-13 09:46:19.000000000 +0200
+@@ -1971,6 +1971,15 @@ static int do_wp_page(struct mm_struct *
+                               ret = tmp;
+                               goto unwritable_page;
+                       }
++                      if (unlikely(!(tmp & VM_FAULT_LOCKED))) {
++                              lock_page(old_page);
++                              if (!old_page->mapping) {
++                                      ret = 0; /* retry the fault */
++                                      unlock_page(old_page);
++                                      goto unwritable_page;
++                              }
++                      } else
++                              VM_BUG_ON(!PageLocked(old_page));
+                       /*
+                        * Since we dropped the lock we need to revalidate
+@@ -1980,9 +1989,11 @@ static int do_wp_page(struct mm_struct *
+                        */
+                       page_table = pte_offset_map_lock(mm, pmd, address,
+                                                        &ptl);
+-                      page_cache_release(old_page);
+-                      if (!pte_same(*page_table, orig_pte))
++                      if (!pte_same(*page_table, orig_pte)) {
++                              unlock_page(old_page);
++                              page_cache_release(old_page);
+                               goto unlock;
++                      }
+                       page_mkwrite = 1;
+               }
+@@ -2094,9 +2105,6 @@ gotten:
+ unlock:
+       pte_unmap_unlock(page_table, ptl);
+       if (dirty_page) {
+-              if (vma->vm_file)
+-                      file_update_time(vma->vm_file);
+-
+               /*
+                * Yes, Virginia, this is actually required to prevent a race
+                * with clear_page_dirty_for_io() from clearing the page dirty
+@@ -2105,16 +2113,41 @@ unlock:
+                *
+                * do_no_page is protected similarly.
+                */
+-              wait_on_page_locked(dirty_page);
+-              set_page_dirty_balance(dirty_page, page_mkwrite);
++              if (!page_mkwrite) {
++                      wait_on_page_locked(dirty_page);
++                      set_page_dirty_balance(dirty_page, page_mkwrite);
++              }
+               put_page(dirty_page);
++              if (page_mkwrite) {
++                      struct address_space *mapping = dirty_page->mapping;
++
++                      set_page_dirty(dirty_page);
++                      unlock_page(dirty_page);
++                      page_cache_release(dirty_page);
++                      if (mapping)    {
++                              /*
++                               * Some device drivers do not set page.mapping
++                               * but still dirty their pages
++                               */
++                              balance_dirty_pages_ratelimited(mapping);
++                      }
++              }
++
++              /* file_update_time outside page_lock */
++              if (vma->vm_file)
++                      file_update_time(vma->vm_file);
+       }
+       return ret;
+ oom_free_new:
+       page_cache_release(new_page);
+ oom:
+-      if (old_page)
++      if (old_page) {
++              if (page_mkwrite) {
++                      unlock_page(old_page);
++                      page_cache_release(old_page);
++              }
+               page_cache_release(old_page);
++      }
+       return VM_FAULT_OOM;
+ unwritable_page:
+@@ -2458,8 +2491,7 @@ static int do_swap_page(struct mm_struct
+       if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) {
+               ret = VM_FAULT_OOM;
+-              unlock_page(page);
+-              goto out;
++              goto out_page;
+       }
+       /*
+@@ -2521,6 +2553,7 @@ out:
+ out_nomap:
+       mem_cgroup_cancel_charge_swapin(ptr);
+       pte_unmap_unlock(page_table, ptl);
++out_page:
+       unlock_page(page);
+       page_cache_release(page);
+       return ret;
+@@ -2664,27 +2697,22 @@ static int __do_fault(struct mm_struct *
+                               int tmp;
+                               unlock_page(page);
+-                              vmf.flags |= FAULT_FLAG_MKWRITE;
++                              vmf.flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE;
+                               tmp = vma->vm_ops->page_mkwrite(vma, &vmf);
+                               if (unlikely(tmp &
+                                         (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) {
+                                       ret = tmp;
+-                                      anon = 1; /* no anon but release vmf.page */
+-                                      goto out_unlocked;
+-                              }
+-                              lock_page(page);
+-                              /*
+-                               * XXX: this is not quite right (racy vs
+-                               * invalidate) to unlock and relock the page
+-                               * like this, however a better fix requires
+-                               * reworking page_mkwrite locking API, which
+-                               * is better done later.
+-                               */
+-                              if (!page->mapping) {
+-                                      ret = 0;
+-                                      anon = 1; /* no anon but release vmf.page */
+-                                      goto out;
++                                      goto unwritable_page;
+                               }
++                              if (unlikely(!(tmp & VM_FAULT_LOCKED))) {
++                                      lock_page(page);
++                                      if (!page->mapping) {
++                                              ret = 0; /* retry the fault */
++                                              unlock_page(page);
++                                              goto unwritable_page;
++                                      }
++                              } else
++                                      VM_BUG_ON(!PageLocked(page));
+                               page_mkwrite = 1;
+                       }
+               }
+@@ -2736,19 +2764,35 @@ static int __do_fault(struct mm_struct *
+       pte_unmap_unlock(page_table, ptl);
+ out:
+-      unlock_page(vmf.page);
+-out_unlocked:
+-      if (anon)
+-              page_cache_release(vmf.page);
+-      else if (dirty_page) {
+-              if (vma->vm_file)
+-                      file_update_time(vma->vm_file);
++      if (dirty_page) {
++              struct address_space *mapping = page->mapping;
+-              set_page_dirty_balance(dirty_page, page_mkwrite);
++              if (set_page_dirty(dirty_page))
++                      page_mkwrite = 1;
++              unlock_page(dirty_page);
+               put_page(dirty_page);
++              if (page_mkwrite && mapping) {
++                      /*
++                       * Some device drivers do not set page.mapping but still
++                       * dirty their pages
++                       */
++                      balance_dirty_pages_ratelimited(mapping);
++              }
++
++              /* file_update_time outside page_lock */
++              if (vma->vm_file)
++                      file_update_time(vma->vm_file);
++      } else {
++              unlock_page(vmf.page);
++              if (anon)
++                      page_cache_release(vmf.page);
+       }
+       return ret;
++
++unwritable_page:
++      page_cache_release(page);
++      return ret;
+ }
+ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/mmap.c linux-2.6.30-rc4-git/mm/mmap.c
+--- linux-2.6.30-rc4/mm/mmap.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/mmap.c     2009-05-13 09:46:19.000000000 +0200
+@@ -85,7 +85,7 @@ EXPORT_SYMBOL(vm_get_page_prot);
+ int sysctl_overcommit_memory = OVERCOMMIT_GUESS;  /* heuristic overcommit */
+ int sysctl_overcommit_ratio = 50;     /* default is 50% */
+ int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;
+-atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0);
++struct percpu_counter vm_committed_as;
+ /*
+  * Check that a process has enough memory to allocate a new virtual
+@@ -179,11 +179,7 @@ int __vm_enough_memory(struct mm_struct 
+       if (mm)
+               allowed -= mm->total_vm / 32;
+-      /*
+-       * cast `allowed' as a signed long because vm_committed_space
+-       * sometimes has a negative value
+-       */
+-      if (atomic_long_read(&vm_committed_space) < (long)allowed)
++      if (percpu_counter_read_positive(&vm_committed_as) < allowed)
+               return 0;
+ error:
+       vm_unacct_memory(pages);
+@@ -2481,4 +2477,8 @@ void mm_drop_all_locks(struct mm_struct 
+  */
+ void __init mmap_init(void)
+ {
++      int ret;
++
++      ret = percpu_counter_init(&vm_committed_as, 0);
++      VM_BUG_ON(ret);
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/nommu.c linux-2.6.30-rc4-git/mm/nommu.c
+--- linux-2.6.30-rc4/mm/nommu.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/nommu.c    2009-05-13 09:46:19.000000000 +0200
+@@ -62,7 +62,7 @@ void *high_memory;
+ struct page *mem_map;
+ unsigned long max_mapnr;
+ unsigned long num_physpages;
+-atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0);
++struct percpu_counter vm_committed_as;
+ int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */
+ int sysctl_overcommit_ratio = 50; /* default is 50% */
+ int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT;
+@@ -463,6 +463,10 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
+  */
+ void __init mmap_init(void)
+ {
++      int ret;
++
++      ret = percpu_counter_init(&vm_committed_as, 0);
++      VM_BUG_ON(ret);
+       vm_region_jar = KMEM_CACHE(vm_region, SLAB_PANIC);
+ }
+@@ -1847,12 +1851,9 @@ int __vm_enough_memory(struct mm_struct 
+       if (mm)
+               allowed -= mm->total_vm / 32;
+-      /*
+-       * cast `allowed' as a signed long because vm_committed_space
+-       * sometimes has a negative value
+-       */
+-      if (atomic_long_read(&vm_committed_space) < (long)allowed)
++      if (percpu_counter_read_positive(&vm_committed_as) < allowed)
+               return 0;
++
+ error:
+       vm_unacct_memory(pages);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/shmem.c linux-2.6.30-rc4-git/mm/shmem.c
+--- linux-2.6.30-rc4/mm/shmem.c        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/shmem.c    2009-05-13 09:46:19.000000000 +0200
+@@ -1340,8 +1340,12 @@ repeat:
+                       shmem_swp_unmap(entry);
+                       spin_unlock(&info->lock);
+                       if (error == -ENOMEM) {
+-                              /* allow reclaim from this memory cgroup */
+-                              error = mem_cgroup_shrink_usage(swappage,
++                              /*
++                               * reclaim from proper memory cgroup and
++                               * call memcg's OOM if needed.
++                               */
++                              error = mem_cgroup_shmem_charge_fallback(
++                                                              swappage,
+                                                               current->mm,
+                                                               gfp);
+                               if (error) {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/swap.c linux-2.6.30-rc4-git/mm/swap.c
+--- linux-2.6.30-rc4/mm/swap.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/swap.c     2009-05-13 09:46:19.000000000 +0200
+@@ -491,49 +491,6 @@ unsigned pagevec_lookup_tag(struct pagev
+ EXPORT_SYMBOL(pagevec_lookup_tag);
+-#ifdef CONFIG_SMP
+-/*
+- * We tolerate a little inaccuracy to avoid ping-ponging the counter between
+- * CPUs
+- */
+-#define ACCT_THRESHOLD        max(16, NR_CPUS * 2)
+-
+-static DEFINE_PER_CPU(long, committed_space);
+-
+-void vm_acct_memory(long pages)
+-{
+-      long *local;
+-
+-      preempt_disable();
+-      local = &__get_cpu_var(committed_space);
+-      *local += pages;
+-      if (*local > ACCT_THRESHOLD || *local < -ACCT_THRESHOLD) {
+-              atomic_long_add(*local, &vm_committed_space);
+-              *local = 0;
+-      }
+-      preempt_enable();
+-}
+-
+-#ifdef CONFIG_HOTPLUG_CPU
+-
+-/* Drop the CPU's cached committed space back into the central pool. */
+-static int cpu_swap_callback(struct notifier_block *nfb,
+-                           unsigned long action,
+-                           void *hcpu)
+-{
+-      long *committed;
+-
+-      committed = &per_cpu(committed_space, (long)hcpu);
+-      if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
+-              atomic_long_add(*committed, &vm_committed_space);
+-              *committed = 0;
+-              drain_cpu_pagevecs((long)hcpu);
+-      }
+-      return NOTIFY_OK;
+-}
+-#endif /* CONFIG_HOTPLUG_CPU */
+-#endif /* CONFIG_SMP */
+-
+ /*
+  * Perform any setup for the swap system
+  */
+@@ -554,7 +511,4 @@ void __init swap_setup(void)
+        * Right now other parts of the system means that we
+        * _really_ don't want to cluster much more
+        */
+-#ifdef CONFIG_HOTPLUG_CPU
+-      hotcpu_notifier(cpu_swap_callback, 0);
+-#endif
+ }
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/mm/vmscan.c linux-2.6.30-rc4-git/mm/vmscan.c
+--- linux-2.6.30-rc4/mm/vmscan.c       2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/mm/vmscan.c   2009-05-13 09:46:19.000000000 +0200
+@@ -1471,7 +1471,7 @@ static void shrink_zone(int priority, st
+       for_each_evictable_lru(l) {
+               int file = is_file_lru(l);
+-              int scan;
++              unsigned long scan;
+               scan = zone_nr_pages(zone, sc, l);
+               if (priority) {
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/net/sunrpc/xprt.c linux-2.6.30-rc4-git/net/sunrpc/xprt.c
+--- linux-2.6.30-rc4/net/sunrpc/xprt.c 2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/net/sunrpc/xprt.c     2009-05-13 09:46:19.000000000 +0200
+@@ -672,10 +672,8 @@ xprt_init_autodisconnect(unsigned long d
+       if (test_and_set_bit(XPRT_LOCKED, &xprt->state))
+               goto out_abort;
+       spin_unlock(&xprt->transport_lock);
+-      if (xprt_connecting(xprt))
+-              xprt_release_write(xprt, NULL);
+-      else
+-              queue_work(rpciod_workqueue, &xprt->task_cleanup);
++      set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
++      queue_work(rpciod_workqueue, &xprt->task_cleanup);
+       return;
+ out_abort:
+       spin_unlock(&xprt->transport_lock);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/net/sunrpc/xprtsock.c linux-2.6.30-rc4-git/net/sunrpc/xprtsock.c
+--- linux-2.6.30-rc4/net/sunrpc/xprtsock.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/net/sunrpc/xprtsock.c 2009-05-13 09:46:19.000000000 +0200
+@@ -807,6 +807,9 @@ static void xs_reset_transport(struct so
+  *
+  * This is used when all requests are complete; ie, no DRC state remains
+  * on the server we want to save.
++ *
++ * The caller _must_ be holding XPRT_LOCKED in order to avoid issues with
++ * xs_reset_transport() zeroing the socket from underneath a writer.
+  */
+ static void xs_close(struct rpc_xprt *xprt)
+ {
+@@ -824,6 +827,14 @@ static void xs_close(struct rpc_xprt *xp
+       xprt_disconnect_done(xprt);
+ }
++static void xs_tcp_close(struct rpc_xprt *xprt)
++{
++      if (test_and_clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state))
++              xs_close(xprt);
++      else
++              xs_tcp_shutdown(xprt);
++}
++
+ /**
+  * xs_destroy - prepare to shutdown a transport
+  * @xprt: doomed transport
+@@ -1772,6 +1783,15 @@ static void xs_tcp_setup_socket(struct r
+                       xprt, -status, xprt_connected(xprt),
+                       sock->sk->sk_state);
+       switch (status) {
++      default:
++              printk("%s: connect returned unhandled error %d\n",
++                      __func__, status);
++      case -EADDRNOTAVAIL:
++              /* We're probably in TIME_WAIT. Get rid of existing socket,
++               * and retry
++               */
++              set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
++              xprt_force_disconnect(xprt);
+       case -ECONNREFUSED:
+       case -ECONNRESET:
+       case -ENETUNREACH:
+@@ -1782,10 +1802,6 @@ static void xs_tcp_setup_socket(struct r
+               xprt_clear_connecting(xprt);
+               return;
+       }
+-      /* get rid of existing socket, and retry */
+-      xs_tcp_shutdown(xprt);
+-      printk("%s: connect returned unhandled error %d\n",
+-                      __func__, status);
+ out_eagain:
+       status = -EAGAIN;
+ out:
+@@ -1994,7 +2010,7 @@ static struct rpc_xprt_ops xs_tcp_ops = 
+       .buf_free               = rpc_free,
+       .send_request           = xs_tcp_send_request,
+       .set_retrans_timeout    = xprt_set_retrans_timeout_def,
+-      .close                  = xs_tcp_shutdown,
++      .close                  = xs_tcp_close,
+       .destroy                = xs_destroy,
+       .print_stats            = xs_tcp_print_stats,
+ };
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/checks.c linux-2.6.30-rc4-git/scripts/dtc/checks.c
+--- linux-2.6.30-rc4/scripts/dtc/checks.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/checks.c  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,587 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2007.
++ *
++ *
++ * 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 "dtc.h"
++
++#ifdef TRACE_CHECKS
++#define TRACE(c, ...) \
++      do { \
++              fprintf(stderr, "=== %s: ", (c)->name); \
++              fprintf(stderr, __VA_ARGS__); \
++              fprintf(stderr, "\n"); \
++      } while (0)
++#else
++#define TRACE(c, fmt, ...)    do { } while (0)
++#endif
++
++enum checklevel {
++      IGNORE = 0,
++      WARN = 1,
++      ERROR = 2,
++};
++
++enum checkstatus {
++      UNCHECKED = 0,
++      PREREQ,
++      PASSED,
++      FAILED,
++};
++
++struct check;
++
++typedef void (*tree_check_fn)(struct check *c, struct node *dt);
++typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node);
++typedef void (*prop_check_fn)(struct check *c, struct node *dt,
++                            struct node *node, struct property *prop);
++
++struct check {
++      const char *name;
++      tree_check_fn tree_fn;
++      node_check_fn node_fn;
++      prop_check_fn prop_fn;
++      void *data;
++      enum checklevel level;
++      enum checkstatus status;
++      int inprogress;
++      int num_prereqs;
++      struct check **prereq;
++};
++
++#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \
++      static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \
++      static struct check nm = { \
++              .name = #nm, \
++              .tree_fn = (tfn), \
++              .node_fn = (nfn), \
++              .prop_fn = (pfn), \
++              .data = (d), \
++              .level = (lvl), \
++              .status = UNCHECKED, \
++              .num_prereqs = ARRAY_SIZE(nm##_prereqs), \
++              .prereq = nm##_prereqs, \
++      };
++
++#define TREE_CHECK(nm, d, lvl, ...) \
++      CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__)
++#define NODE_CHECK(nm, d, lvl, ...) \
++      CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__)
++#define PROP_CHECK(nm, d, lvl, ...) \
++      CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__)
++#define BATCH_CHECK(nm, lvl, ...) \
++      CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__)
++
++#ifdef __GNUC__
++static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
++#endif
++static inline void check_msg(struct check *c, const char *fmt, ...)
++{
++      va_list ap;
++      va_start(ap, fmt);
++
++      if ((c->level < WARN) || (c->level <= quiet))
++              return; /* Suppress message */
++
++      fprintf(stderr, "%s (%s): ",
++              (c->level == ERROR) ? "ERROR" : "Warning", c->name);
++      vfprintf(stderr, fmt, ap);
++      fprintf(stderr, "\n");
++}
++
++#define FAIL(c, ...) \
++      do { \
++              TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
++              (c)->status = FAILED; \
++              check_msg((c), __VA_ARGS__); \
++      } while (0)
++
++static void check_nodes_props(struct check *c, struct node *dt, struct node *node)
++{
++      struct node *child;
++      struct property *prop;
++
++      TRACE(c, "%s", node->fullpath);
++      if (c->node_fn)
++              c->node_fn(c, dt, node);
++
++      if (c->prop_fn)
++              for_each_property(node, prop) {
++                      TRACE(c, "%s\t'%s'", node->fullpath, prop->name);
++                      c->prop_fn(c, dt, node, prop);
++              }
++
++      for_each_child(node, child)
++              check_nodes_props(c, dt, child);
++}
++
++static int run_check(struct check *c, struct node *dt)
++{
++      int error = 0;
++      int i;
++
++      assert(!c->inprogress);
++
++      if (c->status != UNCHECKED)
++              goto out;
++
++      c->inprogress = 1;
++
++      for (i = 0; i < c->num_prereqs; i++) {
++              struct check *prq = c->prereq[i];
++              error |= run_check(prq, dt);
++              if (prq->status != PASSED) {
++                      c->status = PREREQ;
++                      check_msg(c, "Failed prerequisite '%s'",
++                                c->prereq[i]->name);
++              }
++      }
++
++      if (c->status != UNCHECKED)
++              goto out;
++
++      if (c->node_fn || c->prop_fn)
++              check_nodes_props(c, dt, dt);
++
++      if (c->tree_fn)
++              c->tree_fn(c, dt);
++      if (c->status == UNCHECKED)
++              c->status = PASSED;
++
++      TRACE(c, "\tCompleted, status %d", c->status);
++
++out:
++      c->inprogress = 0;
++      if ((c->status != PASSED) && (c->level == ERROR))
++              error = 1;
++      return error;
++}
++
++/*
++ * Utility check functions
++ */
++
++static void check_is_string(struct check *c, struct node *root,
++                          struct node *node)
++{
++      struct property *prop;
++      char *propname = c->data;
++
++      prop = get_property(node, propname);
++      if (!prop)
++              return; /* Not present, assumed ok */
++
++      if (!data_is_one_string(prop->val))
++              FAIL(c, "\"%s\" property in %s is not a string",
++                   propname, node->fullpath);
++}
++#define CHECK_IS_STRING(nm, propname, lvl) \
++      CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl))
++
++static void check_is_cell(struct check *c, struct node *root,
++                        struct node *node)
++{
++      struct property *prop;
++      char *propname = c->data;
++
++      prop = get_property(node, propname);
++      if (!prop)
++              return; /* Not present, assumed ok */
++
++      if (prop->val.len != sizeof(cell_t))
++              FAIL(c, "\"%s\" property in %s is not a single cell",
++                   propname, node->fullpath);
++}
++#define CHECK_IS_CELL(nm, propname, lvl) \
++      CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl))
++
++/*
++ * Structural check functions
++ */
++
++static void check_duplicate_node_names(struct check *c, struct node *dt,
++                                     struct node *node)
++{
++      struct node *child, *child2;
++
++      for_each_child(node, child)
++              for (child2 = child->next_sibling;
++                   child2;
++                   child2 = child2->next_sibling)
++                      if (streq(child->name, child2->name))
++                              FAIL(c, "Duplicate node name %s",
++                                   child->fullpath);
++}
++NODE_CHECK(duplicate_node_names, NULL, ERROR);
++
++static void check_duplicate_property_names(struct check *c, struct node *dt,
++                                         struct node *node)
++{
++      struct property *prop, *prop2;
++
++      for_each_property(node, prop)
++              for (prop2 = prop->next; prop2; prop2 = prop2->next)
++                      if (streq(prop->name, prop2->name))
++                              FAIL(c, "Duplicate property name %s in %s",
++                                   prop->name, node->fullpath);
++}
++NODE_CHECK(duplicate_property_names, NULL, ERROR);
++
++#define LOWERCASE     "abcdefghijklmnopqrstuvwxyz"
++#define UPPERCASE     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
++#define DIGITS                "0123456789"
++#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-"
++
++static void check_node_name_chars(struct check *c, struct node *dt,
++                                struct node *node)
++{
++      int n = strspn(node->name, c->data);
++
++      if (n < strlen(node->name))
++              FAIL(c, "Bad character '%c' in node %s",
++                   node->name[n], node->fullpath);
++}
++NODE_CHECK(node_name_chars, PROPNODECHARS "@", ERROR);
++
++static void check_node_name_format(struct check *c, struct node *dt,
++                                 struct node *node)
++{
++      if (strchr(get_unitname(node), '@'))
++              FAIL(c, "Node %s has multiple '@' characters in name",
++                   node->fullpath);
++}
++NODE_CHECK(node_name_format, NULL, ERROR, &node_name_chars);
++
++static void check_property_name_chars(struct check *c, struct node *dt,
++                                    struct node *node, struct property *prop)
++{
++      int n = strspn(prop->name, c->data);
++
++      if (n < strlen(prop->name))
++              FAIL(c, "Bad character '%c' in property name \"%s\", node %s",
++                   prop->name[n], prop->name, node->fullpath);
++}
++PROP_CHECK(property_name_chars, PROPNODECHARS, ERROR);
++
++static void check_explicit_phandles(struct check *c, struct node *root,
++                                        struct node *node)
++{
++      struct property *prop;
++      struct node *other;
++      cell_t phandle;
++
++      prop = get_property(node, "linux,phandle");
++      if (! prop)
++              return; /* No phandle, that's fine */
++
++      if (prop->val.len != sizeof(cell_t)) {
++              FAIL(c, "%s has bad length (%d) linux,phandle property",
++                   node->fullpath, prop->val.len);
++              return;
++      }
++
++      phandle = propval_cell(prop);
++      if ((phandle == 0) || (phandle == -1)) {
++              FAIL(c, "%s has invalid linux,phandle value 0x%x",
++                   node->fullpath, phandle);
++              return;
++      }
++
++      other = get_node_by_phandle(root, phandle);
++      if (other) {
++              FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
++                   node->fullpath, phandle, other->fullpath);
++              return;
++      }
++
++      node->phandle = phandle;
++}
++NODE_CHECK(explicit_phandles, NULL, ERROR);
++
++static void check_name_properties(struct check *c, struct node *root,
++                                struct node *node)
++{
++      struct property **pp, *prop = NULL;
++
++      for (pp = &node->proplist; *pp; pp = &((*pp)->next))
++              if (streq((*pp)->name, "name")) {
++                      prop = *pp;
++                      break;
++              }
++
++      if (!prop)
++              return; /* No name property, that's fine */
++
++      if ((prop->val.len != node->basenamelen+1)
++          || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) {
++              FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
++                   " of base node name)", node->fullpath, prop->val.val);
++      } else {
++              /* The name property is correct, and therefore redundant.
++               * Delete it */
++              *pp = prop->next;
++              free(prop->name);
++              data_free(prop->val);
++              free(prop);
++      }
++}
++CHECK_IS_STRING(name_is_string, "name", ERROR);
++NODE_CHECK(name_properties, NULL, ERROR, &name_is_string);
++
++/*
++ * Reference fixup functions
++ */
++
++static void fixup_phandle_references(struct check *c, struct node *dt,
++                                   struct node *node, struct property *prop)
++{
++      struct marker *m = prop->val.markers;
++      struct node *refnode;
++      cell_t phandle;
++
++      for_each_marker_of_type(m, REF_PHANDLE) {
++              assert(m->offset + sizeof(cell_t) <= prop->val.len);
++
++              refnode = get_node_by_ref(dt, m->ref);
++              if (! refnode) {
++                      FAIL(c, "Reference to non-existent node or label \"%s\"\n",
++                           m->ref);
++                      continue;
++              }
++
++              phandle = get_node_phandle(dt, refnode);
++              *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
++      }
++}
++CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR,
++      &duplicate_node_names, &explicit_phandles);
++
++static void fixup_path_references(struct check *c, struct node *dt,
++                                struct node *node, struct property *prop)
++{
++      struct marker *m = prop->val.markers;
++      struct node *refnode;
++      char *path;
++
++      for_each_marker_of_type(m, REF_PATH) {
++              assert(m->offset <= prop->val.len);
++
++              refnode = get_node_by_ref(dt, m->ref);
++              if (!refnode) {
++                      FAIL(c, "Reference to non-existent node or label \"%s\"\n",
++                           m->ref);
++                      continue;
++              }
++
++              path = refnode->fullpath;
++              prop->val = data_insert_at_marker(prop->val, m, path,
++                                                strlen(path) + 1);
++      }
++}
++CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR,
++      &duplicate_node_names);
++
++/*
++ * Semantic checks
++ */
++CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN);
++CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN);
++CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN);
++
++CHECK_IS_STRING(device_type_is_string, "device_type", WARN);
++CHECK_IS_STRING(model_is_string, "model", WARN);
++CHECK_IS_STRING(status_is_string, "status", WARN);
++
++static void fixup_addr_size_cells(struct check *c, struct node *dt,
++                                struct node *node)
++{
++      struct property *prop;
++
++      node->addr_cells = -1;
++      node->size_cells = -1;
++
++      prop = get_property(node, "#address-cells");
++      if (prop)
++              node->addr_cells = propval_cell(prop);
++
++      prop = get_property(node, "#size-cells");
++      if (prop)
++              node->size_cells = propval_cell(prop);
++}
++CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN,
++      &address_cells_is_cell, &size_cells_is_cell);
++
++#define node_addr_cells(n) \
++      (((n)->addr_cells == -1) ? 2 : (n)->addr_cells)
++#define node_size_cells(n) \
++      (((n)->size_cells == -1) ? 1 : (n)->size_cells)
++
++static void check_reg_format(struct check *c, struct node *dt,
++                           struct node *node)
++{
++      struct property *prop;
++      int addr_cells, size_cells, entrylen;
++
++      prop = get_property(node, "reg");
++      if (!prop)
++              return; /* No "reg", that's fine */
++
++      if (!node->parent) {
++              FAIL(c, "Root node has a \"reg\" property");
++              return;
++      }
++
++      if (prop->val.len == 0)
++              FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
++
++      addr_cells = node_addr_cells(node->parent);
++      size_cells = node_size_cells(node->parent);
++      entrylen = (addr_cells + size_cells) * sizeof(cell_t);
++
++      if ((prop->val.len % entrylen) != 0)
++              FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
++                   "(#address-cells == %d, #size-cells == %d)",
++                   node->fullpath, prop->val.len, addr_cells, size_cells);
++}
++NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells);
++
++static void check_ranges_format(struct check *c, struct node *dt,
++                              struct node *node)
++{
++      struct property *prop;
++      int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen;
++
++      prop = get_property(node, "ranges");
++      if (!prop)
++              return;
++
++      if (!node->parent) {
++              FAIL(c, "Root node has a \"ranges\" property");
++              return;
++      }
++
++      p_addr_cells = node_addr_cells(node->parent);
++      p_size_cells = node_size_cells(node->parent);
++      c_addr_cells = node_addr_cells(node);
++      c_size_cells = node_size_cells(node);
++      entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t);
++
++      if (prop->val.len == 0) {
++              if (p_addr_cells != c_addr_cells)
++                      FAIL(c, "%s has empty \"ranges\" property but its "
++                           "#address-cells (%d) differs from %s (%d)",
++                           node->fullpath, c_addr_cells, node->parent->fullpath,
++                           p_addr_cells);
++              if (p_size_cells != c_size_cells)
++                      FAIL(c, "%s has empty \"ranges\" property but its "
++                           "#size-cells (%d) differs from %s (%d)",
++                           node->fullpath, c_size_cells, node->parent->fullpath,
++                           p_size_cells);
++      } else if ((prop->val.len % entrylen) != 0) {
++              FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
++                   "(parent #address-cells == %d, child #address-cells == %d, "
++                   "#size-cells == %d)", node->fullpath, prop->val.len,
++                   p_addr_cells, c_addr_cells, c_size_cells);
++      }
++}
++NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells);
++
++/*
++ * Style checks
++ */
++static void check_avoid_default_addr_size(struct check *c, struct node *dt,
++                                        struct node *node)
++{
++      struct property *reg, *ranges;
++
++      if (!node->parent)
++              return; /* Ignore root node */
++
++      reg = get_property(node, "reg");
++      ranges = get_property(node, "ranges");
++
++      if (!reg && !ranges)
++              return;
++
++      if ((node->parent->addr_cells == -1))
++              FAIL(c, "Relying on default #address-cells value for %s",
++                   node->fullpath);
++
++      if ((node->parent->size_cells == -1))
++              FAIL(c, "Relying on default #size-cells value for %s",
++                   node->fullpath);
++}
++NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells);
++
++static void check_obsolete_chosen_interrupt_controller(struct check *c,
++                                                     struct node *dt)
++{
++      struct node *chosen;
++      struct property *prop;
++
++      chosen = get_node_by_path(dt, "/chosen");
++      if (!chosen)
++              return;
++
++      prop = get_property(chosen, "interrupt-controller");
++      if (prop)
++              FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
++                   "property");
++}
++TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN);
++
++static struct check *check_table[] = {
++      &duplicate_node_names, &duplicate_property_names,
++      &node_name_chars, &node_name_format, &property_name_chars,
++      &name_is_string, &name_properties,
++      &explicit_phandles,
++      &phandle_references, &path_references,
++
++      &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
++      &device_type_is_string, &model_is_string, &status_is_string,
++
++      &addr_size_cells, &reg_format, &ranges_format,
++
++      &avoid_default_addr_size,
++      &obsolete_chosen_interrupt_controller,
++};
++
++void process_checks(int force, struct boot_info *bi)
++{
++      struct node *dt = bi->dt;
++      int i;
++      int error = 0;
++
++      for (i = 0; i < ARRAY_SIZE(check_table); i++) {
++              struct check *c = check_table[i];
++
++              if (c->level != IGNORE)
++                      error = error || run_check(c, dt);
++      }
++
++      if (error) {
++              if (!force) {
++                      fprintf(stderr, "ERROR: Input tree has errors, aborting "
++                              "(use -f to force output)\n");
++                      exit(2);
++              } else if (quiet < 3) {
++                      fprintf(stderr, "Warning: Input tree has errors, "
++                              "output forced\n");
++              }
++      }
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/data.c linux-2.6.30-rc4-git/scripts/dtc/data.c
+--- linux-2.6.30-rc4/scripts/dtc/data.c        1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/data.c    2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,321 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++
++void data_free(struct data d)
++{
++      struct marker *m, *nm;
++
++      m = d.markers;
++      while (m) {
++              nm = m->next;
++              free(m->ref);
++              free(m);
++              m = nm;
++      }
++
++      if (d.val)
++              free(d.val);
++}
++
++struct data data_grow_for(struct data d, int xlen)
++{
++      struct data nd;
++      int newsize;
++
++      if (xlen == 0)
++              return d;
++
++      nd = d;
++
++      newsize = xlen;
++
++      while ((d.len + xlen) > newsize)
++              newsize *= 2;
++
++      nd.val = xrealloc(d.val, newsize);
++
++      return nd;
++}
++
++struct data data_copy_mem(const char *mem, int len)
++{
++      struct data d;
++
++      d = data_grow_for(empty_data, len);
++
++      d.len = len;
++      memcpy(d.val, mem, len);
++
++      return d;
++}
++
++static char get_oct_char(const char *s, int *i)
++{
++      char x[4];
++      char *endx;
++      long val;
++
++      x[3] = '\0';
++      strncpy(x, s + *i, 3);
++
++      val = strtol(x, &endx, 8);
++
++      assert(endx > x);
++
++      (*i) += endx - x;
++      return val;
++}
++
++static char get_hex_char(const char *s, int *i)
++{
++      char x[3];
++      char *endx;
++      long val;
++
++      x[2] = '\0';
++      strncpy(x, s + *i, 2);
++
++      val = strtol(x, &endx, 16);
++      if (!(endx  > x))
++              die("\\x used with no following hex digits\n");
++
++      (*i) += endx - x;
++      return val;
++}
++
++struct data data_copy_escape_string(const char *s, int len)
++{
++      int i = 0;
++      struct data d;
++      char *q;
++
++      d = data_grow_for(empty_data, strlen(s)+1);
++
++      q = d.val;
++      while (i < len) {
++              char c = s[i++];
++
++              if (c != '\\') {
++                      q[d.len++] = c;
++                      continue;
++              }
++
++              c = s[i++];
++              assert(c);
++              switch (c) {
++              case 'a':
++                      q[d.len++] = '\a';
++                      break;
++              case 'b':
++                      q[d.len++] = '\b';
++                      break;
++              case 't':
++                      q[d.len++] = '\t';
++                      break;
++              case 'n':
++                      q[d.len++] = '\n';
++                      break;
++              case 'v':
++                      q[d.len++] = '\v';
++                      break;
++              case 'f':
++                      q[d.len++] = '\f';
++                      break;
++              case 'r':
++                      q[d.len++] = '\r';
++                      break;
++              case '0':
++              case '1':
++              case '2':
++              case '3':
++              case '4':
++              case '5':
++              case '6':
++              case '7':
++                      i--; /* need to re-read the first digit as
++                            * part of the octal value */
++                      q[d.len++] = get_oct_char(s, &i);
++                      break;
++              case 'x':
++                      q[d.len++] = get_hex_char(s, &i);
++                      break;
++              default:
++                      q[d.len++] = c;
++              }
++      }
++
++      q[d.len++] = '\0';
++      return d;
++}
++
++struct data data_copy_file(FILE *f, size_t maxlen)
++{
++      struct data d = empty_data;
++
++      while (!feof(f) && (d.len < maxlen)) {
++              size_t chunksize, ret;
++
++              if (maxlen == -1)
++                      chunksize = 4096;
++              else
++                      chunksize = maxlen - d.len;
++
++              d = data_grow_for(d, chunksize);
++              ret = fread(d.val + d.len, 1, chunksize, f);
++
++              if (ferror(f))
++                      die("Error reading file into data: %s", strerror(errno));
++
++              if (d.len + ret < d.len)
++                      die("Overflow reading file into data\n");
++
++              d.len += ret;
++      }
++
++      return d;
++}
++
++struct data data_append_data(struct data d, const void *p, int len)
++{
++      d = data_grow_for(d, len);
++      memcpy(d.val + d.len, p, len);
++      d.len += len;
++      return d;
++}
++
++struct data data_insert_at_marker(struct data d, struct marker *m,
++                                const void *p, int len)
++{
++      d = data_grow_for(d, len);
++      memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset);
++      memcpy(d.val + m->offset, p, len);
++      d.len += len;
++
++      /* Adjust all markers after the one we're inserting at */
++      m = m->next;
++      for_each_marker(m)
++              m->offset += len;
++      return d;
++}
++
++struct data data_append_markers(struct data d, struct marker *m)
++{
++      struct marker **mp = &d.markers;
++
++      /* Find the end of the markerlist */
++      while (*mp)
++              mp = &((*mp)->next);
++      *mp = m;
++      return d;
++}
++
++struct data data_merge(struct data d1, struct data d2)
++{
++      struct data d;
++      struct marker *m2 = d2.markers;
++
++      d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2);
++
++      /* Adjust for the length of d1 */
++      for_each_marker(m2)
++              m2->offset += d1.len;
++
++      d2.markers = NULL; /* So data_free() doesn't clobber them */
++      data_free(d2);
++
++      return d;
++}
++
++struct data data_append_cell(struct data d, cell_t word)
++{
++      cell_t beword = cpu_to_fdt32(word);
++
++      return data_append_data(d, &beword, sizeof(beword));
++}
++
++struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
++{
++      struct fdt_reserve_entry bere;
++
++      bere.address = cpu_to_fdt64(re->address);
++      bere.size = cpu_to_fdt64(re->size);
++
++      return data_append_data(d, &bere, sizeof(bere));
++}
++
++struct data data_append_addr(struct data d, uint64_t addr)
++{
++      uint64_t beaddr = cpu_to_fdt64(addr);
++
++      return data_append_data(d, &beaddr, sizeof(beaddr));
++}
++
++struct data data_append_byte(struct data d, uint8_t byte)
++{
++      return data_append_data(d, &byte, 1);
++}
++
++struct data data_append_zeroes(struct data d, int len)
++{
++      d = data_grow_for(d, len);
++
++      memset(d.val + d.len, 0, len);
++      d.len += len;
++      return d;
++}
++
++struct data data_append_align(struct data d, int align)
++{
++      int newlen = ALIGN(d.len, align);
++      return data_append_zeroes(d, newlen - d.len);
++}
++
++struct data data_add_marker(struct data d, enum markertype type, char *ref)
++{
++      struct marker *m;
++
++      m = xmalloc(sizeof(*m));
++      m->offset = d.len;
++      m->type = type;
++      m->ref = ref;
++      m->next = NULL;
++
++      return data_append_markers(d, m);
++}
++
++int data_is_one_string(struct data d)
++{
++      int i;
++      int len = d.len;
++
++      if (len == 0)
++              return 0;
++
++      for (i = 0; i < len-1; i++)
++              if (d.val[i] == '\0')
++                      return 0;
++
++      if (d.val[len-1] != '\0')
++              return 0;
++
++      return 1;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc.c linux-2.6.30-rc4-git/scripts/dtc/dtc.c
+--- linux-2.6.30-rc4/scripts/dtc/dtc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc.c     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,226 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++#include "srcpos.h"
++
++#include "version_gen.h"
++
++/*
++ * Command line options
++ */
++int quiet;            /* Level of quietness */
++int reservenum;               /* Number of memory reservation slots */
++int minsize;          /* Minimum blob size */
++int padsize;          /* Additional padding to blob */
++
++char *join_path(const char *path, const char *name)
++{
++      int lenp = strlen(path);
++      int lenn = strlen(name);
++      int len;
++      int needslash = 1;
++      char *str;
++
++      len = lenp + lenn + 2;
++      if ((lenp > 0) && (path[lenp-1] == '/')) {
++              needslash = 0;
++              len--;
++      }
++
++      str = xmalloc(len);
++      memcpy(str, path, lenp);
++      if (needslash) {
++              str[lenp] = '/';
++              lenp++;
++      }
++      memcpy(str+lenp, name, lenn+1);
++      return str;
++}
++
++static void fill_fullpaths(struct node *tree, const char *prefix)
++{
++      struct node *child;
++      const char *unit;
++
++      tree->fullpath = join_path(prefix, tree->name);
++
++      unit = strchr(tree->name, '@');
++      if (unit)
++              tree->basenamelen = unit - tree->name;
++      else
++              tree->basenamelen = strlen(tree->name);
++
++      for_each_child(tree, child)
++              fill_fullpaths(child, tree->fullpath);
++}
++
++static void  __attribute__ ((noreturn)) usage(void)
++{
++      fprintf(stderr, "Usage:\n");
++      fprintf(stderr, "\tdtc [options] <input file>\n");
++      fprintf(stderr, "\nOptions:\n");
++      fprintf(stderr, "\t-h\n");
++      fprintf(stderr, "\t\tThis help text\n");
++      fprintf(stderr, "\t-q\n");
++      fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n");
++      fprintf(stderr, "\t-I <input format>\n");
++      fprintf(stderr, "\t\tInput formats are:\n");
++      fprintf(stderr, "\t\t\tdts - device tree source text\n");
++      fprintf(stderr, "\t\t\tdtb - device tree blob\n");
++      fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n");
++      fprintf(stderr, "\t-o <output file>\n");
++      fprintf(stderr, "\t-O <output format>\n");
++      fprintf(stderr, "\t\tOutput formats are:\n");
++      fprintf(stderr, "\t\t\tdts - device tree source text\n");
++      fprintf(stderr, "\t\t\tdtb - device tree blob\n");
++      fprintf(stderr, "\t\t\tasm - assembler source\n");
++      fprintf(stderr, "\t-V <output version>\n");
++      fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
++      fprintf(stderr, "\t-R <number>\n");
++      fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
++      fprintf(stderr, "\t-S <bytes>\n");
++      fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)\n");
++      fprintf(stderr, "\t-p <bytes>\n");
++      fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)\n");
++      fprintf(stderr, "\t-b <number>\n");
++      fprintf(stderr, "\t\tSet the physical boot cpu\n");
++      fprintf(stderr, "\t-f\n");
++      fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
++      fprintf(stderr, "\t-v\n");
++      fprintf(stderr, "\t\tPrint DTC version and exit\n");
++      exit(3);
++}
++
++int main(int argc, char *argv[])
++{
++      struct boot_info *bi;
++      const char *inform = "dts";
++      const char *outform = "dts";
++      const char *outname = "-";
++      int force = 0, check = 0;
++      const char *arg;
++      int opt;
++      FILE *outf = NULL;
++      int outversion = DEFAULT_FDT_VERSION;
++      long long cmdline_boot_cpuid = -1;
++
++      quiet      = 0;
++      reservenum = 0;
++      minsize    = 0;
++      padsize    = 0;
++
++      while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) {
++              switch (opt) {
++              case 'I':
++                      inform = optarg;
++                      break;
++              case 'O':
++                      outform = optarg;
++                      break;
++              case 'o':
++                      outname = optarg;
++                      break;
++              case 'V':
++                      outversion = strtol(optarg, NULL, 0);
++                      break;
++              case 'R':
++                      reservenum = strtol(optarg, NULL, 0);
++                      break;
++              case 'S':
++                      minsize = strtol(optarg, NULL, 0);
++                      break;
++              case 'p':
++                      padsize = strtol(optarg, NULL, 0);
++                      break;
++              case 'f':
++                      force = 1;
++                      break;
++              case 'c':
++                      check = 1;
++                      break;
++              case 'q':
++                      quiet++;
++                      break;
++              case 'b':
++                      cmdline_boot_cpuid = strtoll(optarg, NULL, 0);
++                      break;
++              case 'v':
++                      printf("Version: %s\n", DTC_VERSION);
++                      exit(0);
++              case 'h':
++              default:
++                      usage();
++              }
++      }
++
++      if (argc > (optind+1))
++              usage();
++      else if (argc < (optind+1))
++              arg = "-";
++      else
++              arg = argv[optind];
++
++      /* minsize and padsize are mutually exclusive */
++      if (minsize && padsize)
++              die("Can't set both -p and -S\n");
++
++      fprintf(stderr, "DTC: %s->%s  on file \"%s\"\n",
++              inform, outform, arg);
++
++      if (streq(inform, "dts"))
++              bi = dt_from_source(arg);
++      else if (streq(inform, "fs"))
++              bi = dt_from_fs(arg);
++      else if(streq(inform, "dtb"))
++              bi = dt_from_blob(arg);
++      else
++              die("Unknown input format \"%s\"\n", inform);
++
++      if (cmdline_boot_cpuid != -1)
++              bi->boot_cpuid_phys = cmdline_boot_cpuid;
++
++      fill_fullpaths(bi->dt, "");
++      process_checks(force, bi);
++
++
++      if (streq(outname, "-")) {
++              outf = stdout;
++      } else {
++              outf = fopen(outname, "w");
++              if (! outf)
++                      die("Couldn't open output file %s: %s\n",
++                          outname, strerror(errno));
++      }
++
++      if (streq(outform, "dts")) {
++              dt_to_source(outf, bi);
++      } else if (streq(outform, "dtb")) {
++              dt_to_blob(outf, bi, outversion);
++      } else if (streq(outform, "asm")) {
++              dt_to_asm(outf, bi, outversion);
++      } else if (streq(outform, "null")) {
++              /* do nothing */
++      } else {
++              die("Unknown output format \"%s\"\n", outform);
++      }
++
++      exit(0);
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc.h linux-2.6.30-rc4-git/scripts/dtc/dtc.h
+--- linux-2.6.30-rc4/scripts/dtc/dtc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc.h     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,246 @@
++#ifndef _DTC_H
++#define _DTC_H
++
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <stdint.h>
++#include <stdarg.h>
++#include <assert.h>
++#include <ctype.h>
++#include <errno.h>
++#include <unistd.h>
++
++#include <libfdt_env.h>
++#include <fdt.h>
++
++#define DEFAULT_FDT_VERSION   17
++/*
++ * Command line options
++ */
++extern int quiet;             /* Level of quietness */
++extern int reservenum;                /* Number of memory reservation slots */
++extern int minsize;           /* Minimum blob size */
++extern int padsize;           /* Additional padding to blob */
++
++static inline void __attribute__((noreturn)) die(char * str, ...)
++{
++      va_list ap;
++
++      va_start(ap, str);
++      fprintf(stderr, "FATAL ERROR: ");
++      vfprintf(stderr, str, ap);
++      exit(1);
++}
++
++static inline void *xmalloc(size_t len)
++{
++      void *new = malloc(len);
++
++      if (! new)
++              die("malloc() failed\n");
++
++      return new;
++}
++
++static inline void *xrealloc(void *p, size_t len)
++{
++      void *new = realloc(p, len);
++
++      if (! new)
++              die("realloc() failed (len=%d)\n", len);
++
++      return new;
++}
++
++typedef uint32_t cell_t;
++
++
++#define streq(a, b)   (strcmp((a), (b)) == 0)
++#define strneq(a, b, n)       (strncmp((a), (b), (n)) == 0)
++
++#define ALIGN(x, a)   (((x) + (a) - 1) & ~((a) - 1))
++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
++
++/* Data blobs */
++enum markertype {
++      REF_PHANDLE,
++      REF_PATH,
++      LABEL,
++};
++
++struct  marker {
++      enum markertype type;
++      int offset;
++      char *ref;
++      struct marker *next;
++};
++
++struct data {
++      int len;
++      char *val;
++      struct marker *markers;
++};
++
++
++#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
++
++#define for_each_marker(m) \
++      for (; (m); (m) = (m)->next)
++#define for_each_marker_of_type(m, t) \
++      for_each_marker(m) \
++              if ((m)->type == (t))
++
++void data_free(struct data d);
++
++struct data data_grow_for(struct data d, int xlen);
++
++struct data data_copy_mem(const char *mem, int len);
++struct data data_copy_escape_string(const char *s, int len);
++struct data data_copy_file(FILE *f, size_t len);
++
++struct data data_append_data(struct data d, const void *p, int len);
++struct data data_insert_at_marker(struct data d, struct marker *m,
++                                const void *p, int len);
++struct data data_merge(struct data d1, struct data d2);
++struct data data_append_cell(struct data d, cell_t word);
++struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
++struct data data_append_addr(struct data d, uint64_t addr);
++struct data data_append_byte(struct data d, uint8_t byte);
++struct data data_append_zeroes(struct data d, int len);
++struct data data_append_align(struct data d, int align);
++
++struct data data_add_marker(struct data d, enum markertype type, char *ref);
++
++int data_is_one_string(struct data d);
++
++/* DT constraints */
++
++#define MAX_PROPNAME_LEN      31
++#define MAX_NODENAME_LEN      31
++
++/* Live trees */
++struct property {
++      char *name;
++      struct data val;
++
++      struct property *next;
++
++      char *label;
++};
++
++struct node {
++      char *name;
++      struct property *proplist;
++      struct node *children;
++
++      struct node *parent;
++      struct node *next_sibling;
++
++      char *fullpath;
++      int basenamelen;
++
++      cell_t phandle;
++      int addr_cells, size_cells;
++
++      char *label;
++};
++
++#define for_each_property(n, p) \
++      for ((p) = (n)->proplist; (p); (p) = (p)->next)
++
++#define for_each_child(n, c)  \
++      for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
++
++struct property *build_property(char *name, struct data val, char *label);
++struct property *chain_property(struct property *first, struct property *list);
++struct property *reverse_properties(struct property *first);
++
++struct node *build_node(struct property *proplist, struct node *children);
++struct node *name_node(struct node *node, char *name, char *label);
++struct node *chain_node(struct node *first, struct node *list);
++
++void add_property(struct node *node, struct property *prop);
++void add_child(struct node *parent, struct node *child);
++
++const char *get_unitname(struct node *node);
++struct property *get_property(struct node *node, const char *propname);
++cell_t propval_cell(struct property *prop);
++struct node *get_subnode(struct node *node, const char *nodename);
++struct node *get_node_by_path(struct node *tree, const char *path);
++struct node *get_node_by_label(struct node *tree, const char *label);
++struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
++struct node *get_node_by_ref(struct node *tree, const char *ref);
++cell_t get_node_phandle(struct node *root, struct node *node);
++
++/* Boot info (tree plus memreserve information */
++
++struct reserve_info {
++      struct fdt_reserve_entry re;
++
++      struct reserve_info *next;
++
++      char *label;
++};
++
++struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label);
++struct reserve_info *chain_reserve_entry(struct reserve_info *first,
++                                       struct reserve_info *list);
++struct reserve_info *add_reserve_entry(struct reserve_info *list,
++                                     struct reserve_info *new);
++
++
++struct boot_info {
++      struct reserve_info *reservelist;
++      struct node *dt;                /* the device tree */
++      uint32_t boot_cpuid_phys;
++};
++
++struct boot_info *build_boot_info(struct reserve_info *reservelist,
++                                struct node *tree, uint32_t boot_cpuid_phys);
++
++/* Checks */
++
++void process_checks(int force, struct boot_info *bi);
++
++/* Flattened trees */
++
++void dt_to_blob(FILE *f, struct boot_info *bi, int version);
++void dt_to_asm(FILE *f, struct boot_info *bi, int version);
++
++struct boot_info *dt_from_blob(const char *fname);
++
++/* Tree source */
++
++void dt_to_source(FILE *f, struct boot_info *bi);
++struct boot_info *dt_from_source(const char *f);
++
++/* FS trees */
++
++struct boot_info *dt_from_fs(const char *dirname);
++
++/* misc */
++
++char *join_path(const char *path, const char *name);
++
++#endif /* _DTC_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc-lexer.l linux-2.6.30-rc4-git/scripts/dtc/dtc-lexer.l
+--- linux-2.6.30-rc4/scripts/dtc/dtc-lexer.l   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc-lexer.l       2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,320 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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
++ */
++
++%option noyywrap nounput yylineno
++
++%x INCLUDE
++%x BYTESTRING
++%x PROPNODENAME
++%s V1
++
++PROPNODECHAR  [a-zA-Z0-9,._+*#?@-]
++PATHCHAR      ({PROPNODECHAR}|[/])
++LABEL         [a-zA-Z_][a-zA-Z0-9_]*
++STRING                \"([^\\"]|\\.)*\"
++WS            [[:space:]]
++COMMENT               "/*"([^*]|\*+[^*/])*\*+"/"
++LINECOMMENT   "//".*\n
++
++%{
++#include "dtc.h"
++#include "srcpos.h"
++#include "dtc-parser.tab.h"
++
++
++/*#define LEXDEBUG    1*/
++
++#ifdef LEXDEBUG
++#define DPRINT(fmt, ...)      fprintf(stderr, fmt, ##__VA_ARGS__)
++#else
++#define DPRINT(fmt, ...)      do { } while (0)
++#endif
++
++static int dts_version; /* = 0 */
++
++#define BEGIN_DEFAULT()       if (dts_version == 0) { \
++                              DPRINT("<INITIAL>\n"); \
++                              BEGIN(INITIAL); \
++                      } else { \
++                              DPRINT("<V1>\n"); \
++                              BEGIN(V1); \
++                      }
++
++static void push_input_file(const char *filename);
++static int pop_input_file(void);
++%}
++
++%%
++<*>"/include/"{WS}*{STRING} {
++                      char *name = strchr(yytext, '\"') + 1;
++                      yytext[yyleng-1] = '\0';
++                      push_input_file(name);
++              }
++
++<*><<EOF>>            {
++                      if (!pop_input_file()) {
++                              yyterminate();
++                      }
++              }
++
++<*>{STRING}   {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("String: %s\n", yytext);
++                      yylval.data = data_copy_escape_string(yytext+1,
++                                      yyleng-2);
++                      yylloc.first_line = yylineno;
++                      return DT_STRING;
++              }
++
++<*>"/dts-v1/" {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Keyword: /dts-v1/\n");
++                      dts_version = 1;
++                      BEGIN_DEFAULT();
++                      return DT_V1;
++              }
++
++<*>"/memreserve/"     {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Keyword: /memreserve/\n");
++                      BEGIN_DEFAULT();
++                      return DT_MEMRESERVE;
++              }
++
++<*>{LABEL}:   {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Label: %s\n", yytext);
++                      yylval.labelref = strdup(yytext);
++                      yylval.labelref[yyleng-1] = '\0';
++                      return DT_LABEL;
++              }
++
++<INITIAL>[bodh]# {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      if (*yytext == 'b')
++                              yylval.cbase = 2;
++                      else if (*yytext == 'o')
++                              yylval.cbase = 8;
++                      else if (*yytext == 'd')
++                              yylval.cbase = 10;
++                      else
++                              yylval.cbase = 16;
++                      DPRINT("Base: %d\n", yylval.cbase);
++                      return DT_BASE;
++              }
++
++<INITIAL>[0-9a-fA-F]+ {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.literal = strdup(yytext);
++                      DPRINT("Literal: '%s'\n", yylval.literal);
++                      return DT_LEGACYLITERAL;
++              }
++
++<V1>[0-9]+|0[xX][0-9a-fA-F]+      {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.literal = strdup(yytext);
++                      DPRINT("Literal: '%s'\n", yylval.literal);
++                      return DT_LITERAL;
++              }
++
++\&{LABEL}     {       /* label reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Ref: %s\n", yytext+1);
++                      yylval.labelref = strdup(yytext+1);
++                      return DT_REF;
++              }
++
++"&{/"{PATHCHAR}+\}    {       /* new-style path reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yytext[yyleng-1] = '\0';
++                      DPRINT("Ref: %s\n", yytext+2);
++                      yylval.labelref = strdup(yytext+2);
++                      return DT_REF;
++              }
++
++<INITIAL>"&/"{PATHCHAR}+ {    /* old-style path reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Ref: %s\n", yytext+1);
++                      yylval.labelref = strdup(yytext+1);
++                      return DT_REF;
++              }
++
++<BYTESTRING>[0-9a-fA-F]{2} {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.byte = strtol(yytext, NULL, 16);
++                      DPRINT("Byte: %02x\n", (int)yylval.byte);
++                      return DT_BYTE;
++              }
++
++<BYTESTRING>"]"       {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("/BYTESTRING\n");
++                      BEGIN_DEFAULT();
++                      return ']';
++              }
++
++<PROPNODENAME>{PROPNODECHAR}+ {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("PropNodeName: %s\n", yytext);
++                      yylval.propnodename = strdup(yytext);
++                      BEGIN_DEFAULT();
++                      return DT_PROPNODENAME;
++              }
++
++"/incbin/"    {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Binary Include\n");
++                      return DT_INCBIN;
++              }
++
++<*>{WS}+      /* eat whitespace */
++<*>{COMMENT}+ /* eat C-style comments */
++<*>{LINECOMMENT}+ /* eat C++-style comments */
++
++<*>.          {
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Char: %c (\\x%02x)\n", yytext[0],
++                              (unsigned)yytext[0]);
++                      if (yytext[0] == '[') {
++                              DPRINT("<BYTESTRING>\n");
++                              BEGIN(BYTESTRING);
++                      }
++                      if ((yytext[0] == '{')
++                          || (yytext[0] == ';')) {
++                              DPRINT("<PROPNODENAME>\n");
++                              BEGIN(PROPNODENAME);
++                      }
++                      return yytext[0];
++              }
++
++%%
++
++
++/*
++ * Stack of nested include file contexts.
++ */
++
++struct incl_file {
++      struct dtc_file *file;
++      YY_BUFFER_STATE yy_prev_buf;
++      int yy_prev_lineno;
++      struct incl_file *prev;
++};
++
++static struct incl_file *incl_file_stack;
++
++
++/*
++ * Detect infinite include recursion.
++ */
++#define MAX_INCLUDE_DEPTH     (100)
++
++static int incl_depth = 0;
++
++
++static void push_input_file(const char *filename)
++{
++      struct incl_file *incl_file;
++      struct dtc_file *newfile;
++      struct search_path search, *searchptr = NULL;
++
++      assert(filename);
++
++      if (incl_depth++ >= MAX_INCLUDE_DEPTH)
++              die("Includes nested too deeply");
++
++      if (srcpos_file) {
++              search.dir = srcpos_file->dir;
++              search.next = NULL;
++              search.prev = NULL;
++              searchptr = &search;
++      }
++
++      newfile = dtc_open_file(filename, searchptr);
++
++      incl_file = xmalloc(sizeof(struct incl_file));
++
++      /*
++       * Save current context.
++       */
++      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
++      incl_file->yy_prev_lineno = yylineno;
++      incl_file->file = srcpos_file;
++      incl_file->prev = incl_file_stack;
++
++      incl_file_stack = incl_file;
++
++      /*
++       * Establish new context.
++       */
++      srcpos_file = newfile;
++      yylineno = 1;
++      yyin = newfile->file;
++      yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
++}
++
++
++static int pop_input_file(void)
++{
++      struct incl_file *incl_file;
++
++      if (incl_file_stack == 0)
++              return 0;
++
++      dtc_close_file(srcpos_file);
++
++      /*
++       * Pop.
++       */
++      --incl_depth;
++      incl_file = incl_file_stack;
++      incl_file_stack = incl_file->prev;
++
++      /*
++       * Recover old context.
++       */
++      yy_delete_buffer(YY_CURRENT_BUFFER);
++      yy_switch_to_buffer(incl_file->yy_prev_buf);
++      yylineno = incl_file->yy_prev_lineno;
++      srcpos_file = incl_file->file;
++      yyin = incl_file->file ? incl_file->file->file : NULL;
++
++      /*
++       * Free old state.
++       */
++      free(incl_file);
++
++      return 1;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc-lexer.lex.c_shipped linux-2.6.30-rc4-git/scripts/dtc/dtc-lexer.lex.c_shipped
+--- linux-2.6.30-rc4/scripts/dtc/dtc-lexer.lex.c_shipped       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc-lexer.lex.c_shipped   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,2187 @@
++#line 2 "dtc-lexer.lex.c"
++
++#line 4 "dtc-lexer.lex.c"
++
++#define  YY_INT_ALIGNED short int
++
++/* A lexical scanner generated by flex */
++
++#define FLEX_SCANNER
++#define YY_FLEX_MAJOR_VERSION 2
++#define YY_FLEX_MINOR_VERSION 5
++#define YY_FLEX_SUBMINOR_VERSION 34
++#if YY_FLEX_SUBMINOR_VERSION > 0
++#define FLEX_BETA
++#endif
++
++/* First, we deal with  platform-specific or compiler-specific issues. */
++
++/* begin standard C headers. */
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <stdlib.h>
++
++/* end standard C headers. */
++
++/* flex integer type definitions */
++
++#ifndef FLEXINT_H
++#define FLEXINT_H
++
++/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
++
++#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
++
++/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
++ * if you want the limit (max/min) macros for int types. 
++ */
++#ifndef __STDC_LIMIT_MACROS
++#define __STDC_LIMIT_MACROS 1
++#endif
++
++#include <inttypes.h>
++typedef int8_t flex_int8_t;
++typedef uint8_t flex_uint8_t;
++typedef int16_t flex_int16_t;
++typedef uint16_t flex_uint16_t;
++typedef int32_t flex_int32_t;
++typedef uint32_t flex_uint32_t;
++#else
++typedef signed char flex_int8_t;
++typedef short int flex_int16_t;
++typedef int flex_int32_t;
++typedef unsigned char flex_uint8_t; 
++typedef unsigned short int flex_uint16_t;
++typedef unsigned int flex_uint32_t;
++#endif /* ! C99 */
++
++/* Limits of integral types. */
++#ifndef INT8_MIN
++#define INT8_MIN               (-128)
++#endif
++#ifndef INT16_MIN
++#define INT16_MIN              (-32767-1)
++#endif
++#ifndef INT32_MIN
++#define INT32_MIN              (-2147483647-1)
++#endif
++#ifndef INT8_MAX
++#define INT8_MAX               (127)
++#endif
++#ifndef INT16_MAX
++#define INT16_MAX              (32767)
++#endif
++#ifndef INT32_MAX
++#define INT32_MAX              (2147483647)
++#endif
++#ifndef UINT8_MAX
++#define UINT8_MAX              (255U)
++#endif
++#ifndef UINT16_MAX
++#define UINT16_MAX             (65535U)
++#endif
++#ifndef UINT32_MAX
++#define UINT32_MAX             (4294967295U)
++#endif
++
++#endif /* ! FLEXINT_H */
++
++#ifdef __cplusplus
++
++/* The "const" storage-class-modifier is valid. */
++#define YY_USE_CONST
++
++#else /* ! __cplusplus */
++
++/* C99 requires __STDC__ to be defined as 1. */
++#if defined (__STDC__)
++
++#define YY_USE_CONST
++
++#endif        /* defined (__STDC__) */
++#endif        /* ! __cplusplus */
++
++#ifdef YY_USE_CONST
++#define yyconst const
++#else
++#define yyconst
++#endif
++
++/* Returned upon end-of-file. */
++#define YY_NULL 0
++
++/* Promotes a possibly negative, possibly signed char to an unsigned
++ * integer for use as an array index.  If the signed char is negative,
++ * we want to instead treat it as an 8-bit unsigned char, hence the
++ * double cast.
++ */
++#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
++
++/* Enter a start condition.  This macro really ought to take a parameter,
++ * but we do it the disgusting crufty way forced on us by the ()-less
++ * definition of BEGIN.
++ */
++#define BEGIN (yy_start) = 1 + 2 *
++
++/* Translate the current start state into a value that can be later handed
++ * to BEGIN to return to the state.  The YYSTATE alias is for lex
++ * compatibility.
++ */
++#define YY_START (((yy_start) - 1) / 2)
++#define YYSTATE YY_START
++
++/* Action number for EOF rule of a given start state. */
++#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
++
++/* Special action meaning "start processing a new file". */
++#define YY_NEW_FILE yyrestart(yyin  )
++
++#define YY_END_OF_BUFFER_CHAR 0
++
++/* Size of default input buffer. */
++#ifndef YY_BUF_SIZE
++#define YY_BUF_SIZE 16384
++#endif
++
++/* The state buf must be large enough to hold one state per character in the main buffer.
++ */
++#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
++
++#ifndef YY_TYPEDEF_YY_BUFFER_STATE
++#define YY_TYPEDEF_YY_BUFFER_STATE
++typedef struct yy_buffer_state *YY_BUFFER_STATE;
++#endif
++
++extern int yyleng;
++
++extern FILE *yyin, *yyout;
++
++#define EOB_ACT_CONTINUE_SCAN 0
++#define EOB_ACT_END_OF_FILE 1
++#define EOB_ACT_LAST_MATCH 2
++
++    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
++     *       access to the local variable yy_act. Since yyless() is a macro, it would break
++     *       existing scanners that call yyless() from OUTSIDE yylex. 
++     *       One obvious solution it to make yy_act a global. I tried that, and saw
++     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
++     *       normally declared as a register variable-- so it is not worth it.
++     */
++    #define  YY_LESS_LINENO(n) \
++            do { \
++                int yyl;\
++                for ( yyl = n; yyl < yyleng; ++yyl )\
++                    if ( yytext[yyl] == '\n' )\
++                        --yylineno;\
++            }while(0)
++    
++/* Return all but the first "n" matched characters back to the input stream. */
++#define yyless(n) \
++      do \
++              { \
++              /* Undo effects of setting up yytext. */ \
++        int yyless_macro_arg = (n); \
++        YY_LESS_LINENO(yyless_macro_arg);\
++              *yy_cp = (yy_hold_char); \
++              YY_RESTORE_YY_MORE_OFFSET \
++              (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
++              YY_DO_BEFORE_ACTION; /* set up yytext again */ \
++              } \
++      while ( 0 )
++
++#define unput(c) yyunput( c, (yytext_ptr)  )
++
++/* The following is because we cannot portably get our hands on size_t
++ * (without autoconf's help, which isn't available because we want
++ * flex-generated scanners to compile on their own).
++ * Given that the standard has decreed that size_t exists since 1989,
++ * I guess we can afford to depend on it. Manoj.
++ */
++
++#ifndef YY_TYPEDEF_YY_SIZE_T
++#define YY_TYPEDEF_YY_SIZE_T
++typedef size_t yy_size_t;
++#endif
++
++#ifndef YY_STRUCT_YY_BUFFER_STATE
++#define YY_STRUCT_YY_BUFFER_STATE
++struct yy_buffer_state
++      {
++      FILE *yy_input_file;
++
++      char *yy_ch_buf;                /* input buffer */
++      char *yy_buf_pos;               /* current position in input buffer */
++
++      /* Size of input buffer in bytes, not including room for EOB
++       * characters.
++       */
++      yy_size_t yy_buf_size;
++
++      /* Number of characters read into yy_ch_buf, not including EOB
++       * characters.
++       */
++      int yy_n_chars;
++
++      /* Whether we "own" the buffer - i.e., we know we created it,
++       * and can realloc() it to grow it, and should free() it to
++       * delete it.
++       */
++      int yy_is_our_buffer;
++
++      /* Whether this is an "interactive" input source; if so, and
++       * if we're using stdio for input, then we want to use getc()
++       * instead of fread(), to make sure we stop fetching input after
++       * each newline.
++       */
++      int yy_is_interactive;
++
++      /* Whether we're considered to be at the beginning of a line.
++       * If so, '^' rules will be active on the next match, otherwise
++       * not.
++       */
++      int yy_at_bol;
++
++    int yy_bs_lineno; /**< The line count. */
++    int yy_bs_column; /**< The column count. */
++    
++      /* Whether to try to fill the input buffer when we reach the
++       * end of it.
++       */
++      int yy_fill_buffer;
++
++      int yy_buffer_status;
++
++#define YY_BUFFER_NEW 0
++#define YY_BUFFER_NORMAL 1
++      /* When an EOF's been seen but there's still some text to process
++       * then we mark the buffer as YY_EOF_PENDING, to indicate that we
++       * shouldn't try reading from the input source any more.  We might
++       * still have a bunch of tokens to match, though, because of
++       * possible backing-up.
++       *
++       * When we actually see the EOF, we change the status to "new"
++       * (via yyrestart()), so that the user can continue scanning by
++       * just pointing yyin at a new input file.
++       */
++#define YY_BUFFER_EOF_PENDING 2
++
++      };
++#endif /* !YY_STRUCT_YY_BUFFER_STATE */
++
++/* Stack of input buffers. */
++static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
++static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
++static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
++
++/* We provide macros for accessing buffer states in case in the
++ * future we want to put the buffer states in a more general
++ * "scanner state".
++ *
++ * Returns the top of the stack, or NULL.
++ */
++#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
++                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
++                          : NULL)
++
++/* Same as previous macro, but useful when we know that the buffer stack is not
++ * NULL or when we need an lvalue. For internal use only.
++ */
++#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
++
++/* yy_hold_char holds the character lost when yytext is formed. */
++static char yy_hold_char;
++static int yy_n_chars;                /* number of characters read into yy_ch_buf */
++int yyleng;
++
++/* Points to current character in buffer. */
++static char *yy_c_buf_p = (char *) 0;
++static int yy_init = 0;               /* whether we need to initialize */
++static int yy_start = 0;      /* start state number */
++
++/* Flag which is used to allow yywrap()'s to do buffer switches
++ * instead of setting up a fresh yyin.  A bit of a hack ...
++ */
++static int yy_did_buffer_switch_on_eof;
++
++void yyrestart (FILE *input_file  );
++void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
++YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
++void yy_delete_buffer (YY_BUFFER_STATE b  );
++void yy_flush_buffer (YY_BUFFER_STATE b  );
++void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
++void yypop_buffer_state (void );
++
++static void yyensure_buffer_stack (void );
++static void yy_load_buffer_state (void );
++static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
++
++#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
++
++YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
++YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
++YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
++
++void *yyalloc (yy_size_t  );
++void *yyrealloc (void *,yy_size_t  );
++void yyfree (void *  );
++
++#define yy_new_buffer yy_create_buffer
++
++#define yy_set_interactive(is_interactive) \
++      { \
++      if ( ! YY_CURRENT_BUFFER ){ \
++        yyensure_buffer_stack (); \
++              YY_CURRENT_BUFFER_LVALUE =    \
++            yy_create_buffer(yyin,YY_BUF_SIZE ); \
++      } \
++      YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
++      }
++
++#define yy_set_bol(at_bol) \
++      { \
++      if ( ! YY_CURRENT_BUFFER ){\
++        yyensure_buffer_stack (); \
++              YY_CURRENT_BUFFER_LVALUE =    \
++            yy_create_buffer(yyin,YY_BUF_SIZE ); \
++      } \
++      YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
++      }
++
++#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
++
++/* Begin user sect3 */
++
++#define yywrap(n) 1
++#define YY_SKIP_YYWRAP
++
++typedef unsigned char YY_CHAR;
++
++FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
++
++typedef int yy_state_type;
++
++extern int yylineno;
++
++int yylineno = 1;
++
++extern char *yytext;
++#define yytext_ptr yytext
++
++static yy_state_type yy_get_previous_state (void );
++static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
++static int yy_get_next_buffer (void );
++static void yy_fatal_error (yyconst char msg[]  );
++
++/* Done after the current pattern has been matched and before the
++ * corresponding action - sets up yytext.
++ */
++#define YY_DO_BEFORE_ACTION \
++      (yytext_ptr) = yy_bp; \
++      yyleng = (size_t) (yy_cp - yy_bp); \
++      (yy_hold_char) = *yy_cp; \
++      *yy_cp = '\0'; \
++      (yy_c_buf_p) = yy_cp;
++
++#define YY_NUM_RULES 20
++#define YY_END_OF_BUFFER 21
++/* This struct is not used in this scanner,
++   but its presence is necessary. */
++struct yy_trans_info
++      {
++      flex_int32_t yy_verify;
++      flex_int32_t yy_nxt;
++      };
++static yyconst flex_int16_t yy_accept[104] =
++    {   0,
++        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
++       21,   19,   16,   16,   19,   19,   19,    7,    7,   19,
++        7,   19,   19,   19,   19,   13,   14,   14,   19,    8,
++        8,   16,    0,    2,    0,    0,    9,    0,    0,    0,
++        0,    0,    0,    7,    7,    5,    0,    6,    0,   12,
++       12,   14,   14,    8,    0,   11,    9,    0,    0,    0,
++        0,   18,    0,    0,    0,    0,    8,    0,   17,    0,
++        0,    0,    0,    0,   10,    0,    0,    0,    0,    0,
++        0,    0,    0,    0,    0,    0,    0,    0,    3,   15,
++        0,    0,    0,    0,    0,    0,    0,    0,    1,    0,
++
++        0,    4,    0
++    } ;
++
++static yyconst flex_int32_t yy_ec[256] =
++    {   0,
++        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
++        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    2,    1,    4,    5,    1,    1,    6,    1,    1,
++        1,    7,    8,    8,    9,    8,   10,   11,   12,   13,
++       13,   13,   13,   13,   13,   13,   13,   14,    1,    1,
++        1,    1,    8,    8,   15,   15,   15,   15,   15,   15,
++       16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
++       16,   16,   16,   16,   16,   16,   16,   17,   16,   16,
++        1,   18,   19,    1,   16,    1,   15,   20,   21,   22,
++
++       23,   15,   16,   24,   25,   16,   16,   26,   27,   28,
++       24,   16,   16,   29,   30,   31,   32,   33,   16,   17,
++       16,   16,   34,    1,   35,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1
++    } ;
++
++static yyconst flex_int32_t yy_meta[36] =
++    {   0,
++        1,    1,    1,    1,    2,    1,    2,    2,    2,    3,
++        4,    4,    4,    5,    6,    7,    7,    1,    1,    6,
++        6,    6,    6,    7,    7,    7,    7,    7,    7,    7,
++        7,    7,    7,    8,    1
++    } ;
++
++static yyconst flex_int16_t yy_base[117] =
++    {   0,
++        0,    0,   30,    0,   44,    0,   67,    0,   97,  105,
++      302,  303,   35,   44,   40,   94,  112,    0,  129,  152,
++      296,  295,  159,    0,  176,  303,    0,  116,   95,  165,
++       49,   46,  102,  303,  296,    0,    0,  288,  290,  293,
++      264,  266,  270,    0,    0,  303,    0,  303,  264,  303,
++        0,    0,  195,  101,    0,    0,    0,    0,  284,  125,
++      277,  265,  225,  230,  216,  218,    0,  202,  224,  221,
++      217,  107,  196,  188,  303,  206,  179,  186,  178,  185,
++      183,  162,  161,  150,  169,  160,  145,  125,  303,  303,
++      137,  109,  190,  103,  203,  167,  108,  197,  303,  123,
++
++       29,  303,  303,  215,  221,  226,  229,  234,  240,  246,
++      250,  257,  265,  270,  275,  282
++    } ;
++
++static yyconst flex_int16_t yy_def[117] =
++    {   0,
++      103,    1,    1,    3,    3,    5,  103,    7,    3,    3,
++      103,  103,  103,  103,  104,  105,  103,  106,  103,   19,
++       19,   20,  103,  107,   20,  103,  108,  109,  105,  103,
++      103,  103,  104,  103,  104,  110,  111,  103,  112,  113,
++      103,  103,  103,  106,   19,  103,   20,  103,  103,  103,
++       20,  108,  109,  103,  114,  110,  111,  115,  112,  112,
++      113,  103,  103,  103,  103,  103,  114,  115,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  116,  103,  116,  103,  116,
++
++      103,  103,    0,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103
++    } ;
++
++static yyconst flex_int16_t yy_nxt[339] =
++    {   0,
++       12,   13,   14,   15,   12,   16,   12,   12,   12,   17,
++       18,   18,   18,   12,   19,   20,   20,   12,   12,   21,
++       19,   21,   19,   22,   20,   20,   20,   20,   20,   20,
++       20,   20,   20,   12,   12,   12,   32,   32,  102,   23,
++       12,   12,   12,   34,   20,   32,   32,   32,   32,   20,
++       20,   20,   20,   20,   24,   24,   24,   35,   25,   54,
++       54,   54,   26,   25,   25,   25,   25,   12,   13,   14,
++       15,   27,   12,   27,   27,   27,   23,   27,   27,   27,
++       12,   28,   28,   28,   12,   12,   28,   28,   28,   28,
++       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
++
++       12,   12,   29,   36,  103,   34,   17,   30,   31,   31,
++       29,   54,   54,   54,   17,   30,   31,   31,   39,   35,
++       52,   40,   52,   52,   52,  103,   78,   38,   38,   46,
++      101,   60,   79,   41,   69,   97,   42,   94,   43,   45,
++       45,   45,   46,   45,   47,   47,   93,   92,   45,   45,
++       45,   45,   47,   47,   47,   47,   47,   47,   47,   47,
++       47,   47,   47,   47,   47,   39,   47,   91,   40,   90,
++       99,   47,   47,   47,   47,   54,   54,   54,   89,   88,
++       41,   55,   87,   49,  100,   43,   51,   51,   51,   86,
++       51,   95,   95,   96,   85,   51,   51,   51,   51,   52,
++
++       99,   52,   52,   52,   95,   95,   96,   84,   46,   83,
++       82,   81,   39,   79,  100,   33,   33,   33,   33,   33,
++       33,   33,   33,   37,   80,   77,   37,   37,   37,   44,
++       40,   44,   50,   76,   50,   52,   75,   52,   74,   52,
++       52,   53,   73,   53,   53,   53,   53,   56,   56,   56,
++       72,   56,   56,   57,   71,   57,   57,   59,   59,   59,
++       59,   59,   59,   59,   59,   61,   61,   61,   61,   61,
++       61,   61,   61,   67,   70,   67,   68,   68,   68,   62,
++       68,   68,   98,   98,   98,   98,   98,   98,   98,   98,
++       60,   66,   65,   64,   63,   62,   60,   58,  103,   48,
++
++       48,  103,   11,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103
++    } ;
++
++static yyconst flex_int16_t yy_chk[339] =
++    {   0,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
++        1,    1,    1,    1,    1,    3,   13,   13,  101,    3,
++        3,    3,    3,   15,    3,   14,   14,   32,   32,    3,
++        3,    3,    3,    3,    5,    5,    5,   15,    5,   31,
++       31,   31,    5,    5,    5,    5,    5,    7,    7,    7,
++        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
++        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
++        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
++
++        7,    7,    9,   16,   29,   33,    9,    9,    9,    9,
++       10,   54,   54,   54,   10,   10,   10,   10,   17,   33,
++       28,   17,   28,   28,   28,  100,   72,   16,   29,   28,
++       97,   60,   72,   17,   60,   94,   17,   92,   17,   19,
++       19,   19,   19,   19,   19,   19,   91,   88,   19,   19,
++       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
++       19,   19,   20,   20,   20,   23,   20,   87,   23,   86,
++       96,   20,   20,   20,   20,   30,   30,   30,   85,   84,
++       23,   30,   83,   23,   96,   23,   25,   25,   25,   82,
++       25,   93,   93,   93,   81,   25,   25,   25,   25,   53,
++
++       98,   53,   53,   53,   95,   95,   95,   80,   53,   79,
++       78,   77,   76,   74,   98,  104,  104,  104,  104,  104,
++      104,  104,  104,  105,   73,   71,  105,  105,  105,  106,
++       70,  106,  107,   69,  107,  108,   68,  108,   66,  108,
++      108,  109,   65,  109,  109,  109,  109,  110,  110,  110,
++       64,  110,  110,  111,   63,  111,  111,  112,  112,  112,
++      112,  112,  112,  112,  112,  113,  113,  113,  113,  113,
++      113,  113,  113,  114,   62,  114,  115,  115,  115,   61,
++      115,  115,  116,  116,  116,  116,  116,  116,  116,  116,
++       59,   49,   43,   42,   41,   40,   39,   38,   35,   22,
++
++       21,   11,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
++      103,  103,  103,  103,  103,  103,  103,  103
++    } ;
++
++/* Table of booleans, true if rule could match eol. */
++static yyconst flex_int32_t yy_rule_can_match_eol[21] =
++    {   0,
++1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
++    0,     };
++
++static yy_state_type yy_last_accepting_state;
++static char *yy_last_accepting_cpos;
++
++extern int yy_flex_debug;
++int yy_flex_debug = 0;
++
++/* The intent behind this definition is that it'll catch
++ * any uses of REJECT which flex missed.
++ */
++#define REJECT reject_used_but_not_detected
++#define yymore() yymore_used_but_not_detected
++#define YY_MORE_ADJ 0
++#define YY_RESTORE_YY_MORE_OFFSET
++char *yytext;
++#line 1 "dtc-lexer.l"
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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
++ */
++
++
++
++
++#line 37 "dtc-lexer.l"
++#include "dtc.h"
++#include "srcpos.h"
++#include "dtc-parser.tab.h"
++
++
++/*#define LEXDEBUG    1*/
++
++#ifdef LEXDEBUG
++#define DPRINT(fmt, ...)      fprintf(stderr, fmt, ##__VA_ARGS__)
++#else
++#define DPRINT(fmt, ...)      do { } while (0)
++#endif
++
++static int dts_version; /* = 0 */
++
++#define BEGIN_DEFAULT()       if (dts_version == 0) { \
++                              DPRINT("<INITIAL>\n"); \
++                              BEGIN(INITIAL); \
++                      } else { \
++                              DPRINT("<V1>\n"); \
++                              BEGIN(V1); \
++                      }
++
++static void push_input_file(const char *filename);
++static int pop_input_file(void);
++#line 638 "dtc-lexer.lex.c"
++
++#define INITIAL 0
++#define INCLUDE 1
++#define BYTESTRING 2
++#define PROPNODENAME 3
++#define V1 4
++
++#ifndef YY_NO_UNISTD_H
++/* Special case for "unistd.h", since it is non-ANSI. We include it way
++ * down here because we want the user's section 1 to have been scanned first.
++ * The user has a chance to override it with an option.
++ */
++#include <unistd.h>
++#endif
++
++#ifndef YY_EXTRA_TYPE
++#define YY_EXTRA_TYPE void *
++#endif
++
++static int yy_init_globals (void );
++
++/* Macros after this point can all be overridden by user definitions in
++ * section 1.
++ */
++
++#ifndef YY_SKIP_YYWRAP
++#ifdef __cplusplus
++extern "C" int yywrap (void );
++#else
++extern int yywrap (void );
++#endif
++#endif
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char *,yyconst char *,int );
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * );
++#endif
++
++#ifndef YY_NO_INPUT
++
++#ifdef __cplusplus
++static int yyinput (void );
++#else
++static int input (void );
++#endif
++
++#endif
++
++/* Amount of stuff to slurp up with each read. */
++#ifndef YY_READ_BUF_SIZE
++#define YY_READ_BUF_SIZE 8192
++#endif
++
++/* Copy whatever the last rule matched to the standard output. */
++#ifndef ECHO
++/* This used to be an fputs(), but since the string might contain NUL's,
++ * we now use fwrite().
++ */
++#define ECHO fwrite( yytext, yyleng, 1, yyout )
++#endif
++
++/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
++ * is returned in "result".
++ */
++#ifndef YY_INPUT
++#define YY_INPUT(buf,result,max_size) \
++      if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
++              { \
++              int c = '*'; \
++              int n; \
++              for ( n = 0; n < max_size && \
++                           (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
++                      buf[n] = (char) c; \
++              if ( c == '\n' ) \
++                      buf[n++] = (char) c; \
++              if ( c == EOF && ferror( yyin ) ) \
++                      YY_FATAL_ERROR( "input in flex scanner failed" ); \
++              result = n; \
++              } \
++      else \
++              { \
++              errno=0; \
++              while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
++                      { \
++                      if( errno != EINTR) \
++                              { \
++                              YY_FATAL_ERROR( "input in flex scanner failed" ); \
++                              break; \
++                              } \
++                      errno=0; \
++                      clearerr(yyin); \
++                      } \
++              }\
++\
++
++#endif
++
++/* No semi-colon after return; correct usage is to write "yyterminate();" -
++ * we don't want an extra ';' after the "return" because that will cause
++ * some compilers to complain about unreachable statements.
++ */
++#ifndef yyterminate
++#define yyterminate() return YY_NULL
++#endif
++
++/* Number of entries by which start-condition stack grows. */
++#ifndef YY_START_STACK_INCR
++#define YY_START_STACK_INCR 25
++#endif
++
++/* Report a fatal error. */
++#ifndef YY_FATAL_ERROR
++#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
++#endif
++
++/* end tables serialization structures and prototypes */
++
++/* Default declaration of generated scanner - a define so the user can
++ * easily add parameters.
++ */
++#ifndef YY_DECL
++#define YY_DECL_IS_OURS 1
++
++extern int yylex (void);
++
++#define YY_DECL int yylex (void)
++#endif /* !YY_DECL */
++
++/* Code executed at the beginning of each rule, after yytext and yyleng
++ * have been set up.
++ */
++#ifndef YY_USER_ACTION
++#define YY_USER_ACTION
++#endif
++
++/* Code executed at the end of each rule. */
++#ifndef YY_BREAK
++#define YY_BREAK break;
++#endif
++
++#define YY_RULE_SETUP \
++      YY_USER_ACTION
++
++/** The main scanner function which does all the work.
++ */
++YY_DECL
++{
++      register yy_state_type yy_current_state;
++      register char *yy_cp, *yy_bp;
++      register int yy_act;
++    
++#line 64 "dtc-lexer.l"
++
++#line 795 "dtc-lexer.lex.c"
++
++      if ( !(yy_init) )
++              {
++              (yy_init) = 1;
++
++#ifdef YY_USER_INIT
++              YY_USER_INIT;
++#endif
++
++              if ( ! (yy_start) )
++                      (yy_start) = 1; /* first start state */
++
++              if ( ! yyin )
++                      yyin = stdin;
++
++              if ( ! yyout )
++                      yyout = stdout;
++
++              if ( ! YY_CURRENT_BUFFER ) {
++                      yyensure_buffer_stack ();
++                      YY_CURRENT_BUFFER_LVALUE =
++                              yy_create_buffer(yyin,YY_BUF_SIZE );
++              }
++
++              yy_load_buffer_state( );
++              }
++
++      while ( 1 )             /* loops until end-of-file is reached */
++              {
++              yy_cp = (yy_c_buf_p);
++
++              /* Support of yytext. */
++              *yy_cp = (yy_hold_char);
++
++              /* yy_bp points to the position in yy_ch_buf of the start of
++               * the current run.
++               */
++              yy_bp = yy_cp;
++
++              yy_current_state = (yy_start);
++yy_match:
++              do
++                      {
++                      register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
++                      if ( yy_accept[yy_current_state] )
++                              {
++                              (yy_last_accepting_state) = yy_current_state;
++                              (yy_last_accepting_cpos) = yy_cp;
++                              }
++                      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++                              {
++                              yy_current_state = (int) yy_def[yy_current_state];
++                              if ( yy_current_state >= 104 )
++                                      yy_c = yy_meta[(unsigned int) yy_c];
++                              }
++                      yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++                      ++yy_cp;
++                      }
++              while ( yy_base[yy_current_state] != 303 );
++
++yy_find_action:
++              yy_act = yy_accept[yy_current_state];
++              if ( yy_act == 0 )
++                      { /* have to back up */
++                      yy_cp = (yy_last_accepting_cpos);
++                      yy_current_state = (yy_last_accepting_state);
++                      yy_act = yy_accept[yy_current_state];
++                      }
++
++              YY_DO_BEFORE_ACTION;
++
++              if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
++                      {
++                      int yyl;
++                      for ( yyl = 0; yyl < yyleng; ++yyl )
++                              if ( yytext[yyl] == '\n' )
++                                         
++    yylineno++;
++;
++                      }
++
++do_action:    /* This label is used only to access EOF actions. */
++
++              switch ( yy_act )
++      { /* beginning of action switch */
++                      case 0: /* must back up */
++                      /* undo the effects of YY_DO_BEFORE_ACTION */
++                      *yy_cp = (yy_hold_char);
++                      yy_cp = (yy_last_accepting_cpos);
++                      yy_current_state = (yy_last_accepting_state);
++                      goto yy_find_action;
++
++case 1:
++/* rule 1 can match eol */
++YY_RULE_SETUP
++#line 65 "dtc-lexer.l"
++{
++                      char *name = strchr(yytext, '\"') + 1;
++                      yytext[yyleng-1] = '\0';
++                      push_input_file(name);
++              }
++      YY_BREAK
++case YY_STATE_EOF(INITIAL):
++case YY_STATE_EOF(INCLUDE):
++case YY_STATE_EOF(BYTESTRING):
++case YY_STATE_EOF(PROPNODENAME):
++case YY_STATE_EOF(V1):
++#line 71 "dtc-lexer.l"
++{
++                      if (!pop_input_file()) {
++                              yyterminate();
++                      }
++              }
++      YY_BREAK
++case 2:
++/* rule 2 can match eol */
++YY_RULE_SETUP
++#line 77 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("String: %s\n", yytext);
++                      yylval.data = data_copy_escape_string(yytext+1,
++                                      yyleng-2);
++                      yylloc.first_line = yylineno;
++                      return DT_STRING;
++              }
++      YY_BREAK
++case 3:
++YY_RULE_SETUP
++#line 87 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Keyword: /dts-v1/\n");
++                      dts_version = 1;
++                      BEGIN_DEFAULT();
++                      return DT_V1;
++              }
++      YY_BREAK
++case 4:
++YY_RULE_SETUP
++#line 96 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Keyword: /memreserve/\n");
++                      BEGIN_DEFAULT();
++                      return DT_MEMRESERVE;
++              }
++      YY_BREAK
++case 5:
++YY_RULE_SETUP
++#line 104 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Label: %s\n", yytext);
++                      yylval.labelref = strdup(yytext);
++                      yylval.labelref[yyleng-1] = '\0';
++                      return DT_LABEL;
++              }
++      YY_BREAK
++case 6:
++YY_RULE_SETUP
++#line 113 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      if (*yytext == 'b')
++                              yylval.cbase = 2;
++                      else if (*yytext == 'o')
++                              yylval.cbase = 8;
++                      else if (*yytext == 'd')
++                              yylval.cbase = 10;
++                      else
++                              yylval.cbase = 16;
++                      DPRINT("Base: %d\n", yylval.cbase);
++                      return DT_BASE;
++              }
++      YY_BREAK
++case 7:
++YY_RULE_SETUP
++#line 128 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.literal = strdup(yytext);
++                      DPRINT("Literal: '%s'\n", yylval.literal);
++                      return DT_LEGACYLITERAL;
++              }
++      YY_BREAK
++case 8:
++YY_RULE_SETUP
++#line 136 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.literal = strdup(yytext);
++                      DPRINT("Literal: '%s'\n", yylval.literal);
++                      return DT_LITERAL;
++              }
++      YY_BREAK
++case 9:
++YY_RULE_SETUP
++#line 144 "dtc-lexer.l"
++{     /* label reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Ref: %s\n", yytext+1);
++                      yylval.labelref = strdup(yytext+1);
++                      return DT_REF;
++              }
++      YY_BREAK
++case 10:
++YY_RULE_SETUP
++#line 152 "dtc-lexer.l"
++{     /* new-style path reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yytext[yyleng-1] = '\0';
++                      DPRINT("Ref: %s\n", yytext+2);
++                      yylval.labelref = strdup(yytext+2);
++                      return DT_REF;
++              }
++      YY_BREAK
++case 11:
++YY_RULE_SETUP
++#line 161 "dtc-lexer.l"
++{     /* old-style path reference */
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Ref: %s\n", yytext+1);
++                      yylval.labelref = strdup(yytext+1);
++                      return DT_REF;
++              }
++      YY_BREAK
++case 12:
++YY_RULE_SETUP
++#line 169 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      yylval.byte = strtol(yytext, NULL, 16);
++                      DPRINT("Byte: %02x\n", (int)yylval.byte);
++                      return DT_BYTE;
++              }
++      YY_BREAK
++case 13:
++YY_RULE_SETUP
++#line 177 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("/BYTESTRING\n");
++                      BEGIN_DEFAULT();
++                      return ']';
++              }
++      YY_BREAK
++case 14:
++YY_RULE_SETUP
++#line 185 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("PropNodeName: %s\n", yytext);
++                      yylval.propnodename = strdup(yytext);
++                      BEGIN_DEFAULT();
++                      return DT_PROPNODENAME;
++              }
++      YY_BREAK
++case 15:
++YY_RULE_SETUP
++#line 194 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Binary Include\n");
++                      return DT_INCBIN;
++              }
++      YY_BREAK
++case 16:
++/* rule 16 can match eol */
++YY_RULE_SETUP
++#line 201 "dtc-lexer.l"
++/* eat whitespace */
++      YY_BREAK
++case 17:
++/* rule 17 can match eol */
++YY_RULE_SETUP
++#line 202 "dtc-lexer.l"
++/* eat C-style comments */
++      YY_BREAK
++case 18:
++/* rule 18 can match eol */
++YY_RULE_SETUP
++#line 203 "dtc-lexer.l"
++/* eat C++-style comments */
++      YY_BREAK
++case 19:
++YY_RULE_SETUP
++#line 205 "dtc-lexer.l"
++{
++                      yylloc.file = srcpos_file;
++                      yylloc.first_line = yylineno;
++                      DPRINT("Char: %c (\\x%02x)\n", yytext[0],
++                              (unsigned)yytext[0]);
++                      if (yytext[0] == '[') {
++                              DPRINT("<BYTESTRING>\n");
++                              BEGIN(BYTESTRING);
++                      }
++                      if ((yytext[0] == '{')
++                          || (yytext[0] == ';')) {
++                              DPRINT("<PROPNODENAME>\n");
++                              BEGIN(PROPNODENAME);
++                      }
++                      return yytext[0];
++              }
++      YY_BREAK
++case 20:
++YY_RULE_SETUP
++#line 222 "dtc-lexer.l"
++ECHO;
++      YY_BREAK
++#line 1120 "dtc-lexer.lex.c"
++
++      case YY_END_OF_BUFFER:
++              {
++              /* Amount of text matched not including the EOB char. */
++              int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
++
++              /* Undo the effects of YY_DO_BEFORE_ACTION. */
++              *yy_cp = (yy_hold_char);
++              YY_RESTORE_YY_MORE_OFFSET
++
++              if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
++                      {
++                      /* We're scanning a new file or input source.  It's
++                       * possible that this happened because the user
++                       * just pointed yyin at a new source and called
++                       * yylex().  If so, then we have to assure
++                       * consistency between YY_CURRENT_BUFFER and our
++                       * globals.  Here is the right place to do so, because
++                       * this is the first action (other than possibly a
++                       * back-up) that will match for the new input source.
++                       */
++                      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++                      YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
++                      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
++                      }
++
++              /* Note that here we test for yy_c_buf_p "<=" to the position
++               * of the first EOB in the buffer, since yy_c_buf_p will
++               * already have been incremented past the NUL character
++               * (since all states make transitions on EOB to the
++               * end-of-buffer state).  Contrast this with the test
++               * in input().
++               */
++              if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++                      { /* This was really a NUL. */
++                      yy_state_type yy_next_state;
++
++                      (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
++
++                      yy_current_state = yy_get_previous_state(  );
++
++                      /* Okay, we're now positioned to make the NUL
++                       * transition.  We couldn't have
++                       * yy_get_previous_state() go ahead and do it
++                       * for us because it doesn't know how to deal
++                       * with the possibility of jamming (and we don't
++                       * want to build jamming into it because then it
++                       * will run more slowly).
++                       */
++
++                      yy_next_state = yy_try_NUL_trans( yy_current_state );
++
++                      yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++
++                      if ( yy_next_state )
++                              {
++                              /* Consume the NUL. */
++                              yy_cp = ++(yy_c_buf_p);
++                              yy_current_state = yy_next_state;
++                              goto yy_match;
++                              }
++
++                      else
++                              {
++                              yy_cp = (yy_c_buf_p);
++                              goto yy_find_action;
++                              }
++                      }
++
++              else switch ( yy_get_next_buffer(  ) )
++                      {
++                      case EOB_ACT_END_OF_FILE:
++                              {
++                              (yy_did_buffer_switch_on_eof) = 0;
++
++                              if ( yywrap( ) )
++                                      {
++                                      /* Note: because we've taken care in
++                                       * yy_get_next_buffer() to have set up
++                                       * yytext, we can now set up
++                                       * yy_c_buf_p so that if some total
++                                       * hoser (like flex itself) wants to
++                                       * call the scanner after we return the
++                                       * YY_NULL, it'll still work - another
++                                       * YY_NULL will get returned.
++                                       */
++                                      (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
++
++                                      yy_act = YY_STATE_EOF(YY_START);
++                                      goto do_action;
++                                      }
++
++                              else
++                                      {
++                                      if ( ! (yy_did_buffer_switch_on_eof) )
++                                              YY_NEW_FILE;
++                                      }
++                              break;
++                              }
++
++                      case EOB_ACT_CONTINUE_SCAN:
++                              (yy_c_buf_p) =
++                                      (yytext_ptr) + yy_amount_of_matched_text;
++
++                              yy_current_state = yy_get_previous_state(  );
++
++                              yy_cp = (yy_c_buf_p);
++                              yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++                              goto yy_match;
++
++                      case EOB_ACT_LAST_MATCH:
++                              (yy_c_buf_p) =
++                              &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
++
++                              yy_current_state = yy_get_previous_state(  );
++
++                              yy_cp = (yy_c_buf_p);
++                              yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++                              goto yy_find_action;
++                      }
++              break;
++              }
++
++      default:
++              YY_FATAL_ERROR(
++                      "fatal flex scanner internal error--no action found" );
++      } /* end of action switch */
++              } /* end of scanning one token */
++} /* end of yylex */
++
++/* yy_get_next_buffer - try to read in a new buffer
++ *
++ * Returns a code representing an action:
++ *    EOB_ACT_LAST_MATCH -
++ *    EOB_ACT_CONTINUE_SCAN - continue scanning from current position
++ *    EOB_ACT_END_OF_FILE - end of file
++ */
++static int yy_get_next_buffer (void)
++{
++      register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
++      register char *source = (yytext_ptr);
++      register int number_to_move, i;
++      int ret_val;
++
++      if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
++              YY_FATAL_ERROR(
++              "fatal flex scanner internal error--end of buffer missed" );
++
++      if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
++              { /* Don't try to fill the buffer, so this is an EOF. */
++              if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
++                      {
++                      /* We matched a single character, the EOB, so
++                       * treat this as a final EOF.
++                       */
++                      return EOB_ACT_END_OF_FILE;
++                      }
++
++              else
++                      {
++                      /* We matched some text prior to the EOB, first
++                       * process it.
++                       */
++                      return EOB_ACT_LAST_MATCH;
++                      }
++              }
++
++      /* Try to read more data. */
++
++      /* First move last chars to start of buffer. */
++      number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
++
++      for ( i = 0; i < number_to_move; ++i )
++              *(dest++) = *(source++);
++
++      if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
++              /* don't do the read, it's not guaranteed to return an EOF,
++               * just force an EOF
++               */
++              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
++
++      else
++              {
++                      int num_to_read =
++                      YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
++
++              while ( num_to_read <= 0 )
++                      { /* Not enough room in the buffer - grow it. */
++
++                      /* just a shorter name for the current buffer */
++                      YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
++
++                      int yy_c_buf_p_offset =
++                              (int) ((yy_c_buf_p) - b->yy_ch_buf);
++
++                      if ( b->yy_is_our_buffer )
++                              {
++                              int new_size = b->yy_buf_size * 2;
++
++                              if ( new_size <= 0 )
++                                      b->yy_buf_size += b->yy_buf_size / 8;
++                              else
++                                      b->yy_buf_size *= 2;
++
++                              b->yy_ch_buf = (char *)
++                                      /* Include room in for 2 EOB chars. */
++                                      yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
++                              }
++                      else
++                              /* Can't grow it, we don't own it. */
++                              b->yy_ch_buf = 0;
++
++                      if ( ! b->yy_ch_buf )
++                              YY_FATAL_ERROR(
++                              "fatal error - scanner input buffer overflow" );
++
++                      (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
++
++                      num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
++                                              number_to_move - 1;
++
++                      }
++
++              if ( num_to_read > YY_READ_BUF_SIZE )
++                      num_to_read = YY_READ_BUF_SIZE;
++
++              /* Read in more data. */
++              YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
++                      (yy_n_chars), (size_t) num_to_read );
++
++              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++              }
++
++      if ( (yy_n_chars) == 0 )
++              {
++              if ( number_to_move == YY_MORE_ADJ )
++                      {
++                      ret_val = EOB_ACT_END_OF_FILE;
++                      yyrestart(yyin  );
++                      }
++
++              else
++                      {
++                      ret_val = EOB_ACT_LAST_MATCH;
++                      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
++                              YY_BUFFER_EOF_PENDING;
++                      }
++              }
++
++      else
++              ret_val = EOB_ACT_CONTINUE_SCAN;
++
++      if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
++              /* Extend the array by 50%, plus the number we really need. */
++              yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
++              YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
++              if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
++                      YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
++      }
++
++      (yy_n_chars) += number_to_move;
++      YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
++      YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
++
++      (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
++
++      return ret_val;
++}
++
++/* yy_get_previous_state - get the state just before the EOB char was reached */
++
++    static yy_state_type yy_get_previous_state (void)
++{
++      register yy_state_type yy_current_state;
++      register char *yy_cp;
++    
++      yy_current_state = (yy_start);
++
++      for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
++              {
++              register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
++              if ( yy_accept[yy_current_state] )
++                      {
++                      (yy_last_accepting_state) = yy_current_state;
++                      (yy_last_accepting_cpos) = yy_cp;
++                      }
++              while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++                      {
++                      yy_current_state = (int) yy_def[yy_current_state];
++                      if ( yy_current_state >= 104 )
++                              yy_c = yy_meta[(unsigned int) yy_c];
++                      }
++              yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++              }
++
++      return yy_current_state;
++}
++
++/* yy_try_NUL_trans - try to make a transition on the NUL character
++ *
++ * synopsis
++ *    next_state = yy_try_NUL_trans( current_state );
++ */
++    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
++{
++      register int yy_is_jam;
++      register char *yy_cp = (yy_c_buf_p);
++
++      register YY_CHAR yy_c = 1;
++      if ( yy_accept[yy_current_state] )
++              {
++              (yy_last_accepting_state) = yy_current_state;
++              (yy_last_accepting_cpos) = yy_cp;
++              }
++      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++              {
++              yy_current_state = (int) yy_def[yy_current_state];
++              if ( yy_current_state >= 104 )
++                      yy_c = yy_meta[(unsigned int) yy_c];
++              }
++      yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++      yy_is_jam = (yy_current_state == 103);
++
++      return yy_is_jam ? 0 : yy_current_state;
++}
++
++#ifndef YY_NO_INPUT
++#ifdef __cplusplus
++    static int yyinput (void)
++#else
++    static int input  (void)
++#endif
++
++{
++      int c;
++    
++      *(yy_c_buf_p) = (yy_hold_char);
++
++      if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
++              {
++              /* yy_c_buf_p now points to the character we want to return.
++               * If this occurs *before* the EOB characters, then it's a
++               * valid NUL; if not, then we've hit the end of the buffer.
++               */
++              if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++                      /* This was really a NUL. */
++                      *(yy_c_buf_p) = '\0';
++
++              else
++                      { /* need more input */
++                      int offset = (yy_c_buf_p) - (yytext_ptr);
++                      ++(yy_c_buf_p);
++
++                      switch ( yy_get_next_buffer(  ) )
++                              {
++                              case EOB_ACT_LAST_MATCH:
++                                      /* This happens because yy_g_n_b()
++                                       * sees that we've accumulated a
++                                       * token and flags that we need to
++                                       * try matching the token before
++                                       * proceeding.  But for input(),
++                                       * there's no matching to consider.
++                                       * So convert the EOB_ACT_LAST_MATCH
++                                       * to EOB_ACT_END_OF_FILE.
++                                       */
++
++                                      /* Reset buffer status. */
++                                      yyrestart(yyin );
++
++                                      /*FALLTHROUGH*/
++
++                              case EOB_ACT_END_OF_FILE:
++                                      {
++                                      if ( yywrap( ) )
++                                              return EOF;
++
++                                      if ( ! (yy_did_buffer_switch_on_eof) )
++                                              YY_NEW_FILE;
++#ifdef __cplusplus
++                                      return yyinput();
++#else
++                                      return input();
++#endif
++                                      }
++
++                              case EOB_ACT_CONTINUE_SCAN:
++                                      (yy_c_buf_p) = (yytext_ptr) + offset;
++                                      break;
++                              }
++                      }
++              }
++
++      c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
++      *(yy_c_buf_p) = '\0';   /* preserve yytext */
++      (yy_hold_char) = *++(yy_c_buf_p);
++
++      if ( c == '\n' )
++                 
++    yylineno++;
++;
++
++      return c;
++}
++#endif        /* ifndef YY_NO_INPUT */
++
++/** Immediately switch to a different input stream.
++ * @param input_file A readable stream.
++ * 
++ * @note This function does not reset the start condition to @c INITIAL .
++ */
++    void yyrestart  (FILE * input_file )
++{
++    
++      if ( ! YY_CURRENT_BUFFER ){
++        yyensure_buffer_stack ();
++              YY_CURRENT_BUFFER_LVALUE =
++            yy_create_buffer(yyin,YY_BUF_SIZE );
++      }
++
++      yy_init_buffer(YY_CURRENT_BUFFER,input_file );
++      yy_load_buffer_state( );
++}
++
++/** Switch to a different input buffer.
++ * @param new_buffer The new input buffer.
++ * 
++ */
++    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
++{
++    
++      /* TODO. We should be able to replace this entire function body
++       * with
++       *              yypop_buffer_state();
++       *              yypush_buffer_state(new_buffer);
++     */
++      yyensure_buffer_stack ();
++      if ( YY_CURRENT_BUFFER == new_buffer )
++              return;
++
++      if ( YY_CURRENT_BUFFER )
++              {
++              /* Flush out information for old buffer. */
++              *(yy_c_buf_p) = (yy_hold_char);
++              YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++              }
++
++      YY_CURRENT_BUFFER_LVALUE = new_buffer;
++      yy_load_buffer_state( );
++
++      /* We don't actually know whether we did this switch during
++       * EOF (yywrap()) processing, but the only time this flag
++       * is looked at is after yywrap() is called, so it's safe
++       * to go ahead and always set it.
++       */
++      (yy_did_buffer_switch_on_eof) = 1;
++}
++
++static void yy_load_buffer_state  (void)
++{
++      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++      (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
++      yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
++      (yy_hold_char) = *(yy_c_buf_p);
++}
++
++/** Allocate and initialize an input buffer state.
++ * @param file A readable stream.
++ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
++ * 
++ * @return the allocated buffer state.
++ */
++    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
++{
++      YY_BUFFER_STATE b;
++    
++      b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
++      if ( ! b )
++              YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
++
++      b->yy_buf_size = size;
++
++      /* yy_ch_buf has to be 2 characters longer than the size given because
++       * we need to put in 2 end-of-buffer characters.
++       */
++      b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
++      if ( ! b->yy_ch_buf )
++              YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
++
++      b->yy_is_our_buffer = 1;
++
++      yy_init_buffer(b,file );
++
++      return b;
++}
++
++/** Destroy the buffer.
++ * @param b a buffer created with yy_create_buffer()
++ * 
++ */
++    void yy_delete_buffer (YY_BUFFER_STATE  b )
++{
++    
++      if ( ! b )
++              return;
++
++      if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
++              YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
++
++      if ( b->yy_is_our_buffer )
++              yyfree((void *) b->yy_ch_buf  );
++
++      yyfree((void *) b  );
++}
++
++#ifndef __cplusplus
++extern int isatty (int );
++#endif /* __cplusplus */
++    
++/* Initializes or reinitializes a buffer.
++ * This function is sometimes called more than once on the same buffer,
++ * such as during a yyrestart() or at EOF.
++ */
++    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
++
++{
++      int oerrno = errno;
++    
++      yy_flush_buffer(b );
++
++      b->yy_input_file = file;
++      b->yy_fill_buffer = 1;
++
++    /* If b is the current buffer, then yy_init_buffer was _probably_
++     * called from yyrestart() or through yy_get_next_buffer.
++     * In that case, we don't want to reset the lineno or column.
++     */
++    if (b != YY_CURRENT_BUFFER){
++        b->yy_bs_lineno = 1;
++        b->yy_bs_column = 0;
++    }
++
++        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
++    
++      errno = oerrno;
++}
++
++/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
++ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
++ * 
++ */
++    void yy_flush_buffer (YY_BUFFER_STATE  b )
++{
++      if ( ! b )
++              return;
++
++      b->yy_n_chars = 0;
++
++      /* We always need two end-of-buffer characters.  The first causes
++       * a transition to the end-of-buffer state.  The second causes
++       * a jam in that state.
++       */
++      b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
++      b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
++
++      b->yy_buf_pos = &b->yy_ch_buf[0];
++
++      b->yy_at_bol = 1;
++      b->yy_buffer_status = YY_BUFFER_NEW;
++
++      if ( b == YY_CURRENT_BUFFER )
++              yy_load_buffer_state( );
++}
++
++/** Pushes the new state onto the stack. The new state becomes
++ *  the current state. This function will allocate the stack
++ *  if necessary.
++ *  @param new_buffer The new state.
++ *  
++ */
++void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
++{
++      if (new_buffer == NULL)
++              return;
++
++      yyensure_buffer_stack();
++
++      /* This block is copied from yy_switch_to_buffer. */
++      if ( YY_CURRENT_BUFFER )
++              {
++              /* Flush out information for old buffer. */
++              *(yy_c_buf_p) = (yy_hold_char);
++              YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++              }
++
++      /* Only push if top exists. Otherwise, replace top. */
++      if (YY_CURRENT_BUFFER)
++              (yy_buffer_stack_top)++;
++      YY_CURRENT_BUFFER_LVALUE = new_buffer;
++
++      /* copied from yy_switch_to_buffer. */
++      yy_load_buffer_state( );
++      (yy_did_buffer_switch_on_eof) = 1;
++}
++
++/** Removes and deletes the top of the stack, if present.
++ *  The next element becomes the new top.
++ *  
++ */
++void yypop_buffer_state (void)
++{
++      if (!YY_CURRENT_BUFFER)
++              return;
++
++      yy_delete_buffer(YY_CURRENT_BUFFER );
++      YY_CURRENT_BUFFER_LVALUE = NULL;
++      if ((yy_buffer_stack_top) > 0)
++              --(yy_buffer_stack_top);
++
++      if (YY_CURRENT_BUFFER) {
++              yy_load_buffer_state( );
++              (yy_did_buffer_switch_on_eof) = 1;
++      }
++}
++
++/* Allocates the stack if it does not exist.
++ *  Guarantees space for at least one push.
++ */
++static void yyensure_buffer_stack (void)
++{
++      int num_to_alloc;
++    
++      if (!(yy_buffer_stack)) {
++
++              /* First allocation is just for 2 elements, since we don't know if this
++               * scanner will even need a stack. We use 2 instead of 1 to avoid an
++               * immediate realloc on the next call.
++         */
++              num_to_alloc = 1;
++              (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
++                                                              (num_to_alloc * sizeof(struct yy_buffer_state*)
++                                                              );
++              if ( ! (yy_buffer_stack) )
++                      YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
++                                                                
++              memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
++                              
++              (yy_buffer_stack_max) = num_to_alloc;
++              (yy_buffer_stack_top) = 0;
++              return;
++      }
++
++      if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
++
++              /* Increase the buffer to prepare for a possible push. */
++              int grow_size = 8 /* arbitrary grow size */;
++
++              num_to_alloc = (yy_buffer_stack_max) + grow_size;
++              (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
++                                                              ((yy_buffer_stack),
++                                                              num_to_alloc * sizeof(struct yy_buffer_state*)
++                                                              );
++              if ( ! (yy_buffer_stack) )
++                      YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
++
++              /* zero only the new slots.*/
++              memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
++              (yy_buffer_stack_max) = num_to_alloc;
++      }
++}
++
++/** Setup the input buffer state to scan directly from a user-specified character buffer.
++ * @param base the character buffer
++ * @param size the size in bytes of the character buffer
++ * 
++ * @return the newly allocated buffer state object. 
++ */
++YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
++{
++      YY_BUFFER_STATE b;
++    
++      if ( size < 2 ||
++           base[size-2] != YY_END_OF_BUFFER_CHAR ||
++           base[size-1] != YY_END_OF_BUFFER_CHAR )
++              /* They forgot to leave room for the EOB's. */
++              return 0;
++
++      b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
++      if ( ! b )
++              YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
++
++      b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
++      b->yy_buf_pos = b->yy_ch_buf = base;
++      b->yy_is_our_buffer = 0;
++      b->yy_input_file = 0;
++      b->yy_n_chars = b->yy_buf_size;
++      b->yy_is_interactive = 0;
++      b->yy_at_bol = 1;
++      b->yy_fill_buffer = 0;
++      b->yy_buffer_status = YY_BUFFER_NEW;
++
++      yy_switch_to_buffer(b  );
++
++      return b;
++}
++
++/** Setup the input buffer state to scan a string. The next call to yylex() will
++ * scan from a @e copy of @a str.
++ * @param yystr a NUL-terminated string to scan
++ * 
++ * @return the newly allocated buffer state object.
++ * @note If you want to scan bytes that may contain NUL values, then use
++ *       yy_scan_bytes() instead.
++ */
++YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
++{
++    
++      return yy_scan_bytes(yystr,strlen(yystr) );
++}
++
++/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
++ * scan from a @e copy of @a bytes.
++ * @param bytes the byte buffer to scan
++ * @param len the number of bytes in the buffer pointed to by @a bytes.
++ * 
++ * @return the newly allocated buffer state object.
++ */
++YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
++{
++      YY_BUFFER_STATE b;
++      char *buf;
++      yy_size_t n;
++      int i;
++    
++      /* Get memory for full buffer, including space for trailing EOB's. */
++      n = _yybytes_len + 2;
++      buf = (char *) yyalloc(n  );
++      if ( ! buf )
++              YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
++
++      for ( i = 0; i < _yybytes_len; ++i )
++              buf[i] = yybytes[i];
++
++      buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
++
++      b = yy_scan_buffer(buf,n );
++      if ( ! b )
++              YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
++
++      /* It's okay to grow etc. this buffer, and we should throw it
++       * away when we're done.
++       */
++      b->yy_is_our_buffer = 1;
++
++      return b;
++}
++
++#ifndef YY_EXIT_FAILURE
++#define YY_EXIT_FAILURE 2
++#endif
++
++static void yy_fatal_error (yyconst char* msg )
++{
++      (void) fprintf( stderr, "%s\n", msg );
++      exit( YY_EXIT_FAILURE );
++}
++
++/* Redefine yyless() so it works in section 3 code. */
++
++#undef yyless
++#define yyless(n) \
++      do \
++              { \
++              /* Undo effects of setting up yytext. */ \
++        int yyless_macro_arg = (n); \
++        YY_LESS_LINENO(yyless_macro_arg);\
++              yytext[yyleng] = (yy_hold_char); \
++              (yy_c_buf_p) = yytext + yyless_macro_arg; \
++              (yy_hold_char) = *(yy_c_buf_p); \
++              *(yy_c_buf_p) = '\0'; \
++              yyleng = yyless_macro_arg; \
++              } \
++      while ( 0 )
++
++/* Accessor  methods (get/set functions) to struct members. */
++
++/** Get the current line number.
++ * 
++ */
++int yyget_lineno  (void)
++{
++        
++    return yylineno;
++}
++
++/** Get the input stream.
++ * 
++ */
++FILE *yyget_in  (void)
++{
++        return yyin;
++}
++
++/** Get the output stream.
++ * 
++ */
++FILE *yyget_out  (void)
++{
++        return yyout;
++}
++
++/** Get the length of the current token.
++ * 
++ */
++int yyget_leng  (void)
++{
++        return yyleng;
++}
++
++/** Get the current token.
++ * 
++ */
++
++char *yyget_text  (void)
++{
++        return yytext;
++}
++
++/** Set the current line number.
++ * @param line_number
++ * 
++ */
++void yyset_lineno (int  line_number )
++{
++    
++    yylineno = line_number;
++}
++
++/** Set the input stream. This does not discard the current
++ * input buffer.
++ * @param in_str A readable stream.
++ * 
++ * @see yy_switch_to_buffer
++ */
++void yyset_in (FILE *  in_str )
++{
++        yyin = in_str ;
++}
++
++void yyset_out (FILE *  out_str )
++{
++        yyout = out_str ;
++}
++
++int yyget_debug  (void)
++{
++        return yy_flex_debug;
++}
++
++void yyset_debug (int  bdebug )
++{
++        yy_flex_debug = bdebug ;
++}
++
++static int yy_init_globals (void)
++{
++        /* Initialization is the same as for the non-reentrant scanner.
++     * This function is called from yylex_destroy(), so don't allocate here.
++     */
++
++    /* We do not touch yylineno unless the option is enabled. */
++    yylineno =  1;
++    
++    (yy_buffer_stack) = 0;
++    (yy_buffer_stack_top) = 0;
++    (yy_buffer_stack_max) = 0;
++    (yy_c_buf_p) = (char *) 0;
++    (yy_init) = 0;
++    (yy_start) = 0;
++
++/* Defined in main.c */
++#ifdef YY_STDINIT
++    yyin = stdin;
++    yyout = stdout;
++#else
++    yyin = (FILE *) 0;
++    yyout = (FILE *) 0;
++#endif
++
++    /* For future reference: Set errno on error, since we are called by
++     * yylex_init()
++     */
++    return 0;
++}
++
++/* yylex_destroy is for both reentrant and non-reentrant scanners. */
++int yylex_destroy  (void)
++{
++    
++    /* Pop the buffer stack, destroying each element. */
++      while(YY_CURRENT_BUFFER){
++              yy_delete_buffer(YY_CURRENT_BUFFER  );
++              YY_CURRENT_BUFFER_LVALUE = NULL;
++              yypop_buffer_state();
++      }
++
++      /* Destroy the stack itself. */
++      yyfree((yy_buffer_stack) );
++      (yy_buffer_stack) = NULL;
++
++    /* Reset the globals. This is important in a non-reentrant scanner so the next time
++     * yylex() is called, initialization will occur. */
++    yy_init_globals( );
++
++    return 0;
++}
++
++/*
++ * Internal utility routines.
++ */
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
++{
++      register int i;
++      for ( i = 0; i < n; ++i )
++              s1[i] = s2[i];
++}
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * s )
++{
++      register int n;
++      for ( n = 0; s[n]; ++n )
++              ;
++
++      return n;
++}
++#endif
++
++void *yyalloc (yy_size_t  size )
++{
++      return (void *) malloc( size );
++}
++
++void *yyrealloc  (void * ptr, yy_size_t  size )
++{
++      /* The cast to (char *) in the following accommodates both
++       * implementations that use char* generic pointers, and those
++       * that use void* generic pointers.  It works with the latter
++       * because both ANSI C and C++ allow castless assignment from
++       * any pointer type to void*, and deal with argument conversions
++       * as though doing an assignment.
++       */
++      return (void *) realloc( (char *) ptr, size );
++}
++
++void yyfree (void * ptr )
++{
++      free( (char *) ptr );   /* see yyrealloc() for (char *) cast */
++}
++
++#define YYTABLES_NAME "yytables"
++
++#line 222 "dtc-lexer.l"
++
++
++
++
++/*
++ * Stack of nested include file contexts.
++ */
++
++struct incl_file {
++      struct dtc_file *file;
++      YY_BUFFER_STATE yy_prev_buf;
++      int yy_prev_lineno;
++      struct incl_file *prev;
++};
++
++static struct incl_file *incl_file_stack;
++
++
++/*
++ * Detect infinite include recursion.
++ */
++#define MAX_INCLUDE_DEPTH     (100)
++
++static int incl_depth = 0;
++
++
++static void push_input_file(const char *filename)
++{
++      struct incl_file *incl_file;
++      struct dtc_file *newfile;
++      struct search_path search, *searchptr = NULL;
++
++      assert(filename);
++
++      if (incl_depth++ >= MAX_INCLUDE_DEPTH)
++              die("Includes nested too deeply");
++
++      if (srcpos_file) {
++              search.dir = srcpos_file->dir;
++              search.next = NULL;
++              search.prev = NULL;
++              searchptr = &search;
++      }
++
++      newfile = dtc_open_file(filename, searchptr);
++
++      incl_file = xmalloc(sizeof(struct incl_file));
++
++      /*
++       * Save current context.
++       */
++      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
++      incl_file->yy_prev_lineno = yylineno;
++      incl_file->file = srcpos_file;
++      incl_file->prev = incl_file_stack;
++
++      incl_file_stack = incl_file;
++
++      /*
++       * Establish new context.
++       */
++      srcpos_file = newfile;
++      yylineno = 1;
++      yyin = newfile->file;
++      yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
++}
++
++
++static int pop_input_file(void)
++{
++      struct incl_file *incl_file;
++
++      if (incl_file_stack == 0)
++              return 0;
++
++      dtc_close_file(srcpos_file);
++
++      /*
++       * Pop.
++       */
++      --incl_depth;
++      incl_file = incl_file_stack;
++      incl_file_stack = incl_file->prev;
++
++      /*
++       * Recover old context.
++       */
++      yy_delete_buffer(YY_CURRENT_BUFFER);
++      yy_switch_to_buffer(incl_file->yy_prev_buf);
++      yylineno = incl_file->yy_prev_lineno;
++      srcpos_file = incl_file->file;
++      yyin = incl_file->file ? incl_file->file->file : NULL;
++
++      /*
++       * Free old state.
++       */
++      free(incl_file);
++
++      return 1;
++}
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc-parser.tab.c_shipped linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.tab.c_shipped
+--- linux-2.6.30-rc4/scripts/dtc/dtc-parser.tab.c_shipped      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.tab.c_shipped  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,2040 @@
++/* A Bison parser, made by GNU Bison 2.3.  */
++
++/* Skeleton implementation for Bison's Yacc-like parsers in C
++
++   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
++   Free Software Foundation, 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, 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., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.  */
++
++/* As a special exception, you may create a larger work that contains
++   part or all of the Bison parser skeleton and distribute that work
++   under terms of your choice, so long as that work isn't itself a
++   parser generator using the skeleton or a modified version thereof
++   as a parser skeleton.  Alternatively, if you modify or redistribute
++   the parser skeleton itself, you may (at your option) remove this
++   special exception, which will cause the skeleton and the resulting
++   Bison output files to be licensed under the GNU General Public
++   License without this special exception.
++
++   This special exception was added by the Free Software Foundation in
++   version 2.2 of Bison.  */
++
++/* C LALR(1) parser skeleton written by Richard Stallman, by
++   simplifying the original so-called "semantic" parser.  */
++
++/* All symbols defined below should begin with yy or YY, to avoid
++   infringing on user name space.  This should be done even for local
++   variables, as they might otherwise be expanded by user macros.
++   There are some unavoidable exceptions within include files to
++   define necessary library symbols; they are noted "INFRINGES ON
++   USER NAME SPACE" below.  */
++
++/* Identify Bison output.  */
++#define YYBISON 1
++
++/* Bison version.  */
++#define YYBISON_VERSION "2.3"
++
++/* Skeleton name.  */
++#define YYSKELETON_NAME "yacc.c"
++
++/* Pure parsers.  */
++#define YYPURE 0
++
++/* Using locations.  */
++#define YYLSP_NEEDED 1
++
++
++
++/* Tokens.  */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++   /* Put the tokens into the symbol table, so that GDB and other debuggers
++      know about them.  */
++   enum yytokentype {
++     DT_V1 = 258,
++     DT_MEMRESERVE = 259,
++     DT_PROPNODENAME = 260,
++     DT_LITERAL = 261,
++     DT_LEGACYLITERAL = 262,
++     DT_BASE = 263,
++     DT_BYTE = 264,
++     DT_STRING = 265,
++     DT_LABEL = 266,
++     DT_REF = 267,
++     DT_INCBIN = 268
++   };
++#endif
++/* Tokens.  */
++#define DT_V1 258
++#define DT_MEMRESERVE 259
++#define DT_PROPNODENAME 260
++#define DT_LITERAL 261
++#define DT_LEGACYLITERAL 262
++#define DT_BASE 263
++#define DT_BYTE 264
++#define DT_STRING 265
++#define DT_LABEL 266
++#define DT_REF 267
++#define DT_INCBIN 268
++
++
++
++
++/* Copy the first part of user declarations.  */
++#line 23 "dtc-parser.y"
++
++#include <stdio.h>
++
++#include "dtc.h"
++#include "srcpos.h"
++
++extern int yylex(void);
++
++extern struct boot_info *the_boot_info;
++extern int treesource_error;
++
++static unsigned long long eval_literal(const char *s, int base, int bits);
++
++
++/* Enabling traces.  */
++#ifndef YYDEBUG
++# define YYDEBUG 0
++#endif
++
++/* Enabling verbose error messages.  */
++#ifdef YYERROR_VERBOSE
++# undef YYERROR_VERBOSE
++# define YYERROR_VERBOSE 1
++#else
++# define YYERROR_VERBOSE 0
++#endif
++
++/* Enabling the token table.  */
++#ifndef YYTOKEN_TABLE
++# define YYTOKEN_TABLE 0
++#endif
++
++#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++typedef union YYSTYPE
++#line 37 "dtc-parser.y"
++{
++      char *propnodename;
++      char *literal;
++      char *labelref;
++      unsigned int cbase;
++      uint8_t byte;
++      struct data data;
++
++      uint64_t addr;
++      cell_t cell;
++      struct property *prop;
++      struct property *proplist;
++      struct node *node;
++      struct node *nodelist;
++      struct reserve_info *re;
++}
++/* Line 187 of yacc.c.  */
++#line 153 "dtc-parser.tab.c"
++      YYSTYPE;
++# define yystype YYSTYPE /* obsolescent; will be withdrawn */
++# define YYSTYPE_IS_DECLARED 1
++# define YYSTYPE_IS_TRIVIAL 1
++#endif
++
++#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
++typedef struct YYLTYPE
++{
++  int first_line;
++  int first_column;
++  int last_line;
++  int last_column;
++} YYLTYPE;
++# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
++# define YYLTYPE_IS_DECLARED 1
++# define YYLTYPE_IS_TRIVIAL 1
++#endif
++
++
++/* Copy the second part of user declarations.  */
++
++
++/* Line 216 of yacc.c.  */
++#line 178 "dtc-parser.tab.c"
++
++#ifdef short
++# undef short
++#endif
++
++#ifdef YYTYPE_UINT8
++typedef YYTYPE_UINT8 yytype_uint8;
++#else
++typedef unsigned char yytype_uint8;
++#endif
++
++#ifdef YYTYPE_INT8
++typedef YYTYPE_INT8 yytype_int8;
++#elif (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++typedef signed char yytype_int8;
++#else
++typedef short int yytype_int8;
++#endif
++
++#ifdef YYTYPE_UINT16
++typedef YYTYPE_UINT16 yytype_uint16;
++#else
++typedef unsigned short int yytype_uint16;
++#endif
++
++#ifdef YYTYPE_INT16
++typedef YYTYPE_INT16 yytype_int16;
++#else
++typedef short int yytype_int16;
++#endif
++
++#ifndef YYSIZE_T
++# ifdef __SIZE_TYPE__
++#  define YYSIZE_T __SIZE_TYPE__
++# elif defined size_t
++#  define YYSIZE_T size_t
++# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
++#  define YYSIZE_T size_t
++# else
++#  define YYSIZE_T unsigned int
++# endif
++#endif
++
++#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
++
++#ifndef YY_
++# if YYENABLE_NLS
++#  if ENABLE_NLS
++#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
++#   define YY_(msgid) dgettext ("bison-runtime", msgid)
++#  endif
++# endif
++# ifndef YY_
++#  define YY_(msgid) msgid
++# endif
++#endif
++
++/* Suppress unused-variable warnings by "using" E.  */
++#if ! defined lint || defined __GNUC__
++# define YYUSE(e) ((void) (e))
++#else
++# define YYUSE(e) /* empty */
++#endif
++
++/* Identity function, used to suppress warnings about constant conditions.  */
++#ifndef lint
++# define YYID(n) (n)
++#else
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static int
++YYID (int i)
++#else
++static int
++YYID (i)
++    int i;
++#endif
++{
++  return i;
++}
++#endif
++
++#if ! defined yyoverflow || YYERROR_VERBOSE
++
++/* The parser invokes alloca or malloc; define the necessary symbols.  */
++
++# ifdef YYSTACK_USE_ALLOCA
++#  if YYSTACK_USE_ALLOCA
++#   ifdef __GNUC__
++#    define YYSTACK_ALLOC __builtin_alloca
++#   elif defined __BUILTIN_VA_ARG_INCR
++#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
++#   elif defined _AIX
++#    define YYSTACK_ALLOC __alloca
++#   elif defined _MSC_VER
++#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
++#    define alloca _alloca
++#   else
++#    define YYSTACK_ALLOC alloca
++#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++#     ifndef _STDLIB_H
++#      define _STDLIB_H 1
++#     endif
++#    endif
++#   endif
++#  endif
++# endif
++
++# ifdef YYSTACK_ALLOC
++   /* Pacify GCC's `empty if-body' warning.  */
++#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
++#  ifndef YYSTACK_ALLOC_MAXIMUM
++    /* The OS might guarantee only one guard page at the bottom of the stack,
++       and a page size can be as small as 4096 bytes.  So we cannot safely
++       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
++       to allow for a few compiler-allocated temporary stack slots.  */
++#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
++#  endif
++# else
++#  define YYSTACK_ALLOC YYMALLOC
++#  define YYSTACK_FREE YYFREE
++#  ifndef YYSTACK_ALLOC_MAXIMUM
++#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
++#  endif
++#  if (defined __cplusplus && ! defined _STDLIB_H \
++       && ! ((defined YYMALLOC || defined malloc) \
++           && (defined YYFREE || defined free)))
++#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++#   ifndef _STDLIB_H
++#    define _STDLIB_H 1
++#   endif
++#  endif
++#  ifndef YYMALLOC
++#   define YYMALLOC malloc
++#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
++#   endif
++#  endif
++#  ifndef YYFREE
++#   define YYFREE free
++#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++void free (void *); /* INFRINGES ON USER NAME SPACE */
++#   endif
++#  endif
++# endif
++#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
++
++
++#if (! defined yyoverflow \
++     && (! defined __cplusplus \
++       || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
++           && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
++
++/* A type that is properly aligned for any stack member.  */
++union yyalloc
++{
++  yytype_int16 yyss;
++  YYSTYPE yyvs;
++    YYLTYPE yyls;
++};
++
++/* The size of the maximum gap between one aligned stack and the next.  */
++# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
++
++/* The size of an array large to enough to hold all stacks, each with
++   N elements.  */
++# define YYSTACK_BYTES(N) \
++     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
++      + 2 * YYSTACK_GAP_MAXIMUM)
++
++/* Copy COUNT objects from FROM to TO.  The source and destination do
++   not overlap.  */
++# ifndef YYCOPY
++#  if defined __GNUC__ && 1 < __GNUC__
++#   define YYCOPY(To, From, Count) \
++      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
++#  else
++#   define YYCOPY(To, From, Count)            \
++      do                                      \
++      {                                       \
++        YYSIZE_T yyi;                         \
++        for (yyi = 0; yyi < (Count); yyi++)   \
++          (To)[yyi] = (From)[yyi];            \
++      }                                       \
++      while (YYID (0))
++#  endif
++# endif
++
++/* Relocate STACK from its old location to the new one.  The
++   local variables YYSIZE and YYSTACKSIZE give the old and new number of
++   elements in the stack, and YYPTR gives the new location of the
++   stack.  Advance YYPTR to a properly aligned location for the next
++   stack.  */
++# define YYSTACK_RELOCATE(Stack)                                      \
++    do                                                                        \
++      {                                                                       \
++      YYSIZE_T yynewbytes;                                            \
++      YYCOPY (&yyptr->Stack, Stack, yysize);                          \
++      Stack = &yyptr->Stack;                                          \
++      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
++      yyptr += yynewbytes / sizeof (*yyptr);                          \
++      }                                                                       \
++    while (YYID (0))
++
++#endif
++
++/* YYFINAL -- State number of the termination state.  */
++#define YYFINAL  9
++/* YYLAST -- Last index in YYTABLE.  */
++#define YYLAST   73
++
++/* YYNTOKENS -- Number of terminals.  */
++#define YYNTOKENS  27
++/* YYNNTS -- Number of nonterminals.  */
++#define YYNNTS  20
++/* YYNRULES -- Number of rules.  */
++#define YYNRULES  45
++/* YYNRULES -- Number of states.  */
++#define YYNSTATES  76
++
++/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
++#define YYUNDEFTOK  2
++#define YYMAXUTOK   268
++
++#define YYTRANSLATE(YYX)                                              \
++  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
++
++/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
++static const yytype_uint8 yytranslate[] =
++{
++       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++      24,    26,     2,     2,    25,    15,     2,    16,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,    14,
++      20,    19,    21,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,    22,     2,    23,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,    17,     2,    18,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
++       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
++       5,     6,     7,     8,     9,    10,    11,    12,    13
++};
++
++#if YYDEBUG
++/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
++   YYRHS.  */
++static const yytype_uint8 yyprhs[] =
++{
++       0,     0,     3,     8,    11,    12,    15,    21,    22,    25,
++      27,    34,    36,    38,    41,    47,    48,    51,    57,    61,
++      64,    69,    74,    77,    87,    93,    96,    97,   100,   103,
++     104,   107,   110,   113,   114,   116,   118,   121,   122,   125,
++     128,   129,   132,   135,   139,   140
++};
++
++/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
++static const yytype_int8 yyrhs[] =
++{
++      28,     0,    -1,     3,    14,    29,    34,    -1,    31,    34,
++      -1,    -1,    30,    29,    -1,    46,     4,    33,    33,    14,
++      -1,    -1,    32,    31,    -1,    30,    -1,    46,     4,    33,
++      15,    33,    14,    -1,     6,    -1,     7,    -1,    16,    35,
++      -1,    17,    36,    44,    18,    14,    -1,    -1,    36,    37,
++      -1,    46,     5,    19,    38,    14,    -1,    46,     5,    14,
++      -1,    39,    10,    -1,    39,    20,    40,    21,    -1,    39,
++      22,    43,    23,    -1,    39,    12,    -1,    39,    13,    24,
++      10,    25,    33,    25,    33,    26,    -1,    39,    13,    24,
++      10,    26,    -1,    38,    11,    -1,    -1,    38,    25,    -1,
++      39,    11,    -1,    -1,    40,    42,    -1,    40,    12,    -1,
++      40,    11,    -1,    -1,     8,    -1,     6,    -1,    41,     7,
++      -1,    -1,    43,     9,    -1,    43,    11,    -1,    -1,    45,
++      44,    -1,    45,    37,    -1,    46,     5,    35,    -1,    -1,
++      11,    -1
++};
++
++/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
++static const yytype_uint16 yyrline[] =
++{
++       0,    89,    89,    93,   101,   104,   111,   119,   122,   129,
++     133,   140,   144,   151,   158,   166,   169,   176,   180,   187,
++     191,   195,   199,   203,   220,   231,   239,   242,   246,   254,
++     257,   261,   266,   274,   277,   281,   285,   293,   296,   300,
++     308,   311,   315,   323,   331,   334
++};
++#endif
++
++#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
++/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
++   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
++static const char *const yytname[] =
++{
++  "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE",
++  "DT_PROPNODENAME", "DT_LITERAL", "DT_LEGACYLITERAL", "DT_BASE",
++  "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF", "DT_INCBIN", "';'", "'-'",
++  "'/'", "'{'", "'}'", "'='", "'<'", "'>'", "'['", "']'", "'('", "','",
++  "')'", "$accept", "sourcefile", "memreserves", "memreserve",
++  "v0_memreserves", "v0_memreserve", "addr", "devicetree", "nodedef",
++  "proplist", "propdef", "propdata", "propdataprefix", "celllist",
++  "cellbase", "cellval", "bytestring", "subnodes", "subnode", "label", 0
++};
++#endif
++
++# ifdef YYPRINT
++/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
++   token YYLEX-NUM.  */
++static const yytype_uint16 yytoknum[] =
++{
++       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
++     265,   266,   267,   268,    59,    45,    47,   123,   125,    61,
++      60,    62,    91,    93,    40,    44,    41
++};
++# endif
++
++/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
++static const yytype_uint8 yyr1[] =
++{
++       0,    27,    28,    28,    29,    29,    30,    31,    31,    32,
++      32,    33,    33,    34,    35,    36,    36,    37,    37,    38,
++      38,    38,    38,    38,    38,    38,    39,    39,    39,    40,
++      40,    40,    40,    41,    41,    42,    42,    43,    43,    43,
++      44,    44,    44,    45,    46,    46
++};
++
++/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
++static const yytype_uint8 yyr2[] =
++{
++       0,     2,     4,     2,     0,     2,     5,     0,     2,     1,
++       6,     1,     1,     2,     5,     0,     2,     5,     3,     2,
++       4,     4,     2,     9,     5,     2,     0,     2,     2,     0,
++       2,     2,     2,     0,     1,     1,     2,     0,     2,     2,
++       0,     2,     2,     3,     0,     1
++};
++
++/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
++   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
++   means the default is an error.  */
++static const yytype_uint8 yydefact[] =
++{
++       7,     0,    45,     0,     9,     0,     7,     0,     4,     1,
++       0,     3,     8,     0,     0,     4,     0,    15,    13,    11,
++      12,     0,     2,     5,     0,    40,     0,     0,     0,    16,
++       0,    40,     0,     0,     6,     0,    42,    41,     0,    10,
++      14,    18,    26,    43,     0,     0,    25,    17,    27,    19,
++      28,    22,     0,    29,    37,     0,    33,     0,     0,    35,
++      34,    32,    31,    20,     0,    30,    38,    39,    21,     0,
++      24,    36,     0,     0,     0,    23
++};
++
++/* YYDEFGOTO[NTERM-NUM].  */
++static const yytype_int8 yydefgoto[] =
++{
++      -1,     3,    14,     4,     5,     6,    27,    11,    18,    25,
++      29,    44,    45,    56,    64,    65,    57,    30,    31,     7
++};
++
++/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
++   STATE-NUM.  */
++#define YYPACT_NINF -14
++static const yytype_int8 yypact[] =
++{
++      30,   -11,   -14,     7,   -14,    -1,    27,    13,    27,   -14,
++       8,   -14,   -14,    40,    -1,    27,    35,   -14,   -14,   -14,
++     -14,    21,   -14,   -14,    40,    24,    40,    28,    40,   -14,
++      32,    24,    46,    38,   -14,    39,   -14,   -14,    26,   -14,
++     -14,   -14,   -14,   -14,    -9,    10,   -14,   -14,   -14,   -14,
++     -14,   -14,    31,   -14,   -14,    44,    -2,     3,    23,   -14,
++     -14,   -14,   -14,   -14,    50,   -14,   -14,   -14,   -14,    40,
++     -14,   -14,    33,    40,    36,   -14
++};
++
++/* YYPGOTO[NTERM-NUM].  */
++static const yytype_int8 yypgoto[] =
++{
++     -14,   -14,    48,    29,    53,   -14,   -13,    47,    34,   -14,
++      37,   -14,   -14,   -14,   -14,   -14,   -14,    42,   -14,    -7
++};
++
++/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
++   positive, shift that token.  If negative, reduce the rule which
++   number is the opposite.  If zero, do what YYDEFACT says.
++   If YYTABLE_NINF, syntax error.  */
++#define YYTABLE_NINF -45
++static const yytype_int8 yytable[] =
++{
++      21,    16,    46,     8,    59,    47,    60,     9,    16,    61,
++      62,    28,    66,    33,    67,    10,    48,    13,    32,    63,
++      49,    50,    51,    52,    32,    17,    68,    19,    20,   -44,
++      53,   -44,    54,     1,   -44,     2,    26,    15,     2,    24,
++      41,     2,    34,    17,    15,    42,    19,    20,    69,    70,
++      35,    38,    39,    40,    58,    55,    72,    71,    73,    12,
++      74,    22,    75,    23,     0,     0,     0,     0,    36,     0,
++       0,     0,    43,    37
++};
++
++static const yytype_int8 yycheck[] =
++{
++      13,     8,    11,    14,     6,    14,     8,     0,    15,    11,
++      12,    24,     9,    26,    11,    16,    25,     4,    25,    21,
++      10,    11,    12,    13,    31,    17,    23,     6,     7,     5,
++      20,     4,    22,     3,     4,    11,    15,     8,    11,     4,
++      14,    11,    14,    17,    15,    19,     6,     7,    25,    26,
++      18,     5,    14,    14,    10,    24,    69,     7,    25,     6,
++      73,    14,    26,    15,    -1,    -1,    -1,    -1,    31,    -1,
++      -1,    -1,    38,    31
++};
++
++/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
++   symbol of state STATE-NUM.  */
++static const yytype_uint8 yystos[] =
++{
++       0,     3,    11,    28,    30,    31,    32,    46,    14,     0,
++      16,    34,    31,     4,    29,    30,    46,    17,    35,     6,
++       7,    33,    34,    29,     4,    36,    15,    33,    33,    37,
++      44,    45,    46,    33,    14,    18,    37,    44,     5,    14,
++      14,    14,    19,    35,    38,    39,    11,    14,    25,    10,
++      11,    12,    13,    20,    22,    24,    40,    43,    10,     6,
++       8,    11,    12,    21,    41,    42,     9,    11,    23,    25,
++      26,     7,    33,    25,    33,    26
++};
++
++#define yyerrok               (yyerrstatus = 0)
++#define yyclearin     (yychar = YYEMPTY)
++#define YYEMPTY               (-2)
++#define YYEOF         0
++
++#define YYACCEPT      goto yyacceptlab
++#define YYABORT               goto yyabortlab
++#define YYERROR               goto yyerrorlab
++
++
++/* Like YYERROR except do call yyerror.  This remains here temporarily
++   to ease the transition to the new meaning of YYERROR, for GCC.
++   Once GCC version 2 has supplanted version 1, this can go.  */
++
++#define YYFAIL                goto yyerrlab
++
++#define YYRECOVERING()  (!!yyerrstatus)
++
++#define YYBACKUP(Token, Value)                                        \
++do                                                            \
++  if (yychar == YYEMPTY && yylen == 1)                                \
++    {                                                         \
++      yychar = (Token);                                               \
++      yylval = (Value);                                               \
++      yytoken = YYTRANSLATE (yychar);                         \
++      YYPOPSTACK (1);                                         \
++      goto yybackup;                                          \
++    }                                                         \
++  else                                                                \
++    {                                                         \
++      yyerror (YY_("syntax error: cannot back up")); \
++      YYERROR;                                                        \
++    }                                                         \
++while (YYID (0))
++
++
++#define YYTERROR      1
++#define YYERRCODE     256
++
++
++/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
++   If N is 0, then set CURRENT to the empty location which ends
++   the previous symbol: RHS[0] (always defined).  */
++
++#define YYRHSLOC(Rhs, K) ((Rhs)[K])
++#ifndef YYLLOC_DEFAULT
++# define YYLLOC_DEFAULT(Current, Rhs, N)                              \
++    do                                                                        \
++      if (YYID (N))                                                    \
++      {                                                               \
++        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
++        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
++        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
++        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
++      }                                                               \
++      else                                                            \
++      {                                                               \
++        (Current).first_line   = (Current).last_line   =              \
++          YYRHSLOC (Rhs, 0).last_line;                                \
++        (Current).first_column = (Current).last_column =              \
++          YYRHSLOC (Rhs, 0).last_column;                              \
++      }                                                               \
++    while (YYID (0))
++#endif
++
++
++/* YY_LOCATION_PRINT -- Print the location on the stream.
++   This macro was not mandated originally: define only if we know
++   we won't break user code: when these are the locations we know.  */
++
++#ifndef YY_LOCATION_PRINT
++# if YYLTYPE_IS_TRIVIAL
++#  define YY_LOCATION_PRINT(File, Loc)                        \
++     fprintf (File, "%d.%d-%d.%d",                    \
++            (Loc).first_line, (Loc).first_column,     \
++            (Loc).last_line,  (Loc).last_column)
++# else
++#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
++# endif
++#endif
++
++
++/* YYLEX -- calling `yylex' with the right arguments.  */
++
++#ifdef YYLEX_PARAM
++# define YYLEX yylex (YYLEX_PARAM)
++#else
++# define YYLEX yylex ()
++#endif
++
++/* Enable debugging if requested.  */
++#if YYDEBUG
++
++# ifndef YYFPRINTF
++#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
++#  define YYFPRINTF fprintf
++# endif
++
++# define YYDPRINTF(Args)                      \
++do {                                          \
++  if (yydebug)                                        \
++    YYFPRINTF Args;                           \
++} while (YYID (0))
++
++# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
++do {                                                                    \
++  if (yydebug)                                                                  \
++    {                                                                   \
++      YYFPRINTF (stderr, "%s ", Title);                                         \
++      yy_symbol_print (stderr,                                                  \
++                Type, Value, Location); \
++      YYFPRINTF (stderr, "\n");                                                 \
++    }                                                                   \
++} while (YYID (0))
++
++
++/*--------------------------------.
++| Print this symbol on YYOUTPUT.  |
++`--------------------------------*/
++
++/*ARGSUSED*/
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static void
++yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
++#else
++static void
++yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
++    FILE *yyoutput;
++    int yytype;
++    YYSTYPE const * const yyvaluep;
++    YYLTYPE const * const yylocationp;
++#endif
++{
++  if (!yyvaluep)
++    return;
++  YYUSE (yylocationp);
++# ifdef YYPRINT
++  if (yytype < YYNTOKENS)
++    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
++# else
++  YYUSE (yyoutput);
++# endif
++  switch (yytype)
++    {
++      default:
++      break;
++    }
++}
++
++
++/*--------------------------------.
++| Print this symbol on YYOUTPUT.  |
++`--------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static void
++yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
++#else
++static void
++yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
++    FILE *yyoutput;
++    int yytype;
++    YYSTYPE const * const yyvaluep;
++    YYLTYPE const * const yylocationp;
++#endif
++{
++  if (yytype < YYNTOKENS)
++    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
++  else
++    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
++
++  YY_LOCATION_PRINT (yyoutput, *yylocationp);
++  YYFPRINTF (yyoutput, ": ");
++  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
++  YYFPRINTF (yyoutput, ")");
++}
++
++/*------------------------------------------------------------------.
++| yy_stack_print -- Print the state stack from its BOTTOM up to its |
++| TOP (included).                                                   |
++`------------------------------------------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static void
++yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
++#else
++static void
++yy_stack_print (bottom, top)
++    yytype_int16 *bottom;
++    yytype_int16 *top;
++#endif
++{
++  YYFPRINTF (stderr, "Stack now");
++  for (; bottom <= top; ++bottom)
++    YYFPRINTF (stderr, " %d", *bottom);
++  YYFPRINTF (stderr, "\n");
++}
++
++# define YY_STACK_PRINT(Bottom, Top)                          \
++do {                                                          \
++  if (yydebug)                                                        \
++    yy_stack_print ((Bottom), (Top));                         \
++} while (YYID (0))
++
++
++/*------------------------------------------------.
++| Report that the YYRULE is going to be reduced.  |
++`------------------------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static void
++yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
++#else
++static void
++yy_reduce_print (yyvsp, yylsp, yyrule)
++    YYSTYPE *yyvsp;
++    YYLTYPE *yylsp;
++    int yyrule;
++#endif
++{
++  int yynrhs = yyr2[yyrule];
++  int yyi;
++  unsigned long int yylno = yyrline[yyrule];
++  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
++           yyrule - 1, yylno);
++  /* The symbols being reduced.  */
++  for (yyi = 0; yyi < yynrhs; yyi++)
++    {
++      fprintf (stderr, "   $%d = ", yyi + 1);
++      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
++                     &(yyvsp[(yyi + 1) - (yynrhs)])
++                     , &(yylsp[(yyi + 1) - (yynrhs)])                );
++      fprintf (stderr, "\n");
++    }
++}
++
++# define YY_REDUCE_PRINT(Rule)                \
++do {                                  \
++  if (yydebug)                                \
++    yy_reduce_print (yyvsp, yylsp, Rule); \
++} while (YYID (0))
++
++/* Nonzero means print parse trace.  It is left uninitialized so that
++   multiple parsers can coexist.  */
++int yydebug;
++#else /* !YYDEBUG */
++# define YYDPRINTF(Args)
++# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
++# define YY_STACK_PRINT(Bottom, Top)
++# define YY_REDUCE_PRINT(Rule)
++#endif /* !YYDEBUG */
++
++
++/* YYINITDEPTH -- initial size of the parser's stacks.  */
++#ifndef       YYINITDEPTH
++# define YYINITDEPTH 200
++#endif
++
++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
++   if the built-in stack extension method is used).
++
++   Do not make this value too large; the results are undefined if
++   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
++   evaluated with infinite-precision integer arithmetic.  */
++
++#ifndef YYMAXDEPTH
++# define YYMAXDEPTH 10000
++#endif
++
++\f
++
++#if YYERROR_VERBOSE
++
++# ifndef yystrlen
++#  if defined __GLIBC__ && defined _STRING_H
++#   define yystrlen strlen
++#  else
++/* Return the length of YYSTR.  */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static YYSIZE_T
++yystrlen (const char *yystr)
++#else
++static YYSIZE_T
++yystrlen (yystr)
++    const char *yystr;
++#endif
++{
++  YYSIZE_T yylen;
++  for (yylen = 0; yystr[yylen]; yylen++)
++    continue;
++  return yylen;
++}
++#  endif
++# endif
++
++# ifndef yystpcpy
++#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
++#   define yystpcpy stpcpy
++#  else
++/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
++   YYDEST.  */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static char *
++yystpcpy (char *yydest, const char *yysrc)
++#else
++static char *
++yystpcpy (yydest, yysrc)
++    char *yydest;
++    const char *yysrc;
++#endif
++{
++  char *yyd = yydest;
++  const char *yys = yysrc;
++
++  while ((*yyd++ = *yys++) != '\0')
++    continue;
++
++  return yyd - 1;
++}
++#  endif
++# endif
++
++# ifndef yytnamerr
++/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
++   quotes and backslashes, so that it's suitable for yyerror.  The
++   heuristic is that double-quoting is unnecessary unless the string
++   contains an apostrophe, a comma, or backslash (other than
++   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
++   null, do not copy; instead, return the length of what the result
++   would have been.  */
++static YYSIZE_T
++yytnamerr (char *yyres, const char *yystr)
++{
++  if (*yystr == '"')
++    {
++      YYSIZE_T yyn = 0;
++      char const *yyp = yystr;
++
++      for (;;)
++      switch (*++yyp)
++        {
++        case '\'':
++        case ',':
++          goto do_not_strip_quotes;
++
++        case '\\':
++          if (*++yyp != '\\')
++            goto do_not_strip_quotes;
++          /* Fall through.  */
++        default:
++          if (yyres)
++            yyres[yyn] = *yyp;
++          yyn++;
++          break;
++
++        case '"':
++          if (yyres)
++            yyres[yyn] = '\0';
++          return yyn;
++        }
++    do_not_strip_quotes: ;
++    }
++
++  if (! yyres)
++    return yystrlen (yystr);
++
++  return yystpcpy (yyres, yystr) - yyres;
++}
++# endif
++
++/* Copy into YYRESULT an error message about the unexpected token
++   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
++   including the terminating null byte.  If YYRESULT is null, do not
++   copy anything; just return the number of bytes that would be
++   copied.  As a special case, return 0 if an ordinary "syntax error"
++   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
++   size calculation.  */
++static YYSIZE_T
++yysyntax_error (char *yyresult, int yystate, int yychar)
++{
++  int yyn = yypact[yystate];
++
++  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
++    return 0;
++  else
++    {
++      int yytype = YYTRANSLATE (yychar);
++      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
++      YYSIZE_T yysize = yysize0;
++      YYSIZE_T yysize1;
++      int yysize_overflow = 0;
++      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
++      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
++      int yyx;
++
++# if 0
++      /* This is so xgettext sees the translatable formats that are
++       constructed on the fly.  */
++      YY_("syntax error, unexpected %s");
++      YY_("syntax error, unexpected %s, expecting %s");
++      YY_("syntax error, unexpected %s, expecting %s or %s");
++      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
++      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
++# endif
++      char *yyfmt;
++      char const *yyf;
++      static char const yyunexpected[] = "syntax error, unexpected %s";
++      static char const yyexpecting[] = ", expecting %s";
++      static char const yyor[] = " or %s";
++      char yyformat[sizeof yyunexpected
++                  + sizeof yyexpecting - 1
++                  + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
++                     * (sizeof yyor - 1))];
++      char const *yyprefix = yyexpecting;
++
++      /* Start YYX at -YYN if negative to avoid negative indexes in
++       YYCHECK.  */
++      int yyxbegin = yyn < 0 ? -yyn : 0;
++
++      /* Stay within bounds of both yycheck and yytname.  */
++      int yychecklim = YYLAST - yyn + 1;
++      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
++      int yycount = 1;
++
++      yyarg[0] = yytname[yytype];
++      yyfmt = yystpcpy (yyformat, yyunexpected);
++
++      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
++      if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
++        {
++          if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
++            {
++              yycount = 1;
++              yysize = yysize0;
++              yyformat[sizeof yyunexpected - 1] = '\0';
++              break;
++            }
++          yyarg[yycount++] = yytname[yyx];
++          yysize1 = yysize + yytnamerr (0, yytname[yyx]);
++          yysize_overflow |= (yysize1 < yysize);
++          yysize = yysize1;
++          yyfmt = yystpcpy (yyfmt, yyprefix);
++          yyprefix = yyor;
++        }
++
++      yyf = YY_(yyformat);
++      yysize1 = yysize + yystrlen (yyf);
++      yysize_overflow |= (yysize1 < yysize);
++      yysize = yysize1;
++
++      if (yysize_overflow)
++      return YYSIZE_MAXIMUM;
++
++      if (yyresult)
++      {
++        /* Avoid sprintf, as that infringes on the user's name space.
++           Don't have undefined behavior even if the translation
++           produced a string with the wrong number of "%s"s.  */
++        char *yyp = yyresult;
++        int yyi = 0;
++        while ((*yyp = *yyf) != '\0')
++          {
++            if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
++              {
++                yyp += yytnamerr (yyp, yyarg[yyi++]);
++                yyf += 2;
++              }
++            else
++              {
++                yyp++;
++                yyf++;
++              }
++          }
++      }
++      return yysize;
++    }
++}
++#endif /* YYERROR_VERBOSE */
++\f
++
++/*-----------------------------------------------.
++| Release the memory associated to this symbol.  |
++`-----------------------------------------------*/
++
++/*ARGSUSED*/
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++static void
++yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
++#else
++static void
++yydestruct (yymsg, yytype, yyvaluep, yylocationp)
++    const char *yymsg;
++    int yytype;
++    YYSTYPE *yyvaluep;
++    YYLTYPE *yylocationp;
++#endif
++{
++  YYUSE (yyvaluep);
++  YYUSE (yylocationp);
++
++  if (!yymsg)
++    yymsg = "Deleting";
++  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
++
++  switch (yytype)
++    {
++
++      default:
++      break;
++    }
++}
++\f
++
++/* Prevent warnings from -Wmissing-prototypes.  */
++
++#ifdef YYPARSE_PARAM
++#if defined __STDC__ || defined __cplusplus
++int yyparse (void *YYPARSE_PARAM);
++#else
++int yyparse ();
++#endif
++#else /* ! YYPARSE_PARAM */
++#if defined __STDC__ || defined __cplusplus
++int yyparse (void);
++#else
++int yyparse ();
++#endif
++#endif /* ! YYPARSE_PARAM */
++
++
++
++/* The look-ahead symbol.  */
++int yychar;
++
++/* The semantic value of the look-ahead symbol.  */
++YYSTYPE yylval;
++
++/* Number of syntax errors so far.  */
++int yynerrs;
++/* Location data for the look-ahead symbol.  */
++YYLTYPE yylloc;
++
++
++
++/*----------.
++| yyparse.  |
++`----------*/
++
++#ifdef YYPARSE_PARAM
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++int
++yyparse (void *YYPARSE_PARAM)
++#else
++int
++yyparse (YYPARSE_PARAM)
++    void *YYPARSE_PARAM;
++#endif
++#else /* ! YYPARSE_PARAM */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++     || defined __cplusplus || defined _MSC_VER)
++int
++yyparse (void)
++#else
++int
++yyparse ()
++
++#endif
++#endif
++{
++  
++  int yystate;
++  int yyn;
++  int yyresult;
++  /* Number of tokens to shift before error messages enabled.  */
++  int yyerrstatus;
++  /* Look-ahead token as an internal (translated) token number.  */
++  int yytoken = 0;
++#if YYERROR_VERBOSE
++  /* Buffer for error messages, and its allocated size.  */
++  char yymsgbuf[128];
++  char *yymsg = yymsgbuf;
++  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
++#endif
++
++  /* Three stacks and their tools:
++     `yyss': related to states,
++     `yyvs': related to semantic values,
++     `yyls': related to locations.
++
++     Refer to the stacks thru separate pointers, to allow yyoverflow
++     to reallocate them elsewhere.  */
++
++  /* The state stack.  */
++  yytype_int16 yyssa[YYINITDEPTH];
++  yytype_int16 *yyss = yyssa;
++  yytype_int16 *yyssp;
++
++  /* The semantic value stack.  */
++  YYSTYPE yyvsa[YYINITDEPTH];
++  YYSTYPE *yyvs = yyvsa;
++  YYSTYPE *yyvsp;
++
++  /* The location stack.  */
++  YYLTYPE yylsa[YYINITDEPTH];
++  YYLTYPE *yyls = yylsa;
++  YYLTYPE *yylsp;
++  /* The locations where the error started and ended.  */
++  YYLTYPE yyerror_range[2];
++
++#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
++
++  YYSIZE_T yystacksize = YYINITDEPTH;
++
++  /* The variables used to return semantic value and location from the
++     action routines.  */
++  YYSTYPE yyval;
++  YYLTYPE yyloc;
++
++  /* The number of symbols on the RHS of the reduced rule.
++     Keep to zero when no symbol should be popped.  */
++  int yylen = 0;
++
++  YYDPRINTF ((stderr, "Starting parse\n"));
++
++  yystate = 0;
++  yyerrstatus = 0;
++  yynerrs = 0;
++  yychar = YYEMPTY;           /* Cause a token to be read.  */
++
++  /* Initialize stack pointers.
++     Waste one element of value and location stack
++     so that they stay on the same level as the state stack.
++     The wasted elements are never initialized.  */
++
++  yyssp = yyss;
++  yyvsp = yyvs;
++  yylsp = yyls;
++#if YYLTYPE_IS_TRIVIAL
++  /* Initialize the default location before parsing starts.  */
++  yylloc.first_line   = yylloc.last_line   = 1;
++  yylloc.first_column = yylloc.last_column = 0;
++#endif
++
++  goto yysetstate;
++
++/*------------------------------------------------------------.
++| yynewstate -- Push a new state, which is found in yystate.  |
++`------------------------------------------------------------*/
++ yynewstate:
++  /* In all cases, when you get here, the value and location stacks
++     have just been pushed.  So pushing a state here evens the stacks.  */
++  yyssp++;
++
++ yysetstate:
++  *yyssp = yystate;
++
++  if (yyss + yystacksize - 1 <= yyssp)
++    {
++      /* Get the current used size of the three stacks, in elements.  */
++      YYSIZE_T yysize = yyssp - yyss + 1;
++
++#ifdef yyoverflow
++      {
++      /* Give user a chance to reallocate the stack.  Use copies of
++         these so that the &'s don't force the real ones into
++         memory.  */
++      YYSTYPE *yyvs1 = yyvs;
++      yytype_int16 *yyss1 = yyss;
++      YYLTYPE *yyls1 = yyls;
++
++      /* Each stack pointer address is followed by the size of the
++         data in use in that stack, in bytes.  This used to be a
++         conditional around just the two extra args, but that might
++         be undefined if yyoverflow is a macro.  */
++      yyoverflow (YY_("memory exhausted"),
++                  &yyss1, yysize * sizeof (*yyssp),
++                  &yyvs1, yysize * sizeof (*yyvsp),
++                  &yyls1, yysize * sizeof (*yylsp),
++                  &yystacksize);
++      yyls = yyls1;
++      yyss = yyss1;
++      yyvs = yyvs1;
++      }
++#else /* no yyoverflow */
++# ifndef YYSTACK_RELOCATE
++      goto yyexhaustedlab;
++# else
++      /* Extend the stack our own way.  */
++      if (YYMAXDEPTH <= yystacksize)
++      goto yyexhaustedlab;
++      yystacksize *= 2;
++      if (YYMAXDEPTH < yystacksize)
++      yystacksize = YYMAXDEPTH;
++
++      {
++      yytype_int16 *yyss1 = yyss;
++      union yyalloc *yyptr =
++        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
++      if (! yyptr)
++        goto yyexhaustedlab;
++      YYSTACK_RELOCATE (yyss);
++      YYSTACK_RELOCATE (yyvs);
++      YYSTACK_RELOCATE (yyls);
++#  undef YYSTACK_RELOCATE
++      if (yyss1 != yyssa)
++        YYSTACK_FREE (yyss1);
++      }
++# endif
++#endif /* no yyoverflow */
++
++      yyssp = yyss + yysize - 1;
++      yyvsp = yyvs + yysize - 1;
++      yylsp = yyls + yysize - 1;
++
++      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
++                (unsigned long int) yystacksize));
++
++      if (yyss + yystacksize - 1 <= yyssp)
++      YYABORT;
++    }
++
++  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
++
++  goto yybackup;
++
++/*-----------.
++| yybackup.  |
++`-----------*/
++yybackup:
++
++  /* Do appropriate processing given the current state.  Read a
++     look-ahead token if we need one and don't already have one.  */
++
++  /* First try to decide what to do without reference to look-ahead token.  */
++  yyn = yypact[yystate];
++  if (yyn == YYPACT_NINF)
++    goto yydefault;
++
++  /* Not known => get a look-ahead token if don't already have one.  */
++
++  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
++  if (yychar == YYEMPTY)
++    {
++      YYDPRINTF ((stderr, "Reading a token: "));
++      yychar = YYLEX;
++    }
++
++  if (yychar <= YYEOF)
++    {
++      yychar = yytoken = YYEOF;
++      YYDPRINTF ((stderr, "Now at end of input.\n"));
++    }
++  else
++    {
++      yytoken = YYTRANSLATE (yychar);
++      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
++    }
++
++  /* If the proper action on seeing token YYTOKEN is to reduce or to
++     detect an error, take that action.  */
++  yyn += yytoken;
++  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
++    goto yydefault;
++  yyn = yytable[yyn];
++  if (yyn <= 0)
++    {
++      if (yyn == 0 || yyn == YYTABLE_NINF)
++      goto yyerrlab;
++      yyn = -yyn;
++      goto yyreduce;
++    }
++
++  if (yyn == YYFINAL)
++    YYACCEPT;
++
++  /* Count tokens shifted since error; after three, turn off error
++     status.  */
++  if (yyerrstatus)
++    yyerrstatus--;
++
++  /* Shift the look-ahead token.  */
++  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
++
++  /* Discard the shifted token unless it is eof.  */
++  if (yychar != YYEOF)
++    yychar = YYEMPTY;
++
++  yystate = yyn;
++  *++yyvsp = yylval;
++  *++yylsp = yylloc;
++  goto yynewstate;
++
++
++/*-----------------------------------------------------------.
++| yydefault -- do the default action for the current state.  |
++`-----------------------------------------------------------*/
++yydefault:
++  yyn = yydefact[yystate];
++  if (yyn == 0)
++    goto yyerrlab;
++  goto yyreduce;
++
++
++/*-----------------------------.
++| yyreduce -- Do a reduction.  |
++`-----------------------------*/
++yyreduce:
++  /* yyn is the number of a rule to reduce with.  */
++  yylen = yyr2[yyn];
++
++  /* If YYLEN is nonzero, implement the default value of the action:
++     `$$ = $1'.
++
++     Otherwise, the following line sets YYVAL to garbage.
++     This behavior is undocumented and Bison
++     users should not rely upon it.  Assigning to YYVAL
++     unconditionally makes the parser a bit smaller, and it avoids a
++     GCC warning that YYVAL may be used uninitialized.  */
++  yyval = yyvsp[1-yylen];
++
++  /* Default location.  */
++  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
++  YY_REDUCE_PRINT (yyn);
++  switch (yyn)
++    {
++        case 2:
++#line 90 "dtc-parser.y"
++    {
++                      the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), 0);
++              ;}
++    break;
++
++  case 3:
++#line 94 "dtc-parser.y"
++    {
++                      the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node), 0);
++              ;}
++    break;
++
++  case 4:
++#line 101 "dtc-parser.y"
++    {
++                      (yyval.re) = NULL;
++              ;}
++    break;
++
++  case 5:
++#line 105 "dtc-parser.y"
++    {
++                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
++              ;}
++    break;
++
++  case 6:
++#line 112 "dtc-parser.y"
++    {
++                      (yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref));
++              ;}
++    break;
++
++  case 7:
++#line 119 "dtc-parser.y"
++    {
++                      (yyval.re) = NULL;
++              ;}
++    break;
++
++  case 8:
++#line 123 "dtc-parser.y"
++    {
++                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
++              ;}
++    break;
++
++  case 9:
++#line 130 "dtc-parser.y"
++    {
++                      (yyval.re) = (yyvsp[(1) - (1)].re);
++              ;}
++    break;
++
++  case 10:
++#line 134 "dtc-parser.y"
++    {
++                      (yyval.re) = build_reserve_entry((yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr) - (yyvsp[(3) - (6)].addr) + 1, (yyvsp[(1) - (6)].labelref));
++              ;}
++    break;
++
++  case 11:
++#line 141 "dtc-parser.y"
++    {
++                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
++              ;}
++    break;
++
++  case 12:
++#line 145 "dtc-parser.y"
++    {
++                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64);
++              ;}
++    break;
++
++  case 13:
++#line 152 "dtc-parser.y"
++    {
++                      (yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL);
++              ;}
++    break;
++
++  case 14:
++#line 159 "dtc-parser.y"
++    {
++                      (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
++              ;}
++    break;
++
++  case 15:
++#line 166 "dtc-parser.y"
++    {
++                      (yyval.proplist) = NULL;
++              ;}
++    break;
++
++  case 16:
++#line 170 "dtc-parser.y"
++    {
++                      (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
++              ;}
++    break;
++
++  case 17:
++#line 177 "dtc-parser.y"
++    {
++                      (yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref));
++              ;}
++    break;
++
++  case 18:
++#line 181 "dtc-parser.y"
++    {
++                      (yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref));
++              ;}
++    break;
++
++  case 19:
++#line 188 "dtc-parser.y"
++    {
++                      (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
++              ;}
++    break;
++
++  case 20:
++#line 192 "dtc-parser.y"
++    {
++                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
++              ;}
++    break;
++
++  case 21:
++#line 196 "dtc-parser.y"
++    {
++                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
++              ;}
++    break;
++
++  case 22:
++#line 200 "dtc-parser.y"
++    {
++                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
++              ;}
++    break;
++
++  case 23:
++#line 204 "dtc-parser.y"
++    {
++                      struct search_path path = { srcpos_file->dir, NULL, NULL };
++                      struct dtc_file *file = dtc_open_file((yyvsp[(4) - (9)].data).val, &path);
++                      struct data d = empty_data;
++
++                      if ((yyvsp[(6) - (9)].addr) != 0)
++                              if (fseek(file->file, (yyvsp[(6) - (9)].addr), SEEK_SET) != 0)
++                                      yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
++                                               (unsigned long long)(yyvsp[(6) - (9)].addr),
++                                               (yyvsp[(4) - (9)].data).val, strerror(errno));
++
++                      d = data_copy_file(file->file, (yyvsp[(8) - (9)].addr));
++
++                      (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d);
++                      dtc_close_file(file);
++              ;}
++    break;
++
++  case 24:
++#line 221 "dtc-parser.y"
++    {
++                      struct search_path path = { srcpos_file->dir, NULL, NULL };
++                      struct dtc_file *file = dtc_open_file((yyvsp[(4) - (5)].data).val, &path);
++                      struct data d = empty_data;
++
++                      d = data_copy_file(file->file, -1);
++
++                      (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d);
++                      dtc_close_file(file);
++              ;}
++    break;
++
++  case 25:
++#line 232 "dtc-parser.y"
++    {
++                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++              ;}
++    break;
++
++  case 26:
++#line 239 "dtc-parser.y"
++    {
++                      (yyval.data) = empty_data;
++              ;}
++    break;
++
++  case 27:
++#line 243 "dtc-parser.y"
++    {
++                      (yyval.data) = (yyvsp[(1) - (2)].data);
++              ;}
++    break;
++
++  case 28:
++#line 247 "dtc-parser.y"
++    {
++                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++              ;}
++    break;
++
++  case 29:
++#line 254 "dtc-parser.y"
++    {
++                      (yyval.data) = empty_data;
++              ;}
++    break;
++
++  case 30:
++#line 258 "dtc-parser.y"
++    {
++                      (yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));
++              ;}
++    break;
++
++  case 31:
++#line 262 "dtc-parser.y"
++    {
++                      (yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,
++                                                            (yyvsp[(2) - (2)].labelref)), -1);
++              ;}
++    break;
++
++  case 32:
++#line 267 "dtc-parser.y"
++    {
++                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++              ;}
++    break;
++
++  case 33:
++#line 274 "dtc-parser.y"
++    {
++                      (yyval.cbase) = 16;
++              ;}
++    break;
++
++  case 35:
++#line 282 "dtc-parser.y"
++    {
++                      (yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);
++              ;}
++    break;
++
++  case 36:
++#line 286 "dtc-parser.y"
++    {
++                      (yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32);
++              ;}
++    break;
++
++  case 37:
++#line 293 "dtc-parser.y"
++    {
++                      (yyval.data) = empty_data;
++              ;}
++    break;
++
++  case 38:
++#line 297 "dtc-parser.y"
++    {
++                      (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
++              ;}
++    break;
++
++  case 39:
++#line 301 "dtc-parser.y"
++    {
++                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++              ;}
++    break;
++
++  case 40:
++#line 308 "dtc-parser.y"
++    {
++                      (yyval.nodelist) = NULL;
++              ;}
++    break;
++
++  case 41:
++#line 312 "dtc-parser.y"
++    {
++                      (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
++              ;}
++    break;
++
++  case 42:
++#line 316 "dtc-parser.y"
++    {
++                      yyerror("syntax error: properties must precede subnodes");
++                      YYERROR;
++              ;}
++    break;
++
++  case 43:
++#line 324 "dtc-parser.y"
++    {
++                      (yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref));
++              ;}
++    break;
++
++  case 44:
++#line 331 "dtc-parser.y"
++    {
++                      (yyval.labelref) = NULL;
++              ;}
++    break;
++
++  case 45:
++#line 335 "dtc-parser.y"
++    {
++                      (yyval.labelref) = (yyvsp[(1) - (1)].labelref);
++              ;}
++    break;
++
++
++/* Line 1267 of yacc.c.  */
++#line 1780 "dtc-parser.tab.c"
++      default: break;
++    }
++  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
++
++  YYPOPSTACK (yylen);
++  yylen = 0;
++  YY_STACK_PRINT (yyss, yyssp);
++
++  *++yyvsp = yyval;
++  *++yylsp = yyloc;
++
++  /* Now `shift' the result of the reduction.  Determine what state
++     that goes to, based on the state we popped back to and the rule
++     number reduced by.  */
++
++  yyn = yyr1[yyn];
++
++  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
++  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
++    yystate = yytable[yystate];
++  else
++    yystate = yydefgoto[yyn - YYNTOKENS];
++
++  goto yynewstate;
++
++
++/*------------------------------------.
++| yyerrlab -- here on detecting error |
++`------------------------------------*/
++yyerrlab:
++  /* If not already recovering from an error, report this error.  */
++  if (!yyerrstatus)
++    {
++      ++yynerrs;
++#if ! YYERROR_VERBOSE
++      yyerror (YY_("syntax error"));
++#else
++      {
++      YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
++      if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
++        {
++          YYSIZE_T yyalloc = 2 * yysize;
++          if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
++            yyalloc = YYSTACK_ALLOC_MAXIMUM;
++          if (yymsg != yymsgbuf)
++            YYSTACK_FREE (yymsg);
++          yymsg = (char *) YYSTACK_ALLOC (yyalloc);
++          if (yymsg)
++            yymsg_alloc = yyalloc;
++          else
++            {
++              yymsg = yymsgbuf;
++              yymsg_alloc = sizeof yymsgbuf;
++            }
++        }
++
++      if (0 < yysize && yysize <= yymsg_alloc)
++        {
++          (void) yysyntax_error (yymsg, yystate, yychar);
++          yyerror (yymsg);
++        }
++      else
++        {
++          yyerror (YY_("syntax error"));
++          if (yysize != 0)
++            goto yyexhaustedlab;
++        }
++      }
++#endif
++    }
++
++  yyerror_range[0] = yylloc;
++
++  if (yyerrstatus == 3)
++    {
++      /* If just tried and failed to reuse look-ahead token after an
++       error, discard it.  */
++
++      if (yychar <= YYEOF)
++      {
++        /* Return failure if at end of input.  */
++        if (yychar == YYEOF)
++          YYABORT;
++      }
++      else
++      {
++        yydestruct ("Error: discarding",
++                    yytoken, &yylval, &yylloc);
++        yychar = YYEMPTY;
++      }
++    }
++
++  /* Else will try to reuse look-ahead token after shifting the error
++     token.  */
++  goto yyerrlab1;
++
++
++/*---------------------------------------------------.
++| yyerrorlab -- error raised explicitly by YYERROR.  |
++`---------------------------------------------------*/
++yyerrorlab:
++
++  /* Pacify compilers like GCC when the user code never invokes
++     YYERROR and the label yyerrorlab therefore never appears in user
++     code.  */
++  if (/*CONSTCOND*/ 0)
++     goto yyerrorlab;
++
++  yyerror_range[0] = yylsp[1-yylen];
++  /* Do not reclaim the symbols of the rule which action triggered
++     this YYERROR.  */
++  YYPOPSTACK (yylen);
++  yylen = 0;
++  YY_STACK_PRINT (yyss, yyssp);
++  yystate = *yyssp;
++  goto yyerrlab1;
++
++
++/*-------------------------------------------------------------.
++| yyerrlab1 -- common code for both syntax error and YYERROR.  |
++`-------------------------------------------------------------*/
++yyerrlab1:
++  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
++
++  for (;;)
++    {
++      yyn = yypact[yystate];
++      if (yyn != YYPACT_NINF)
++      {
++        yyn += YYTERROR;
++        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
++          {
++            yyn = yytable[yyn];
++            if (0 < yyn)
++              break;
++          }
++      }
++
++      /* Pop the current state because it cannot handle the error token.  */
++      if (yyssp == yyss)
++      YYABORT;
++
++      yyerror_range[0] = *yylsp;
++      yydestruct ("Error: popping",
++                yystos[yystate], yyvsp, yylsp);
++      YYPOPSTACK (1);
++      yystate = *yyssp;
++      YY_STACK_PRINT (yyss, yyssp);
++    }
++
++  if (yyn == YYFINAL)
++    YYACCEPT;
++
++  *++yyvsp = yylval;
++
++  yyerror_range[1] = yylloc;
++  /* Using YYLLOC is tempting, but would change the location of
++     the look-ahead.  YYLOC is available though.  */
++  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
++  *++yylsp = yyloc;
++
++  /* Shift the error token.  */
++  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
++
++  yystate = yyn;
++  goto yynewstate;
++
++
++/*-------------------------------------.
++| yyacceptlab -- YYACCEPT comes here.  |
++`-------------------------------------*/
++yyacceptlab:
++  yyresult = 0;
++  goto yyreturn;
++
++/*-----------------------------------.
++| yyabortlab -- YYABORT comes here.  |
++`-----------------------------------*/
++yyabortlab:
++  yyresult = 1;
++  goto yyreturn;
++
++#ifndef yyoverflow
++/*-------------------------------------------------.
++| yyexhaustedlab -- memory exhaustion comes here.  |
++`-------------------------------------------------*/
++yyexhaustedlab:
++  yyerror (YY_("memory exhausted"));
++  yyresult = 2;
++  /* Fall through.  */
++#endif
++
++yyreturn:
++  if (yychar != YYEOF && yychar != YYEMPTY)
++     yydestruct ("Cleanup: discarding lookahead",
++               yytoken, &yylval, &yylloc);
++  /* Do not reclaim the symbols of the rule which action triggered
++     this YYABORT or YYACCEPT.  */
++  YYPOPSTACK (yylen);
++  YY_STACK_PRINT (yyss, yyssp);
++  while (yyssp != yyss)
++    {
++      yydestruct ("Cleanup: popping",
++                yystos[*yyssp], yyvsp, yylsp);
++      YYPOPSTACK (1);
++    }
++#ifndef yyoverflow
++  if (yyss != yyssa)
++    YYSTACK_FREE (yyss);
++#endif
++#if YYERROR_VERBOSE
++  if (yymsg != yymsgbuf)
++    YYSTACK_FREE (yymsg);
++#endif
++  /* Make sure YYID is used.  */
++  return YYID (yyresult);
++}
++
++
++#line 340 "dtc-parser.y"
++
++
++void yyerrorf(char const *s, ...)
++{
++      const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
++      va_list va;
++      va_start(va, s);
++
++      if (strcmp(fname, "-") == 0)
++              fname = "stdin";
++
++      fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
++      vfprintf(stderr, s, va);
++      fprintf(stderr, "\n");
++
++      treesource_error = 1;
++      va_end(va);
++}
++
++void yyerror (char const *s)
++{
++      yyerrorf("%s", s);
++}
++
++static unsigned long long eval_literal(const char *s, int base, int bits)
++{
++      unsigned long long val;
++      char *e;
++
++      errno = 0;
++      val = strtoull(s, &e, base);
++      if (*e)
++              yyerror("bad characters in literal");
++      else if ((errno == ERANGE)
++               || ((bits < 64) && (val >= (1ULL << bits))))
++              yyerror("literal out of range");
++      else if (errno != 0)
++              yyerror("bad literal");
++      return val;
++}
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc-parser.tab.h_shipped linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.tab.h_shipped
+--- linux-2.6.30-rc4/scripts/dtc/dtc-parser.tab.h_shipped      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.tab.h_shipped  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,113 @@
++/* A Bison parser, made by GNU Bison 2.3.  */
++
++/* Skeleton interface for Bison's Yacc-like parsers in C
++
++   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
++   Free Software Foundation, 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, 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., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.  */
++
++/* As a special exception, you may create a larger work that contains
++   part or all of the Bison parser skeleton and distribute that work
++   under terms of your choice, so long as that work isn't itself a
++   parser generator using the skeleton or a modified version thereof
++   as a parser skeleton.  Alternatively, if you modify or redistribute
++   the parser skeleton itself, you may (at your option) remove this
++   special exception, which will cause the skeleton and the resulting
++   Bison output files to be licensed under the GNU General Public
++   License without this special exception.
++
++   This special exception was added by the Free Software Foundation in
++   version 2.2 of Bison.  */
++
++/* Tokens.  */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++   /* Put the tokens into the symbol table, so that GDB and other debuggers
++      know about them.  */
++   enum yytokentype {
++     DT_V1 = 258,
++     DT_MEMRESERVE = 259,
++     DT_PROPNODENAME = 260,
++     DT_LITERAL = 261,
++     DT_LEGACYLITERAL = 262,
++     DT_BASE = 263,
++     DT_BYTE = 264,
++     DT_STRING = 265,
++     DT_LABEL = 266,
++     DT_REF = 267,
++     DT_INCBIN = 268
++   };
++#endif
++/* Tokens.  */
++#define DT_V1 258
++#define DT_MEMRESERVE 259
++#define DT_PROPNODENAME 260
++#define DT_LITERAL 261
++#define DT_LEGACYLITERAL 262
++#define DT_BASE 263
++#define DT_BYTE 264
++#define DT_STRING 265
++#define DT_LABEL 266
++#define DT_REF 267
++#define DT_INCBIN 268
++
++
++
++
++#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++typedef union YYSTYPE
++#line 37 "dtc-parser.y"
++{
++      char *propnodename;
++      char *literal;
++      char *labelref;
++      unsigned int cbase;
++      uint8_t byte;
++      struct data data;
++
++      uint64_t addr;
++      cell_t cell;
++      struct property *prop;
++      struct property *proplist;
++      struct node *node;
++      struct node *nodelist;
++      struct reserve_info *re;
++}
++/* Line 1489 of yacc.c.  */
++#line 92 "dtc-parser.tab.h"
++      YYSTYPE;
++# define yystype YYSTYPE /* obsolescent; will be withdrawn */
++# define YYSTYPE_IS_DECLARED 1
++# define YYSTYPE_IS_TRIVIAL 1
++#endif
++
++extern YYSTYPE yylval;
++
++#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
++typedef struct YYLTYPE
++{
++  int first_line;
++  int first_column;
++  int last_line;
++  int last_column;
++} YYLTYPE;
++# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
++# define YYLTYPE_IS_DECLARED 1
++# define YYLTYPE_IS_TRIVIAL 1
++#endif
++
++extern YYLTYPE yylloc;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/dtc-parser.y linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.y
+--- linux-2.6.30-rc4/scripts/dtc/dtc-parser.y  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/dtc-parser.y      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,379 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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
++ */
++
++%locations
++
++%{
++#include <stdio.h>
++
++#include "dtc.h"
++#include "srcpos.h"
++
++extern int yylex(void);
++
++extern struct boot_info *the_boot_info;
++extern int treesource_error;
++
++static unsigned long long eval_literal(const char *s, int base, int bits);
++%}
++
++%union {
++      char *propnodename;
++      char *literal;
++      char *labelref;
++      unsigned int cbase;
++      uint8_t byte;
++      struct data data;
++
++      uint64_t addr;
++      cell_t cell;
++      struct property *prop;
++      struct property *proplist;
++      struct node *node;
++      struct node *nodelist;
++      struct reserve_info *re;
++}
++
++%token DT_V1
++%token DT_MEMRESERVE
++%token <propnodename> DT_PROPNODENAME
++%token <literal> DT_LITERAL
++%token <literal> DT_LEGACYLITERAL
++%token <cbase> DT_BASE
++%token <byte> DT_BYTE
++%token <data> DT_STRING
++%token <labelref> DT_LABEL
++%token <labelref> DT_REF
++%token DT_INCBIN
++
++%type <data> propdata
++%type <data> propdataprefix
++%type <re> memreserve
++%type <re> memreserves
++%type <re> v0_memreserve
++%type <re> v0_memreserves
++%type <addr> addr
++%type <data> celllist
++%type <cbase> cellbase
++%type <cell> cellval
++%type <data> bytestring
++%type <prop> propdef
++%type <proplist> proplist
++
++%type <node> devicetree
++%type <node> nodedef
++%type <node> subnode
++%type <nodelist> subnodes
++%type <labelref> label
++
++%%
++
++sourcefile:
++        DT_V1 ';' memreserves devicetree
++              {
++                      the_boot_info = build_boot_info($3, $4, 0);
++              }
++      | v0_memreserves devicetree
++              {
++                      the_boot_info = build_boot_info($1, $2, 0);
++              }
++      ;
++
++memreserves:
++        /* empty */
++              {
++                      $$ = NULL;
++              }
++      | memreserve memreserves
++              {
++                      $$ = chain_reserve_entry($1, $2);
++              }
++      ;
++
++memreserve:
++        label DT_MEMRESERVE addr addr ';'
++              {
++                      $$ = build_reserve_entry($3, $4, $1);
++              }
++      ;
++
++v0_memreserves:
++        /* empty */
++              {
++                      $$ = NULL;
++              }
++      | v0_memreserve v0_memreserves
++              {
++                      $$ = chain_reserve_entry($1, $2);
++              };
++      ;
++
++v0_memreserve:
++        memreserve
++              {
++                      $$ = $1;
++              }
++      | label DT_MEMRESERVE addr '-' addr ';'
++              {
++                      $$ = build_reserve_entry($3, $5 - $3 + 1, $1);
++              }
++      ;
++
++addr:
++        DT_LITERAL
++              {
++                      $$ = eval_literal($1, 0, 64);
++              }
++      | DT_LEGACYLITERAL
++              {
++                      $$ = eval_literal($1, 16, 64);
++              }
++        ;
++
++devicetree:
++        '/' nodedef
++              {
++                      $$ = name_node($2, "", NULL);
++              }
++      ;
++
++nodedef:
++        '{' proplist subnodes '}' ';'
++              {
++                      $$ = build_node($2, $3);
++              }
++      ;
++
++proplist:
++        /* empty */
++              {
++                      $$ = NULL;
++              }
++      | proplist propdef
++              {
++                      $$ = chain_property($2, $1);
++              }
++      ;
++
++propdef:
++        label DT_PROPNODENAME '=' propdata ';'
++              {
++                      $$ = build_property($2, $4, $1);
++              }
++      | label DT_PROPNODENAME ';'
++              {
++                      $$ = build_property($2, empty_data, $1);
++              }
++      ;
++
++propdata:
++        propdataprefix DT_STRING
++              {
++                      $$ = data_merge($1, $2);
++              }
++      | propdataprefix '<' celllist '>'
++              {
++                      $$ = data_merge($1, $3);
++              }
++      | propdataprefix '[' bytestring ']'
++              {
++                      $$ = data_merge($1, $3);
++              }
++      | propdataprefix DT_REF
++              {
++                      $$ = data_add_marker($1, REF_PATH, $2);
++              }
++      | propdataprefix DT_INCBIN '(' DT_STRING ',' addr ',' addr ')'
++              {
++                      struct search_path path = { srcpos_file->dir, NULL, NULL };
++                      struct dtc_file *file = dtc_open_file($4.val, &path);
++                      struct data d = empty_data;
++
++                      if ($6 != 0)
++                              if (fseek(file->file, $6, SEEK_SET) != 0)
++                                      yyerrorf("Couldn't seek to offset %llu in \"%s\": %s",
++                                               (unsigned long long)$6,
++                                               $4.val, strerror(errno));
++
++                      d = data_copy_file(file->file, $8);
++
++                      $$ = data_merge($1, d);
++                      dtc_close_file(file);
++              }
++      | propdataprefix DT_INCBIN '(' DT_STRING ')'
++              {
++                      struct search_path path = { srcpos_file->dir, NULL, NULL };
++                      struct dtc_file *file = dtc_open_file($4.val, &path);
++                      struct data d = empty_data;
++
++                      d = data_copy_file(file->file, -1);
++
++                      $$ = data_merge($1, d);
++                      dtc_close_file(file);
++              }
++      | propdata DT_LABEL
++              {
++                      $$ = data_add_marker($1, LABEL, $2);
++              }
++      ;
++
++propdataprefix:
++        /* empty */
++              {
++                      $$ = empty_data;
++              }
++      | propdata ','
++              {
++                      $$ = $1;
++              }
++      | propdataprefix DT_LABEL
++              {
++                      $$ = data_add_marker($1, LABEL, $2);
++              }
++      ;
++
++celllist:
++        /* empty */
++              {
++                      $$ = empty_data;
++              }
++      | celllist cellval
++              {
++                      $$ = data_append_cell($1, $2);
++              }
++      | celllist DT_REF
++              {
++                      $$ = data_append_cell(data_add_marker($1, REF_PHANDLE,
++                                                            $2), -1);
++              }
++      | celllist DT_LABEL
++              {
++                      $$ = data_add_marker($1, LABEL, $2);
++              }
++      ;
++
++cellbase:
++        /* empty */
++              {
++                      $$ = 16;
++              }
++      | DT_BASE
++      ;
++
++cellval:
++        DT_LITERAL
++              {
++                      $$ = eval_literal($1, 0, 32);
++              }
++      | cellbase DT_LEGACYLITERAL
++              {
++                      $$ = eval_literal($2, $1, 32);
++              }
++      ;
++
++bytestring:
++        /* empty */
++              {
++                      $$ = empty_data;
++              }
++      | bytestring DT_BYTE
++              {
++                      $$ = data_append_byte($1, $2);
++              }
++      | bytestring DT_LABEL
++              {
++                      $$ = data_add_marker($1, LABEL, $2);
++              }
++      ;
++
++subnodes:
++        /* empty */
++              {
++                      $$ = NULL;
++              }
++      |  subnode subnodes
++              {
++                      $$ = chain_node($1, $2);
++              }
++      | subnode propdef
++              {
++                      yyerror("syntax error: properties must precede subnodes");
++                      YYERROR;
++              }
++      ;
++
++subnode:
++        label DT_PROPNODENAME nodedef
++              {
++                      $$ = name_node($3, $2, $1);
++              }
++      ;
++
++label:
++        /* empty */
++              {
++                      $$ = NULL;
++              }
++      | DT_LABEL
++              {
++                      $$ = $1;
++              }
++      ;
++
++%%
++
++void yyerrorf(char const *s, ...)
++{
++      const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";
++      va_list va;
++      va_start(va, s);
++
++      if (strcmp(fname, "-") == 0)
++              fname = "stdin";
++
++      fprintf(stderr, "%s:%d ", fname, yylloc.first_line);
++      vfprintf(stderr, s, va);
++      fprintf(stderr, "\n");
++
++      treesource_error = 1;
++      va_end(va);
++}
++
++void yyerror (char const *s)
++{
++      yyerrorf("%s", s);
++}
++
++static unsigned long long eval_literal(const char *s, int base, int bits)
++{
++      unsigned long long val;
++      char *e;
++
++      errno = 0;
++      val = strtoull(s, &e, base);
++      if (*e)
++              yyerror("bad characters in literal");
++      else if ((errno == ERANGE)
++               || ((bits < 64) && (val >= (1ULL << bits))))
++              yyerror("literal out of range");
++      else if (errno != 0)
++              yyerror("bad literal");
++      return val;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/flattree.c linux-2.6.30-rc4-git/scripts/dtc/flattree.c
+--- linux-2.6.30-rc4/scripts/dtc/flattree.c    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/flattree.c        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,906 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++#include "srcpos.h"
++
++#define FTF_FULLPATH  0x1
++#define FTF_VARALIGN  0x2
++#define FTF_NAMEPROPS 0x4
++#define FTF_BOOTCPUID 0x8
++#define FTF_STRTABSIZE        0x10
++#define FTF_STRUCTSIZE        0x20
++#define FTF_NOPS      0x40
++
++static struct version_info {
++      int version;
++      int last_comp_version;
++      int hdr_size;
++      int flags;
++} version_table[] = {
++      {1, 1, FDT_V1_SIZE,
++       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS},
++      {2, 1, FDT_V2_SIZE,
++       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID},
++      {3, 1, FDT_V3_SIZE,
++       FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE},
++      {16, 16, FDT_V3_SIZE,
++       FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS},
++      {17, 16, FDT_V17_SIZE,
++       FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS},
++};
++
++struct emitter {
++      void (*cell)(void *, cell_t);
++      void (*string)(void *, char *, int);
++      void (*align)(void *, int);
++      void (*data)(void *, struct data);
++      void (*beginnode)(void *, const char *);
++      void (*endnode)(void *, const char *);
++      void (*property)(void *, const char *);
++};
++
++static void bin_emit_cell(void *e, cell_t val)
++{
++      struct data *dtbuf = e;
++
++      *dtbuf = data_append_cell(*dtbuf, val);
++}
++
++static void bin_emit_string(void *e, char *str, int len)
++{
++      struct data *dtbuf = e;
++
++      if (len == 0)
++              len = strlen(str);
++
++      *dtbuf = data_append_data(*dtbuf, str, len);
++      *dtbuf = data_append_byte(*dtbuf, '\0');
++}
++
++static void bin_emit_align(void *e, int a)
++{
++      struct data *dtbuf = e;
++
++      *dtbuf = data_append_align(*dtbuf, a);
++}
++
++static void bin_emit_data(void *e, struct data d)
++{
++      struct data *dtbuf = e;
++
++      *dtbuf = data_append_data(*dtbuf, d.val, d.len);
++}
++
++static void bin_emit_beginnode(void *e, const char *label)
++{
++      bin_emit_cell(e, FDT_BEGIN_NODE);
++}
++
++static void bin_emit_endnode(void *e, const char *label)
++{
++      bin_emit_cell(e, FDT_END_NODE);
++}
++
++static void bin_emit_property(void *e, const char *label)
++{
++      bin_emit_cell(e, FDT_PROP);
++}
++
++static struct emitter bin_emitter = {
++      .cell = bin_emit_cell,
++      .string = bin_emit_string,
++      .align = bin_emit_align,
++      .data = bin_emit_data,
++      .beginnode = bin_emit_beginnode,
++      .endnode = bin_emit_endnode,
++      .property = bin_emit_property,
++};
++
++static void emit_label(FILE *f, const char *prefix, const char *label)
++{
++      fprintf(f, "\t.globl\t%s_%s\n", prefix, label);
++      fprintf(f, "%s_%s:\n", prefix, label);
++      fprintf(f, "_%s_%s:\n", prefix, label);
++}
++
++static void emit_offset_label(FILE *f, const char *label, int offset)
++{
++      fprintf(f, "\t.globl\t%s\n", label);
++      fprintf(f, "%s\t= . + %d\n", label, offset);
++}
++
++static void asm_emit_cell(void *e, cell_t val)
++{
++      FILE *f = e;
++
++      fprintf(f, "\t.long\t0x%x\n", val);
++}
++
++static void asm_emit_string(void *e, char *str, int len)
++{
++      FILE *f = e;
++      char c = 0;
++
++      if (len != 0) {
++              /* XXX: ewww */
++              c = str[len];
++              str[len] = '\0';
++      }
++
++      fprintf(f, "\t.string\t\"%s\"\n", str);
++
++      if (len != 0) {
++              str[len] = c;
++      }
++}
++
++static void asm_emit_align(void *e, int a)
++{
++      FILE *f = e;
++
++      fprintf(f, "\t.balign\t%d\n", a);
++}
++
++static void asm_emit_data(void *e, struct data d)
++{
++      FILE *f = e;
++      int off = 0;
++      struct marker *m = d.markers;
++
++      for_each_marker_of_type(m, LABEL)
++              emit_offset_label(f, m->ref, m->offset);
++
++      while ((d.len - off) >= sizeof(uint32_t)) {
++              fprintf(f, "\t.long\t0x%x\n",
++                      fdt32_to_cpu(*((uint32_t *)(d.val+off))));
++              off += sizeof(uint32_t);
++      }
++
++      while ((d.len - off) >= 1) {
++              fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]);
++              off += 1;
++      }
++
++      assert(off == d.len);
++}
++
++static void asm_emit_beginnode(void *e, const char *label)
++{
++      FILE *f = e;
++
++      if (label) {
++              fprintf(f, "\t.globl\t%s\n", label);
++              fprintf(f, "%s:\n", label);
++      }
++      fprintf(f, "\t.long\tFDT_BEGIN_NODE\n");
++}
++
++static void asm_emit_endnode(void *e, const char *label)
++{
++      FILE *f = e;
++
++      fprintf(f, "\t.long\tFDT_END_NODE\n");
++      if (label) {
++              fprintf(f, "\t.globl\t%s_end\n", label);
++              fprintf(f, "%s_end:\n", label);
++      }
++}
++
++static void asm_emit_property(void *e, const char *label)
++{
++      FILE *f = e;
++
++      if (label) {
++              fprintf(f, "\t.globl\t%s\n", label);
++              fprintf(f, "%s:\n", label);
++      }
++      fprintf(f, "\t.long\tFDT_PROP\n");
++}
++
++static struct emitter asm_emitter = {
++      .cell = asm_emit_cell,
++      .string = asm_emit_string,
++      .align = asm_emit_align,
++      .data = asm_emit_data,
++      .beginnode = asm_emit_beginnode,
++      .endnode = asm_emit_endnode,
++      .property = asm_emit_property,
++};
++
++static int stringtable_insert(struct data *d, const char *str)
++{
++      int i;
++
++      /* FIXME: do this more efficiently? */
++
++      for (i = 0; i < d->len; i++) {
++              if (streq(str, d->val + i))
++                      return i;
++      }
++
++      *d = data_append_data(*d, str, strlen(str)+1);
++      return i;
++}
++
++static void flatten_tree(struct node *tree, struct emitter *emit,
++                       void *etarget, struct data *strbuf,
++                       struct version_info *vi)
++{
++      struct property *prop;
++      struct node *child;
++      int seen_name_prop = 0;
++
++      emit->beginnode(etarget, tree->label);
++
++      if (vi->flags & FTF_FULLPATH)
++              emit->string(etarget, tree->fullpath, 0);
++      else
++              emit->string(etarget, tree->name, 0);
++
++      emit->align(etarget, sizeof(cell_t));
++
++      for_each_property(tree, prop) {
++              int nameoff;
++
++              if (streq(prop->name, "name"))
++                      seen_name_prop = 1;
++
++              nameoff = stringtable_insert(strbuf, prop->name);
++
++              emit->property(etarget, prop->label);
++              emit->cell(etarget, prop->val.len);
++              emit->cell(etarget, nameoff);
++
++              if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8))
++                      emit->align(etarget, 8);
++
++              emit->data(etarget, prop->val);
++              emit->align(etarget, sizeof(cell_t));
++      }
++
++      if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) {
++              emit->property(etarget, NULL);
++              emit->cell(etarget, tree->basenamelen+1);
++              emit->cell(etarget, stringtable_insert(strbuf, "name"));
++
++              if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8))
++                      emit->align(etarget, 8);
++
++              emit->string(etarget, tree->name, tree->basenamelen);
++              emit->align(etarget, sizeof(cell_t));
++      }
++
++      for_each_child(tree, child) {
++              flatten_tree(child, emit, etarget, strbuf, vi);
++      }
++
++      emit->endnode(etarget, tree->label);
++}
++
++static struct data flatten_reserve_list(struct reserve_info *reservelist,
++                               struct version_info *vi)
++{
++      struct reserve_info *re;
++      struct data d = empty_data;
++      static struct fdt_reserve_entry null_re = {0,0};
++      int    j;
++
++      for (re = reservelist; re; re = re->next) {
++              d = data_append_re(d, &re->re);
++      }
++      /*
++       * Add additional reserved slots if the user asked for them.
++       */
++      for (j = 0; j < reservenum; j++) {
++              d = data_append_re(d, &null_re);
++      }
++
++      return d;
++}
++
++static void make_fdt_header(struct fdt_header *fdt,
++                          struct version_info *vi,
++                          int reservesize, int dtsize, int strsize,
++                          int boot_cpuid_phys)
++{
++      int reserve_off;
++
++      reservesize += sizeof(struct fdt_reserve_entry);
++
++      memset(fdt, 0xff, sizeof(*fdt));
++
++      fdt->magic = cpu_to_fdt32(FDT_MAGIC);
++      fdt->version = cpu_to_fdt32(vi->version);
++      fdt->last_comp_version = cpu_to_fdt32(vi->last_comp_version);
++
++      /* Reserve map should be doubleword aligned */
++      reserve_off = ALIGN(vi->hdr_size, 8);
++
++      fdt->off_mem_rsvmap = cpu_to_fdt32(reserve_off);
++      fdt->off_dt_struct = cpu_to_fdt32(reserve_off + reservesize);
++      fdt->off_dt_strings = cpu_to_fdt32(reserve_off + reservesize
++                                        + dtsize);
++      fdt->totalsize = cpu_to_fdt32(reserve_off + reservesize + dtsize + strsize);
++
++      if (vi->flags & FTF_BOOTCPUID)
++              fdt->boot_cpuid_phys = cpu_to_fdt32(boot_cpuid_phys);
++      if (vi->flags & FTF_STRTABSIZE)
++              fdt->size_dt_strings = cpu_to_fdt32(strsize);
++      if (vi->flags & FTF_STRUCTSIZE)
++              fdt->size_dt_struct = cpu_to_fdt32(dtsize);
++}
++
++void dt_to_blob(FILE *f, struct boot_info *bi, int version)
++{
++      struct version_info *vi = NULL;
++      int i;
++      struct data blob       = empty_data;
++      struct data reservebuf = empty_data;
++      struct data dtbuf      = empty_data;
++      struct data strbuf     = empty_data;
++      struct fdt_header fdt;
++      int padlen = 0;
++
++      for (i = 0; i < ARRAY_SIZE(version_table); i++) {
++              if (version_table[i].version == version)
++                      vi = &version_table[i];
++      }
++      if (!vi)
++              die("Unknown device tree blob version %d\n", version);
++
++      flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
++      bin_emit_cell(&dtbuf, FDT_END);
++
++      reservebuf = flatten_reserve_list(bi->reservelist, vi);
++
++      /* Make header */
++      make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
++                      bi->boot_cpuid_phys);
++
++      /*
++       * If the user asked for more space than is used, adjust the totalsize.
++       */
++      if (minsize > 0) {
++              padlen = minsize - fdt32_to_cpu(fdt.totalsize);
++              if ((padlen < 0) && (quiet < 1))
++                      fprintf(stderr,
++                              "Warning: blob size %d >= minimum size %d\n",
++                              fdt32_to_cpu(fdt.totalsize), minsize);
++      }
++
++      if (padsize > 0)
++              padlen = padsize;
++
++      if (padlen > 0) {
++              int tsize = fdt32_to_cpu(fdt.totalsize);
++              tsize += padlen;
++              fdt.totalsize = cpu_to_fdt32(tsize);
++      }
++
++      /*
++       * Assemble the blob: start with the header, add with alignment
++       * the reserve buffer, add the reserve map terminating zeroes,
++       * the device tree itself, and finally the strings.
++       */
++      blob = data_append_data(blob, &fdt, vi->hdr_size);
++      blob = data_append_align(blob, 8);
++      blob = data_merge(blob, reservebuf);
++      blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
++      blob = data_merge(blob, dtbuf);
++      blob = data_merge(blob, strbuf);
++
++      /*
++       * If the user asked for more space than is used, pad out the blob.
++       */
++      if (padlen > 0)
++              blob = data_append_zeroes(blob, padlen);
++
++      fwrite(blob.val, blob.len, 1, f);
++
++      if (ferror(f))
++              die("Error writing device tree blob: %s\n", strerror(errno));
++
++      /*
++       * data_merge() frees the right-hand element so only the blob
++       * remains to be freed.
++       */
++      data_free(blob);
++}
++
++static void dump_stringtable_asm(FILE *f, struct data strbuf)
++{
++      const char *p;
++      int len;
++
++      p = strbuf.val;
++
++      while (p < (strbuf.val + strbuf.len)) {
++              len = strlen(p);
++              fprintf(f, "\t.string \"%s\"\n", p);
++              p += len+1;
++      }
++}
++
++void dt_to_asm(FILE *f, struct boot_info *bi, int version)
++{
++      struct version_info *vi = NULL;
++      int i;
++      struct data strbuf = empty_data;
++      struct reserve_info *re;
++      const char *symprefix = "dt";
++
++      for (i = 0; i < ARRAY_SIZE(version_table); i++) {
++              if (version_table[i].version == version)
++                      vi = &version_table[i];
++      }
++      if (!vi)
++              die("Unknown device tree blob version %d\n", version);
++
++      fprintf(f, "/* autogenerated by dtc, do not edit */\n\n");
++      fprintf(f, "#define FDT_MAGIC 0x%x\n", FDT_MAGIC);
++      fprintf(f, "#define FDT_BEGIN_NODE 0x%x\n", FDT_BEGIN_NODE);
++      fprintf(f, "#define FDT_END_NODE 0x%x\n", FDT_END_NODE);
++      fprintf(f, "#define FDT_PROP 0x%x\n", FDT_PROP);
++      fprintf(f, "#define FDT_END 0x%x\n", FDT_END);
++      fprintf(f, "\n");
++
++      emit_label(f, symprefix, "blob_start");
++      emit_label(f, symprefix, "header");
++      fprintf(f, "\t.long\tFDT_MAGIC\t\t\t\t/* magic */\n");
++      fprintf(f, "\t.long\t_%s_blob_abs_end - _%s_blob_start\t/* totalsize */\n",
++              symprefix, symprefix);
++      fprintf(f, "\t.long\t_%s_struct_start - _%s_blob_start\t/* off_dt_struct */\n",
++              symprefix, symprefix);
++      fprintf(f, "\t.long\t_%s_strings_start - _%s_blob_start\t/* off_dt_strings */\n",
++              symprefix, symprefix);
++      fprintf(f, "\t.long\t_%s_reserve_map - _%s_blob_start\t/* off_dt_strings */\n",
++              symprefix, symprefix);
++      fprintf(f, "\t.long\t%d\t\t\t\t\t/* version */\n", vi->version);
++      fprintf(f, "\t.long\t%d\t\t\t\t\t/* last_comp_version */\n",
++              vi->last_comp_version);
++
++      if (vi->flags & FTF_BOOTCPUID)
++              fprintf(f, "\t.long\t%i\t\t\t\t\t/* boot_cpuid_phys */\n",
++                      bi->boot_cpuid_phys);
++
++      if (vi->flags & FTF_STRTABSIZE)
++              fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n",
++                      symprefix, symprefix);
++
++      if (vi->flags & FTF_STRUCTSIZE)
++              fprintf(f, "\t.long\t_%s_struct_end - _%s_struct_start\t/* size_dt_struct */\n",
++                      symprefix, symprefix);
++
++      /*
++       * Reserve map entries.
++       * Align the reserve map to a doubleword boundary.
++       * Each entry is an (address, size) pair of u64 values.
++       * Always supply a zero-sized temination entry.
++       */
++      asm_emit_align(f, 8);
++      emit_label(f, symprefix, "reserve_map");
++
++      fprintf(f, "/* Memory reserve map from source file */\n");
++
++      /*
++       * Use .long on high and low halfs of u64s to avoid .quad
++       * as it appears .quad isn't available in some assemblers.
++       */
++      for (re = bi->reservelist; re; re = re->next) {
++              if (re->label) {
++                      fprintf(f, "\t.globl\t%s\n", re->label);
++                      fprintf(f, "%s:\n", re->label);
++              }
++              fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
++                      (unsigned int)(re->re.address >> 32),
++                      (unsigned int)(re->re.address & 0xffffffff));
++              fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
++                      (unsigned int)(re->re.size >> 32),
++                      (unsigned int)(re->re.size & 0xffffffff));
++      }
++      for (i = 0; i < reservenum; i++) {
++              fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
++      }
++
++      fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
++
++      emit_label(f, symprefix, "struct_start");
++      flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
++      fprintf(f, "\t.long\tFDT_END\n");
++      emit_label(f, symprefix, "struct_end");
++
++      emit_label(f, symprefix, "strings_start");
++      dump_stringtable_asm(f, strbuf);
++      emit_label(f, symprefix, "strings_end");
++
++      emit_label(f, symprefix, "blob_end");
++
++      /*
++       * If the user asked for more space than is used, pad it out.
++       */
++      if (minsize > 0) {
++              fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n",
++                      minsize, symprefix, symprefix);
++      }
++      if (padsize > 0) {
++              fprintf(f, "\t.space\t%d, 0\n", padsize);
++      }
++      emit_label(f, symprefix, "blob_abs_end");
++
++      data_free(strbuf);
++}
++
++struct inbuf {
++      char *base, *limit, *ptr;
++};
++
++static void inbuf_init(struct inbuf *inb, void *base, void *limit)
++{
++      inb->base = base;
++      inb->limit = limit;
++      inb->ptr = inb->base;
++}
++
++static void flat_read_chunk(struct inbuf *inb, void *p, int len)
++{
++      if ((inb->ptr + len) > inb->limit)
++              die("Premature end of data parsing flat device tree\n");
++
++      memcpy(p, inb->ptr, len);
++
++      inb->ptr += len;
++}
++
++static uint32_t flat_read_word(struct inbuf *inb)
++{
++      uint32_t val;
++
++      assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
++
++      flat_read_chunk(inb, &val, sizeof(val));
++
++      return fdt32_to_cpu(val);
++}
++
++static void flat_realign(struct inbuf *inb, int align)
++{
++      int off = inb->ptr - inb->base;
++
++      inb->ptr = inb->base + ALIGN(off, align);
++      if (inb->ptr > inb->limit)
++              die("Premature end of data parsing flat device tree\n");
++}
++
++static char *flat_read_string(struct inbuf *inb)
++{
++      int len = 0;
++      const char *p = inb->ptr;
++      char *str;
++
++      do {
++              if (p >= inb->limit)
++                      die("Premature end of data parsing flat device tree\n");
++              len++;
++      } while ((*p++) != '\0');
++
++      str = strdup(inb->ptr);
++
++      inb->ptr += len;
++
++      flat_realign(inb, sizeof(uint32_t));
++
++      return str;
++}
++
++static struct data flat_read_data(struct inbuf *inb, int len)
++{
++      struct data d = empty_data;
++
++      if (len == 0)
++              return empty_data;
++
++      d = data_grow_for(d, len);
++      d.len = len;
++
++      flat_read_chunk(inb, d.val, len);
++
++      flat_realign(inb, sizeof(uint32_t));
++
++      return d;
++}
++
++static char *flat_read_stringtable(struct inbuf *inb, int offset)
++{
++      const char *p;
++
++      p = inb->base + offset;
++      while (1) {
++              if (p >= inb->limit || p < inb->base)
++                      die("String offset %d overruns string table\n",
++                          offset);
++
++              if (*p == '\0')
++                      break;
++
++              p++;
++      }
++
++      return strdup(inb->base + offset);
++}
++
++static struct property *flat_read_property(struct inbuf *dtbuf,
++                                         struct inbuf *strbuf, int flags)
++{
++      uint32_t proplen, stroff;
++      char *name;
++      struct data val;
++
++      proplen = flat_read_word(dtbuf);
++      stroff = flat_read_word(dtbuf);
++
++      name = flat_read_stringtable(strbuf, stroff);
++
++      if ((flags & FTF_VARALIGN) && (proplen >= 8))
++              flat_realign(dtbuf, 8);
++
++      val = flat_read_data(dtbuf, proplen);
++
++      return build_property(name, val, NULL);
++}
++
++
++static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
++{
++      struct reserve_info *reservelist = NULL;
++      struct reserve_info *new;
++      const char *p;
++      struct fdt_reserve_entry re;
++
++      /*
++       * Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
++       * List terminates at an entry with size equal to zero.
++       *
++       * First pass, count entries.
++       */
++      p = inb->ptr;
++      while (1) {
++              flat_read_chunk(inb, &re, sizeof(re));
++              re.address  = fdt64_to_cpu(re.address);
++              re.size = fdt64_to_cpu(re.size);
++              if (re.size == 0)
++                      break;
++
++              new = build_reserve_entry(re.address, re.size, NULL);
++              reservelist = add_reserve_entry(reservelist, new);
++      }
++
++      return reservelist;
++}
++
++
++static char *nodename_from_path(const char *ppath, const char *cpath)
++{
++      int plen;
++
++      plen = strlen(ppath);
++
++      if (!strneq(ppath, cpath, plen))
++              die("Path \"%s\" is not valid as a child of \"%s\"\n",
++                  cpath, ppath);
++
++      /* root node is a special case */
++      if (!streq(ppath, "/"))
++              plen++;
++
++      return strdup(cpath + plen);
++}
++
++static struct node *unflatten_tree(struct inbuf *dtbuf,
++                                 struct inbuf *strbuf,
++                                 const char *parent_flatname, int flags)
++{
++      struct node *node;
++      char *flatname;
++      uint32_t val;
++
++      node = build_node(NULL, NULL);
++
++      flatname = flat_read_string(dtbuf);
++
++      if (flags & FTF_FULLPATH)
++              node->name = nodename_from_path(parent_flatname, flatname);
++      else
++              node->name = flatname;
++
++      do {
++              struct property *prop;
++              struct node *child;
++
++              val = flat_read_word(dtbuf);
++              switch (val) {
++              case FDT_PROP:
++                      if (node->children)
++                              fprintf(stderr, "Warning: Flat tree input has "
++                                      "subnodes preceding a property.\n");
++                      prop = flat_read_property(dtbuf, strbuf, flags);
++                      add_property(node, prop);
++                      break;
++
++              case FDT_BEGIN_NODE:
++                      child = unflatten_tree(dtbuf,strbuf, flatname, flags);
++                      add_child(node, child);
++                      break;
++
++              case FDT_END_NODE:
++                      break;
++
++              case FDT_END:
++                      die("Premature FDT_END in device tree blob\n");
++                      break;
++
++              case FDT_NOP:
++                      if (!(flags & FTF_NOPS))
++                              fprintf(stderr, "Warning: NOP tag found in flat tree"
++                                      " version <16\n");
++
++                      /* Ignore */
++                      break;
++
++              default:
++                      die("Invalid opcode word %08x in device tree blob\n",
++                          val);
++              }
++      } while (val != FDT_END_NODE);
++
++      return node;
++}
++
++
++struct boot_info *dt_from_blob(const char *fname)
++{
++      struct dtc_file *dtcf;
++      uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
++      uint32_t off_dt, off_str, off_mem_rsvmap;
++      int rc;
++      char *blob;
++      struct fdt_header *fdt;
++      char *p;
++      struct inbuf dtbuf, strbuf;
++      struct inbuf memresvbuf;
++      int sizeleft;
++      struct reserve_info *reservelist;
++      struct node *tree;
++      uint32_t val;
++      int flags = 0;
++
++      dtcf = dtc_open_file(fname, NULL);
++
++      rc = fread(&magic, sizeof(magic), 1, dtcf->file);
++      if (ferror(dtcf->file))
++              die("Error reading DT blob magic number: %s\n",
++                  strerror(errno));
++      if (rc < 1) {
++              if (feof(dtcf->file))
++                      die("EOF reading DT blob magic number\n");
++              else
++                      die("Mysterious short read reading magic number\n");
++      }
++
++      magic = fdt32_to_cpu(magic);
++      if (magic != FDT_MAGIC)
++              die("Blob has incorrect magic number\n");
++
++      rc = fread(&totalsize, sizeof(totalsize), 1, dtcf->file);
++      if (ferror(dtcf->file))
++              die("Error reading DT blob size: %s\n", strerror(errno));
++      if (rc < 1) {
++              if (feof(dtcf->file))
++                      die("EOF reading DT blob size\n");
++              else
++                      die("Mysterious short read reading blob size\n");
++      }
++
++      totalsize = fdt32_to_cpu(totalsize);
++      if (totalsize < FDT_V1_SIZE)
++              die("DT blob size (%d) is too small\n", totalsize);
++
++      blob = xmalloc(totalsize);
++
++      fdt = (struct fdt_header *)blob;
++      fdt->magic = cpu_to_fdt32(magic);
++      fdt->totalsize = cpu_to_fdt32(totalsize);
++
++      sizeleft = totalsize - sizeof(magic) - sizeof(totalsize);
++      p = blob + sizeof(magic)  + sizeof(totalsize);
++
++      while (sizeleft) {
++              if (feof(dtcf->file))
++                      die("EOF before reading %d bytes of DT blob\n",
++                          totalsize);
++
++              rc = fread(p, 1, sizeleft, dtcf->file);
++              if (ferror(dtcf->file))
++                      die("Error reading DT blob: %s\n",
++                          strerror(errno));
++
++              sizeleft -= rc;
++              p += rc;
++      }
++
++      off_dt = fdt32_to_cpu(fdt->off_dt_struct);
++      off_str = fdt32_to_cpu(fdt->off_dt_strings);
++      off_mem_rsvmap = fdt32_to_cpu(fdt->off_mem_rsvmap);
++      version = fdt32_to_cpu(fdt->version);
++      boot_cpuid_phys = fdt32_to_cpu(fdt->boot_cpuid_phys);
++
++      if (off_mem_rsvmap >= totalsize)
++              die("Mem Reserve structure offset exceeds total size\n");
++
++      if (off_dt >= totalsize)
++              die("DT structure offset exceeds total size\n");
++
++      if (off_str > totalsize)
++              die("String table offset exceeds total size\n");
++
++      if (version >= 3) {
++              uint32_t size_str = fdt32_to_cpu(fdt->size_dt_strings);
++              if (off_str+size_str > totalsize)
++                      die("String table extends past total size\n");
++              inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
++      } else {
++              inbuf_init(&strbuf, blob + off_str, blob + totalsize);
++      }
++
++      if (version >= 17) {
++              size_dt = fdt32_to_cpu(fdt->size_dt_struct);
++              if (off_dt+size_dt > totalsize)
++                      die("Structure block extends past total size\n");
++      }
++
++      if (version < 16) {
++              flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN;
++      } else {
++              flags |= FTF_NOPS;
++      }
++
++      inbuf_init(&memresvbuf,
++                 blob + off_mem_rsvmap, blob + totalsize);
++      inbuf_init(&dtbuf, blob + off_dt, blob + totalsize);
++
++      reservelist = flat_read_mem_reserve(&memresvbuf);
++
++      val = flat_read_word(&dtbuf);
++
++      if (val != FDT_BEGIN_NODE)
++              die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val);
++
++      tree = unflatten_tree(&dtbuf, &strbuf, "", flags);
++
++      val = flat_read_word(&dtbuf);
++      if (val != FDT_END)
++              die("Device tree blob doesn't end with FDT_END\n");
++
++      free(blob);
++
++      dtc_close_file(dtcf);
++
++      return build_boot_info(reservelist, tree, boot_cpuid_phys);
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/fstree.c linux-2.6.30-rc4-git/scripts/dtc/fstree.c
+--- linux-2.6.30-rc4/scripts/dtc/fstree.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/fstree.c  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,92 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++
++#include <dirent.h>
++#include <sys/stat.h>
++
++static struct node *read_fstree(const char *dirname)
++{
++      DIR *d;
++      struct dirent *de;
++      struct stat st;
++      struct node *tree;
++
++      d = opendir(dirname);
++      if (!d)
++              die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
++
++      tree = build_node(NULL, NULL);
++
++      while ((de = readdir(d)) != NULL) {
++              char *tmpnam;
++
++              if (streq(de->d_name, ".")
++                  || streq(de->d_name, ".."))
++                      continue;
++
++              tmpnam = join_path(dirname, de->d_name);
++
++              if (lstat(tmpnam, &st) < 0)
++                      die("stat(%s): %s\n", tmpnam, strerror(errno));
++
++              if (S_ISREG(st.st_mode)) {
++                      struct property *prop;
++                      FILE *pfile;
++
++                      pfile = fopen(tmpnam, "r");
++                      if (! pfile) {
++                              fprintf(stderr,
++                                      "WARNING: Cannot open %s: %s\n",
++                                      tmpnam, strerror(errno));
++                      } else {
++                              prop = build_property(strdup(de->d_name),
++                                                    data_copy_file(pfile,
++                                                                   st.st_size),
++                                                    NULL);
++                              add_property(tree, prop);
++                              fclose(pfile);
++                      }
++              } else if (S_ISDIR(st.st_mode)) {
++                      struct node *newchild;
++
++                      newchild = read_fstree(tmpnam);
++                      newchild = name_node(newchild, strdup(de->d_name),
++                                           NULL);
++                      add_child(tree, newchild);
++              }
++
++              free(tmpnam);
++      }
++
++      return tree;
++}
++
++struct boot_info *dt_from_fs(const char *dirname)
++{
++      struct node *tree;
++
++      tree = read_fstree(dirname);
++      tree = name_node(tree, "", NULL);
++
++      return build_boot_info(NULL, tree, 0);
++}
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt.c      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,201 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++int fdt_check_header(const void *fdt)
++{
++      if (fdt_magic(fdt) == FDT_MAGIC) {
++              /* Complete tree */
++              if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
++                      return -FDT_ERR_BADVERSION;
++              if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
++                      return -FDT_ERR_BADVERSION;
++      } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {
++              /* Unfinished sequential-write blob */
++              if (fdt_size_dt_struct(fdt) == 0)
++                      return -FDT_ERR_BADSTATE;
++      } else {
++              return -FDT_ERR_BADMAGIC;
++      }
++
++      return 0;
++}
++
++const void *fdt_offset_ptr(const void *fdt, int offset, int len)
++{
++      const char *p;
++
++      if (fdt_version(fdt) >= 0x11)
++              if (((offset + len) < offset)
++                  || ((offset + len) > fdt_size_dt_struct(fdt)))
++                      return NULL;
++
++      p = _fdt_offset_ptr(fdt, offset);
++
++      if (p + len < p)
++              return NULL;
++      return p;
++}
++
++uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
++{
++      const uint32_t *tagp, *lenp;
++      uint32_t tag;
++      const char *p;
++
++      if (offset % FDT_TAGSIZE)
++              return -1;
++
++      tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
++      if (! tagp)
++              return FDT_END; /* premature end */
++      tag = fdt32_to_cpu(*tagp);
++      offset += FDT_TAGSIZE;
++
++      switch (tag) {
++      case FDT_BEGIN_NODE:
++              /* skip name */
++              do {
++                      p = fdt_offset_ptr(fdt, offset++, 1);
++              } while (p && (*p != '\0'));
++              if (! p)
++                      return FDT_END;
++              break;
++      case FDT_PROP:
++              lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
++              if (! lenp)
++                      return FDT_END;
++              /* skip name offset, length and value */
++              offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
++              break;
++      }
++
++      if (nextoffset)
++              *nextoffset = FDT_TAGALIGN(offset);
++
++      return tag;
++}
++
++int _fdt_check_node_offset(const void *fdt, int offset)
++{
++      if ((offset < 0) || (offset % FDT_TAGSIZE)
++          || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE))
++              return -FDT_ERR_BADOFFSET;
++
++      return offset;
++}
++
++int fdt_next_node(const void *fdt, int offset, int *depth)
++{
++      int nextoffset = 0;
++      uint32_t tag;
++
++      if (offset >= 0)
++              if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
++                      return nextoffset;
++
++      do {
++              offset = nextoffset;
++              tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++              switch (tag) {
++              case FDT_PROP:
++              case FDT_NOP:
++                      break;
++
++              case FDT_BEGIN_NODE:
++                      if (depth)
++                              (*depth)++;
++                      break;
++
++              case FDT_END_NODE:
++                      if (depth)
++                              (*depth)--;
++                      break;
++
++              case FDT_END:
++                      return -FDT_ERR_NOTFOUND;
++
++              default:
++                      return -FDT_ERR_BADSTRUCTURE;
++              }
++      } while (tag != FDT_BEGIN_NODE);
++
++      return offset;
++}
++
++const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
++{
++      int len = strlen(s) + 1;
++      const char *last = strtab + tabsize - len;
++      const char *p;
++
++      for (p = strtab; p <= last; p++)
++              if (memcmp(p, s, len) == 0)
++                      return p;
++      return NULL;
++}
++
++int fdt_move(const void *fdt, void *buf, int bufsize)
++{
++      FDT_CHECK_HEADER(fdt);
++
++      if (fdt_totalsize(fdt) > bufsize)
++              return -FDT_ERR_NOSPACE;
++
++      memmove(buf, fdt, fdt_totalsize(fdt));
++      return 0;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt.h linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt.h
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt.h  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt.h      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,60 @@
++#ifndef _FDT_H
++#define _FDT_H
++
++#ifndef __ASSEMBLY__
++
++struct fdt_header {
++      uint32_t magic;                  /* magic word FDT_MAGIC */
++      uint32_t totalsize;              /* total size of DT block */
++      uint32_t off_dt_struct;          /* offset to structure */
++      uint32_t off_dt_strings;         /* offset to strings */
++      uint32_t off_mem_rsvmap;         /* offset to memory reserve map */
++      uint32_t version;                /* format version */
++      uint32_t last_comp_version;      /* last compatible version */
++
++      /* version 2 fields below */
++      uint32_t boot_cpuid_phys;        /* Which physical CPU id we're
++                                          booting on */
++      /* version 3 fields below */
++      uint32_t size_dt_strings;        /* size of the strings block */
++
++      /* version 17 fields below */
++      uint32_t size_dt_struct;         /* size of the structure block */
++};
++
++struct fdt_reserve_entry {
++      uint64_t address;
++      uint64_t size;
++};
++
++struct fdt_node_header {
++      uint32_t tag;
++      char name[0];
++};
++
++struct fdt_property {
++      uint32_t tag;
++      uint32_t len;
++      uint32_t nameoff;
++      char data[0];
++};
++
++#endif /* !__ASSEMBLY */
++
++#define FDT_MAGIC     0xd00dfeed      /* 4: version, 4: total size */
++#define FDT_TAGSIZE   sizeof(uint32_t)
++
++#define FDT_BEGIN_NODE        0x1             /* Start node: full name */
++#define FDT_END_NODE  0x2             /* End node */
++#define FDT_PROP      0x3             /* Property: name off,
++                                         size, content */
++#define FDT_NOP               0x4             /* nop */
++#define FDT_END               0x9
++
++#define FDT_V1_SIZE   (7*sizeof(uint32_t))
++#define FDT_V2_SIZE   (FDT_V1_SIZE + sizeof(uint32_t))
++#define FDT_V3_SIZE   (FDT_V2_SIZE + sizeof(uint32_t))
++#define FDT_V16_SIZE  FDT_V3_SIZE
++#define FDT_V17_SIZE  (FDT_V16_SIZE + sizeof(uint32_t))
++
++#endif /* _FDT_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_ro.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_ro.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_ro.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_ro.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,469 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++static int _fdt_nodename_eq(const void *fdt, int offset,
++                          const char *s, int len)
++{
++      const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1);
++
++      if (! p)
++              /* short match */
++              return 0;
++
++      if (memcmp(p, s, len) != 0)
++              return 0;
++
++      if (p[len] == '\0')
++              return 1;
++      else if (!memchr(s, '@', len) && (p[len] == '@'))
++              return 1;
++      else
++              return 0;
++}
++
++const char *fdt_string(const void *fdt, int stroffset)
++{
++      return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
++}
++
++int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
++{
++      FDT_CHECK_HEADER(fdt);
++      *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address);
++      *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size);
++      return 0;
++}
++
++int fdt_num_mem_rsv(const void *fdt)
++{
++      int i = 0;
++
++      while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
++              i++;
++      return i;
++}
++
++int fdt_subnode_offset_namelen(const void *fdt, int offset,
++                             const char *name, int namelen)
++{
++      int depth;
++
++      FDT_CHECK_HEADER(fdt);
++
++      for (depth = 0, offset = fdt_next_node(fdt, offset, &depth);
++           (offset >= 0) && (depth > 0);
++           offset = fdt_next_node(fdt, offset, &depth)) {
++              if (depth < 0)
++                      return -FDT_ERR_NOTFOUND;
++              else if ((depth == 1)
++                       && _fdt_nodename_eq(fdt, offset, name, namelen))
++                      return offset;
++      }
++
++      if (offset < 0)
++              return offset; /* error */
++      else
++              return -FDT_ERR_NOTFOUND;
++}
++
++int fdt_subnode_offset(const void *fdt, int parentoffset,
++                     const char *name)
++{
++      return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
++}
++
++int fdt_path_offset(const void *fdt, const char *path)
++{
++      const char *end = path + strlen(path);
++      const char *p = path;
++      int offset = 0;
++
++      FDT_CHECK_HEADER(fdt);
++
++      if (*path != '/')
++              return -FDT_ERR_BADPATH;
++
++      while (*p) {
++              const char *q;
++
++              while (*p == '/')
++                      p++;
++              if (! *p)
++                      return offset;
++              q = strchr(p, '/');
++              if (! q)
++                      q = end;
++
++              offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
++              if (offset < 0)
++                      return offset;
++
++              p = q;
++      }
++
++      return offset;
++}
++
++const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
++{
++      const struct fdt_node_header *nh = _fdt_offset_ptr(fdt, nodeoffset);
++      int err;
++
++      if (((err = fdt_check_header(fdt)) != 0)
++          || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0))
++                      goto fail;
++
++      if (len)
++              *len = strlen(nh->name);
++
++      return nh->name;
++
++ fail:
++      if (len)
++              *len = err;
++      return NULL;
++}
++
++const struct fdt_property *fdt_get_property(const void *fdt,
++                                          int nodeoffset,
++                                          const char *name, int *lenp)
++{
++      uint32_t tag;
++      const struct fdt_property *prop;
++      int namestroff;
++      int offset, nextoffset;
++      int err;
++
++      if (((err = fdt_check_header(fdt)) != 0)
++          || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0))
++                      goto fail;
++
++      nextoffset = err;
++      do {
++              offset = nextoffset;
++
++              tag = fdt_next_tag(fdt, offset, &nextoffset);
++              switch (tag) {
++              case FDT_END:
++                      err = -FDT_ERR_TRUNCATED;
++                      goto fail;
++
++              case FDT_BEGIN_NODE:
++              case FDT_END_NODE:
++              case FDT_NOP:
++                      break;
++
++              case FDT_PROP:
++                      err = -FDT_ERR_BADSTRUCTURE;
++                      prop = fdt_offset_ptr(fdt, offset, sizeof(*prop));
++                      if (! prop)
++                              goto fail;
++                      namestroff = fdt32_to_cpu(prop->nameoff);
++                      if (strcmp(fdt_string(fdt, namestroff), name) == 0) {
++                              /* Found it! */
++                              int len = fdt32_to_cpu(prop->len);
++                              prop = fdt_offset_ptr(fdt, offset,
++                                                    sizeof(*prop)+len);
++                              if (! prop)
++                                      goto fail;
++
++                              if (lenp)
++                                      *lenp = len;
++
++                              return prop;
++                      }
++                      break;
++
++              default:
++                      err = -FDT_ERR_BADSTRUCTURE;
++                      goto fail;
++              }
++      } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE));
++
++      err = -FDT_ERR_NOTFOUND;
++ fail:
++      if (lenp)
++              *lenp = err;
++      return NULL;
++}
++
++const void *fdt_getprop(const void *fdt, int nodeoffset,
++                const char *name, int *lenp)
++{
++      const struct fdt_property *prop;
++
++      prop = fdt_get_property(fdt, nodeoffset, name, lenp);
++      if (! prop)
++              return NULL;
++
++      return prop->data;
++}
++
++uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
++{
++      const uint32_t *php;
++      int len;
++
++      php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
++      if (!php || (len != sizeof(*php)))
++              return 0;
++
++      return fdt32_to_cpu(*php);
++}
++
++int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
++{
++      int pdepth = 0, p = 0;
++      int offset, depth, namelen;
++      const char *name;
++
++      FDT_CHECK_HEADER(fdt);
++
++      if (buflen < 2)
++              return -FDT_ERR_NOSPACE;
++
++      for (offset = 0, depth = 0;
++           (offset >= 0) && (offset <= nodeoffset);
++           offset = fdt_next_node(fdt, offset, &depth)) {
++              if (pdepth < depth)
++                      continue; /* overflowed buffer */
++
++              while (pdepth > depth) {
++                      do {
++                              p--;
++                      } while (buf[p-1] != '/');
++                      pdepth--;
++              }
++
++              name = fdt_get_name(fdt, offset, &namelen);
++              if (!name)
++                      return namelen;
++              if ((p + namelen + 1) <= buflen) {
++                      memcpy(buf + p, name, namelen);
++                      p += namelen;
++                      buf[p++] = '/';
++                      pdepth++;
++              }
++
++              if (offset == nodeoffset) {
++                      if (pdepth < (depth + 1))
++                              return -FDT_ERR_NOSPACE;
++
++                      if (p > 1) /* special case so that root path is "/", not "" */
++                              p--;
++                      buf[p] = '\0';
++                      return p;
++              }
++      }
++
++      if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
++              return -FDT_ERR_BADOFFSET;
++      else if (offset == -FDT_ERR_BADOFFSET)
++              return -FDT_ERR_BADSTRUCTURE;
++
++      return offset; /* error from fdt_next_node() */
++}
++
++int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
++                               int supernodedepth, int *nodedepth)
++{
++      int offset, depth;
++      int supernodeoffset = -FDT_ERR_INTERNAL;
++
++      FDT_CHECK_HEADER(fdt);
++
++      if (supernodedepth < 0)
++              return -FDT_ERR_NOTFOUND;
++
++      for (offset = 0, depth = 0;
++           (offset >= 0) && (offset <= nodeoffset);
++           offset = fdt_next_node(fdt, offset, &depth)) {
++              if (depth == supernodedepth)
++                      supernodeoffset = offset;
++
++              if (offset == nodeoffset) {
++                      if (nodedepth)
++                              *nodedepth = depth;
++
++                      if (supernodedepth > depth)
++                              return -FDT_ERR_NOTFOUND;
++                      else
++                              return supernodeoffset;
++              }
++      }
++
++      if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0))
++              return -FDT_ERR_BADOFFSET;
++      else if (offset == -FDT_ERR_BADOFFSET)
++              return -FDT_ERR_BADSTRUCTURE;
++
++      return offset; /* error from fdt_next_node() */
++}
++
++int fdt_node_depth(const void *fdt, int nodeoffset)
++{
++      int nodedepth;
++      int err;
++
++      err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth);
++      if (err)
++              return (err < 0) ? err : -FDT_ERR_INTERNAL;
++      return nodedepth;
++}
++
++int fdt_parent_offset(const void *fdt, int nodeoffset)
++{
++      int nodedepth = fdt_node_depth(fdt, nodeoffset);
++
++      if (nodedepth < 0)
++              return nodedepth;
++      return fdt_supernode_atdepth_offset(fdt, nodeoffset,
++                                          nodedepth - 1, NULL);
++}
++
++int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
++                                const char *propname,
++                                const void *propval, int proplen)
++{
++      int offset;
++      const void *val;
++      int len;
++
++      FDT_CHECK_HEADER(fdt);
++
++      /* FIXME: The algorithm here is pretty horrible: we scan each
++       * property of a node in fdt_getprop(), then if that didn't
++       * find what we want, we scan over them again making our way
++       * to the next node.  Still it's the easiest to implement
++       * approach; performance can come later. */
++      for (offset = fdt_next_node(fdt, startoffset, NULL);
++           offset >= 0;
++           offset = fdt_next_node(fdt, offset, NULL)) {
++              val = fdt_getprop(fdt, offset, propname, &len);
++              if (val && (len == proplen)
++                  && (memcmp(val, propval, len) == 0))
++                      return offset;
++      }
++
++      return offset; /* error from fdt_next_node() */
++}
++
++int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
++{
++      if ((phandle == 0) || (phandle == -1))
++              return -FDT_ERR_BADPHANDLE;
++      phandle = cpu_to_fdt32(phandle);
++      return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
++                                           &phandle, sizeof(phandle));
++}
++
++int _stringlist_contains(const char *strlist, int listlen, const char *str)
++{
++      int len = strlen(str);
++      const char *p;
++
++      while (listlen >= len) {
++              if (memcmp(str, strlist, len+1) == 0)
++                      return 1;
++              p = memchr(strlist, '\0', listlen);
++              if (!p)
++                      return 0; /* malformed strlist.. */
++              listlen -= (p-strlist) + 1;
++              strlist = p + 1;
++      }
++      return 0;
++}
++
++int fdt_node_check_compatible(const void *fdt, int nodeoffset,
++                            const char *compatible)
++{
++      const void *prop;
++      int len;
++
++      prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
++      if (!prop)
++              return len;
++      if (_stringlist_contains(prop, len, compatible))
++              return 0;
++      else
++              return 1;
++}
++
++int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
++                                const char *compatible)
++{
++      int offset, err;
++
++      FDT_CHECK_HEADER(fdt);
++
++      /* FIXME: The algorithm here is pretty horrible: we scan each
++       * property of a node in fdt_node_check_compatible(), then if
++       * that didn't find what we want, we scan over them again
++       * making our way to the next node.  Still it's the easiest to
++       * implement approach; performance can come later. */
++      for (offset = fdt_next_node(fdt, startoffset, NULL);
++           offset >= 0;
++           offset = fdt_next_node(fdt, offset, NULL)) {
++              err = fdt_node_check_compatible(fdt, offset, compatible);
++              if ((err < 0) && (err != -FDT_ERR_NOTFOUND))
++                      return err;
++              else if (err == 0)
++                      return offset;
++      }
++
++      return offset; /* error from fdt_next_node() */
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_rw.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_rw.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_rw.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_rw.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,463 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++static int _fdt_blocks_misordered(const void *fdt,
++                            int mem_rsv_size, int struct_size)
++{
++      return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8))
++              || (fdt_off_dt_struct(fdt) <
++                  (fdt_off_mem_rsvmap(fdt) + mem_rsv_size))
++              || (fdt_off_dt_strings(fdt) <
++                  (fdt_off_dt_struct(fdt) + struct_size))
++              || (fdt_totalsize(fdt) <
++                  (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
++}
++
++static int _fdt_rw_check_header(void *fdt)
++{
++      FDT_CHECK_HEADER(fdt);
++
++      if (fdt_version(fdt) < 17)
++              return -FDT_ERR_BADVERSION;
++      if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
++                                 fdt_size_dt_struct(fdt)))
++              return -FDT_ERR_BADLAYOUT;
++      if (fdt_version(fdt) > 17)
++              fdt_set_version(fdt, 17);
++
++      return 0;
++}
++
++#define FDT_RW_CHECK_HEADER(fdt) \
++      { \
++              int err; \
++              if ((err = _fdt_rw_check_header(fdt)) != 0) \
++                      return err; \
++      }
++
++static inline int _fdt_data_size(void *fdt)
++{
++      return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
++}
++
++static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen)
++{
++      char *p = splicepoint;
++      char *end = (char *)fdt + _fdt_data_size(fdt);
++
++      if (((p + oldlen) < p) || ((p + oldlen) > end))
++              return -FDT_ERR_BADOFFSET;
++      if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
++              return -FDT_ERR_NOSPACE;
++      memmove(p + newlen, p + oldlen, end - p - oldlen);
++      return 0;
++}
++
++static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
++                             int oldn, int newn)
++{
++      int delta = (newn - oldn) * sizeof(*p);
++      int err;
++      err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
++      if (err)
++              return err;
++      fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
++      fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
++      return 0;
++}
++
++static int _fdt_splice_struct(void *fdt, void *p,
++                            int oldlen, int newlen)
++{
++      int delta = newlen - oldlen;
++      int err;
++
++      if ((err = _fdt_splice(fdt, p, oldlen, newlen)))
++              return err;
++
++      fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
++      fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
++      return 0;
++}
++
++static int _fdt_splice_string(void *fdt, int newlen)
++{
++      void *p = (char *)fdt
++              + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
++      int err;
++
++      if ((err = _fdt_splice(fdt, p, 0, newlen)))
++              return err;
++
++      fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
++      return 0;
++}
++
++static int _fdt_find_add_string(void *fdt, const char *s)
++{
++      char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
++      const char *p;
++      char *new;
++      int len = strlen(s) + 1;
++      int err;
++
++      p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
++      if (p)
++              /* found it */
++              return (p - strtab);
++
++      new = strtab + fdt_size_dt_strings(fdt);
++      err = _fdt_splice_string(fdt, len);
++      if (err)
++              return err;
++
++      memcpy(new, s, len);
++      return (new - strtab);
++}
++
++int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
++{
++      struct fdt_reserve_entry *re;
++      int err;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
++      err = _fdt_splice_mem_rsv(fdt, re, 0, 1);
++      if (err)
++              return err;
++
++      re->address = cpu_to_fdt64(address);
++      re->size = cpu_to_fdt64(size);
++      return 0;
++}
++
++int fdt_del_mem_rsv(void *fdt, int n)
++{
++      struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
++      int err;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      if (n >= fdt_num_mem_rsv(fdt))
++              return -FDT_ERR_NOTFOUND;
++
++      err = _fdt_splice_mem_rsv(fdt, re, 1, 0);
++      if (err)
++              return err;
++      return 0;
++}
++
++static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,
++                              int len, struct fdt_property **prop)
++{
++      int oldlen;
++      int err;
++
++      *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
++      if (! (*prop))
++              return oldlen;
++
++      if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),
++                                    FDT_TAGALIGN(len))))
++              return err;
++
++      (*prop)->len = cpu_to_fdt32(len);
++      return 0;
++}
++
++static int _fdt_add_property(void *fdt, int nodeoffset, const char *name,
++                           int len, struct fdt_property **prop)
++{
++      int proplen;
++      int nextoffset;
++      int namestroff;
++      int err;
++
++      if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
++              return nextoffset;
++
++      namestroff = _fdt_find_add_string(fdt, name);
++      if (namestroff < 0)
++              return namestroff;
++
++      *prop = _fdt_offset_ptr_w(fdt, nextoffset);
++      proplen = sizeof(**prop) + FDT_TAGALIGN(len);
++
++      err = _fdt_splice_struct(fdt, *prop, 0, proplen);
++      if (err)
++              return err;
++
++      (*prop)->tag = cpu_to_fdt32(FDT_PROP);
++      (*prop)->nameoff = cpu_to_fdt32(namestroff);
++      (*prop)->len = cpu_to_fdt32(len);
++      return 0;
++}
++
++int fdt_set_name(void *fdt, int nodeoffset, const char *name)
++{
++      char *namep;
++      int oldlen, newlen;
++      int err;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen);
++      if (!namep)
++              return oldlen;
++
++      newlen = strlen(name);
++
++      err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1),
++                               FDT_TAGALIGN(newlen+1));
++      if (err)
++              return err;
++
++      memcpy(namep, name, newlen+1);
++      return 0;
++}
++
++int fdt_setprop(void *fdt, int nodeoffset, const char *name,
++              const void *val, int len)
++{
++      struct fdt_property *prop;
++      int err;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop);
++      if (err == -FDT_ERR_NOTFOUND)
++              err = _fdt_add_property(fdt, nodeoffset, name, len, &prop);
++      if (err)
++              return err;
++
++      memcpy(prop->data, val, len);
++      return 0;
++}
++
++int fdt_delprop(void *fdt, int nodeoffset, const char *name)
++{
++      struct fdt_property *prop;
++      int len, proplen;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
++      if (! prop)
++              return len;
++
++      proplen = sizeof(*prop) + FDT_TAGALIGN(len);
++      return _fdt_splice_struct(fdt, prop, proplen, 0);
++}
++
++int fdt_add_subnode_namelen(void *fdt, int parentoffset,
++                          const char *name, int namelen)
++{
++      struct fdt_node_header *nh;
++      int offset, nextoffset;
++      int nodelen;
++      int err;
++      uint32_t tag;
++      uint32_t *endtag;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
++      if (offset >= 0)
++              return -FDT_ERR_EXISTS;
++      else if (offset != -FDT_ERR_NOTFOUND)
++              return offset;
++
++      /* Try to place the new node after the parent's properties */
++      fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
++      do {
++              offset = nextoffset;
++              tag = fdt_next_tag(fdt, offset, &nextoffset);
++      } while ((tag == FDT_PROP) || (tag == FDT_NOP));
++
++      nh = _fdt_offset_ptr_w(fdt, offset);
++      nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE;
++
++      err = _fdt_splice_struct(fdt, nh, 0, nodelen);
++      if (err)
++              return err;
++
++      nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
++      memset(nh->name, 0, FDT_TAGALIGN(namelen+1));
++      memcpy(nh->name, name, namelen);
++      endtag = (uint32_t *)((char *)nh + nodelen - FDT_TAGSIZE);
++      *endtag = cpu_to_fdt32(FDT_END_NODE);
++
++      return offset;
++}
++
++int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
++{
++      return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
++}
++
++int fdt_del_node(void *fdt, int nodeoffset)
++{
++      int endoffset;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      endoffset = _fdt_node_end_offset(fdt, nodeoffset);
++      if (endoffset < 0)
++              return endoffset;
++
++      return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
++                                endoffset - nodeoffset, 0);
++}
++
++static void _fdt_packblocks(const char *old, char *new,
++                          int mem_rsv_size, int struct_size)
++{
++      int mem_rsv_off, struct_off, strings_off;
++
++      mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8);
++      struct_off = mem_rsv_off + mem_rsv_size;
++      strings_off = struct_off + struct_size;
++
++      memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size);
++      fdt_set_off_mem_rsvmap(new, mem_rsv_off);
++
++      memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size);
++      fdt_set_off_dt_struct(new, struct_off);
++      fdt_set_size_dt_struct(new, struct_size);
++
++      memmove(new + strings_off, old + fdt_off_dt_strings(old),
++              fdt_size_dt_strings(old));
++      fdt_set_off_dt_strings(new, strings_off);
++      fdt_set_size_dt_strings(new, fdt_size_dt_strings(old));
++}
++
++int fdt_open_into(const void *fdt, void *buf, int bufsize)
++{
++      int err;
++      int mem_rsv_size, struct_size;
++      int newsize;
++      const char *fdtstart = fdt;
++      const char *fdtend = fdtstart + fdt_totalsize(fdt);
++      char *tmp;
++
++      FDT_CHECK_HEADER(fdt);
++
++      mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
++              * sizeof(struct fdt_reserve_entry);
++
++      if (fdt_version(fdt) >= 17) {
++              struct_size = fdt_size_dt_struct(fdt);
++      } else {
++              struct_size = 0;
++              while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
++                      ;
++      }
++
++      if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
++              /* no further work necessary */
++              err = fdt_move(fdt, buf, bufsize);
++              if (err)
++                      return err;
++              fdt_set_version(buf, 17);
++              fdt_set_size_dt_struct(buf, struct_size);
++              fdt_set_totalsize(buf, bufsize);
++              return 0;
++      }
++
++      /* Need to reorder */
++      newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
++              + struct_size + fdt_size_dt_strings(fdt);
++
++      if (bufsize < newsize)
++              return -FDT_ERR_NOSPACE;
++
++      /* First attempt to build converted tree at beginning of buffer */
++      tmp = buf;
++      /* But if that overlaps with the old tree... */
++      if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
++              /* Try right after the old tree instead */
++              tmp = (char *)(uintptr_t)fdtend;
++              if ((tmp + newsize) > ((char *)buf + bufsize))
++                      return -FDT_ERR_NOSPACE;
++      }
++
++      _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size);
++      memmove(buf, tmp, newsize);
++
++      fdt_set_magic(buf, FDT_MAGIC);
++      fdt_set_totalsize(buf, bufsize);
++      fdt_set_version(buf, 17);
++      fdt_set_last_comp_version(buf, 16);
++      fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
++
++      return 0;
++}
++
++int fdt_pack(void *fdt)
++{
++      int mem_rsv_size;
++
++      FDT_RW_CHECK_HEADER(fdt);
++
++      mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
++              * sizeof(struct fdt_reserve_entry);
++      _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
++      fdt_set_totalsize(fdt, _fdt_data_size(fdt));
++
++      return 0;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_strerror.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_strerror.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_strerror.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_strerror.c     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,96 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++struct fdt_errtabent {
++      const char *str;
++};
++
++#define FDT_ERRTABENT(val) \
++      [(val)] = { .str = #val, }
++
++static struct fdt_errtabent fdt_errtable[] = {
++      FDT_ERRTABENT(FDT_ERR_NOTFOUND),
++      FDT_ERRTABENT(FDT_ERR_EXISTS),
++      FDT_ERRTABENT(FDT_ERR_NOSPACE),
++
++      FDT_ERRTABENT(FDT_ERR_BADOFFSET),
++      FDT_ERRTABENT(FDT_ERR_BADPATH),
++      FDT_ERRTABENT(FDT_ERR_BADSTATE),
++
++      FDT_ERRTABENT(FDT_ERR_TRUNCATED),
++      FDT_ERRTABENT(FDT_ERR_BADMAGIC),
++      FDT_ERRTABENT(FDT_ERR_BADVERSION),
++      FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE),
++      FDT_ERRTABENT(FDT_ERR_BADLAYOUT),
++};
++#define FDT_ERRTABSIZE        (sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))
++
++const char *fdt_strerror(int errval)
++{
++      if (errval > 0)
++              return "<valid offset/length>";
++      else if (errval == 0)
++              return "<no error>";
++      else if (errval > -FDT_ERRTABSIZE) {
++              const char *s = fdt_errtable[-errval].str;
++
++              if (s)
++                      return s;
++      }
++
++      return "<unknown error>";
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_sw.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_sw.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_sw.c       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_sw.c   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,257 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++static int _fdt_sw_check_header(void *fdt)
++{
++      if (fdt_magic(fdt) != FDT_SW_MAGIC)
++              return -FDT_ERR_BADMAGIC;
++      /* FIXME: should check more details about the header state */
++      return 0;
++}
++
++#define FDT_SW_CHECK_HEADER(fdt) \
++      { \
++              int err; \
++              if ((err = _fdt_sw_check_header(fdt)) != 0) \
++                      return err; \
++      }
++
++static void *_fdt_grab_space(void *fdt, int len)
++{
++      int offset = fdt_size_dt_struct(fdt);
++      int spaceleft;
++
++      spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
++              - fdt_size_dt_strings(fdt);
++
++      if ((offset + len < offset) || (offset + len > spaceleft))
++              return NULL;
++
++      fdt_set_size_dt_struct(fdt, offset + len);
++      return fdt_offset_ptr_w(fdt, offset, len);
++}
++
++int fdt_create(void *buf, int bufsize)
++{
++      void *fdt = buf;
++
++      if (bufsize < sizeof(struct fdt_header))
++              return -FDT_ERR_NOSPACE;
++
++      memset(buf, 0, bufsize);
++
++      fdt_set_magic(fdt, FDT_SW_MAGIC);
++      fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
++      fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
++      fdt_set_totalsize(fdt,  bufsize);
++
++      fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header),
++                                            sizeof(struct fdt_reserve_entry)));
++      fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
++      fdt_set_off_dt_strings(fdt, bufsize);
++
++      return 0;
++}
++
++int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
++{
++      struct fdt_reserve_entry *re;
++      int offset;
++
++      FDT_SW_CHECK_HEADER(fdt);
++
++      if (fdt_size_dt_struct(fdt))
++              return -FDT_ERR_BADSTATE;
++
++      offset = fdt_off_dt_struct(fdt);
++      if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
++              return -FDT_ERR_NOSPACE;
++
++      re = (struct fdt_reserve_entry *)((char *)fdt + offset);
++      re->address = cpu_to_fdt64(addr);
++      re->size = cpu_to_fdt64(size);
++
++      fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
++
++      return 0;
++}
++
++int fdt_finish_reservemap(void *fdt)
++{
++      return fdt_add_reservemap_entry(fdt, 0, 0);
++}
++
++int fdt_begin_node(void *fdt, const char *name)
++{
++      struct fdt_node_header *nh;
++      int namelen = strlen(name) + 1;
++
++      FDT_SW_CHECK_HEADER(fdt);
++
++      nh = _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
++      if (! nh)
++              return -FDT_ERR_NOSPACE;
++
++      nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
++      memcpy(nh->name, name, namelen);
++      return 0;
++}
++
++int fdt_end_node(void *fdt)
++{
++      uint32_t *en;
++
++      FDT_SW_CHECK_HEADER(fdt);
++
++      en = _fdt_grab_space(fdt, FDT_TAGSIZE);
++      if (! en)
++              return -FDT_ERR_NOSPACE;
++
++      *en = cpu_to_fdt32(FDT_END_NODE);
++      return 0;
++}
++
++static int _fdt_find_add_string(void *fdt, const char *s)
++{
++      char *strtab = (char *)fdt + fdt_totalsize(fdt);
++      const char *p;
++      int strtabsize = fdt_size_dt_strings(fdt);
++      int len = strlen(s) + 1;
++      int struct_top, offset;
++
++      p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
++      if (p)
++              return p - strtab;
++
++      /* Add it */
++      offset = -strtabsize - len;
++      struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
++      if (fdt_totalsize(fdt) + offset < struct_top)
++              return 0; /* no more room :( */
++
++      memcpy(strtab + offset, s, len);
++      fdt_set_size_dt_strings(fdt, strtabsize + len);
++      return offset;
++}
++
++int fdt_property(void *fdt, const char *name, const void *val, int len)
++{
++      struct fdt_property *prop;
++      int nameoff;
++
++      FDT_SW_CHECK_HEADER(fdt);
++
++      nameoff = _fdt_find_add_string(fdt, name);
++      if (nameoff == 0)
++              return -FDT_ERR_NOSPACE;
++
++      prop = _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len));
++      if (! prop)
++              return -FDT_ERR_NOSPACE;
++
++      prop->tag = cpu_to_fdt32(FDT_PROP);
++      prop->nameoff = cpu_to_fdt32(nameoff);
++      prop->len = cpu_to_fdt32(len);
++      memcpy(prop->data, val, len);
++      return 0;
++}
++
++int fdt_finish(void *fdt)
++{
++      char *p = (char *)fdt;
++      uint32_t *end;
++      int oldstroffset, newstroffset;
++      uint32_t tag;
++      int offset, nextoffset;
++
++      FDT_SW_CHECK_HEADER(fdt);
++
++      /* Add terminator */
++      end = _fdt_grab_space(fdt, sizeof(*end));
++      if (! end)
++              return -FDT_ERR_NOSPACE;
++      *end = cpu_to_fdt32(FDT_END);
++
++      /* Relocate the string table */
++      oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
++      newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
++      memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
++      fdt_set_off_dt_strings(fdt, newstroffset);
++
++      /* Walk the structure, correcting string offsets */
++      offset = 0;
++      while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
++              if (tag == FDT_PROP) {
++                      struct fdt_property *prop =
++                              fdt_offset_ptr_w(fdt, offset, sizeof(*prop));
++                      int nameoff;
++
++                      if (! prop)
++                              return -FDT_ERR_BADSTRUCTURE;
++
++                      nameoff = fdt32_to_cpu(prop->nameoff);
++                      nameoff += fdt_size_dt_strings(fdt);
++                      prop->nameoff = cpu_to_fdt32(nameoff);
++              }
++              offset = nextoffset;
++      }
++
++      /* Finally, adjust the header */
++      fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
++      fdt_set_magic(fdt, FDT_MAGIC);
++      return 0;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_wip.c linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_wip.c
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/fdt_wip.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/fdt_wip.c  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,145 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
++                      const void *val, int len)
++{
++      void *propval;
++      int proplen;
++
++      propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
++      if (! propval)
++              return proplen;
++
++      if (proplen != len)
++              return -FDT_ERR_NOSPACE;
++
++      memcpy(propval, val, len);
++      return 0;
++}
++
++static void _fdt_nop_region(void *start, int len)
++{
++      uint32_t *p;
++
++      for (p = start; (char *)p < ((char *)start + len); p++)
++              *p = cpu_to_fdt32(FDT_NOP);
++}
++
++int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
++{
++      struct fdt_property *prop;
++      int len;
++
++      prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
++      if (! prop)
++              return len;
++
++      _fdt_nop_region(prop, len + sizeof(*prop));
++
++      return 0;
++}
++
++int _fdt_node_end_offset(void *fdt, int nodeoffset)
++{
++      int level = 0;
++      uint32_t tag;
++      int offset, nextoffset;
++
++      tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
++      if (tag != FDT_BEGIN_NODE)
++              return -FDT_ERR_BADOFFSET;
++      do {
++              offset = nextoffset;
++              tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++              switch (tag) {
++              case FDT_END:
++                      return offset;
++
++              case FDT_BEGIN_NODE:
++                      level++;
++                      break;
++
++              case FDT_END_NODE:
++                      level--;
++                      break;
++
++              case FDT_PROP:
++              case FDT_NOP:
++                      break;
++
++              default:
++                      return -FDT_ERR_BADSTRUCTURE;
++              }
++      } while (level >= 0);
++
++      return nextoffset;
++}
++
++int fdt_nop_node(void *fdt, int nodeoffset)
++{
++      int endoffset;
++
++      endoffset = _fdt_node_end_offset(fdt, nodeoffset);
++      if (endoffset < 0)
++              return endoffset;
++
++      _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
++                      endoffset - nodeoffset);
++      return 0;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt_env.h linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt_env.h
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt_env.h   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt_env.h       2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,23 @@
++#ifndef _LIBFDT_ENV_H
++#define _LIBFDT_ENV_H
++
++#include <stddef.h>
++#include <stdint.h>
++#include <string.h>
++
++#define _B(n) ((unsigned long long)((uint8_t *)&x)[n])
++static inline uint32_t fdt32_to_cpu(uint32_t x)
++{
++      return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3);
++}
++#define cpu_to_fdt32(x) fdt32_to_cpu(x)
++
++static inline uint64_t fdt64_to_cpu(uint64_t x)
++{
++      return (_B(0) << 56) | (_B(1) << 48) | (_B(2) << 40) | (_B(3) << 32)
++              | (_B(4) << 24) | (_B(5) << 16) | (_B(6) << 8) | _B(7);
++}
++#define cpu_to_fdt64(x) fdt64_to_cpu(x)
++#undef _B
++
++#endif /* _LIBFDT_ENV_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt.h linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt.h
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt.h   2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,1076 @@
++#ifndef _LIBFDT_H
++#define _LIBFDT_H
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <libfdt_env.h>
++#include <fdt.h>
++
++#define FDT_FIRST_SUPPORTED_VERSION   0x10
++#define FDT_LAST_SUPPORTED_VERSION    0x11
++
++/* Error codes: informative error codes */
++#define FDT_ERR_NOTFOUND      1
++      /* FDT_ERR_NOTFOUND: The requested node or property does not exist */
++#define FDT_ERR_EXISTS                2
++      /* FDT_ERR_EXISTS: Attemped to create a node or property which
++       * already exists */
++#define FDT_ERR_NOSPACE               3
++      /* FDT_ERR_NOSPACE: Operation needed to expand the device
++       * tree, but its buffer did not have sufficient space to
++       * contain the expanded tree. Use fdt_open_into() to move the
++       * device tree to a buffer with more space. */
++
++/* Error codes: codes for bad parameters */
++#define FDT_ERR_BADOFFSET     4
++      /* FDT_ERR_BADOFFSET: Function was passed a structure block
++       * offset which is out-of-bounds, or which points to an
++       * unsuitable part of the structure for the operation. */
++#define FDT_ERR_BADPATH               5
++      /* FDT_ERR_BADPATH: Function was passed a badly formatted path
++       * (e.g. missing a leading / for a function which requires an
++       * absolute path) */
++#define FDT_ERR_BADPHANDLE    6
++      /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
++       * value.  phandle values of 0 and -1 are not permitted. */
++#define FDT_ERR_BADSTATE      7
++      /* FDT_ERR_BADSTATE: Function was passed an incomplete device
++       * tree created by the sequential-write functions, which is
++       * not sufficiently complete for the requested operation. */
++
++/* Error codes: codes for bad device tree blobs */
++#define FDT_ERR_TRUNCATED     8
++      /* FDT_ERR_TRUNCATED: Structure block of the given device tree
++       * ends without an FDT_END tag. */
++#define FDT_ERR_BADMAGIC      9
++      /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
++       * device tree at all - it is missing the flattened device
++       * tree magic number. */
++#define FDT_ERR_BADVERSION    10
++      /* FDT_ERR_BADVERSION: Given device tree has a version which
++       * can't be handled by the requested operation.  For
++       * read-write functions, this may mean that fdt_open_into() is
++       * required to convert the tree to the expected version. */
++#define FDT_ERR_BADSTRUCTURE  11
++      /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
++       * structure block or other serious error (e.g. misnested
++       * nodes, or subnodes preceding properties). */
++#define FDT_ERR_BADLAYOUT     12
++      /* FDT_ERR_BADLAYOUT: For read-write functions, the given
++       * device tree has it's sub-blocks in an order that the
++       * function can't handle (memory reserve map, then structure,
++       * then strings).  Use fdt_open_into() to reorganize the tree
++       * into a form suitable for the read-write operations. */
++
++/* "Can't happen" error indicating a bug in libfdt */
++#define FDT_ERR_INTERNAL      13
++      /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
++       * Should never be returned, if it is, it indicates a bug in
++       * libfdt itself. */
++
++#define FDT_ERR_MAX           13
++
++/**********************************************************************/
++/* Low-level functions (you probably don't need these)                */
++/**********************************************************************/
++
++const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
++static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
++{
++      return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
++}
++
++uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
++
++/**********************************************************************/
++/* Traversal functions                                                */
++/**********************************************************************/
++
++int fdt_next_node(const void *fdt, int offset, int *depth);
++
++/**********************************************************************/
++/* General functions                                                  */
++/**********************************************************************/
++
++#define fdt_get_header(fdt, field) \
++      (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
++#define fdt_magic(fdt)                        (fdt_get_header(fdt, magic))
++#define fdt_totalsize(fdt)            (fdt_get_header(fdt, totalsize))
++#define fdt_off_dt_struct(fdt)                (fdt_get_header(fdt, off_dt_struct))
++#define fdt_off_dt_strings(fdt)               (fdt_get_header(fdt, off_dt_strings))
++#define fdt_off_mem_rsvmap(fdt)               (fdt_get_header(fdt, off_mem_rsvmap))
++#define fdt_version(fdt)              (fdt_get_header(fdt, version))
++#define fdt_last_comp_version(fdt)    (fdt_get_header(fdt, last_comp_version))
++#define fdt_boot_cpuid_phys(fdt)      (fdt_get_header(fdt, boot_cpuid_phys))
++#define fdt_size_dt_strings(fdt)      (fdt_get_header(fdt, size_dt_strings))
++#define fdt_size_dt_struct(fdt)               (fdt_get_header(fdt, size_dt_struct))
++
++#define __fdt_set_hdr(name) \
++      static inline void fdt_set_##name(void *fdt, uint32_t val) \
++      { \
++              struct fdt_header *fdth = fdt; \
++              fdth->name = cpu_to_fdt32(val); \
++      }
++__fdt_set_hdr(magic);
++__fdt_set_hdr(totalsize);
++__fdt_set_hdr(off_dt_struct);
++__fdt_set_hdr(off_dt_strings);
++__fdt_set_hdr(off_mem_rsvmap);
++__fdt_set_hdr(version);
++__fdt_set_hdr(last_comp_version);
++__fdt_set_hdr(boot_cpuid_phys);
++__fdt_set_hdr(size_dt_strings);
++__fdt_set_hdr(size_dt_struct);
++#undef __fdt_set_hdr
++
++/**
++ * fdt_check_header - sanity check a device tree or possible device tree
++ * @fdt: pointer to data which might be a flattened device tree
++ *
++ * fdt_check_header() checks that the given buffer contains what
++ * appears to be a flattened device tree with sane information in its
++ * header.
++ *
++ * returns:
++ *     0, if the buffer appears to contain a valid device tree
++ *     -FDT_ERR_BADMAGIC,
++ *     -FDT_ERR_BADVERSION,
++ *     -FDT_ERR_BADSTATE, standard meanings, as above
++ */
++int fdt_check_header(const void *fdt);
++
++/**
++ * fdt_move - move a device tree around in memory
++ * @fdt: pointer to the device tree to move
++ * @buf: pointer to memory where the device is to be moved
++ * @bufsize: size of the memory space at buf
++ *
++ * fdt_move() relocates, if possible, the device tree blob located at
++ * fdt to the buffer at buf of size bufsize.  The buffer may overlap
++ * with the existing device tree blob at fdt.  Therefore,
++ *     fdt_move(fdt, fdt, fdt_totalsize(fdt))
++ * should always succeed.
++ *
++ * returns:
++ *     0, on success
++ *     -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
++ *     -FDT_ERR_BADMAGIC,
++ *     -FDT_ERR_BADVERSION,
++ *     -FDT_ERR_BADSTATE, standard meanings
++ */
++int fdt_move(const void *fdt, void *buf, int bufsize);
++
++/**********************************************************************/
++/* Read-only functions                                                */
++/**********************************************************************/
++
++/**
++ * fdt_string - retrieve a string from the strings block of a device tree
++ * @fdt: pointer to the device tree blob
++ * @stroffset: offset of the string within the strings block (native endian)
++ *
++ * fdt_string() retrieves a pointer to a single string from the
++ * strings block of the device tree blob at fdt.
++ *
++ * returns:
++ *     a pointer to the string, on success
++ *     NULL, if stroffset is out of bounds
++ */
++const char *fdt_string(const void *fdt, int stroffset);
++
++/**
++ * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
++ * @fdt: pointer to the device tree blob
++ *
++ * Returns the number of entries in the device tree blob's memory
++ * reservation map.  This does not include the terminating 0,0 entry
++ * or any other (0,0) entries reserved for expansion.
++ *
++ * returns:
++ *     the number of entries
++ */
++int fdt_num_mem_rsv(const void *fdt);
++
++/**
++ * fdt_get_mem_rsv - retrieve one memory reserve map entry
++ * @fdt: pointer to the device tree blob
++ * @address, @size: pointers to 64-bit variables
++ *
++ * On success, *address and *size will contain the address and size of
++ * the n-th reserve map entry from the device tree blob, in
++ * native-endian format.
++ *
++ * returns:
++ *     0, on success
++ *     -FDT_ERR_BADMAGIC,
++ *     -FDT_ERR_BADVERSION,
++ *     -FDT_ERR_BADSTATE, standard meanings
++ */
++int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
++
++/**
++ * fdt_subnode_offset_namelen - find a subnode based on substring
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ * @namelen: number of characters of name to consider
++ *
++ * Identical to fdt_subnode_offset(), but only examine the first
++ * namelen characters of name for matching the subnode name.  This is
++ * useful for finding subnodes based on a portion of a larger string,
++ * such as a full path.
++ */
++int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
++                             const char *name, int namelen);
++/**
++ * fdt_subnode_offset - find a subnode of a given node
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ *
++ * fdt_subnode_offset() finds a subnode of the node at structure block
++ * offset parentoffset with the given name.  name may include a unit
++ * address, in which case fdt_subnode_offset() will find the subnode
++ * with that unit address, or the unit address may be omitted, in
++ * which case fdt_subnode_offset() will find an arbitrary subnode
++ * whose name excluding unit address matches the given name.
++ *
++ * returns:
++ *    structure block offset of the requested subnode (>=0), on success
++ *    -FDT_ERR_NOTFOUND, if the requested subnode does not exist
++ *    -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
++ *      -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings.
++ */
++int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
++
++/**
++ * fdt_path_offset - find a tree node by its full path
++ * @fdt: pointer to the device tree blob
++ * @path: full path of the node to locate
++ *
++ * fdt_path_offset() finds a node of a given path in the device tree.
++ * Each path component may omit the unit address portion, but the
++ * results of this are undefined if any such path component is
++ * ambiguous (that is if there are multiple nodes at the relevant
++ * level matching the given component, differentiated only by unit
++ * address).
++ *
++ * returns:
++ *    structure block offset of the node with the requested path (>=0), on success
++ *    -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
++ *    -FDT_ERR_NOTFOUND, if the requested node does not exist
++ *      -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings.
++ */
++int fdt_path_offset(const void *fdt, const char *path);
++
++/**
++ * fdt_get_name - retrieve the name of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: structure block offset of the starting node
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_get_name() retrieves the name (including unit address) of the
++ * device tree node at structure block offset nodeoffset.  If lenp is
++ * non-NULL, the length of this name is also returned, in the integer
++ * pointed to by lenp.
++ *
++ * returns:
++ *    pointer to the node's name, on success
++ *            If lenp is non-NULL, *lenp contains the length of that name (>=0)
++ *    NULL, on error
++ *            if lenp is non-NULL *lenp contains an error code (<0):
++ *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *            -FDT_ERR_BADMAGIC,
++ *            -FDT_ERR_BADVERSION,
++ *            -FDT_ERR_BADSTATE, standard meanings
++ */
++const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
++
++/**
++ * fdt_get_property - find a given property in a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to find
++ * @name: name of the property to find
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_get_property() retrieves a pointer to the fdt_property
++ * structure within the device tree blob corresponding to the property
++ * named 'name' of the node at offset nodeoffset.  If lenp is
++ * non-NULL, the length of the property value is also returned, in the
++ * integer pointed to by lenp.
++ *
++ * returns:
++ *    pointer to the structure representing the property
++ *            if lenp is non-NULL, *lenp contains the length of the property
++ *            value (>=0)
++ *    NULL, on error
++ *            if lenp is non-NULL, *lenp contains an error code (<0):
++ *            -FDT_ERR_NOTFOUND, node does not have named property
++ *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *            -FDT_ERR_BADMAGIC,
++ *            -FDT_ERR_BADVERSION,
++ *            -FDT_ERR_BADSTATE,
++ *            -FDT_ERR_BADSTRUCTURE,
++ *            -FDT_ERR_TRUNCATED, standard meanings
++ */
++const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
++                                          const char *name, int *lenp);
++static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
++                                                    const char *name,
++                                                    int *lenp)
++{
++      return (struct fdt_property *)(uintptr_t)
++              fdt_get_property(fdt, nodeoffset, name, lenp);
++}
++
++/**
++ * fdt_getprop - retrieve the value of a given property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to find
++ * @name: name of the property to find
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_getprop() retrieves a pointer to the value of the property
++ * named 'name' of the node at offset nodeoffset (this will be a
++ * pointer to within the device blob itself, not a copy of the value).
++ * If lenp is non-NULL, the length of the property value is also
++ * returned, in the integer pointed to by lenp.
++ *
++ * returns:
++ *    pointer to the property's value
++ *            if lenp is non-NULL, *lenp contains the length of the property
++ *            value (>=0)
++ *    NULL, on error
++ *            if lenp is non-NULL, *lenp contains an error code (<0):
++ *            -FDT_ERR_NOTFOUND, node does not have named property
++ *            -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *            -FDT_ERR_BADMAGIC,
++ *            -FDT_ERR_BADVERSION,
++ *            -FDT_ERR_BADSTATE,
++ *            -FDT_ERR_BADSTRUCTURE,
++ *            -FDT_ERR_TRUNCATED, standard meanings
++ */
++const void *fdt_getprop(const void *fdt, int nodeoffset,
++                      const char *name, int *lenp);
++static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
++                                const char *name, int *lenp)
++{
++      return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp);
++}
++
++/**
++ * fdt_get_phandle - retrieve the phandle of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: structure block offset of the node
++ *
++ * fdt_get_phandle() retrieves the phandle of the device tree node at
++ * structure block offset nodeoffset.
++ *
++ * returns:
++ *    the phandle of the node at nodeoffset, on success (!= 0, != -1)
++ *    0, if the node has no phandle, or another error occurs
++ */
++uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_get_path - determine the full path of a node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose path to find
++ * @buf: character buffer to contain the returned path (will be overwritten)
++ * @buflen: size of the character buffer at buf
++ *
++ * fdt_get_path() computes the full path of the node at offset
++ * nodeoffset, and records that path in the buffer at buf.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++ *    0, on success
++ *            buf contains the absolute path of the node at
++ *            nodeoffset, as a NUL-terminated string.
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
++ *            characters and will not fit in the given buffer.
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
++
++/**
++ * fdt_supernode_atdepth_offset - find a specific ancestor of a node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ * @supernodedepth: depth of the ancestor to find
++ * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_supernode_atdepth_offset() finds an ancestor of the given node
++ * at a specific depth from the root (where the root itself has depth
++ * 0, its immediate subnodes depth 1 and so forth).  So
++ *    fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
++ * will always return 0, the offset of the root node.  If the node at
++ * nodeoffset has depth D, then:
++ *    fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
++ * will return nodeoffset itself.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++
++ *    structure block offset of the node at node offset's ancestor
++ *            of depth supernodedepth (>=0), on success
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++*     -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
++                               int supernodedepth, int *nodedepth);
++
++/**
++ * fdt_node_depth - find the depth of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ *
++ * fdt_node_depth() finds the depth of a given node.  The root node
++ * has depth 0, its immediate subnodes depth 1 and so forth.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++ *    depth of the node at nodeoffset (>=0), on success
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_depth(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_parent_offset - find the parent of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ *
++ * fdt_parent_offset() locates the parent node of a given node (that
++ * is, it finds the offset of the node which contains the node at
++ * nodeoffset as a subnode).
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset, *twice*.
++ *
++ * returns:
++ *    structure block offset of the parent of the node at nodeoffset
++ *            (>=0), on success
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_parent_offset(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_node_offset_by_prop_value - find nodes with a given property value
++ * @fdt: pointer to the device tree blob
++ * @startoffset: only find nodes after this offset
++ * @propname: property name to check
++ * @propval: property value to search for
++ * @proplen: length of the value in propval
++ *
++ * fdt_node_offset_by_prop_value() returns the offset of the first
++ * node after startoffset, which has a property named propname whose
++ * value is of length proplen and has value equal to propval; or if
++ * startoffset is -1, the very first such node in the tree.
++ *
++ * To iterate through all nodes matching the criterion, the following
++ * idiom can be used:
++ *    offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
++ *                                           propval, proplen);
++ *    while (offset != -FDT_ERR_NOTFOUND) {
++ *            // other code here
++ *            offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
++ *                                                   propval, proplen);
++ *    }
++ *
++ * Note the -1 in the first call to the function, if 0 is used here
++ * instead, the function will never locate the root node, even if it
++ * matches the criterion.
++ *
++ * returns:
++ *    structure block offset of the located node (>= 0, >startoffset),
++ *             on success
++ *    -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
++ *            tree after startoffset
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
++                                const char *propname,
++                                const void *propval, int proplen);
++
++/**
++ * fdt_node_offset_by_phandle - find the node with a given phandle
++ * @fdt: pointer to the device tree blob
++ * @phandle: phandle value
++ *
++ * fdt_node_offset_by_phandle() returns the offset of the node
++ * which has the given phandle value.  If there is more than one node
++ * in the tree with the given phandle (an invalid tree), results are
++ * undefined.
++ *
++ * returns:
++ *    structure block offset of the located node (>= 0), on success
++ *    -FDT_ERR_NOTFOUND, no node with that phandle exists
++ *    -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
++
++/**
++ * fdt_node_check_compatible: check a node's compatible property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of a tree node
++ * @compatible: string to match against
++ *
++ *
++ * fdt_node_check_compatible() returns 0 if the given node contains a
++ * 'compatible' property with the given string as one of its elements,
++ * it returns non-zero otherwise, or on error.
++ *
++ * returns:
++ *    0, if the node has a 'compatible' property listing the given string
++ *    1, if the node has a 'compatible' property, but it does not list
++ *            the given string
++ *    -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
++ *    -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_check_compatible(const void *fdt, int nodeoffset,
++                            const char *compatible);
++
++/**
++ * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
++ * @fdt: pointer to the device tree blob
++ * @startoffset: only find nodes after this offset
++ * @compatible: 'compatible' string to match against
++ *
++ * fdt_node_offset_by_compatible() returns the offset of the first
++ * node after startoffset, which has a 'compatible' property which
++ * lists the given compatible string; or if startoffset is -1, the
++ * very first such node in the tree.
++ *
++ * To iterate through all nodes matching the criterion, the following
++ * idiom can be used:
++ *    offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
++ *    while (offset != -FDT_ERR_NOTFOUND) {
++ *            // other code here
++ *            offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
++ *    }
++ *
++ * Note the -1 in the first call to the function, if 0 is used here
++ * instead, the function will never locate the root node, even if it
++ * matches the criterion.
++ *
++ * returns:
++ *    structure block offset of the located node (>= 0, >startoffset),
++ *             on success
++ *    -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
++ *            tree after startoffset
++ *    -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
++                                const char *compatible);
++
++/**********************************************************************/
++/* Write-in-place functions                                           */
++/**********************************************************************/
++
++/**
++ * fdt_setprop_inplace - change a property's value, but not its size
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @val: pointer to data to replace the property value with
++ * @len: length of the property value
++ *
++ * fdt_setprop_inplace() replaces the value of a given property with
++ * the data in val, of length len.  This function cannot change the
++ * size of a property, and so will only work if len is equal to the
++ * current length of the property.
++ *
++ * This function will alter only the bytes in the blob which contain
++ * the given property value, and will not alter or move any other part
++ * of the tree.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, if len is not equal to the property's current length
++ *    -FDT_ERR_NOTFOUND, node does not have the named property
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
++                      const void *val, int len);
++
++/**
++ * fdt_setprop_inplace_cell - change the value of a single-cell property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @val: cell (32-bit integer) value to replace the property with
++ *
++ * fdt_setprop_inplace_cell() replaces the value of a given property
++ * with the 32-bit integer cell value in val, converting val to
++ * big-endian if necessary.  This function cannot change the size of a
++ * property, and so will only work if the property already exists and
++ * has length 4.
++ *
++ * This function will alter only the bytes in the blob which contain
++ * the given property value, and will not alter or move any other part
++ * of the tree.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, if the property's length is not equal to 4
++  *   -FDT_ERR_NOTFOUND, node does not have the named property
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
++                                         const char *name, uint32_t val)
++{
++      val = cpu_to_fdt32(val);
++      return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
++}
++
++/**
++ * fdt_nop_property - replace a property with nop tags
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to nop
++ * @name: name of the property to nop
++ *
++ * fdt_nop_property() will replace a given property's representation
++ * in the blob with FDT_NOP tags, effectively removing it from the
++ * tree.
++ *
++ * This function will alter only the bytes in the blob which contain
++ * the property, and will not alter or move any other part of the
++ * tree.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOTFOUND, node does not have the named property
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
++
++/**
++ * fdt_nop_node - replace a node (subtree) with nop tags
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node to nop
++ *
++ * fdt_nop_node() will replace a given node's representation in the
++ * blob, including all its subnodes, if any, with FDT_NOP tags,
++ * effectively removing it from the tree.
++ *
++ * This function will alter only the bytes in the blob which contain
++ * the node and its properties and subnodes, and will not alter or
++ * move any other part of the tree.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_nop_node(void *fdt, int nodeoffset);
++
++/**********************************************************************/
++/* Sequential write functions                                         */
++/**********************************************************************/
++
++int fdt_create(void *buf, int bufsize);
++int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
++int fdt_finish_reservemap(void *fdt);
++int fdt_begin_node(void *fdt, const char *name);
++int fdt_property(void *fdt, const char *name, const void *val, int len);
++static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
++{
++      val = cpu_to_fdt32(val);
++      return fdt_property(fdt, name, &val, sizeof(val));
++}
++#define fdt_property_string(fdt, name, str) \
++      fdt_property(fdt, name, str, strlen(str)+1)
++int fdt_end_node(void *fdt);
++int fdt_finish(void *fdt);
++
++/**********************************************************************/
++/* Read-write functions                                               */
++/**********************************************************************/
++
++int fdt_open_into(const void *fdt, void *buf, int bufsize);
++int fdt_pack(void *fdt);
++
++/**
++ * fdt_add_mem_rsv - add one memory reserve map entry
++ * @fdt: pointer to the device tree blob
++ * @address, @size: 64-bit values (native endian)
++ *
++ * Adds a reserve map entry to the given blob reserving a region at
++ * address address of length size.
++ *
++ * This function will insert data into the reserve map and will
++ * therefore change the indexes of some entries in the table.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *            contain the new reservation entry
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
++
++/**
++ * fdt_del_mem_rsv - remove a memory reserve map entry
++ * @fdt: pointer to the device tree blob
++ * @n: entry to remove
++ *
++ * fdt_del_mem_rsv() removes the n-th memory reserve map entry from
++ * the blob.
++ *
++ * This function will delete data from the reservation table and will
++ * therefore change the indexes of some entries in the table.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there
++ *            are less than n+1 reserve map entries)
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_del_mem_rsv(void *fdt, int n);
++
++/**
++ * fdt_set_name - change the name of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: structure block offset of a node
++ * @name: name to give the node
++ *
++ * fdt_set_name() replaces the name (including unit address, if any)
++ * of the given node with the given string.  NOTE: this function can't
++ * efficiently check if the new name is unique amongst the given
++ * node's siblings; results are undefined if this function is invoked
++ * with a name equal to one of the given node's siblings.
++ *
++ * This function may insert or delete data from the blob, and will
++ * therefore change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob
++ *            to contain the new name
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE, standard meanings
++ */
++int fdt_set_name(void *fdt, int nodeoffset, const char *name);
++
++/**
++ * fdt_setprop - create or change a property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @val: pointer to data to set the property value to
++ * @len: length of the property value
++ *
++ * fdt_setprop() sets the value of the named property in the given
++ * node to the given value and length, creating the property if it
++ * does not already exist.
++ *
++ * This function may insert or delete data from the blob, and will
++ * therefore change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *            contain the new property value
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_setprop(void *fdt, int nodeoffset, const char *name,
++              const void *val, int len);
++
++/**
++ * fdt_setprop_cell - set a property to a single cell value
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @val: 32-bit integer value for the property (native endian)
++ *
++ * fdt_setprop_cell() sets the value of the named property in the
++ * given node to the given cell value (converting to big-endian if
++ * necessary), or creates a new property with that value if it does
++ * not already exist.
++ *
++ * This function may insert or delete data from the blob, and will
++ * therefore change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *            contain the new property value
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
++                                 uint32_t val)
++{
++      val = cpu_to_fdt32(val);
++      return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
++}
++
++/**
++ * fdt_setprop_string - set a property to a string value
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @str: string value for the property
++ *
++ * fdt_setprop_string() sets the value of the named property in the
++ * given node to the given string value (using the length of the
++ * string to determine the new length of the property), or creates a
++ * new property with that value if it does not already exist.
++ *
++ * This function may insert or delete data from the blob, and will
++ * therefore change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *            contain the new property value
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++#define fdt_setprop_string(fdt, nodeoffset, name, str) \
++      fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
++
++/**
++ * fdt_delprop - delete a property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to nop
++ * @name: name of the property to nop
++ *
++ * fdt_del_property() will delete the given property.
++ *
++ * This function will delete data from the blob, and will therefore
++ * change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_NOTFOUND, node does not have the named property
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_delprop(void *fdt, int nodeoffset, const char *name);
++
++/**
++ * fdt_add_subnode_namelen - creates a new node based on substring
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ * @namelen: number of characters of name to consider
++ *
++ * Identical to fdt_add_subnode(), but use only the first namelen
++ * characters of name as the name of the new node.  This is useful for
++ * creating subnodes based on a portion of a larger string, such as a
++ * full path.
++ */
++int fdt_add_subnode_namelen(void *fdt, int parentoffset,
++                          const char *name, int namelen);
++
++/**
++ * fdt_add_subnode - creates a new node
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ *
++ * fdt_add_subnode() creates a new node as a subnode of the node at
++ * structure block offset parentoffset, with the given name (which
++ * should include the unit address, if any).
++ *
++ * This function will insert data into the blob, and will therefore
++ * change the offsets of some existing nodes.
++
++ * returns:
++ *    structure block offset of the created nodeequested subnode (>=0), on success
++ *    -FDT_ERR_NOTFOUND, if the requested subnode does not exist
++ *    -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
++ *    -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
++ *            the given name
++ *    -FDT_ERR_NOSPACE, if there is insufficient free space in the
++ *            blob to contain the new node
++ *    -FDT_ERR_NOSPACE
++ *    -FDT_ERR_BADLAYOUT
++ *      -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings.
++ */
++int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
++
++/**
++ * fdt_del_node - delete a node (subtree)
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node to nop
++ *
++ * fdt_del_node() will remove the given node, including all its
++ * subnodes if any, from the blob.
++ *
++ * This function will delete data from the blob, and will therefore
++ * change the offsets of some existing nodes.
++ *
++ * returns:
++ *    0, on success
++ *    -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *    -FDT_ERR_BADLAYOUT,
++ *    -FDT_ERR_BADMAGIC,
++ *    -FDT_ERR_BADVERSION,
++ *    -FDT_ERR_BADSTATE,
++ *    -FDT_ERR_BADSTRUCTURE,
++ *    -FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_del_node(void *fdt, int nodeoffset);
++
++/**********************************************************************/
++/* Debugging / informational functions                                */
++/**********************************************************************/
++
++const char *fdt_strerror(int errval);
++
++#endif /* _LIBFDT_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt_internal.h linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt_internal.h
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/libfdt_internal.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/libfdt_internal.h  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,95 @@
++#ifndef _LIBFDT_INTERNAL_H
++#define _LIBFDT_INTERNAL_H
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ *  a) This library 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 library 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 library; if not, write to the Free
++ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ *     MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ *  b) Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *     1. Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *     2. Redistributions in binary form must reproduce the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer in the documentation and/or other materials
++ *        provided with the distribution.
++ *
++ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include <fdt.h>
++
++#define FDT_ALIGN(x, a)               (((x) + (a) - 1) & ~((a) - 1))
++#define FDT_TAGALIGN(x)               (FDT_ALIGN((x), FDT_TAGSIZE))
++
++#define FDT_CHECK_HEADER(fdt) \
++      { \
++              int err; \
++              if ((err = fdt_check_header(fdt)) != 0) \
++                      return err; \
++      }
++
++uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
++int _fdt_check_node_offset(const void *fdt, int offset);
++const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
++int _fdt_node_end_offset(void *fdt, int nodeoffset);
++
++static inline const void *_fdt_offset_ptr(const void *fdt, int offset)
++{
++      return (const char *)fdt + fdt_off_dt_struct(fdt) + offset;
++}
++
++static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
++{
++      return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset);
++}
++
++static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n)
++{
++      const struct fdt_reserve_entry *rsv_table =
++              (const struct fdt_reserve_entry *)
++              ((const char *)fdt + fdt_off_mem_rsvmap(fdt));
++
++      return rsv_table + n;
++}
++static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
++{
++      return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n);
++}
++
++#define FDT_SW_MAGIC          (~FDT_MAGIC)
++
++#endif /* _LIBFDT_INTERNAL_H */
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/libfdt/Makefile.libfdt linux-2.6.30-rc4-git/scripts/dtc/libfdt/Makefile.libfdt
+--- linux-2.6.30-rc4/scripts/dtc/libfdt/Makefile.libfdt        1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/libfdt/Makefile.libfdt    2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,8 @@
++# Makefile.libfdt
++#
++# This is not a complete Makefile of itself.  Instead, it is designed to
++# be easily embeddable into other systems of Makefiles.
++#
++LIBFDT_INCLUDES = fdt.h libfdt.h
++LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
++LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/livetree.c linux-2.6.30-rc4-git/scripts/dtc/livetree.c
+--- linux-2.6.30-rc4/scripts/dtc/livetree.c    1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/livetree.c        2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,308 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++
++/*
++ * Tree building functions
++ */
++
++struct property *build_property(char *name, struct data val, char *label)
++{
++      struct property *new = xmalloc(sizeof(*new));
++
++      new->name = name;
++      new->val = val;
++
++      new->next = NULL;
++
++      new->label = label;
++
++      return new;
++}
++
++struct property *chain_property(struct property *first, struct property *list)
++{
++      assert(first->next == NULL);
++
++      first->next = list;
++      return first;
++}
++
++struct property *reverse_properties(struct property *first)
++{
++      struct property *p = first;
++      struct property *head = NULL;
++      struct property *next;
++
++      while (p) {
++              next = p->next;
++              p->next = head;
++              head = p;
++              p = next;
++      }
++      return head;
++}
++
++struct node *build_node(struct property *proplist, struct node *children)
++{
++      struct node *new = xmalloc(sizeof(*new));
++      struct node *child;
++
++      memset(new, 0, sizeof(*new));
++
++      new->proplist = reverse_properties(proplist);
++      new->children = children;
++
++      for_each_child(new, child) {
++              child->parent = new;
++      }
++
++      return new;
++}
++
++struct node *name_node(struct node *node, char *name, char * label)
++{
++      assert(node->name == NULL);
++
++      node->name = name;
++
++      node->label = label;
++
++      return node;
++}
++
++struct node *chain_node(struct node *first, struct node *list)
++{
++      assert(first->next_sibling == NULL);
++
++      first->next_sibling = list;
++      return first;
++}
++
++void add_property(struct node *node, struct property *prop)
++{
++      struct property **p;
++
++      prop->next = NULL;
++
++      p = &node->proplist;
++      while (*p)
++              p = &((*p)->next);
++
++      *p = prop;
++}
++
++void add_child(struct node *parent, struct node *child)
++{
++      struct node **p;
++
++      child->next_sibling = NULL;
++      child->parent = parent;
++
++      p = &parent->children;
++      while (*p)
++              p = &((*p)->next_sibling);
++
++      *p = child;
++}
++
++struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size,
++                                       char *label)
++{
++      struct reserve_info *new = xmalloc(sizeof(*new));
++
++      new->re.address = address;
++      new->re.size = size;
++
++      new->next = NULL;
++
++      new->label = label;
++
++      return new;
++}
++
++struct reserve_info *chain_reserve_entry(struct reserve_info *first,
++                                      struct reserve_info *list)
++{
++      assert(first->next == NULL);
++
++      first->next = list;
++      return first;
++}
++
++struct reserve_info *add_reserve_entry(struct reserve_info *list,
++                                    struct reserve_info *new)
++{
++      struct reserve_info *last;
++
++      new->next = NULL;
++
++      if (! list)
++              return new;
++
++      for (last = list; last->next; last = last->next)
++              ;
++
++      last->next = new;
++
++      return list;
++}
++
++struct boot_info *build_boot_info(struct reserve_info *reservelist,
++                                struct node *tree, uint32_t boot_cpuid_phys)
++{
++      struct boot_info *bi;
++
++      bi = xmalloc(sizeof(*bi));
++      bi->reservelist = reservelist;
++      bi->dt = tree;
++      bi->boot_cpuid_phys = boot_cpuid_phys;
++
++      return bi;
++}
++
++/*
++ * Tree accessor functions
++ */
++
++const char *get_unitname(struct node *node)
++{
++      if (node->name[node->basenamelen] == '\0')
++              return "";
++      else
++              return node->name + node->basenamelen + 1;
++}
++
++struct property *get_property(struct node *node, const char *propname)
++{
++      struct property *prop;
++
++      for_each_property(node, prop)
++              if (streq(prop->name, propname))
++                      return prop;
++
++      return NULL;
++}
++
++cell_t propval_cell(struct property *prop)
++{
++      assert(prop->val.len == sizeof(cell_t));
++      return fdt32_to_cpu(*((cell_t *)prop->val.val));
++}
++
++struct node *get_subnode(struct node *node, const char *nodename)
++{
++      struct node *child;
++
++      for_each_child(node, child)
++              if (streq(child->name, nodename))
++                      return child;
++
++      return NULL;
++}
++
++struct node *get_node_by_path(struct node *tree, const char *path)
++{
++      const char *p;
++      struct node *child;
++
++      if (!path || ! (*path))
++              return tree;
++
++      while (path[0] == '/')
++              path++;
++
++      p = strchr(path, '/');
++
++      for_each_child(tree, child) {
++              if (p && strneq(path, child->name, p-path))
++                      return get_node_by_path(child, p+1);
++              else if (!p && streq(path, child->name))
++                      return child;
++      }
++
++      return NULL;
++}
++
++struct node *get_node_by_label(struct node *tree, const char *label)
++{
++      struct node *child, *node;
++
++      assert(label && (strlen(label) > 0));
++
++      if (tree->label && streq(tree->label, label))
++              return tree;
++
++      for_each_child(tree, child) {
++              node = get_node_by_label(child, label);
++              if (node)
++                      return node;
++      }
++
++      return NULL;
++}
++
++struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
++{
++      struct node *child, *node;
++
++      assert((phandle != 0) && (phandle != -1));
++
++      if (tree->phandle == phandle)
++              return tree;
++
++      for_each_child(tree, child) {
++              node = get_node_by_phandle(child, phandle);
++              if (node)
++                      return node;
++      }
++
++      return NULL;
++}
++
++struct node *get_node_by_ref(struct node *tree, const char *ref)
++{
++      if (ref[0] == '/')
++              return get_node_by_path(tree, ref);
++      else
++              return get_node_by_label(tree, ref);
++}
++
++cell_t get_node_phandle(struct node *root, struct node *node)
++{
++      static cell_t phandle = 1; /* FIXME: ick, static local */
++
++      if ((node->phandle != 0) && (node->phandle != -1))
++              return node->phandle;
++
++      assert(! get_property(node, "linux,phandle"));
++
++      while (get_node_by_phandle(root, phandle))
++              phandle++;
++
++      node->phandle = phandle;
++      add_property(node,
++                   build_property("linux,phandle",
++                                  data_append_cell(empty_data, phandle),
++                                  NULL));
++
++      return node->phandle;
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/Makefile linux-2.6.30-rc4-git/scripts/dtc/Makefile
+--- linux-2.6.30-rc4/scripts/dtc/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/Makefile  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,54 @@
++# scripts/dtc makefile
++
++hostprogs-y   := dtc
++always                := $(hostprogs-y)
++
++dtc-objs      := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
++                 srcpos.o checks.o
++dtc-objs      += dtc-lexer.lex.o dtc-parser.tab.o
++
++# Source files need to get at the userspace version of libfdt_env.h to compile
++
++HOSTCFLAGS_DTC := -I$(src) -I$(src)/libfdt
++
++HOSTCFLAGS_checks.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_data.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_dtc.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_flattree.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_fstree.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_livetree.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_srcpos.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_treesource.o := $(HOSTCFLAGS_DTC)
++
++HOSTCFLAGS_dtc-lexer.lex.o := $(HOSTCFLAGS_DTC)
++HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC)
++
++# dependencies on generated files need to be listed explicitly
++$(obj)/dtc-parser.tab.o: $(obj)/dtc-parser.tab.c $(obj)/dtc-parser.tab.h
++$(obj)/dtc-lexer.lex.o:  $(obj)/dtc-lexer.lex.c $(obj)/dtc-parser.tab.h
++
++targets += dtc-parser.tab.c dtc-lexer.lex.c
++
++clean-files += dtc-parser.tab.h
++
++# GENERATE_PARSER := 1                # Uncomment to rebuild flex/bison output
++
++ifdef GENERATE_PARSER
++
++BISON = bison
++FLEX = flex
++
++quiet_cmd_bison = BISON   $@
++      cmd_bison = $(BISON) -o$@ -d $<; cp $@ $@_shipped
++quiet_cmd_flex = FLEX    $@
++      cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
++
++$(obj)/dtc-parser.tab.c: $(src)/dtc-parser.y FORCE
++        $(call if_changed,bison)
++
++$(obj)/dtc-parser.tab.h: $(obj)/dtc-parser.tab.c
++
++$(obj)/dtc-lexer.lex.c: $(src)/dtc-lexer.l FORCE
++        $(call if_changed,flex)
++
++endif
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/Makefile.dtc linux-2.6.30-rc4-git/scripts/dtc/Makefile.dtc
+--- linux-2.6.30-rc4/scripts/dtc/Makefile.dtc  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/Makefile.dtc      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,9 @@
++# Makefile.dtc
++#
++# This is not a complete Makefile of itself.  Instead, it is designed to
++# be easily embeddable into other systems of Makefiles.
++#
++DTC_SRCS = dtc.c flattree.c fstree.c data.c livetree.c treesource.c srcpos.c \
++      checks.c
++DTC_GEN_SRCS = dtc-lexer.lex.c dtc-parser.tab.c
++DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/srcpos.c linux-2.6.30-rc4-git/scripts/dtc/srcpos.c
+--- linux-2.6.30-rc4/scripts/dtc/srcpos.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/srcpos.c  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, 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 "dtc.h"
++#include "srcpos.h"
++
++/*
++ * Like yylineno, this is the current open file pos.
++ */
++
++struct dtc_file *srcpos_file;
++
++static int dtc_open_one(struct dtc_file *file,
++                        const char *search,
++                        const char *fname)
++{
++      char *fullname;
++
++      if (search) {
++              fullname = xmalloc(strlen(search) + strlen(fname) + 2);
++
++              strcpy(fullname, search);
++              strcat(fullname, "/");
++              strcat(fullname, fname);
++      } else {
++              fullname = strdup(fname);
++      }
++
++      file->file = fopen(fullname, "r");
++      if (!file->file) {
++              free(fullname);
++              return 0;
++      }
++
++      file->name = fullname;
++      return 1;
++}
++
++
++struct dtc_file *dtc_open_file(const char *fname,
++                               const struct search_path *search)
++{
++      static const struct search_path default_search = { NULL, NULL, NULL };
++
++      struct dtc_file *file;
++      const char *slash;
++
++      file = xmalloc(sizeof(struct dtc_file));
++
++      slash = strrchr(fname, '/');
++      if (slash) {
++              char *dir = xmalloc(slash - fname + 1);
++
++              memcpy(dir, fname, slash - fname);
++              dir[slash - fname] = 0;
++              file->dir = dir;
++      } else {
++              file->dir = NULL;
++      }
++
++      if (streq(fname, "-")) {
++              file->name = "stdin";
++              file->file = stdin;
++              return file;
++      }
++
++      if (fname[0] == '/') {
++              file->file = fopen(fname, "r");
++              if (!file->file)
++                      goto fail;
++
++              file->name = strdup(fname);
++              return file;
++      }
++
++      if (!search)
++              search = &default_search;
++
++      while (search) {
++              if (dtc_open_one(file, search->dir, fname))
++                      return file;
++
++              if (errno != ENOENT)
++                      goto fail;
++
++              search = search->next;
++      }
++
++fail:
++      die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
++}
++
++void dtc_close_file(struct dtc_file *file)
++{
++      if (fclose(file->file))
++              die("Error closing \"%s\": %s\n", file->name, strerror(errno));
++
++      free(file->dir);
++      free(file);
++}
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/srcpos.h linux-2.6.30-rc4-git/scripts/dtc/srcpos.h
+--- linux-2.6.30-rc4/scripts/dtc/srcpos.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/srcpos.h  2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,85 @@
++/*
++ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, 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
++ */
++
++/*
++ * Augment the standard YYLTYPE with a filenum index into an
++ * array of all opened filenames.
++ */
++
++#include <stdio.h>
++
++struct dtc_file {
++      char *dir;
++      const char *name;
++      FILE *file;
++};
++
++#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
++typedef struct YYLTYPE {
++    int first_line;
++    int first_column;
++    int last_line;
++    int last_column;
++    struct dtc_file *file;
++} YYLTYPE;
++
++#define YYLTYPE_IS_DECLARED   1
++#define YYLTYPE_IS_TRIVIAL    1
++#endif
++
++/* Cater to old parser templates. */
++#ifndef YYID
++#define YYID(n)       (n)
++#endif
++
++#define YYLLOC_DEFAULT(Current, Rhs, N)                                       \
++    do                                                                        \
++      if (YYID (N))                                                   \
++      {                                                               \
++        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
++        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
++        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
++        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
++        (Current).file         = YYRHSLOC (Rhs, N).file;              \
++      }                                                               \
++      else                                                            \
++      {                                                               \
++        (Current).first_line   = (Current).last_line   =              \
++          YYRHSLOC (Rhs, 0).last_line;                                \
++        (Current).first_column = (Current).last_column =              \
++          YYRHSLOC (Rhs, 0).last_column;                              \
++        (Current).file         = YYRHSLOC (Rhs, 0).file;              \
++      }                                                               \
++    while (YYID (0))
++
++
++
++extern void yyerror(char const *);
++extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2)));
++
++extern struct dtc_file *srcpos_file;
++
++struct search_path {
++      const char *dir; /* NULL for current directory */
++      struct search_path *prev, *next;
++};
++
++extern struct dtc_file *dtc_open_file(const char *fname,
++                                      const struct search_path *search);
++extern void dtc_close_file(struct dtc_file *file);
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/treesource.c linux-2.6.30-rc4-git/scripts/dtc/treesource.c
+--- linux-2.6.30-rc4/scripts/dtc/treesource.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/treesource.c      2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1,278 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
++ *
++ *
++ * 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 "dtc.h"
++#include "srcpos.h"
++
++extern FILE *yyin;
++extern int yyparse(void);
++
++struct boot_info *the_boot_info;
++int treesource_error;
++
++struct boot_info *dt_from_source(const char *fname)
++{
++      the_boot_info = NULL;
++      treesource_error = 0;
++
++      srcpos_file = dtc_open_file(fname, NULL);
++      yyin = srcpos_file->file;
++
++      if (yyparse() != 0)
++              die("Unable to parse input tree\n");
++
++      if (treesource_error)
++              die("Syntax error parsing input tree\n");
++
++      return the_boot_info;
++}
++
++static void write_prefix(FILE *f, int level)
++{
++      int i;
++
++      for (i = 0; i < level; i++)
++              fputc('\t', f);
++}
++
++int isstring(char c)
++{
++      return (isprint(c)
++              || (c == '\0')
++              || strchr("\a\b\t\n\v\f\r", c));
++}
++
++static void write_propval_string(FILE *f, struct data val)
++{
++      const char *str = val.val;
++      int i;
++      int newchunk = 1;
++      struct marker *m = val.markers;
++
++      assert(str[val.len-1] == '\0');
++
++      for (i = 0; i < (val.len-1); i++) {
++              char c = str[i];
++
++              if (newchunk) {
++                      while (m && (m->offset <= i)) {
++                              if (m->type == LABEL) {
++                                      assert(m->offset == i);
++                                      fprintf(f, "%s: ", m->ref);
++                              }
++                              m = m->next;
++                      }
++                      fprintf(f, "\"");
++                      newchunk = 0;
++              }
++
++              switch (c) {
++              case '\a':
++                      fprintf(f, "\\a");
++                      break;
++              case '\b':
++                      fprintf(f, "\\b");
++                      break;
++              case '\t':
++                      fprintf(f, "\\t");
++                      break;
++              case '\n':
++                      fprintf(f, "\\n");
++                      break;
++              case '\v':
++                      fprintf(f, "\\v");
++                      break;
++              case '\f':
++                      fprintf(f, "\\f");
++                      break;
++              case '\r':
++                      fprintf(f, "\\r");
++                      break;
++              case '\\':
++                      fprintf(f, "\\\\");
++                      break;
++              case '\"':
++                      fprintf(f, "\\\"");
++                      break;
++              case '\0':
++                      fprintf(f, "\", ");
++                      newchunk = 1;
++                      break;
++              default:
++                      if (isprint(c))
++                              fprintf(f, "%c", c);
++                      else
++                              fprintf(f, "\\x%02hhx", c);
++              }
++      }
++      fprintf(f, "\"");
++
++      /* Wrap up any labels at the end of the value */
++      for_each_marker_of_type(m, LABEL) {
++              assert (m->offset == val.len);
++              fprintf(f, " %s:", m->ref);
++      }
++}
++
++static void write_propval_cells(FILE *f, struct data val)
++{
++      void *propend = val.val + val.len;
++      cell_t *cp = (cell_t *)val.val;
++      struct marker *m = val.markers;
++
++      fprintf(f, "<");
++      for (;;) {
++              while (m && (m->offset <= ((char *)cp - val.val))) {
++                      if (m->type == LABEL) {
++                              assert(m->offset == ((char *)cp - val.val));
++                              fprintf(f, "%s: ", m->ref);
++                      }
++                      m = m->next;
++              }
++
++              fprintf(f, "0x%x", fdt32_to_cpu(*cp++));
++              if ((void *)cp >= propend)
++                      break;
++              fprintf(f, " ");
++      }
++
++      /* Wrap up any labels at the end of the value */
++      for_each_marker_of_type(m, LABEL) {
++              assert (m->offset == val.len);
++              fprintf(f, " %s:", m->ref);
++      }
++      fprintf(f, ">");
++}
++
++static void write_propval_bytes(FILE *f, struct data val)
++{
++      void *propend = val.val + val.len;
++      const char *bp = val.val;
++      struct marker *m = val.markers;
++
++      fprintf(f, "[");
++      for (;;) {
++              while (m && (m->offset == (bp-val.val))) {
++                      if (m->type == LABEL)
++                              fprintf(f, "%s: ", m->ref);
++                      m = m->next;
++              }
++
++              fprintf(f, "%02hhx", *bp++);
++              if ((const void *)bp >= propend)
++                      break;
++              fprintf(f, " ");
++      }
++
++      /* Wrap up any labels at the end of the value */
++      for_each_marker_of_type(m, LABEL) {
++              assert (m->offset == val.len);
++              fprintf(f, " %s:", m->ref);
++      }
++      fprintf(f, "]");
++}
++
++static void write_propval(FILE *f, struct property *prop)
++{
++      int len = prop->val.len;
++      const char *p = prop->val.val;
++      struct marker *m = prop->val.markers;
++      int nnotstring = 0, nnul = 0;
++      int nnotstringlbl = 0, nnotcelllbl = 0;
++      int i;
++
++      if (len == 0) {
++              fprintf(f, ";\n");
++              return;
++      }
++
++      for (i = 0; i < len; i++) {
++              if (! isstring(p[i]))
++                      nnotstring++;
++              if (p[i] == '\0')
++                      nnul++;
++      }
++
++      for_each_marker_of_type(m, LABEL) {
++              if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0'))
++                      nnotstringlbl++;
++              if ((m->offset % sizeof(cell_t)) != 0)
++                      nnotcelllbl++;
++      }
++
++      fprintf(f, " = ");
++      if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))
++          && (nnotstringlbl == 0)) {
++              write_propval_string(f, prop->val);
++      } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
++              write_propval_cells(f, prop->val);
++      } else {
++              write_propval_bytes(f, prop->val);
++      }
++
++      fprintf(f, ";\n");
++}
++
++static void write_tree_source_node(FILE *f, struct node *tree, int level)
++{
++      struct property *prop;
++      struct node *child;
++
++      write_prefix(f, level);
++      if (tree->label)
++              fprintf(f, "%s: ", tree->label);
++      if (tree->name && (*tree->name))
++              fprintf(f, "%s {\n", tree->name);
++      else
++              fprintf(f, "/ {\n");
++
++      for_each_property(tree, prop) {
++              write_prefix(f, level+1);
++              if (prop->label)
++                      fprintf(f, "%s: ", prop->label);
++              fprintf(f, "%s", prop->name);
++              write_propval(f, prop);
++      }
++      for_each_child(tree, child) {
++              fprintf(f, "\n");
++              write_tree_source_node(f, child, level+1);
++      }
++      write_prefix(f, level);
++      fprintf(f, "};\n");
++}
++
++
++void dt_to_source(FILE *f, struct boot_info *bi)
++{
++      struct reserve_info *re;
++
++      fprintf(f, "/dts-v1/;\n\n");
++
++      for (re = bi->reservelist; re; re = re->next) {
++              if (re->label)
++                      fprintf(f, "%s: ", re->label);
++              fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
++                      (unsigned long long)re->re.address,
++                      (unsigned long long)re->re.size);
++      }
++
++      write_tree_source_node(f, bi->dt, 0);
++}
++
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/dtc/version_gen.h linux-2.6.30-rc4-git/scripts/dtc/version_gen.h
+--- linux-2.6.30-rc4/scripts/dtc/version_gen.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-git/scripts/dtc/version_gen.h     2009-05-13 09:46:19.000000000 +0200
+@@ -0,0 +1 @@
++#define DTC_VERSION "DTC 1.2.0"
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/kernel-doc linux-2.6.30-rc4-git/scripts/kernel-doc
+--- linux-2.6.30-rc4/scripts/kernel-doc        2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/scripts/kernel-doc    2009-05-13 09:46:19.000000000 +0200
+@@ -1411,7 +1411,8 @@ sub dump_struct($$) {
+     my $file = shift;
+     my $nested;
+-    if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) {
++    if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) {
++      #my $decl_type = $1;
+       $declaration_name = $2;
+       my $members = $3;
+@@ -1420,8 +1421,8 @@ sub dump_struct($$) {
+       $nested = $1;
+       # ignore members marked private:
+-      $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
+-      $members =~ s/\/\*.*?private:.*//gos;
++      $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gos;
++      $members =~ s/\/\*\s*private:.*//gos;
+       # strip comments:
+       $members =~ s/\/\*.*?\*\///gos;
+       $nested =~ s/\/\*.*?\*\///gos;
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/Makefile linux-2.6.30-rc4-git/scripts/Makefile
+--- linux-2.6.30-rc4/scripts/Makefile  2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/scripts/Makefile      2009-05-13 09:46:19.000000000 +0200
+@@ -21,6 +21,7 @@ hostprogs-y += unifdef
+ subdir-$(CONFIG_MODVERSIONS) += genksyms
+ subdir-y                     += mod
+ subdir-$(CONFIG_SECURITY_SELINUX) += selinux
++subdir-$(CONFIG_DTC)         += dtc
+ # Let clean descend into subdirs
+ subdir-       += basic kconfig package selinux
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/mod/modpost.c linux-2.6.30-rc4-git/scripts/mod/modpost.c
+--- linux-2.6.30-rc4/scripts/mod/modpost.c     2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/scripts/mod/modpost.c 2009-05-13 09:46:19.000000000 +0200
+@@ -716,41 +716,27 @@ int match(const char *sym, const char * 
+ /* sections that we do not want to do full section mismatch check on */
+ static const char *section_white_list[] =
+-      { ".debug*", ".stab*", ".note*", ".got*", ".toc*", NULL };
++      { ".comment", ".debug*", ".stab*", ".note*", ".got*", ".toc*", NULL };
+ /*
+- * Is this section one we do not want to check?
+- * This is often debug sections.
+- * If we are going to check this section then
+- * test if section name ends with a dot and a number.
+- * This is used to find sections where the linker have
+- * appended a dot-number to make the name unique.
++ * This is used to find sections missing the SHF_ALLOC flag.
+  * The cause of this is often a section specified in assembler
+- * without "ax" / "aw" and the same section used in .c
+- * code where gcc add these.
++ * without "ax" / "aw".
+  */
+-static int check_section(const char *modname, const char *sec)
++static void check_section(const char *modname, struct elf_info *elf,
++                          Elf_Shdr *sechdr)
+ {
+-      const char *e = sec + strlen(sec) - 1;
+-      if (match(sec, section_white_list))
+-              return 1;
++      const char *sec = sech_name(elf, sechdr);
+-      if (*e && isdigit(*e)) {
+-              /* consume all digits */
+-              while (*e && e != sec && isdigit(*e))
+-                      e--;
+-              if (*e == '.' && !strstr(sec, ".linkonce")) {
+-                      warn("%s (%s): unexpected section name.\n"
+-                           "The (.[number]+) following section name are "
+-                           "ld generated and not expected.\n"
+-                           "Did you forget to use \"ax\"/\"aw\" "
+-                           "in a .S file?\n"
+-                           "Note that for example <linux/init.h> contains\n"
+-                           "section definitions for use in .S files.\n\n",
+-                           modname, sec);
+-              }
++      if (sechdr->sh_type == SHT_PROGBITS &&
++          !(sechdr->sh_flags & SHF_ALLOC) &&
++          !match(sec, section_white_list)) {
++              warn("%s (%s): unexpected non-allocatable section.\n"
++                   "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
++                   "Note that for example <linux/init.h> contains\n"
++                   "section definitions for use in .S files.\n\n",
++                   modname, sec);
+       }
+-      return 0;
+ }
+@@ -928,8 +914,7 @@ static int section_mismatch(const char *
+  *           *probe_one, *_console, *_timer
+  *
+  * Pattern 3:
+- *   Whitelist all refereces from .text.head to .init.data
+- *   Whitelist all refereces from .text.head to .init.text
++ *   Whitelist all references from .head.text to any init section
+  *
+  * Pattern 4:
+  *   Some symbols belong to init section but still it is ok to reference
+@@ -1359,7 +1344,7 @@ static void section_rela(const char *mod
+       fromsec = sech_name(elf, sechdr);
+       fromsec += strlen(".rela");
+       /* if from section (name) is know good then skip it */
+-      if (check_section(modname, fromsec))
++      if (match(fromsec, section_white_list))
+               return;
+       for (rela = start; rela < stop; rela++) {
+@@ -1403,7 +1388,7 @@ static void section_rel(const char *modn
+       fromsec = sech_name(elf, sechdr);
+       fromsec += strlen(".rel");
+       /* if from section (name) is know good then skip it */
+-      if (check_section(modname, fromsec))
++      if (match(fromsec, section_white_list))
+               return;
+       for (rel = start; rel < stop; rel++) {
+@@ -1466,6 +1451,7 @@ static void check_sec_ref(struct module 
+       /* Walk through all sections */
+       for (i = 0; i < elf->hdr->e_shnum; i++) {
++              check_section(modname, elf, &elf->sechdrs[i]);
+               /* We want to process only relocation sections and not .init */
+               if (sechdrs[i].sh_type == SHT_RELA)
+                       section_rela(modname, elf, &elf->sechdrs[i]);
+@@ -1990,6 +1976,7 @@ static void read_markers(const char *fna
+               if (!mod->skip)
+                       add_marker(mod, marker, fmt);
+       }
++      release_file(file, size);
+       return;
+ fail:
+       fatal("parse error in markers list file\n");
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/setlocalversion linux-2.6.30-rc4-git/scripts/setlocalversion
+--- linux-2.6.30-rc4/scripts/setlocalversion   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/scripts/setlocalversion       2009-05-13 09:46:19.000000000 +0200
+@@ -10,13 +10,12 @@ cd "${1:-.}" || usage
+ # Check for git and a git repo.
+ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
+-      # Do we have an untagged version?
+-      if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
+-              if tag=`git describe 2>/dev/null`; then
+-                      echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
+-              else
+-                      printf '%s%s' -g $head
+-              fi
++      # Do we have an untagged tag?
++      if atag=`git describe 2>/dev/null`; then
++              echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
++      # add -g${head}, if there is no usable tag
++      else
++              printf '%s%s' -g $head
+       fi
+       # Is this git on svn?
+diff -urNp --exclude Documentation/dontdiff linux-2.6.30-rc4/scripts/tags.sh linux-2.6.30-rc4-git/scripts/tags.sh
+--- linux-2.6.30-rc4/scripts/tags.sh   2009-04-30 06:48:16.000000000 +0200
++++ linux-2.6.30-rc4-git/scripts/tags.sh       2009-05-13 09:46:19.000000000 +0200
+@@ -164,10 +164,12 @@ case "$1" in
+               ;;
+       "tags")
++              rm -f tags
+               xtags ctags
+               ;;
+       "TAGS")
++              rm -f TAGS
+               xtags etags
+               ;;
+ esac
diff --git a/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff b/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff
new file mode 100644 (file)
index 0000000..17765b4
--- /dev/null
@@ -0,0 +1,15337 @@
+diff -urNp linux-2.6.30-rc4/.config linux-2.6.30-rc4-karo/.config
+--- linux-2.6.30-rc4/.config   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/.config      2009-06-08 13:11:18.000000000 +0200
+@@ -0,0 +1,1203 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.30-rc4
++# Fri Jun  5 21:17:57 2009
++#
++CONFIG_ARM=y
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_MMU=y
++# CONFIG_NO_IOPORT is not set
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ARCH_MTD_XIP=y
++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_POSIX_MQUEUE_SYSCTL=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++
++#
++# RCU Subsystem
++#
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=17
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_CGROUPS is not set
++# CONFIG_SYSFS_DEPRECATED_V2 is not set
++# CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_EMBEDDED=y
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++# CONFIG_STRIP_ASM_SYMS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++# CONFIG_ELF_CORE is not set
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++# CONFIG_AIO is not set
++# CONFIG_VM_EVENT_COUNTERS is not set
++# CONFIG_COMPAT_BRK is not set
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_CLK=y
++# CONFIG_SLOW_WORK is not set
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_MODVERSIONS=y
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_BSG is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_FREEZER=y
++
++#
++# System Type
++#
++# CONFIG_ARCH_AAEC2000 is not set
++# CONFIG_ARCH_INTEGRATOR is not set
++# CONFIG_ARCH_REALVIEW is not set
++# CONFIG_ARCH_VERSATILE is not set
++# CONFIG_ARCH_AT91 is not set
++# CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_EBSA110 is not set
++# CONFIG_ARCH_EP93XX is not set
++# CONFIG_ARCH_GEMINI is not set
++# CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_NETX is not set
++# CONFIG_ARCH_H720X is not set
++# CONFIG_ARCH_IOP13XX is not set
++# CONFIG_ARCH_IOP32X is not set
++# CONFIG_ARCH_IOP33X is not set
++# CONFIG_ARCH_IXP23XX is not set
++# CONFIG_ARCH_IXP2000 is not set
++# CONFIG_ARCH_IXP4XX is not set
++# CONFIG_ARCH_L7200 is not set
++# CONFIG_ARCH_KIRKWOOD is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_LOKI is not set
++# CONFIG_ARCH_MV78XX0 is not set
++CONFIG_ARCH_MXC=y
++# CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_PNX4008 is not set
++# CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_RPC is not set
++# CONFIG_ARCH_SA1100 is not set
++# CONFIG_ARCH_S3C2410 is not set
++# CONFIG_ARCH_S3C64XX is not set
++# CONFIG_ARCH_SHARK is not set
++# CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_DAVINCI is not set
++# CONFIG_ARCH_OMAP is not set
++# CONFIG_ARCH_MSM is not set
++# CONFIG_ARCH_W90X900 is not set
++
++#
++# Freescale MXC Implementations
++#
++# CONFIG_ARCH_MX1 is not set
++CONFIG_ARCH_MX2=y
++# CONFIG_ARCH_MX3 is not set
++# CONFIG_MACH_MX21 is not set
++# CONFIG_MACH_MX27 is not set
++CONFIG_MACH_MX25=y
++
++#
++# MX2 platforms:
++#
++CONFIG_MACH_TX25=y
++# CONFIG_KARO_DEBUG is not set
++CONFIG_MACH_STK5_BASEBOARD=y
++# CONFIG_MXC_IRQ_PRIOR is not set
++# CONFIG_MXC_PWM is not set
++CONFIG_ARCH_MXC_IOMUX_V3=y
++
++#
++# Processor Type
++#
++CONFIG_CPU_32=y
++CONFIG_CPU_ARM926T=y
++CONFIG_CPU_32v5=y
++CONFIG_CPU_ABRT_EV5TJ=y
++CONFIG_CPU_PABRT_NOIFAR=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++
++#
++# Processor Features
++#
++CONFIG_ARM_THUMB=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
++# CONFIG_OUTER_CACHE is not set
++CONFIG_COMMON_CLKDEV=y
++
++#
++# Bus support
++#
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD is not set
++
++#
++# Kernel Features
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_VMSPLIT_3G=y
++# CONFIG_VMSPLIT_2G is not set
++# CONFIG_VMSPLIT_1G is not set
++CONFIG_PAGE_OFFSET=0xC0000000
++CONFIG_PREEMPT=y
++CONFIG_HZ=100
++CONFIG_AEABI=y
++CONFIG_OABI_COMPAT=y
++CONFIG_ARCH_FLATMEM_HAS_HOLES=y
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_SPLIT_PTLOCK_CPUS=4096
++# CONFIG_PHYS_ADDR_T_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=0
++CONFIG_VIRT_TO_BUS=y
++CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_ALIGNMENT_TRAP=y
++
++#
++# Boot options
++#
++CONFIG_ZBOOT_ROM_TEXT=0
++CONFIG_ZBOOT_ROM_BSS=0
++CONFIG_CMDLINE="init=/linuxrc root=1f01 rootfstype=jffs2 ro console=ttymxc0,115200 panic=1"
++# CONFIG_XIP_KERNEL is not set
++# CONFIG_KEXEC is not set
++
++#
++# CPU Power Management
++#
++CONFIG_CPU_IDLE=y
++CONFIG_CPU_IDLE_GOV_LADDER=y
++CONFIG_CPU_IDLE_GOV_MENU=y
++
++#
++# Floating point emulation
++#
++
++#
++# At least one emulation must be selected
++#
++CONFIG_FPE_NWFPE=y
++# CONFIG_FPE_NWFPE_XP is not set
++# CONFIG_FPE_FASTFPE is not set
++CONFIG_VFP=y
++
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_HAVE_AOUT=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options
++#
++CONFIG_PM=y
++CONFIG_PM_DEBUG=y
++CONFIG_PM_VERBOSE=y
++CONFIG_CAN_PM_TRACE=y
++CONFIG_PM_SLEEP=y
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++CONFIG_APM_EMULATION=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++CONFIG_PACKET_MMAP=y
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++CONFIG_SYN_COOKIES=y
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++# CONFIG_INET_DIAG is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_WIRELESS is not set
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++CONFIG_FIRMWARE_IN_KERNEL=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++CONFIG_MTD_CONCAT=y
++CONFIG_MTD_PARTITIONS=y
++CONFIG_MTD_TESTS=m
++CONFIG_MTD_REDBOOT_PARTS=y
++CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-5
++# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
++CONFIG_MTD_REDBOOT_PARTS_READONLY=y
++CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AFS_PARTS is not set
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++CONFIG_MTD_NAND=y
++CONFIG_MTD_NAND_VERIFY_WRITE=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++# CONFIG_MTD_NAND_GPIO is not set
++CONFIG_MTD_NAND_IDS=y
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++CONFIG_MTD_NAND_MXC=y
++CONFIG_MTD_NAND_MXC_FLASH_BBT=y
++CONFIG_ARCH_MXC_HAS_NFC_V1=y
++CONFIG_ARCH_MXC_HAS_NFC_V1_1=y
++# CONFIG_MTD_ONENAND is not set
++
++#
++# LPDDR flash memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=m
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=8192
++# CONFIG_BLK_DEV_XIP is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_93CX6 is not set
++CONFIG_HAVE_IDE=y
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++CONFIG_COMPAT_NET_DEV_OPS=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++CONFIG_SMSC_PHY=y
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_AX88796 is not set
++# CONFIG_SMC91X is not set
++# CONFIG_DM9000 is not set
++# CONFIG_ETHOC is not set
++# CONFIG_SMC911X is not set
++# CONFIG_SMSC911X is not set
++# CONFIG_DNET is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
++# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
++# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
++# CONFIG_B44 is not set
++CONFIG_FEC=y
++# CONFIG_FEC2 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_NETCONSOLE=y
++CONFIG_NETCONSOLE_DYNAMIC=y
++CONFIG_NETPOLL=y
++# CONFIG_NETPOLL_TRAP is not set
++CONFIG_NET_POLL_CONTROLLER=y
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=m
++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_EVDEV=m
++CONFIG_INPUT_EVBUG=m
++# CONFIG_INPUT_APMPOWER 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_STOWAWAY is not set
++CONFIG_KEYBOARD_GPIO=m
++CONFIG_INPUT_MOUSE=y
++# CONFIG_MOUSE_PS2 is not set
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++CONFIG_VT_HW_CONSOLE_BINDING=y
++CONFIG_DEVKMEM=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_IMX=y
++CONFIG_SERIAL_IMX_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=16
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++# CONFIG_SPI is not set
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++CONFIG_GPIOLIB=y
++CONFIG_DEBUG_GPIO=y
++CONFIG_GPIO_SYSFS=y
++
++#
++# Memory mapped GPIO expanders:
++#
++
++#
++# I2C GPIO expanders:
++#
++
++#
++# PCI GPIO expanders:
++#
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_THERMAL_HWMON is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++
++#
++# Sonics Silicon Backplane
++#
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_ASIC3 is not set
++# CONFIG_HTC_EGPIO is not set
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_MFD_TMIO is not set
++# CONFIG_MFD_T7L66XB is not set
++# CONFIG_MFD_TC6387XB is not set
++# CONFIG_MFD_TC6393XB is not set
++
++#
++# Multimedia devices
++#
++
++#
++# Multimedia core support
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
++# CONFIG_DAB is not set
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_DDC is not set
++# CONFIG_FB_BOOT_VESA_SUPPORT is not set
++CONFIG_FB_CFB_FILLRECT=y
++CONFIG_FB_CFB_COPYAREA=y
++CONFIG_FB_CFB_IMAGEBLIT=y
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
++# CONFIG_FB_SYS_FILLRECT is not set
++# CONFIG_FB_SYS_COPYAREA is not set
++# CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_SYS_FOPS is not set
++# CONFIG_FB_SVGALIB is not set
++# CONFIG_FB_MACMODES is not set
++# CONFIG_FB_BACKLIGHT is not set
++CONFIG_FB_MODE_HELPERS=y
++CONFIG_FB_TILEBLITTING=y
++
++#
++# Frame buffer hardware drivers
++#
++CONFIG_FB_IMX=y
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++# CONFIG_VGA_CONSOLE is not set
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
++# CONFIG_FONTS is not set
++CONFIG_FONT_8x8=y
++CONFIG_FONT_8x16=y
++CONFIG_LOGO=y
++CONFIG_LOGO_LINUX_MONO=y
++CONFIG_LOGO_LINUX_VGA16=y
++CONFIG_LOGO_LINUX_CLUT224=y
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_ACCESSIBILITY is not set
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=y
++
++#
++# LED drivers
++#
++CONFIG_LEDS_GPIO=y
++CONFIG_LEDS_GPIO_PLATFORM=y
++
++#
++# LED Triggers
++#
++CONFIG_LEDS_TRIGGERS=y
++# CONFIG_LEDS_TRIGGER_TIMER is not set
++CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
++# CONFIG_LEDS_TRIGGER_GPIO is not set
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++
++#
++# iptables trigger is under Netfilter config (LED target)
++#
++CONFIG_RTC_LIB=y
++# CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_REGULATOR is not set
++# CONFIG_UIO is not set
++# CONFIG_STAGING is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=m
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
++CONFIG_EXT3_FS_XATTR=y
++CONFIG_EXT3_FS_POSIX_ACL=y
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4_FS is not set
++CONFIG_JBD=m
++CONFIG_FS_MBCACHE=m
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_FILE_LOCKING=y
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++CONFIG_JOLIET=y
++CONFIG_ZISOFS=y
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=m
++CONFIG_MSDOS_FS=m
++CONFIG_VFAT_FS=m
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=m
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_CONFIGFS_FS=y
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++CONFIG_JFFS2_SUMMARY=y
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# CONFIG_SQUASHFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++CONFIG_ROOT_NFS=y
++# CONFIG_NFSD is not set
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="cp437"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++CONFIG_NLS_CODEPAGE_850=y
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++CONFIG_NLS_CODEPAGE_1250=m
++# CONFIG_NLS_CODEPAGE_1251 is not set
++CONFIG_NLS_ASCII=m
++CONFIG_NLS_ISO8859_1=m
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++CONFIG_NLS_ISO8859_15=y
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
++CONFIG_MAGIC_SYSRQ=y
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++# CONFIG_DEBUG_SHIRQ is not set
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
++# CONFIG_SCHED_DEBUG is not set
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
++CONFIG_DEBUG_SLAB=y
++CONFIG_DEBUG_SLAB_LEAK=y
++# CONFIG_DEBUG_PREEMPT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_RCU_CPU_STALL_DETECTOR is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++# CONFIG_SYSCTL_SYSCALL_CHECK is not set
++# CONFIG_PAGE_POISONING is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_TRACING_SUPPORT=y
++
++#
++# Tracers
++#
++# CONFIG_FUNCTION_TRACER is not set
++# CONFIG_IRQSOFF_TRACER is not set
++# CONFIG_PREEMPT_TRACER is not set
++# CONFIG_SCHED_TRACER is not set
++# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_EVENT_TRACER is not set
++# CONFIG_BOOT_TRACER is not set
++# CONFIG_TRACE_BRANCH_PROFILING is not set
++# CONFIG_STACK_TRACER is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
++CONFIG_DEBUG_USER=y
++CONFIG_DEBUG_ERRORS=y
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_LL is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++# CONFIG_CRYPTO_FIPS is not set
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_PCOMP=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
++# CONFIG_CRYPTO_LZO is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_BINARY_PRINTF is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_T10DIF is not set
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_DECOMPRESS_GZIP=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+diff -urNp linux-2.6.30-rc4/arch/arm/configs/karo_tx25_defconfig linux-2.6.30-rc4-karo/arch/arm/configs/karo_tx25_defconfig
+--- linux-2.6.30-rc4/arch/arm/configs/karo_tx25_defconfig      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/configs/karo_tx25_defconfig 2009-06-08 13:11:18.000000000 +0200
+@@ -0,0 +1,1203 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.30-rc4
++# Fri Jun  5 21:17:57 2009
++#
++CONFIG_ARM=y
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_MMU=y
++# CONFIG_NO_IOPORT is not set
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ARCH_MTD_XIP=y
++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_POSIX_MQUEUE_SYSCTL=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++
++#
++# RCU Subsystem
++#
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=17
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_CGROUPS is not set
++# CONFIG_SYSFS_DEPRECATED_V2 is not set
++# CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_EMBEDDED=y
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++# CONFIG_STRIP_ASM_SYMS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++# CONFIG_ELF_CORE is not set
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++# CONFIG_AIO is not set
++# CONFIG_VM_EVENT_COUNTERS is not set
++# CONFIG_COMPAT_BRK is not set
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_CLK=y
++# CONFIG_SLOW_WORK is not set
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_MODVERSIONS=y
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_BSG is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_FREEZER=y
++
++#
++# System Type
++#
++# CONFIG_ARCH_AAEC2000 is not set
++# CONFIG_ARCH_INTEGRATOR is not set
++# CONFIG_ARCH_REALVIEW is not set
++# CONFIG_ARCH_VERSATILE is not set
++# CONFIG_ARCH_AT91 is not set
++# CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_EBSA110 is not set
++# CONFIG_ARCH_EP93XX is not set
++# CONFIG_ARCH_GEMINI is not set
++# CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_NETX is not set
++# CONFIG_ARCH_H720X is not set
++# CONFIG_ARCH_IOP13XX is not set
++# CONFIG_ARCH_IOP32X is not set
++# CONFIG_ARCH_IOP33X is not set
++# CONFIG_ARCH_IXP23XX is not set
++# CONFIG_ARCH_IXP2000 is not set
++# CONFIG_ARCH_IXP4XX is not set
++# CONFIG_ARCH_L7200 is not set
++# CONFIG_ARCH_KIRKWOOD is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_LOKI is not set
++# CONFIG_ARCH_MV78XX0 is not set
++CONFIG_ARCH_MXC=y
++# CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_PNX4008 is not set
++# CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_RPC is not set
++# CONFIG_ARCH_SA1100 is not set
++# CONFIG_ARCH_S3C2410 is not set
++# CONFIG_ARCH_S3C64XX is not set
++# CONFIG_ARCH_SHARK is not set
++# CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_DAVINCI is not set
++# CONFIG_ARCH_OMAP is not set
++# CONFIG_ARCH_MSM is not set
++# CONFIG_ARCH_W90X900 is not set
++
++#
++# Freescale MXC Implementations
++#
++# CONFIG_ARCH_MX1 is not set
++CONFIG_ARCH_MX2=y
++# CONFIG_ARCH_MX3 is not set
++# CONFIG_MACH_MX21 is not set
++# CONFIG_MACH_MX27 is not set
++CONFIG_MACH_MX25=y
++
++#
++# MX2 platforms:
++#
++CONFIG_MACH_TX25=y
++# CONFIG_KARO_DEBUG is not set
++CONFIG_MACH_STK5_BASEBOARD=y
++# CONFIG_MXC_IRQ_PRIOR is not set
++# CONFIG_MXC_PWM is not set
++CONFIG_ARCH_MXC_IOMUX_V3=y
++
++#
++# Processor Type
++#
++CONFIG_CPU_32=y
++CONFIG_CPU_ARM926T=y
++CONFIG_CPU_32v5=y
++CONFIG_CPU_ABRT_EV5TJ=y
++CONFIG_CPU_PABRT_NOIFAR=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++
++#
++# Processor Features
++#
++CONFIG_ARM_THUMB=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
++# CONFIG_OUTER_CACHE is not set
++CONFIG_COMMON_CLKDEV=y
++
++#
++# Bus support
++#
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD is not set
++
++#
++# Kernel Features
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_VMSPLIT_3G=y
++# CONFIG_VMSPLIT_2G is not set
++# CONFIG_VMSPLIT_1G is not set
++CONFIG_PAGE_OFFSET=0xC0000000
++CONFIG_PREEMPT=y
++CONFIG_HZ=100
++CONFIG_AEABI=y
++CONFIG_OABI_COMPAT=y
++CONFIG_ARCH_FLATMEM_HAS_HOLES=y
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_SPLIT_PTLOCK_CPUS=4096
++# CONFIG_PHYS_ADDR_T_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=0
++CONFIG_VIRT_TO_BUS=y
++CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_ALIGNMENT_TRAP=y
++
++#
++# Boot options
++#
++CONFIG_ZBOOT_ROM_TEXT=0
++CONFIG_ZBOOT_ROM_BSS=0
++CONFIG_CMDLINE="init=/linuxrc root=1f01 rootfstype=jffs2 ro console=ttymxc0,115200 panic=1"
++# CONFIG_XIP_KERNEL is not set
++# CONFIG_KEXEC is not set
++
++#
++# CPU Power Management
++#
++CONFIG_CPU_IDLE=y
++CONFIG_CPU_IDLE_GOV_LADDER=y
++CONFIG_CPU_IDLE_GOV_MENU=y
++
++#
++# Floating point emulation
++#
++
++#
++# At least one emulation must be selected
++#
++CONFIG_FPE_NWFPE=y
++# CONFIG_FPE_NWFPE_XP is not set
++# CONFIG_FPE_FASTFPE is not set
++CONFIG_VFP=y
++
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_HAVE_AOUT=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options
++#
++CONFIG_PM=y
++CONFIG_PM_DEBUG=y
++CONFIG_PM_VERBOSE=y
++CONFIG_CAN_PM_TRACE=y
++CONFIG_PM_SLEEP=y
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++CONFIG_APM_EMULATION=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++CONFIG_PACKET_MMAP=y
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++CONFIG_SYN_COOKIES=y
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++# CONFIG_INET_DIAG is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_WIRELESS is not set
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++CONFIG_FIRMWARE_IN_KERNEL=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++CONFIG_MTD_CONCAT=y
++CONFIG_MTD_PARTITIONS=y
++CONFIG_MTD_TESTS=m
++CONFIG_MTD_REDBOOT_PARTS=y
++CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-5
++# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
++CONFIG_MTD_REDBOOT_PARTS_READONLY=y
++CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AFS_PARTS is not set
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++CONFIG_MTD_NAND=y
++CONFIG_MTD_NAND_VERIFY_WRITE=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++# CONFIG_MTD_NAND_GPIO is not set
++CONFIG_MTD_NAND_IDS=y
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++CONFIG_MTD_NAND_MXC=y
++CONFIG_MTD_NAND_MXC_FLASH_BBT=y
++CONFIG_ARCH_MXC_HAS_NFC_V1=y
++CONFIG_ARCH_MXC_HAS_NFC_V1_1=y
++# CONFIG_MTD_ONENAND is not set
++
++#
++# LPDDR flash memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=m
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=8192
++# CONFIG_BLK_DEV_XIP is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_93CX6 is not set
++CONFIG_HAVE_IDE=y
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++CONFIG_COMPAT_NET_DEV_OPS=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++CONFIG_SMSC_PHY=y
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_AX88796 is not set
++# CONFIG_SMC91X is not set
++# CONFIG_DM9000 is not set
++# CONFIG_ETHOC is not set
++# CONFIG_SMC911X is not set
++# CONFIG_SMSC911X is not set
++# CONFIG_DNET is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
++# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
++# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
++# CONFIG_B44 is not set
++CONFIG_FEC=y
++# CONFIG_FEC2 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_NETCONSOLE=y
++CONFIG_NETCONSOLE_DYNAMIC=y
++CONFIG_NETPOLL=y
++# CONFIG_NETPOLL_TRAP is not set
++CONFIG_NET_POLL_CONTROLLER=y
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=m
++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_EVDEV=m
++CONFIG_INPUT_EVBUG=m
++# CONFIG_INPUT_APMPOWER 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_STOWAWAY is not set
++CONFIG_KEYBOARD_GPIO=m
++CONFIG_INPUT_MOUSE=y
++# CONFIG_MOUSE_PS2 is not set
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++CONFIG_VT_HW_CONSOLE_BINDING=y
++CONFIG_DEVKMEM=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_IMX=y
++CONFIG_SERIAL_IMX_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=16
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++# CONFIG_SPI is not set
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++CONFIG_GPIOLIB=y
++CONFIG_DEBUG_GPIO=y
++CONFIG_GPIO_SYSFS=y
++
++#
++# Memory mapped GPIO expanders:
++#
++
++#
++# I2C GPIO expanders:
++#
++
++#
++# PCI GPIO expanders:
++#
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_THERMAL_HWMON is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++
++#
++# Sonics Silicon Backplane
++#
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_ASIC3 is not set
++# CONFIG_HTC_EGPIO is not set
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_MFD_TMIO is not set
++# CONFIG_MFD_T7L66XB is not set
++# CONFIG_MFD_TC6387XB is not set
++# CONFIG_MFD_TC6393XB is not set
++
++#
++# Multimedia devices
++#
++
++#
++# Multimedia core support
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
++# CONFIG_DAB is not set
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_DDC is not set
++# CONFIG_FB_BOOT_VESA_SUPPORT is not set
++CONFIG_FB_CFB_FILLRECT=y
++CONFIG_FB_CFB_COPYAREA=y
++CONFIG_FB_CFB_IMAGEBLIT=y
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
++# CONFIG_FB_SYS_FILLRECT is not set
++# CONFIG_FB_SYS_COPYAREA is not set
++# CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_SYS_FOPS is not set
++# CONFIG_FB_SVGALIB is not set
++# CONFIG_FB_MACMODES is not set
++# CONFIG_FB_BACKLIGHT is not set
++CONFIG_FB_MODE_HELPERS=y
++CONFIG_FB_TILEBLITTING=y
++
++#
++# Frame buffer hardware drivers
++#
++CONFIG_FB_IMX=y
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++# CONFIG_VGA_CONSOLE is not set
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
++# CONFIG_FONTS is not set
++CONFIG_FONT_8x8=y
++CONFIG_FONT_8x16=y
++CONFIG_LOGO=y
++CONFIG_LOGO_LINUX_MONO=y
++CONFIG_LOGO_LINUX_VGA16=y
++CONFIG_LOGO_LINUX_CLUT224=y
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_ACCESSIBILITY is not set
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=y
++
++#
++# LED drivers
++#
++CONFIG_LEDS_GPIO=y
++CONFIG_LEDS_GPIO_PLATFORM=y
++
++#
++# LED Triggers
++#
++CONFIG_LEDS_TRIGGERS=y
++# CONFIG_LEDS_TRIGGER_TIMER is not set
++CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
++# CONFIG_LEDS_TRIGGER_GPIO is not set
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++
++#
++# iptables trigger is under Netfilter config (LED target)
++#
++CONFIG_RTC_LIB=y
++# CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_REGULATOR is not set
++# CONFIG_UIO is not set
++# CONFIG_STAGING is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=m
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
++CONFIG_EXT3_FS_XATTR=y
++CONFIG_EXT3_FS_POSIX_ACL=y
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4_FS is not set
++CONFIG_JBD=m
++CONFIG_FS_MBCACHE=m
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_FILE_LOCKING=y
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++CONFIG_JOLIET=y
++CONFIG_ZISOFS=y
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=m
++CONFIG_MSDOS_FS=m
++CONFIG_VFAT_FS=m
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=m
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_CONFIGFS_FS=y
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++CONFIG_JFFS2_SUMMARY=y
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# CONFIG_SQUASHFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++CONFIG_ROOT_NFS=y
++# CONFIG_NFSD is not set
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="cp437"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++CONFIG_NLS_CODEPAGE_850=y
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++CONFIG_NLS_CODEPAGE_1250=m
++# CONFIG_NLS_CODEPAGE_1251 is not set
++CONFIG_NLS_ASCII=m
++CONFIG_NLS_ISO8859_1=m
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++CONFIG_NLS_ISO8859_15=y
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
++CONFIG_MAGIC_SYSRQ=y
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++# CONFIG_DEBUG_SHIRQ is not set
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
++# CONFIG_SCHED_DEBUG is not set
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
++CONFIG_DEBUG_SLAB=y
++CONFIG_DEBUG_SLAB_LEAK=y
++# CONFIG_DEBUG_PREEMPT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_RCU_CPU_STALL_DETECTOR is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++# CONFIG_SYSCTL_SYSCALL_CHECK is not set
++# CONFIG_PAGE_POISONING is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_TRACING_SUPPORT=y
++
++#
++# Tracers
++#
++# CONFIG_FUNCTION_TRACER is not set
++# CONFIG_IRQSOFF_TRACER is not set
++# CONFIG_PREEMPT_TRACER is not set
++# CONFIG_SCHED_TRACER is not set
++# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_EVENT_TRACER is not set
++# CONFIG_BOOT_TRACER is not set
++# CONFIG_TRACE_BRANCH_PROFILING is not set
++# CONFIG_STACK_TRACER is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
++CONFIG_DEBUG_USER=y
++CONFIG_DEBUG_ERRORS=y
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_LL is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++# CONFIG_CRYPTO_FIPS is not set
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_PCOMP=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
++# CONFIG_CRYPTO_LZO is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_BINARY_PRINTF is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_T10DIF is not set
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_DECOMPRESS_GZIP=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/Kconfig linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Kconfig
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/Kconfig 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Kconfig    2009-06-08 12:45:22.000000000 +0200
+@@ -6,14 +6,26 @@ choice
+ config MACH_MX21
+       bool "i.MX21 support"
++      select ARCH_MXC_IOMUX_V2
++      select ARCH_MXC_HAS_NFC_V1
+       help
+         This enables support for Freescale's MX2 based i.MX21 processor.
+ config MACH_MX27
+       bool "i.MX27 support"
++      select ARCH_MXC_IOMUX_V2
++      select ARCH_MXC_HAS_NFC_V1
+       help
+         This enables support for Freescale's MX2 based i.MX27 processor.
++config MACH_MX25
++      bool "i.MX25 support"
++      select ARCH_MXC_IOMUX_V3
++      select ARCH_MXC_HAS_NFC_V1_1
++      select PHYLIB if FEC
++      help
++        This enables support for Freescale's MX2 based i.MX25 processor.
++
+ endchoice
+ comment "MX2 platforms:"
+@@ -39,6 +51,26 @@ config MACH_PCM038
+         Include support for phyCORE-i.MX27 (aka pcm038) platform. This
+         includes specific configurations for the module and its peripherals.
++config MACH_TX25
++      bool "Support Ka-Ro electronics TX25 module"
++      depends on MACH_MX25
++      help
++        Include support for Ka-Ro TX25 processor module
++
++config KARO_DEBUG
++      bool "Enable Ka-Ro specific debug messages"
++      depends on MACH_TX25 || MACH_TX27
++      help
++        Compile the architecture specific files with -DDEBUG to enable
++        additional debug messages
++
++config MACH_STK5_BASEBOARD
++      bool "Ka-Ro Starterkit-5 (STK5) development board"
++      depends on MACH_TX27 || MACH_TX25
++      help
++        This adds board specific devices that can be found on Ka-Ro's
++        STK5 evaluation board.
++
+ choice
+       prompt "Baseboard"
+       depends on MACH_PCM038
+@@ -60,3 +92,4 @@ config MACH_MX27_3DS
+         Include support for MX27PDK platform. This includes specific
+         configurations for the board and its peripherals.
+ endif
++
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Makefile
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile        2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Makefile   2009-06-02 17:59:14.000000000 +0200
+@@ -2,17 +2,31 @@
+ # Makefile for the linux kernel.
+ #
++ifeq ($(CONFIG_KARO_DEBUG),y)
++      EXTRA_CFLAGS += -DDEBUG
++endif
++
+ # Object file lists.
+-obj-y :=  generic.o devices.o serial.o
++obj-y :=  generic.o serial.o
++obj-$(CONFIG_MACH_MX25)       +=  devices_mx25.o
++ifeq ($(CONFIG_MACH_MX25),)
++obj-y +=  devices.o
++endif
++
++obj-$(CONFIG_MACH_MX21)                       += clock_imx21.o
+-obj-$(CONFIG_MACH_MX21) += clock_imx21.o
++obj-$(CONFIG_MACH_MX25)                       += clock_imx25.o
++obj-$(CONFIG_MACH_MX25)                       += cpu_imx25.o
+-obj-$(CONFIG_MACH_MX27) += cpu_imx27.o
+-obj-$(CONFIG_MACH_MX27) += clock_imx27.o
++obj-$(CONFIG_MACH_MX27)                       += cpu_imx27.o
++obj-$(CONFIG_MACH_MX27)                       += clock_imx27.o
+-obj-$(CONFIG_MACH_MX21ADS) += mx21ads.o
+-obj-$(CONFIG_MACH_MX27ADS) += mx27ads.o
+-obj-$(CONFIG_MACH_PCM038) += pcm038.o
+-obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o
+-obj-$(CONFIG_MACH_MX27_3DS) += mx27pdk.o
++obj-$(CONFIG_MACH_MX21ADS)            += mx21ads.o
++obj-$(CONFIG_MACH_MX27ADS)            += mx27ads.o
++obj-$(CONFIG_MACH_PCM038)             += pcm038.o
++obj-$(CONFIG_MACH_PCM970_BASEBOARD)   += pcm970-baseboard.o
++obj-$(CONFIG_MACH_MX27_3DS)           += mx27pdk.o
++obj-$(CONFIG_MACH_TX27)                       += karo-tx27.o tx27_gpio.o
++obj-$(CONFIG_MACH_TX25)                       += karo-tx25.o
++obj-$(CONFIG_MACH_STK5_BASEBOARD)     += stk5-baseboard.o
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile.boot linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Makefile.boot
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/Makefile.boot   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/Makefile.boot      2009-06-02 17:59:15.000000000 +0200
+@@ -5,3 +5,7 @@ initrd_phys-$(CONFIG_MACH_MX21)        := 0xC08
+ zreladdr-$(CONFIG_MACH_MX27)  := 0xA0008000
+ params_phys-$(CONFIG_MACH_MX27)       := 0xA0000100
+ initrd_phys-$(CONFIG_MACH_MX27)       := 0xA0800000
++
++zreladdr-$(CONFIG_MACH_MX25)  := 0x80008000
++params_phys-$(CONFIG_MACH_MX25)       := 0x80000100
++initrd_phys-$(CONFIG_MACH_MX25)       := 0x80800000
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx21.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx21.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx21.c   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx21.c      2009-06-02 17:59:15.000000000 +0200
+@@ -890,7 +890,7 @@ static struct clk clko_clk = {
+               .con_id = n, \
+               .clk = &c, \
+       },
+-static struct clk_lookup lookups[] __initdata = {
++static struct clk_lookup lookups[] = {
+ /* It's unlikely that any driver wants one of them directly:
+       _REGISTER_CLOCK(NULL, "ckih", ckih_clk)
+       _REGISTER_CLOCK(NULL, "ckil", ckil_clk)
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx25.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx25.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx25.c   1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx25.c      2009-06-08 12:46:51.000000000 +0200
+@@ -0,0 +1,1848 @@
++/*
++ * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/* based on mach-mx27/clock.c */
++
++#include <linux/clk.h>
++#include <linux/io.h>
++#include <linux/module.h>
++//#include <linux/spinlock.h>
++
++#include <asm/clkdev.h>
++//#include <asm/div64.h>
++
++#include <mach/clock.h>
++#include <mach/common.h>
++#include <mach/hardware.h>
++
++/* Register offsets */
++#define MXC_CCM_MPCTL                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x00)
++#define MXC_CCM_UPCTL                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x04)
++#define MXC_CCM_CCTL                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x08)
++#define MXC_CCM_CGCR0                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x0C)
++#define MXC_CCM_CGCR1                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x10)
++#define MXC_CCM_CGCR2                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x14)
++#define MXC_CCM_PCDR0                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x18)
++#define MXC_CCM_PCDR1                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x1C)
++#define MXC_CCM_PCDR2                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x20)
++#define MXC_CCM_PCDR3                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x24)
++#define MXC_CCM_RCSR                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x28)
++#define MXC_CCM_CRDR                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x2C)
++#define MXC_CCM_DCVR0                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x30)
++#define MXC_CCM_DCVR1                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x34)
++#define MXC_CCM_DCVR2                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x38)
++#define MXC_CCM_DCVR3                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x3C)
++#define MXC_CCM_LTR0                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x40)
++#define MXC_CCM_LTR1                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x44)
++#define MXC_CCM_LTR2                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x48)
++#define MXC_CCM_LTR3                          (IO_ADDRESS(CCM_BASE_ADDR) + 0x4C)
++#define MXC_CCM_LTBR0                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x50)
++#define MXC_CCM_LTBR1                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x54)
++#define MXC_CCM_PMCR0                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x58)
++#define MXC_CCM_PMCR1                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x5C)
++#define MXC_CCM_PMCR2                         (IO_ADDRESS(CCM_BASE_ADDR) + 0x60)
++#define MXC_CCM_MCR                           (IO_ADDRESS(CCM_BASE_ADDR) + 0x64)
++
++#define MXC_CCM_MPCTL_BRMO                    (1 << 31)
++#define MXC_CCM_MPCTL_PD_OFFSET                       26
++#define MXC_CCM_MPCTL_PD_MASK                 (0xf << 26)
++#define MXC_CCM_MPCTL_MFD_OFFSET              16
++#define MXC_CCM_MPCTL_MFD_MASK                        (0x3ff << 16)
++#define MXC_CCM_MPCTL_MFI_OFFSET              10
++#define MXC_CCM_MPCTL_MFI_MASK                        (0xf << 10)
++#define MXC_CCM_MPCTL_MFN_OFFSET              0
++#define MXC_CCM_MPCTL_MFN_MASK                        0x3ff
++#define MXC_CCM_MPCTL_LF                      (1 << 15)
++
++#define MXC_CCM_UPCTL_BRMO                    (1 << 31)
++#define MXC_CCM_UPCTL_PD_OFFSET                       26
++#define MXC_CCM_UPCTL_PD_MASK                 (0xf << 26)
++#define MXC_CCM_UPCTL_MFD_OFFSET              16
++#define MXC_CCM_UPCTL_MFD_MASK                        (0x3ff << 16)
++#define MXC_CCM_UPCTL_MFI_OFFSET              10
++#define MXC_CCM_UPCTL_MFI_MASK                        (0xf << 10)
++#define MXC_CCM_UPCTL_MFN_OFFSET              0
++#define MXC_CCM_UPCTL_MFN_MASK                        0x3ff
++#define MXC_CCM_UPCTL_LF                      (1 << 15)
++
++#define MXC_CCM_CCTL_ARM_OFFSET                       30
++#define MXC_CCM_CCTL_ARM_MASK                 (0x3 << 30)
++#define MXC_CCM_CCTL_AHB_OFFSET                       28
++#define MXC_CCM_CCTL_AHB_MASK                 (0x3 << 28)
++#define MXC_CCM_CCTL_MPLL_RST                 (1 << 27)
++#define MXC_CCM_CCTL_UPLL_RST                 (1 << 26)
++#define MXC_CCM_CCTL_LP_CTL_OFFSET            24
++#define MXC_CCM_CCTL_LP_CTL_MASK              (0x3 << 24)
++#define MXC_CCM_CCTL_LP_MODE_RUN              (0x0 << 24)
++#define MXC_CCM_CCTL_LP_MODE_WAIT             (0x1 << 24)
++#define MXC_CCM_CCTL_LP_MODE_DOZE             (0x2 << 24)
++#define MXC_CCM_CCTL_LP_MODE_STOP             (0x3 << 24)
++#define MXC_CCM_CCTL_UPLL_DISABLE             (1 << 23)
++#define MXC_CCM_CCTL_MPLL_BYPASS              (1 << 22)
++#define MXC_CCM_CCTL_USB_DIV_OFFSET           16
++#define MXC_CCM_CCTL_USB_DIV_MASK             (0x3 << 16)
++#define MXC_CCM_CCTL_CG_CTRL                  (1 << 15)
++#define MXC_CCM_CCTL_ARM_SRC                  (1 << 14)
++
++#define MXC_CCM_CGCR0_HCLK_ATA_OFFSET         (16 + 0)
++#define MXC_CCM_CGCR0_HCLK_BROM_OFFSET                (16 + 1)
++#define MXC_CCM_CGCR0_HCLK_CSI_OFFSET         (16 + 2)
++#define MXC_CCM_CGCR0_HCLK_EMI_OFFSET         (16 + 3)
++#define MXC_CCM_CGCR0_HCLK_ESAI_OFFSET                (16 + 4)
++#define MXC_CCM_CGCR0_HCLK_ESDHC1_OFFSET      (16 + 5)
++#define MXC_CCM_CGCR0_HCLK_ESDHC2_OFFSET      (16 + 6)
++#define MXC_CCM_CGCR0_HCLK_FEC_OFFSET         (16 + 7)
++#define MXC_CCM_CGCR0_HCLK_LCDC_OFFSET                (16 + 8)
++#define MXC_CCM_CGCR0_HCLK_RTIC_OFFSET                (16 + 9)
++#define MXC_CCM_CGCR0_HCLK_SDMA_OFFSET                (16 + 10)
++#define MXC_CCM_CGCR0_HCLK_SLCDC_OFFSET               (16 + 11)
++#define MXC_CCM_CGCR0_HCLK_USBOTG_OFFSET      (16 + 12)
++
++#define MXC_CCM_CGCR0_PER_CSI_OFFSET           0
++#define MXC_CCM_CGCR0_PER_EPIT_OFFSET          1
++#define MXC_CCM_CGCR0_PER_ESAI_OFFSET          2
++#define MXC_CCM_CGCR0_PER_ESDHC1_OFFSET                3
++#define MXC_CCM_CGCR0_PER_ESDHC2_OFFSET                4
++#define MXC_CCM_CGCR0_PER_GPT_OFFSET           5
++#define MXC_CCM_CGCR0_PER_I2C_OFFSET           6
++#define MXC_CCM_CGCR0_PER_LCDC_OFFSET          7
++#define MXC_CCM_CGCR0_PER_NFC_OFFSET           8
++#define MXC_CCM_CGCR0_PER_OWIRE_OFFSET                 9
++#define MXC_CCM_CGCR0_PER_PWM_OFFSET          10
++#define MXC_CCM_CGCR0_PER_SIM1_OFFSET         11
++#define MXC_CCM_CGCR0_PER_SIM2_OFFSET         12
++#define MXC_CCM_CGCR0_PER_SSI1_OFFSET         13
++#define MXC_CCM_CGCR0_PER_SSI2_OFFSET         14
++#define MXC_CCM_CGCR0_PER_UART_OFFSET         15
++
++#define MXC_CCM_CGCR1_AUDMUX_OFFSET            0
++#define MXC_CCM_CGCR1_ATA_OFFSET               1
++#define MXC_CCM_CGCR1_CAN1_OFFSET              2
++#define MXC_CCM_CGCR1_CAN2_OFFSET              3
++#define MXC_CCM_CGCR1_CSI_OFFSET               4
++#define MXC_CCM_CGCR1_CSPI1_OFFSET             5
++#define MXC_CCM_CGCR1_CSPI2_OFFSET             6
++#define MXC_CCM_CGCR1_CSPI3_OFFSET             7
++#define MXC_CCM_CGCR1_DRYICE_OFFSET            8
++#define MXC_CCM_CGCR1_ECT_OFFSET               9
++#define MXC_CCM_CGCR1_EPIT1_OFFSET            10
++#define MXC_CCM_CGCR1_EPIT2_OFFSET            11
++#define MXC_CCM_CGCR1_ESAI_OFFSET             12
++#define MXC_CCM_CGCR1_ESDHC1_OFFSET           13
++#define MXC_CCM_CGCR1_ESDHC2_OFFSET           14
++#define MXC_CCM_CGCR1_FEC_OFFSET              15
++#define MXC_CCM_CGCR1_GPIO1_OFFSET            16
++#define MXC_CCM_CGCR1_GPIO2_OFFSET            17
++#define MXC_CCM_CGCR1_GPIO3_OFFSET            18
++#define MXC_CCM_CGCR1_GPT1_OFFSET             19
++#define MXC_CCM_CGCR1_GPT2_OFFSET             20
++#define MXC_CCM_CGCR1_GPT3_OFFSET             21
++#define MXC_CCM_CGCR1_GPT4_OFFSET             22
++#define MXC_CCM_CGCR1_I2C1_OFFSET             23
++#define MXC_CCM_CGCR1_I2C2_OFFSET             24
++#define MXC_CCM_CGCR1_I2C3_OFFSET             25
++#define MXC_CCM_CGCR1_IIM_OFFSET              26
++#define MXC_CCM_CGCR1_IOMUXC_OFFSET           27
++#define MXC_CCM_CGCR1_KPP_OFFSET              28
++#define MXC_CCM_CGCR1_LCDC_OFFSET             29
++#define MXC_CCM_CGCR1_OWIRE_OFFSET            30
++#define MXC_CCM_CGCR1_PWM1_OFFSET             31
++
++#define MXC_CCM_CGCR2_PWM2_OFFSET             (32 - 32)
++#define MXC_CCM_CGCR2_PWM3_OFFSET             (33 - 32)
++#define MXC_CCM_CGCR2_PWM4_OFFSET             (34 - 32)
++#define MXC_CCM_CGCR2_RNGB_OFFSET             (35 - 32)
++#define MXC_CCM_CGCR2_RTIC_OFFSET             (36 - 32)
++#define MXC_CCM_CGCR2_SCC_OFFSET              (37 - 32)
++#define MXC_CCM_CGCR2_SDMA_OFFSET             (38 - 32)
++#define MXC_CCM_CGCR2_SIM1_OFFSET             (39 - 32)
++#define MXC_CCM_CGCR2_SIM2_OFFSET             (40 - 32)
++#define MXC_CCM_CGCR2_SLCDC_OFFSET            (41 - 32)
++#define MXC_CCM_CGCR2_SPBA_OFFSET             (42 - 32)
++#define MXC_CCM_CGCR2_SSI1_OFFSET             (43 - 32)
++#define MXC_CCM_CGCR2_SSI2_OFFSET             (44 - 32)
++#define MXC_CCM_CGCR2_TCHSCRN_OFFSET          (45 - 32)
++#define MXC_CCM_CGCR2_UART1_OFFSET            (46 - 32)
++#define MXC_CCM_CGCR2_UART2_OFFSET            (47 - 32)
++#define MXC_CCM_CGCR2_UART3_OFFSET            (48 - 32)
++#define MXC_CCM_CGCR2_UART4_OFFSET            (49 - 32)
++#define MXC_CCM_CGCR2_UART5_OFFSET            (50 - 32)
++#define MXC_CCM_CGCR2_WDOG_OFFSET             (51 - 32)
++
++#define MXC_CCM_PCDR1_PERDIV1_MASK            0x3f
++
++#define MXC_CCM_MCR_USB_XTAL_MUX_OFFSET               31
++#define MXC_CCM_MCR_CLKO_EN_OFFSET            30
++#define MXC_CCM_MCR_CLKO_DIV_OFFSET           24
++#define MXC_CCM_MCR_CLKO_DIV_MASK             (0x3F << 24)
++#define MXC_CCM_MCR_CLKO_SEL_OFFSET           20
++#define MXC_CCM_MCR_CLKO_SEL_MASK             (0xF << 20)
++#define MXC_CCM_MCR_ESAI_CLK_MUX_OFFSET               19
++#define MXC_CCM_MCR_SSI2_CLK_MUX_OFFSET               18
++#define MXC_CCM_MCR_SSI1_CLK_MUX_OFFSET               17
++#define MXC_CCM_MCR_USB_CLK_MUX_OFFSET                16
++
++#define MXC_CCM_MCR_PER_CLK_MUX_MASK          (0xFFFF << 0)
++
++#define OSC24M_CLK_FREQ               24000000 /* 24MHz reference clk */
++#define OSC32K_CLK_FREQ               32768   /* 32.768kHz oscillator in */
++
++static struct clk mpll_clk;
++static struct clk upll_clk;
++static struct clk ahb_clk;
++static struct clk upll_24610k_clk;
++
++static int _clk_enable(struct clk *clk)
++{
++      unsigned long reg;
++
++      if (!clk->enable_reg)
++              return 0;
++
++      reg = __raw_readl(clk->enable_reg);
++      reg |= 1 << clk->enable_shift;
++      __raw_writel(reg, clk->enable_reg);
++
++      return 0;
++}
++
++static void _clk_disable(struct clk *clk)
++{
++      unsigned long reg;
++
++      if (!clk->enable_reg)
++              return;
++
++      reg = __raw_readl(clk->enable_reg);
++      reg &= ~(1 << clk->enable_shift);
++      __raw_writel(reg, clk->enable_reg);
++}
++
++static int _clk_upll_enable(struct clk *clk)
++{
++      unsigned long reg;
++
++      reg = __raw_readl(MXC_CCM_CCTL);
++      reg &= ~MXC_CCM_CCTL_UPLL_DISABLE;
++      __raw_writel(reg, MXC_CCM_CCTL);
++
++      while (!(__raw_readl(MXC_CCM_UPCTL) & MXC_CCM_UPCTL_LF))
++              cpu_relax();
++
++      return 0;
++}
++
++static void _clk_upll_disable(struct clk *clk)
++{
++      unsigned long reg;
++
++      reg = __raw_readl(MXC_CCM_CCTL);
++      reg |= MXC_CCM_CCTL_UPLL_DISABLE;
++      __raw_writel(reg, MXC_CCM_CCTL);
++}
++
++static int _perclk_enable(struct clk *clk)
++{
++      unsigned long reg;
++
++      reg = __raw_readl(MXC_CCM_CGCR0);
++      reg |= 1 << clk->id;
++      __raw_writel(reg, MXC_CCM_CGCR0);
++
++      return 0;
++}
++
++static void _perclk_disable(struct clk *clk)
++{
++      unsigned long reg;
++
++      reg = __raw_readl(MXC_CCM_CGCR0);
++      reg &= ~(1 << clk->id);
++      __raw_writel(reg, MXC_CCM_CGCR0);
++}
++
++static int _clk_pll_set_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long reg;
++      signed long pd = 1;     /* Pre-divider */
++      signed long mfi;        /* Multiplication Factor (Integer part) */
++      signed long mfn;        /* Multiplication Factor (Integer part) */
++      signed long mfd;        /* Multiplication Factor (Denominator Part) */
++      signed long tmp;
++      unsigned long ref_freq = clk_get_rate(clk->parent);
++
++      while (((ref_freq / pd) * 10) > rate)
++              pd++;
++
++      /* the ref_freq/2 in the following is to round up */
++      mfi = (((rate / 2) * pd) + (ref_freq / 2)) / ref_freq;
++      if (mfi < 5 || mfi > 15)
++              return -EINVAL;
++
++      /* pick a mfd value that will work
++       * then solve for mfn */
++      mfd = ref_freq / 50000;
++
++      /*
++       *          pll_freq * pd * mfd
++       *   mfn = --------------------  -  (mfi * mfd)
++       *           2 * ref_freq
++       */
++      /* the tmp/2 is for rounding */
++      tmp = ref_freq / 10000;
++      mfn = ((((((rate / 2) + (tmp / 2)) / tmp) * pd) * mfd) / 10000) -
++              (mfi * mfd);
++
++      printk(KERN_DEBUG "pll freq: %lu PD=%ld MFI=%ld MFD=%ld MFN=%ld (0x%03lx)\n",
++             rate, pd, mfi, mfd, mfn, (mfn + ((mfn < 0) ? 1024 : 0)) & 0x3ff);
++
++      mfn = (mfn + ((mfn < 0) ? 1024 : 0)) & 0x3ff;
++      pd--;
++      mfd--;
++
++      /* Change the Pll value */
++      reg = (mfi << MXC_CCM_MPCTL_MFI_OFFSET) |
++              (mfn << MXC_CCM_MPCTL_MFN_OFFSET) |
++              (mfd << MXC_CCM_MPCTL_MFD_OFFSET) |
++              (pd << MXC_CCM_MPCTL_PD_OFFSET);
++
++      if (clk == &mpll_clk) {
++              printk(KERN_DEBUG "Changing MPCTL from %08x to %08lx\n",
++                     __raw_readl(MXC_CCM_MPCTL), reg);
++      } else if (clk == &upll_clk) {
++              printk(KERN_DEBUG "Changing UPCTL from %08x to %08lx\n",
++                     __raw_readl(MXC_CCM_UPCTL), reg);
++      }
++      if (clk == &mpll_clk)
++              __raw_writel(reg, MXC_CCM_MPCTL);
++      else if (clk == &upll_clk)
++              __raw_writel(reg, MXC_CCM_UPCTL);
++      return 0;
++}
++
++static unsigned long _clk_pll_getrate(struct clk *clk)
++{
++      unsigned long rate;
++      signed long mfi, mfn, mfd, pdf;
++      unsigned long ref_clk;
++      unsigned long reg;
++
++      ref_clk = clk_get_rate(clk->parent);
++
++      if (clk == &mpll_clk) {
++              reg = __raw_readl(MXC_CCM_MPCTL);
++              pdf = (reg & MXC_CCM_MPCTL_PD_MASK) >> MXC_CCM_MPCTL_PD_OFFSET;
++              mfd = (reg & MXC_CCM_MPCTL_MFD_MASK) >> MXC_CCM_MPCTL_MFD_OFFSET;
++              mfi = (reg & MXC_CCM_MPCTL_MFI_MASK) >> MXC_CCM_MPCTL_MFI_OFFSET;
++              mfn = (reg & MXC_CCM_MPCTL_MFN_MASK) >> MXC_CCM_MPCTL_MFN_OFFSET;
++      } else if (clk == &upll_clk) {
++              reg = __raw_readl(MXC_CCM_UPCTL);
++              pdf = (reg & MXC_CCM_UPCTL_PD_MASK) >> MXC_CCM_UPCTL_PD_OFFSET;
++              mfd = (reg & MXC_CCM_UPCTL_MFD_MASK) >> MXC_CCM_UPCTL_MFD_OFFSET;
++              mfi = (reg & MXC_CCM_UPCTL_MFI_MASK) >> MXC_CCM_UPCTL_MFI_OFFSET;
++              mfn = (reg & MXC_CCM_UPCTL_MFN_MASK) >> MXC_CCM_UPCTL_MFN_OFFSET;
++      } else {
++              BUG();          /* oops */
++      }
++
++      mfi = (mfi < 5) ? 5 : mfi;
++      rate = 2LL * ref_clk * mfn;
++      do_div(rate, mfd + 1);
++      rate = 2LL * ref_clk * mfi + rate;
++      do_div(rate, pdf + 1);
++
++      return rate;
++}
++
++static unsigned long _clk_cpu_round_rate(struct clk *clk, unsigned long rate)
++{
++      int div = clk_get_rate(clk->parent) / rate;
++
++      if (clk_get_rate(clk->parent) % rate)
++              div++;
++
++      if (div > 4)
++              div = 4;
++
++      return clk_get_rate(clk->parent) / div;
++}
++
++static int _clk_cpu_set_rate(struct clk *clk, unsigned long rate)
++{
++      int div, reg;
++      unsigned long cctl = __raw_readl(MXC_CCM_CCTL);
++
++      div = clk_get_rate(clk->parent) / rate;
++
++      if (div > 4 || div < 1 || ((clk_get_rate(clk->parent) / div) != rate))
++              return -EINVAL;
++      div--;
++
++      reg = (cctl & ~MXC_CCM_CCTL_ARM_MASK) |
++              (div << MXC_CCM_CCTL_ARM_OFFSET);
++      __raw_writel(reg, MXC_CCM_CCTL);
++
++      return 0;
++}
++
++static unsigned long _clk_cpu_getrate(struct clk *clk)
++{
++      unsigned long div;
++      unsigned long cctl = __raw_readl(MXC_CCM_CCTL);
++      unsigned long rate;
++
++      div = (cctl & MXC_CCM_CCTL_ARM_MASK) >> MXC_CCM_CCTL_ARM_OFFSET;
++
++      rate = clk_get_rate(clk->parent) / (div + 1);
++
++      if (cctl & MXC_CCM_CCTL_ARM_SRC) {
++              rate *= 3;
++              rate /= 4;
++      }
++      return rate;
++}
++
++static unsigned long _clk_ahb_getrate(struct clk *clk)
++{
++      unsigned long div;
++      unsigned long cctl = __raw_readl(MXC_CCM_CCTL);
++
++      div = (cctl & MXC_CCM_CCTL_AHB_MASK) >> MXC_CCM_CCTL_AHB_OFFSET;
++
++      return clk_get_rate(clk->parent) / (div + 1);
++}
++
++static void __iomem *pcdr_a[4] = {
++      MXC_CCM_PCDR0, MXC_CCM_PCDR1, MXC_CCM_PCDR2, MXC_CCM_PCDR3
++};
++
++static unsigned long _clk_perclkx_getrate(struct clk *clk)
++{
++      unsigned long perclk_pdf;
++      unsigned long pcdr;
++
++      if (clk->id < 0 || clk->id > 15)
++              return 0;
++
++      pcdr = __raw_readl(pcdr_a[clk->id >> 2]);
++
++      perclk_pdf =
++          (pcdr >> ((clk->id & 3) << 3)) & MXC_CCM_PCDR1_PERDIV1_MASK;
++
++      return clk_get_rate(clk->parent) / (perclk_pdf + 1);
++}
++
++static unsigned long _clk_perclkx_round_rate(struct clk *clk,
++                                           unsigned long rate)
++{
++      unsigned long div;
++
++      div = clk_get_rate(clk->parent) / rate;
++      if (clk_get_rate(clk->parent) % rate)
++              div++;
++
++      if (div > 64)
++              div = 64;
++
++      return clk_get_rate(clk->parent) / div;
++}
++
++static int _clk_perclkx_set_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long reg;
++      unsigned long div;
++
++      if (clk->id < 0 || clk->id > 15)
++              return -EINVAL;
++
++      div = clk_get_rate(clk->parent) / rate;
++      printk(KERN_DEBUG "%s: perclk[%d] parent_rate=%lu rate=%lu div=%lu\n",
++             __FUNCTION__, clk->id, clk_get_rate(clk->parent), rate, div);
++      if (div > 64 || div < 1 || ((clk_get_rate(clk->parent) / div) != rate))
++              return -EINVAL;
++      div--;
++
++      reg =
++          __raw_readl(pcdr_a[clk->id >> 2]) & ~(MXC_CCM_PCDR1_PERDIV1_MASK <<
++                                                ((clk->id & 3) << 3));
++      reg |= div << ((clk->id & 3) << 3);
++      __raw_writel(reg, pcdr_a[clk->id >> 2]);
++
++      return 0;
++}
++
++static int _clk_perclkx_set_parent(struct clk *clk, struct clk *parent)
++{
++      unsigned long mcr;
++
++      if (clk->parent == parent)
++              return 0;
++      if (parent != &upll_clk && parent != &ahb_clk)
++              return -EINVAL;
++
++      clk->parent = parent;
++      mcr = __raw_readl(MXC_CCM_MCR);
++      if (parent == &upll_clk)
++              mcr |= (1 << clk->id);
++      else
++              mcr &= ~(1 << clk->id);
++
++      __raw_writel(mcr, MXC_CCM_MCR);
++
++      return 0;
++}
++
++static int _clk_perclkx_set_parent3(struct clk *clk, struct clk *parent)
++{
++      unsigned long mcr = __raw_readl(MXC_CCM_MCR);
++      int bit;
++
++      if (clk->parent == parent)
++              return 0;
++      if (parent != &upll_clk && parent != &ahb_clk &&
++          parent != &upll_24610k_clk)
++              return -EINVAL;
++
++      switch (clk->id) {
++      case 2:
++              bit = MXC_CCM_MCR_ESAI_CLK_MUX_OFFSET;
++              break;
++      case 13:
++              bit = MXC_CCM_MCR_SSI1_CLK_MUX_OFFSET;
++              break;
++      case 14:
++              bit = MXC_CCM_MCR_SSI2_CLK_MUX_OFFSET;
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      if (parent == &upll_24610k_clk) {
++              mcr |= bit;
++              __raw_writel(mcr, MXC_CCM_MCR);
++              clk->parent = parent;
++      } else {
++              mcr &= ~bit;
++              __raw_writel(mcr, MXC_CCM_MCR);
++              return _clk_perclkx_set_parent(clk, parent);
++      }
++
++      return 0;
++}
++
++static unsigned long _clk_ipg_getrate(struct clk *clk)
++{
++      return clk_get_rate(clk->parent) / 2;   /* Always AHB / 2 */
++}
++
++/* Top-level clocks */
++static unsigned long ckih_rate = OSC24M_CLK_FREQ;
++
++static unsigned long clk_ckih_get_rate(struct clk *clk)
++{
++      return ckih_rate;
++}
++
++static unsigned long clk_ckil_get_rate(struct clk *clk)
++{
++      return OSC32K_CLK_FREQ;
++}
++
++static struct clk osc24m_clk = {
++      .get_rate = clk_ckih_get_rate,
++};
++
++static struct clk osc32k_clk = {
++      .get_rate = clk_ckil_get_rate,
++};
++
++static struct clk mpll_clk = {
++      .parent = &osc24m_clk,
++      .get_rate = _clk_pll_getrate,
++      .set_rate = _clk_pll_set_rate,
++};
++
++static struct clk upll_clk = {
++      .parent = &osc24m_clk,
++      .get_rate = _clk_pll_getrate,
++      .set_rate = _clk_pll_set_rate,
++      .enable = _clk_upll_enable,
++      .disable = _clk_upll_disable,
++};
++
++static unsigned long _clk_24610k_getrate(struct clk *clk)
++{
++      long long rate = clk_get_rate(clk->parent) * 2461LL;
++
++      do_div(rate, 24000);
++
++      return rate;    /* Always (UPLL * 24.61 / 240) */
++}
++
++static struct clk upll_24610k_clk = {
++      .parent = &upll_clk,
++      .get_rate = _clk_24610k_getrate,
++};
++
++/* Mid-level clocks */
++
++static struct clk cpu_clk = { /* ARM clock */
++      .parent = &mpll_clk,
++      .set_rate = _clk_cpu_set_rate,
++      .get_rate = _clk_cpu_getrate,
++      .round_rate = _clk_cpu_round_rate,
++};
++
++static struct clk ahb_clk = { /* a.k.a. HCLK */
++      .parent = &cpu_clk,
++      .get_rate = _clk_ahb_getrate,
++};
++
++static struct clk ipg_clk = {
++      .parent = &ahb_clk,
++      .get_rate = _clk_ipg_getrate,
++};
++
++/* Bottom-level clocks */
++
++struct clk usbotg_clk = {
++      .id = 0,
++      .parent = &ahb_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR0,
++      .enable_shift = MXC_CCM_CGCR0_HCLK_USBOTG_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk rtic_clk = {
++      .id = 0,
++      .parent = &ahb_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR0,
++      .enable_shift = MXC_CCM_CGCR0_HCLK_RTIC_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk emi_clk = {
++      .id = 0,
++      .parent = &ahb_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR0,
++      .enable_shift = MXC_CCM_CGCR0_HCLK_EMI_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk brom_clk = {
++      .id = 0,
++      .parent = &ahb_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR0,
++      .enable_shift = MXC_CCM_CGCR0_HCLK_BROM_OFFSET,
++      .disable = _clk_disable,
++};
++
++static struct clk per_clk[] = {
++      {
++              .id = 0,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 1,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 2,
++              .parent = &ahb_clk,     /* can be AHB or UPLL or 24.61MHz */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent3,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 3,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++      },
++      {
++              .id = 4,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 5,
++              .parent = &upll_clk,    /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 6,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 7,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 8,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 9,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 10,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 11,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 12,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 13,
++              .parent = &ahb_clk,     /* can be AHB or UPLL or 24.61MHz */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent3,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 14,
++              .parent = &ahb_clk,     /* can be AHB or UPLL or 24.61MHz */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent3,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++      {
++              .id = 15,
++              .parent = &ahb_clk,     /* can be AHB or UPLL */
++              .round_rate = _clk_perclkx_round_rate,
++              .set_rate = _clk_perclkx_set_rate,
++              .set_parent = _clk_perclkx_set_parent,
++              .get_rate = _clk_perclkx_getrate,
++              .enable = _perclk_enable,
++              .disable = _perclk_disable,
++      },
++};
++
++struct clk nfc_clk = {
++      .id = 0,
++      .parent = &per_clk[8],
++};
++
++struct clk audmux_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_AUDMUX_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk ata_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_ATA_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &ata_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_ATA_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk can_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CAN1_OFFSET,
++              .disable = _clk_disable,
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CAN2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk csi_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[0],
++              .secondary = &csi_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CSI_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &csi_clk[2],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_CSI_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk cspi_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CSPI1_OFFSET,
++              .disable = _clk_disable,
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CSPI2_OFFSET,
++              .disable = _clk_disable,
++      },
++      {
++              .id = 2,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_CSPI3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk dryice_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_DRYICE_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk ect_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_ECT_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk epit1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[1],
++              .secondary = &epit1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_EPIT1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk epit2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[1],
++              .secondary = &epit2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_EPIT2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk esai_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[2],
++              .secondary = &esai_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_ESAI_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &esai_clk[2],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_ESAI_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk esdhc1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[3],
++              .secondary = &esdhc1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_ESDHC1_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &esdhc1_clk[2],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_ESDHC1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk esdhc2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[4],
++              .secondary = &esdhc2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_ESDHC2_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &esdhc2_clk[2],
++      },
++      {
++              .id = 1,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_ESDHC2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk fec_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_FEC_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &fec_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_FEC_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk gpio_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPIO1_OFFSET,
++              .disable = _clk_disable,
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPIO2_OFFSET,
++              .disable = _clk_disable,
++      },
++      {
++              .id = 2,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPIO3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++static struct clk gpt1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[5],
++              .secondary = &gpt1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPT1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++static struct clk gpt2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[5],
++              .secondary = &gpt1_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPT2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++static struct clk gpt3_clk[] = {
++      {
++              .id = 2,
++              .parent = &per_clk[5],
++              .secondary = &gpt1_clk[1],
++      },
++      {
++              .id = 2,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPT3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++static struct clk gpt4_clk[] = {
++      {
++              .id = 3,
++              .parent = &per_clk[5],
++              .secondary = &gpt1_clk[1],
++      },
++      {
++              .id = 3,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_GPT4_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk i2c_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[6],
++      },
++      {
++              .id = 1,
++              .parent = &per_clk[6],
++      },
++      {
++              .id = 2,
++              .parent = &per_clk[6],
++      },
++};
++
++struct clk iim_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_IIM_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk iomuxc_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_IOMUXC_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk kpp_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR1,
++      .enable_shift = MXC_CCM_CGCR1_KPP_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk lcdc_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[7],
++              .secondary = &lcdc_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_LCDC_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &lcdc_clk[2],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_LCDC_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk owire_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[9],
++              .secondary = &owire_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_OWIRE_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk pwm1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[10],
++              .secondary = &pwm1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR1,
++              .enable_shift = MXC_CCM_CGCR1_PWM1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk pwm2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[10],
++              .secondary = &pwm2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_PWM2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk pwm3_clk[] = {
++      {
++              .id = 2,
++              .parent = &per_clk[10],
++              .secondary = &pwm3_clk[1],
++      },
++      {
++              .id = 2,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_PWM3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk pwm4_clk[] = {
++      {
++              .id = 3,
++              .parent = &per_clk[10],
++              .secondary = &pwm4_clk[1],
++      },
++      {
++              .id = 3,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_PWM3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk rngb_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR2,
++      .enable_shift = MXC_CCM_CGCR2_RNGB_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk scc_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR2,
++      .enable_shift = MXC_CCM_CGCR2_SCC_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk sdma_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SDMA_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &sdma_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_SDMA_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk sim1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[11],
++              .secondary = &sim1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SIM1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk sim2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[12],
++              .secondary = &sim2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SIM2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk slcdc_clk[] = {
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SLCDC_OFFSET,
++              .disable = _clk_disable,
++              .secondary = &slcdc_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ahb_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR0,
++              .enable_shift = MXC_CCM_CGCR0_HCLK_SLCDC_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk spba_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR2,
++      .enable_shift = MXC_CCM_CGCR2_SPBA_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk ssi1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[13],
++              .secondary = &ssi1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SSI1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk ssi2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[14],
++              .secondary = &ssi2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_SSI2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk tchscrn_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR2,
++      .enable_shift = MXC_CCM_CGCR2_TCHSCRN_OFFSET,
++      .disable = _clk_disable,
++};
++
++struct clk uart1_clk[] = {
++      {
++              .id = 0,
++              .parent = &per_clk[15],
++              .secondary = &uart1_clk[1],
++      },
++      {
++              .id = 0,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_UART1_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk uart2_clk[] = {
++      {
++              .id = 1,
++              .parent = &per_clk[15],
++              .secondary = &uart2_clk[1],
++      },
++      {
++              .id = 1,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_UART2_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk uart3_clk[] = {
++      {
++              .id = 2,
++              .parent = &per_clk[15],
++              .secondary = &uart3_clk[1],
++      },
++      {
++              .id = 2,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_UART3_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk uart4_clk[] = {
++      {
++              .id = 3,
++              .parent = &per_clk[15],
++              .secondary = &uart4_clk[1],
++      },
++      {
++              .id = 3,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_UART4_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk uart5_clk[] = {
++      {
++              .id = 4,
++              .parent = &per_clk[15],
++              .secondary = &uart5_clk[1],
++      },
++      {
++              .id = 4,
++              .parent = &ipg_clk,
++              .enable = _clk_enable,
++              .enable_reg = MXC_CCM_CGCR2,
++              .enable_shift = MXC_CCM_CGCR2_UART5_OFFSET,
++              .disable = _clk_disable,
++      },
++};
++
++struct clk wdog_clk = {
++      .id = 0,
++      .parent = &ipg_clk,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_CGCR2,
++      .enable_shift = MXC_CCM_CGCR2_WDOG_OFFSET,
++      .disable = _clk_disable,
++};
++
++static unsigned long _clk_usb_round_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long div;
++
++      div = clk_get_rate(clk->parent) / rate;
++      if (clk_get_rate(clk->parent) % rate)
++              div++;
++
++      if (div > 64)
++              return -EINVAL;
++
++      return clk_get_rate(clk->parent) / div;
++}
++
++static int _clk_usb_set_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long reg;
++      unsigned long div;
++
++      div = clk_get_rate(clk->parent) / rate;
++
++      if (clk_get_rate(clk->parent) / div != rate)
++              return -EINVAL;
++      if (div > 64)
++              return -EINVAL;
++
++      reg = __raw_readl(MXC_CCM_CCTL) & ~MXC_CCM_CCTL_USB_DIV_MASK;
++      reg |= (div - 1) << MXC_CCM_CCTL_USB_DIV_OFFSET;
++      __raw_writel(reg, MXC_CCM_MCR);
++
++      return 0;
++}
++
++static unsigned long _clk_usb_getrate(struct clk *clk)
++{
++      unsigned long div =
++              __raw_readl(MXC_CCM_MCR) & MXC_CCM_CCTL_USB_DIV_MASK;
++
++      div >>= MXC_CCM_CCTL_USB_DIV_OFFSET;
++
++      return clk_get_rate(clk->parent) / (div + 1);
++}
++
++static int _clk_usb_set_parent(struct clk *clk, struct clk *parent)
++{
++      unsigned long mcr;
++
++      if (clk->parent == parent)
++              return 0;
++      if (parent != &upll_clk && parent != &ahb_clk)
++              return -EINVAL;
++
++      clk->parent = parent;
++      mcr = __raw_readl(MXC_CCM_MCR);
++      if (parent == &ahb_clk)
++              mcr |= (1 << MXC_CCM_MCR_USB_CLK_MUX_OFFSET);
++      else
++              mcr &= ~(1 << MXC_CCM_MCR_USB_CLK_MUX_OFFSET);
++
++      __raw_writel(mcr, MXC_CCM_MCR);
++
++      return 0;
++}
++
++static struct clk usb_clk = {
++      .parent = &upll_clk,
++      .get_rate = _clk_usb_getrate,
++      .set_rate = _clk_usb_set_rate,
++      .round_rate = _clk_usb_round_rate,
++      .set_parent = _clk_usb_set_parent,
++};
++
++/* CLKO */
++
++static unsigned long _clk_clko_round_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long div;
++
++      div = clk_get_rate(clk->parent) / rate;
++      if (clk_get_rate(clk->parent) % rate)
++              div++;
++
++      if (div > 64)
++              return -EINVAL;
++
++      return clk_get_rate(clk->parent) / div;
++}
++
++static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
++{
++      unsigned long reg;
++      unsigned long div;
++
++      div = clk_get_rate(clk->parent) / rate;
++
++      if ((clk_get_rate(clk->parent) / div) != rate)
++              return -EINVAL;
++      if (div > 64)
++              return -EINVAL;
++
++      reg = __raw_readl(MXC_CCM_MCR) & ~MXC_CCM_MCR_CLKO_DIV_MASK;
++      reg |= (div - 1) << MXC_CCM_MCR_CLKO_DIV_OFFSET;
++      __raw_writel(reg, MXC_CCM_MCR);
++
++      return 0;
++}
++
++static unsigned long _clk_clko_getrate(struct clk *clk)
++{
++      unsigned long div = __raw_readl(MXC_CCM_MCR);
++
++      div &= MXC_CCM_MCR_CLKO_DIV_MASK;
++      div >>= MXC_CCM_MCR_CLKO_DIV_OFFSET;
++
++      return clk_get_rate(clk->parent) / (div + 1);
++}
++
++static struct clk *clko_sources[] = {
++      &osc32k_clk,            /* 0x0 */
++      &osc24m_clk,            /* 0x1 */
++      &cpu_clk,               /* 0x2 */
++      &ahb_clk,               /* 0x3 */
++      &ipg_clk,               /* 0x4 */
++      NULL,                   /* 0x5 */
++      NULL,                   /* 0x6 */
++      NULL,                   /* 0x7 */
++      NULL,                   /* 0x8 */
++      NULL,                   /* 0x9 */
++      &per_clk[0],            /* 0xA */
++      &per_clk[2],            /* 0xB */
++      &per_clk[13],           /* 0xC */
++      &per_clk[14],           /* 0xD */
++      &usb_clk,               /* 0xE */
++      NULL,                   /* 0xF */
++};
++
++#define NR_CLKO_SOURCES (sizeof(clko_sources) / sizeof(struct clk *))
++
++static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
++{
++      unsigned long reg;
++      struct clk **src;
++      int i;
++
++      if (clk->parent == parent)
++              return 0;
++      for (i = 0, src = clko_sources; i < NR_CLKO_SOURCES; i++, src++)
++              if (*src == parent)
++                      break;
++
++      if (i == NR_CLKO_SOURCES)
++              return -EINVAL;
++
++      clk->parent = parent;
++
++      reg = __raw_readl(MXC_CCM_MCR) & ~MXC_CCM_MCR_CLKO_SEL_MASK;
++      reg |= i << MXC_CCM_MCR_CLKO_SEL_OFFSET;
++      __raw_writel(reg, MXC_CCM_MCR);
++
++      return 0;
++}
++
++static struct clk clko_clk = {
++      .set_rate = _clk_clko_set_rate,
++      .round_rate = _clk_clko_round_rate,
++      .set_parent = _clk_clko_set_parent,
++      .get_rate = _clk_clko_getrate,
++      .enable = _clk_enable,
++      .enable_reg = MXC_CCM_MCR,
++      .enable_shift = MXC_CCM_MCR_CLKO_EN_OFFSET,
++      .disable = _clk_disable,
++};
++
++#define _REGISTER_CLOCK(d, n, c) \
++      { \
++              .dev_id = d, \
++              .con_id = n, \
++              .clk = &c, \
++      },
++
++static struct clk_lookup lookups[] = {
++      _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk)
++      _REGISTER_CLOCK(NULL, "audmux", audmux_clk)
++      _REGISTER_CLOCK(NULL, "ata", ata_clk[0])
++      _REGISTER_CLOCK(NULL, "can", can_clk[0])
++      _REGISTER_CLOCK(NULL, "csi", csi_clk[0])
++      _REGISTER_CLOCK(NULL, "cspi.0", cspi_clk[0])
++      _REGISTER_CLOCK(NULL, "cspi.1", cspi_clk[1])
++      _REGISTER_CLOCK(NULL, "cspi.2", cspi_clk[2])
++      _REGISTER_CLOCK(NULL, "dryice", dryice_clk)
++      _REGISTER_CLOCK(NULL, "ect", ect_clk)
++      _REGISTER_CLOCK(NULL, "epit1", epit1_clk[0])
++      _REGISTER_CLOCK(NULL, "epit2", epit2_clk[0])
++      _REGISTER_CLOCK(NULL, "esai", esai_clk[0])
++      _REGISTER_CLOCK("mxc-mmc.0", NULL, esdhc1_clk[0])
++      _REGISTER_CLOCK("mxc-mmc.1", NULL, esdhc2_clk[0])
++      _REGISTER_CLOCK("fec.0", NULL, fec_clk[0])
++      _REGISTER_CLOCK(NULL, "gpio0", gpio_clk[0])
++      _REGISTER_CLOCK(NULL, "gpio1", gpio_clk[1])
++      _REGISTER_CLOCK(NULL, "gpio2", gpio_clk[2])
++      _REGISTER_CLOCK(NULL, "gpt1", gpt1_clk[0])
++      _REGISTER_CLOCK(NULL, "gpt2", gpt2_clk[0])
++      _REGISTER_CLOCK(NULL, "gpt3", gpt3_clk[0])
++      _REGISTER_CLOCK(NULL, "gpt4", gpt4_clk[0])
++      _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk[0])
++      _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1])
++      _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2])
++      _REGISTER_CLOCK(NULL, "iim", iim_clk)
++      _REGISTER_CLOCK(NULL, "iomuxc", iomuxc_clk)
++      _REGISTER_CLOCK(NULL, "kpp", kpp_clk)
++      _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk[0])
++      _REGISTER_CLOCK(NULL, "owire", owire_clk[0])
++      _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk[0])
++      _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm2_clk[0])
++      _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm3_clk[0])
++      _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm4_clk[0])
++      _REGISTER_CLOCK(NULL, "rngb", rngb_clk)
++      _REGISTER_CLOCK(NULL, "scc", scc_clk)
++      _REGISTER_CLOCK(NULL, "sdma", sdma_clk[0])
++      _REGISTER_CLOCK(NULL, "sim1", sim1_clk[0])
++      _REGISTER_CLOCK(NULL, "sim2", sim2_clk[0])
++      _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk[0])
++      _REGISTER_CLOCK(NULL, "spba", spba_clk)
++      _REGISTER_CLOCK(NULL, "ssi1", ssi1_clk[0])
++      _REGISTER_CLOCK(NULL, "ssi2", ssi2_clk[0])
++      _REGISTER_CLOCK(NULL, "tchscrn", tchscrn_clk)
++      _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk[0])
++      _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk[0])
++      _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk[0])
++      _REGISTER_CLOCK("imx-uart.3", NULL, uart4_clk[0])
++      _REGISTER_CLOCK("imx-uart.4", NULL, uart5_clk[0])
++      _REGISTER_CLOCK("imx-wdt.0", NULL, wdog_clk)
++      _REGISTER_CLOCK(NULL, "usb", usb_clk)
++      _REGISTER_CLOCK(NULL, "clko", clko_clk)
++      _REGISTER_CLOCK(NULL, "brom", brom_clk)
++};
++
++int __init mx25_clocks_init(unsigned long fref)
++{
++      int i;
++
++      for (i = 0; i < ARRAY_SIZE(lookups); i++) {
++              printk(KERN_DEBUG "Registering clock '%s' '%s'\n",
++                     lookups[i].dev_id ? lookups[i].dev_id : "",
++                     lookups[i].con_id ? lookups[i].con_id : "");
++              clkdev_add(&lookups[i]);
++      }
++
++      ckih_rate = fref;
++#ifndef CONFIG_DEBUG_LL
++      /* Turn off all possible clocks */
++      __raw_writel((1 << MXC_CCM_CGCR0_HCLK_EMI_OFFSET), MXC_CCM_CGCR0);
++
++      __raw_writel((1 << MXC_CCM_CGCR1_GPT1_OFFSET) |
++                   (1 << MXC_CCM_CGCR1_IIM_OFFSET), MXC_CCM_CGCR1);
++      __raw_writel(1 << MXC_CCM_CGCR2_SCC_OFFSET, MXC_CCM_CGCR2);
++#endif
++#if 1
++      /* Set all perclk sources to upll */
++      for (i = 0; i < ARRAY_SIZE(per_clk); i++) {
++              int ret;
++              unsigned long rate = per_clk[i].get_rate(&per_clk[i]);
++
++#ifdef CONFIG_DEBUG_LL
++              if (i == 15) {
++                      printk(KERN_DEBUG "skipping per_clk[%d] rate=%lu\n", i, rate);
++                      continue;
++              }
++#endif
++              {
++                      unsigned long new_rate;
++
++                      per_clk[i].set_parent(&per_clk[i], &upll_clk);
++                      new_rate = per_clk[i].round_rate(&per_clk[i], rate);
++                      if (rate == new_rate)
++                              break;
++                      if ((ret = per_clk[i].set_rate(&per_clk[i], new_rate)) < 0) {
++                              printk(KERN_ERR "Error %d setting clk[%d] rate to %lu\n",
++                                     ret, i, new_rate);
++                      }
++              }
++      }
++#endif
++      /* the NFC clock must be derived from AHB clock */
++      clk_set_parent(&per_clk[8], &ahb_clk);
++      clk_set_rate(&per_clk[8], clk_get_rate(&ahb_clk) / 6);
++
++      /* This will propagate to all children and init all the clock rates */
++#ifdef CONFIG_DEBUG_LL
++      clk_enable(&uart1_clk[0]);
++#endif
++      clk_enable(&emi_clk);
++      clk_enable(&gpio_clk[0]);
++      clk_enable(&gpio_clk[1]);
++      clk_enable(&gpio_clk[2]);
++      clk_enable(&iim_clk);
++      clk_enable(&gpt1_clk[0]);
++      clk_enable(&iomuxc_clk);
++      clk_enable(&scc_clk);
++
++      pr_info("Clock input source is %ld\n", clk_get_rate(&osc24m_clk));
++
++      pr_info("CPU: %lu.%03luMHz\n",
++              clk_get_rate(&cpu_clk) / 1000000, clk_get_rate(&cpu_clk) / 1000 % 1000);
++      pr_info("AHB: %lu.%03luMHz\n",
++              clk_get_rate(&ahb_clk) / 1000000, clk_get_rate(&ahb_clk) / 1000 % 1000);
++      pr_info("MPLL: %lu.%03luMHz\n",
++              clk_get_rate(&mpll_clk) / 1000000, clk_get_rate(&mpll_clk) / 1000 % 1000);
++      pr_info("UPLL: %lu.%03luMHz\n",
++              clk_get_rate(&upll_clk) / 1000000, clk_get_rate(&upll_clk) / 1000 % 1000);
++      clk_set_rate(&mpll_clk, clk_get_rate(&mpll_clk));
++      clk_set_rate(&upll_clk, clk_get_rate(&upll_clk));
++
++      mxc_timer_init(&gpt1_clk[0]);
++      return 0;
++}
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx27.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx27.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/clock_imx27.c   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/clock_imx27.c      2009-06-02 17:59:15.000000000 +0200
+@@ -621,7 +621,7 @@ DEFINE_CLOCK1(csi_clk,     0, 0,      0,
+               .clk = &c, \
+       },
+-static struct clk_lookup lookups[] __initdata = {
++static struct clk_lookup lookups[] = {
+       _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
+       _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
+       _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/cpu_imx25.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/cpu_imx25.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/cpu_imx25.c     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/cpu_imx25.c        2009-06-02 17:59:17.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * arch/arm/mach-mx2/cpu_mx25.c
++ *
++ * Copyright 2009 Lothar Wassmann <LW@KARO-electronics.de>
++ * derived from: cpu_mx27.c
++ *   Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301, USA.
++ */
++
++/*
++ * i.MX25 specific CPU detection code
++ */
++
++#include <linux/io.h>
++#include <linux/module.h>
++
++#include <mach/hardware.h>
++
++static int cpu_silicon_rev = -1;
++static int cpu_partnumber;
++
++#define IIM_PREV_REG                  IO_ADDRESS(IIM_BASE_ADDR + 0x20)
++#define IIM_SREV_REG                  IO_ADDRESS(IIM_BASE_ADDR + 0x24)
++
++static void query_silicon_parameter(void)
++{
++      cpu_partnumber = __raw_readl(IIM_PREV_REG) >> 3;
++      cpu_silicon_rev = __raw_readl(IIM_SREV_REG);
++
++      printk(KERN_DEBUG "CPU rev: 0x%02x chip_rev: 0x%02x\n",
++             cpu_partnumber, cpu_silicon_rev);
++      if (WARN_ON(cpu_partnumber != 0x1f)) {
++              printk(KERN_WARNING "Unsupported CPU rev: 0x%02x\n", cpu_partnumber);
++      }
++}
++
++/*
++ * Returns:
++ *    the silicon revision of the cpu
++ *    -EINVAL - not a mx25
++ */
++int mx25_revision(void)
++{
++      if (cpu_silicon_rev == -1)
++              query_silicon_parameter();
++
++      if (cpu_partnumber != 0x1f)
++              return -EINVAL;
++
++      return cpu_silicon_rev;
++}
++EXPORT_SYMBOL(mx25_revision);
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/crm_regs_mx25.h linux-2.6.30-rc4-karo/arch/arm/mach-mx2/crm_regs_mx25.h
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/crm_regs_mx25.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/crm_regs_mx25.h    2009-06-02 17:59:17.000000000 +0200
+@@ -0,0 +1,190 @@
++/*
++ * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#ifndef __ARCH_ARM_MACH_MX25_CRM_REGS_H__
++#define __ARCH_ARM_MACH_MX25_CRM_REGS_H__
++
++#include <mach/hardware.h>
++
++/* Register offsets */
++#define MXC_CCM_MPCTL               (IO_ADDRESS(CCM_BASE_ADDR) + 0x00)
++#define MXC_CCM_UPCTL               (IO_ADDRESS(CCM_BASE_ADDR) + 0x04)
++#define MXC_CCM_CCTL                (IO_ADDRESS(CCM_BASE_ADDR) + 0x08)
++#define MXC_CCM_CGCR0               (IO_ADDRESS(CCM_BASE_ADDR) + 0x0C)
++#define MXC_CCM_CGCR1               (IO_ADDRESS(CCM_BASE_ADDR) + 0x10)
++#define MXC_CCM_CGCR2               (IO_ADDRESS(CCM_BASE_ADDR) + 0x14)
++#define MXC_CCM_PCDR0               (IO_ADDRESS(CCM_BASE_ADDR) + 0x18)
++#define MXC_CCM_PCDR1               (IO_ADDRESS(CCM_BASE_ADDR) + 0x1C)
++#define MXC_CCM_PCDR2               (IO_ADDRESS(CCM_BASE_ADDR) + 0x20)
++#define MXC_CCM_PCDR3               (IO_ADDRESS(CCM_BASE_ADDR) + 0x24)
++#define MXC_CCM_RCSR                (IO_ADDRESS(CCM_BASE_ADDR) + 0x28)
++#define MXC_CCM_CRDR                (IO_ADDRESS(CCM_BASE_ADDR) + 0x2C)
++#define MXC_CCM_DCVR0               (IO_ADDRESS(CCM_BASE_ADDR) + 0x30)
++#define MXC_CCM_DCVR1               (IO_ADDRESS(CCM_BASE_ADDR) + 0x34)
++#define MXC_CCM_DCVR2               (IO_ADDRESS(CCM_BASE_ADDR) + 0x38)
++#define MXC_CCM_DCVR3               (IO_ADDRESS(CCM_BASE_ADDR) + 0x3C)
++#define MXC_CCM_LTR0                (IO_ADDRESS(CCM_BASE_ADDR) + 0x40)
++#define MXC_CCM_LTR1                (IO_ADDRESS(CCM_BASE_ADDR) + 0x44)
++#define MXC_CCM_LTR2                (IO_ADDRESS(CCM_BASE_ADDR) + 0x48)
++#define MXC_CCM_LTR3                (IO_ADDRESS(CCM_BASE_ADDR) + 0x4C)
++#define MXC_CCM_LTBR0               (IO_ADDRESS(CCM_BASE_ADDR) + 0x50)
++#define MXC_CCM_LTBR1               (IO_ADDRESS(CCM_BASE_ADDR) + 0x54)
++#define MXC_CCM_PMCR0               (IO_ADDRESS(CCM_BASE_ADDR) + 0x58)
++#define MXC_CCM_PMCR1               (IO_ADDRESS(CCM_BASE_ADDR) + 0x5C)
++#define MXC_CCM_PMCR2               (IO_ADDRESS(CCM_BASE_ADDR) + 0x60)
++#define MXC_CCM_MCR                 (IO_ADDRESS(CCM_BASE_ADDR) + 0x64)
++
++#define MXC_CCM_MPCTL_BRMO          (1 << 31)
++#define MXC_CCM_MPCTL_PD_OFFSET     26
++#define MXC_CCM_MPCTL_PD_MASK       (0xf << 26)
++#define MXC_CCM_MPCTL_MFD_OFFSET    16
++#define MXC_CCM_MPCTL_MFD_MASK      (0x3ff << 16)
++#define MXC_CCM_MPCTL_MFI_OFFSET    10
++#define MXC_CCM_MPCTL_MFI_MASK      (0xf << 10)
++#define MXC_CCM_MPCTL_MFN_OFFSET    0
++#define MXC_CCM_MPCTL_MFN_MASK      0x3ff
++#define MXC_CCM_MPCTL_LF            (1 << 15)
++
++#define MXC_CCM_UPCTL_BRMO          (1 << 31)
++#define MXC_CCM_UPCTL_PD_OFFSET     26
++#define MXC_CCM_UPCTL_PD_MASK       (0xf << 26)
++#define MXC_CCM_UPCTL_MFD_OFFSET    16
++#define MXC_CCM_UPCTL_MFD_MASK      (0x3ff << 16)
++#define MXC_CCM_UPCTL_MFI_OFFSET    10
++#define MXC_CCM_UPCTL_MFI_MASK      (0xf << 10)
++#define MXC_CCM_UPCTL_MFN_OFFSET    0
++#define MXC_CCM_UPCTL_MFN_MASK      0x3ff
++#define MXC_CCM_UPCTL_LF            (1 << 15)
++
++#define MXC_CCM_CCTL_ARM_OFFSET     30
++#define MXC_CCM_CCTL_ARM_MASK       (0x3 << 30)
++#define MXC_CCM_CCTL_AHB_OFFSET     28
++#define MXC_CCM_CCTL_AHB_MASK       (0x3 << 28)
++#define MXC_CCM_CCTL_MPLL_RST       (1 << 27)
++#define MXC_CCM_CCTL_UPLL_RST       (1 << 26)
++#define MXC_CCM_CCTL_LP_CTL_OFFSET  24
++#define MXC_CCM_CCTL_LP_CTL_MASK    (0x3 << 24)
++#define MXC_CCM_CCTL_LP_MODE_RUN    (0x0 << 24)
++#define MXC_CCM_CCTL_LP_MODE_WAIT   (0x1 << 24)
++#define MXC_CCM_CCTL_LP_MODE_DOZE   (0x2 << 24)
++#define MXC_CCM_CCTL_LP_MODE_STOP   (0x3 << 24)
++#define MXC_CCM_CCTL_UPLL_DISABLE   (1 << 23)
++#define MXC_CCM_CCTL_MPLL_BYPASS    (1 << 22)
++#define MXC_CCM_CCTL_USB_DIV_OFFSET 16
++#define MXC_CCM_CCTL_USB_DIV_MASK   (0x3 << 16)
++#define MXC_CCM_CCTL_CG_CTRL        (1 << 15)
++#define MXC_CCM_CCTL_ARM_SRC        (1 << 14)
++
++#define MXC_CCM_CGCR0_HCLK_ATA_OFFSET    16
++#define MXC_CCM_CGCR0_HCLK_BROM_OFFSET   17
++#define MXC_CCM_CGCR0_HCLK_CSI_OFFSET    18
++#define MXC_CCM_CGCR0_HCLK_EMI_OFFSET    19
++#define MXC_CCM_CGCR0_HCLK_ESAI_OFFSET   20
++#define MXC_CCM_CGCR0_HCLK_ESDHC1_OFFSET 21
++#define MXC_CCM_CGCR0_HCLK_ESDHC2_OFFSET 22
++#define MXC_CCM_CGCR0_HCLK_FEC_OFFSET    23
++#define MXC_CCM_CGCR0_HCLK_LCDC_OFFSET   24
++#define MXC_CCM_CGCR0_HCLK_RTIC_OFFSET   25
++#define MXC_CCM_CGCR0_HCLK_SDMA_OFFSET   26
++#define MXC_CCM_CGCR0_HCLK_SLCDC_OFFSET  27
++#define MXC_CCM_CGCR0_HCLK_USBOTG_OFFSET 28
++
++#define MXC_CCM_CGCR0_PER_CSI_OFFSET     0
++#define MXC_CCM_CGCR0_PER_EPIT_OFFSET    1
++#define MXC_CCM_CGCR0_PER_ESAI_OFFSET    2
++#define MXC_CCM_CGCR0_PER_ESDHC1_OFFSET  3
++#define MXC_CCM_CGCR0_PER_ESDHC2_OFFSET  4
++#define MXC_CCM_CGCR0_PER_GPT_OFFSET     5
++#define MXC_CCM_CGCR0_PER_I2C_OFFSET     6
++#define MXC_CCM_CGCR0_PER_LCDC_OFFSET    7
++#define MXC_CCM_CGCR0_PER_NFC_OFFSET     8
++#define MXC_CCM_CGCR0_PER_OWIRE_OFFSET   9
++#define MXC_CCM_CGCR0_PER_PWM_OFFSET     10
++#define MXC_CCM_CGCR0_PER_SIM1_OFFSET    11
++#define MXC_CCM_CGCR0_PER_SIM2_OFFSET    12
++#define MXC_CCM_CGCR0_PER_SSI1_OFFSET    13
++#define MXC_CCM_CGCR0_PER_SSI2_OFFSET    14
++#define MXC_CCM_CGCR0_PER_UART_OFFSET    15
++
++#define MXC_CCM_CGCR1_AUDMUX_OFFSET      0
++#define MXC_CCM_CGCR1_ATA_OFFSET         1
++#define MXC_CCM_CGCR1_CAN1_OFFSET        2
++#define MXC_CCM_CGCR1_CAN2_OFFSET        3
++#define MXC_CCM_CGCR1_CSI_OFFSET         4
++#define MXC_CCM_CGCR1_CSPI1_OFFSET       5
++#define MXC_CCM_CGCR1_CSPI2_OFFSET       6
++#define MXC_CCM_CGCR1_CSPI3_OFFSET       7
++#define MXC_CCM_CGCR1_DRYICE_OFFSET      8
++#define MXC_CCM_CGCR1_ECT_OFFSET         9
++#define MXC_CCM_CGCR1_EPIT1_OFFSET       10
++#define MXC_CCM_CGCR1_EPIT2_OFFSET       11
++#define MXC_CCM_CGCR1_ESAI_OFFSET        12
++#define MXC_CCM_CGCR1_ESDHC1_OFFSET      13
++#define MXC_CCM_CGCR1_ESDHC2_OFFSET      14
++#define MXC_CCM_CGCR1_FEC_OFFSET         15
++#define MXC_CCM_CGCR1_GPIO1_OFFSET       16
++#define MXC_CCM_CGCR1_GPIO2_OFFSET       17
++#define MXC_CCM_CGCR1_GPIO3_OFFSET       18
++#define MXC_CCM_CGCR1_GPT1_OFFSET        19
++#define MXC_CCM_CGCR1_GPT2_OFFSET        20
++#define MXC_CCM_CGCR1_GPT3_OFFSET        21
++#define MXC_CCM_CGCR1_GPT4_OFFSET        22
++#define MXC_CCM_CGCR1_I2C1_OFFSET        23
++#define MXC_CCM_CGCR1_I2C2_OFFSET        24
++#define MXC_CCM_CGCR1_I2C3_OFFSET        25
++#define MXC_CCM_CGCR1_IIM_OFFSET         26
++#define MXC_CCM_CGCR1_IOMUXC_OFFSET      27
++#define MXC_CCM_CGCR1_KPP_OFFSET         28
++#define MXC_CCM_CGCR1_LCDC_OFFSET        29
++#define MXC_CCM_CGCR1_OWIRE_OFFSET       30
++#define MXC_CCM_CGCR1_PWM1_OFFSET        31
++
++#define MXC_CCM_CGCR2_PWM2_OFFSET        (32-32)
++#define MXC_CCM_CGCR2_PWM3_OFFSET        (33-32)
++#define MXC_CCM_CGCR2_PWM4_OFFSET        (34-32)
++#define MXC_CCM_CGCR2_RNGB_OFFSET        (35-32)
++#define MXC_CCM_CGCR2_RTIC_OFFSET        (36-32)
++#define MXC_CCM_CGCR2_SCC_OFFSET         (37-32)
++#define MXC_CCM_CGCR2_SDMA_OFFSET        (38-32)
++#define MXC_CCM_CGCR2_SIM1_OFFSET        (39-32)
++#define MXC_CCM_CGCR2_SIM2_OFFSET        (40-32)
++#define MXC_CCM_CGCR2_SLCDC_OFFSET       (41-32)
++#define MXC_CCM_CGCR2_SPBA_OFFSET        (42-32)
++#define MXC_CCM_CGCR2_SSI1_OFFSET        (43-32)
++#define MXC_CCM_CGCR2_SSI2_OFFSET        (44-32)
++#define MXC_CCM_CGCR2_TCHSCRN_OFFSET     (45-32)
++#define MXC_CCM_CGCR2_UART1_OFFSET       (46-32)
++#define MXC_CCM_CGCR2_UART2_OFFSET       (47-32)
++#define MXC_CCM_CGCR2_UART3_OFFSET       (48-32)
++#define MXC_CCM_CGCR2_UART4_OFFSET       (49-32)
++#define MXC_CCM_CGCR2_UART5_OFFSET       (50-32)
++#define MXC_CCM_CGCR2_WDOG_OFFSET        (51-32)
++
++#define MXC_CCM_PCDR1_PERDIV1_MASK       0x3f
++
++#define MXC_CCM_RCSR_NF16B               (1 << 14)
++
++#define MXC_CCM_MCR_USB_XTAL_MUX_OFFSET  31
++#define MXC_CCM_MCR_CLKO_EN_OFFSET       30
++#define MXC_CCM_MCR_CLKO_DIV_OFFSET      24
++#define MXC_CCM_MCR_CLKO_DIV_MASK        (0x3F << 24)
++#define MXC_CCM_MCR_CLKO_SEL_OFFSET      20
++#define MXC_CCM_MCR_CLKO_SEL_MASK        (0xF << 20)
++#define MXC_CCM_MCR_ESAI_CLK_MUX_OFFSET  19
++#define MXC_CCM_MCR_SSI2_CLK_MUX_OFFSET  18
++#define MXC_CCM_MCR_SSI1_CLK_MUX_OFFSET  17
++#define MXC_CCM_MCR_USB_CLK_MUX_OFFSET   16
++
++#define MXC_CCM_MCR_PER_CLK_MUX_MASK     (0xFFFF << 0)
++
++#endif                                /* __ARCH_ARM_MACH_MX25_CRM_REGS_H__ */
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/devices.h linux-2.6.30-rc4-karo/arch/arm/mach-mx2/devices.h
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/devices.h       2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/devices.h  2009-06-02 17:59:16.000000000 +0200
+@@ -20,3 +20,9 @@ extern struct platform_device mxc_i2c_de
+ extern struct platform_device mxc_i2c_device1;
+ extern struct platform_device mxc_sdhc_device0;
+ extern struct platform_device mxc_sdhc_device1;
++#ifdef CONFIG_MACH_MX25
++extern struct platform_device mx25_i2c_device0;
++extern struct platform_device mx25_i2c_device1;
++extern struct platform_device mx25_i2c_device2;
++extern struct platform_device mxc_sdhc_device2;
++#endif
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/devices_mx25.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/devices_mx25.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/devices_mx25.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/devices_mx25.c     2009-06-02 17:59:17.000000000 +0200
+@@ -0,0 +1,402 @@
++/*
++ * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <linux/gpio.h>
++#include <linux/spi/spi.h>
++
++#include <mach/hardware.h>
++#include <mach/mmc.h>
++#include <mach/spba.h>
++#include <mach/sdma.h>
++#include <mach/iomux.h>
++
++#include "sdma_script_code.h"
++
++#include "karo.h"
++
++void mx25_sdma_get_script_info(sdma_script_start_addrs * sdma_script_addr)
++{
++      sdma_script_addr->mxc_sdma_ap_2_ap_addr = ap_2_ap_ADDR;
++      sdma_script_addr->mxc_sdma_ap_2_bp_addr = -1;
++      sdma_script_addr->mxc_sdma_bp_2_ap_addr = -1;
++      sdma_script_addr->mxc_sdma_loopback_on_dsp_side_addr = -1;
++      sdma_script_addr->mxc_sdma_mcu_interrupt_only_addr = -1;
++
++      sdma_script_addr->mxc_sdma_firi_2_per_addr = -1;
++      sdma_script_addr->mxc_sdma_firi_2_mcu_addr = -1;
++      sdma_script_addr->mxc_sdma_per_2_firi_addr = -1;
++      sdma_script_addr->mxc_sdma_mcu_2_firi_addr = -1;
++
++      sdma_script_addr->mxc_sdma_uart_2_per_addr = uart_2_per_ADDR;
++      sdma_script_addr->mxc_sdma_uart_2_mcu_addr = uart_2_mcu_ADDR;
++      sdma_script_addr->mxc_sdma_per_2_app_addr = per_2_app_ADDR;
++      sdma_script_addr->mxc_sdma_mcu_2_app_addr = mcu_2_app_ADDR;
++
++      sdma_script_addr->mxc_sdma_per_2_per_addr = -1;
++
++      sdma_script_addr->mxc_sdma_uartsh_2_per_addr = uartsh_2_per_ADDR;
++      sdma_script_addr->mxc_sdma_uartsh_2_mcu_addr = uartsh_2_mcu_ADDR;
++      sdma_script_addr->mxc_sdma_per_2_shp_addr = per_2_shp_ADDR;
++      sdma_script_addr->mxc_sdma_mcu_2_shp_addr = mcu_2_shp_ADDR;
++
++      sdma_script_addr->mxc_sdma_ata_2_mcu_addr = ata_2_mcu_ADDR;
++      sdma_script_addr->mxc_sdma_mcu_2_ata_addr = mcu_2_ata_ADDR;
++
++      sdma_script_addr->mxc_sdma_app_2_per_addr = app_2_per_ADDR;
++      sdma_script_addr->mxc_sdma_app_2_mcu_addr = app_2_mcu_ADDR;
++      sdma_script_addr->mxc_sdma_shp_2_per_addr = shp_2_per_ADDR;
++      sdma_script_addr->mxc_sdma_shp_2_mcu_addr = shp_2_mcu_ADDR;
++
++      sdma_script_addr->mxc_sdma_mshc_2_mcu_addr = -1;
++      sdma_script_addr->mxc_sdma_mcu_2_mshc_addr = -1;
++
++      sdma_script_addr->mxc_sdma_spdif_2_mcu_addr = -1;
++      sdma_script_addr->mxc_sdma_mcu_2_spdif_addr = -1;
++
++      sdma_script_addr->mxc_sdma_asrc_2_mcu_addr = -1;
++
++      sdma_script_addr->mxc_sdma_dptc_dvfs_addr = -1;
++      sdma_script_addr->mxc_sdma_ext_mem_2_ipu_addr = ext_mem__ipu_ram_ADDR;
++      sdma_script_addr->mxc_sdma_descrambler_addr = -1;
++
++      sdma_script_addr->mxc_sdma_start_addr = (unsigned short *)sdma_code;
++      sdma_script_addr->mxc_sdma_ram_code_size = RAM_CODE_SIZE;
++      sdma_script_addr->mxc_sdma_ram_code_start_addr = RAM_CODE_START_ADDR;
++}
++
++#if defined(CONFIG_MXC_WATCHDOG) || defined(CONFIG_MXC_WATCHDOG_MODULE)
++static struct resource wdt_resources[] = {
++      {
++              .start = WDOG_BASE_ADDR,
++              .end = WDOG_BASE_ADDR + 0x2f,
++              .flags = IORESOURCE_MEM,
++      },
++};
++
++static struct platform_device mx25_wdt_device = {
++      .name = "mxc_wdt",
++      .id = 0,
++      .num_resources = ARRAY_SIZE(wdt_resources),
++      .resource = wdt_resources,
++};
++
++static void mx25_init_wdt(void)
++{
++      (void)platform_device_register(&mx25_wdt_device);
++}
++#else
++static inline void mx25_init_wdt(void)
++{
++}
++#endif
++
++/*
++ * lcdc:
++ * - i.MX1: the basic controller
++ * - i.MX21: to be checked
++ * - i.MX27: like i.MX1, with slightly variations
++ */
++static struct resource mxc_fb[] = {
++      {
++              .start = LCDC_BASE_ADDR,
++              .end   = LCDC_BASE_ADDR + 0xFFF,
++              .flags = IORESOURCE_MEM,
++      },
++      {
++              .start = MXC_INT_LCDC,
++              .end   = MXC_INT_LCDC,
++              .flags = IORESOURCE_IRQ,
++      }
++};
++
++/* mxc lcd driver */
++struct platform_device mxc_fb_device = {
++      .name = "imx-fb",
++      .id = 0,
++      .num_resources = ARRAY_SIZE(mxc_fb),
++      .resource = mxc_fb,
++      .dev = {
++              .coherent_dma_mask = 0xFFFFFFFF,
++      },
++};
++
++/* SPI controller and device data */
++#if defined(CONFIG_SPI_MXC) || defined(CONFIG_SPI_MXC_MODULE)
++
++#ifdef CONFIG_SPI_MXC_SELECT1
++/*!
++ * Resource definition for the CSPI1
++ */
++static struct resource mx25_spi1_resources[] = {
++      [0] = {
++             .start = CSPI1_BASE_ADDR,
++             .end = CSPI1_BASE_ADDR + SZ_4K - 1,
++             .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++             .start = MXC_INT_CSPI1,
++             .end = MXC_INT_CSPI1,
++             .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*! Platform Data for MXC CSPI1 */
++static struct mxc_spi_master mx25_spi1_data = {
++      .maxchipselect = 4,
++      .spi_version = 7,
++};
++
++/*! Device Definition for MXC CSPI1 */
++static struct platform_device mx25_spi1_device = {
++      .name = "mxc_spi",
++      .id = 0,
++      .dev = {
++              .platform_data = &mx25_spi1_data,
++      },
++      .num_resources = ARRAY_SIZE(mx25_spi1_resources),
++      .resource = mx25_spi1_resources,
++};
++
++#endif /* CONFIG_SPI_MXC_SELECT1 */
++
++#ifdef CONFIG_SPI_MXC_SELECT2
++/*!
++ * Resource definition for the CSPI2
++ */
++static struct resource mx25_spi2_resources[] = {
++      [0] = {
++             .start = CSPI2_BASE_ADDR,
++             .end = CSPI2_BASE_ADDR + SZ_4K - 1,
++             .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++             .start = MXC_INT_CSPI2,
++             .end = MXC_INT_CSPI2,
++             .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*! Platform Data for MXC CSPI2 */
++static struct mxc_spi_master mx25_spi2_data = {
++      .maxchipselect = 4,
++      .spi_version = 7,
++};
++
++/*! Device Definition for MXC CSPI2 */
++static struct platform_device mx25_spi2_device = {
++      .name = "mxc_spi",
++      .id = 1,
++      .dev = {
++              .platform_data = &mx25_spi2_data,
++      },
++      .num_resources = ARRAY_SIZE(mx25_spi2_resources),
++      .resource = mx25_spi2_resources,
++};
++#endif /* CONFIG_SPI_MXC_SELECT2 */
++
++#ifdef CONFIG_SPI_MXC_SELECT3
++/*!
++ * Resource definition for the CSPI3
++ */
++static struct resource mx25_spi3_resources[] = {
++      [0] = {
++             .start = CSPI3_BASE_ADDR,
++             .end = CSPI3_BASE_ADDR + SZ_4K - 1,
++             .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++             .start = MXC_INT_CSPI3,
++             .end = MXC_INT_CSPI3,
++             .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*! Platform Data for MXC CSPI3 */
++static struct mxc_spi_master mx25_spi3_data = {
++      .maxchipselect = 4,
++      .spi_version = 7,
++};
++
++/*! Device Definition for MXC CSPI3 */
++static struct platform_device mx25_spi3_device = {
++      .name = "mxc_spi",
++      .id = 2,
++      .dev = {
++              .platform_data = &mx25_spi3_data,
++      },
++      .num_resources = ARRAY_SIZE(mx25_spi3_resources),
++      .resource = mx25_spi3_resources,
++};
++#endif /* CONFIG_SPI_MXC_SELECT3 */
++
++static inline void mx25_init_spi(void)
++{
++      spba_take_ownership(SPBA_CSPI2, SPBA_MASTER_A);
++      spba_take_ownership(SPBA_CSPI3, SPBA_MASTER_A);
++
++#ifdef CONFIG_SPI_MXC_SELECT1
++      if (platform_device_register(&mx25_spi1_device) < 0)
++              printk(KERN_ERR "Error: Registering the SPI Controller_1\n");
++#endif                                /* CONFIG_SPI_MXC_SELECT1 */
++#ifdef CONFIG_SPI_MXC_SELECT2
++      if (platform_device_register(&mx25_spi2_device) < 0)
++              printk(KERN_ERR "Error: Registering the SPI Controller_2\n");
++#endif                                /* CONFIG_SPI_MXC_SELECT2 */
++#ifdef CONFIG_SPI_MXC_SELECT3
++      if (platform_device_register(&mx25_spi3_device) < 0)
++              printk(KERN_ERR "Error: Registering the SPI Controller_3\n");
++#endif                                /* CONFIG_SPI_MXC_SELECT3 */
++}
++#else
++static inline void mx25_init_spi(void)
++{
++}
++#endif
++
++/* I2C controller and device data */
++#if defined(CONFIG_I2C_IMX) || defined(CONFIG_I2C_IMX_MODULE)
++
++/*!
++ * Resource definition for the I2C1
++ */
++static struct resource mx25_i2c1_resources[] = {
++      [0] = {
++              .start = I2C_BASE_ADDR,
++              .end = I2C_BASE_ADDR + SZ_4K - 1,
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = MXC_INT_I2C,
++              .end = MXC_INT_I2C,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*!
++ * Resource definition for the I2C2
++ */
++static struct resource mx25_i2c2_resources[] = {
++      [0] = {
++              .start = I2C2_BASE_ADDR,
++              .end = I2C2_BASE_ADDR + SZ_4K - 1,
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = MXC_INT_I2C2,
++              .end = MXC_INT_I2C2,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*!
++ * Resource definition for the I2C3
++ */
++static struct resource mx25_i2c3_resources[] = {
++      [0] = {
++              .start = I2C3_BASE_ADDR,
++              .end = I2C3_BASE_ADDR + SZ_4K - 1,
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = MXC_INT_I2C3,
++              .end = MXC_INT_I2C3,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*! Device Definition for MXC I2C1 */
++struct platform_device mx25_i2c_device0 = {
++      .name = "imx-i2c",
++      .id = 0,
++      .num_resources = ARRAY_SIZE(mx25_i2c1_resources),
++      .resource = mx25_i2c1_resources,
++};
++
++struct platform_device mx25_i2c_device1 = {
++      .name = "imx-i2c",
++      .id = 1,
++      .num_resources = ARRAY_SIZE(mx25_i2c2_resources),
++      .resource = mx25_i2c2_resources,
++};
++
++struct platform_device mx25_i2c_device2 = {
++      .name = "imx-i2c",
++      .id = 2,
++      .num_resources = ARRAY_SIZE(mx25_i2c3_resources),
++      .resource = mx25_i2c3_resources,
++};
++#endif
++
++static struct mxc_gpio_port mx25_gpio_ports[] = {
++      {
++              .chip.label = "gpio-1",
++              .base = IO_ADDRESS(GPIO1_BASE_ADDR),
++              .irq = MXC_INT_GPIO1,
++              .virtual_irq_start = MXC_GPIO_IRQ_START,
++      },
++      {
++              .chip.label = "gpio-2",
++              .base = IO_ADDRESS(GPIO2_BASE_ADDR),
++              .irq = MXC_INT_GPIO2,
++              .virtual_irq_start = MXC_GPIO_IRQ_START + 1 * 32,
++      },
++      {
++              .chip.label = "gpio-3",
++              .base = IO_ADDRESS(GPIO3_BASE_ADDR),
++              .irq = MXC_INT_GPIO3,
++              .virtual_irq_start = MXC_GPIO_IRQ_START + 2 * 32,
++      },
++      {
++              .chip.label = "gpio-4",
++              .base = IO_ADDRESS(GPIO4_BASE_ADDR),
++              .irq = MXC_INT_GPIO4,
++              .virtual_irq_start = MXC_GPIO_IRQ_START + 3 * 32,
++      },
++};
++
++static inline void mx25_init_ssi(void)
++{
++      /* SPBA configuration for SSI - SDMA and MCU are set */
++      spba_take_ownership(SPBA_SSI1, SPBA_MASTER_A | SPBA_MASTER_C);
++      spba_take_ownership(SPBA_SSI2, SPBA_MASTER_A | SPBA_MASTER_C);
++}
++
++static struct platform_device mx25_dma_device = {
++      .name = "mxc_dma",
++      .id = 0,
++};
++
++static inline void mx25_init_dma(void)
++{
++      (void)platform_device_register(&mx25_dma_device);
++}
++
++static int __init mx25_init_devices(void)
++{
++      mx25_init_wdt();
++      mx25_init_spi();
++      mx25_init_dma();
++      mx25_init_ssi();
++
++      return 0;
++}
++arch_initcall(mx25_init_devices);
++
++int __init mxc_register_gpios(void)
++{
++      return mxc_gpio_init(mx25_gpio_ports, ARRAY_SIZE(mx25_gpio_ports));
++}
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/generic.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/generic.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/generic.c       2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/generic.c  2009-06-02 17:59:16.000000000 +0200
+@@ -26,6 +26,7 @@
+ #include <asm/mach/map.h>
+ /* MX27 memory map definition */
++#if defined(CONFIG_MACH_MX27) || defined(CONFIG_MACH_MX21)
+ static struct map_desc mxc_io_desc[] __initdata = {
+       /*
+        * this fixed mapping covers:
+@@ -61,7 +62,7 @@ static struct map_desc mxc_io_desc[] __i
+               .pfn = __phys_to_pfn(X_MEMC_BASE_ADDR),
+               .length = X_MEMC_SIZE,
+               .type = MT_DEVICE
+-      }
++      },
+ };
+ /*
+@@ -82,4 +83,46 @@ void __init mx27_map_io(void)
+       iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc));
+ }
++#endif
++
++#ifdef CONFIG_MACH_MX25
++static struct map_desc mx25_io_desc[] __initdata = {
++      {
++              .virtual        = (unsigned long)X_MEMC_BASE_ADDR_VIRT,
++              .pfn            = __phys_to_pfn(X_MEMC_BASE_ADDR),
++              .length         = X_MEMC_SIZE,
++              .type           = MT_DEVICE
++      },
++      {
++              .virtual        = (unsigned long)ASIC_BASE_ADDR_VIRT,
++              .pfn            = __phys_to_pfn(ASIC_BASE_ADDR),
++              .length         = ASIC_SIZE,
++              .type           = MT_DEVICE_NONSHARED
++      },
++      {
++              .virtual        = (unsigned long)AIPS1_BASE_ADDR_VIRT,
++              .pfn            = __phys_to_pfn(AIPS1_BASE_ADDR),
++              .length         = AIPS1_SIZE,
++              .type           = MT_DEVICE_NONSHARED
++      },
++      {
++              .virtual        = (unsigned long)AIPS2_BASE_ADDR_VIRT,
++              .pfn            = __phys_to_pfn(AIPS2_BASE_ADDR),
++              .length         = AIPS2_SIZE,
++              .type           = MT_DEVICE_NONSHARED
++      },
++      {
++              .virtual        = (unsigned long)SPBA0_BASE_ADDR_VIRT,
++              .pfn            = __phys_to_pfn(SPBA0_BASE_ADDR),
++              .length         = SPBA0_SIZE,
++              .type           = MT_DEVICE_NONSHARED
++      },
++};
++
++void __init mx25_map_io(void)
++{
++      mxc_set_cpu_type(MXC_CPU_MX25);
++      iotable_init(mx25_io_desc, ARRAY_SIZE(mx25_io_desc));
++}
++#endif
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/karo-tx25.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/karo-tx25.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/karo-tx25.c     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/karo-tx25.c        2009-06-08 12:47:51.000000000 +0200
+@@ -0,0 +1,1122 @@
++/*
++ * arch/arm/mach-mx2/karo-tx25.c
++ *
++ * Copyright (C) 2008  Lothar Wassmann <LW@KARO-electronics.de>
++ *
++ * based on: arch/arm/mach-mx27ads.c (C) Freescale Semiconductor, 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
++ *
++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
++ *
++ * This file adds support for the Ka-Ro electronics TX25 processor modules
++ */
++
++#include <linux/types.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <linux/platform_device.h>
++#include <linux/input.h>
++#include <linux/clk.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++//#include <linux/i2c.h>
++//#include <linux/i2c/at24.h>
++#include <linux/spi/spi.h>
++#include <linux/serial_8250.h>
++#include <linux/fec_enet.h>
++#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)
++#include <mtd/mtd-abi.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/partitions.h>
++#include <asm/mach/flash.h>
++#endif
++
++#include <linux/serial.h>
++#include <linux/fsl_devices.h>
++#include <linux/irq.h>
++#include <linux/mmc/host.h>
++#include <linux/leds.h>
++
++#include <asm/setup.h>
++#include <asm/irq.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++#include <mach/common.h>
++#include <mach/hardware.h>
++#include <mach/gpio.h>
++#include <mach/iomux.h>
++#include <mach/irqs.h>
++#include <mach/clock.h>
++#include <mach/imxfb.h>
++//#include <mach/imx_spi.h>
++//#include <mach/i2c.h>
++#include <mach/mmc.h>
++#include <mach/imx-uart.h>
++#include <mach/mxc_nand.h>
++//#include <mach/ulpi.h>
++//#include <mach/mxc_ehci.h>
++//#include <mach/board-tx25.h>
++
++#include "crm_regs.h"
++#include "devices.h"
++#include "karo.h"
++
++#ifdef DEBUG
++int tx25_debug = 1;
++module_param(tx25_debug, int, S_IRUGO | S_IWUSR);
++#else
++static int tx25_debug;
++module_param(tx25_debug, int, 0);
++#endif
++
++//#include "karo.h"
++
++int karo_board_type = 0;
++int karo_mod_type = -1;
++
++
++#ifdef CONFIG_USB_EHCI_MXC
++
++#define SMSC_VENDOR_ID                0x0424
++#define USB3317_PROD_ID               0x0006
++#define ULPI_FCTL             7
++
++static inline const char *ulpi_name(void __iomem *view)
++{
++      if ((unsigned long)view & 0x400) {
++              return "USBH2";
++      } else {
++              return "USBOTG";
++      }
++}
++
++static int usb3317_init(void __iomem *view)
++{
++      int vid, pid, ret;
++#if 1
++      /* This is a kludge until we know why we sometimes read a wrong
++       * vendor or product ID!
++       */
++      int retries = 3;
++
++ retry:
++#endif
++      ret = ulpi_read(ISP1504_VID_HIGH, view);
++      if (ret < 0) {
++              goto err;
++      }
++      vid = ret << 8;
++
++      ret = ulpi_read(ISP1504_VID_LOW, view);
++      if (ret < 0) {
++              goto err;
++      }
++      vid |= ret;
++
++      ret = ulpi_read(ISP1504_PID_HIGH, view);
++      if (ret < 0) {
++              goto err;
++      }
++      pid = ret << 8;
++
++      ret = ulpi_read(ISP1504_PID_LOW, view);
++      if (ret < 0) {
++              goto err;
++      }
++      pid |= ret;
++
++      pr_info("ULPI on %s port Vendor ID 0x%x Product ID 0x%x\n",
++              ulpi_name(view), vid, pid);
++      if (vid != SMSC_VENDOR_ID || pid != USB3317_PROD_ID) {
++              if (retries-- < 0) {
++                      pr_err("No USB3317 found\n");
++                      return -ENODEV;
++              }
++              goto retry;
++      }
++ err:
++      if (ret < 0) {
++              printk(KERN_ERR "ULPI read on %s port failed with error %d\n",
++                     ulpi_name(view), ret);
++              return ret;
++      }
++      return 0;
++}
++
++static int usb3317_set_vbus_power(void __iomem *view, int on)
++{
++      int ret;
++
++      DBG(0, "%s: Switching %s port VBUS power %s\n", __FUNCTION__,
++          ulpi_name(view), on ? "on" : "off");
++
++      if (on) {
++              ret = ulpi_set(DRV_VBUS_EXT |           /* enable external Vbus */
++                             DRV_VBUS |               /* enable internal Vbus */
++                             CHRG_VBUS,               /* charge Vbus */
++                             ISP1504_OTGCTL, view);
++      } else {
++              ret = ulpi_clear(DRV_VBUS_EXT |         /* disable external Vbus */
++                               DRV_VBUS,              /* disable internal Vbus */
++                               ISP1504_OTGCTL, view);
++              if (ret == 0) {
++                      ret = ulpi_set(DISCHRG_VBUS,       /* discharge Vbus */
++                                     ISP1504_OTGCTL, view);
++              }
++      }
++      if (ret < 0) {
++              printk(KERN_ERR "ULPI read on %s port failed with error %d\n",
++                     ulpi_name(view), ret);
++              return ret;
++      }
++      return 0;
++}
++
++static int tx25_usbh2_init(struct platform_device *pdev)
++{
++      int ret;
++      u32 temp;
++      unsigned long flags;
++      void __iomem *view = IO_ADDRESS(OTG_BASE_ADDR + 0x570);
++
++      local_irq_save(flags);
++      temp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
++      temp &= ~((3 << 21) | (1 << 0));
++      temp |= (1 << 5) | (1 << 16) | (1 << 19) | (1 << 20);
++      writel(temp, IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
++      local_irq_restore(flags);
++
++      /* select ULPI transceiver */
++      /* this must be done _before_ setting up the GPIOs! */
++      temp = readl(view + 0x14);
++      DBG(0, "%s: Changing USBH2_PORTSC1 from %08x to %08x\n", __FUNCTION__,
++          temp, (temp & ~(3 << 30)) | (2 << 30));
++      temp &= ~(3 << 30);
++      temp |= 2 << 30;
++      writel(temp, view + 0x14);
++
++      /* Set to Host mode */
++      temp = readl(view + 0x38);
++      DBG(0, "%s: Changing USBH2_USBMODE from %08x to %08x\n", __FUNCTION__,
++          temp, temp | 3);
++      writel(temp | 0x3, view + 0x38);
++
++      ret = gpio_usbh2_active();
++      if (ret != 0) {
++              return ret;
++      }
++
++      ret = usb3317_init(view);
++      if (ret != 0) {
++              goto err;
++      }
++      ret = usb3317_set_vbus_power(view, 1);
++      if (ret != 0) {
++              goto err;
++      }
++      return 0;
++
++ err:
++      gpio_usbh2_inactive();
++      return ret;
++}
++
++static int tx25_usbh2_exit(struct platform_device *pdev)
++{
++      gpio_usbh2_inactive();
++      return 0;
++}
++
++static struct mxc_usbh_platform_data tx25_usbh2_data = {
++      .init = tx25_usbh2_init,
++      .exit = tx25_usbh2_exit,
++};
++
++int tx25_usbh2_register(void)
++{
++      int ret;
++
++      ret = mxc_register_device(&mxc_ehci2, &tx25_usbh2_data);
++      return ret;
++}
++device_initcall(tx25_usbh2_register);
++#endif // CONFIG_USB_EHCI_MXC
++
++//#define FEC_MII_IRQ         IRQ_GPIOD(8)
++
++#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)
++static struct resource fec_resources[] = {
++      {
++              .start  = FEC_BASE_ADDR,
++              .end    = FEC_BASE_ADDR + 0x18f,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = FEC_BASE_ADDR + 0x200,
++              .end    = FEC_BASE_ADDR + 0x30b,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = MXC_INT_FEC,
++              .end    = MXC_INT_FEC,
++              .flags  = IORESOURCE_IRQ,
++#ifdef FEC_MII_IRQ
++      }, {
++              .start  = FEC_MII_IRQ,
++              .end    = FEC_MII_IRQ,
++              .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
++#endif
++      },
++};
++
++/*
++ * Setup GPIO for FEC device to be active
++ *
++ */
++static struct pad_desc karo_tx25_fec_gpios_off[] = {
++      MX25_PAD_FEC_MDC__GPIO_3_5,
++      MX25_PAD_FEC_MDIO__GPIO_3_6,
++      MX25_PAD_FEC_TDATA0__GPIO_3_7,
++      MX25_PAD_FEC_TDATA1__GPIO_3_8,
++      MX25_PAD_FEC_TX_EN__GPIO_3_9,
++      MX25_PAD_FEC_RDATA0__GPIO_3_10,
++      MX25_PAD_FEC_RDATA1__GPIO_3_11,
++      MX25_PAD_FEC_RX_DV__GPIO_3_12,
++      MX25_PAD_FEC_TX_CLK__GPIO_3_13,
++      MX25_PAD_D12__GPIO_4_8,
++      MX25_PAD_D10__GPIO_4_10,
++};
++
++static struct pad_desc karo_tx25_fec_pwr_gpios[] = {
++      MX25_PAD_D11__GPIO_4_9,         /* FEC PHY power on pin */
++      MX25_PAD_D13__GPIO_4_7,         /* FEC reset */
++};
++
++static struct pad_desc karo_tx25_fec_gpios_on[] = {
++      MX25_PAD_FEC_MDC__FEC_MDC,
++      MX25_PAD_FEC_MDIO__FEC_MDIO,
++      MX25_PAD_FEC_TDATA0__FEC_TDATA0,
++      MX25_PAD_FEC_TDATA1__FEC_TDATA1,
++      MX25_PAD_FEC_TX_EN__FEC_TX_EN,
++      MX25_PAD_FEC_RDATA0__FEC_RDATA0,
++      MX25_PAD_FEC_RDATA1__FEC_RDATA1,
++      MX25_PAD_FEC_RX_DV__FEC_RX_DV,
++      MX25_PAD_FEC_TX_CLK__FEC_TX_CLK,
++      MX25_PAD_D12__GPIO_4_8,
++      MX25_PAD_D10__GPIO_4_10,
++};
++
++static struct gpio_desc {
++      unsigned int gpio:7;
++      unsigned int dir:1;
++      unsigned int level:1;
++} karo_tx25_fec_strap_gpios[] = {
++      /* configure the PHY strap pins to the correct values */
++      { GPIO_PORTC |  5, 1, 0, },
++      { GPIO_PORTC |  6, 1, 0, },
++      { GPIO_PORTC |  7, 1, 0, },
++      { GPIO_PORTC |  8, 1, 0, },
++      { GPIO_PORTC |  9, 1, 0, },
++      { GPIO_PORTC | 10, 1, 1, },
++      { GPIO_PORTC | 11, 1, 1, },
++      { GPIO_PORTC | 12, 0, 1, },
++      { GPIO_PORTC | 13, 1, 0, },
++
++      { GPIO_PORTD |  8, 0, 0, },
++      { GPIO_PORTD | 10, 0, 0, },
++      { GPIO_PORTD |  9, 1, 1, },
++      { GPIO_PORTD |  7, 1, 0, },
++};
++
++#define TX25_FEC_PWR_GPIO     (GPIO_PORTD | 9)
++#define TX25_FEC_RST_GPIO     (GPIO_PORTD | 7)
++
++static int gpio_fec_active(void)
++{
++      int ret;
++      int i;
++
++#ifdef FEC_MII_IRQ
++      DBG(0, "%s: Using IRQ %d (GPIO %d) for MII\n", __FUNCTION__,
++          FEC_MII_IRQ, irq_to_gpio(FEC_MII_IRQ));
++
++      set_irq_type(FEC_MII_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING);
++#endif
++      ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_fec_pwr_gpios,
++                                             ARRAY_SIZE(karo_tx25_fec_pwr_gpios));
++      if (ret) {
++              return ret;
++      }
++      /*
++       * If the PHY is already powered on, assume it has been
++       * correctly configured (by the boot loader)
++      */
++      if (0 && gpio_get_value(TX25_FEC_PWR_GPIO) &&
++          gpio_get_value(TX25_FEC_RST_GPIO)) {
++              ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_fec_gpios_on,
++                                                     ARRAY_SIZE(karo_tx25_fec_gpios_on));
++              if (ret) {
++                      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_pwr_gpios,
++                                                         ARRAY_SIZE(karo_tx25_fec_pwr_gpios));
++                      return ret;
++              }
++      } else {
++              /* switch PHY strap pins into required state */
++              ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_fec_gpios_off,
++                                                     ARRAY_SIZE(karo_tx25_fec_gpios_off));
++              if (ret) {
++                      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_pwr_gpios,
++                                                         ARRAY_SIZE(karo_tx25_fec_pwr_gpios));
++                      return ret;
++              }
++              DBG(0, "%s: Switching FEC PHY power on\n", __FUNCTION__);
++              //gpio_set_value(TX25_FEC_PWR_GPIO, 1);
++#if 0
++              while (1) {
++                      gpio_set_value(TX25_FEC_PWR_GPIO, 1);
++                      mdelay(1000);
++                      gpio_set_value(TX25_FEC_PWR_GPIO, 0);
++                      mdelay(1000);
++              }
++#endif
++              DBG(0, "%s: Asserting FEC PHY reset\n", __FUNCTION__);
++//            gpio_set_value(TX25_FEC_RST_GPIO, 0);
++              for (i = 0; i < ARRAY_SIZE(karo_tx25_fec_strap_gpios); i++) {
++                      struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++
++                      ret = gpio_request(pd->gpio, "FEC");
++                      if (ret < 0) {
++                              DBG(0, "%s: Failed to request GPIO%d_%d: %d\n",
++                                  __FUNCTION__, pd->gpio / 32 + 1, pd->gpio % 32, ret);
++                              goto rel_mux;
++                      }
++                      if (pd->dir) {
++                              gpio_direction_output(pd->gpio,
++                                                    pd->level);
++                      } else {
++                              gpio_direction_input(pd->gpio);
++                      }
++              }
++#ifdef DEBUG
++              for (i = 0; i < ARRAY_SIZE(karo_tx25_fec_strap_gpios); i++) {
++                      struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++                      int grp = pd->gpio / 32 + 1;
++                      int ofs = pd->gpio % 32;
++
++                      if (pd->dir && pd->level != gpio_get_value(pd->gpio)) {
++                              DBG(0, "%s: GPIO%d_%d is %d instead of %d\n", __FUNCTION__,
++                                  grp, ofs, gpio_get_value(pd->gpio),
++                                  pd->level);
++                      }
++              }
++#endif
++              DBG(0, "%s: Delaying for 22ms\n", __FUNCTION__);
++              mdelay(22);
++              DBG(0, "%s: Deasserting FEC PHY reset\n", __FUNCTION__);
++              gpio_set_value(TX25_FEC_RST_GPIO, 1);
++#ifdef DEBUG
++              for (i = 0; i < ARRAY_SIZE(karo_tx25_fec_strap_gpios); i++) {
++                      struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++                      int grp = pd->gpio / 32 + 1;
++                      int ofs = pd->gpio % 32;
++
++                      DBG(0, "%s: GPIO%d_%d is %d\n", __FUNCTION__,
++                          grp, ofs, gpio_get_value(pd->gpio));
++              }
++#endif
++              mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_gpios_off,
++                                                 ARRAY_SIZE(karo_tx25_fec_gpios_off));
++              ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_fec_gpios_on,
++                                                     ARRAY_SIZE(karo_tx25_fec_gpios_on));
++              if (ret) {
++                      goto rel_gpio;
++              }
++#ifdef DEBUG
++              for (i = 0; i < ARRAY_SIZE(karo_tx25_fec_strap_gpios); i++) {
++                      struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++                      int grp = pd->gpio / 32 + 1;
++                      int ofs = pd->gpio % 32;
++
++                      DBG(0, "%s: GPIO%d_%d is %d\n", __FUNCTION__,
++                          grp, ofs, gpio_get_value(pd->gpio));
++              }
++#endif
++      }
++      return ret;
++
++ rel_mux:
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_gpios_off,
++                                         ARRAY_SIZE(karo_tx25_fec_gpios_off));
++ rel_gpio:
++      while (--i >= 0) {
++              struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++#ifdef DEBUG
++              int grp = pd->gpio / 32 + 1;
++              int ofs = pd->gpio % 32;
++
++              DBG(0, "%s: Freeing GPIO%d_%d\n", __FUNCTION__,
++                  grp, ofs);
++#endif
++              gpio_free(pd->gpio);
++      }
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_pwr_gpios,
++                                         ARRAY_SIZE(karo_tx25_fec_pwr_gpios));
++      return ret;
++}
++
++/*
++ * Setup GPIO for FEC device to be inactive
++ *
++ */
++static void gpio_fec_inactive(void)
++{
++      int i;
++
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_gpios_on,
++                                         ARRAY_SIZE(karo_tx25_fec_gpios_on));
++      mxc_iomux_v3_setup_multiple_pads(karo_tx25_fec_gpios_off,
++                                       ARRAY_SIZE(karo_tx25_fec_gpios_off));
++      DBG(0, "%s: Asserting FEC PHY reset\n", __FUNCTION__);
++      gpio_set_value(TX25_FEC_RST_GPIO, 0);
++      DBG(0, "%s: Switching FEC PHY power off\n", __FUNCTION__);
++      gpio_set_value(TX25_FEC_PWR_GPIO, 0);
++
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_gpios_off,
++                                         ARRAY_SIZE(karo_tx25_fec_gpios_off));
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_fec_pwr_gpios,
++                                         ARRAY_SIZE(karo_tx25_fec_pwr_gpios));
++      for (i = 0; i < ARRAY_SIZE(karo_tx25_fec_strap_gpios); i++) {
++              struct gpio_desc *pd = &karo_tx25_fec_strap_gpios[i];
++#ifdef DEBUG
++              int grp = pd->gpio / 32 + 1;
++              int ofs = pd->gpio % 32;
++
++              DBG(0, "%s: Freeing GPIO%d_%d\n", __FUNCTION__,
++                  grp, ofs);
++#endif
++              gpio_free(pd->gpio);
++      }
++}
++
++static struct clk *tx25_fec_clk;
++
++static int tx25_fec_suspend(struct platform_device *pdev)
++{
++      BUG_ON(tx25_fec_clk == NULL);
++      DBG(1, "%s: Switching FEC PHY off\n", __FUNCTION__);
++      gpio_fec_inactive();
++      clk_disable(tx25_fec_clk);
++      return 0;
++}
++
++static int tx25_fec_resume(struct platform_device *pdev)
++{
++      BUG_ON(tx25_fec_clk == NULL);
++      DBG(1, "%s: Switching FEC PHY on\n", __FUNCTION__);
++      clk_enable(tx25_fec_clk);
++      gpio_fec_active();
++      return 0;
++}
++
++#if 0
++/*
++ * i.MX25 allows RMII mode to be configured via a gasket
++ */
++#define FEC_MIIGSK_CFGR_FRCONT (1 << 6)
++#define FEC_MIIGSK_CFGR_LBMODE (1 << 4)
++#define FEC_MIIGSK_CFGR_EMODE (1 << 3)
++#define FEC_MIIGSK_CFGR_IF_MODE_MASK (3 << 0)
++#define FEC_MIIGSK_CFGR_IF_MODE_MII (0 << 0)
++#define FEC_MIIGSK_CFGR_IF_MODE_RMII (1 << 0)
++
++#define FEC_MIIGSK_ENR_READY (1 << 2)
++#define FEC_MIIGSK_ENR_EN (1 << 1)
++
++#include "../arch/arm/mach-mx25/crm_regs.h"
++static void __inline__ fec_localhw_setup(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      /*
++       * Set up the MII gasket for RMII mode
++       */
++      printk("%s: enable RMII gasket\n", dev->name);
++
++      /* disable the gasket and wait */
++      fec_reg_write16(fep, FEC_MIIGSK_ENR, 0);
++      while (fec_reg_read16(fep, FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY)
++              udelay(1);
++
++      /* configure the gasket for RMII, 50 MHz, no loopback, no echo */
++      fec_reg_write16(fep, FEC_MIIGSK_CFGR, FEC_MIIGSK_CFGR_IF_MODE_RMII);
++
++      /* re-enable the gasket */
++      fec_reg_write16(fep, FEC_MIIGSK_ENR, FEC_MIIGSK_ENR_EN);
++      fec_reg_read16(fep, FEC_MIIGSK_CFGR);
++      fec_reg_read16(fep, FEC_MIIGSK_ENR);
++}
++#endif
++
++static int fec_arch_init(struct platform_device *pdev)
++{
++      int ret;
++
++      DBG(0, "%s: Activating FEC GPIOs\n", __FUNCTION__);
++      dump_regs();
++
++      ret = gpio_fec_active();
++      if (ret) {
++              printk(KERN_ERR "%s: could not enable FEC gpios: %d\n", __FUNCTION__, ret);
++              return ret;
++      }
++
++      BUG_ON(tx25_fec_clk != NULL);
++      tx25_fec_clk = clk_get(&pdev->dev, NULL);
++      if (unlikely(IS_ERR(tx25_fec_clk))) {
++              printk(KERN_ERR "Failed to get fec_clk\n");
++              return PTR_ERR(tx25_fec_clk);
++      }
++      DBG(0, "%s: Enabling FEC clock\n", __FUNCTION__);
++      clk_enable(tx25_fec_clk);
++      dump_regs();
++      return 0;
++}
++
++static void fec_arch_exit(struct platform_device *pdev)
++{
++      BUG_ON(tx25_fec_clk == NULL);
++      if (unlikely(IS_ERR(tx25_fec_clk))) {
++              printk(KERN_ERR "Failed to get fec_clk\n");
++              return;
++      }
++      DBG(0, "%s: Disabling FEC clock\n", __FUNCTION__);
++      clk_disable(tx25_fec_clk);
++      clk_put(tx25_fec_clk);
++      tx25_fec_clk = NULL;
++      DBG(0, "%s: Deactivating FEC GPIOs\n", __FUNCTION__);
++      gpio_fec_inactive();
++}
++
++static struct fec_enet_platform_data fec_data = {
++      .arch_init = fec_arch_init,
++      .arch_exit = fec_arch_exit,
++      .suspend = tx25_fec_suspend,
++      .resume = tx25_fec_resume,
++};
++
++static struct platform_device fec_device = {
++      .name           = "fec",
++      .id             = 0,
++      .num_resources  = ARRAY_SIZE(fec_resources),
++      .resource       = fec_resources,
++      .dev = {
++              .platform_data = &fec_data,
++              .coherent_dma_mask = 0xFFFFFFFF,
++      },
++};
++#endif
++
++/* MTD NAND flash */
++#if defined(CONFIG_MTD_NAND_MXC) || defined(CONFIG_MTD_NAND_MXC_MODULE)
++static struct pad_desc karo_tx25_nand_pads[] = {
++      MX25_PAD_NF_CE0__NF_CE0,
++      MX25_PAD_NFWE_B__NFWE_B,
++      MX25_PAD_NFRE_B__NFRE_B,
++      MX25_PAD_NFALE__NFALE,
++      MX25_PAD_NFCLE__NFCLE,
++      MX25_PAD_NFWP_B__NFWP_B,
++      MX25_PAD_NFRB__NFRB,
++      MX25_PAD_D7__D7,
++      MX25_PAD_D6__D6,
++      MX25_PAD_D5__D5,
++      MX25_PAD_D4__D4,
++      MX25_PAD_D3__D3,
++      MX25_PAD_D2__D2,
++      MX25_PAD_D1__D1,
++      MX25_PAD_D0__D0,
++};
++
++#ifdef CONFIG_ARCH_MXC_HAS_NFC_V2
++static struct mtd_partition tx25_nand_partitions[] = {
++      {
++              .name = "RedBoot",
++              .offset = 0,
++              .size = 0x00040000,
++      }, {
++              .name = "kernel",
++              .offset = MTDPART_OFS_APPEND,
++              .size = 0x001A0000,
++      }, {
++              .name = "rootfs",
++              .offset = MTDPART_OFS_APPEND,
++              .size = 0x07E000000,
++      }, {
++              .name = "FIS directory",
++              .offset = MTDPART_OFS_APPEND,
++              .size = 0x00003000,
++              .mask_flags = MTD_WRITEABLE,
++      }, {
++              .name = "RedBoot config",
++              .offset = MTDPART_OFS_APPEND,
++              .size = 0x00001000,
++              .mask_flags = MTD_WRITEABLE,
++      },
++};
++
++static int tx25_nand_init(void)
++{
++      int ret;
++
++      DBG(0, "%s: Configuring NAND pins\n", __FUNCTION__);
++      ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_nand_pads,
++                                             ARRAY_SIZE(karo_tx25_nand_pads));
++      if (ret) {
++              return ret;
++      }
++      return 0;
++}
++
++static void tx25_nand_exit(void)
++{
++      mxc_iomux_v3_release_multiple_pads(karo_tx25_nand_pads,
++                                         ARRAY_SIZE(karo_tx25_nand_pads));
++}
++
++static struct flash_platform_data tx25_nand_data = {
++      .map_name = "nand_probe",
++      .name = "tx25-nand",
++      .parts = tx25_nand_partitions,
++      .nr_parts = ARRAY_SIZE(tx25_nand_partitions),
++      .width = 1,
++      .init = tx25_nand_init,
++      .exit = tx25_nand_exit,
++};
++#else
++static struct mxc_nand_platform_data tx25_nand_data = {
++      .hw_ecc = 1,
++      .width = 1,
++};
++
++static int tx25_nand_init(void)
++{
++      int ret;
++
++      DBG(0, "%s: Configuring NAND pins\n", __FUNCTION__);
++      ret = mxc_iomux_v3_setup_multiple_pads(karo_tx25_nand_pads,
++                                             ARRAY_SIZE(karo_tx25_nand_pads));
++      if (ret) {
++              return ret;
++      }
++      return 0;
++}
++arch_initcall(tx25_nand_init);
++#endif
++
++static struct resource tx25_nand_resources[] = {
++      {
++              .start  = NFC_BASE_ADDR + 0x1e00,
++              .end    = NFC_BASE_ADDR + 0x1e2f,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = NFC_BASE_ADDR,
++              .end    = NFC_BASE_ADDR + 0x11ff,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = MXC_INT_NANDFC,
++              .end    = MXC_INT_NANDFC,
++              .flags  = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device tx25_nand_mtd_device = {
++      .name = "mxc_nand",
++      .id = 0,
++      .num_resources = ARRAY_SIZE(tx25_nand_resources),
++      .resource = tx25_nand_resources,
++      .dev = {
++              .platform_data = &tx25_nand_data,
++      },
++};
++#endif
++
++#if defined(CONFIG_VIDEO_MXC_EMMA_OUTPUT) || defined(CONFIG_VIDEO_MXC_EMMA_OUTPUT_MODULE)
++static u64 mxc_emma_dmamask = 0xffffffffUL;
++
++static struct platform_device tx25_v4l2out_device = {
++      .name = "MXC Video Output",
++      .id = 0,
++      .dev = {
++              .dma_mask = &mxc_emma_dmamask,
++              .coherent_dma_mask = ~0UL,
++      },
++};
++#endif
++
++#if 0
++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
++static struct pad_desc mxc_i2c0_pins[] = {
++      /*
++       * it seems the data line misses a pullup, so we must enable
++       * the internal pullup as a local workaround
++       */
++      MX25_PAD_I2C1_CLK__I2C1_CLK,
++      MX25_PAD_I2C1_DAT__I2C1_DAT,
++};
++
++static int karo_tx25_i2c_0_init(struct device *dev)
++{
++      DBG(-1, "%s: \n", __FUNCTION__);
++      return mxc_iomux_v3_setup_multiple_pads(mxc_i2c0_pins,
++                                              ARRAY_SIZE(mxc_i2c0_pins));
++}
++
++static void karo_tx25_i2c_0_exit(struct device *dev)
++{
++      DBG(-1, "%s: \n", __FUNCTION__);
++      mxc_iomux_v3_release_multiple_pads(mxc_i2c0_pins,
++                                         ARRAY_SIZE(mxc_i2c0_pins));
++}
++
++static struct imxi2c_platform_data karo_tx25_i2c_0_data = {
++      .bitrate = 100000,
++      .init = karo_tx25_i2c_0_init,
++      .exit = karo_tx25_i2c_0_exit,
++};
++
++static struct at24_platform_data karo_tx25_eeprom = {
++      .byte_len = 2048,
++      .page_size = 32,
++      .flags = AT24_FLAG_ADDR16 | AT24_FLAG_TAKE8ADDR,
++};
++
++static struct i2c_board_info karo_i2c_0_boardinfo[] __initdata = {
++      {
++              I2C_BOARD_INFO("24c16", 0x50),
++              .platform_data = &karo_tx25_eeprom,
++              .type = "24c16",
++      },
++};
++
++int __init karo_i2c_init(void)
++{
++      int ret;
++
++      DBG(0, "%s: Registering I2C bus 0\n", __FUNCTION__);
++      ret = mxc_register_device(&mx25_i2c_device0, &karo_tx25_i2c_0_data);
++      if (ret != 0) {
++              printk(KERN_ERR "Failed to register I2C device: %d\n", ret);
++              return ret;
++      }
++      ret = i2c_register_board_info(0, karo_i2c_0_boardinfo,
++                                    ARRAY_SIZE(karo_i2c_0_boardinfo));
++      if (ret != 0) {
++              printk(KERN_ERR "Failed to register I2C board info: %d\n", ret);
++      }
++      return ret;
++}
++device_initcall(karo_i2c_init);
++#endif
++#endif
++
++struct platform_dev_list {
++      struct platform_device *pdev;
++      int flag;
++} tx25_devices[] __initdata = {
++#if defined(CONFIG_RTC_MXC) || defined(CONFIG_RTC_MXC_MODULE)
++      { .pdev = &mxc_rtc_device, .flag = -1, },
++#endif
++#if defined(CONFIG_MTD_NAND_MXC) || defined(CONFIG_MTD_NAND_MXC_MODULE)
++      { .pdev = &tx25_nand_mtd_device, .flag = 1, },
++#endif
++#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)
++      { .pdev = &fec_device, .flag = 1, },
++#endif
++#if defined(CONFIG_SPI_MXC) || defined(CONFIG_SPI_MXC_MODULE)
++      { .pdev = &mxcspi1_device, .flag = 1, },
++#endif
++#if defined(CONFIG_VIDEO_MXC_EMMA_OUTPUT) || defined(CONFIG_VIDEO_MXC_EMMA_OUTPUT_MODULE)
++      { .pdev = &tx25_v4l2out_device, .flag = 1, },
++#endif
++#if defined(CONFIG_MXC_VPU) || defined(CONFIG_MXC_VPU_MODULE)
++      { .pdev = &mxc_vpu_device, .flag = 1, },
++#endif
++};
++#define TX25_NUM_DEVICES              ARRAY_SIZE(tx25_devices)
++
++static __init void karo_tx25_board_init(void)
++{
++      int i;
++
++      DBG(0, "%s: \n", __FUNCTION__);
++
++      dump_regs();
++
++      for (i = 0; i < TX25_NUM_DEVICES; i++) {
++              int ret;
++
++              if (tx25_devices[i].pdev == NULL) continue;
++              if (!tx25_devices[i].flag) {
++                      DBG(0, "%s: Skipping platform device[%d] @ %p dev %p: %s\n",
++                          __FUNCTION__, i, tx25_devices[i].pdev, &tx25_devices[i].pdev->dev,
++                          tx25_devices[i].pdev->name);
++                      continue;
++              }
++              DBG(0, "%s: Registering platform device[%d] @ %p dev %p: %s\n",
++                  __FUNCTION__, i, tx25_devices[i].pdev, &tx25_devices[i].pdev->dev,
++                  tx25_devices[i].pdev->name);
++              ret = platform_device_register(tx25_devices[i].pdev);
++              if (ret) {
++                      printk(KERN_WARNING "%s: Failed to register platform_device[%d]: %s: %d\n",
++                             __FUNCTION__, i, tx25_devices[i].pdev->name, ret);
++              }
++      }
++      DBG(0, "%s: Done\n", __FUNCTION__);
++}
++
++static struct pad_desc karo_tx25_gpios[] __initdata = {
++      MX25_PAD_GPIO_A__GPIO_A,
++      MX25_PAD_GPIO_B__GPIO_B,
++      MX25_PAD_GPIO_C__GPIO_C,
++      MX25_PAD_GPIO_D__GPIO_D,
++      MX25_PAD_GPIO_E__GPIO_E,
++      MX25_PAD_GPIO_F__GPIO_F,
++      MX25_PAD_CSI_D7__GPIO_1_6,
++      MX25_PAD_CSI_D8__GPIO_1_7,
++      MX25_PAD_CSI_MCLK__GPIO_1_8,
++      MX25_PAD_CSI_VSYNC__GPIO_1_9,
++      MX25_PAD_CSI_HSYNC__GPIO_1_10,
++      MX25_PAD_CSI_PIXCLK__GPIO_1_11,
++      MX25_PAD_I2C1_CLK__GPIO_1_12,
++      MX25_PAD_I2C1_DAT__GPIO_1_13,
++      MX25_PAD_CSPI1_MOSI__GPIO_1_14,
++      MX25_PAD_CSPI1_MISO__GPIO_1_15,
++      MX25_PAD_CSPI1_SS0__GPIO_1_16,
++      MX25_PAD_CSPI1_SS1__GPIO_1_17,
++      MX25_PAD_CSPI1_SCLK__GPIO_1_18,
++      MX25_PAD_LD5__GPIO_1_19,
++      MX25_PAD_LD6__GPIO_1_20,
++      MX25_PAD_LD7__GPIO_1_21,
++      MX25_PAD_HSYNC__GPIO_1_22,
++      MX25_PAD_VSYNC__GPIO_1_23,
++      MX25_PAD_LSCLK__GPIO_1_24,
++      MX25_PAD_OE_ACD__GPIO_1_25,
++      MX25_PAD_PWM__GPIO_1_26,
++      MX25_PAD_CSI_D2__GPIO_1_27,
++      MX25_PAD_CSI_D3__GPIO_1_28,
++      MX25_PAD_CSI_D4__GPIO_1_29,
++      MX25_PAD_CSI_D5__GPIO_1_30,
++      MX25_PAD_CSI_D6__GPIO_1_31,
++
++      MX25_PAD_A14__GPIO_2_0,
++      MX25_PAD_A15__GPIO_2_1,
++      MX25_PAD_A16__GPIO_2_2,
++      MX25_PAD_A17__GPIO_2_3,
++      MX25_PAD_A18__GPIO_2_4,
++      MX25_PAD_A19__GPIO_2_5,
++      MX25_PAD_A20__GPIO_2_6,
++      MX25_PAD_A21__GPIO_2_7,
++      MX25_PAD_A22__GPIO_2_8,
++      MX25_PAD_A23__GPIO_2_9,
++      MX25_PAD_A24__GPIO_2_10,
++      MX25_PAD_A25__GPIO_2_11,
++      MX25_PAD_EB0__GPIO_2_12,
++      MX25_PAD_EB1__GPIO_2_13,
++      MX25_PAD_OE__GPIO_2_14,
++      MX25_PAD_LD0__GPIO_2_15,
++      MX25_PAD_LD1__GPIO_2_16,
++      MX25_PAD_LD2__GPIO_2_17,
++      MX25_PAD_LD3__GPIO_2_18,
++      MX25_PAD_LD4__GPIO_2_19,
++      MX25_PAD_DE_B__GPIO_2_20,
++      MX25_PAD_CLKO__GPIO_2_21,
++      MX25_PAD_CSPI1_RDY__GPIO_2_22,
++      MX25_PAD_SD1_CMD__GPIO_2_23,
++      MX25_PAD_SD1_CLK__GPIO_2_24,
++      MX25_PAD_SD1_DATA0__GPIO_2_25,
++      MX25_PAD_SD1_DATA1__GPIO_2_26,
++      MX25_PAD_SD1_DATA2__GPIO_2_27,
++      MX25_PAD_SD1_DATA3__GPIO_2_28,
++      MX25_PAD_KPP_ROW0__GPIO_2_29,
++      MX25_PAD_KPP_ROW1__GPIO_2_30,
++      MX25_PAD_KPP_ROW2__GPIO_2_31,
++
++      MX25_PAD_KPP_ROW3__GPIO_3_0,
++      MX25_PAD_KPP_COL0__GPIO_3_1,
++      MX25_PAD_KPP_COL1__GPIO_3_2,
++      MX25_PAD_KPP_COL2__GPIO_3_3,
++      MX25_PAD_KPP_COL3__GPIO_3_4,
++      MX25_PAD_FEC_MDC__GPIO_3_5,
++      MX25_PAD_FEC_MDIO__GPIO_3_6,
++      MX25_PAD_FEC_TDATA0__GPIO_3_7,
++      MX25_PAD_FEC_TDATA1__GPIO_3_8,
++      MX25_PAD_FEC_TX_EN__GPIO_3_9,
++      MX25_PAD_FEC_RDATA0__GPIO_3_10,
++      MX25_PAD_FEC_RDATA1__GPIO_3_11,
++      MX25_PAD_FEC_RX_DV__GPIO_3_12,
++      MX25_PAD_FEC_TX_CLK__GPIO_3_13,
++      MX25_PAD_RTCK__GPIO_3_14,
++      MX25_PAD_EXT_ARMCLK__GPIO_3_15,
++      MX25_PAD_UPLL_BYPCLK__GPIO_3_16,
++      MX25_PAD_VSTBY_REQ__GPIO_3_17,
++      MX25_PAD_VSTBY_ACK__GPIO_3_18,
++      MX25_PAD_POWER_FAIL__GPIO_3_19,
++      MX25_PAD_CS4__GPIO_3_20,
++      MX25_PAD_CS5__GPIO_3_21,
++      MX25_PAD_NF_CE0__GPIO_3_22,
++      MX25_PAD_ECB__GPIO_3_23,
++      MX25_PAD_LBA__GPIO_3_24,
++      MX25_PAD_RW__GPIO_3_25,
++      MX25_PAD_NFWE_B__GPIO_3_26,
++      MX25_PAD_NFRE_B__GPIO_3_27,
++      MX25_PAD_NFALE__GPIO_3_28,
++      MX25_PAD_NFCLE__GPIO_3_29,
++      MX25_PAD_NFWP_B__GPIO_3_30,
++      MX25_PAD_NFRB__GPIO_3_31,
++
++      MX25_PAD_A10__GPIO_4_0,
++      MX25_PAD_A13__GPIO_4_1,
++      MX25_PAD_CS0__GPIO_4_2,
++      MX25_PAD_CS1__GPIO_4_3,
++      MX25_PAD_BCLK__GPIO_4_4,
++      MX25_PAD_D15__GPIO_4_5,
++      MX25_PAD_D14__GPIO_4_6,
++      MX25_PAD_D13__GPIO_4_7,
++      MX25_PAD_D12__GPIO_4_8,
++      MX25_PAD_D11__GPIO_4_9,
++      MX25_PAD_D10__GPIO_4_10,
++      MX25_PAD_D9__GPIO_4_11,
++      MX25_PAD_D8__GPIO_4_12,
++      MX25_PAD_D7__GPIO_4_13,
++      MX25_PAD_D6__GPIO_4_14,
++      MX25_PAD_D5__GPIO_4_15,
++      MX25_PAD_D4__GPIO_4_16,
++      MX25_PAD_D3__GPIO_4_17,
++      MX25_PAD_D2__GPIO_4_18,
++      MX25_PAD_D1__GPIO_4_19,
++      MX25_PAD_D0__GPIO_4_20,
++      MX25_PAD_CSI_D9__GPIO_4_21,
++      MX25_PAD_UART1_RXD__GPIO_4_22,
++      MX25_PAD_UART1_TXD__GPIO_4_23,
++      MX25_PAD_UART1_RTS__GPIO_4_24,
++      MX25_PAD_UART1_CTS__GPIO_4_25,
++      MX25_PAD_UART2_RXD__GPIO_4_26,
++      MX25_PAD_UART2_TXD__GPIO_4_27,
++      MX25_PAD_UART2_RTS__GPIO_4_28,
++      MX25_PAD_UART2_CTS__GPIO_4_29,
++      MX25_PAD_BOOT_MODE0__GPIO_4_30,
++      MX25_PAD_BOOT_MODE1__GPIO_4_31,
++};
++
++static int __init karo_tx25_setup_gpios(void)
++{
++      int i;
++      int ret;
++      int count = 0;
++
++      for (i = 0; i < ARRAY_SIZE(karo_tx25_gpios); i++) {
++              struct pad_desc *pd = &karo_tx25_gpios[i];
++#if 0
++              if (i - 64 >= 16 && i - 64 < 32) {
++                      continue;
++              }
++#endif
++              ret = mxc_iomux_v3_setup_pad(pd);
++              if (ret == 0) {
++#ifdef IOMUX_DEBUG
++                      DBG(0, "%s: PAD[%d] %s set up as GPIO\n", __FUNCTION__, i, pd->name);
++#else
++                      DBG(0, "%s: PAD[%d] set up as GPIO\n", __FUNCTION__, i);
++#endif
++                      count++;
++                      mxc_iomux_v3_release_pad(pd);
++              } else {
++#ifdef IOMUX_DEBUG
++                      DBG(0, "%s: PAD[%d] %s skipped\n", __FUNCTION__, i, pd->name);
++#else
++                      DBG(0, "%s: PAD[%d] skipped\n", __FUNCTION__, i);
++#endif
++              }
++      }
++      DBG(0, "%s: %d out of %d pins set up as GPIO\n", __FUNCTION__, count, i);
++#if 0
++      if (gpio_request(42, "TEST") == 0) {
++              gpio_direction_output(42, 1);
++              while (1) {
++                      gpio_set_value(42, 0);
++                      if (gpio_get_value(42)) {
++                              DBG(0, "%s: GPIO 42 is HIGH instead of LOW\n", __FUNCTION__);
++                      }
++                      msleep(1000);
++                      gpio_set_value(42, 1);
++                      if (!gpio_get_value(42)) {
++                              DBG(0, "%s: GPIO 42 is LOW instead of HIGH\n", __FUNCTION__);
++                      }
++                      msleep(1000);
++              }
++      }
++      gpio_free(42);
++#endif
++      return 0;
++}
++late_initcall(karo_tx25_setup_gpios);
++
++static void __init karo_tx25_map_io(void)
++{
++      mx25_map_io();
++}
++
++static void __init karo_tx25_fixup(struct machine_desc *desc, struct tag *tags,
++                                 char **cmdline, struct meminfo *mi)
++{
++}
++
++static void __init karo_tx25_timer_init(void)
++{
++      DBG(0, "%s: \n", __FUNCTION__);
++      mx25_clocks_init(24000000);
++      DBG(0, "%s: Done\n", __FUNCTION__);
++}
++
++struct sys_timer karo_tx25_timer = {
++      .init   = karo_tx25_timer_init,
++};
++
++static int __init karo_mod_type_setup(char *line)
++{
++      get_option(&line, &karo_mod_type);
++      DBG(0, "%s: Module type set to 0x%02x by kernel cmd line\n", __FUNCTION__, karo_mod_type);
++
++      return 1;
++}
++__setup("module_type=", karo_mod_type_setup);
++
++static int __init karo_board_type_setup(char *line)
++{
++      get_option(&line, &karo_board_type);
++      DBG(0, "%s: Board type set to 0x%02x by kernel cmd line\n", __FUNCTION__, karo_board_type);
++
++      return 1;
++}
++__setup("board_type=", karo_board_type_setup);
++
++MACHINE_START(TX25, "Ka-Ro electronics TX25 module (Freescale i.MX25)")
++      /* Maintainer: <LW@KARO-electronics.de> */
++      .phys_io        = AIPS1_BASE_ADDR,
++      .io_pg_offst    = ((unsigned long)AIPS1_BASE_ADDR_VIRT >> 18) & 0xfffc,
++      .fixup          = karo_tx25_fixup,
++      .map_io         = karo_tx25_map_io,
++      .init_irq       = mxc_init_irq,
++      .init_machine   = karo_tx25_board_init,
++      .timer          = &karo_tx25_timer,
++MACHINE_END
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/karo.h linux-2.6.30-rc4-karo/arch/arm/mach-mx2/karo.h
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/karo.h  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/karo.h     2009-06-02 17:59:18.000000000 +0200
+@@ -0,0 +1,99 @@
++/*
++ * arch/arm/mach-mx2/karo.h
++ *
++ * Copyright (C) 2009  Lothar Wassmann <LW@KARO-electronics.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the:
++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
++ *
++ * This file provides platform specific definitions for the
++ * Ka-Ro electronics TX25 processor modules
++ */
++
++#include <linux/io.h>
++#include "crm_regs_mx25.h"
++
++enum {
++      BOARD_KARO_STK5,
++};
++
++extern int karo_board_type;
++extern int karo_mod_type;
++
++#ifdef DEBUG
++extern int tx25_debug;
++#define dbg_lvl(n)    ((n) < tx25_debug)
++#define DBG(lvl, fmt...)      do { if (dbg_lvl(lvl)) printk(KERN_DEBUG fmt); } while (0)
++#else
++#define dbg_lvl(n)    0
++#define DBG(lvl, fmt...)      do { } while (0)
++#endif
++
++static inline int karo_get_board_type(void)
++{
++      return karo_board_type;
++}
++
++static inline int karo_get_module_type(void)
++{
++      return karo_mod_type;
++}
++
++#define SHOW_REG(reg) DBG(0, "%s[%08lx]=%08x\n", #reg, MXC_PHYS_ADDRESS(reg), __raw_readl(reg))
++
++#define SHOW_GPIO_REG(port, reg)                                      \
++      DBG(0, "GPIO%d_%s[%08lx]=%08x\n", port, #reg,                   \
++          GPIO_BASE_ADDR(port) + GPIO_##reg,                          \
++          __raw_readl(IO_ADDRESS(GPIO_BASE_ADDR(port) + GPIO_##reg)))
++
++static inline void dump_regs(void)
++{
++      int i;
++
++      SHOW_REG(MXC_CCM_MPCTL);
++      SHOW_REG(MXC_CCM_UPCTL);
++      SHOW_REG(MXC_CCM_CCTL);
++      SHOW_REG(MXC_CCM_RCSR);
++      SHOW_REG(MXC_CCM_CRDR);
++      SHOW_REG(MXC_CCM_PCDR0);
++      SHOW_REG(MXC_CCM_PCDR1);
++      SHOW_REG(MXC_CCM_PCDR2);
++      SHOW_REG(MXC_CCM_PCDR3);
++      SHOW_REG(MXC_CCM_CGCR0);
++      SHOW_REG(MXC_CCM_CGCR1);
++      SHOW_REG(MXC_CCM_CGCR2);
++      SHOW_REG(MXC_CCM_MCR);
++      SHOW_REG(MXC_CCM_PMCR0);
++      SHOW_REG(MXC_CCM_PMCR1);
++      SHOW_REG(MXC_CCM_PMCR2);
++      SHOW_REG(MXC_CCM_LTBR0);
++      SHOW_REG(MXC_CCM_LTBR1);
++      SHOW_REG(MXC_CCM_LTR0);
++      SHOW_REG(MXC_CCM_LTR1);
++      SHOW_REG(MXC_CCM_LTR2);
++      SHOW_REG(MXC_CCM_LTR3);
++      SHOW_REG(MXC_CCM_DCVR0);
++      SHOW_REG(MXC_CCM_DCVR1);
++      SHOW_REG(MXC_CCM_DCVR2);
++      SHOW_REG(MXC_CCM_DCVR3);
++
++      for (i = 1; i <= 4; i++) {
++              SHOW_GPIO_REG(i, DR);
++              SHOW_GPIO_REG(i, GDIR);
++              SHOW_GPIO_REG(i, PSR);
++              SHOW_GPIO_REG(i, ICR1);
++              SHOW_GPIO_REG(i, ICR2);
++              SHOW_GPIO_REG(i, IMR);
++              SHOW_GPIO_REG(i, ISR);
++      }
++}
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/sdma_script_code.h linux-2.6.30-rc4-karo/arch/arm/mach-mx2/sdma_script_code.h
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/sdma_script_code.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/sdma_script_code.h 2009-06-02 17:59:18.000000000 +0200
+@@ -0,0 +1,159 @@
++
++/*
++ * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++/*!
++ * @file sdma_script_code.h
++ * @brief This file contains functions of SDMA scripts code initialization
++ *
++ * The file was generated automatically. Based on sdma scripts library.
++ *
++ * @ingroup SDMA
++ */
++/************************************************************************
++
++                      SDMA RELEASE LABEL:     "SS15_SENNA"
++
++************************************************************************/
++
++#ifndef SDMA_SCRIPT_CODE_H
++#define SDMA_SCRIPT_CODE_H
++
++/*!
++ * SDMA ROM scripts start addresses and sizes
++ */
++#define start_ADDR    0
++#define start_SIZE    22
++
++#define core_ADDR     80
++#define core_SIZE     233
++
++#define common_ADDR   313
++#define common_SIZE   416
++
++#define ap_2_ap_ADDR  729
++#define ap_2_ap_SIZE  41
++
++#define app_2_mcu_ADDR        770
++#define app_2_mcu_SIZE        64
++
++#define mcu_2_app_ADDR        834
++#define mcu_2_app_SIZE        70
++
++#define uart_2_mcu_ADDR       904
++#define uart_2_mcu_SIZE       75
++
++#define shp_2_mcu_ADDR        979
++#define shp_2_mcu_SIZE        69
++
++#define mcu_2_shp_ADDR        1048
++#define mcu_2_shp_SIZE        72
++
++#define uartsh_2_mcu_ADDR     1120
++#define uartsh_2_mcu_SIZE     69
++
++#define app_2_per_ADDR        1189
++#define app_2_per_SIZE        66
++
++#define per_2_app_ADDR        1255
++#define per_2_app_SIZE        74
++
++#define per_2_shp_ADDR        1329
++#define per_2_shp_SIZE        78
++
++#define shp_2_per_ADDR        1407
++#define shp_2_per_SIZE        72
++
++#define mcu_2_ata_ADDR        1479
++#define mcu_2_ata_SIZE        81
++
++#define ata_2_mcu_ADDR        1560
++#define ata_2_mcu_SIZE        96
++
++#define loop_DMAs_routines_ADDR       1656
++#define loop_DMAs_routines_SIZE       227
++
++#define test_ADDR     1883
++#define test_SIZE     63
++
++#define signature_ADDR        1022
++#define signature_SIZE        1
++
++/*!
++ * SDMA RAM scripts start addresses and sizes
++ */
++#define ext_mem__ipu_ram_ADDR 6144
++#define ext_mem__ipu_ram_SIZE 123
++
++#define uart_2_per_ADDR       6267
++#define uart_2_per_SIZE       73
++
++#define uartsh_2_per_ADDR     6340
++#define uartsh_2_per_SIZE     67
++
++/*!
++ * SDMA RAM image start address and size
++ */
++#define RAM_CODE_START_ADDR           6144
++#define RAM_CODE_SIZE                 263
++
++/*!
++ * Buffer that holds the SDMA RAM image
++ */
++__attribute__ ((__aligned__(4)))
++#ifndef CONFIG_XIP_KERNEL
++const
++#endif
++static const short sdma_code[] = {
++      0x0e70, 0x0611, 0x5616, 0xc18a, 0x7d2a, 0x5ade, 0x008e, 0xc19c,
++      0x7c26, 0x5be0, 0x5ef0, 0x5ce8, 0x0688, 0x08ff, 0x0011, 0x28ff,
++      0x00bc, 0x53f6, 0x05df, 0x7d0b, 0x6dc5, 0x03df, 0x7d03, 0x6bd5,
++      0xd84f, 0x982b, 0x6b05, 0xc6d8, 0x7e27, 0x7f29, 0x982b, 0x6d01,
++      0x03df, 0x7d05, 0x6bd5, 0xc702, 0x7e18, 0x7f1a, 0x982b, 0x6b05,
++      0xc678, 0x7e07, 0x7f06, 0x52de, 0x53e6, 0xc1a8, 0x7dd7, 0x0200,
++      0x9803, 0x0007, 0x6004, 0x680c, 0x53f6, 0x028e, 0x00a3, 0xc2ad,
++      0x048b, 0x0498, 0x0454, 0x068a, 0x982b, 0x0207, 0x680c, 0x6ddf,
++      0x0107, 0x68ff, 0x60d0, 0x9834, 0x0207, 0x68ff, 0x6d28, 0x0107,
++      0x6004, 0x680c, 0x9834, 0x0007, 0x68ff, 0x60d0, 0x9834, 0x0288,
++      0x03a5, 0x3b03, 0x3d03, 0x4d00, 0x7d0a, 0x0804, 0x00a5, 0x00da,
++      0x7d1a, 0x02a0, 0x7b01, 0x65d8, 0x7eee, 0x65ff, 0x7eec, 0x0804,
++      0x02d0, 0x7d11, 0x4b00, 0x7c0f, 0x008a, 0x3003, 0x6dcf, 0x6bdf,
++      0x0015, 0x0015, 0x7b02, 0x65d8, 0x0000, 0x7edd, 0x63ff, 0x7edb,
++      0x3a03, 0x6dcd, 0x6bdd, 0x008a, 0x7b02, 0x65d8, 0x0000, 0x7ed3,
++      0x65ff, 0x7ed1, 0x0006, 0xc23a, 0x57db, 0x52f3, 0x6ad5, 0x56fb,
++      0x028e, 0x1a94, 0x6ac3, 0x62c8, 0x0269, 0x7d1e, 0x1e94, 0x6ee3,
++      0x62d0, 0x5aeb, 0x62c8, 0x0248, 0x6ed3, 0x6ac8, 0x2694, 0x52eb,
++      0x6ad5, 0x6ee3, 0x62c8, 0x026e, 0x7d27, 0x6ac8, 0x7f23, 0x2501,
++      0x4d00, 0x7d26, 0x028e, 0x1a98, 0x6ac3, 0x62c8, 0x6ec3, 0x0260,
++      0x7df1, 0x62d0, 0xc2d1, 0x98c0, 0x6ee3, 0x008f, 0x2001, 0x00d5,
++      0x7d01, 0x008d, 0x05a0, 0x62c8, 0x026e, 0x7d0e, 0x6ac8, 0x7f0a,
++      0x2001, 0x7cf9, 0x6add, 0x7f06, 0x0000, 0x4d00, 0x7d09, 0xc251,
++      0x57db, 0x987f, 0x0007, 0x6aff, 0x62d0, 0xc2d1, 0x0458, 0x0454,
++      0x6add, 0x7ff8, 0xc261, 0x987c, 0xc230, 0xc23a, 0x57db, 0x52f3,
++      0x6ad5, 0x56fb, 0x028e, 0x1a94, 0x5202, 0x0269, 0x7d17, 0x1e94,
++      0x5206, 0x0248, 0x5a06, 0x2694, 0x5206, 0x026e, 0x7d26, 0x6ac8,
++      0x7f22, 0x2501, 0x4d00, 0x7d27, 0x028e, 0x1a98, 0x5202, 0x0260,
++      0x7df3, 0x6add, 0x7f18, 0x62d0, 0xc2d1, 0x9903, 0x008f, 0x2001,
++      0x00d5, 0x7d01, 0x008d, 0x05a0, 0x5206, 0x026e, 0x7d0e, 0x6ac8,
++      0x7f0a, 0x2001, 0x7cf9, 0x6add, 0x7f06, 0x0000, 0x4d00, 0x7d0b,
++      0xc251, 0x57db, 0x98c9, 0x0007, 0x6aff, 0x6add, 0x7ffc, 0x62d0,
++      0xc2d1, 0x0458, 0x0454, 0x6add, 0x7ff6, 0xc261, 0x98c6
++};
++#endif
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx2/stk5-baseboard.c linux-2.6.30-rc4-karo/arch/arm/mach-mx2/stk5-baseboard.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx2/stk5-baseboard.c        1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx2/stk5-baseboard.c   2009-06-02 17:59:18.000000000 +0200
+@@ -0,0 +1,1003 @@
++/*
++ * arch/arm/mach-mx2/stk5-baseboard.c
++ *
++ * Copyright (C) 2009  Lothar Wassmann <LW@KARO-electronics.de>
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the:
++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
++ *
++ * This file adds support for devices found on Ka-Ro electronics
++ * Starterkit-5 (STK5) baseboard
++ */
++
++#include <linux/types.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <linux/platform_device.h>
++#include <linux/input.h>
++#include <linux/clk.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/i2c.h>
++#include <linux/i2c/at24.h>
++#include <linux/spi/spi.h>
++//#include <linux/serial_8250.h>
++
++#include <linux/serial.h>
++#include <linux/fsl_devices.h>
++#include <linux/irq.h>
++#include <linux/mmc/host.h>
++#include <linux/gpio_keys.h>
++#include <linux/leds.h>
++
++#include <asm/setup.h>
++#include <asm/irq.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/time.h>
++#include <mach/common.h>
++#include <mach/hardware.h>
++#include <mach/gpio.h>
++#include <mach/iomux.h>
++#include <mach/irqs.h>
++#include <mach/clock.h>
++#include <mach/imxfb.h>
++//#include <mach/imx_spi.h>
++#include <mach/i2c.h>
++#include <mach/mmc.h>
++#include <mach/imx-uart.h>
++//#include <mach/ulpi.h>
++//#include <mach/mxc_ehci.h>
++#include <mach/board-stk5.h>
++
++#include "crm_regs.h"
++#include "devices.h"
++#include "karo.h"
++
++#if defined(CONFIG_SERIAL_IMX) || defined(CONFIG_SERIAL_IMX_MODULE)
++static struct pad_desc stk5_uart_pads[][4] = {
++      {
++              MX25_PAD_UART1_TXD__UART1_TXD,
++              MX25_PAD_UART1_RXD__UART1_RXD,
++              MX25_PAD_UART1_CTS__UART1_CTS,
++              MX25_PAD_UART1_RTS__UART1_RTS,
++      }, {
++              MX25_PAD_UART2_TXD__UART2_TXD,
++              MX25_PAD_UART2_RXD__UART2_RXD,
++              MX25_PAD_UART2_CTS__UART2_CTS,
++              MX25_PAD_UART2_RTS__UART2_RTS,
++      }, {
++              MX25_PAD_ECB__UART5_TXD_MUX,
++              MX25_PAD_LBA__UART5_RXD_MUX,
++              MX25_PAD_CS4__UART5_CTS,
++              MX25_PAD_CS5__UART5_RTS,
++#if 0
++      }, {
++              MX25_PAD_UART4_TXD__UART4_TXD,
++              MX25_PAD_UART4_RXD__UART4_RXD,
++              MX25_PAD_UART4_CTS__UART4_CTS,
++              MX25_PAD_UART4_RTS__UART4_RTS,
++      }, {
++              MX25_PAD_UART5_TXD__UART5_TXD,
++              MX25_PAD_UART5_RXD__UART5_RXD,
++              MX25_PAD_UART5_CTS__UART5_CTS,
++              MX25_PAD_UART5_RTS__UART5_RTS,
++#endif
++      },
++};
++
++static int stk5_uart_init(struct platform_device *pdev)
++{
++      DBG(0, "%s: \n", __FUNCTION__);
++      return mxc_iomux_v3_setup_multiple_pads(stk5_uart_pads[pdev->id],
++                                              ARRAY_SIZE(stk5_uart_pads[pdev->id]));
++}
++
++static void stk5_uart_exit(struct platform_device *pdev)
++{
++      DBG(0, "%s: \n", __FUNCTION__);
++      mxc_iomux_v3_release_multiple_pads(stk5_uart_pads[pdev->id],
++                                         ARRAY_SIZE(stk5_uart_pads[pdev->id]));
++}
++
++static struct imxuart_platform_data stk5_uart_ports[] = {
++      {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      }, {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      }, {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      }, {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      }, {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      }, {
++              .init = stk5_uart_init,
++              .exit = stk5_uart_exit,
++              .flags = IMXUART_HAVE_RTSCTS,
++      },
++};
++
++static struct platform_device *stk5_uart_devices[] = {
++#if UART1_ENABLED
++      &mxc_uart_device0,
++#endif
++#if UART2_ENABLED
++      &mxc_uart_device1,
++#endif
++#if UART3_ENABLED
++      &mxc_uart_device2,
++#endif
++#if UART4_ENABLED
++      &mxc_uart_device3,
++#endif
++#if UART5_ENABLED
++      &mxc_uart_device4,
++#endif
++};
++
++static void __init karo_stk5_serial_init(void)
++{
++      int i;
++
++      for (i = 0; i < ARRAY_SIZE(stk5_uart_devices); i++) {
++              int ret;
++              int port = stk5_uart_devices[i]->id;
++
++              DBG(0, "%s: Registering platform device[%d] @ %p dev %p: %s\n",
++                  __FUNCTION__, i, stk5_uart_devices[i],
++                  &stk5_uart_devices[i]->dev, stk5_uart_devices[i]->name);
++              ret = mxc_register_device(stk5_uart_devices[i],
++                                        &stk5_uart_ports[port]);
++              if (ret != 0) {
++                      printk(KERN_WARNING "%s: Failed to register platform_device[%d]: %s: %d\n",
++                             __FUNCTION__, i, stk5_uart_devices[i]->name, ret);
++              }
++      }
++}
++#else
++static void __init karo_stk5_serial_init(void)
++{
++}
++#endif
++
++#ifdef CONFIG_USB_EHCI_MXC
++
++#define SMSC_VENDOR_ID                0x0424
++#define USB3317_PROD_ID               0x0006
++#define ULPI_FCTL             7
++
++static inline const char *ulpi_name(void __iomem *view)
++{
++      if ((unsigned long)view & 0x400) {
++              return "USBH2";
++      } else {
++              return "USBOTG";
++      }
++}
++
++static int usb3317_init(void __iomem *view)
++{
++      int vid, pid, ret;
++
++      ret = ulpi_read(ISP1504_VID_HIGH, view);
++      if (ret < 0) {
++              goto err;
++      }
++      vid = ret << 8;
++
++      ret = ulpi_read(ISP1504_VID_LOW, view);
++      if (ret < 0) {
++              goto err;
++      }
++      vid |= ret;
++
++      ret = ulpi_read(ISP1504_PID_HIGH, view);
++      if (ret < 0) {
++              goto err;
++      }
++      pid = ret << 8;
++
++      ret = ulpi_read(ISP1504_PID_LOW, view);
++      if (ret < 0) {
++              goto err;
++      }
++      pid |= ret;
++
++      pr_info("ULPI on %s port Vendor ID 0x%x Product ID 0x%x\n",
++              ulpi_name(view), vid, pid);
++      if (vid != SMSC_VENDOR_ID || pid != USB3317_PROD_ID) {
++              pr_err("No USB3317 found\n");
++              return -ENODEV;
++      }
++ err:
++      if (ret < 0) {
++              printk(KERN_ERR "ULPI read on %s port failed with error %d\n",
++                     ulpi_name(view), ret);
++              return ret;
++      }
++      return 0;
++}
++
++static int usb3317_set_vbus_power(void __iomem *view, int on)
++{
++      int ret;
++
++      DBG(0, "%s: Switching %s port VBUS power %s\n", __FUNCTION__,
++          ulpi_name(view), on ? "on" : "off");
++
++      if (on) {
++              ret = ulpi_set(DRV_VBUS_EXT |           /* enable external Vbus */
++                             DRV_VBUS |               /* enable internal Vbus */
++                             CHRG_VBUS,               /* charge Vbus */
++                             ISP1504_OTGCTL, view);
++      } else {
++              ret = ulpi_clear(DRV_VBUS_EXT |         /* disable external Vbus */
++                               DRV_VBUS,              /* disable internal Vbus */
++                               ISP1504_OTGCTL, view);
++              if (ret == 0) {
++                      ret = ulpi_set(DISCHRG_VBUS,       /* discharge Vbus */
++                                     ISP1504_OTGCTL, view);
++              }
++      }
++      if (ret < 0) {
++              printk(KERN_ERR "ULPI read on %s port failed with error %d\n",
++                     ulpi_name(view), ret);
++              return ret;
++      }
++      return 0;
++}
++
++static int stk5_usbh2_init(struct platform_device *pdev)
++{
++      int ret;
++      u32 temp;
++      unsigned long flags;
++      void __iomem *view = IO_ADDRESS(OTG_BASE_ADDR + 0x570);
++
++      local_irq_save(flags);
++      temp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
++      temp &= ~((3 << 21) | (1 << 0));
++      temp |= (1 << 5) | (1 << 16) | (1 << 19) | (1 << 20);
++      writel(temp, IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
++      local_irq_restore(flags);
++
++      /* select ULPI transceiver */
++      /* this must be done _before_ setting up the GPIOs! */
++      temp = readl(view + 0x14);
++      DBG(0, "%s: Changing USBH2_PORTSC1 from %08x to %08x\n", __FUNCTION__,
++          temp, (temp & ~(3 << 30)) | (2 << 30));
++      temp &= ~(3 << 30);
++      temp |= 2 << 30;
++      writel(temp, view + 0x14);
++
++      /* Set to Host mode */
++      temp = readl(view + 0x38);
++      DBG(0, "%s: Changing USBH2_USBMODE from %08x to %08x\n", __FUNCTION__,
++          temp, temp | 3);
++      writel(temp | 0x3, view + 0x38);
++
++      ret = gpio_usbh2_active();
++      if (ret != 0) {
++              return ret;
++      }
++
++      ret = usb3317_init(view);
++      if (ret != 0) {
++              goto err;
++      }
++      ret = usb3317_set_vbus_power(view, 1);
++      if (ret != 0) {
++              goto err;
++      }
++      return 0;
++
++ err:
++      gpio_usbh2_inactive();
++      return ret;
++}
++
++static int stk5_usbh2_exit(struct platform_device *pdev)
++{
++      gpio_usbh2_inactive();
++      return 0;
++}
++
++static struct mxc_usbh_platform_data stk5_usbh2_data = {
++      .init = stk5_usbh2_init,
++      .exit = stk5_usbh2_exit,
++};
++
++static int __init karo_stk5_usbh2_register(void)
++{
++      int ret;
++
++      ret = mxc_register_device(&mxc_ehci2, &stk5_usbh2_data);
++      return ret;
++}
++#else
++static inline int karo_stk5_usbh2_register(void)
++{
++      return 0;
++}
++#endif // CONFIG_USB_EHCI_MXC
++
++#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
++static struct gpio_led stk5_leds[] = {
++      {
++              .name = "GPIO-LED",
++              .default_trigger = "heartbeat",
++              .gpio = GPIO_PORTB | 7,
++      },
++};
++
++static struct gpio_led_platform_data stk5_led_data = {
++      .leds = stk5_leds,
++      .num_leds = ARRAY_SIZE(stk5_leds),
++};
++
++static struct platform_device stk5_led_device = {
++      .name = "leds-gpio",
++      .id = -1,
++      .dev = {
++              .platform_data = &stk5_led_data,
++      },
++};
++#endif
++
++#if defined(CONFIG_KEYBOARD_MXC) || defined(CONFIG_KEYBOARD_MXC_MODULE)
++/*!
++ * This array is used for mapping mx25 ADS keypad scancodes to input keyboard
++ * keycodes.
++ */
++static u16 stk5_kpd_keycodes[] = {
++      KEY_POWER,
++};
++
++static struct keypad_data stk5_keypad = {
++      .rowmax = 1,
++      .colmax = 1,
++      .irq = MXC_INT_KPP,
++      .learning = 0,
++      //.delay = 2, /* unused in the driver! */
++      .matrix = stk5_kpd_keycodes,
++};
++
++static struct resource stk5_kpp_resources[] = {
++      {
++              .start = MXC_INT_KPP,
++              .end = MXC_INT_KPP,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++/* stk5 keypad driver */
++static struct platform_device stk5_keypad_device = {
++      .name = "mxc_keypad",
++      .id = 0,
++      .num_resources = ARRAY_SIZE(stk5_kpp_resources),
++      .resource = stk5_kpp_resources,
++      .dev = {
++              .platform_data = &stk5_keypad,
++      },
++};
++#endif
++
++#if defined(CONFIG_FB_IMX) || defined(CONFIG_FB_IMX_MODULE)
++/*
++ * Setup GPIO for LCDC device to be active
++ *
++ */
++static struct pad_desc mx25_lcdc_gpios[] = {
++#if 0
++      MXC_PIN(A, 30, GPIO, GPIO_OUT | GPIO_DFLT_LOW), /* PA30 */
++      MXC_PIN(A, 25, GPIO, GPIO_OUT | GPIO_DFLT_LOW), /* PA25 */
++      MXC_PIN(A, 26, GPIO, GPIO_OUT | GPIO_DFLT_LOW), /* PA26 */
++      MXC_PIN(A, 24, GPIO, GPIO_OUT | GPIO_DFLT_LOW), /* PA24 */
++      MXC_PIN(A, 27, GPIO, GPIO_OUT | GPIO_DFLT_LOW), /* PA27 */
++#endif
++      MX25_PAD_LSCLK__LSCLK,
++      MX25_PAD_LD0__LD0,
++      MX25_PAD_LD1__LD1,
++      MX25_PAD_LD2__LD2,
++      MX25_PAD_LD3__LD3,
++      MX25_PAD_LD4__LD4,
++      MX25_PAD_LD5__LD5,
++      MX25_PAD_LD6__LD6,
++      MX25_PAD_LD7__LD7,
++      MX25_PAD_LD8__LD8,
++      MX25_PAD_LD9__LD9,
++      MX25_PAD_LD10__LD10,
++      MX25_PAD_LD11__LD11,
++      MX25_PAD_LD12__LD12,
++      MX25_PAD_LD13__LD13,
++      MX25_PAD_LD14__LD14,
++      MX25_PAD_LD15__LD15,
++      MX25_PAD_D15__LD16,
++      MX25_PAD_D14__LD17,
++      MX25_PAD_HSYNC__HSYNC,
++      MX25_PAD_VSYNC__VSYNC,
++      MX25_PAD_OE_ACD__OE_ACD,
++};
++
++static int stk5_gpio_lcdc_active(struct platform_device *dev)
++{
++      int ret;
++
++      DBG(0, "%s: Setting up GPIO pins for LCD\n", __FUNCTION__);
++      ret = mxc_iomux_v3_setup_multiple_pads(mx25_lcdc_gpios,
++                                             ARRAY_SIZE(mx25_lcdc_gpios));
++      if (ret) {
++              DBG(0, "%s: Failed to setup GPIO pins for LCD: %d\n",
++                  __FUNCTION__, ret);
++              return ret;
++      }
++      return 0;
++}
++
++/*
++ * Setup GPIO for LCDC device to be inactive
++ *
++ */
++static void stk5_gpio_lcdc_inactive(struct platform_device *dev)
++{
++      mxc_iomux_v3_release_multiple_pads(mx25_lcdc_gpios,
++                                         ARRAY_SIZE(mx25_lcdc_gpios));
++}
++
++static struct imx_fb_platform_data stk5_fb_data[] __initdata = {
++      {
++              //.fb_mode = "Xenarc_700_Y-18",
++              .init = stk5_gpio_lcdc_active,
++              .exit = stk5_gpio_lcdc_inactive,
++              .lcd_power = NULL,
++              .backlight_power = NULL,
++
++              .pixclock       = 34576,
++              .xres           = 640,
++              .yres           = 480,
++
++              .bpp            = 32,
++
++              .hsync_len      = 64,
++              .right_margin   = 60 + 1,
++              .left_margin    = 80 + 3,
++
++              .vsync_len      = 2,
++              .upper_margin   = 54,
++              .lower_margin   = 54,
++#if 0
++              /* currently not used by driver! */
++              .sync           = ((0*FB_SYNC_HOR_HIGH_ACT) |
++                                 (0*FB_SYNC_VERT_HIGH_ACT) |
++                                 (1*FB_SYNC_OE_ACT_HIGH)),
++#else
++              .pcr            = PCR_TFT | PCR_COLOR | PCR_PBSIZ_8 |
++              PCR_BPIX_18 | PCR_END_SEL | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL,
++              .dmacr          = 0x800a0078,
++#endif
++              .cmap_greyscale = 0,
++              .cmap_inverse   = 0,
++              .cmap_static    = 0,
++
++              .fixed_screen_cpu = NULL,
++      }, {
++              //.fb_mode = "Xenarc_700_Y-16",
++              .init = stk5_gpio_lcdc_active,
++              .exit = stk5_gpio_lcdc_inactive,
++              .lcd_power = NULL,
++              .backlight_power = NULL,
++
++              .pixclock       = 34576,
++              .xres           = 640,
++              .yres           = 480,
++
++              .bpp            = 16,
++
++              .hsync_len      = 64,
++              .right_margin   = 138 + 1,
++              .left_margin    = 118 + 3,
++
++              .vsync_len      = 7,
++              .upper_margin   = 44,
++              .lower_margin   = 44,
++#if 0
++              /* currently not used by driver! */
++              .sync           = ((0*FB_SYNC_HOR_HIGH_ACT) |
++                                 (0*FB_SYNC_VERT_HIGH_ACT) |
++                                 (1*FB_SYNC_OE_ACT_HIGH)),
++#else
++              .pcr            = PCR_TFT | PCR_COLOR | PCR_PBSIZ_8 |
++              PCR_BPIX_16 | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL,
++              .dmacr          = 0x80040060,
++#endif
++              .cmap_greyscale = 0,
++              .cmap_inverse   = 0,
++              .cmap_static    = 0,
++
++              .fixed_screen_cpu = NULL,
++      }, {
++              //.fb_mode = "SHARP LQ10D42-16",
++              .init = stk5_gpio_lcdc_active,
++              .exit = stk5_gpio_lcdc_inactive,
++              .lcd_power = NULL,
++              .backlight_power = NULL,
++
++              .pixclock       = 34576,
++              .xres           = 640,
++              .yres           = 480,
++
++#ifdef USE_18BPP
++              .bpp            = 32,
++#else
++              .bpp            = 16,
++#endif
++              .hsync_len      = 64,
++              .right_margin   = 138 + 1,
++              .left_margin    = 118 + 3,
++
++              .vsync_len      = 7,
++              .upper_margin   = 28,
++              .lower_margin   = 60,
++#if 0
++              /* currently not used by driver! */
++              .sync           = ((0*FB_SYNC_HOR_HIGH_ACT) |
++                                 (0*FB_SYNC_VERT_HIGH_ACT) |
++                                 (1*FB_SYNC_OE_ACT_HIGH)),
++#else
++              .pcr            = PCR_TFT | PCR_COLOR | PCR_PBSIZ_8 |
++#ifdef USE_18BPP
++              PCR_BPIX_18 | PCR_END_SEL | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL,
++#else
++              PCR_BPIX_16 | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL,
++#endif
++              .dmacr          = 0x80040060,
++#endif
++              .cmap_greyscale = 0,
++              .cmap_inverse   = 0,
++              .cmap_static    = 0,
++
++              .fixed_screen_cpu = NULL,
++      }, {
++              //.fb_mode = "SHARP LQ104V1DG61-16",
++              .init = stk5_gpio_lcdc_active,
++              .exit = stk5_gpio_lcdc_inactive,
++              .lcd_power = NULL,
++              .backlight_power = NULL,
++
++              .pixclock       = 40000,
++              .xres           = 640,
++              .yres           = 480,
++
++#ifdef USE_18BPP
++              .bpp            = 32,
++#else
++              .bpp            = 16,
++#endif
++              .hsync_len      = 32,
++              .right_margin   = 32 + 1,
++              .left_margin    = 0 + 3,
++
++              .vsync_len      = 35,
++              .upper_margin   = 0,
++              .lower_margin   = 0,
++#if 0
++              /* currently not used by driver! */
++              .sync           = ((0*FB_SYNC_HOR_HIGH_ACT) |
++                                 (0*FB_SYNC_VERT_HIGH_ACT) |
++                                 (1*FB_SYNC_OE_ACT_HIGH)),
++#else
++              .pcr            = PCR_TFT | PCR_COLOR | PCR_PBSIZ_8 |
++#ifdef USE_18BPP
++              PCR_BPIX_18 | PCR_END_SEL | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL,
++#else
++              PCR_BPIX_16 | PCR_FLMPOL | PCR_LPPOL | PCR_CLKPOL | PCR_SCLK_SEL,
++#endif
++              .dmacr          = 0x80040060,
++#endif
++              .cmap_greyscale = 0,
++              .cmap_inverse   = 0,
++              .cmap_static    = 0,
++
++              .fixed_screen_cpu = NULL,
++      },
++};
++
++static int __init karo_stk5_fb_register(void)
++{
++      int ret;
++
++      ret = mxc_register_device(&mxc_fb_device, &stk5_fb_data[0]);
++      if (ret != 0) {
++              DBG(0, "%s: Failed to register FB device: %d\n", __FUNCTION__, ret);
++      }
++      return ret;
++}
++#else
++static inline int karo_stk5_fb_register(void)
++{
++      return 0;
++}
++#endif
++
++#if defined(CONFIG_MMC_MXC) || defined(CONFIG_MMC_MXC_MODULE)
++/*!
++ * Resource definition for the SDHC1
++ */
++static struct resource stk5_sdhc1_resources[] = {
++      {
++              .start = MMC_SDHC1_BASE_ADDR,
++              .end = MMC_SDHC1_BASE_ADDR + SZ_4K - 1,
++              .flags = IORESOURCE_MEM,
++      }, {
++              .start = MXC_INT_SDHC1,
++              .end = MXC_INT_SDHC1,
++              .flags = IORESOURCE_IRQ,
++      }, {
++              .start = gpio_to_irq(4 * 32 + 4),
++              .end = gpio_to_irq(4 * 32 + 4),
++              .flags = IORESOURCE_IRQ,
++#if 0
++      }, {
++              .name   = "sdhc1",
++              .start  = DMA_REQ_SDHC1,
++              .end    = DMA_REQ_SDHC1,
++              .flags  = IORESOURCE_DMA
++#endif
++      },
++};
++
++static inline int stk5_mmc_get_irq(int id)
++{
++      int irq;
++
++      switch (id) {
++      case 0:
++              irq = stk5_sdhc1_resources[2].start;
++              break;
++      default:
++              BUG();
++      }
++      return irq;
++}
++
++static const char *stk5_mmc_irqdesc[] = {
++      "MMC card 0 detect",
++};
++
++static struct pad_desc stk5_sdhc_pads[] = {
++};
++
++static int stk5_mmc_init(struct device *dev, irqreturn_t (*mmc_detect_irq)(int, void *),
++                       void *data)
++{
++      int err;
++      int id = to_platform_device(dev)->id;
++      struct mmc_host *host = data;
++      int irq = stk5_mmc_get_irq(id);
++
++      err = mxc_iomux_v3_setup_multiple_pads(stk5_sdhc_pads,
++                                             ARRAY_SIZE(stk5_sdhc_pads));
++      if (err) {
++              return err;
++      }
++
++      host->caps |= MMC_CAP_4_BIT_DATA;
++
++      err = request_irq(irq, mmc_detect_irq,
++                        IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
++                        stk5_mmc_irqdesc[id], data);
++      if (err) {
++              printk(KERN_ERR "%s: MMC/SD: can't request MMC card detect IRQ %d\n",
++                     __FUNCTION__, irq);
++              return err;
++      }
++      device_set_wakeup_capable(dev, 1);
++
++      return 0;
++}
++
++static void stk5_mmc_exit(struct device *dev, void *data)
++{
++      int id = to_platform_device(dev)->id;
++      int irq = stk5_mmc_get_irq(id);
++
++      free_irq(irq, data);
++      mxc_iomux_v3_release_multiple_pads(stk5_sdhc_pads,
++                                         ARRAY_SIZE(stk5_sdhc_pads));
++}
++
++#if 0
++static int stk5_mmc_suspend(struct device *dev, pm_message_t state)
++{
++      int id = to_platform_device(dev)->id;
++      int irq = stk5_mmc_get_irq(id);
++
++      if (device_may_wakeup(dev)) {
++              DBG(0, "%s: Enabling IRQ %d wakeup\n", __FUNCTION__, irq);
++              return enable_irq_wake(irq);
++      }
++      return 0;
++}
++
++static int stk5_mmc_resume(struct device *dev)
++{
++      int id = to_platform_device(dev)->id;
++      int irq = stk5_mmc_get_irq(id);
++
++      if (device_may_wakeup(dev)) {
++              DBG(0, "%s: Disabling IRQ %d wakeup\n", __FUNCTION__, irq);
++              return disable_irq_wake(irq);
++      }
++      return 0;
++}
++#endif
++
++static struct imxmmc_platform_data stk5_sdhc1_data = {
++      //.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
++      //.min_clk = 150000,
++      //.max_clk = 25000000,
++      //.detect_delay = 20,
++      .init = stk5_mmc_init,
++      .exit = stk5_mmc_exit,
++//    .suspend = stk5_mmc_suspend,
++//    .resume = stk5_mmc_resume,
++};
++
++static struct platform_device stk5_sdhc1_device = {
++      .name = "imx-mmc",
++      .id = 0,
++      .dev = {
++              .platform_data = &stk5_sdhc1_data,
++      },
++      .num_resources = ARRAY_SIZE(stk5_sdhc1_resources),
++      .resource = stk5_sdhc1_resources,
++};
++#endif
++
++#if defined(CONFIG_SPI_MXC) || defined(CONFIG_SPI_MXC_MODULE)
++static struct resource mxcspi1_resources[] = {
++      {
++             .start = CSPI1_BASE_ADDR,
++             .end = CSPI1_BASE_ADDR + SZ_4K - 1,
++             .flags = IORESOURCE_MEM,
++      }, {
++             .start = MXC_INT_CSPI1,
++             .end = MXC_INT_CSPI1,
++             .flags = IORESOURCE_IRQ,
++      },
++};
++
++static struct mxc_spi_master mxcspi1_data = {
++      .maxchipselect = 2,
++      .spi_version = 0,
++};
++
++static struct platform_device mxcspi1_device = {
++      .name = "mxc_spi",
++      .id = 0,
++      .dev = {
++              .platform_data = &mxcspi1_data,
++      },
++      .num_resources = ARRAY_SIZE(mxcspi1_resources),
++      .resource = mxcspi1_resources,
++};
++#endif // defined(CONFIG_SPI_MXC) || defined(CONFIG_SPI_MXC_MODULE)
++
++#if defined(CONFIG_AC97_BUS) || defined(CONFIG_AC97_BUS_MODULE)
++static u64 stk5_dma_mask = ~0UL;
++
++static struct pad_desc stk5_ac97_pads_on[] = {
++      MX25_PAD_VSTBY_ACK__GPIO_3_18, /* UCB1400 Reset */
++      MX25_PAD_RW__AUD4_TXFS,
++      MX25_PAD_EB0__AUD4_TXD,
++      MX25_PAD_EB1__AUD4_RXD,
++      MX25_PAD_OE__AUD4_TXC,
++};
++
++static struct pad_desc stk5_ac97_pads_off[] = {
++      MX25_PAD_VSTBY_ACK__GPIO_3_18, /* UCB1400 Reset */
++      MX25_PAD_RW__GPIO_3_25,
++      MX25_PAD_EB0__GPIO_2_12,
++      MX25_PAD_EB1__AUD4_RXD,
++      MX25_PAD_OE__AUD4_TXC,
++};
++
++static struct gpio_desc {
++      unsigned int gpio:7;
++      unsigned int dir:1;
++      unsigned int level:1;
++} stk5_ac97_gpios[] = {
++      /* configure the PHY strap pins to the correct values */
++      { GPIO_PORTC | 18, 1, 0, },
++      { GPIO_PORTC | 25, 1, 0, },
++      { GPIO_PORTB | 12, 1, 0, },
++};
++
++static int stk5_ac97_init(struct platform_device *dev)
++{
++      int ret;
++      int i;
++
++      DBG(0, "%s: \n", __FUNCTION__);
++
++      ret = mxc_iomux_v3_setup_multiple_pads(stk5_ac97_pads_off,
++                                             ARRAY_SIZE(stk5_ac97_pads_off));
++      if (ret == 0) {
++              for (i = 0; i < ARRAY_SIZE(stk5_ac97_gpios); i++) {
++                      struct gpio_desc *pd = &stk5_ac97_gpios[i];
++
++                      ret = gpio_request(pd->gpio, "AC97");
++                      if (ret < 0) {
++                              DBG(0, "%s: Failed to request GPIO%d_%d: %d\n",
++                                  __FUNCTION__, pd->gpio / 32 + 1, pd->gpio % 32, ret);
++                              goto rel_mux;
++                      }
++                      if (pd->dir) {
++                              gpio_direction_output(pd->gpio,
++                                                    pd->level);
++                      } else {
++                              gpio_direction_input(pd->gpio);
++                      }
++              }
++
++              ret = mxc_iomux_v3_setup_multiple_pads(stk5_ac97_pads_on,
++                                                     ARRAY_SIZE(stk5_ac97_pads_on));
++              if (ret != 0) {
++                      goto rel_gpio;
++              }
++              udelay(1);
++              gpio_set_value(stk5_ac97_gpios[0].gpio, !stk5_ac97_gpios[0].level);
++      }
++      return ret;
++
++ rel_mux:
++      mxc_iomux_v3_release_multiple_pads(stk5_ac97_gpios_off,
++                                         ARRAY_SIZE(stk5_ac97_gpios_off));
++ rel_gpio:
++      while (--i >= 0) {
++              struct gpio_desc *pd = &stk5_ac97_gpios[i];
++              int grp = pd->gpio / 32 + 1;
++              int ofs = pd->gpio % 32;
++
++              DBG(0, "%s: Freeing GPIO%d_%d\n", __FUNCTION__,
++                  grp, ofs);
++              gpio_free(pd->gpio);
++      }
++      return ret;
++}
++
++static void stk5_ac97_exit(struct platform_device *dev)
++{
++      int i;
++
++      DBG(0, "%s: Releasing AC97 GPIO pins\n", __FUNCTION__);
++
++      mxc_iomux_v3_release_multiple_pads(stk5_ac97_pads_on,
++                                         ARRAY_SIZE(stk5_ac97_pads_on));
++      for (i = 0; i < ARRAY_SIZE(stk5_ac97_gpios); i++) {
++              struct gpio_desc *pd = &stk5_ac97_gpios[i];
++              int grp = pd->gpio / 32 + 1;
++              int ofs = pd->gpio % 32;
++
++              DBG(0, "%s: Freeing GPIO%d_%d\n", __FUNCTION__,
++                  grp, ofs);
++              gpio_free(pd->gpio);
++      }
++}
++
++static struct mxc_ac97_audio_ops stk5_ac97_ops = {
++      .init = stk5_ac97_init,
++      .exit = stk5_ac97_exit,
++      .startup = NULL,
++      .shutdown = NULL,
++      .suspend = NULL,
++      .resume = NULL,
++      .priv = NULL,
++};
++
++static struct platform_device ac97_device = {
++      .name           = "mx25-ac97",
++      .id             = -1,
++      .dev = {
++              .dma_mask = &stk5_dma_mask,
++              .coherent_dma_mask = ~0UL,
++              .platform_data = &stk5_ac97_ops,
++      },
++};
++#endif
++
++static struct platform_dev_list {
++      struct platform_device *pdev;
++      int flag;
++} stk5_devices[] __initdata = {
++#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
++      { .pdev = &stk5_led_device, .flag = -1, },
++#endif
++#if defined(CONFIG_KEYBOARD_MXC) || defined(CONFIG_KEYBOARD_MXC_MODULE)
++      { .pdev = &stk5_keypad_device, .flag = 1, },
++#endif
++#if defined(CONFIG_SPI_MXC) || defined(CONFIG_SPI_MXC_MODULE)
++      { .pdev = &mxcspi1_device, .flag = 1, },
++#endif
++#if defined(CONFIG_AC97_BUS) || defined(CONFIG_AC97_BUS_MODULE)
++      { .pdev = &ac97_device, .flag = 1, },
++#endif
++#if defined(CONFIG_MMC_MXC) || defined(CONFIG_MMC_MXC_MODULE)
++      { .pdev = &stk5_sdhc1_device, .flag = 1, },
++#endif
++};
++#define STK5_NUM_DEVICES              ARRAY_SIZE(stk5_devices)
++
++static __init int karo_stk5_board_init(void)
++{
++      int ret;
++      int i;
++
++      if (karo_get_board_type() != BOARD_KARO_STK5) {
++              return -ENODEV;
++      }
++      DBG(0, "%s: \n", __FUNCTION__);
++
++      karo_stk5_serial_init();
++
++      dump_regs();
++
++      /* enable SSI1_INT (GPIO_3_15) for IRQ probing */
++      set_irq_flags(gpio_to_irq(GPIO_PORTC | 15), IRQF_VALID | IRQF_PROBE);
++
++      ret = karo_stk5_fb_register();
++      if (ret) {
++              printk(KERN_WARNING "%s: karo_stk5_fb_register() failed: %d\n",
++                     __FUNCTION__, ret);
++      }
++      ret = karo_stk5_usbh2_register();
++      if (ret) {
++              printk(KERN_WARNING "%s: karo_stk5_usbh2_register() failed: %d\n",
++                     __FUNCTION__, ret);
++      }
++
++      for (i = 0; i < STK5_NUM_DEVICES; i++) {
++              if (stk5_devices[i].pdev == NULL) continue;
++              if (!stk5_devices[i].flag) {
++                      DBG(0, "%s: Skipping platform device[%d] @ %p dev %p: %s\n",
++                          __FUNCTION__, i, stk5_devices[i].pdev, &stk5_devices[i].pdev->dev,
++                          stk5_devices[i].pdev->name);
++                      continue;
++              }
++              DBG(0, "%s: Registering platform device[%d] @ %p dev %p: %s\n",
++                  __FUNCTION__, i, stk5_devices[i].pdev, &stk5_devices[i].pdev->dev,
++                  stk5_devices[i].pdev->name);
++              ret = platform_device_register(stk5_devices[i].pdev);
++              if (ret) {
++                      printk(KERN_WARNING "%s: Failed to register platform_device[%d]: %s: %d\n",
++                             __FUNCTION__, i, stk5_devices[i].pdev->name, ret);
++              }
++      }
++      DBG(0, "%s: Done\n", __FUNCTION__);
++      return 0;
++}
++subsys_initcall(karo_stk5_board_init);
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx3/clock-imx35.c linux-2.6.30-rc4-karo/arch/arm/mach-mx3/clock-imx35.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/clock-imx35.c   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx3/clock-imx35.c      2009-06-02 17:59:19.000000000 +0200
+@@ -381,7 +381,7 @@ DEFINE_CLOCK(gpu2d_clk,  0, CCM_CGR3,  4
+               .clk = &c,              \
+       },
+-static struct clk_lookup lookups[] __initdata = {
++static struct clk_lookup lookups[] = {
+       _REGISTER_CLOCK(NULL, "asrc", asrc_clk)
+       _REGISTER_CLOCK(NULL, "ata", ata_clk)
+       _REGISTER_CLOCK(NULL, "audmux", audmux_clk)
+diff -urNp linux-2.6.30-rc4/arch/arm/mach-mx3/clock.c linux-2.6.30-rc4-karo/arch/arm/mach-mx3/clock.c
+--- linux-2.6.30-rc4/arch/arm/mach-mx3/clock.c 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/mach-mx3/clock.c    2009-06-02 17:59:19.000000000 +0200
+@@ -516,7 +516,7 @@ DEFINE_CLOCK(ipg_clk,     0, NULL,      
+               .clk = &c, \
+       },
+-static struct clk_lookup lookups[] __initdata = {
++static struct clk_lookup lookups[] = {
+       _REGISTER_CLOCK(NULL, "emi", emi_clk)
+       _REGISTER_CLOCK(NULL, "cspi", cspi1_clk)
+       _REGISTER_CLOCK(NULL, "cspi", cspi2_clk)
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/Kconfig linux-2.6.30-rc4-karo/arch/arm/plat-mxc/Kconfig
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/Kconfig 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/Kconfig    2009-06-02 18:01:59.000000000 +0200
+@@ -56,6 +56,9 @@ config ARCH_HAS_RNGA
+       bool
+       depends on ARCH_MXC
++config ARCH_MXC_IOMUX_V2
++      bool
++
+ config ARCH_MXC_IOMUX_V3
+       bool
+ endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/Makefile linux-2.6.30-rc4-karo/arch/arm/plat-mxc/Makefile
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/Makefile        2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/Makefile   2009-06-02 18:02:00.000000000 +0200
+@@ -5,7 +5,7 @@
+ # Common support
+ obj-y := irq.o clock.o gpio.o time.o devices.o cpu.o system.o
+-obj-$(CONFIG_ARCH_MX1) += iomux-mx1-mx2.o dma-mx1-mx2.o
+-obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o
+-obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
+-obj-$(CONFIG_MXC_PWM)  += pwm.o
++obj-$(CONFIG_ARCH_MXC_IOMUX_V2)       += iomux-mx1-mx2.o dma-mx1-mx2.o
++obj-$(CONFIG_ARCH_MXC_IOMUX_V3)       += iomux-v3.o
++obj-$(CONFIG_MXC_PWM)         += pwm.o
++obj-$(CONFIG_MACH_MX25)               += spba.o
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-stk5.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/board-stk5.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-stk5.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/board-stk5.h  2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,17 @@
++/*
++ * Copyright 2009 <LW@KARO-electronics.de>
++ *
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#define UART1_ENABLED         1
++#define UART2_ENABLED         1
++#define UART3_ENABLED         1
++/* Not available on TX25 */
++#define UART4_ENABLED         0
++#define UART5_ENABLED         0
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-tx25.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/board-tx25.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/board-tx25.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/board-tx25.h  2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,13 @@
++/*
++ * Copyright 2009 <LW@KARO-electronics.de>
++ *
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#define MXC_LL_UART_PADDR     UART1_BASE_ADDR
++#define MXC_LL_UART_VADDR     AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/common.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/common.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/common.h   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/common.h      2009-06-02 18:02:05.000000000 +0200
+@@ -17,6 +17,7 @@ struct clk;
+ extern void mx1_map_io(void);
+ extern void mx21_map_io(void);
+ extern void mx27_map_io(void);
++extern void mx25_map_io(void);
+ extern void mx31_map_io(void);
+ extern void mx35_map_io(void);
+ extern void mxc_init_irq(void);
+@@ -24,6 +25,7 @@ extern void mxc_timer_init(struct clk *t
+ extern int mx1_clocks_init(unsigned long fref);
+ extern int mx21_clocks_init(unsigned long lref, unsigned long fref);
+ extern int mx27_clocks_init(unsigned long fref);
++extern int mx25_clocks_init(unsigned long fref);
+ extern int mx31_clocks_init(unsigned long fref);
+ extern int mx35_clocks_init(void);
+ extern int mxc_register_gpios(void);
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/dma.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/dma.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/dma.h      1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/dma.h 2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,259 @@
++/*
++ * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#ifndef __ASM_ARCH_MXC_DMA_H__
++#define __ASM_ARCH_MXC_DMA_H__
++
++#include <mach/sdma.h>
++
++#define MXC_DMA_DYNAMIC_CHANNEL   255
++
++#define MXC_DMA_DONE            0x0
++#define MXC_DMA_REQUEST_TIMEOUT   0x1
++#define MXC_DMA_TRANSFER_ERROR    0x2
++
++/*! This defines the list of device ID's for DMA */
++typedef enum mxc_dma_device {
++      MXC_DMA_UART1_RX,
++      MXC_DMA_UART1_TX,
++      MXC_DMA_UART2_RX,
++      MXC_DMA_UART2_TX,
++      MXC_DMA_UART3_RX,
++      MXC_DMA_UART3_TX,
++      MXC_DMA_UART4_RX,
++      MXC_DMA_UART4_TX,
++      MXC_DMA_UART5_RX,
++      MXC_DMA_UART5_TX,
++      MXC_DMA_UART6_RX,
++      MXC_DMA_UART6_TX,
++      MXC_DMA_MMC1_WIDTH_1,
++      MXC_DMA_MMC1_WIDTH_4,
++      MXC_DMA_MMC2_WIDTH_1,
++      MXC_DMA_MMC2_WIDTH_4,
++      MXC_DMA_SSI1_8BIT_RX0,
++      MXC_DMA_SSI1_8BIT_TX0,
++      MXC_DMA_SSI1_16BIT_RX0,
++      MXC_DMA_SSI1_16BIT_TX0,
++      MXC_DMA_SSI1_24BIT_RX0,
++      MXC_DMA_SSI1_24BIT_TX0,
++      MXC_DMA_SSI1_8BIT_RX1,
++      MXC_DMA_SSI1_8BIT_TX1,
++      MXC_DMA_SSI1_16BIT_RX1,
++      MXC_DMA_SSI1_16BIT_TX1,
++      MXC_DMA_SSI1_24BIT_RX1,
++      MXC_DMA_SSI1_24BIT_TX1,
++      MXC_DMA_SSI2_8BIT_RX0,
++      MXC_DMA_SSI2_8BIT_TX0,
++      MXC_DMA_SSI2_16BIT_RX0,
++      MXC_DMA_SSI2_16BIT_TX0,
++      MXC_DMA_SSI2_24BIT_RX0,
++      MXC_DMA_SSI2_24BIT_TX0,
++      MXC_DMA_SSI2_8BIT_RX1,
++      MXC_DMA_SSI2_8BIT_TX1,
++      MXC_DMA_SSI2_16BIT_RX1,
++      MXC_DMA_SSI2_16BIT_TX1,
++      MXC_DMA_SSI2_24BIT_RX1,
++      MXC_DMA_SSI2_24BIT_TX1,
++      MXC_DMA_FIR_RX,
++      MXC_DMA_FIR_TX,
++      MXC_DMA_CSPI1_RX,
++      MXC_DMA_CSPI1_TX,
++      MXC_DMA_CSPI2_RX,
++      MXC_DMA_CSPI2_TX,
++      MXC_DMA_CSPI3_RX,
++      MXC_DMA_CSPI3_TX,
++      MXC_DMA_ATA_RX,
++      MXC_DMA_ATA_TX,
++      MXC_DMA_MEMORY,
++      MXC_DMA_FIFO_MEMORY,
++      MXC_DMA_DSP_PACKET_DATA0_RD,
++      MXC_DMA_DSP_PACKET_DATA0_WR,
++      MXC_DMA_DSP_PACKET_DATA1_RD,
++      MXC_DMA_DSP_PACKET_DATA1_WR,
++      MXC_DMA_DSP_LOG0_CHNL,
++      MXC_DMA_DSP_LOG1_CHNL,
++      MXC_DMA_DSP_LOG2_CHNL,
++      MXC_DMA_DSP_LOG3_CHNL,
++      MXC_DMA_CSI_RX,
++      MXC_DMA_SPDIF_16BIT_TX,
++      MXC_DMA_SPDIF_16BIT_RX,
++      MXC_DMA_SPDIF_32BIT_TX,
++      MXC_DMA_SPDIF_32BIT_RX,
++      MXC_DMA_ASRC_A_RX,
++      MXC_DMA_ASRC_A_TX,
++      MXC_DMA_ASRC_B_RX,
++      MXC_DMA_ASRC_B_TX,
++      MXC_DMA_ASRC_C_RX,
++      MXC_DMA_ASRC_C_TX,
++      MXC_DMA_ESAI_16BIT_RX,
++      MXC_DMA_ESAI_16BIT_TX,
++      MXC_DMA_ESAI_24BIT_RX,
++      MXC_DMA_ESAI_24BIT_TX,
++      MXC_DMA_TEST_RAM2D2RAM,
++      MXC_DMA_TEST_RAM2RAM2D,
++      MXC_DMA_TEST_RAM2D2RAM2D,
++      MXC_DMA_TEST_RAM2RAM,
++      MXC_DMA_TEST_HW_CHAINING,
++      MXC_DMA_TEST_SW_CHAINING
++} mxc_dma_device_t;
++
++/*! This defines the prototype of callback funtion registered by the drivers */
++typedef void (*mxc_dma_callback_t) (void *arg, int error_status,
++                                  unsigned int count);
++
++/*! This defines the type of DMA transfer requested */
++typedef enum mxc_dma_mode {
++      MXC_DMA_MODE_READ,
++      MXC_DMA_MODE_WRITE,
++} mxc_dma_mode_t;
++
++/*! This defines the DMA channel parameters */
++typedef struct mxc_dma_channel {
++      unsigned int active:1;  /*!< When there has a active tranfer, it is set to 1 */
++      unsigned int lock;      /*!< Defines the channel is allocated or not */
++      int curr_buf;           /*!< Current buffer */
++      mxc_dma_mode_t mode;    /*!< Read or Write */
++      unsigned int channel;   /*!< Channel info */
++      unsigned int dynamic:1; /*!< Channel not statically allocated when 1 */
++      char *dev_name;         /*!< Device name */
++      void *private;          /*!< Private structure for platform */
++      mxc_dma_callback_t cb_fn;       /*!< The callback function */
++      void *cb_args;          /*!< The argument of callback function */
++} mxc_dma_channel_t;
++
++/*! This structure contains the information about a dma transfer */
++typedef struct mxc_dma_requestbuf {
++      dma_addr_t src_addr;    /*!< source address */
++      dma_addr_t dst_addr;    /*!< destination address */
++      int num_of_bytes;       /*!< the length of this transfer : bytes */
++} mxc_dma_requestbuf_t;
++
++/*!
++ * This function is generally called by the driver at open time.
++ * The DMA driver would do any initialization steps that is required
++ * to get the channel ready for data transfer.
++ *
++ * @param channel_id   a pre-defined id. The peripheral driver would specify
++ *                     the id associated with its peripheral. This would be
++ *                     used by the DMA driver to identify the peripheral
++ *                     requesting DMA and do the necessary setup on the
++ *                     channel associated with the particular peripheral.
++ *                     The DMA driver could use static or dynamic DMA channel
++ *                     allocation.
++ * @param dev_name     module name or device name
++ * @return returns a negative number on error if request for a DMA channel did not
++ *         succeed, returns the channel number to be used on success.
++ */
++extern int mxc_dma_request(mxc_dma_device_t channel_id, char *dev_name);
++
++/*!
++ * This function is generally called by the driver at close time. The DMA
++ * driver would do any cleanup associated with this channel.
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @return returns a negative number on error or 0 on success
++ */
++extern int mxc_dma_free(int channel_num);
++
++/*!
++ * This function would just configure the buffers specified by the user into
++ * dma channel. The caller must call mxc_dma_enable to start this transfer.
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @param dma_buf      an array of physical addresses to the user defined
++ *                     buffers. The caller must guarantee the dma_buf is
++ *                     available until the transfer is completed.
++ * @param num_buf      number of buffers in the array
++ * @param mode         specifies whether this is READ or WRITE operation
++ * @return This function returns a negative number on error if buffer could not be
++ *         added with DMA for transfer. On Success, it returns 0
++ */
++extern int mxc_dma_config(int channel_num, mxc_dma_requestbuf_t * dma_buf,
++                        int num_buf, mxc_dma_mode_t mode);
++
++/*!
++ * This function would just configure the scatterlist specified by the
++ * user into dma channel. This is a slight variation of mxc_dma_config(),
++ * it is provided for the convenience of drivers that have a scatterlist
++ * passed into them. It is the calling driver's responsibility to have the
++ * correct physical address filled in the "dma_address" field of the
++ * scatterlist.
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @param sg           a scatterlist of buffers. The caller must guarantee
++ *                     the dma_buf is available until the transfer is
++ *                     completed.
++ * @param num_buf      number of buffers in the array
++ * @param num_of_bytes total number of bytes to transfer. If set to 0, this
++ *                     would imply to use the length field of the scatterlist
++ *                     for each DMA transfer. Else it would calculate the size
++ *                     for each DMA transfer.
++ * @param mode         specifies whether this is READ or WRITE operation
++ * @return This function returns a negative number on error if buffer could not
++ *         be added with DMA for transfer. On Success, it returns 0
++ */
++extern int mxc_dma_sg_config(int channel_num, struct scatterlist *sg,
++                           int num_buf, int num_of_bytes,
++                           mxc_dma_mode_t mode);
++
++/*!
++ * This function is provided if the driver would like to set/change its
++ * callback function.
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @param callback     a callback function to provide notification on transfer
++ *                     completion, user could specify NULL if he does not wish
++ *                     to be notified
++ * @param arg          an argument that gets passed in to the callback
++ *                     function, used by the user to do any driver specific
++ *                     operations.
++ * @return this function returns a negative number on error if the callback
++ *         could not be set for the channel or 0 on success
++ */
++extern int mxc_dma_callback_set(int channel_num, mxc_dma_callback_t callback,
++                              void *arg);
++
++/*!
++ * This stops the DMA channel and any ongoing transfers. Subsequent use of
++ * mxc_dma_enable() will restart the channel and restart the transfer.
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @return returns a negative number on error or 0 on success
++ */
++extern int mxc_dma_disable(int channel_num);
++
++/*!
++ * This starts DMA transfer. Or it restarts DMA on a stopped channel
++ * previously stopped with mxc_dma_disable().
++ *
++ * @param channel_num  the channel number returned at request time. This
++ *                     would be used by the DMA driver to identify the calling
++ *                     driver and do the necessary cleanup on the channel
++ *                     associated with the particular peripheral
++ * @return returns a negative number on error or 0 on success
++ */
++extern int mxc_dma_enable(int channel_num);
++
++#endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/hardware.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/hardware.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/hardware.h 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/hardware.h    2009-06-02 18:02:06.000000000 +0200
+@@ -29,13 +29,18 @@
+ #endif
+ #ifdef CONFIG_ARCH_MX2
++#ifndef CONFIG_MACH_MX25
+ # include <mach/mx2x.h>
++#endif
+ # ifdef CONFIG_MACH_MX21
+ #  include <mach/mx21.h>
+ # endif
+ # ifdef CONFIG_MACH_MX27
+ #  include <mach/mx27.h>
+ # endif
++# ifdef CONFIG_MACH_MX25
++#  include <mach/mx25.h>
++# endif
+ #endif
+ #ifdef CONFIG_ARCH_MX1
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imxfb.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/imxfb.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/imxfb.h    2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/imxfb.h       2009-06-02 18:02:06.000000000 +0200
+@@ -13,7 +13,8 @@
+ #define PCR_BPIX_4    (2 << 25)
+ #define PCR_BPIX_8    (3 << 25)
+ #define PCR_BPIX_12   (4 << 25)
+-#define PCR_BPIX_16   (4 << 25)
++#define PCR_BPIX_16   (5 << 25)
++#define PCR_BPIX_18   (6 << 25)
+ #define PCR_PIXPOL    (1 << 24)
+ #define PCR_FLMPOL    (1 << 23)
+ #define PCR_LPPOL     (1 << 22)
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx25.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux-mx25.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-mx25.h       1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux-mx25.h  2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,905 @@
++/*
++ * arch/arm/plat-mxc/include/mach/iomux-mx25.h
++ *
++ * Copyright (C) 2009 by Lothar Wassmann <LW@KARO-electronics.de>
++ *
++ * based on arch/arm/mach-mx25/mx25_pins.h
++ *    Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ * and
++ * arch/arm/plat-mxc/include/mach/iomux-mx35.h
++ *    Copyright (C, NO_PAD_CTRL) 2009 by Jan Weitzel Phytec Messtechnik GmbH <armlinux@phytec.de>
++ *
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++#ifndef __IOMUX_MX25_H__
++#define __IOMUX_MX25_H__
++
++#include <mach/iomux-v3.h>
++
++/*
++ *
++ * @brief MX25 I/O Pin List
++ *
++ * @ingroup GPIO_MX25
++ */
++
++#ifndef __ASSEMBLY__
++
++/*
++ * IOMUX/PAD Bit field definitions
++ */
++
++#define MX25_PAD_A10__A10                     IOMUX_PAD(A10, A10, 0x000, 0x008, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_A10__GPIO_4_0                        IOMUX_PAD(A10, GPIO_4_0, 0x000, 0x008, 0x05, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_A13__A13                     IOMUX_PAD(A13, A13, 0x22C, 0x00c, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A13__GPIO_4_1                        IOMUX_PAD(A13, GPIO_4_1, 0x22C, 0x00c, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A14__A14                     IOMUX_PAD(A14, A14, 0x230, 0x010, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A14__GPIO_2_0                        IOMUX_PAD(A14, GPIO_2_0, 0x230, 0x010, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A15__A15                     IOMUX_PAD(A15, A15, 0x234, 0x014, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A15__GPIO_2_1                        IOMUX_PAD(A15, GPIO_2_1, 0x234, 0x014, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A16__A16                     IOMUX_PAD(A16, A16, 0x000, 0x018, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_A16__GPIO_2_2                        IOMUX_PAD(A16, GPIO_2_2, 0x000, 0x018, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_A17__A17                     IOMUX_PAD(A17, A17, 0x238, 0x01c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A17__GPIO_2_3                        IOMUX_PAD(A17, GPIO_2_3, 0x238, 0x01c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A18__A18                     IOMUX_PAD(A18, A18, 0x23c, 0x020, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A18__GPIO_2_4                        IOMUX_PAD(A18, GPIO_2_4, 0x23c, 0x020, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A18__FEC_COL                 IOMUX_PAD(A18, FEC_COL, 0x23c, 0x020, 0x17, 0x504, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_A19__A19                     IOMUX_PAD(A19, A19, 0x240, 0x024, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A19__FEC_RX_ER                       IOMUX_PAD(A19, FEC_RX_ER, 0x240, 0x024, 0x17, 0x518, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_A19__GPIO_2_5                        IOMUX_PAD(A19, GPIO_2_5, 0x240, 0x024, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A20__A20                     IOMUX_PAD(A20, A20, 0x244, 0x028, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A20__GPIO_2_6                        IOMUX_PAD(A20, GPIO_2_6, 0x244, 0x028, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A20__FEC_RDATA2              IOMUX_PAD(A20, FEC_RDATA2, 0x244, 0x028, 0x17, 0x50c, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_A21__A21                     IOMUX_PAD(A21, A21, 0x248, 0x02c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A21__GPIO_2_7                        IOMUX_PAD(A21, GPIO_2_7, 0x248, 0x02c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A21__FEC_RDATA3              IOMUX_PAD(A21, FEC_RDATA3, 0x248, 0x02c, 0x17, 0x510, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_A22__A22                     IOMUX_PAD(A22, A22, 0x000, 0x030, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A22__GPIO_2_8                        IOMUX_PAD(A22, GPIO_2_8, 0x000, 0x030, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A23__A23                     IOMUX_PAD(A23, A23, 0x24c, 0x034, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A23__GPIO_2_9                        IOMUX_PAD(A23, GPIO_2_9, 0x24c, 0x034, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A24__A24                     IOMUX_PAD(A24, A24, 0x250, 0x038, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A24__GPIO_2_10                       IOMUX_PAD(A24, GPIO_2_10, 0x250, 0x038, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A24__FEC_RX_CLK              IOMUX_PAD(A24, FEC_RX_CLK, 0x250, 0x038, 0x17, 0x514, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_A25__A25                     IOMUX_PAD(A25, A25, 0x254, 0x03c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A25__GPIO_2_11                       IOMUX_PAD(A25, GPIO_2_11, 0x254, 0x03c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_A25__FEC_CRS                 IOMUX_PAD(A25, FEC_CRS, 0x254, 0x03c, 0x17, 0x508, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_EB0__EB0                     IOMUX_PAD(EB0, EB0, 0x258, 0x040, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EB0__AUD4_TXD                        IOMUX_PAD(EB0, AUD4_TXD, 0x258, 0x040, 0x14, 0x464, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EB0__GPIO_2_12                       IOMUX_PAD(EB0, GPIO_2_12, 0x258, 0x040, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EB1__EB1                     IOMUX_PAD(EB1, EB1, 0x25c, 0x044, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EB1__AUD4_RXD                        IOMUX_PAD(EB1, AUD4_RXD, 0x25c, 0x044, 0x14, 0x460, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EB1__GPIO_2_13                       IOMUX_PAD(EB1, GPIO_2_13, 0x25c, 0x044, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_OE__OE                               IOMUX_PAD(OE, OE, 0x260, 0x048, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_OE__AUD4_TXC                 IOMUX_PAD(OE, AUD4_TXC, 0x260, 0x048, 0x14, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_OE__GPIO_2_14                        IOMUX_PAD(OE, GPIO_2_14, 0x260, 0x048, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS0__CS0                     IOMUX_PAD(CS0, CS0, 0x000, 0x04c, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CS0__GPIO_4_2                        IOMUX_PAD(CS0, GPIO_4_2, 0x000, 0x04c, 0x05, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CS1__CS1                     IOMUX_PAD(CS1, CS1, 0x000, 0x050, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CS1__GPIO_4_3                        IOMUX_PAD(CS1, GPIO_4_3, 0x000, 0x050, 0x05, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CS4__CS4                     IOMUX_PAD(CS4, CS4, 0x264, 0x054, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS4__UART5_CTS                       IOMUX_PAD(CS4, UART5_CTS, 0x264, 0x054, 0x13, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS4__GPIO_3_20                       IOMUX_PAD(CS4, GPIO_3_20, 0x264, 0x054, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS5__CS5                     IOMUX_PAD(CS5, CS5, 0x268, 0x058, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS5__UART5_RTS                       IOMUX_PAD(CS5, UART5_RTS, 0x268, 0x058, 0x13, 0x574, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CS5__GPIO_3_21                       IOMUX_PAD(CS5, GPIO_3_21, 0x268, 0x058, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_NF_CE0__NF_CE0                       IOMUX_PAD(NF_CE0, NF_CE0, 0x26c, 0x05c, 0x10, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_NF_CE0__GPIO_3_22            IOMUX_PAD(NF_CE0, GPIO_3_22, 0x26c, 0x05c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_ECB__ECB                     IOMUX_PAD(ECB, ECB, 0x270, 0x060, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_ECB__UART5_TXD_MUX           IOMUX_PAD(ECB, UART5_TXD_MUX, 0x270, 0x060, 0x13, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_ECB__GPIO_3_23                       IOMUX_PAD(ECB, GPIO_3_23, 0x270, 0x060, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LBA__LBA                     IOMUX_PAD(LBA, LBA, 0x274, 0x064, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LBA__UART5_RXD_MUX           IOMUX_PAD(LBA, UART5_RXD_MUX, 0x274, 0x064, 0x13, 0x578, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LBA__GPIO_3_24                       IOMUX_PAD(LBA, GPIO_3_24, 0x274, 0x064, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_BCLK__BCLK                   IOMUX_PAD(BCLK, BCLK, 0x000, 0x068, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_BCLK__GPIO_4_4                       IOMUX_PAD(BCLK, GPIO_4_4, 0x000, 0x068, 0x05, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_RW__RW                               IOMUX_PAD(RW, RW, 0x278, 0x06c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_RW__AUD4_TXFS                        IOMUX_PAD(RW, AUD4_TXFS, 0x278, 0x06c, 0x14, 0x474, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_RW__GPIO_3_25                        IOMUX_PAD(RW, GPIO_3_25, 0x278, 0x06c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_NFWE_B__NFWE_B                       IOMUX_PAD(NFWE_B, NFWE_B, 0x000, 0x070, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFWE_B__GPIO_3_26            IOMUX_PAD(NFWE_B, GPIO_3_26, 0x000, 0x070, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFRE_B__NFRE_B                       IOMUX_PAD(NFRE_B, NFRE_B, 0x000, 0x074, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFRE_B__GPIO_3_27            IOMUX_PAD(NFRE_B, GPIO_3_27, 0x000, 0x074, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFALE__NFALE                 IOMUX_PAD(NFALE, NFALE, 0x000, 0x078, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFALE__GPIO_3_28             IOMUX_PAD(NFALE, GPIO_3_28, 0x000, 0x078, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFCLE__NFCLE                 IOMUX_PAD(NFCLE, NFCLE, 0x000, 0x07c, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFCLE__GPIO_3_29             IOMUX_PAD(NFCLE, GPIO_3_29, 0x000, 0x07c, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFWP_B__NFWP_B                       IOMUX_PAD(NFWP_B, NFWP_B, 0x000, 0x080, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFWP_B__GPIO_3_30            IOMUX_PAD(NFWP_B, GPIO_3_30, 0x000, 0x080, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_NFRB__NFRB                   IOMUX_PAD(NFRB, NFRB, 0x27c, 0x084, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_NFRB__GPIO_3_31              IOMUX_PAD(NFRB, GPIO_3_31, 0x27c, 0x084, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D15__D15                     IOMUX_PAD(D15, D15, 0x280, 0x088, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D15__LD16                    IOMUX_PAD(D15, LD16, 0x280, 0x088, 0x01, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D15__GPIO_4_5                        IOMUX_PAD(D15, GPIO_4_5, 0x280, 0x088, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D14__D14                     IOMUX_PAD(D14, D14, 0x284, 0x08c, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D14__LD17                    IOMUX_PAD(D14, LD17, 0x284, 0x08c, 0x01, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D14__GPIO_4_6                        IOMUX_PAD(D14, GPIO_4_6, 0x284, 0x08c, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D13__D13                     IOMUX_PAD(D13, D13, 0x288, 0x090, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D13__LD18                    IOMUX_PAD(D13, LD18, 0x288, 0x090, 0x01, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D13__GPIO_4_7                        IOMUX_PAD(D13, GPIO_4_7, 0x288, 0x090, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D12__D12                     IOMUX_PAD(D12, D12, 0x28c, 0x094, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D12__GPIO_4_8                        IOMUX_PAD(D12, GPIO_4_8, 0x28c, 0x094, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D11__D11                     IOMUX_PAD(D11, D11, 0x290, 0x098, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D11__GPIO_4_9                        IOMUX_PAD(D11, GPIO_4_9, 0x290, 0x098, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D10__D10                     IOMUX_PAD(D10, D10, 0x294, 0x09c, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D10__GPIO_4_10                       IOMUX_PAD(D10, GPIO_4_10, 0x294, 0x09c, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D10__USBOTG_OC                       IOMUX_PAD(D10, USBOTG_OC, 0x294, 0x09c, 0x06, 0x57c, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D9__D9                               IOMUX_PAD(D9, D9, 0x298, 0x0a0, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D9__GPIO_4_11                        IOMUX_PAD(D9, GPIO_4_11, 0x298, 0x0a0, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D9__USBH2_PWR                        IOMUX_PAD(D9, USBH2_PWR, 0x298, 0x0a0, 0x06, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D8__D8                               IOMUX_PAD(D8, D8, 0x29c, 0x0a4, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D8__GPIO_4_12                        IOMUX_PAD(D8, GPIO_4_12, 0x29c, 0x0a4, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D8__USBH2_OC                 IOMUX_PAD(D8, USBH2_OC, 0x29c, 0x0a4, 0x06, 0x580, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D7__D7                               IOMUX_PAD(D7, D7, 0x2a0, 0x0a8, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D7__GPIO_4_13                        IOMUX_PAD(D7, GPIO_4_13, 0x2a0, 0x0a8, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D6__D6                               IOMUX_PAD(D6, D6, 0x2a4, 0x0ac, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D6__GPIO_4_14                        IOMUX_PAD(D6, GPIO_4_14, 0x2a4, 0x0ac, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D5__D5                               IOMUX_PAD(D5, D5, 0x2a8, 0x0b0, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D5__GPIO_4_15                        IOMUX_PAD(D5, GPIO_4_15, 0x2a8, 0x0b0, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D4__D4                               IOMUX_PAD(D4, D4, 0x2ac, 0x0b4, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D4__GPIO_4_16                        IOMUX_PAD(D4, GPIO_4_16, 0x2ac, 0x0b4, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D3__D3                               IOMUX_PAD(D3, D3, 0x2b0, 0x0b8, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D3__GPIO_4_17                        IOMUX_PAD(D3, GPIO_4_17, 0x2b0, 0x0b8, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D2__D2                               IOMUX_PAD(D2, D2, 0x2b4, 0x0bc, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D2__GPIO_4_18                        IOMUX_PAD(D2, GPIO_4_18, 0x2b4, 0x0bc, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D1__D1                               IOMUX_PAD(D1, D1, 0x2b8, 0x0c0, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D1__GPIO_4_19                        IOMUX_PAD(D1, GPIO_4_19, 0x2b8, 0x0c0, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D0__D0                               IOMUX_PAD(D0, D0, 0x2bc, 0x0c4, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_D0__GPIO_4_20                        IOMUX_PAD(D0, GPIO_4_20, 0x2bc, 0x0c4, 0x05, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD0__LD0                     IOMUX_PAD(LD0, LD0, 0x2c0, 0x0c8, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD0__CSI_D0                  IOMUX_PAD(LD0, CSI_D0, 0x2c0, 0x0c8, 0x12, 0x488, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD0__GPIO_2_15                       IOMUX_PAD(LD0, GPIO_2_15, 0x2c0, 0x0c8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD1__LD1                     IOMUX_PAD(LD1, LD1, 0x2c4, 0x0cc, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD1__CSI_D1                  IOMUX_PAD(LD1, CSI_D1, 0x2c4, 0x0cc, 0x12, 0x48c, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD1__GPIO_2_16                       IOMUX_PAD(LD1, GPIO_2_16, 0x2c4, 0x0cc, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD2__LD2                     IOMUX_PAD(LD2, LD2, 0x2c8, 0x0d0, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD2__GPIO_2_17                       IOMUX_PAD(LD2, GPIO_2_17, 0x2c8, 0x0d0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD3__LD3                     IOMUX_PAD(LD3, LD3, 0x2cc, 0x0d4, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD3__GPIO_2_18                       IOMUX_PAD(LD3, GPIO_2_18, 0x2cc, 0x0d4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD4__LD4                     IOMUX_PAD(LD4, LD4, 0x2d0, 0x0d8, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD4__GPIO_2_19                       IOMUX_PAD(LD4, GPIO_2_19, 0x2d0, 0x0d8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD5__LD5                     IOMUX_PAD(LD5, LD5, 0x2d4, 0x0dc, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD5__GPIO_1_19                       IOMUX_PAD(LD5, GPIO_1_19, 0x2d4, 0x0dc, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD6__LD6                     IOMUX_PAD(LD6, LD6, 0x2d8, 0x0e0, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD6__GPIO_1_20                       IOMUX_PAD(LD6, GPIO_1_20, 0x2d8, 0x0e0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD7__LD7                     IOMUX_PAD(LD7, LD7, 0x2dc, 0x0e4, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD7__GPIO_1_21                       IOMUX_PAD(LD7, GPIO_1_21, 0x2dc, 0x0e4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD8__LD8                     IOMUX_PAD(LD8, LD8, 0x2e0, 0x0e8, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD8__FEC_TX_ERR              IOMUX_PAD(LD8, FEC_TX_ERR, 0x2e0, 0x0e8, 0x15, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD9__LD9                     IOMUX_PAD(LD9, LD9, 0x2e4, 0x0ec, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD9__FEC_COL                 IOMUX_PAD(LD9, FEC_COL, 0x2e4, 0x0ec, 0x15, 0x504, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD10__LD10                   IOMUX_PAD(LD10, LD10, 0x2e8, 0x0f0, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD10__FEC_RX_ER              IOMUX_PAD(LD10, FEC_RX_ER, 0x2e8, 0x0f0, 0x15, 0x518, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD11__LD11                   IOMUX_PAD(LD11, LD11, 0x2ec, 0x0f4, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD11__FEC_RDATA2             IOMUX_PAD(LD11, FEC_RDATA2, 0x2ec, 0x0f4, 0x15, 0x50c, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD12__LD12                   IOMUX_PAD(LD12, LD12, 0x2f0, 0x0f8, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD12__FEC_RDATA3             IOMUX_PAD(LD12, FEC_RDATA3, 0x2f0, 0x0f8, 0x15, 0x510, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD13__LD13                   IOMUX_PAD(LD13, LD13, 0x2f4, 0x0fc, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD13__FEC_TDATA2             IOMUX_PAD(LD13, FEC_TDATA2, 0x2f4, 0x0fc, 0x15, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD14__LD14                   IOMUX_PAD(LD14, LD14, 0x2f8, 0x100, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD14__FEC_TDATA3             IOMUX_PAD(LD14, FEC_TDATA3, 0x2f8, 0x100, 0x15, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_LD15__LD15                   IOMUX_PAD(LD15, LD15, 0x2fc, 0x104, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LD15__FEC_RX_CLK             IOMUX_PAD(LD15, FEC_RX_CLK, 0x2fc, 0x104, 0x15, 0x514, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_HSYNC__HSYNC                 IOMUX_PAD(HSYNC, HSYNC, 0x300, 0x108, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_HSYNC__GPIO_1_22             IOMUX_PAD(HSYNC, GPIO_1_22, 0x300, 0x108, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSYNC__VSYNC                 IOMUX_PAD(VSYNC, VSYNC, 0x304, 0x10c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSYNC__GPIO_1_23             IOMUX_PAD(VSYNC, GPIO_1_23, 0x304, 0x10c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LSCLK__LSCLK                 IOMUX_PAD(LSCLK, LSCLK, 0x308, 0x110, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_LSCLK__GPIO_1_24             IOMUX_PAD(LSCLK, GPIO_1_24, 0x308, 0x110, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_OE_ACD__OE_ACD                       IOMUX_PAD(OE_ACD, OE_ACD, 0x30c, 0x114, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_OE_ACD__GPIO_1_25            IOMUX_PAD(OE_ACD, GPIO_1_25, 0x30c, 0x114, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CONTRAST__CONTRAST           IOMUX_PAD(CONTRAST, CONTRAST, 0x310, 0x118, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CONTRAST__FEC_CRS            IOMUX_PAD(CONTRAST, FEC_CRS, 0x310, 0x118, 0x15, 0x508, 1, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_PWM__PWM                     IOMUX_PAD(PWM, PWM, 0x314, 0x11c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_PWM__GPIO_1_26                       IOMUX_PAD(PWM, GPIO_1_26, 0x314, 0x11c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_PWM__USBH2_OC                        IOMUX_PAD(PWM, USBH2_OC, 0x314, 0x11c, 0x16, 0x580, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D2__CSI_D2                       IOMUX_PAD(CSI_D2, CSI_D2, 0x318, 0x120, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D2__UART5_RXD_MUX                IOMUX_PAD(CSI_D2, UART5_RXD_MUX, 0x318, 0x120, 0x11, 0x578, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D2__GPIO_1_27            IOMUX_PAD(CSI_D2, GPIO_1_27, 0x318, 0x120, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D3__CSI_D3                       IOMUX_PAD(CSI_D3, CSI_D3, 0x31c, 0x124, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D3__GPIO_1_28            IOMUX_PAD(CSI_D3, GPIO_1_28, 0x31c, 0x124, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D4__CSI_D4                       IOMUX_PAD(CSI_D4, CSI_D4, 0x320, 0x128, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D4__UART5_RTS            IOMUX_PAD(CSI_D4, UART5_RTS, 0x320, 0x128, 0x11, 0x574, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D4__GPIO_1_29            IOMUX_PAD(CSI_D4, GPIO_1_29, 0x320, 0x128, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D5__CSI_D5                       IOMUX_PAD(CSI_D5, CSI_D5, 0x324, 0x12c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D5__GPIO_1_30            IOMUX_PAD(CSI_D5, GPIO_1_30, 0x324, 0x12c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D6__CSI_D6                       IOMUX_PAD(CSI_D6, CSI_D6, 0x328, 0x130, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D6__GPIO_1_31            IOMUX_PAD(CSI_D6, GPIO_1_31, 0x328, 0x130, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D7__CSI_D7                       IOMUX_PAD(CSI_D7, CSI_D7, 0x32c, 0x134, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D7__GPIO_1_6             IOMUX_PAD(CSI_D7, GPIO_1_6, 0x32c, 0x134, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D8__CSI_D8                       IOMUX_PAD(CSI_D8, CSI_D8, 0x330, 0x138, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D8__GPIO_1_7             IOMUX_PAD(CSI_D8, GPIO_1_7, 0x330, 0x138, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D9__CSI_D9                       IOMUX_PAD(CSI_D9, CSI_D9, 0x334, 0x13c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_D9__GPIO_4_21            IOMUX_PAD(CSI_D9, GPIO_4_21, 0x334, 0x13c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_MCLK__CSI_MCLK           IOMUX_PAD(CSI_MCLK, CSI_MCLK, 0x338, 0x140, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_MCLK__GPIO_1_8           IOMUX_PAD(CSI_MCLK, GPIO_1_8, 0x338, 0x140, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_VSYNC__CSI_VSYNC         IOMUX_PAD(CSI_VSYNC, CSI_VSYNC, 0x33c, 0x144, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_VSYNC__GPIO_1_9          IOMUX_PAD(CSI_VSYNC, GPIO_1_9, 0x33c, 0x144, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_HSYNC__CSI_HSYNC         IOMUX_PAD(CSI_HSYNC, CSI_HSYNC, 0x340, 0x148, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_HSYNC__GPIO_1_10         IOMUX_PAD(CSI_HSYNC, GPIO_1_10, 0x340, 0x148, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_PIXCLK__CSI_PIXCLK               IOMUX_PAD(CSI_PIXCLK, CSI_PIXCLK, 0x344, 0x14c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSI_PIXCLK__GPIO_1_11                IOMUX_PAD(CSI_PIXCLK, GPIO_1_11, 0x344, 0x14c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_I2C1_CLK__I2C1_CLK           IOMUX_PAD(I2C1_CLK, I2C1_CLK, 0x348, 0x150, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_I2C1_CLK__GPIO_1_12          IOMUX_PAD(I2C1_CLK, GPIO_1_12, 0x348, 0x150, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_I2C1_DAT__I2C1_DAT           IOMUX_PAD(I2C1_DAT, I2C1_DAT, 0x34c, 0x154, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_I2C1_DAT__GPIO_1_13          IOMUX_PAD(I2C1_DAT, GPIO_1_13, 0x34c, 0x154, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_MOSI__CSPI1_MOSI               IOMUX_PAD(CSPI1_MOSI, CSPI1_MOSI, 0x350, 0x158, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_MOSI__GPIO_1_14                IOMUX_PAD(CSPI1_MOSI, GPIO_1_14, 0x350, 0x158, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_MISO__CSPI1_MISO               IOMUX_PAD(CSPI1_MISO, CSPI1_MISO, 0x354, 0x15c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_MISO__GPIO_1_15                IOMUX_PAD(CSPI1_MISO, GPIO_1_15, 0x354, 0x15c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SS0__CSPI1_SS0         IOMUX_PAD(CSPI1_SS0, CSPI1_SS0, 0x358, 0x160, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SS0__GPIO_1_16         IOMUX_PAD(CSPI1_SS0, GPIO_1_16, 0x358, 0x160, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SS1__CSPI1_SS1         IOMUX_PAD(CSPI1_SS1, CSPI1_SS1, 0x35c, 0x164, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SS1__GPIO_1_17         IOMUX_PAD(CSPI1_SS1, GPIO_1_17, 0x35c, 0x164, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SCLK__CSPI1_SCLK               IOMUX_PAD(CSPI1_SCLK, CSPI1_SCLK, 0x360, 0x168, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_SCLK__GPIO_1_18                IOMUX_PAD(CSPI1_SCLK, GPIO_1_18, 0x360, 0x168, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CSPI1_RDY__CSPI1_RDY         IOMUX_PAD(CSPI1_RDY, CSPI1_RDY, 0x364, 0x16c, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_CSPI1_RDY__GPIO_2_22         IOMUX_PAD(CSPI1_RDY, GPIO_2_22, 0x364, 0x16c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_RXD__UART1_RXD         IOMUX_PAD(UART1_RXD, UART1_RXD, 0x368, 0x170, 0x10, 0, 0, PAD_CTL_PULL_DOWN_100K)
++#define MX25_PAD_UART1_RXD__GPIO_4_22         IOMUX_PAD(UART1_RXD, GPIO_4_22, 0x368, 0x170, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_TXD__UART1_TXD         IOMUX_PAD(UART1_TXD, UART1_TXD, 0x36c, 0x174, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_TXD__GPIO_4_23         IOMUX_PAD(UART1_TXD, GPIO_4_23, 0x36c, 0x174, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_RTS__UART1_RTS         IOMUX_PAD(UART1_RTS, UART1_RTS, 0x370, 0x178, 0x10, 0, 0, PAD_CTL_PULL_UP_100K)
++#define MX25_PAD_UART1_RTS__CSI_D0            IOMUX_PAD(UART1_RTS, CSI_D0, 0x370, 0x178, 0x11, 0x488, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_RTS__GPIO_4_24         IOMUX_PAD(UART1_RTS, GPIO_4_24, 0x370, 0x178, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_CTS__UART1_CTS         IOMUX_PAD(UART1_CTS, UART1_CTS, 0x374, 0x17c, 0x10, 0, 0, PAD_CTL_PULL_UP_100K)
++#define MX25_PAD_UART1_CTS__CSI_D1            IOMUX_PAD(UART1_CTS, CSI_D1, 0x374, 0x17c, 0x11, 0x48c, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART1_CTS__GPIO_4_25         IOMUX_PAD(UART1_CTS, GPIO_4_25, 0x374, 0x17c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_RXD__UART2_RXD         IOMUX_PAD(UART2_RXD, UART2_RXD, 0x378, 0x180, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_RXD__GPIO_4_26         IOMUX_PAD(UART2_RXD, GPIO_4_26, 0x378, 0x180, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_TXD__UART2_TXD         IOMUX_PAD(UART2_TXD, UART2_TXD, 0x37c, 0x184, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_TXD__GPIO_4_27         IOMUX_PAD(UART2_TXD, GPIO_4_27, 0x37c, 0x184, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_RTS__UART2_RTS         IOMUX_PAD(UART2_RTS, UART2_RTS, 0x380, 0x188, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_RTS__FEC_COL           IOMUX_PAD(UART2_RTS, FEC_COL, 0x380, 0x188, 0x12, 0x504, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_UART2_RTS__GPIO_4_28         IOMUX_PAD(UART2_RTS, GPIO_4_28, 0x380, 0x188, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_CTS__FEC_RX_ER         IOMUX_PAD(UART2_CTS, FEC_RX_ER, 0x384, 0x18c, 0x12, 0x518, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_UART2_CTS__UART2_CTS         IOMUX_PAD(UART2_CTS, UART2_CTS, 0x384, 0x18c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_UART2_CTS__GPIO_4_29         IOMUX_PAD(UART2_CTS, GPIO_4_29, 0x384, 0x18c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_CMD__SD1_CMD             IOMUX_PAD(SD1_CMD, SD1_CMD, 0x388, 0x190, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_CMD__FEC_RDATA2          IOMUX_PAD(SD1_CMD, FEC_RDATA2, 0x388, 0x190, 0x12, 0x50c, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_CMD__GPIO_2_23           IOMUX_PAD(SD1_CMD, GPIO_2_23, 0x388, 0x190, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_CLK__SD1_CLK             IOMUX_PAD(SD1_CLK, SD1_CLK, 0x38c, 0x194, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_CLK__FEC_RDATA3          IOMUX_PAD(SD1_CLK, FEC_RDATA3, 0x38c, 0x194, 0x12, 0x510, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_CLK__GPIO_2_24           IOMUX_PAD(SD1_CLK, GPIO_2_24, 0x38c, 0x194, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_DATA0__SD1_DATA0         IOMUX_PAD(SD1_DATA0, SD1_DATA0, 0x390, 0x198, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA0__GPIO_2_25         IOMUX_PAD(SD1_DATA0, GPIO_2_25, 0x390, 0x198, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_DATA1__SD1_DATA1         IOMUX_PAD(SD1_DATA1, SD1_DATA1, 0x394, 0x19c, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA1__AUD7_RXD          IOMUX_PAD(SD1_DATA1, AUD7_RXD, 0x394, 0x19c, 0x13, 0x478, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_DATA1__GPIO_2_26         IOMUX_PAD(SD1_DATA1, GPIO_2_26, 0x394, 0x19c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_DATA2__SD1_DATA2         IOMUX_PAD(SD1_DATA2, SD1_DATA2, 0x398, 0x1a0, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA2__FEC_RX_CLK                IOMUX_PAD(SD1_DATA2, FEC_RX_CLK, 0x398, 0x1a0, 0x15, 0x514, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA2__GPIO_2_27         IOMUX_PAD(SD1_DATA2, GPIO_2_27, 0x398, 0x1a0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_SD1_DATA3__SD1_DATA3         IOMUX_PAD(SD1_DATA3, SD1_DATA3, 0x39c, 0x1a4, 0x10, 0, 0, PAD_CTL_PULL_UP_47K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA3__FEC_CRS           IOMUX_PAD(SD1_DATA3, FEC_CRS, 0x39c, 0x1a4, 0x10, 0x508, 2, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_SD1_DATA3__GPIO_2_28         IOMUX_PAD(SD1_DATA3, GPIO_2_28, 0x39c, 0x1a4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW0__KPP_ROW0           IOMUX_PAD(KPP_ROW0, KPP_ROW0, 0x3a0, 0x1a8, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_KPP_ROW0__GPIO_2_29          IOMUX_PAD(KPP_ROW0, GPIO_2_29, 0x3a0, 0x1a8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW1__KPP_ROW1           IOMUX_PAD(KPP_ROW1, KPP_ROW1, 0x3a4, 0x1ac, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_KPP_ROW1__GPIO_2_30          IOMUX_PAD(KPP_ROW1, GPIO_2_30, 0x3a4, 0x1ac, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW2__KPP_ROW2           IOMUX_PAD(KPP_ROW2, KPP_ROW2, 0x3a8, 0x1b0, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_KPP_ROW2__CSI_D0             IOMUX_PAD(KPP_ROW2, CSI_D0, 0x3a8, 0x1b0, 0x13, 0x488, 2, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW2__GPIO_2_31          IOMUX_PAD(KPP_ROW2, GPIO_2_31, 0x3a8, 0x1b0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW3__KPP_ROW3           IOMUX_PAD(KPP_ROW3, KPP_ROW3, 0x3ac, 0x1b4, 0x10, 0, 0, PAD_CTL_PULL_KEEPER)
++#define MX25_PAD_KPP_ROW3__CSI_LD1            IOMUX_PAD(KPP_ROW3, CSI_LD1, 0x3ac, 0x1b4, 0x13, 0x48c, 2, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_ROW3__GPIO_3_0           IOMUX_PAD(KPP_ROW3, GPIO_3_0, 0x3ac, 0x1b4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_COL0__KPP_COL0           IOMUX_PAD(KPP_COL0, KPP_COL0, 0x3b0, 0x1b8, 0x10, 0, 0, PAD_CTL_PULL_KEEPER | PAD_CTL_OUTPUT_OPEN_DRAIN)
++#define MX25_PAD_KPP_COL0__GPIO_3_1           IOMUX_PAD(KPP_COL0, GPIO_3_1, 0x3b0, 0x1b8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_COL1__KPP_COL1           IOMUX_PAD(KPP_COL1, KPP_COL1, 0x3b4, 0x1bc, 0x10, 0, 0, PAD_CTL_PULL_KEEPER | PAD_CTL_OUTPUT_OPEN_DRAIN)
++#define MX25_PAD_KPP_COL1__GPIO_3_2           IOMUX_PAD(KPP_COL1, GPIO_3_2, 0x3b4, 0x1bc, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_COL2__KPP_COL2           IOMUX_PAD(KPP_COL2, KPP_COL2, 0x3b8, 0x1c0, 0x10, 0, 0, PAD_CTL_PULL_KEEPER | PAD_CTL_OUTPUT_OPEN_DRAIN)
++#define MX25_PAD_KPP_COL2__GPIO_3_3           IOMUX_PAD(KPP_COL2, GPIO_3_3, 0x3b8, 0x1c0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_KPP_COL3__KPP_COL3           IOMUX_PAD(KPP_COL3, KPP_COL3, 0x3bc, 0x1c4, 0x10, 0, 0, PAD_CTL_PULL_KEEPER | PAD_CTL_OUTPUT_OPEN_DRAIN)
++#define MX25_PAD_KPP_COL3__GPIO_3_4           IOMUX_PAD(KPP_COL3, GPIO_3_4, 0x3bc, 0x1c4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_MDC__FEC_MDC             IOMUX_PAD(FEC_MDC, FEC_MDC, 0x3c0, 0x1c8, 0x10, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_MDC__AUD4_TXD            IOMUX_PAD(FEC_MDC, AUD4_TXD, 0x3c0, 0x1c8, 0x12, 0x464, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_MDC__GPIO_3_5            IOMUX_PAD(FEC_MDC, GPIO_3_5, 0x3c0, 0x1c8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_MDIO__FEC_MDIO           IOMUX_PAD(FEC_MDIO, FEC_MDIO, 0x3c4, 0x1cc, 0x10, 0, 0, PAD_CTL_HYSTERESIS | PAD_CTL_PULL_UP_22K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_MDIO__AUD4_RXD           IOMUX_PAD(FEC_MDIO, AUD4_RXD, 0x3c4, 0x1cc, 0x12, 0x460, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_MDIO__GPIO_3_6           IOMUX_PAD(FEC_MDIO, GPIO_3_6, 0x3c4, 0x1cc, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_TDATA0__FEC_TDATA0               IOMUX_PAD(FEC_TDATA0, FEC_TDATA0, 0x3c8, 0x1d0, 0x10, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_TDATA0__GPIO_3_7         IOMUX_PAD(FEC_TDATA0, GPIO_3_7, 0x3c8, 0x1d0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_TDATA1__FEC_TDATA1               IOMUX_PAD(FEC_TDATA1, FEC_TDATA1, 0x3cc, 0x1d4, 0x10, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_TDATA1__AUD4_TXFS                IOMUX_PAD(FEC_TDATA1, AUD4_TXFS, 0x3cc, 0x1d4, 0x12, 0x474, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_TDATA1__GPIO_3_8         IOMUX_PAD(FEC_TDATA1, GPIO_3_8, 0x3cc, 0x1d4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_TX_EN__FEC_TX_EN         IOMUX_PAD(FEC_TX_EN, FEC_TX_EN, 0x3d0, 0x1d8, 0x10, 0, 0, PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_TX_EN__GPIO_3_9                  IOMUX_PAD(FEC_TX_EN, GPIO_3_9   , 0x3d0, 0x1d8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_RDATA0__FEC_RDATA0               IOMUX_PAD(FEC_RDATA0, FEC_RDATA0, 0x3d4, 0x1dc, 0x10, 0, 0, PAD_CTL_PULL_DOWN_100K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_RDATA0__GPIO_3_10                IOMUX_PAD(FEC_RDATA0, GPIO_3_10, 0x3d4, 0x1dc, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_RDATA1__FEC_RDATA1               IOMUX_PAD(FEC_RDATA1, FEC_RDATA1, 0x3d8, 0x1e0, 0x10, 0, 0, PAD_CTL_PULL_DOWN_100K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_RDATA1__GPIO_3_11                IOMUX_PAD(FEC_RDATA1, GPIO_3_11, 0x3d8, 0x1e0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_RX_DV__FEC_RX_DV         IOMUX_PAD(FEC_RX_DV, FEC_RX_DV, 0x3dc, 0x1e4, 0x10, 0, 0, PAD_CTL_PULL_DOWN_100K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_RX_DV__CAN2_RX           IOMUX_PAD(FEC_RX_DV, CAN2_RX, 0x3dc, 0x1e4, 0x14, 0x484, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_RX_DV__GPIO_3_12         IOMUX_PAD(FEC_RX_DV, GPIO_3_12, 0x3dc, 0x1e4, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_FEC_TX_CLK__FEC_TX_CLK               IOMUX_PAD(FEC_TX_CLK, FEC_TX_CLK, 0x3e0, 0x1e8, 0x10, 0, 0, PAD_CTL_HYSTERESIS | PAD_CTL_PULL_DOWN_100K | PAD_CTL_SLEW_RATE_FAST)
++#define MX25_PAD_FEC_TX_CLK__GPIO_3_13                IOMUX_PAD(FEC_TX_CLK, GPIO_3_13, 0x3e0, 0x1e8, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_RTCK__RTCK                   IOMUX_PAD(RTCK, RTCK, 0x3e4, 0x1ec, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_RTCK__OWIRE                  IOMUX_PAD(RTCK, OWIRE, 0x3e4, 0x1ec, 0x11, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_RTCK__GPIO_3_14              IOMUX_PAD(RTCK, GPIO_3_14, 0x3e4, 0x1ec, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_DE_B__DE_B                   IOMUX_PAD(DE_B, DE_B, 0x3ec, 0x1f0, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_DE_B__GPIO_2_20              IOMUX_PAD(DE_B, GPIO_2_20, 0x3ec, 0x1f0, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_TDO__TDO                     IOMUX_PAD(TDO, TDO, 0x3e8, 0x000, 0x00, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_A__GPIO_A                       IOMUX_PAD(GPIO_A, GPIO_A, 0x3f0, 0x1f4, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_A__USBOTG_PWR           IOMUX_PAD(GPIO_A, USBOTG_PWR, 0x3f0, 0x1f4, 0x12, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_B__GPIO_B                       IOMUX_PAD(GPIO_B, GPIO_B, 0x3f4, 0x1f8, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_B__USBOTG_OC            IOMUX_PAD(GPIO_B, USBOTG_OC, 0x3f4, 0x1f8, 0x12, 0x57c, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_C__GPIO_C                       IOMUX_PAD(GPIO_C, GPIO_C, 0x3f8, 0x1fc, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_C__CAN2_TX              IOMUX_PAD(GPIO_C, CAN2_TX, 0x3f8, 0x1fc, 0x16, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_D__GPIO_D                       IOMUX_PAD(GPIO_D, GPIO_D, 0x3fc, 0x200, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_D__CAN2_RX              IOMUX_PAD(GPIO_D, CAN2_RX, 0x3fc, 0x200, 0x16, 0x484, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_E__GPIO_E                       IOMUX_PAD(GPIO_E, GPIO_E, 0x400, 0x204, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_E__AUD7_TXD             IOMUX_PAD(GPIO_E, AUD7_TXD, 0x400, 0x204, 0x14, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_F__GPIO_F                       IOMUX_PAD(GPIO_F, GPIO_F, 0x404, 0x208, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_GPIO_F__AUD7_TXC             IOMUX_PAD(GPIO_F, AUD7_TXC, 0x404, 0x208, 0x14, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_EXT_ARMCLK__EXT_ARMCLK               IOMUX_PAD(EXT_ARMCLK, EXT_ARMCLK, 0x000, 0x20c, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_EXT_ARMCLK__GPIO_3_15                IOMUX_PAD(EXT_ARMCLK, GPIO_3_15, 0x000, 0x20c, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_UPLL_BYPCLK__UPLL_BYPCLK     IOMUX_PAD(UPLL_BYPCLK, UPLL_BYPCLK, 0x000, 0x210, 0x10, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_UPLL_BYPCLK__GPIO_3_16               IOMUX_PAD(UPLL_BYPCLK, GPIO_3_16, 0x000, 0x210, 0x15, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_VSTBY_REQ__VSTBY_REQ         IOMUX_PAD(VSTBY_REQ, VSTBY_REQ, 0x408, 0x214, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSTBY_REQ__AUD7_TXFS         IOMUX_PAD(VSTBY_REQ, AUD7_TXFS, 0x408, 0x214, 0x14, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSTBY_REQ__GPIO_3_17         IOMUX_PAD(VSTBY_REQ, GPIO_3_17, 0x408, 0x214, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSTBY_ACK__VSTBY_ACK         IOMUX_PAD(VSTBY_ACK, VSTBY_ACK, 0x40c, 0x218, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_VSTBY_ACK__GPIO_3_18         IOMUX_PAD(VSTBY_ACK, GPIO_3_18, 0x40c, 0x218, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_POWER_FAIL__POWER_FAIL               IOMUX_PAD(POWER_FAIL, POWER_FAIL, 0x410, 0x21c, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_POWER_FAIL__AUD7_RXD         IOMUX_PAD(POWER_FAIL, AUD7_RXD, 0x410, 0x21c, 0x14, 0x478, 1, 0 | NO_PAD_CTRL)
++#define MX25_PAD_POWER_FAIL__GPIO_3_19                IOMUX_PAD(POWER_FAIL, GPIO_3_19, 0x410, 0x21c, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CLKO__CLKO                   IOMUX_PAD(CLKO, CLKO, 0x414, 0x220, 0x10, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_CLKO__GPIO_2_21              IOMUX_PAD(CLKO, GPIO_2_21, 0x414, 0x220, 0x15, 0, 0, 0 | NO_PAD_CTRL)
++#define MX25_PAD_BOOT_MODE0__BOOT_MODE0               IOMUX_PAD(BOOT_MODE0, BOOT_MODE0, 0x000, 0x224, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_BOOT_MODE0__GPIO_4_30                IOMUX_PAD(BOOT_MODE0, GPIO_4_30, 0x000, 0x224, 0x05, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_BOOT_MODE1__BOOT_MODE1               IOMUX_PAD(BOOT_MODE1, BOOT_MODE1, 0x000, 0x228, 0x00, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_BOOT_MODE1__GPIO_4_31                IOMUX_PAD(BOOT_MODE1, GPIO_4_31, 0x000, 0x228, 0x05, 0, 0, NO_PAD_CTRL)
++
++#define MX25_PAD_CTL_GRP_DVS_MISC             IOMUX_PAD(0x418, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_FEC              IOMUX_PAD(0x41c, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_JTAG             IOMUX_PAD(0x420, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_NFC              IOMUX_PAD(0x424, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_CSI              IOMUX_PAD(0x428, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_WEIM             IOMUX_PAD(0x42c, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_DDR              IOMUX_PAD(0x430, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_CRM              IOMUX_PAD(0x434, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_KPP              IOMUX_PAD(0x438, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_SDHC1            IOMUX_PAD(0x43c, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_LCD              IOMUX_PAD(0x440, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_UART             IOMUX_PAD(0x444, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_NFC              IOMUX_PAD(0x448, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_CSI              IOMUX_PAD(0x44c, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DSE_CSPI1            IOMUX_PAD(0x450, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DDRTYPE              IOMUX_PAD(0x454, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_SDHC1            IOMUX_PAD(0x458, 0x000, 0, 0, 0, NO_PAD_CTRL)
++#define MX25_PAD_CTL_GRP_DVS_LCD              IOMUX_PAD(0x45c, 0x000, 0, 0, 0, NO_PAD_CTRL)
++
++#if 0
++enum {
++      GPIO_A,
++      GPIO_B,
++      GPIO_C,
++      GPIO_D,
++      GPIO_E,
++      GPIO_F,
++      GPIO_1_6,
++      GPIO_1_7,
++      GPIO_1_8,
++      GPIO_1_9,
++      GPIO_1_10,
++      GPIO_1_11,
++      GPIO_1_12,
++      GPIO_1_13,
++      GPIO_1_14,
++      GPIO_1_15,
++      GPIO_1_16,
++      GPIO_1_17,
++      GPIO_1_18,
++      GPIO_1_19,
++      GPIO_1_20,
++      GPIO_1_21,
++      GPIO_1_22,
++      GPIO_1_23,
++      GPIO_1_24,
++      GPIO_1_25,
++      GPIO_1_26,
++      GPIO_1_27,
++      GPIO_1_28,
++      GPIO_1_29,
++      GPIO_1_30,
++      GPIO_1_31,
++      GPIO_2_0,
++      GPIO_2_1,
++      GPIO_2_2,
++      GPIO_2_3,
++      GPIO_2_4,
++      GPIO_2_5,
++      GPIO_2_6,
++      GPIO_2_7,
++      GPIO_2_8,
++      GPIO_2_9,
++      GPIO_2_10,
++      GPIO_2_11,
++      GPIO_2_12,
++      GPIO_2_13,
++      GPIO_2_14,
++      GPIO_2_15,
++      GPIO_2_16,
++      GPIO_2_17,
++      GPIO_2_18,
++      GPIO_2_19,
++      GPIO_2_20,
++      GPIO_2_21,
++      GPIO_2_22,
++      GPIO_2_23,
++      GPIO_2_24,
++      GPIO_2_25,
++      GPIO_2_26,
++      GPIO_2_27,
++      GPIO_2_28,
++      GPIO_2_29,
++      GPIO_2_30,
++      GPIO_2_31,
++      GPIO_3_0,
++      GPIO_3_1,
++      GPIO_3_2,
++      GPIO_3_3,
++      GPIO_3_4,
++      GPIO_3_5,
++      GPIO_3_6,
++      GPIO_3_7,
++      GPIO_3_8,
++      GPIO_3_9,
++      GPIO_3_10,
++      GPIO_3_11,
++      GPIO_3_12,
++      GPIO_3_13,
++      GPIO_3_14,
++      GPIO_3_15,
++      GPIO_3_16,
++      GPIO_3_17,
++      GPIO_3_18,
++      GPIO_3_19,
++      GPIO_3_20,
++      GPIO_3_21,
++      GPIO_3_22,
++      GPIO_3_23,
++      GPIO_3_24,
++      GPIO_3_25,
++      GPIO_3_26,
++      GPIO_3_27,
++      GPIO_3_28,
++      GPIO_3_29,
++      GPIO_3_30,
++      GPIO_3_31,
++      GPIO_4_0,
++      GPIO_4_1,
++      GPIO_4_2,
++      GPIO_4_3,
++      GPIO_4_4,
++      GPIO_4_5,
++      GPIO_4_6,
++      GPIO_4_7,
++      GPIO_4_8,
++      GPIO_4_9,
++      GPIO_4_10,
++      GPIO_4_11,
++      GPIO_4_12,
++      GPIO_4_13,
++      GPIO_4_14,
++      GPIO_4_15,
++      GPIO_4_16,
++      GPIO_4_17,
++      GPIO_4_18,
++      GPIO_4_19,
++      GPIO_4_20,
++      GPIO_4_21,
++      GPIO_4_22,
++      GPIO_4_23,
++      GPIO_4_24,
++      GPIO_4_25,
++      GPIO_4_26,
++      GPIO_4_27,
++      GPIO_4_28,
++      GPIO_4_29,
++      GPIO_4_30,
++      GPIO_4_31,
++};
++
++#define IOMUX_TO_GPIO(__pad_desc) ({          \
++      int __gpio = -1;                        \
++      struct pad_desc *__pd = __pad_desc;     \
++                                              \
++      switch (__pd->mux_ctrl_ofs) {           \
++      case MX25_PAD_GPIO_A__GPIO_A:           \
++              __gpio = GPIO_A;                \
++              break;                          \
++      case MX25_PAD_GPIO_B__GPIO_B:           \
++              __gpio = GPIO_B;                \
++              break;                          \
++      case MX25_PAD_GPIO_C__GPIO_C:           \
++              __gpio = GPIO_C;                \
++              break;                          \
++      case MX25_PAD_GPIO_D__GPIO_D:           \
++              __gpio = GPIO_D;                \
++              break;                          \
++      case MX25_PAD_GPIO_E__GPIO_E:           \
++              __gpio = GPIO_E;                \
++              break;                          \
++      case MX25_PAD_GPIO_F__GPIO_F:           \
++              __gpio = GPIO_F;                \
++              break;                          \
++      case MX25_PAD_CSI_D7__GPIO_1_6:         \
++              __gpio = GPIO_1_6;              \
++              break;                          \
++      case MX25_PAD_CSI_D8__GPIO_1_7:         \
++              __gpio = GPIO_1_7;              \
++              break;                          \
++      case MX25_PAD_CSI_MCLK__GPIO_1_8:       \
++              __gpio = GPIO_1_8;              \
++              break;                          \
++      case MX25_PAD_CSI_VSYNC__GPIO_1_9:      \
++              __gpio = GPIO_1_9;              \
++              break;                          \
++      case MX25_PAD_CSI_HSYNC__GPIO_1_10:     \
++              __gpio = GPIO_1_10;             \
++              break;                          \
++      case MX25_PAD_CSI_PIXCLK__GPIO_1_11:    \
++              __gpio = GPIO_1_11;             \
++              break;                          \
++      case MX25_PAD_I2C1_CLK__GPIO_1_12:      \
++              __gpio = GPIO_1_12;             \
++              break;                          \
++      case MX25_PAD_I2C1_DAT__GPIO_1_13:      \
++              __gpio = GPIO_1_13;             \
++              break;                          \
++      case MX25_PAD_CSPI1_MOSI__GPIO_1_14:    \
++              __gpio = GPIO_1_14;             \
++              break;                          \
++      case MX25_PAD_CSPI1_MISO__GPIO_1_15:    \
++              __gpio = GPIO_1_15;             \
++              break;                          \
++      case MX25_PAD_CSPI1_SS0__GPIO_1_16:     \
++              __gpio = GPIO_1_16;             \
++              break;                          \
++      case MX25_PAD_CSPI1_SS1__GPIO_1_17:     \
++              __gpio = GPIO_1_17;             \
++              break;                          \
++      case MX25_PAD_CSPI1_SCLK__GPIO_1_18:    \
++              __gpio = GPIO_1_18;             \
++              break;                          \
++      case MX25_PAD_LD5__GPIO_1_19:           \
++              __gpio = GPIO_1_19;             \
++              break;                          \
++      case MX25_PAD_LD6__GPIO_1_20:           \
++              __gpio = GPIO_1_20;             \
++              break;                          \
++      case MX25_PAD_LD7__GPIO_1_21:           \
++              __gpio = GPIO_1_21;             \
++              break;                          \
++      case MX25_PAD_HSYNC__GPIO_1_22:         \
++              __gpio = GPIO_1_22;             \
++              break;                          \
++      case MX25_PAD_VSYNC__GPIO_1_23:         \
++              __gpio = GPIO_1_23;             \
++              break;                          \
++      case MX25_PAD_LSCLK__GPIO_1_24:         \
++              __gpio = GPIO_1_24;             \
++              break;                          \
++      case MX25_PAD_OE_ACD__GPIO_1_25:        \
++              __gpio = GPIO_1_25;             \
++              break;                          \
++      case MX25_PAD_PWM__GPIO_1_26:           \
++              __gpio = GPIO_1_26;             \
++              break;                          \
++      case MX25_PAD_CSI_D2__GPIO_1_27:        \
++              __gpio = GPIO_1_27;             \
++              break;                          \
++      case MX25_PAD_CSI_D3__GPIO_1_28:        \
++              __gpio = GPIO_1_28;             \
++              break;                          \
++      case MX25_PAD_CSI_D4__GPIO_1_29:        \
++              __gpio = GPIO_1_29;             \
++              break;                          \
++      case MX25_PAD_CSI_D5__GPIO_1_30:        \
++              __gpio = GPIO_1_30;             \
++              break;                          \
++      case MX25_PAD_CSI_D6__GPIO_1_31:        \
++              __gpio = GPIO_1_31;             \
++              break;                          \
++                                              \
++      case MX25_PAD_A14__GPIO_2_0:            \
++              __gpio = GPIO_2_0;              \
++              break;                          \
++      case MX25_PAD_A15__GPIO_2_1:            \
++              __gpio = GPIO_2_1;              \
++              break;                          \
++      case MX25_PAD_A16__GPIO_2_2:            \
++              __gpio = GPIO_2_2;              \
++              break;                          \
++      case MX25_PAD_A17__GPIO_2_3:            \
++              __gpio = GPIO_2_3;              \
++              break;                          \
++      case MX25_PAD_A18__GPIO_2_4:            \
++              __gpio = GPIO_2_4;              \
++              break;                          \
++      case MX25_PAD_A19__GPIO_2_5:            \
++              __gpio = GPIO_2_5;              \
++              break;                          \
++      case MX25_PAD_A20__GPIO_2_6:            \
++              __gpio = GPIO_2_6;              \
++              break;                          \
++      case MX25_PAD_A21__GPIO_2_7:            \
++              __gpio = GPIO_2_7;              \
++              break;                          \
++      case MX25_PAD_A22__GPIO_2_8:            \
++              __gpio = GPIO_2_8;              \
++              break;                          \
++      case MX25_PAD_A23__GPIO_2_9:            \
++              __gpio = GPIO_2_9;              \
++              break;                          \
++      case MX25_PAD_A24__GPIO_2_10:           \
++              __gpio = GPIO_2_10;             \
++              break;                          \
++      case MX25_PAD_A25__GPIO_2_11:           \
++              __gpio = GPIO_2_11;             \
++              break;                          \
++      case MX25_PAD_EB0__GPIO_2_12:           \
++              __gpio = GPIO_2_12;             \
++              break;                          \
++      case MX25_PAD_EB1__GPIO_2_13:           \
++              __gpio = GPIO_2_13;             \
++              break;                          \
++      case MX25_PAD_OE__GPIO_2_14:            \
++              __gpio = GPIO_2_14;             \
++              break;                          \
++      case MX25_PAD_LD0__GPIO_2_15:           \
++              __gpio = GPIO_2_15;             \
++              break;                          \
++      case MX25_PAD_LD1__GPIO_2_16:           \
++              __gpio = GPIO_2_16;             \
++              break;                          \
++      case MX25_PAD_LD2__GPIO_2_17:           \
++              __gpio = GPIO_2_17;             \
++              break;                          \
++      case MX25_PAD_LD3__GPIO_2_18:           \
++              __gpio = GPIO_2_18;             \
++              break;                          \
++      case MX25_PAD_LD4__GPIO_2_19:           \
++              __gpio = GPIO_2_19;             \
++              break;                          \
++      case MX25_PAD_DE_B__GPIO_2_20:          \
++              __gpio = GPIO_2_20;             \
++              break;                          \
++      case MX25_PAD_CLKO__GPIO_2_21:          \
++              __gpio = GPIO_2_21;             \
++              break;                          \
++      case MX25_PAD_CSPI1_RDY__GPIO_2_22:     \
++              __gpio = GPIO_2_22;             \
++              break;                          \
++      case MX25_PAD_SD1_CMD__GPIO_2_23:       \
++              __gpio = GPIO_2_23;             \
++              break;                          \
++      case MX25_PAD_SD1_CLK__GPIO_2_24:       \
++              __gpio = GPIO_2_24;             \
++              break;                          \
++      case MX25_PAD_SD1_DATA0__GPIO_2_25:     \
++              __gpio = GPIO_2_25;             \
++              break;                          \
++      case MX25_PAD_SD1_DATA1__GPIO_2_26:     \
++              __gpio = GPIO_2_26;             \
++              break;                          \
++      case MX25_PAD_SD1_DATA2__GPIO_2_27:     \
++              __gpio = GPIO_2_27;             \
++              break;                          \
++      case MX25_PAD_SD1_DATA3__GPIO_2_28:     \
++              __gpio = GPIO_2_28;             \
++              break;                          \
++      case MX25_PAD_KPP_ROW0__GPIO_2_29:      \
++              __gpio = GPIO_2_29;             \
++              break;                          \
++      case MX25_PAD_KPP_ROW1__GPIO_2_30:      \
++              __gpio = GPIO_2_30;             \
++              break;                          \
++      case MX25_PAD_KPP_ROW2__GPIO_2_31:      \
++              __gpio = GPIO_2_31;             \
++              break;                          \
++                                              \
++      case MX25_PAD_KPP_ROW3__GPIO_3_0:       \
++              __gpio = GPIO_3_0;              \
++              break;                          \
++      case MX25_PAD_KPP_COL0__GPIO_3_1:       \
++              __gpio = GPIO_3_1;              \
++              break;                          \
++      case MX25_PAD_KPP_COL1__GPIO_3_2:       \
++              __gpio = GPIO_3_2;              \
++              break;                          \
++      case MX25_PAD_KPP_COL2__GPIO_3_3:       \
++              __gpio = GPIO_3_3;              \
++              break;                          \
++      case MX25_PAD_KPP_COL3__GPIO_3_4:       \
++              __gpio = GPIO_3_4;              \
++              break;                          \
++      case MX25_PAD_FEC_MDC__GPIO_3_5:        \
++              __gpio = GPIO_3_5;              \
++              break;                          \
++      case MX25_PAD_FEC_MDIO__GPIO_3_6:       \
++              __gpio = GPIO_3_6;              \
++              break;                          \
++      case MX25_PAD_FEC_TDATA0__GPIO_3_7:     \
++              __gpio = GPIO_3_7;              \
++              break;                          \
++      case MX25_PAD_FEC_TDATA1__GPIO_3_8:     \
++              __gpio = GPIO_3_8;              \
++              break;                          \
++      case MX25_PAD_FEC_TX_EN__GPIO_3_9:      \
++              __gpio = GPIO_3_9;              \
++              break;                          \
++      case MX25_PAD_FEC_RDATA0__GPIO_3_10:    \
++              __gpio = GPIO_3_10;             \
++              break;                          \
++      case MX25_PAD_FEC_RDATA1__GPIO_3_11:    \
++              __gpio = GPIO_3_11;             \
++              break;                          \
++      case MX25_PAD_FEC_RX_DV__GPIO_3_12:     \
++              __gpio = GPIO_3_12;             \
++              break;                          \
++      case MX25_PAD_FEC_TX_CLK__GPIO_3_13:    \
++              __gpio = GPIO_3_13;             \
++              break;                          \
++      case MX25_PAD_RTCK__GPIO_3_14:          \
++              __gpio = GPIO_3_14;             \
++              break;                          \
++      case MX25_PAD_EXT_ARMCLK__GPIO_3_15:    \
++              __gpio = GPIO_3_15;             \
++              break;                          \
++      case MX25_PAD_UPLL_BYPCLK__GPIO_3_16:   \
++              __gpio = GPIO_3_16;             \
++              break;                          \
++      case MX25_PAD_VSTBY_REQ__GPIO_3_17:     \
++              __gpio = GPIO_3_17;             \
++              break;                          \
++      case MX25_PAD_VSTBY_ACK__GPIO_3_18:     \
++              __gpio = GPIO_3_18;             \
++              break;                          \
++      case MX25_PAD_POWER_FAIL__GPIO_3_19:    \
++              __gpio = GPIO_3_19;             \
++              break;                          \
++      case MX25_PAD_CS4__GPIO_3_20:           \
++              __gpio = GPIO_3_20;             \
++              break;                          \
++      case MX25_PAD_CS5__GPIO_3_21:           \
++              __gpio = GPIO_3_21;             \
++              break;                          \
++      case MX25_PAD_NF_CE0__GPIO_3_22:        \
++              __gpio = GPIO_3_22;             \
++              break;                          \
++      case MX25_PAD_ECB__GPIO_3_23:           \
++              __gpio = GPIO_3_23;             \
++              break;                          \
++      case MX25_PAD_LBA__GPIO_3_24:           \
++              __gpio = GPIO_3_24;             \
++              break;                          \
++      case MX25_PAD_RW__GPIO_3_25:            \
++              __gpio = GPIO_3_25;             \
++              break;                          \
++      case MX25_PAD_NFWE_B__GPIO_3_26:        \
++              __gpio = GPIO_3_26;             \
++              break;                          \
++      case MX25_PAD_NFRE_B__GPIO_3_27:        \
++              __gpio = GPIO_3_27;             \
++              break;                          \
++      case MX25_PAD_NFALE__GPIO_3_28:         \
++              __gpio = GPIO_3_28;             \
++              break;                          \
++      case MX25_PAD_NFCLE__GPIO_3_29:         \
++              __gpio = GPIO_3_29;             \
++              break;                          \
++      case MX25_PAD_NFWP_B__GPIO_3_30:        \
++              __gpio = GPIO_3_30;             \
++              break;                          \
++      case MX25_PAD_NFRB__GPIO_3_31:          \
++              __gpio = GPIO_3_31;             \
++              break;                          \
++                                              \
++      case MX25_PAD_A10__GPIO_4_0:            \
++              __gpio = GPIO_4_0;              \
++              break;                          \
++      case MX25_PAD_A13__GPIO_4_1:            \
++              __gpio = GPIO_4_1;              \
++              break;                          \
++      case MX25_PAD_CS0__GPIO_4_2:            \
++              __gpio = GPIO_4_2;              \
++              break;                          \
++      case MX25_PAD_CS1__GPIO_4_3:            \
++              __gpio = GPIO_4_3;              \
++              break;                          \
++      case MX25_PAD_BCLK__GPIO_4_4:           \
++              __gpio = GPIO_4_4;              \
++              break;                          \
++      case MX25_PAD_D15__GPIO_4_5:            \
++              __gpio = GPIO_4_5;              \
++              break;                          \
++      case MX25_PAD_D14__GPIO_4_6:            \
++              __gpio = GPIO_4_6;              \
++              break;                          \
++      case MX25_PAD_D13__GPIO_4_7:            \
++              __gpio = GPIO_4_7;              \
++              break;                          \
++      case MX25_PAD_D12__GPIO_4_8:            \
++              __gpio = GPIO_4_8;              \
++              break;                          \
++      case MX25_PAD_D11__GPIO_4_9:            \
++              __gpio = GPIO_4_9;              \
++              break;                          \
++      case MX25_PAD_D10__GPIO_4_10:           \
++              __gpio = GPIO_4_10;             \
++              break;                          \
++      case MX25_PAD_D9__GPIO_4_11:            \
++              __gpio = GPIO_4_11;             \
++              break;                          \
++      case MX25_PAD_D8__GPIO_4_12:            \
++              __gpio = GPIO_4_12;             \
++              break;                          \
++      case MX25_PAD_D7__GPIO_4_13:            \
++              __gpio = GPIO_4_13;             \
++              break;                          \
++      case MX25_PAD_D6__GPIO_4_14:            \
++              __gpio = GPIO_4_14;             \
++              break;                          \
++      case MX25_PAD_D5__GPIO_4_15:            \
++              __gpio = GPIO_4_15;             \
++              break;                          \
++      case MX25_PAD_D4__GPIO_4_16:            \
++              __gpio = GPIO_4_16;             \
++              break;                          \
++      case MX25_PAD_D3__GPIO_4_17:            \
++              __gpio = GPIO_4_17;             \
++              break;                          \
++      case MX25_PAD_D2__GPIO_4_18:            \
++              __gpio = GPIO_4_18;             \
++              break;                          \
++      case MX25_PAD_D1__GPIO_4_19:            \
++              __gpio = GPIO_4_19;             \
++              break;                          \
++      case MX25_PAD_D0__GPIO_4_20:            \
++              __gpio = GPIO_4_20;             \
++              break;                          \
++      case MX25_PAD_CSI_D9__GPIO_4_21:        \
++              __gpio = GPIO_4_21;             \
++              break;                          \
++      case MX25_PAD_UART1_RXD__GPIO_4_22:     \
++              __gpio = GPIO_4_22;             \
++              break;                          \
++      case MX25_PAD_UART1_TXD__GPIO_4_23:     \
++              __gpio = GPIO_4_23;             \
++              break;                          \
++      case MX25_PAD_UART1_RTS__GPIO_4_24:     \
++              __gpio = GPIO_4_24;             \
++              break;                          \
++      case MX25_PAD_UART1_CTS__GPIO_4_25:     \
++              __gpio = GPIO_4_25;             \
++              break;                          \
++      case MX25_PAD_UART2_RXD__GPIO_4_26:     \
++              __gpio = GPIO_4_26;             \
++              break;                          \
++      case MX25_PAD_UART2_TXD__GPIO_4_27:     \
++              __gpio = GPIO_4_27;             \
++              break;                          \
++      case MX25_PAD_UART2_RTS__GPIO_4_28:     \
++              __gpio = GPIO_4_28;             \
++              break;                          \
++      case MX25_PAD_UART2_CTS__GPIO_4_29:     \
++              __gpio = GPIO_4_29;             \
++              break;                          \
++      case MX25_PAD_BOOT_MODE0__GPIO_4_30:    \
++              __gpio = GPIO_4_30;             \
++              break;                          \
++      case MX25_PAD_BOOT_MODE1__GPIO_4_31:    \
++              __gpio = GPIO_4_31;             \
++              break;                          \
++      }                                       \
++      __gpio;                                 \
++})
++#endif
++
++#endif // __ASSEMBLY__
++#endif // __IOMUX_MX25_H__
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-v3.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux-v3.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux-v3.h 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux-v3.h    2009-06-02 18:02:08.000000000 +0200
+@@ -54,7 +54,7 @@ struct pad_desc {
+       unsigned select_input:3;
+ };
+-#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _select_input_ofs, \
++#define IOMUX_PAD(_pad, _func, _pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _select_input_ofs, \
+               _select_input, _pad_ctrl)                               \
+               {                                                       \
+                       .mux_ctrl_ofs     = _mux_ctrl_ofs,              \
+@@ -68,28 +68,28 @@ struct pad_desc {
+ /*
+  * Use to set PAD control
+  */
+-#define PAD_CTL_DRIVE_VOLTAGE_3_3_V   0
+-#define PAD_CTL_DRIVE_VOLTAGE_1_8_V   1
++#define PAD_CTL_DRIVE_VOLTAGE_3_3_V   (0 << 13)
++#define PAD_CTL_DRIVE_VOLTAGE_1_8_V   (1 << 13)
+-#define PAD_CTL_NO_HYSTERESIS         0
+-#define PAD_CTL_HYSTERESIS            1
++#define PAD_CTL_NO_HYSTERESIS         (0 << 8)
++#define PAD_CTL_HYSTERESIS            (1 << 8)
+-#define PAD_CTL_PULL_DISABLED         0x0
+-#define PAD_CTL_PULL_KEEPER           0xa
+-#define PAD_CTL_PULL_DOWN_100K                0xc
+-#define PAD_CTL_PULL_UP_47K           0xd
+-#define PAD_CTL_PULL_UP_100K          0xe
+-#define PAD_CTL_PULL_UP_22K           0xf
+-
+-#define PAD_CTL_OUTPUT_CMOS           0
+-#define PAD_CTL_OUTPUT_OPEN_DRAIN     1
+-
+-#define PAD_CTL_DRIVE_STRENGTH_NORM   0
+-#define PAD_CTL_DRIVE_STRENGTH_HIGH   1
+-#define PAD_CTL_DRIVE_STRENGTH_MAX    2
++#define PAD_CTL_PULL_DISABLED         (0x0 << 4)
++#define PAD_CTL_PULL_KEEPER           (0x8 << 4)
++#define PAD_CTL_PULL_DOWN_100K                (0xc << 4)
++#define PAD_CTL_PULL_UP_47K           (0xd << 4)
++#define PAD_CTL_PULL_UP_100K          (0xe << 4)
++#define PAD_CTL_PULL_UP_22K           (0xf << 4)
++
++#define PAD_CTL_OUTPUT_CMOS           (0 << 3)
++#define PAD_CTL_OUTPUT_OPEN_DRAIN     (1 << 3)
++
++#define PAD_CTL_DRIVE_STRENGTH_NORM   (0 << 1)
++#define PAD_CTL_DRIVE_STRENGTH_HIGH   (1 << 1)
++#define PAD_CTL_DRIVE_STRENGTH_MAX    (2 << 1)
+-#define PAD_CTL_SLEW_RATE_SLOW                0
+-#define PAD_CTL_SLEW_RATE_FAST                1
++#define PAD_CTL_SLEW_RATE_SLOW                (0 << 0)
++#define PAD_CTL_SLEW_RATE_FAST                (1 << 0)
+ /*
+  * setups a single pad:
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/iomux.h    2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/iomux.h       2009-06-02 18:02:08.000000000 +0200
+@@ -24,10 +24,14 @@
+ *  GPIO Module and I/O Multiplexer
+ *  x = 0..3 for reg_A, reg_B, reg_C, reg_D
+ */
++#ifndef CONFIG_MACH_MX25
+ #define VA_GPIO_BASE  IO_ADDRESS(GPIO_BASE_ADDR)
++#endif
+ #define MXC_DDIR(x)    (0x00 + ((x) << 8))
++#ifndef CONFIG_MACH_MX25
+ #define MXC_OCR1(x)    (0x04 + ((x) << 8))
+ #define MXC_OCR2(x)    (0x08 + ((x) << 8))
++#endif
+ #define MXC_ICONFA1(x) (0x0c + ((x) << 8))
+ #define MXC_ICONFA2(x) (0x10 + ((x) << 8))
+ #define MXC_ICONFB1(x) (0x14 + ((x) << 8))
+@@ -96,16 +100,20 @@
+ #ifdef CONFIG_ARCH_MX1
+-#include <mach/iomux-mx1.h>
++# include <mach/iomux-mx1.h>
+ #endif
+ #ifdef CONFIG_ARCH_MX2
+-#include <mach/iomux-mx2x.h>
+-#ifdef CONFIG_MACH_MX21
+-#include <mach/iomux-mx21.h>
+-#endif
+-#ifdef CONFIG_MACH_MX27
+-#include <mach/iomux-mx27.h>
+-#endif
++# ifndef CONFIG_MACH_MX25
++#  include <mach/iomux-mx2x.h>
++#  ifdef CONFIG_MACH_MX21
++#   include <mach/iomux-mx21.h>
++#  endif
++# endif
++# ifdef CONFIG_MACH_MX27
++#  include <mach/iomux-mx27.h>
++# else
++#  include <mach/iomux-mx25.h>
++# endif
+ #endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/irqs.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/irqs.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/irqs.h     2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/irqs.h        2009-06-02 18:02:09.000000000 +0200
+@@ -21,7 +21,11 @@
+ #if defined CONFIG_ARCH_MX1
+ #define MXC_GPIO_IRQS         (32 * 4)
+ #elif defined CONFIG_ARCH_MX2
++#ifndef CONFIG_MACH_MX25
+ #define MXC_GPIO_IRQS         (32 * 6)
++#else
++#define MXC_GPIO_IRQS         (32 * 4)
++#endif
+ #elif defined CONFIG_ARCH_MX3
+ #define MXC_GPIO_IRQS         (32 * 3)
+ #endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/memory.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/memory.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/memory.h   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/memory.h      2009-06-02 18:02:09.000000000 +0200
+@@ -14,12 +14,13 @@
+ #if defined CONFIG_ARCH_MX1
+ #define PHYS_OFFSET           UL(0x08000000)
+ #elif defined CONFIG_ARCH_MX2
+-#ifdef CONFIG_MACH_MX21
++# if defined(CONFIG_MACH_MX21)
+ #define PHYS_OFFSET           UL(0xC0000000)
+-#endif
+-#ifdef CONFIG_MACH_MX27
++# elif defined(CONFIG_MACH_MX27)
+ #define PHYS_OFFSET           UL(0xA0000000)
+-#endif
++# elif defined(CONFIG_MACH_MX25)
++#define PHYS_OFFSET           UL(0x80000000)
++# endif
+ #elif defined CONFIG_ARCH_MX3
+ #define PHYS_OFFSET           UL(0x80000000)
+ #endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx25.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mx25.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx25.h     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mx25.h        2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,482 @@
++/*
++ * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/*!
++ * @file arch-mxc/mx25.h
++ * @brief This file contains register definitions.
++ *
++ * @ingroup MSL_MX25
++ */
++
++#ifndef __ASM_ARCH_MXC_MX25_H__
++#define __ASM_ARCH_MXC_MX25_H__
++
++#ifndef __ASM_ARCH_MXC_HARDWARE_H__
++#error "Do not include directly."
++#endif
++
++#ifdef CONFIG_DEBUG_LL
++#ifdef CONFIG_MACH_TX25
++#include <mach/board-tx25.h>
++#endif
++#endif // CONFIG_DEBUG_LL
++
++/*
++ * MX25 memory map:
++ *
++ * Virt     Phys        Size    What
++ * ---------------------------------------------------------------------------
++ * FC000000 43F00000    1M      AIPS 1
++ * FC100000 50000000    1M      SPBA
++ * FC200000 53F00000    1M      AIPS 2
++ * FC300000 60000000    1M      ROMPATCH (128M)
++ * FC400000 68000000    1M      ASIC (128M)
++ * FC500000 78000000    128K    FBC RAM (IRAM)
++ *          80000000    256M    SDRAM0
++ *          90000000    256M    SDRAM1
++ *          A0000000    128M    CS0 Flash
++ *          A8000000    128M    CS1 Flash
++ *          B0000000    32M     CS2 SRAM
++ *          B2000000    32M     CS3
++ *          B4000000    32M     CS4
++ *          B6000000    32M     CS5
++ * FC520000 B8000000    64K     SDRAM, WEIM, M3IF, EMI controllers
++ * FC530000 BB000000    8K      NFC
++ */
++
++#include <asm/memory.h>
++#define VA(x) _AT(void __force __iomem *,x)
++
++/*
++ * IRAM
++ */
++#define IRAM_BASE_ADDR                UL(0x78000000)  /* internal ram */
++#define IRAM_BASE_ADDR_VIRT   VA(0xFC500000)
++#define IRAM_SIZE             SZ_128K
++
++/*
++ * AIPS 1
++ */
++#define AIPS1_BASE_ADDR               UL(0x43F00000)
++#define AIPS1_BASE_ADDR_VIRT  VA(0xFC000000)
++#define AIPS1_SIZE            SZ_1M
++
++#define MAX_BASE_ADDR         (AIPS1_BASE_ADDR + 0x00004000)
++#define CLKCTL_BASE_ADDR      (AIPS1_BASE_ADDR + 0x00008000)
++#define ETB_SLOT4_BASE_ADDR   (AIPS1_BASE_ADDR + 0x0000C000)
++#define ETB_SLOT5_BASE_ADDR   (AIPS1_BASE_ADDR + 0x00010000)
++#define AAPE_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00014000)
++#define I2C_BASE_ADDR         (AIPS1_BASE_ADDR + 0x00080000)
++#define I2C3_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00084000)
++#define CAN1_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00088000)
++#define CAN3_BASE_ADDR                (AIPS1_BASE_ADDR + 0x0008C000)
++#define UART1_BASE_ADDR               (AIPS1_BASE_ADDR + 0x00090000)
++#define UART2_BASE_ADDR               (AIPS1_BASE_ADDR + 0x00094000)
++#define I2C2_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00098000)
++#define OWIRE_BASE_ADDR               (AIPS1_BASE_ADDR + 0x0009C000)
++#define ATA_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000A0000)
++#define CSPI1_BASE_ADDR               (AIPS1_BASE_ADDR + 0x000A4000)
++#define KPP_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000A8000)
++#define IOMUXC_BASE_ADDR      (AIPS1_BASE_ADDR + 0x000AC000)
++#define AUDMUX_BASE_ADDR      (AIPS1_BASE_ADDR + 0x000B0000)
++#define ECT_A_BASE_ADDR               (AIPS1_BASE_ADDR + 0x000B8000)
++#define ECT_B_BASE_ADDR               (AIPS1_BASE_ADDR + 0x000BC000)
++
++/*
++ * SPBA global module enabled #0
++ */
++#define SPBA0_BASE_ADDR               UL(0x50000000)
++#define SPBA0_BASE_ADDR_VIRT  VA(0xFC100000)
++#define SPBA0_SIZE            SZ_1M
++
++#define CSPI3_BASE_ADDR               (SPBA0_BASE_ADDR + 0x00004000)
++#define UART4_BASE_ADDR               (SPBA0_BASE_ADDR + 0x00008000)
++#define UART3_BASE_ADDR               (SPBA0_BASE_ADDR + 0x0000C000)
++#define CSPI2_BASE_ADDR               (SPBA0_BASE_ADDR + 0x00010000)
++#define SSI2_BASE_ADDR                (SPBA0_BASE_ADDR + 0x00014000)
++#define ESAI_BASE_ADDR                (SPBA0_BASE_ADDR + 0x00018000)
++#define ATA_DMA_BASE_ADDR     (SPBA0_BASE_ADDR + 0x00020000)
++#define SIM1_BASE_ADDR                (SPBA0_BASE_ADDR + 0x00024000)
++#define SIM2_BASE_ADDR                (SPBA0_BASE_ADDR + 0x00028000)
++#define UART5_BASE_ADDR               (SPBA0_BASE_ADDR + 0x0002C000)
++#define TSC_BASE_ADDR         (SPBA0_BASE_ADDR + 0x00030000)
++#define SSI1_BASE_ADDR                (SPBA0_BASE_ADDR + 0x00034000)
++#define FEC_BASE_ADDR         (SPBA0_BASE_ADDR + 0x00038000)
++#define SPBA_CTRL_BASE_ADDR   (SPBA0_BASE_ADDR + 0x0003C000)
++
++/*!
++ * defines for SPBA modules
++ */
++#define SPBA_CSPI3            (0x1 << 2)
++#define SPBA_UART4            (0x2 << 2)
++#define SPBA_UART3            (0x3 << 2)
++#define SPBA_CSPI2            (0x4 << 2)
++#define SPBA_SSI2             (0x5 << 2)
++#define SPBA_ESAI             (0x6 << 2)
++#define SPBA_ATA              (0x8 << 2)
++#define SPBA_SIM1             (0x9 << 2)
++#define SPBA_SIM2             (0xA << 2)
++#define SPBA_UART5            (0xB << 2)
++#define SPBA_ANALOG           (0xC << 2)
++#define SPBA_SSI1             (0xD << 2)
++#define SPBA_FEC              (0xE << 2)
++
++/*!
++ * Defines for modules using static and dynamic DMA channels
++ */
++#define MXC_DMA_CHANNEL_IRAM          30
++#define MXC_DMA_CHANNEL_UART1_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART1_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART2_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART2_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART3_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART3_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART4_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART4_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART5_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_UART5_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_MMC1          MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_SSI1_RX               MXC_DMA_DYNAMIC_CHANNEL
++#ifdef CONFIG_SDMA_IRAM
++#define MXC_DMA_CHANNEL_SSI1_TX               (MXC_DMA_CHANNEL_IRAM + 1)
++#else
++#define MXC_DMA_CHANNEL_SSI1_TX               MXC_DMA_DYNAMIC_CHANNEL
++#endif
++#define MXC_DMA_CHANNEL_SSI2_RX               MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_SSI2_TX               MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI1_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI1_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI2_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI2_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI3_RX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_CSPI3_TX      MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_ATA_RX                MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_ATA_TX                MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_MEMORY                MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_ESAI_RX               MXC_DMA_DYNAMIC_CHANNEL
++#define MXC_DMA_CHANNEL_ESAI_TX               MXC_DMA_DYNAMIC_CHANNEL
++
++/*
++ * AIPS 2
++ */
++#define AIPS2_BASE_ADDR                       UL(0x53F00000)
++#define AIPS2_BASE_ADDR_VIRT          VA(0xFC200000)
++#define AIPS2_SIZE                    SZ_1M
++
++#define CCM_BASE_ADDR                 (AIPS2_BASE_ADDR + 0x00080000)
++#define GPT4_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x00084000)
++#define GPT3_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x00088000)
++#define GPT2_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x0008C000)
++#define GPT1_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x00090000)
++#define EPIT1_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x00094000)
++#define EPIT2_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x00098000)
++#define GPIO4_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x0009C000)
++#define PWM2_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000A0000)
++#define GPIO3_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x000A4000)
++#define PWM3_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000A8000)
++#define SCC_BASE_ADDR                 (AIPS2_BASE_ADDR + 0x000AC000)
++#define RNGD_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000B0000)
++#define MMC_SDHC1_BASE_ADDR           (AIPS2_BASE_ADDR + 0x000B4000)
++#define MMC_SDHC2_BASE_ADDR           (AIPS2_BASE_ADDR + 0x000B8000)
++#define LCDC_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000BC000)
++#define SLCDC_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x000C0000)
++#define PWM4_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000C8000)
++#define GPIO1_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x000CC000)
++#define GPIO2_BASE_ADDR                       (AIPS2_BASE_ADDR + 0x000D0000)
++#define SDMA_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000D4000)
++#define WDOG_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000DC000)
++#define PWM1_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000E0000)
++#define RTIC_BASE_ADDR                        (AIPS2_BASE_ADDR + 0x000EC000)
++#define IIM_BASE_ADDR                 (AIPS2_BASE_ADDR + 0x000F0000)
++#define USBOTG_BASE_ADDR              (AIPS2_BASE_ADDR + 0x000F4000)
++#define OTG_BASE_ADDR                 USBOTG_BASE_ADDR
++#define CSI_BASE_ADDR                 (AIPS2_BASE_ADDR + 0x000F8000)
++#define DRYICE_BASE_ADDR              (AIPS2_BASE_ADDR + 0x000FC000)
++
++/*
++ * ROMP and ASIC
++ */
++#define ROMP_BASE_ADDR                        UL(0x60000000)
++#define ROMP_BASE_ADDR_VIRT           VA(0xFC300000)
++#define ROMP_SIZE                     SZ_1M
++
++#define ASIC_BASE_ADDR                        UL(0x68000000)
++#define ASIC_BASE_ADDR_VIRT           VA(0xFC400000)
++#define ASIC_SIZE                     SZ_1M
++#define AVIC_BASE_ADDR                        ASIC_BASE_ADDR
++#define AVIC_BASE_ADDR_VIRT           ASIC_BASE_ADDR_VIRT
++#define AVIC_SIZE                     ASIC_SIZE
++
++/*
++ * SDRAM, WEIM, M3IF, EMI controllers
++ */
++#define X_MEMC_BASE_ADDR              UL(0xB8000000)
++#define X_MEMC_BASE_ADDR_VIRT         VA(0xFC520000)
++#define X_MEMC_SIZE                   SZ_64K
++
++#define SDRAMC_BASE_ADDR              (X_MEMC_BASE_ADDR + 0x1000)
++#define WEIM_BASE_ADDR                        (X_MEMC_BASE_ADDR + 0x2000)
++#define M3IF_BASE_ADDR                        (X_MEMC_BASE_ADDR + 0x3000)
++#define EMI_CTL_BASE_ADDR             (X_MEMC_BASE_ADDR + 0x4000)
++
++/*
++ * NFC controller
++ */
++#define NFC_BASE_ADDR                 UL(0xBB000000)
++#define NFC_BASE_ADDR_VIRT            VA(0xFC530000)
++#define NFC_SIZE                      SZ_8K
++
++/*
++ * Memory regions and CS
++ */
++#define CSD0_BASE_ADDR                        UL(0x80000000)
++#define CSD1_BASE_ADDR                        UL(0x90000000)
++
++#define SDRAM_BASE_ADDR                       CSD0_BASE_ADDR
++
++#define CS0_BASE_ADDR                 UL(0xA0000000)
++#define CS1_BASE_ADDR                 UL(0xA8000000)
++#define CS2_BASE_ADDR                 UL(0xB0000000)
++#define CS3_BASE_ADDR                 UL(0xB2000000)
++#define CS4_BASE_ADDR                 UL(0xB4000000)
++#define CS4_SIZE                      SZ_32M
++#define CS5_BASE_ADDR                 UL(0xB6000000)
++#define CS5_SIZE                      SZ_32M
++
++/*!
++ * This macro defines the physical to virtual address mapping for all the
++ * peripheral modules. It is used by passing in the physical address as x
++ * and returning the virtual address. If the physical address is not mapped,
++ * it returns 0
++ */
++#define IO_ADDRESS(x)                                                                                 \
++      VA((((x) >= AIPS1_BASE_ADDR) && ((x) < (AIPS1_BASE_ADDR + AIPS1_SIZE))) ? AIPS1_IO_ADDRESS(x):  \
++      (((x) >= SPBA0_BASE_ADDR) && ((x) < (SPBA0_BASE_ADDR + SPBA0_SIZE))) ? SPBA0_IO_ADDRESS(x):     \
++      (((x) >= AIPS2_BASE_ADDR) && ((x) < (AIPS2_BASE_ADDR + AIPS2_SIZE))) ? AIPS2_IO_ADDRESS(x):     \
++      (((x) >= ROMP_BASE_ADDR) && ((x) < (ROMP_BASE_ADDR + ROMP_SIZE))) ? ROMP_IO_ADDRESS(x):         \
++      (((x) >= ASIC_BASE_ADDR) && ((x) < (ASIC_BASE_ADDR + AVIC_SIZE))) ? ASIC_IO_ADDRESS(x):         \
++      (((x) >= IRAM_BASE_ADDR) && ((x) < (IRAM_BASE_ADDR + IRAM_SIZE))) ? IRAM_IO_ADDRESS(x):         \
++      (((x) >= X_MEMC_BASE_ADDR) && ((x) < (X_MEMC_BASE_ADDR + X_MEMC_SIZE))) ? X_MEMC_IO_ADDRESS(x): \
++      (((x) >= NFC_BASE_ADDR) && ((x) < (NFC_BASE_ADDR + NFC_SIZE))) ? NFC_IO_ADDRESS(x):             \
++      0)
++
++#define MXC_VADDR_RANGE(v,n)                          \
++      (((v)) >= n##_BASE_ADDR_VIRT) &&                \
++      (((v)) < n##_BASE_ADDR_VIRT + n##_SIZE) ?       \
++      ((v)-n##_BASE_ADDR_VIRT + n##_BASE_ADDR) :
++
++#define MXC_PHYS_ADDRESS(v)                   \
++      UL(MXC_VADDR_RANGE(v,AIPS1)             \
++      MXC_VADDR_RANGE(v,AIPS2)                \
++      MXC_VADDR_RANGE(v,SPBA0)                \
++      MXC_VADDR_RANGE(v,ROMP)                 \
++      MXC_VADDR_RANGE(v,ASIC)                 \
++      MXC_VADDR_RANGE(v,IRAM)                 \
++      MXC_VADDR_RANGE(v,X_MEMC)               \
++      MXC_VADDR_RANGE(v,NFC)                  \
++      0)
++
++#define GPIO_BASE_ADDR(port)                          \
++      ((port == 1 ? GPIO1_BASE_ADDR :                 \
++        (port == 2 ? GPIO2_BASE_ADDR :                \
++         (port == 3 ? GPIO3_BASE_ADDR :               \
++          (port == 4 ? GPIO4_BASE_ADDR : 0)))))
++
++/*
++ * define the address mapping macros: in physical address order
++ */
++
++#define AIPS1_IO_ADDRESS(x)  \
++      (((x) - AIPS1_BASE_ADDR) + AIPS1_BASE_ADDR_VIRT)
++
++#define SPBA0_IO_ADDRESS(x)  \
++      (((x) - SPBA0_BASE_ADDR) + SPBA0_BASE_ADDR_VIRT)
++
++#define AIPS2_IO_ADDRESS(x)  \
++      (((x) - AIPS2_BASE_ADDR) + AIPS2_BASE_ADDR_VIRT)
++
++#define ROMP_IO_ADDRESS(x)  \
++      (((x) - ROMP_BASE_ADDR) + ROMP_BASE_ADDR_VIRT)
++
++#define ASIC_IO_ADDRESS(x)  \
++      (((x) - ASIC_BASE_ADDR) + ASIC_BASE_ADDR_VIRT)
++
++/* for entry-macro.S */
++#define AVIC_IO_ADDRESS(x)    ASIC_IO_ADDRESS(x)
++
++#define IRAM_IO_ADDRESS(x)  \
++      (((x) - IRAM_BASE_ADDR) + IRAM_BASE_ADDR_VIRT)
++
++#define X_MEMC_IO_ADDRESS(x)  \
++      (((x) - X_MEMC_BASE_ADDR) + X_MEMC_BASE_ADDR_VIRT)
++
++#define NFC_IO_ADDRESS(x)  \
++      (((x) - NFC_BASE_ADDR) + NFC_BASE_ADDR_VIRT)
++
++/*
++ * DMA request assignments
++ */
++#define DMA_REQ_EXTREQ0                        0
++#define DMA_REQ_CCM                    1
++#define DMA_REQ_ATA_TX_END             2
++#define DMA_REQ_ATA_TX                         3
++#define DMA_REQ_ATA_RX                         4
++#define DMA_REQ_CSPI2_RX               6
++#define DMA_REQ_CSPI2_TX               7
++#define DMA_REQ_CSPI1_RX               8
++#define DMA_REQ_CSPI1_TX               9
++#define DMA_REQ_UART3_RX              10
++#define DMA_REQ_UART3_TX              11
++#define DMA_REQ_UART4_RX              12
++#define DMA_REQ_UART4_TX              13
++#define DMA_REQ_EXTREQ1                       14
++#define DMA_REQ_EXTREQ2                       15
++#define DMA_REQ_UART2_RX              16
++#define DMA_REQ_UART2_TX              17
++#define DMA_REQ_UART1_RX              18
++#define DMA_REQ_UART1_TX              19
++#define DMA_REQ_SSI2_RX1              22
++#define DMA_REQ_SSI2_TX1              23
++#define DMA_REQ_SSI2_RX0              24
++#define DMA_REQ_SSI2_TX0              25
++#define DMA_REQ_SSI1_RX1              26
++#define DMA_REQ_SSI1_TX1              27
++#define DMA_REQ_SSI1_RX0              28
++#define DMA_REQ_SSI1_TX0              29
++#define DMA_REQ_NFC                   30
++#define DMA_REQ_ECT                   31
++#define DMA_REQ_ESAI_RX                       32
++#define DMA_REQ_ESAI_TX                       33
++#define DMA_REQ_CSPI3_RX              34
++#define DMA_REQ_CSPI3_TX              35
++#define DMA_REQ_SIM2_RX                       36
++#define DMA_REQ_SIM2_TX                       37
++#define DMA_REQ_SIM1_RX                       38
++#define DMA_REQ_SIM1_TX                       39
++#define DMA_REQ_TSC_GCQ                       44
++#define DMA_REQ_TSC_TCQ                       45
++#define DMA_REQ_UART5_RX              46
++#define DMA_REQ_UART5_TX              47
++
++/*
++ *  Interrupt numbers
++ */
++#define MXC_INT_CSPI3                  0
++#define MXC_INT_GPT4                   1
++#define MXC_INT_OWIRE                  2
++#define MXC_INT_I2C                    3
++#define MXC_INT_I2C2                   4
++#define MXC_INT_UART4                  5
++#define MXC_INT_RTIC                   6
++#define MXC_INT_ESAI                   7
++#define MXC_INT_SDHC2                  8
++#define MXC_INT_SDHC1                  9
++#define MXC_INT_I2C3                  10
++#define MXC_INT_SSI2                  11
++#define MXC_INT_SSI1                  12
++#define MXC_INT_CSPI2                 13
++#define MXC_INT_CSPI1                 14
++#define MXC_INT_ATA                   15
++#define MXC_INT_GPIO3                 16
++#define MXC_INT_CSI                   17
++#define MXC_INT_UART3                 18
++#define MXC_INT_IIM                   19
++#define MXC_INT_SIM1                  20
++#define MXC_INT_SIM2                  21
++#define MXC_INT_RNGD                  22
++#define MXC_INT_GPIO4                 23
++#define MXC_INT_KPP                   24
++#define MXC_INT_DRYICE_RTC            25
++#define MXC_INT_PWM                   26
++#define MXC_INT_EPIT2                 27
++#define MXC_INT_EPIT1                 28
++#define MXC_INT_GPT3                  29
++#define MXC_INT_POWER_FAIL            30
++#define MXC_INT_CRM                   31
++#define MXC_INT_UART2                 32
++#define MXC_INT_NANDFC                        33
++#define MXC_INT_SDMA                  34
++#define MXC_INT_USB_HTG                       35
++#define MXC_INT_PWM2                  36
++#define MXC_INT_USB_OTG                       37
++#define MXC_INT_SLCDC                 38
++#define MXC_INT_LCDC                  39
++#define MXC_INT_UART5                 40
++#define MXC_INT_PWM3                  41
++#define MXC_INT_PWM4                  42
++#define MXC_INT_CAN1                  43
++#define MXC_INT_CAN2                  44
++#define MXC_INT_UART1                 45
++#define MXC_INT_TSC                   46
++#define MXC_INT_ECT                   48
++#define MXC_INT_SCC_SCM                       49
++#define MXC_INT_SCC_SMN                       50
++#define MXC_INT_GPIO2                 51
++#define MXC_INT_GPIO1                 52
++#define MXC_INT_GPT2                  53
++#define MXC_INT_GPT1                  54
++#define MXC_INT_WDOG                  55
++#define MXC_INT_DRYICE                        56
++#define MXC_INT_FEC                   57
++#define MXC_INT_EXT_INT5              58
++#define MXC_INT_EXT_INT4              59
++#define MXC_INT_EXT_INT3              60
++#define MXC_INT_EXT_INT2              61
++#define MXC_INT_EXT_INT1              62
++#define MXC_INT_EXT_INT0              63
++
++#define MXC_INT_GPT                   MXC_INT_GPT1
++
++/* silicon revisions specific to i.MX25 */
++#define CHIP_REV_1_0                  0x00
++#define CHIP_REV_1_1                  0x01
++
++/* gpio and gpio based interrupt handling */
++#define GPIO_DR                               0x00
++#define GPIO_GDIR                     0x04
++#define GPIO_PSR                      0x08
++#define GPIO_ICR1                     0x0C
++#define GPIO_ICR2                     0x10
++#define GPIO_IMR                      0x14
++#define GPIO_ISR                      0x18
++#define GPIO_INT_LOW_LEV              0x0
++#define GPIO_INT_HIGH_LEV             0x1
++#define GPIO_INT_RISE_EDGE            0x2
++#define GPIO_INT_FALL_EDGE            0x3
++#define GPIO_INT_NONE                 0x4
++
++/* Mandatory defines used globally */
++
++/* this CPU supports up to 96 GPIOs */
++#define ARCH_NR_GPIOS                 128
++
++#define MXC_TIMER_GPT1                        1
++#define MXC_TIMER_GPT2                        2
++#define MXC_TIMER_GPT3                        3
++#define MXC_TIMER_GPT4                        4
++
++/*!
++ * NFMS bit in RCSR register for pagesize of nandflash
++ */
++#define NFMS_REG                      IO_ADDRESS(CCM_BASE_ADDR + 0x28)
++#define NFMS_NF_DWIDTH                        14
++#define NFMS_NF_PG_SZ                 8
++
++#if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)
++#include <linux/io.h>
++
++extern int mx25_revision(void);
++
++#endif
++
++#endif /* __ASM_ARCH_MXC_MX25_H__ */
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx2x.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mx2x.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mx2x.h     2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mx2x.h        2009-06-02 18:02:11.000000000 +0200
+@@ -79,7 +79,7 @@
+  * This macro defines the physical to virtual address mapping for all the
+  * peripheral modules. It is used by passing in the physical address as x
+  * and returning the virtual address. If the physical address is not mapped,
+- * it returns 0xDEADBEEF
++ * it returns 0
+  */
+ #define IO_ADDRESS(x)   \
+       (void __force __iomem *) \
+@@ -88,7 +88,7 @@
+       ((x >= SAHB1_BASE_ADDR) && (x < (SAHB1_BASE_ADDR + SAHB1_SIZE))) ? \
+               SAHB1_IO_ADDRESS(x) : \
+       ((x >= X_MEMC_BASE_ADDR) && (x < (X_MEMC_BASE_ADDR + X_MEMC_SIZE))) ? \
+-              X_MEMC_IO_ADDRESS(x) : 0xDEADBEEF)
++              X_MEMC_IO_ADDRESS(x) : 0)
+ /* define the address mapping macros: in physical address order */
+ #define AIPI_IO_ADDRESS(x)  \
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mxc.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mxc.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/mxc.h      2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/mxc.h 2009-06-02 18:02:12.000000000 +0200
+@@ -27,6 +27,7 @@
+ #define MXC_CPU_MX1           1
+ #define MXC_CPU_MX21          21
+ #define MXC_CPU_MX27          27
++#define MXC_CPU_MX25          25
+ #define MXC_CPU_MX31          31
+ #define MXC_CPU_MX35          35
+@@ -70,6 +71,18 @@ extern unsigned int __mxc_cpu_type;
+ # define cpu_is_mx27()                (0)
+ #endif
++#ifdef CONFIG_MACH_MX25
++# ifdef mxc_cpu_type
++#  undef mxc_cpu_type
++#  define mxc_cpu_type __mxc_cpu_type
++# else
++#  define mxc_cpu_type MXC_CPU_MX25
++# endif
++# define cpu_is_mx25()                (mxc_cpu_type == MXC_CPU_MX25)
++#else
++# define cpu_is_mx25()                (0)
++#endif
++
+ #ifdef CONFIG_ARCH_MX31
+ # ifdef mxc_cpu_type
+ #  undef mxc_cpu_type
+@@ -101,6 +114,6 @@ extern unsigned int __mxc_cpu_type;
+ #endif
+ #define cpu_is_mx3()  (cpu_is_mx31() || cpu_is_mx35())
+-#define cpu_is_mx2()  (cpu_is_mx21() || cpu_is_mx27())
++#define cpu_is_mx2()  (cpu_is_mx21() || cpu_is_mx25() || cpu_is_mx27())
+ #endif /*  __ASM_ARCH_MXC_H__ */
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/sdma.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/sdma.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/sdma.h     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/sdma.h        2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,504 @@
++
++/*
++ * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#ifndef __ASM_ARCH_MXC_SDMA_H__
++#define __ASM_ARCH_MXC_SDMA_H__
++
++/*!
++ * @defgroup SDMA Smart Direct Memory Access (SDMA) Driver
++ */
++
++/*!
++ * @file arch-mxc/sdma.h
++ *
++ * @brief This file contains the SDMA API declarations.
++ *
++ * SDMA is responsible on moving data between peripherals and memories (MCU, EMI and DSP).
++ *
++ * @ingroup SDMA
++ */
++
++#include <stdarg.h>
++#include <linux/interrupt.h>
++#include <mach/dma.h>
++#include <mach/hardware.h>
++
++/*!
++ * This defines maximum DMA address
++ */
++#define MAX_DMA_ADDRESS 0xffffffff
++
++/*!
++ * This defines maximum number of DMA channels
++ */
++#ifdef CONFIG_MXC_SDMA_API
++#define MAX_DMA_CHANNELS 32
++#define MAX_BD_NUMBER    16
++#define MXC_SDMA_DEFAULT_PRIORITY 1
++#define MXC_SDMA_MIN_PRIORITY 1
++#define MXC_SDMA_MAX_PRIORITY 7
++#else
++#define MAX_DMA_CHANNELS 0
++#endif
++
++#define MXC_FIFO_MEM_DEST_FIXED   0x1
++#define MXC_FIFO_MEM_SRC_FIXED    0x2
++/*!
++ * This enumerates  transfer types
++ */
++typedef enum {
++      emi_2_per = 0,          /*!< EMI memory to peripheral */
++      emi_2_int,              /*!< EMI memory to internal RAM */
++      emi_2_emi,              /*!< EMI memory to EMI memory */
++      emi_2_dsp,              /*!< EMI memory to DSP memory */
++      per_2_int,              /*!< Peripheral to internal RAM */
++      per_2_emi,              /*!< Peripheral to internal EMI memory */
++      per_2_dsp,              /*!< Peripheral to DSP memory */
++      per_2_per,              /*!< Peripheral to Peripheral */
++      int_2_per,              /*!< Internal RAM to peripheral */
++      int_2_int,              /*!< Internal RAM to Internal RAM */
++      int_2_emi,              /*!< Internal RAM to EMI memory */
++      int_2_dsp,              /*!< Internal RAM to DSP memory */
++      dsp_2_per,              /*!< DSP memory to peripheral */
++      dsp_2_int,              /*!< DSP memory to internal RAM */
++      dsp_2_emi,              /*!< DSP memory to EMI memory */
++      dsp_2_dsp,              /*!< DSP memory to DSP memory */
++      emi_2_dsp_loop,         /*!< EMI memory to DSP memory loopback */
++      dsp_2_emi_loop,         /*!< DSP memory to EMI memory loopback */
++      dvfs_pll,               /*!< DVFS script with PLL change       */
++      dvfs_pdr                /*!< DVFS script without PLL change    */
++} sdma_transferT;
++
++/*!
++ * This enumerates peripheral types
++ */
++typedef enum {
++      SSI,                    /*!< MCU domain SSI */
++      SSI_SP,                 /*!< Shared SSI */
++      MMC,                    /*!< MMC */
++      SDHC,                   /*!< SDHC */
++      UART,                   /*!< MCU domain UART */
++      UART_SP,                /*!< Shared UART */
++      FIRI,                   /*!< FIRI */
++      CSPI,                   /*!< MCU domain CSPI */
++      CSPI_SP,                /*!< Shared CSPI */
++      SIM,                    /*!< SIM */
++      ATA,                    /*!< ATA */
++      CCM,                    /*!< CCM */
++      EXT,                    /*!< External peripheral */
++      MSHC,                   /*!< Memory Stick Host Controller */
++      MSHC_SP,                /*!< Shared Memory Stick Host Controller */
++      DSP,                    /*!< DSP */
++      MEMORY,                 /*!< Memory */
++      FIFO_MEMORY,            /*!< FIFO type Memory */
++      SPDIF,                  /*!< SPDIF */
++      IPU_MEMORY,             /*!< IPU Memory */
++      ASRC,                   /*!< ASRC */
++      ESAI,                   /*!< ESAI */
++} sdma_periphT;
++
++#ifndef TRANSFER_32BIT
++/*!
++ * This defines SDMA access data size
++ */
++#define TRANSFER_32BIT      0x00
++#define TRANSFER_8BIT       0x01
++#define TRANSFER_16BIT      0x02
++#define TRANSFER_24BIT      0x03
++
++#endif
++
++/*!
++ * This defines maximum device name length passed during mxc_request_dma().
++ */
++#define MAX_DEVNAME_LENGTH 32
++
++/*!
++ * This defines SDMA interrupt callback function prototype.
++ */
++typedef void (*dma_callback_t) (void *arg);
++
++/*!
++ * Structure containing sdma channel parameters.
++ */
++typedef struct {
++      __u32 watermark_level;  /*!< Lower/upper threshold that
++                               *   triggers SDMA event
++                               */
++      __u32 per_address;      /*!< Peripheral source/destination
++                               *   physical address
++                               */
++      sdma_periphT peripheral_type;   /*!< Peripheral type */
++      sdma_transferT transfer_type;   /*!< Transfer type   */
++      int event_id;           /*!< Event number,
++                               *   needed by all channels
++                               *   that started by peripherals dma
++                               *   request (per_2_*,*_2_per)
++                               *   Not used for memory and DSP
++                               *   transfers.
++                               */
++      int event_id2;          /*!< Second event number,
++                               *   used in ATA scripts only.
++                               */
++      int bd_number;          /*!< Buffer descriptors number.
++                               *   If not set, single buffer
++                               *   descriptor will be used.
++                               */
++      dma_callback_t callback;        /*!   callback function            */
++      void *arg;              /*!   callback argument            */
++      unsigned long word_size:8;      /*!< SDMA data access word size    */
++} dma_channel_params;
++
++/*!
++ * Structure containing sdma request  parameters.
++ */
++typedef struct {
++      /*!   physical source memory address        */
++      __u8 *sourceAddr;
++      /*!   physical destination memory address   */
++      __u8 *destAddr;
++      /*!   amount of data to transfer,
++       * updated during mxc_dma_get_config
++       */
++      __u16 count;
++      /*!< DONE bit of the buffer descriptor,
++       * updated during mxc_dma_get_config
++       * 0 - means the BD is done and closed by SDMA
++       * 1 - means the BD is still being processed by SDMA
++       */
++      int bd_done;
++      /*!< CONT bit of the buffer descriptor,
++       * set it if full multi-buffer descriptor mechanism
++       * required.
++       */
++      int bd_cont;
++      /*!< ERROR bit of the buffer descriptor,
++       * updated during mxc_dma_get_config.
++       * If it is set - there was an error during BD processing.
++       */
++      int bd_error;
++} dma_request_t;
++
++/*!
++ * Structure containing sdma request  parameters.
++ */
++typedef struct {
++      /*! address of ap_2_ap script */
++      int mxc_sdma_ap_2_ap_addr;
++      /*! address of ap_2_bp script */
++      int mxc_sdma_ap_2_bp_addr;
++      /*! address of ap_2_ap_fixed script */
++      int mxc_sdma_ap_2_ap_fixed_addr;
++      /*! address of bp_2_ap script */
++      int mxc_sdma_bp_2_ap_addr;
++      /*! address of loopback_on_dsp_side script */
++      int mxc_sdma_loopback_on_dsp_side_addr;
++      /*! address of mcu_interrupt_only script */
++      int mxc_sdma_mcu_interrupt_only_addr;
++
++      /*! address of firi_2_per script */
++      int mxc_sdma_firi_2_per_addr;
++      /*! address of firi_2_mcu script */
++      int mxc_sdma_firi_2_mcu_addr;
++      /*! address of per_2_firi script */
++      int mxc_sdma_per_2_firi_addr;
++      /*! address of mcu_2_firi script */
++      int mxc_sdma_mcu_2_firi_addr;
++
++      /*! address of uart_2_per script */
++      int mxc_sdma_uart_2_per_addr;
++      /*! address of uart_2_mcu script */
++      int mxc_sdma_uart_2_mcu_addr;
++      /*! address of per_2_app script */
++      int mxc_sdma_per_2_app_addr;
++      /*! address of mcu_2_app script */
++      int mxc_sdma_mcu_2_app_addr;
++      /*! address of per_2_per script */
++      int mxc_sdma_per_2_per_addr;
++
++      /*! address of uartsh_2_per script */
++      int mxc_sdma_uartsh_2_per_addr;
++      /*! address of uartsh_2_mcu script */
++      int mxc_sdma_uartsh_2_mcu_addr;
++      /*! address of per_2_shp script */
++      int mxc_sdma_per_2_shp_addr;
++      /*! address of mcu_2_shp script */
++      int mxc_sdma_mcu_2_shp_addr;
++
++      /*! address of ata_2_mcu script */
++      int mxc_sdma_ata_2_mcu_addr;
++      /*! address of mcu_2_ata script */
++      int mxc_sdma_mcu_2_ata_addr;
++
++      /*! address of app_2_per script */
++      int mxc_sdma_app_2_per_addr;
++      /*! address of app_2_mcu script */
++      int mxc_sdma_app_2_mcu_addr;
++      /*! address of shp_2_per script */
++      int mxc_sdma_shp_2_per_addr;
++      /*! address of shp_2_mcu script */
++      int mxc_sdma_shp_2_mcu_addr;
++
++      /*! address of mshc_2_mcu script */
++      int mxc_sdma_mshc_2_mcu_addr;
++      /*! address of mcu_2_mshc script */
++      int mxc_sdma_mcu_2_mshc_addr;
++
++      /*! address of spdif_2_mcu script */
++      int mxc_sdma_spdif_2_mcu_addr;
++      /*! address of mcu_2_spdif script */
++      int mxc_sdma_mcu_2_spdif_addr;
++
++      /*! address of asrc_2_mcu script */
++      int mxc_sdma_asrc_2_mcu_addr;
++
++      /*! address of ext_mem_2_ipu script */
++      int mxc_sdma_ext_mem_2_ipu_addr;
++
++      /*! address of descrambler script */
++      int mxc_sdma_descrambler_addr;
++
++      /*! address of dptc_dvfs script */
++      int mxc_sdma_dptc_dvfs_addr;
++
++      int mxc_sdma_utra_addr;
++
++      /*! address where ram code starts */
++      int mxc_sdma_ram_code_start_addr;
++      /*! size of the ram code */
++      int mxc_sdma_ram_code_size;
++      /*! RAM image address */
++      unsigned short *mxc_sdma_start_addr;
++} sdma_script_start_addrs;
++
++/*! Structure to store the initialized dma_channel parameters */
++typedef struct mxc_sdma_channel_params {
++      /*! Channel params */
++      dma_channel_params chnl_params;
++      /*! Channel type (static channel number or dynamic channel) */
++      unsigned int channel_num;
++      /*! Channel priority [0x1(lowest) - 0x7(highest)] */
++      unsigned int chnl_priority;
++} mxc_sdma_channel_params_t;
++
++/*! Private SDMA data structure */
++typedef struct mxc_dma_channel_private {
++      /*! ID of the buffer that was processed */
++      unsigned int buf_tail;
++      /*! Tasklet for the channel */
++      struct tasklet_struct chnl_tasklet;
++      /*! Flag indicates if interrupt is required after every BD transfer */
++      int intr_after_every_bd;
++} mxc_dma_channel_private_t;
++
++/*!
++ * Setup channel according to parameters.
++ * Must be called once after mxc_request_dma()
++ *
++ * @param   channel           channel number
++ * @param   p                 channel parameters pointer
++ * @return  0 on success, error code on fail
++ */
++int mxc_dma_setup_channel(int channel, dma_channel_params * p);
++
++/*!
++ * Setup the channel priority. This can be used to change the default priority
++ * for the channel.
++ *
++ * @param   channel           channel number
++ * @param   priority          priority to be set for the channel
++ *
++ * @return  0 on success, error code on failure
++ */
++int mxc_dma_set_channel_priority(unsigned int channel, unsigned int priority);
++
++/*!
++ * Allocates dma channel.
++ * If channel's value is 0, then the function allocates a free channel
++ * dynamically and sets its value to channel.
++ * Else allocates requested channel if it is free.
++ * If the channel is busy or no free channels (in dynamic allocation) -EBUSY returned.
++ *
++ * @param   channel           pointer to channel number
++ * @param   devicename        device name
++ * @return  0 on success, error code on fail
++ */
++int mxc_request_dma(int *channel, const char *devicename);
++
++/*!
++ * Configures request parameters. Can be called multiple times after
++ * mxc_request_dma() and mxc_dma_setup_channel().
++ *
++ *
++ * @param   channel           channel number
++ * @param   p                 request parameters pointer
++ * @param   bd_index          index of buffer descriptor to set
++ * @return  0 on success, error code on fail
++ */
++/* int mxc_dma_set_config(int channel, dma_request_t *p, int bd_index); */
++int mxc_dma_set_config(int channel, dma_request_t * p, int bd_index);
++
++/*!
++ * Returns request parameters.
++ *
++ * @param   channel           channel number
++ * @param   p                 request parameters pointer
++ * @param   bd_index          index of buffer descriptor to get
++ * @return  0 on success, error code on fail
++ */
++/* int mxc_dma_get_config(int channel, dma_request_t *p, int bd_index); */
++int mxc_dma_get_config(int channel, dma_request_t * p, int bd_index);
++
++/*!
++ * This function is used by MXC IPC's write_ex2. It passes the a pointer to the
++ * data control structure to iapi_write_ipcv2()
++ *
++ * @param channel  SDMA channel number
++ * @param ctrl_ptr Data Control structure pointer
++ */
++int mxc_sdma_write_ipcv2(int channel, void *ctrl_ptr);
++
++/*!
++ * This function is used by MXC IPC's read_ex2. It passes the a pointer to the
++ * data control structure to iapi_read_ipcv2()
++ *
++ * @param channel   SDMA channel number
++ * @param ctrl_ptr  Data Control structure pointer
++ */
++int mxc_sdma_read_ipcv2(int channel, void *ctrl_ptr);
++
++/*!
++ * Starts dma channel.
++ *
++ * @param   channel           channel number
++ */
++int mxc_dma_start(int channel);
++
++/*!
++ * Stops dma channel.
++ *
++ * @param   channel           channel number
++ */
++int mxc_dma_stop(int channel);
++
++/*!
++ * Frees dma channel.
++ *
++ * @param   channel           channel number
++ */
++void mxc_free_dma(int channel);
++
++/*!
++ * Sets callback function. Used with standard dma api
++ *  for supporting interrupts
++ *
++ * @param   channel           channel number
++ * @param   callback          callback function pointer
++ * @param   arg               argument for callback function
++ */
++void mxc_dma_set_callback(int channel, dma_callback_t callback, void *arg);
++
++/*!
++ * Allocates uncachable buffer. Uses hash table.
++ *
++ * @param   size    size of allocated buffer
++ * @return  pointer to buffer
++ */
++void *sdma_malloc(size_t size);
++
++#ifdef CONFIG_SDMA_IRAM
++/*!
++ * Allocates uncachable buffer from IRAM..
++ *
++ * @param   size    size of allocated buffer
++ * @return  pointer to buffer
++ */
++void *sdma_iram_malloc(size_t size);
++#endif                                /*CONFIG_SDMA_IRAM */
++
++/*!
++ * Frees uncachable buffer. Uses hash table.
++ */
++void sdma_free(void *buf);
++
++/*!
++ * Converts virtual to physical address. Uses hash table.
++ *
++ * @param   buf  virtual address pointer
++ * @return  physical address value
++ */
++unsigned long sdma_virt_to_phys(void *buf);
++
++/*!
++ * Converts physical to virtual address. Uses hash table.
++ *
++ * @param   buf  physical address value
++ * @return  virtual address pointer
++ */
++void *sdma_phys_to_virt(unsigned long buf);
++
++/*!
++ * Configures the BD_INTR bit on a buffer descriptor parameters.
++ *
++ *
++ * @param   channel           channel number
++ * @param   bd_index          index of buffer descriptor to set
++ * @param   bd_intr           flag to set or clear the BD_INTR bit
++ */
++void mxc_dma_set_bd_intr(int channel, int bd_index, int bd_intr);
++
++/*!
++ * Gets the BD_INTR bit on a buffer descriptor.
++ *
++ *
++ * @param   channel           channel number
++ * @param   bd_index          index of buffer descriptor to set
++ *
++ * @return returns the BD_INTR bit status
++ */
++int mxc_dma_get_bd_intr(int channel, int bd_index);
++
++/*!
++ * Stop the current transfer
++ *
++ * @param   channel           channel number
++ * @param   buffer_number     number of buffers (beginning with 0),
++ *                            whose done bits should be reset to 0
++ */
++int mxc_dma_reset(int channel, int buffer_number);
++
++/*!
++ * This functions Returns the SDMA paramaters associated for a module
++ *
++ * @param channel_id the ID of the module requesting DMA
++ * @return returns the sdma parameters structure for the device
++ */
++mxc_sdma_channel_params_t *mxc_sdma_get_channel_params(mxc_dma_device_t
++                                                     channel_id);
++
++/*!
++ * This functions marks the SDMA channels that are statically allocated
++ *
++ * @param chnl the channel array used to store channel information
++ */
++void mxc_get_static_channels(mxc_dma_channel_t * chnl);
++
++/*!
++ * Initializes SDMA driver
++ */
++int __init sdma_init(void);
++
++#define DEFAULT_ERR     1
++
++#endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/spba.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/spba.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/spba.h     1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/spba.h        2009-06-02 18:02:13.000000000 +0200
+@@ -0,0 +1,66 @@
++
++/*
++ * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/*!
++ * @defgroup SPBA Shared Peripheral Bus Arbiter (SPBA)
++ * @ingroup MSL_MX31 MSL_MX35 MSL_MX37 MSL_MX51 MSL_MXC91321
++ */
++
++/*!
++ * @file arch-mxc/spba.h
++ * @brief This file contains the Shared Peripheral Bus Arbiter (spba) API.
++ *
++ * @ingroup SPBA
++ */
++
++#ifndef __ASM_ARCH_MXC_SPBA_H__
++#define __ASM_ARCH_MXC_SPBA_H__
++
++#ifdef __KERNEL__
++
++#define MXC_SPBA_RAR_MASK       0x7
++
++/*!
++ * Defines three SPBA masters: A - ARM, C - SDMA (no master B for MX31)
++ */
++enum spba_masters {
++      SPBA_MASTER_A = 1,
++      SPBA_MASTER_B = 2,
++      SPBA_MASTER_C = 4,
++};
++
++/*!
++ * This function allows the three masters (A, B, C) to take ownership of a
++ * shared peripheral.
++ *
++ * @param  mod          specified module as defined in \b enum \b #spba_module
++ * @param  master       one of more (or-ed together) masters as defined in \b enum \b #spba_masters
++ *
++ * @return 0 if successful; -1 otherwise.
++ */
++int spba_take_ownership(int mod, int master);
++
++/*!
++ * This function releases the ownership for a shared peripheral.
++ *
++ * @param  mod          specified module as defined in \b enum \b #spba_module
++ * @param  master       one of more (or-ed together) masters as defined in \b enum \b #spba_masters
++ *
++ * @return 0 if successful; -1 otherwise.
++ */
++int spba_rel_ownership(int mod, int master);
++
++#endif                                /* __KERNEL__ */
++
++#endif                                /* __ASM_ARCH_MXC_SPBA_H__ */
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/timex.h linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/timex.h
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/include/mach/timex.h    2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/include/mach/timex.h       2009-06-02 18:02:12.000000000 +0200
+@@ -23,7 +23,11 @@
+ #if defined CONFIG_ARCH_MX1
+ #define CLOCK_TICK_RATE               16000000
+ #elif defined CONFIG_ARCH_MX2
++#ifndef CONFIG_MACH_MX25
+ #define CLOCK_TICK_RATE               13300000
++#else
++#define CLOCK_TICK_RATE               12000000
++#endif
+ #elif defined CONFIG_ARCH_MX3
+ #define CLOCK_TICK_RATE               16625000
+ #endif
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-mx1-mx2.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/iomux-mx1-mx2.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-mx1-mx2.c 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/iomux-mx1-mx2.c    2009-06-02 18:02:01.000000000 +0200
+@@ -74,11 +74,12 @@ void mxc_gpio_mode(int gpio_mode)
+       __raw_writel(tmp, VA_GPIO_BASE + MXC_GIUS(port));
+       if (pin < 16) {
++#ifndef CONFIG_MACH_MX25
+               tmp = __raw_readl(VA_GPIO_BASE + MXC_OCR1(port));
+               tmp &= ~(3 << (pin * 2));
+               tmp |= (ocr << (pin * 2));
+               __raw_writel(tmp, VA_GPIO_BASE + MXC_OCR1(port));
+-
++#endif
+               tmp = __raw_readl(VA_GPIO_BASE + MXC_ICONFA1(port));
+               tmp &= ~(3 << (pin * 2));
+               tmp |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << (pin * 2);
+@@ -90,12 +91,12 @@ void mxc_gpio_mode(int gpio_mode)
+               __raw_writel(tmp, VA_GPIO_BASE + MXC_ICONFB1(port));
+       } else {
+               pin -= 16;
+-
++#ifndef CONFIG_MACH_MX25
+               tmp = __raw_readl(VA_GPIO_BASE + MXC_OCR2(port));
+               tmp &= ~(3 << (pin * 2));
+               tmp |= (ocr << (pin * 2));
+               __raw_writel(tmp, VA_GPIO_BASE + MXC_OCR2(port));
+-
++#endif
+               tmp = __raw_readl(VA_GPIO_BASE + MXC_ICONFA2(port));
+               tmp &= ~(3 << (pin * 2));
+               tmp |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << (pin * 2);
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-v3.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/iomux-v3.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/iomux-v3.c      2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/iomux-v3.c 2009-06-02 18:02:02.000000000 +0200
+@@ -31,7 +31,24 @@
+ #define IOMUX_BASE    IO_ADDRESS(IOMUXC_BASE_ADDR)
+-static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG];
++#ifdef CONFIG_MACH_MX25
++#define NUM_PADS      0x228
++#else
++#define NUM_PADS      0x200
++#endif
++
++static unsigned long iomux_v3_pad_alloc_map[NUM_PADS / BITS_PER_LONG];
++
++static inline int mxc_iomux_v3_pad_offset(struct pad_desc *pad)
++{
++      int pad_ofs;
++      if (cpu_is_mx25())
++              pad_ofs = pad->mux_ctrl_ofs;
++      else
++              pad_ofs = pad->pad_ctrl_ofs;
++      BUG_ON((pad_ofs >> 7) >= ARRAY_SIZE(iomux_v3_pad_alloc_map));
++      return pad_ofs;
++}
+ /*
+  * setups a single pin:
+@@ -40,7 +57,7 @@ static unsigned long iomux_v3_pad_alloc_
+  */
+ int mxc_iomux_v3_setup_pad(struct pad_desc *pad)
+ {
+-      unsigned int pad_ofs = pad->pad_ctrl_ofs;
++      unsigned int pad_ofs = mxc_iomux_v3_pad_offset(pad);
+       if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map))
+               return -EBUSY;
+@@ -65,8 +82,10 @@ int mxc_iomux_v3_setup_multiple_pads(str
+       for (i = 0; i < count; i++) {
+               ret = mxc_iomux_v3_setup_pad(p);
+-              if (ret)
++              if (ret) {
++                      printk(KERN_ERR "Failed to setup PAD[%d]: %d\n", i, ret);
+                       goto setup_error;
++              }
+               p++;
+       }
+       return 0;
+@@ -79,7 +98,7 @@ EXPORT_SYMBOL(mxc_iomux_v3_setup_multipl
+ void mxc_iomux_v3_release_pad(struct pad_desc *pad)
+ {
+-      unsigned int pad_ofs = pad->pad_ctrl_ofs;
++      unsigned int pad_ofs = mxc_iomux_v3_pad_offset(pad);
+       clear_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map);
+ }
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/pwm.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/pwm.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/pwm.c   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/pwm.c      2009-06-02 18:02:02.000000000 +0200
+@@ -55,7 +55,7 @@ int pwm_config(struct pwm_device *pwm, i
+       if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
+               return -EINVAL;
+-      if (cpu_is_mx27() || cpu_is_mx3()) {
++      if (cpu_is_mx27() || cpu_is_mx3() || cpu_is_mx25()) {
+               unsigned long long c;
+               unsigned long period_cycles, duty_cycles, prescale;
+               c = clk_get_rate(pwm->clk);
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/spba.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/spba.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/spba.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/spba.c     2009-06-02 18:02:03.000000000 +0200
+@@ -0,0 +1,143 @@
++/*
++ * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/types.h>
++#include <linux/module.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <asm/io.h>
++#include <mach/hardware.h>
++#include <mach/spba.h>
++
++/*!
++ * @file plat-mxc/spba.c
++ *
++ * @brief This file contains the SPBA API implementation details.
++ *
++ * @ingroup SPBA
++ */
++
++static DEFINE_SPINLOCK(spba_lock);
++
++#define SPBA_MASTER_MIN                 1
++#define SPBA_MASTER_MAX                 7
++
++/*!
++ * the base addresses for the SPBA modules
++ */
++static unsigned long spba_base = (unsigned long)IO_ADDRESS(SPBA_CTRL_BASE_ADDR);
++
++/*!
++ * SPBA clock
++ */
++static struct clk *spba_clk;
++/*!
++ * This function allows the three masters (A, B, C) to take ownership of a
++ * shared peripheral.
++ *
++ * @param  mod          specified module as defined in \b enum \b #spba_module
++ * @param  master       one of more (or-ed together) masters as defined in \b enum \b #spba_masters
++ *
++ * @return 0 if successful; a negative errno value otherwise.
++ */
++int spba_take_ownership(int mod, int master)
++{
++      unsigned long spba_flags;
++      int rtn_val = -EIO;
++
++      if (master < SPBA_MASTER_MIN || master > SPBA_MASTER_MAX) {
++              printk("%s() invalid master %d\n", __FUNCTION__, master);
++              return -EINVAL;
++      }
++
++      if (spba_clk == NULL) {
++              spba_clk = clk_get(NULL, "spba");
++              if (IS_ERR(spba_clk)) {
++                      int ret = PTR_ERR(spba_clk);
++
++                      spba_clk = NULL;
++                      return ret;
++              }
++      }
++      clk_enable(spba_clk);
++
++      spin_lock_irqsave(&spba_lock, spba_flags);
++      __raw_writel(master, spba_base + mod);
++
++      if ((__raw_readl(spba_base + mod) & MXC_SPBA_RAR_MASK) == master) {
++              rtn_val = 0;
++      }
++
++      spin_unlock_irqrestore(&spba_lock, spba_flags);
++
++      clk_disable(spba_clk);
++      return rtn_val;
++}
++
++/*!
++ * This function releases the ownership for a shared peripheral.
++ *
++ * @param  mod          specified module as defined in \b enum \b #spba_module
++ * @param  master       one of more (or-ed together) masters as defined in \b enum \b #spba_masters
++ *
++ * @return 0 if successful; a negativ errno value otherwise.
++ */
++int spba_rel_ownership(int mod, int master)
++{
++      unsigned long spba_flags;
++      volatile unsigned long rar;
++
++      if (master < SPBA_MASTER_MIN || master > SPBA_MASTER_MAX) {
++              printk("%s() invalid master %d\n", __FUNCTION__, master);
++              return -EINVAL;
++      }
++
++      if (spba_clk == NULL) {
++              spba_clk = clk_get(NULL, "spba");
++              if (IS_ERR(spba_clk)) {
++                      int ret = PTR_ERR(spba_clk);
++                      spba_clk = NULL;
++                      return ret;
++              }
++      }
++      clk_enable(spba_clk);
++
++      if ((__raw_readl(spba_base + mod) & master) == 0) {
++              clk_disable(spba_clk);
++              return -EBUSY;  /* does not own it */
++      }
++
++      spin_lock_irqsave(&spba_lock, spba_flags);
++
++      /* Since only the last 3 bits are writeable, doesn't need to mask off
++         bits 31-3 */
++      rar = __raw_readl(spba_base + mod) & (~master);
++      __raw_writel(rar, spba_base + mod);
++
++      if ((__raw_readl(spba_base + mod) & master) != 0) {
++              spin_unlock_irqrestore(&spba_lock, spba_flags);
++              clk_disable(spba_clk);
++              return -EIO;
++      }
++      spin_unlock_irqrestore(&spba_lock, spba_flags);
++
++      clk_disable(spba_clk);
++      return 0;
++}
++
++EXPORT_SYMBOL(spba_take_ownership);
++EXPORT_SYMBOL(spba_rel_ownership);
++
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("SPBA");
++MODULE_LICENSE("GPL");
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/system.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/system.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/system.c        2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/system.c   2009-06-08 12:48:23.000000000 +0200
+@@ -21,6 +21,7 @@
+  */
+ #include <linux/kernel.h>
++#include <linux/init.h>
+ #include <linux/clk.h>
+ #include <linux/io.h>
+ #include <linux/err.h>
+@@ -38,18 +39,15 @@
+ #define WDOG_WCR_ENABLE               (1 << 2)
+ #endif
++static struct clk *mxc_wdt_clk;
++
+ /*
+  * Reset the system. It is called by machine_restart().
+  */
+ void arch_reset(char mode, const char *cmd)
+ {
+-      if (!cpu_is_mx1()) {
+-              struct clk *clk;
+-
+-              clk = clk_get_sys("imx-wdt.0", NULL);
+-              if (!IS_ERR(clk))
+-                      clk_enable(clk);
+-      }
++      if (mxc_wdt_clk)
++              clk_enable(mxc_wdt_clk);
+       /* Assert SRS signal */
+       __raw_writew(WDOG_WCR_ENABLE, WDOG_WCR_REG);
+@@ -65,3 +63,20 @@ void arch_reset(char mode, const char *c
+       /* we'll take a jump through zero as a poor second */
+       cpu_reset(0);
+ }
++
++static int mxc_wdt_init(void)
++{
++      if (cpu_is_mx1())
++              return 0;
++
++      mxc_wdt_clk = clk_get_sys("imx-wdt.0", NULL);
++      if (IS_ERR(mxc_wdt_clk)) {
++              int ret = PTR_ERR(mxc_wdt_clk);
++
++              printk(KERN_ERR "%s: Failed to get imx-wdt.0 clk: %d\n", __FUNCTION__, ret);
++              mxc_wdt_clk = NULL;
++              return ret;
++      }
++      return 0;
++}
++arch_initcall(mxc_wdt_init);
+diff -urNp linux-2.6.30-rc4/arch/arm/plat-mxc/time.c linux-2.6.30-rc4-karo/arch/arm/plat-mxc/time.c
+--- linux-2.6.30-rc4/arch/arm/plat-mxc/time.c  2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/plat-mxc/time.c     2009-06-02 18:02:02.000000000 +0200
+@@ -66,7 +66,7 @@ static inline void gpt_irq_disable(void)
+ {
+       unsigned int tmp;
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               __raw_writel(0, timer_base + MX3_IR);
+       else {
+               tmp = __raw_readl(timer_base + MXC_TCTL);
+@@ -76,7 +76,7 @@ static inline void gpt_irq_disable(void)
+ static inline void gpt_irq_enable(void)
+ {
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               __raw_writel(1<<0, timer_base + MX3_IR);
+       else {
+               __raw_writel(__raw_readl(timer_base + MXC_TCTL) | MX1_2_TCTL_IRQEN,
+@@ -88,9 +88,9 @@ static void gpt_irq_acknowledge(void)
+ {
+       if (cpu_is_mx1())
+               __raw_writel(0, timer_base + MX1_2_TSTAT);
+-      if (cpu_is_mx2())
++      if (cpu_is_mx2() && !cpu_is_mx25())
+               __raw_writel(MX2_TSTAT_CAPT | MX2_TSTAT_COMP, timer_base + MX1_2_TSTAT);
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               __raw_writel(MX3_TSTAT_OF1, timer_base + MX3_TSTAT);
+ }
+@@ -117,7 +117,7 @@ static int __init mxc_clocksource_init(s
+ {
+       unsigned int c = clk_get_rate(timer_clk);
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               clocksource_mxc.read = mx3_get_cycles;
+       clocksource_mxc.mult = clocksource_hz2mult(c,
+@@ -180,7 +180,7 @@ static void mxc_set_mode(enum clock_even
+       if (mode != clockevent_mode) {
+               /* Set event time into far-far future */
+-              if (cpu_is_mx3())
++              if (cpu_is_mx3() || cpu_is_mx25())
+                       __raw_writel(__raw_readl(timer_base + MX3_TCN) - 3,
+                                       timer_base + MX3_TCMP);
+               else
+@@ -233,7 +233,7 @@ static irqreturn_t mxc_timer_interrupt(i
+       struct clock_event_device *evt = &clockevent_mxc;
+       uint32_t tstat;
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               tstat = __raw_readl(timer_base + MX3_TSTAT);
+       else
+               tstat = __raw_readl(timer_base + MX1_2_TSTAT);
+@@ -264,7 +264,7 @@ static int __init mxc_clockevent_init(st
+ {
+       unsigned int c = clk_get_rate(timer_clk);
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               clockevent_mxc.set_next_event = mx3_set_next_event;
+       clockevent_mxc.mult = div_sc(c, NSEC_PER_SEC,
+@@ -287,6 +287,7 @@ void __init mxc_timer_init(struct clk *t
+       int irq;
+       clk_enable(timer_clk);
++printk(KERN_DEBUG "%s: \n", __FUNCTION__);
+       if (cpu_is_mx1()) {
+ #ifdef CONFIG_ARCH_MX1
+@@ -306,6 +307,7 @@ void __init mxc_timer_init(struct clk *t
+       } else
+               BUG();
++printk(KERN_DEBUG "%s: timer_base=%p IRQ=%d\n", __FUNCTION__, timer_base, irq);
+       /*
+        * Initialise to a known state (all timers off, and timing reset)
+        */
+@@ -313,7 +315,7 @@ void __init mxc_timer_init(struct clk *t
+       __raw_writel(0, timer_base + MXC_TCTL);
+       __raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */
+-      if (cpu_is_mx3())
++      if (cpu_is_mx3() || cpu_is_mx25())
+               tctl_val = MX3_TCTL_CLK_IPG | MX3_TCTL_FRR | MX3_TCTL_WAITEN | MXC_TCTL_TEN;
+       else
+               tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN;
+diff -urNp linux-2.6.30-rc4/arch/arm/tools/mach-types linux-2.6.30-rc4-karo/arch/arm/tools/mach-types
+--- linux-2.6.30-rc4/arch/arm/tools/mach-types 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/arch/arm/tools/mach-types    2009-06-02 18:02:54.000000000 +0200
+@@ -12,7 +12,7 @@
+ #
+ #   http://www.arm.linux.org.uk/developer/machines/?action=new
+ #
+-# Last update: Mon Mar 23 20:09:01 2009
++# Last update: Mon Apr 20 10:31:38 2009
+ #
+ # machine_is_xxx      CONFIG_xxxx             MACH_TYPE_xxx           number
+ #
+@@ -1721,7 +1721,7 @@ sapphire         MACH_SAPPHIRE           SAPPHIRE                1729
+ csb637xo              MACH_CSB637XO           CSB637XO                1730
+ evisiong              MACH_EVISIONG           EVISIONG                1731
+ stmp37xx              MACH_STMP37XX           STMP37XX                1732
+-stmp378x              MACH_STMP38XX           STMP38XX                1733
++stmp378x              MACH_STMP378X           STMP378X                1733
+ tnt                   MACH_TNT                TNT                     1734
+ tbxt                  MACH_TBXT               TBXT                    1735
+ playmate              MACH_PLAYMATE           PLAYMATE                1736
+@@ -2132,3 +2132,41 @@ apollo                  MACH_APOLLO             APOLLO                  2141
+ at91cap9stk           MACH_AT91CAP9STK        AT91CAP9STK             2142
+ spc300                        MACH_SPC300             SPC300                  2143
+ eko                   MACH_EKO                EKO                     2144
++ccw9m2443             MACH_CCW9M2443          CCW9M2443               2145
++ccw9m2443js           MACH_CCW9M2443JS        CCW9M2443JS             2146
++m2m_router_device     MACH_M2M_ROUTER_DEVICE  M2M_ROUTER_DEVICE       2147
++str9104nas            MACH_STAR9104NAS        STAR9104NAS             2148
++pca100                        MACH_PCA100             PCA100                  2149
++z3_dm365_mod_01               MACH_Z3_DM365_MOD_01    Z3_DM365_MOD_01         2150
++hipox                 MACH_HIPOX              HIPOX                   2151
++omap3_piteds          MACH_OMAP3_PITEDS       OMAP3_PITEDS            2152
++bm150r                        MACH_BM150R             BM150R                  2153
++tbone                 MACH_TBONE              TBONE                   2154
++merlin                        MACH_MERLIN             MERLIN                  2155
++falcon                        MACH_FALCON             FALCON                  2156
++davinci_da850_evm     MACH_DAVINCI_DA850_EVM  DAVINCI_DA850_EVM       2157
++s5p6440                       MACH_S5P6440            S5P6440                 2158
++at91sam9g10ek         MACH_AT91SAM9G10EK      AT91SAM9G10EK           2159
++omap_4430sdp          MACH_OMAP_4430SDP       OMAP_4430SDP            2160
++lpc313x                       MACH_LPC313X            LPC313X                 2161
++magx_zn5              MACH_MAGX_ZN5           MAGX_ZN5                2162
++magx_em30             MACH_MAGX_EM30          MAGX_EM30               2163
++magx_ve66             MACH_MAGX_VE66          MAGX_VE66               2164
++meesc                 MACH_MEESC              MEESC                   2165
++otc570                        MACH_OTC570             OTC570                  2166
++bcu2412                       MACH_BCU2412            BCU2412                 2167
++beacon                        MACH_BEACON             BEACON                  2168
++actia_tgw             MACH_ACTIA_TGW          ACTIA_TGW               2169
++e4430                 MACH_E4430              E4430                   2170
++ql300                 MACH_QL300              QL300                   2171
++btmavb101             MACH_BTMAVB101          BTMAVB101               2172
++btmawb101             MACH_BTMAWB101          BTMAWB101               2173
++sq201                 MACH_SQ201              SQ201                   2174
++quatro45xx            MACH_QUATRO45XX         QUATRO45XX              2175
++openpad                       MACH_OPENPAD            OPENPAD                 2176
++tx25                  MACH_TX25               TX25                    2177
++omap3_torpedo         MACH_OMAP3_TORPEDO      OMAP3_TORPEDO           2178
++htcraphael_k          MACH_HTCRAPHAEL_K       HTCRAPHAEL_K            2179
++pxa255                        MACH_PXA255             PXA255                  2180
++lal43                 MACH_LAL43              LAL43                   2181
++htcraphael_cdma500    MACH_HTCRAPHAEL_CDMA500 HTCRAPHAEL_CDMA500      2182
+diff -urNp linux-2.6.30-rc4/drivers/leds/leds-gpio.c linux-2.6.30-rc4-karo/drivers/leds/leds-gpio.c
+--- linux-2.6.30-rc4/drivers/leds/leds-gpio.c  2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/leds/leds-gpio.c     2009-06-02 18:36:36.000000000 +0200
+@@ -82,7 +82,7 @@ static int __devinit create_gpio_led(con
+       if (!gpio_is_valid(template->gpio)) {
+               printk(KERN_INFO "Skipping unavilable LED gpio %d (%s)\n", 
+                               template->gpio, template->name);
+-              return 0;
++              return -EINVAL;
+       }
+       ret = gpio_request(template->gpio, template->name);
+diff -urNp linux-2.6.30-rc4/drivers/mtd/nand/Kconfig linux-2.6.30-rc4-karo/drivers/mtd/nand/Kconfig
+--- linux-2.6.30-rc4/drivers/mtd/nand/Kconfig  2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/mtd/nand/Kconfig     2009-06-02 18:42:05.000000000 +0200
+@@ -420,6 +420,27 @@ config MTD_NAND_MXC
+         This enables the driver for the NAND flash controller on the
+         MXC processors.
++config MTD_NAND_MXC_FLASH_BBT
++      bool "Support a flash based bad block table"
++      depends on MTD_NAND_MXC
++
++config        ARCH_MXC_HAS_NFC_V1
++      bool
++
++config        ARCH_MXC_HAS_NFC_V1_1
++      select ARCH_MXC_HAS_NFC_V1
++      bool
++
++config        ARCH_MXC_HAS_NFC_V2
++      bool
++
++config        ARCH_MXC_HAS_NFC_V2_1
++      bool
++      select ARCH_MXC_HAS_NFC_V2
++
++config        ARCH_MXC_HAS_NFC_V3
++      bool
++
+ config MTD_NAND_SH_FLCTL
+       tristate "Support for NAND on Renesas SuperH FLCTL"
+       depends on MTD_NAND && SUPERH && CPU_SUBTYPE_SH7723
+diff -urNp linux-2.6.30-rc4/drivers/mtd/nand/mxc_nand.c linux-2.6.30-rc4-karo/drivers/mtd/nand/mxc_nand.c
+--- linux-2.6.30-rc4/drivers/mtd/nand/mxc_nand.c       2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/mtd/nand/mxc_nand.c  2009-06-08 12:51:07.000000000 +0200
+@@ -34,23 +34,52 @@
+ #include <asm/mach/flash.h>
+ #include <mach/mxc_nand.h>
++#ifdef CONFIG_MTD_DEBUG
++static int debug = 0;
++module_param(debug, int, S_IRUGO | S_IWUSR);
++
++#define dbg_lvl(n)    ((n) < debug)
++#define DBG(lvl, fmt...)      do { if (dbg_lvl(lvl)) printk(KERN_DEBUG fmt); } while (0)
++#undef DEBUG
++#define DEBUG(l, fmt...) DBG(l, fmt)
++#else
++static int debug;
++module_param(debug, int, 0);
++
++#define dbg_lvl(n)    0
++#define DBG(lvl, fmt...)      do { } while (0)
++#endif
++
++
+ #define DRIVER_NAME "mxc_nand"
+ /* Addresses for NFC registers */
+-#define NFC_BUF_SIZE          0xE00
+-#define NFC_BUF_ADDR          0xE04
+-#define NFC_FLASH_ADDR                0xE06
+-#define NFC_FLASH_CMD         0xE08
+-#define NFC_CONFIG            0xE0A
+-#define NFC_ECC_STATUS_RESULT 0xE0C
+-#define NFC_RSLTMAIN_AREA     0xE0E
+-#define NFC_RSLTSPARE_AREA    0xE10
+-#define NFC_WRPROT            0xE12
+-#define NFC_UNLOCKSTART_BLKADDR       0xE14
+-#define NFC_UNLOCKEND_BLKADDR 0xE16
+-#define NFC_NF_WRPRST         0xE18
+-#define NFC_CONFIG1           0xE1A
+-#define NFC_CONFIG2           0xE1C
++#define NFC_BUF_SIZE          0x000
++#define NFC_BUF_ADDR          0x004
++#define NFC_FLASH_ADDR                0x006
++#define NFC_FLASH_CMD         0x008
++#define NFC_CONFIG            0x00A
++#define NFC_ECC_STATUS_RESULT 0x00C
++#define NFC_RSLTMAIN_AREA     0x00E
++#define NFC_RSLTSPARE_AREA    0x010
++#define NFC_WRPROT            0x012
++#ifndef CONFIG_ARCH_MXC_HAS_NFC_V1_1
++#define NFC_UNLOCKSTART_BLKADDR       0x014
++#define NFC_UNLOCKEND_BLKADDR 0x016
++#endif
++#define NFC_NF_WRPRST         0x018
++#define NFC_CONFIG1           0x01A
++#define NFC_CONFIG2           0x01C
++#ifdef CONFIG_ARCH_MXC_HAS_NFC_V1_1
++#define NFC_UNLOCKSTART_BLKADDR 0x020
++#define NFC_UNLOCKEND_BLKADDR 0x022
++#define NFC_UNLOCKSTART_BLKADDR1 0x024
++#define NFC_UNLOCKEND_BLKADDR1        0x026
++#define NFC_UNLOCKSTART_BLKADDR2 0x028
++#define NFC_UNLOCKEND_BLKADDR2        0x02a
++#define NFC_UNLOCKSTART_BLKADDR3 0x02c
++#define NFC_UNLOCKEND_BLKADDR3        0x02e
++#endif
+ /* Addresses for NFC RAM BUFFER Main area 0 */
+ #define MAIN_AREA0            0x000
+@@ -59,10 +88,27 @@
+ #define MAIN_AREA3            0x600
+ /* Addresses for NFC SPARE BUFFER Spare area 0 */
++#ifndef CONFIG_ARCH_MXC_HAS_NFC_V1_1
++#define SPARE_AREA_SIZE               16
+ #define SPARE_AREA0           0x800
+ #define SPARE_AREA1           0x810
+ #define SPARE_AREA2           0x820
+ #define SPARE_AREA3           0x830
++#else
++#define SPARE_AREA_SIZE               64
++#define MAIN_AREA4            0x800
++#define MAIN_AREA5            0xa00
++#define MAIN_AREA6            0xc00
++#define MAIN_AREA7            0xe00
++#define SPARE_AREA0           0x1000
++#define SPARE_AREA1           0x1040
++#define SPARE_AREA2           0x1080
++#define SPARE_AREA3           0x10c0
++#define SPARE_AREA4           0x1100
++#define SPARE_AREA5           0x1140
++#define SPARE_AREA6           0x1180
++#define SPARE_AREA7           0x11c0
++#endif
+ /* Set INT to 0, FCMD to 1, rest to 0 in NFC_CONFIG2 Register
+  * for Command operation */
+@@ -107,6 +153,7 @@ struct mxc_nand_host {
+       struct device           *dev;
+       void __iomem            *regs;
++      void __iomem            *nfc_buf;
+       int                     spare_only;
+       int                     status_request;
+       int                     pagesize_2k;
+@@ -120,40 +167,149 @@ struct mxc_nand_host {
+ /* Define delays in microsec for NAND device operations */
+ #define TROP_US_DELAY   2000
+-/* Macros to get byte and bit positions of ECC */
+-#define COLPOS(x)  ((x) >> 3)
+-#define BITPOS(x) ((x) & 0xf)
+-
+-/* Define single bit Error positions in Main & Spare area */
+-#define MAIN_SINGLEBIT_ERROR 0x4
+-#define SPARE_SINGLEBIT_ERROR 0x1
++#ifndef CONFIG_ARCH_MXC_HAS_NFC_V1_1
+ /* OOB placement block for use with hardware ecc generation */
++static struct nand_ecclayout nand_hw_eccoob2k_8 = {
++      .eccbytes = 5,
++      .eccpos = {6, 7, 8, 9, 10},
++      .oobfree = {{0, 5}, {11, 11}, {27, 11}, {43, 5}}
++};
++
+ static struct nand_ecclayout nand_hw_eccoob_8 = {
+       .eccbytes = 5,
+       .eccpos = {6, 7, 8, 9, 10},
+-      .oobfree = {{0, 5}, {11, 5}, }
++      .oobfree = {{0, 5}, {11, 5}}
++};
++
++static struct nand_ecclayout nand_hw_eccoob2k_16 = {
++      .eccbytes = 5,
++      .eccpos = {6, 7, 8, 9, 10},
++      .oobfree = {{0, 6}, {12, 10}, {28, 10}, {44, 4}}
+ };
+ static struct nand_ecclayout nand_hw_eccoob_16 = {
+       .eccbytes = 5,
+       .eccpos = {6, 7, 8, 9, 10},
+-      .oobfree = {{0, 6}, {12, 4}, }
++      .oobfree = {{0, 6}, {12, 4}}
++};
++
++#ifdef CONFIG_MTD_NAND_MXC_FLASH_BBT
++static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
++static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
++
++static struct nand_bbt_descr bbt_main_descr = {
++      .options = (NAND_BBT_LASTBLOCK | NAND_BBT_WRITE |
++                  NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP),
++      .offs = 12,
++      .len = 4,
++      .veroffs = 11,
++      .maxblocks = 4,
++      .pattern = bbt_pattern,
+ };
++static struct nand_bbt_descr bbt_mirror_descr = {
++      .options = (NAND_BBT_LASTBLOCK | NAND_BBT_WRITE |
++                  NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP),
++      .offs = 12,
++      .len = 4,
++      .veroffs = 11,
++      .maxblocks = 4,
++      .pattern = mirror_pattern,
++};
++#endif
++#else
++/*
++ * OOB placement block for use with hardware ecc generation
++ */
++static struct nand_ecclayout nand_hw_eccoob2k_8 = {
++      .eccbytes = 9,
++      .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15},
++      .oobfree = {{2, 5}, {16, 7}, {32, 7}, {48, 7}},
++};
++
++static struct nand_ecclayout nand_hw_eccoob_8 = {
++      .eccbytes = 9,
++      .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15},
++      .oobfree = {{0, 4}},
++};
++
++static struct nand_ecclayout nand_hw_eccoob2k_16 = {
++      .eccbytes = 9,
++      .eccpos = {6, 7, 8, 9, 10, 11, 12, 13, 14},
++      .oobfree = {{2, 4}, {17, 6}, {33, 6}, {47, 6}},
++};
++
++static struct nand_ecclayout nand_hw_eccoob_16 = {
++      .eccbytes = 9,
++      .eccpos = {6, 7, 8, 9, 10, 11, 12, 13, 14},
++      .oobfree = {{0, 3}}
++};
++
++#ifdef CONFIG_MTD_NAND_MXC_FLASH_BBT
++/* Generic flash bbt decriptors
++*/
++static u8 bbt_pattern[] = { 'B', 'b', 't', '0' };
++static u8 mirror_pattern[] = { '1', 't', 'b', 'B' };
++
++static struct nand_bbt_descr bbt_main_descr = {
++      .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
++      NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
++      .offs = 0,
++      .len = 4,
++      .veroffs = 4,
++      .maxblocks = 4,
++      .pattern = bbt_pattern
++};
++
++static struct nand_bbt_descr bbt_mirror_descr = {
++      .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
++      NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
++      .offs = 0,
++      .len = 4,
++      .veroffs = 4,
++      .maxblocks = 4,
++      .pattern = mirror_pattern
++};
++#endif
++#endif
++
+ #ifdef CONFIG_MTD_PARTITIONS
+ static const char *part_probes[] = { "RedBoot", "cmdlinepart", NULL };
+ #endif
++#ifdef CONFIG_MTD_DEBUG
++#define nfc_read_reg(b, r)    __nfc_read_reg(b, r, #r, __FUNCTION__)
++static inline u16 __nfc_read_reg(void __iomem *base, unsigned int reg,
++                               const char *name, const char *fn)
++{
++      u16 val = readw(base + reg);
++      DBG(3, "%s: Read %04x from %s[%02x]\n", fn, val, name, reg);
++      return val;
++}
++
++#define nfc_write_reg(v, b, r)        __nfc_write_reg(v, b, r, #r, __FUNCTION__)
++static inline void __nfc_write_reg(u16 val, void __iomem *base, unsigned int reg,
++                                 const char *name, const char *fn)
++{
++      DBG(3, "%s: Writing %04x to %s[%02x]\n", fn, val, name, reg);
++      writew(val, base + reg);
++}
++#else
++#define nfc_read_reg(b, r)    readw(b + r)
++#define nfc_write_reg(v, b, r)        writew(v, b + r)
++#endif
++
+ static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
+ {
+       struct mxc_nand_host *host = dev_id;
+-
+       uint16_t tmp;
+-      tmp = readw(host->regs + NFC_CONFIG1);
++      DEBUG(MTD_DEBUG_LEVEL3, "%s(%d)\n", __FUNCTION__, irq);
++
++      tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
+       tmp |= NFC_INT_MSK; /* Disable interrupt */
+-      writew(tmp, host->regs + NFC_CONFIG1);
++      nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
+       wake_up(&host->irq_waitq);
+@@ -166,35 +322,29 @@ static irqreturn_t mxc_nfc_irq(int irq, 
+ static void wait_op_done(struct mxc_nand_host *host, int max_retries,
+                               uint16_t param, int useirq)
+ {
+-      uint32_t tmp;
+-
+       if (useirq) {
+-              if ((readw(host->regs + NFC_CONFIG2) & NFC_INT) == 0) {
+-
+-                      tmp = readw(host->regs + NFC_CONFIG1);
+-                      tmp  &= ~NFC_INT_MSK;   /* Enable interrupt */
+-                      writew(tmp, host->regs + NFC_CONFIG1);
+-
+-                      wait_event(host->irq_waitq,
+-                              readw(host->regs + NFC_CONFIG2) & NFC_INT);
+-
+-                      tmp = readw(host->regs + NFC_CONFIG2);
+-                      tmp  &= ~NFC_INT;
+-                      writew(tmp, host->regs + NFC_CONFIG2);
++              if (!(nfc_read_reg(host->regs, NFC_CONFIG2) & NFC_INT)) {
++                      uint32_t cfg1;
++                      const unsigned long timeout = max_retries;
++
++                      cfg1 = nfc_read_reg(host->regs, NFC_CONFIG1);
++                      cfg1 &= ~NFC_INT_MSK;   /* Enable interrupt */
++                      nfc_write_reg(cfg1, host->regs, NFC_CONFIG1);
++
++                      max_retries = wait_event_timeout(host->irq_waitq,
++                              nfc_read_reg(host->regs, NFC_CONFIG2) &
++                                      NFC_INT, timeout);
+               }
+       } else {
+-              while (max_retries-- > 0) {
+-                      if (readw(host->regs + NFC_CONFIG2) & NFC_INT) {
+-                              tmp = readw(host->regs + NFC_CONFIG2);
+-                              tmp  &= ~NFC_INT;
+-                              writew(tmp, host->regs + NFC_CONFIG2);
+-                              break;
+-                      }
++              while (!(nfc_read_reg(host->regs, NFC_CONFIG2) & NFC_INT) &&
++                      max_retries-- > 0) {
+                       udelay(1);
+               }
+-              if (max_retries <= 0)
+-                      DEBUG(MTD_DEBUG_LEVEL0, "%s(%d): INT not set\n",
+-                            __func__, param);
++      }
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2) & ~NFC_INT);
++      nfc_write_reg(0, host->regs, NFC_CONFIG2);
++      if (WARN_ON(max_retries <= 0)) {
++              printk(KERN_ERR "%s(%d): INT not set\n", __func__, param);
+       }
+ }
+@@ -204,8 +354,9 @@ static void send_cmd(struct mxc_nand_hos
+ {
+       DEBUG(MTD_DEBUG_LEVEL3, "send_cmd(host, 0x%x, %d)\n", cmd, useirq);
+-      writew(cmd, host->regs + NFC_FLASH_CMD);
+-      writew(NFC_CMD, host->regs + NFC_CONFIG2);
++      nfc_write_reg(cmd, host->regs, NFC_FLASH_CMD);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      nfc_write_reg(NFC_CMD, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, cmd, useirq);
+@@ -218,8 +369,9 @@ static void send_addr(struct mxc_nand_ho
+ {
+       DEBUG(MTD_DEBUG_LEVEL3, "send_addr(host, 0x%x %d)\n", addr, islast);
+-      writew(addr, host->regs + NFC_FLASH_ADDR);
+-      writew(NFC_ADDR, host->regs + NFC_CONFIG2);
++      nfc_write_reg(addr, host->regs, NFC_FLASH_ADDR);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      nfc_write_reg(NFC_ADDR, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, addr, islast);
+@@ -230,22 +382,28 @@ static void send_addr(struct mxc_nand_ho
+ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
+                       int spare_only)
+ {
++      int i;
+       DEBUG(MTD_DEBUG_LEVEL3, "send_prog_page (%d)\n", spare_only);
++      for (i = 0; i < 4; i++) {
++              void *src = host->nfc_buf + SPARE_AREA0 + i * 16;
++              void *dst = host->nfc_buf + SPARE_AREA0 + i * 64;
++              memcpy(dst, src, 16);
++      }
+       /* NANDFC buffer 0 is used for page read/write */
+-      writew(buf_id, host->regs + NFC_BUF_ADDR);
++      nfc_write_reg(buf_id, host->regs, NFC_BUF_ADDR);
+       /* Configure spare or page+spare access */
+       if (!host->pagesize_2k) {
+-              uint16_t config1 = readw(host->regs + NFC_CONFIG1);
++              uint16_t config1 = nfc_read_reg(host->regs, NFC_CONFIG1);
+               if (spare_only)
+                       config1 |= NFC_SP_EN;
+               else
+-                      config1 &= ~(NFC_SP_EN);
+-              writew(config1, host->regs + NFC_CONFIG1);
++                      config1 &= ~NFC_SP_EN;
++              nfc_write_reg(config1, host->regs, NFC_CONFIG1);
+       }
+-
+-      writew(NFC_INPUT, host->regs + NFC_CONFIG2);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      nfc_write_reg(NFC_INPUT, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, spare_only, true);
+@@ -256,25 +414,33 @@ static void send_prog_page(struct mxc_na
+ static void send_read_page(struct mxc_nand_host *host, uint8_t buf_id,
+               int spare_only)
+ {
++      int i;
++
+       DEBUG(MTD_DEBUG_LEVEL3, "send_read_page (%d)\n", spare_only);
+       /* NANDFC buffer 0 is used for page read/write */
+-      writew(buf_id, host->regs + NFC_BUF_ADDR);
++      nfc_write_reg(buf_id, host->regs, NFC_BUF_ADDR);
+       /* Configure spare or page+spare access */
+       if (!host->pagesize_2k) {
+-              uint32_t config1 = readw(host->regs + NFC_CONFIG1);
++              uint32_t config1 = nfc_read_reg(host->regs, NFC_CONFIG1);
+               if (spare_only)
+                       config1 |= NFC_SP_EN;
+               else
+                       config1 &= ~NFC_SP_EN;
+-              writew(config1, host->regs + NFC_CONFIG1);
++              nfc_write_reg(config1, host->regs, NFC_CONFIG1);
+       }
+-      writew(NFC_OUTPUT, host->regs + NFC_CONFIG2);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      nfc_write_reg(NFC_OUTPUT, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, spare_only, true);
++      for (i = 0; i < 4; i++) {
++              void *src = host->nfc_buf + SPARE_AREA0 + i * 64;
++              void *dst = host->nfc_buf + SPARE_AREA0 + i * 16;
++              memcpy(dst, src, 16);
++      }
+ }
+ /* Request the NANDFC to perform a read of the NAND device ID. */
+@@ -284,20 +450,23 @@ static void send_read_id(struct mxc_nand
+       uint16_t tmp;
+       /* NANDFC buffer 0 is used for device ID output */
+-      writew(0x0, host->regs + NFC_BUF_ADDR);
++      nfc_write_reg(0x0, host->regs, NFC_BUF_ADDR);
+-      /* Read ID into main buffer */
+-      tmp = readw(host->regs + NFC_CONFIG1);
++      tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
+       tmp &= ~NFC_SP_EN;
+-      writew(tmp, host->regs + NFC_CONFIG1);
++      nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
+-      writew(NFC_ID, host->regs + NFC_CONFIG2);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      /* Read ID into main buffer */
++      nfc_write_reg(NFC_ID, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, 0, true);
+       if (this->options & NAND_BUSWIDTH_16) {
+-              void __iomem *main_buf = host->regs + MAIN_AREA0;
++              /* FIXME: This cannot work, because the NFC buffer
++               * cannot be accessed with byte accesses! */
++              void __iomem *main_buf = host->nfc_buf + MAIN_AREA0;
+               /* compress the ID info */
+               writeb(readb(main_buf + 2), main_buf + 1);
+               writeb(readb(main_buf + 4), main_buf + 2);
+@@ -311,32 +480,35 @@ static void send_read_id(struct mxc_nand
+  * NAND device status and returns the current status. */
+ static uint16_t get_dev_status(struct mxc_nand_host *host)
+ {
+-      void __iomem *main_buf = host->regs + MAIN_AREA1;
++      void __iomem *main_buf = host->nfc_buf + MAIN_AREA1;
+       uint32_t store;
+       uint16_t ret, tmp;
+       /* Issue status request to NAND device */
+-      /* store the main area1 first word, later do recovery */
++      /* store the main area first word, later do recovery */
+       store = readl(main_buf);
+       /* NANDFC buffer 1 is used for device status to prevent
+        * corruption of read/write buffer on status requests. */
+-      writew(1, host->regs + NFC_BUF_ADDR);
++      nfc_write_reg(1, host->regs, NFC_BUF_ADDR);
+       /* Read status into main buffer */
+-      tmp = readw(host->regs + NFC_CONFIG1);
++      tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
+       tmp &= ~NFC_SP_EN;
+-      writew(tmp, host->regs + NFC_CONFIG1);
++      nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
+-      writew(NFC_STATUS, host->regs + NFC_CONFIG2);
++      WARN_ON(nfc_read_reg(host->regs, NFC_CONFIG2));
++      nfc_write_reg(NFC_STATUS, host->regs, NFC_CONFIG2);
+       /* Wait for operation to complete */
+       wait_op_done(host, TROP_US_DELAY, 0, true);
+       /* Status is placed in first word of main buffer */
+-      /* get status, then recovery area 1 data */
++      /* get status, then recover area 1 data */
+       ret = readw(main_buf);
+       writel(store, main_buf);
++      DBG(0, "%s: status=%02x\n", __FUNCTION__, ret);
++
+       return ret;
+ }
+@@ -369,7 +541,7 @@ static int mxc_nand_correct_data(struct 
+        * additional correction.  2-Bit errors cannot be corrected by
+        * HW ECC, so we need to return failure
+        */
+-      uint16_t ecc_status = readw(host->regs + NFC_ECC_STATUS_RESULT);
++      uint16_t ecc_status = nfc_read_reg(host->regs, NFC_ECC_STATUS_RESULT);
+       if (((ecc_status & 0x3) == 2) || ((ecc_status >> 2) == 2)) {
+               DEBUG(MTD_DEBUG_LEVEL0,
+@@ -392,8 +564,10 @@ static u_char mxc_nand_read_byte(struct 
+       struct mxc_nand_host *host = nand_chip->priv;
+       uint8_t ret = 0;
+       uint16_t col, rd_word;
+-      uint16_t __iomem *main_buf = host->regs + MAIN_AREA0;
+-      uint16_t __iomem *spare_buf = host->regs + SPARE_AREA0;
++      uint16_t __iomem *main_buf = host->nfc_buf + MAIN_AREA0;
++      uint16_t __iomem *spare_buf = host->nfc_buf + SPARE_AREA0;
++
++      WARN_ON(host->spare_only && host->col_addr >= 16);
+       /* Check for status request */
+       if (host->status_request)
+@@ -431,14 +605,16 @@ static uint16_t mxc_nand_read_word(struc
+             "mxc_nand_read_word(col = %d)\n", host->col_addr);
+       col = host->col_addr;
++
+       /* Adjust saved column address */
+       if (col < mtd->writesize && host->spare_only)
+               col += mtd->writesize;
++      WARN_ON(col >= mtd->writesize + 16);
+       if (col < mtd->writesize)
+-              p = (host->regs + MAIN_AREA0) + (col >> 1);
++              p = (host->nfc_buf + MAIN_AREA0) + (col >> 1);
+       else
+-              p = (host->regs + SPARE_AREA0) + ((col - mtd->writesize) >> 1);
++              p = (host->nfc_buf + SPARE_AREA0) + ((col - mtd->writesize) >> 1);
+       if (col & 1) {
+               rd_word = readw(p);
+@@ -474,10 +650,13 @@ static void mxc_nand_write_buf(struct mt
+       /* Adjust saved column address */
+       if (col < mtd->writesize && host->spare_only)
+               col += mtd->writesize;
+-
++#if 0
+       n = mtd->writesize + mtd->oobsize - col;
+       n = min(len, n);
+-
++#else
++      BUG_ON(len > mtd->writesize + mtd->oobsize - col);
++      n = len;
++#endif
+       DEBUG(MTD_DEBUG_LEVEL3,
+             "%s:%d: col = %d, n = %d\n", __func__, __LINE__, col, n);
+@@ -485,10 +664,10 @@ static void mxc_nand_write_buf(struct mt
+               void __iomem *p;
+               if (col < mtd->writesize)
+-                      p = host->regs + MAIN_AREA0 + (col & ~3);
++                      p = host->nfc_buf + MAIN_AREA0 + (col & ~3);
+               else
+-                      p = host->regs + SPARE_AREA0 -
+-                                              mtd->writesize + (col & ~3);
++                      p = host->nfc_buf + SPARE_AREA0 +
++                              (col & ~3) - mtd->writesize;
+               DEBUG(MTD_DEBUG_LEVEL3, "%s:%d: p = %p\n", __func__,
+                     __LINE__, p);
+@@ -542,6 +721,7 @@ static void mxc_nand_write_buf(struct mt
+                       DEBUG(MTD_DEBUG_LEVEL3,
+                             "%s:%d: n = %d, m = %d, i = %d, col = %d\n",
+                             __func__,  __LINE__, n, m, i, col);
++                      BUG_ON(m == 0);
+                       memcpy(p, &buf[i], m);
+                       col += m;
+@@ -571,18 +751,28 @@ static void mxc_nand_read_buf(struct mtd
+       /* Adjust saved column address */
+       if (col < mtd->writesize && host->spare_only)
+               col += mtd->writesize;
+-
++#if 0
+       n = mtd->writesize + mtd->oobsize - col;
+       n = min(len, n);
+-
++#else
++      /* If more data is requested to be read than is available in
++       * the flash buffer this is clearly a BUG! */
++      BUG_ON(len > mtd->writesize + mtd->oobsize - col);
++      n = len;
++#endif
+       while (n) {
+               void __iomem *p;
+               if (col < mtd->writesize)
+-                      p = host->regs + MAIN_AREA0 + (col & ~3);
++                      p = host->nfc_buf + MAIN_AREA0 + (col & ~3);
+               else
+-                      p = host->regs + SPARE_AREA0 -
+-                                      mtd->writesize + (col & ~3);
++                      p = host->nfc_buf + SPARE_AREA0 +
++                              (col & ~3) - mtd->writesize;
++
++              if (dbg_lvl(3)) {
++                      print_hex_dump(KERN_DEBUG, "spare: ", DUMP_PREFIX_ADDRESS,
++                                     16, 2, p, 64, 0);
++              }
+               if (((col | (int)&buf[i]) & 3) || n < 16) {
+                       uint32_t data;
+@@ -621,15 +811,20 @@ static void mxc_nand_read_buf(struct mtd
+                               m += mtd->oobsize;
+                       m = min(n, m) & ~3;
++                      DBG(1, "Copying %u byte from offset %03x[%p]\n",
++                          m + (col & 3), col, p);
++                      BUG_ON(m == 0);
+                       memcpy(&buf[i], p, m);
+                       col += m;
+                       i += m;
+                       n -= m;
+               }
+       }
++      if (dbg_lvl(1)) {
++              print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, buf, len);
++      }
+       /* Update saved column address */
+       host->col_addr = col;
+-
+ }
+ /* Used by the upper layer to verify the data in NAND Flash
+@@ -637,7 +832,22 @@ static void mxc_nand_read_buf(struct mtd
+ static int mxc_nand_verify_buf(struct mtd_info *mtd,
+                               const u_char *buf, int len)
+ {
+-      return -EFAULT;
++      struct nand_chip *nand_chip = mtd->priv;
++      struct mxc_nand_host *host = nand_chip->priv;
++      int i;
++      u16 *wp = host->nfc_buf + MAIN_AREA0;
++
++      for (i = 0; i < len >> 1; i++) {
++              u16 w = *wp++;
++              u8 c1 = *buf++;
++              u8 c2 = *buf++;
++              if ((w & 0xff) != c1 || (w >> 8) != c2) {
++                      DBG(0, "%s: verify error @ %03x: read: %02x %02x expected: %02x %02x\n",
++                          __FUNCTION__, i, w & 0xff, w >> 8, c1, c2);
++                      return -EFAULT;
++              }
++      }
++      return 0;
+ }
+ /* This function is used by upper layer for select and
+@@ -655,13 +865,15 @@ static void mxc_nand_select_chip(struct 
+       }
+       if (chip == -1) {
+-              writew(readw(host->regs + NFC_CONFIG1) & ~NFC_CE,
+-                              host->regs + NFC_CONFIG1);
++              nfc_write_reg(host->regs,
++                      nfc_read_reg(host->regs, NFC_CONFIG1) & ~NFC_CE,
++                      NFC_CONFIG1);
+               return;
+       }
+-      writew(readw(host->regs + NFC_CONFIG1) | NFC_CE,
+-                      host->regs + NFC_CONFIG1);
++      nfc_write_reg(host->regs,
++                      nfc_read_reg(host->regs, NFC_CONFIG1) | NFC_CE,
++                      NFC_CONFIG1);
+ #endif
+       switch (chip) {
+@@ -679,9 +891,6 @@ static void mxc_nand_select_chip(struct 
+                       host->clk_act = 1;
+               }
+               break;
+-
+-      default:
+-              break;
+       }
+ }
+@@ -692,7 +901,7 @@ static void mxc_nand_command(struct mtd_
+ {
+       struct nand_chip *nand_chip = mtd->priv;
+       struct mxc_nand_host *host = nand_chip->priv;
+-      int useirq = true;
++      int useirq = false;
+       DEBUG(MTD_DEBUG_LEVEL3,
+             "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
+@@ -712,13 +921,11 @@ static void mxc_nand_command(struct mtd_
+       case NAND_CMD_READ0:
+               host->col_addr = column;
+               host->spare_only = false;
+-              useirq = false;
+               break;
+       case NAND_CMD_READOOB:
+               host->col_addr = column;
+               host->spare_only = true;
+-              useirq = false;
+               if (host->pagesize_2k)
+                       command = NAND_CMD_READ0; /* only READ0 is valid */
+               break;
+@@ -751,23 +958,25 @@ static void mxc_nand_command(struct mtd_
+                       if (!host->pagesize_2k)
+                               send_cmd(host, NAND_CMD_READ0, false);
+               }
+-              useirq = false;
+               break;
+       case NAND_CMD_PAGEPROG:
+               send_prog_page(host, 0, host->spare_only);
+-
++#ifndef CONFIG_ARCH_MXC_HAS_NFC_V1_1
+               if (host->pagesize_2k) {
+                       /* data in 4 areas datas */
+                       send_prog_page(host, 1, host->spare_only);
+                       send_prog_page(host, 2, host->spare_only);
+                       send_prog_page(host, 3, host->spare_only);
+               }
+-
++#endif
++              useirq = true;
+               break;
+       case NAND_CMD_ERASE1:
+-              useirq = false;
++              break;
++      case NAND_CMD_ERASE2:
++              useirq = true;
+               break;
+       }
+@@ -791,23 +1000,13 @@ static void mxc_nand_command(struct mtd_
+       /* Write out page address, if necessary */
+       if (page_addr != -1) {
+-              /* paddr_0 - p_addr_7 */
+-              send_addr(host, (page_addr & 0xff), false);
++              u32 page_mask = nand_chip->pagemask;
+-              if (host->pagesize_2k) {
+-                      send_addr(host, (page_addr >> 8) & 0xFF, false);
+-                      if (mtd->size >= 0x40000000)
+-                              send_addr(host, (page_addr >> 16) & 0xff, true);
+-              } else {
+-                      /* One more address cycle for higher density devices */
+-                      if (mtd->size >= 0x4000000) {
+-                              /* paddr_8 - paddr_15 */
+-                              send_addr(host, (page_addr >> 8) & 0xff, false);
+-                              send_addr(host, (page_addr >> 16) & 0xff, true);
+-                      } else
+-                              /* paddr_8 - paddr_15 */
+-                              send_addr(host, (page_addr >> 8) & 0xff, true);
+-              }
++              do {
++                      send_addr(host, (page_addr & 0xff), false);
++                      page_mask >>= 8;
++                      page_addr >>= 8;
++              } while (page_mask != 0);
+       }
+       /* Command post-processing step */
+@@ -823,14 +1022,17 @@ static void mxc_nand_command(struct mtd_
+                       send_cmd(host, NAND_CMD_READSTART, true);
+                       /* read for each AREA */
+                       send_read_page(host, 0, host->spare_only);
++#ifndef CONFIG_ARCH_MXC_HAS_NFC_V1_1
+                       send_read_page(host, 1, host->spare_only);
+                       send_read_page(host, 2, host->spare_only);
+                       send_read_page(host, 3, host->spare_only);
++#endif
+               } else
+                       send_read_page(host, 0, host->spare_only);
+               break;
+       case NAND_CMD_READID:
++              host->col_addr = 0;
+               send_read_id(host);
+               break;
+@@ -851,9 +1053,12 @@ static int __init mxcnd_probe(struct pla
+       struct mtd_info *mtd;
+       struct mxc_nand_platform_data *pdata = pdev->dev.platform_data;
+       struct mxc_nand_host *host;
+-      struct resource *res;
++      struct resource *res1, *res2;
+       uint16_t tmp;
+-      int err = 0, nr_parts = 0;
++      int err, nr_parts;
++
++      DBG(0, "%s: pdata=%p hw_ecc=%d width=%d\n", __FUNCTION__,
++          pdata, pdata->hw_ecc, pdata->width);
+       /* Allocate memory for MTD device structure and private data */
+       host = kzalloc(sizeof(struct mxc_nand_host), GFP_KERNEL);
+@@ -868,9 +1073,6 @@ static int __init mxcnd_probe(struct pla
+       mtd->owner = THIS_MODULE;
+       mtd->dev.parent = &pdev->dev;
+-      /* 50 us command delay time */
+-      this->chip_delay = 5;
+-
+       this->priv = host;
+       this->dev_ready = mxc_nand_dev_ready;
+       this->cmdfunc = mxc_nand_command;
+@@ -880,29 +1082,54 @@ static int __init mxcnd_probe(struct pla
+       this->write_buf = mxc_nand_write_buf;
+       this->read_buf = mxc_nand_read_buf;
+       this->verify_buf = mxc_nand_verify_buf;
++#ifdef CONFIG_MTD_NAND_MXC_FLASH_BBT
++      this->bbt_td = &bbt_main_descr;
++      this->bbt_md = &bbt_mirror_descr;
++      this->options |= NAND_USE_FLASH_BBT;
++#endif
+-      host->clk = clk_get(&pdev->dev, "nfc");
+-      if (IS_ERR(host->clk))
++      host->clk = clk_get(&pdev->dev, "nfc_clk");
++      if (IS_ERR(host->clk)) {
++              err = PTR_ERR(host->clk);
+               goto eclk;
++      }
+       clk_enable(host->clk);
+       host->clk_act = 1;
+-      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+-      if (!res) {
++      res1 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      res2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++      if (!res1 || !res2) {
+               err = -ENODEV;
+               goto eres;
+       }
+-      host->regs = ioremap(res->start, res->end - res->start + 1);
++      if (!request_mem_region(res1->start, resource_size(res1), "mxc_nand regs")) {
++              err = -EBUSY;
++              goto ereq1;
++      }
++
++      if (!request_mem_region(res2->start, resource_size(res2), "mxc_nand buffer")) {
++              err = -EBUSY;
++              goto ereq2;
++      }
++
++      host->regs = ioremap(res1->start, resource_size(res1));
+       if (!host->regs) {
+-              err = -EIO;
+-              goto eres;
++              err = -ENOMEM;
++              goto eunmap1;
+       }
+-      tmp = readw(host->regs + NFC_CONFIG1);
++      host->nfc_buf = ioremap(res2->start, resource_size(res2));
++      if (!host->nfc_buf) {
++                      err = -ENOMEM;
++                      goto eunmap2;
++      }
++
++      tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
+       tmp |= NFC_INT_MSK;
+-      writew(tmp, host->regs + NFC_CONFIG1);
++      nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
++      nfc_write_reg(0, host->regs, NFC_CONFIG2);
+       init_waitqueue_head(&host->irq_waitq);
+@@ -912,57 +1139,84 @@ static int __init mxcnd_probe(struct pla
+       if (err)
+               goto eirq;
+-      if (pdata->hw_ecc) {
+-              this->ecc.calculate = mxc_nand_calculate_ecc;
+-              this->ecc.hwctl = mxc_nand_enable_hwecc;
+-              this->ecc.correct = mxc_nand_correct_data;
+-              this->ecc.mode = NAND_ECC_HW;
+-              this->ecc.size = 512;
+-              this->ecc.bytes = 3;
+-              this->ecc.layout = &nand_hw_eccoob_8;
+-              tmp = readw(host->regs + NFC_CONFIG1);
+-              tmp |= NFC_ECC_EN;
+-              writew(tmp, host->regs + NFC_CONFIG1);
+-      } else {
+-              this->ecc.size = 512;
+-              this->ecc.bytes = 3;
+-              this->ecc.layout = &nand_hw_eccoob_8;
+-              this->ecc.mode = NAND_ECC_SOFT;
+-              tmp = readw(host->regs + NFC_CONFIG1);
+-              tmp &= ~NFC_ECC_EN;
+-              writew(tmp, host->regs + NFC_CONFIG1);
+-      }
+-
+       /* Reset NAND */
+       this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+       /* preset operation */
+       /* Unlock the internal RAM Buffer */
+-      writew(0x2, host->regs + NFC_CONFIG);
++      nfc_write_reg(0x2, host->regs, NFC_CONFIG);
+       /* Blocks to be unlocked */
+-      writew(0x0, host->regs + NFC_UNLOCKSTART_BLKADDR);
+-      writew(0x4000, host->regs + NFC_UNLOCKEND_BLKADDR);
++      nfc_write_reg(0x0, host->regs, NFC_UNLOCKSTART_BLKADDR);
++      nfc_write_reg(0x4000, host->regs, NFC_UNLOCKEND_BLKADDR);
+       /* Unlock Block Command for given address range */
+-      writew(0x4, host->regs + NFC_WRPROT);
++      nfc_write_reg(0x4, host->regs, NFC_WRPROT);
+       /* NAND bus width determines access funtions used by upper layer */
+       if (pdata->width == 2) {
+               this->options |= NAND_BUSWIDTH_16;
+-              this->ecc.layout = &nand_hw_eccoob_16;
+       }
+-      host->pagesize_2k = 0;
+-
+       /* Scan to find existence of the device */
+-      if (nand_scan(mtd, 1)) {
++      err = nand_scan_ident(mtd, 1);
++      if (err) {
+               DEBUG(MTD_DEBUG_LEVEL0,
+                     "MXC_ND: Unable to find any NAND device.\n");
+-              err = -ENXIO;
++              goto escan;
++      }
++      /* this is required before completing the scan */
++      host->pagesize_2k = (mtd->writesize == 2048);
++      tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
++      tmp |= NFC_ONE_CYCLE;
++      tmp &= ~(3 << 9); /* clear PPB mask */
++      DBG(0, "%s: ppb=%d (%02x)\n", __FUNCTION__,
++          mtd->erasesize / mtd->writesize,
++          ffs(mtd->erasesize / mtd->writesize) - 6);
++
++      /* set PPB (pages per block */
++      tmp |= (ffs(mtd->erasesize / mtd->writesize) - 6) << 9;
++      nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
++      if (pdata->width == 2) {
++              if (host->pagesize_2k) {
++                      this->ecc.layout = &nand_hw_eccoob2k_16;
++              } else {
++                      this->ecc.layout = &nand_hw_eccoob_16;
++              }
++      } else {
++              if (host->pagesize_2k) {
++                      this->ecc.layout = &nand_hw_eccoob2k_8;
++              } else {
++                      this->ecc.layout = &nand_hw_eccoob_8;
++              }
++      }
++      if (pdata->hw_ecc) {
++              this->ecc.calculate = mxc_nand_calculate_ecc;
++              this->ecc.hwctl = mxc_nand_enable_hwecc;
++              this->ecc.correct = mxc_nand_correct_data;
++              this->ecc.mode = NAND_ECC_HW;
++              this->ecc.size = 512;
++              this->ecc.bytes = 3;
++              tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
++              tmp |= NFC_ECC_EN;
++              nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
++      } else {
++              this->ecc.size = 512;
++              this->ecc.bytes = 3;
++              this->ecc.mode = NAND_ECC_SOFT;
++              tmp = nfc_read_reg(host->regs, NFC_CONFIG1);
++              tmp &= ~NFC_ECC_EN;
++              nfc_write_reg(tmp, host->regs, NFC_CONFIG1);
++      }
++
++      err = nand_scan_tail(mtd);
++      if (err) {
+               goto escan;
+       }
++      pr_info("MXC MTD nand Driver IRQ %d bus width: %u bit %s ECC IO: %08lx\n",
++              host->irq, pdata->width * 8, pdata->hw_ecc ? "HW" : "SW",
++              (unsigned long)res1->start);
+       /* Register the partitions */
+ #ifdef CONFIG_MTD_PARTITIONS
+       nr_parts =
+@@ -981,10 +1235,19 @@ static int __init mxcnd_probe(struct pla
+       return 0;
+ escan:
+-      free_irq(host->irq, NULL);
++      free_irq(host->irq, host);
+ eirq:
++      if (res2)
++              iounmap(host->nfc_buf);
++eunmap2:
+       iounmap(host->regs);
++eunmap1:
++      release_mem_region(res2->start, resource_size(res2));
++ereq2:
++      release_mem_region(res1->start, resource_size(res1));
++ereq1:
+ eres:
++      clk_disable(host->clk);
+       clk_put(host->clk);
+ eclk:
+       kfree(host);
+@@ -995,46 +1258,63 @@ eclk:
+ static int __devexit mxcnd_remove(struct platform_device *pdev)
+ {
+       struct mxc_nand_host *host = platform_get_drvdata(pdev);
++      struct resource *res;
++      if (host->clk_act)
++              clk_disable(host->clk);
+       clk_put(host->clk);
+-      platform_set_drvdata(pdev, NULL);
+-
+       nand_release(&host->mtd);
+-      free_irq(host->irq, NULL);
++      free_irq(host->irq, host);
+       iounmap(host->regs);
+       kfree(host);
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (res) {
++              release_mem_region(res->start, resource_size(res));
++      }
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++      if (res) {
++              release_mem_region(res->start, resource_size(res));
++      }
+       return 0;
+ }
+ #ifdef CONFIG_PM
+ static int mxcnd_suspend(struct platform_device *pdev, pm_message_t state)
+ {
+-      struct mtd_info *info = platform_get_drvdata(pdev);
++      struct mtd_info *mtd = platform_get_drvdata(pdev);
++      struct nand_chip *nand_chip = mtd->priv;
++      struct mxc_nand_host *host = nand_chip->priv;
+       int ret = 0;
+       DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND suspend\n");
+-      if (info)
+-              ret = info->suspend(info);
++      if (mtd)
++              ret = mtd->suspend(mtd);
+-      /* Disable the NFC clock */
+-      clk_disable(nfc_clk);   /* FIXME */
++      if (host->clk_act) {
++              /* Disable the NFC clock */
++              clk_disable(host->clk);
++      }
+       return ret;
+ }
+ static int mxcnd_resume(struct platform_device *pdev)
+ {
+-      struct mtd_info *info = platform_get_drvdata(pdev);
++      struct mtd_info *mtd = platform_get_drvdata(pdev);
++      struct nand_chip *nand_chip = mtd->priv;
++      struct mxc_nand_host *host = nand_chip->priv;
+       int ret = 0;
+       DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND : NAND resume\n");
+-      /* Enable the NFC clock */
+-      clk_enable(nfc_clk);    /* FIXME */
+-      if (info)
+-              info->resume(info);
++      if (host->clk_act) {
++              /* Enable the NFC clock */
++              clk_enable(host->clk);
++      }
++      if (mtd)
++              mtd->resume(mtd);
+       return ret;
+ }
+@@ -1047,7 +1327,7 @@ static int mxcnd_resume(struct platform_
+ static struct platform_driver mxcnd_driver = {
+       .driver = {
+                  .name = DRIVER_NAME,
+-                 },
++      },
+       .remove = __exit_p(mxcnd_remove),
+       .suspend = mxcnd_suspend,
+       .resume = mxcnd_resume,
+@@ -1055,13 +1335,14 @@ static struct platform_driver mxcnd_driv
+ static int __init mxc_nd_init(void)
+ {
++      int ret;
++
+       /* Register the device driver structure. */
+-      pr_info("MXC MTD nand Driver\n");
+-      if (platform_driver_probe(&mxcnd_driver, mxcnd_probe) != 0) {
++      ret = platform_driver_probe(&mxcnd_driver, mxcnd_probe);
++      if (ret != 0) {
+               printk(KERN_ERR "Driver register failed for mxcnd_driver\n");
+-              return -ENODEV;
+       }
+-      return 0;
++      return ret;
+ }
+ static void __exit mxc_nd_cleanup(void)
+diff -urNp linux-2.6.30-rc4/drivers/net/Kconfig linux-2.6.30-rc4-karo/drivers/net/Kconfig
+--- linux-2.6.30-rc4/drivers/net/Kconfig       2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/net/Kconfig  2009-06-02 18:42:32.000000000 +0200
+@@ -1859,7 +1859,7 @@ config 68360_ENET
+ config FEC
+       bool "FEC ethernet controller (of ColdFire CPUs)"
+-      depends on M523x || M527x || M5272 || M528x || M520x || M532x || MACH_MX27
++      depends on M523x || M527x || M5272 || M528x || M520x || M532x || MACH_MX27 || MACH_TX25
+       help
+         Say Y here if you want to use the built-in 10/100 Fast ethernet
+         controller on some Motorola ColdFire and Freescale i.MX processors.
+diff -urNp linux-2.6.30-rc4/drivers/net/fec.c linux-2.6.30-rc4-karo/drivers/net/fec.c
+--- linux-2.6.30-rc4/drivers/net/fec.c 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/net/fec.c    2009-06-02 18:43:03.000000000 +0200
+@@ -2,6 +2,12 @@
+  * Fast Ethernet Controller (FEC) driver for Motorola MPC8xx.
+  * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
+  *
++ * This version of the driver is specific to the FADS implementation,
++ * since the board contains control registers external to the processor
++ * for the control of the LevelOne LXT970 transceiver.  The MPC860T manual
++ * describes connections using the internal parallel port I/O, which
++ * is basically all of Port D.
++ *
+  * Right now, I am very wasteful with the buffers.  I allocate memory
+  * pages and then divide them into 2K frame buffers.  This way I know I
+  * have buffers large enough to hold one frame within one buffer descriptor.
+@@ -18,77 +24,123 @@
+  * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be)
+  * Copyright (c) 2004-2006 Macq Electronique SA.
+  */
++/*
++ * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/ptrace.h>
++#include <linux/resource.h>
+ #include <linux/errno.h>
+ #include <linux/ioport.h>
+ #include <linux/slab.h>
+ #include <linux/interrupt.h>
+-#include <linux/pci.h>
+-#include <linux/init.h>
++#include <linux/wait.h>
+ #include <linux/delay.h>
++#include <linux/platform_device.h>
+ #include <linux/netdevice.h>
+ #include <linux/etherdevice.h>
+ #include <linux/skbuff.h>
+ #include <linux/spinlock.h>
+-#include <linux/workqueue.h>
+-#include <linux/bitops.h>
+-#include <linux/io.h>
+-#include <linux/irq.h>
++#include <linux/dma-mapping.h>
+ #include <linux/clk.h>
+-#include <linux/platform_device.h>
++#include <linux/fec_enet.h>
++#include <linux/phy.h>
+-#include <asm/cacheflush.h>
++#include <asm/irq.h>
++#include <asm/io.h>
+-#ifndef CONFIG_ARCH_MXC
+-#include <asm/coldfire.h>
+-#include <asm/mcfsim.h>
++#define DRV_NAME              "fec"
++#define DEBUG
++
++#ifdef DEBUG
++static int debug = 0;
++#define dbg_lvl(n)    ((n) < debug)
++module_param(debug, int, S_IRUGO | S_IWUSR);
++
++#define DBG(lvl, fmt...)      do { if (dbg_lvl(lvl)) printk(KERN_DEBUG fmt); } while (0)
++#else
++static int debug;
++#define dbg_lvl(n)    0
++module_param(debug, int, 0);
++
++#define DBG(lvl, fmt...)      do { } while (0)
+ #endif
++#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
++    defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
++    defined(CONFIG_M520x) || defined(CONFIG_M532x)
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
+ #include "fec.h"
+-
+-#ifdef CONFIG_ARCH_MXC
++#define FEC_ALIGNMENT  (0x03)          /*FEC needs 4bytes alignment*/
++#elif defined(CONFIG_ARCH_MXC)
+ #include <mach/hardware.h>
+-#define FEC_ALIGNMENT 0xf
++#include <mach/iim.h>
++#include "fec.h"
++#define FEC_ALIGNMENT  (0x0F)          /*FEC needs 128bits(16bytes) alignment*/
+ #else
+-#define FEC_ALIGNMENT 0x3
++#include <asm/8xx_immap.h>
++#include <asm/mpc8xx.h>
++#include "commproc.h"
++#define FEC_ALIGNMENT  (0x03)          /*FEC needs 4bytes alignment */
+ #endif
++#define FEC_ADDR_ALIGNMENT(x) ((unsigned char *)(((unsigned long)(x) + (FEC_ALIGNMENT)) & (~FEC_ALIGNMENT)))
++
++#if 0
+ /*
+  * Define the fixed address of the FEC hardware.
+  */
++/* USE resources provided by platform_device! */
++static unsigned int fec_hw[] = {
+ #if defined(CONFIG_M5272)
+-#define HAVE_mii_link_interrupt
+-
+-static unsigned char  fec_mac_default[] = {
+-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++      (MCF_MBAR + 0x840),
++#elif defined(CONFIG_M527x)
++      (MCF_MBAR + 0x1000),
++      (MCF_MBAR + 0x1800),
++#elif defined(CONFIG_M523x) || defined(CONFIG_M528x)
++      (MCF_MBAR + 0x1000),
++#elif defined(CONFIG_M520x)
++      (MCF_MBAR+0x30000),
++#elif defined(CONFIG_M532x)
++      (MCF_MBAR+0xfc030000),
++#elif defined(CONFIG_ARCH_MXC)
++      (IO_ADDRESS(FEC_BASE_ADDR)),
++#else
++      &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec),
++#endif
+ };
++#endif
++#if 0
+ /*
+  * Some hardware gets it MAC address out of local flash memory.
+  * if this is non-zero then assume it is the address to get MAC from.
+  */
++/* implemented using platform_data! */
+ #if defined(CONFIG_NETtel)
+ #define       FEC_FLASHMAC    0xf0006006
+ #elif defined(CONFIG_GILBARCONAP) || defined(CONFIG_SCALES)
+ #define       FEC_FLASHMAC    0xf0006000
++#elif defined (CONFIG_MTD_KeyTechnology)
++#define       FEC_FLASHMAC    0xffe04000
+ #elif defined(CONFIG_CANCam)
+ #define       FEC_FLASHMAC    0xf0020000
+ #elif defined (CONFIG_M5272C3)
+ #define       FEC_FLASHMAC    (0xffe04000 + 4)
+ #elif defined(CONFIG_MOD5272)
+-#define FEC_FLASHMAC  0xffc0406b
++#define FEC_FLASHMAC  0xffc0406b
+ #else
+ #define       FEC_FLASHMAC    0
+ #endif
+-#endif /* CONFIG_M5272 */
++#endif
++
++#define platform_func(p, args...)     ((p) ? (p)(args) : 0)
+ /* Forward declarations of some structures to support different PHYs
+ */
+-
++#ifndef CONFIG_PHYLIB
+ typedef struct {
+       uint mii_data;
+       void (*funct)(uint mii_reg, struct net_device *dev);
+@@ -103,6 +155,7 @@ typedef struct {
+       const phy_cmd_t *ack_int;
+       const phy_cmd_t *shutdown;
+ } phy_info_t;
++#endif
+ /* The number of Tx and Rx buffers.  These are allocated from the page
+  * pool.  The code may assume these are power of two, so it it best
+@@ -116,12 +169,13 @@ typedef struct {
+ #define RX_RING_SIZE          (FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
+ #define FEC_ENET_TX_FRSIZE    2048
+ #define FEC_ENET_TX_FRPPG     (PAGE_SIZE / FEC_ENET_TX_FRSIZE)
+-#define TX_RING_SIZE          16      /* Must be power of two */
+-#define TX_RING_MOD_MASK      15      /*   for this to work */
++#define TX_RING_SIZE          16                      /* Must be power of two */
++#define TX_RING_MOD_MASK      (TX_RING_SIZE - 1)      /*   for this to work */
+ #if (((RX_RING_SIZE + TX_RING_SIZE) * 8) > PAGE_SIZE)
+ #error "FEC: descriptor ring size constants too large"
+ #endif
++#define CBD_BUF_SIZE          ((RX_RING_SIZE + TX_RING_SIZE) * sizeof(cbd_t))
+ /* Interrupt events/masks.
+ */
+@@ -136,6 +190,17 @@ typedef struct {
+ #define FEC_ENET_MII  ((uint)0x00800000)      /* MII interrupt */
+ #define FEC_ENET_EBERR        ((uint)0x00400000)      /* SDMA bus error */
++/* MXC arch interrupt bits */
++#define FEC_ENET_LC   ((uint)0x00200000)      /* Late collision */
++#define FEC_ENET_RL   ((uint)0x00100000)      /* Collision retry limit exceeded */
++#define FEC_ENET_UN   ((uint)0x00080000)      /* TX Fifo underrun */
++
++#ifndef CONFIG_ARCH_MXC
++#define FEC_ENET_MASK   ((uint)0xffc00000)
++#else
++#define FEC_ENET_MASK   ((uint)0xfff80000)
++#endif
++
+ /* The FEC stores dest/src/type, data, and checksum for receive packets.
+  */
+ #define PKT_MAXBUF_SIZE               1518
+@@ -150,7 +215,7 @@ typedef struct {
+  */
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+     defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARCH_MXC)
+-#define       OPT_FRAME_SIZE  (PKT_MAXBUF_SIZE << 16)
++#define       OPT_FRAME_SIZE  (RCR_MAX_FL_set(PKT_MAXBUF_SIZE))
+ #else
+ #define       OPT_FRAME_SIZE  0
+ #endif
+@@ -165,31 +230,45 @@ typedef struct {
+  */
+ struct fec_enet_private {
+       /* Hardware registers of the FEC device */
+-      volatile fec_t  *hwp;
+-
+-      struct net_device *netdev;
+-
+-      struct clk *clk;
++      void __iomem *reg_base;
++      void __iomem *mib_base;
++      struct resource *res_mem1;
++      struct resource *res_mem2;
++      int     etn_irq;
++      int     mii_irq;
++#ifndef CONFIG_PHYLIB
++      struct timer_list *phy_timer;
++#else
++      struct mii_bus *mii;
++      int mii_complete;
++#endif
++      u32 msg_enable;
+       /* The saved address of a sent-in-place packet/buffer, for skfree(). */
+-      unsigned char *tx_bounce[TX_RING_SIZE];
++      void    *tx_bounce[TX_RING_SIZE];
+       struct  sk_buff* tx_skbuff[TX_RING_SIZE];
++      struct  sk_buff* rx_skbuff[RX_RING_SIZE];
+       ushort  skb_cur;
+       ushort  skb_dirty;
+       /* CPM dual port RAM relative addresses.
+       */
+-      dma_addr_t      bd_dma;
++      struct device *dma_dev;         /* pointer to (platform_)device for dma_sync*() functions */
++      void    *cbd_mem_base;          /* save the virtual base address of rx&tx buffer descriptor */
++      dma_addr_t cbd_phys_base;       /* physical address of buffer descriptor memory for access by FEC HW */
++
+       cbd_t   *rx_bd_base;            /* Address of Rx and Tx buffers. */
+       cbd_t   *tx_bd_base;
+-      cbd_t   *cur_rx, *cur_tx;               /* The next free ring entry */
+-      cbd_t   *dirty_tx;      /* The ring entries to be free()ed. */
++      cbd_t   *cur_rx, *cur_tx;       /* The next free ring entry */
++      cbd_t   *dirty_tx;              /* The ring entries to be free()ed. */
++      struct  net_device_stats stats;
+       uint    tx_full;
+-      /* hold while accessing the HW like ringbuffer for tx/rx but not MAC */
+-      spinlock_t hw_lock;
+-      /* hold while accessing the mii_list_t() elements */
+-      spinlock_t mii_lock;
++      spinlock_t lock;
++#ifdef CONFIG_PHYLIB
++      struct  phy_device *phy;
++      uint    phy_speed;
++#else
+       uint    phy_id;
+       uint    phy_id_done;
+       uint    phy_status;
+@@ -199,28 +278,41 @@ struct fec_enet_private {
+       uint    sequence_done;
+       uint    mii_phy_task_queued;
+-
++#endif
+       uint    phy_addr;
+-      int     index;
+-      int     opened;
+-      int     link;
+-      int     old_link;
+-      int     full_duplex;
++      unsigned int opened:1;
++      unsigned int phy_int_enabled:1;
++      unsigned int linkstatus:1;
++#ifndef CONFIG_PHYLIB
++      unsigned int old_linkstatus:1;
++#endif
++      unsigned int full_duplex:1;
++
++      struct clk *clk;
+ };
+-static int fec_enet_open(struct net_device *dev);
+-static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
+-static void fec_enet_mii(struct net_device *dev);
+-static irqreturn_t fec_enet_interrupt(int irq, void * dev_id);
++#ifdef CONFIG_PHYLIB
++static int fec_connect_phy(struct net_device *dev, struct fec_enet_private *fep);
++#else
++static irqreturn_t mii_link_interrupt(int irq, void *dev_id);
++#endif
++static void fec_restart(struct net_device *dev, int duplex);
+ static void fec_enet_tx(struct net_device *dev);
+ static void fec_enet_rx(struct net_device *dev);
+-static int fec_enet_close(struct net_device *dev);
+-static void set_multicast_list(struct net_device *dev);
+-static void fec_restart(struct net_device *dev, int duplex);
++static void fec_enet_mii(struct net_device *dev);
+ static void fec_stop(struct net_device *dev);
+-static void fec_set_mac_address(struct net_device *dev);
++static void _fec_set_mac_address(struct net_device *dev);
++/*
++ *  fec_copy_threshold controls the copy when receiving ethernet frame.
++ *     If ethernet header is aligned on a 4byte boundary, the ip header and
++ *     higher level header will not be aligned.
++ *     The reason is, that an ethernet header is 14bytes long.
++ *     And the max size of tcp & ip header is 128bytes. Normally it is 40bytes.
++ *     So I set the default value between 128 to 256.
++ */
++static int fec_copy_threshold = 192;
+ /* MII processing.  We keep this as simple as possible.  Requests are
+  * placed on the list (if there is room).  When the request is finished
+@@ -232,14 +324,16 @@ typedef struct mii_list {
+       struct  mii_list *mii_next;
+ } mii_list_t;
++#ifndef CONFIG_PHYLIB
+ #define               NMII    20
+ static mii_list_t     mii_cmds[NMII];
+ static mii_list_t     *mii_free;
+ static mii_list_t     *mii_head;
+ static mii_list_t     *mii_tail;
+-static int    mii_queue(struct net_device *dev, int request,
+-                              void (*func)(uint, struct net_device *));
++static int mii_queue(struct net_device *dev, int request,
++                   void (*func)(uint, struct net_device *));
++#endif
+ /* Make MII read/write commands for the FEC.
+ */
+@@ -284,87 +378,233 @@ static int      mii_queue(struct net_device *
+ #define PHY_STAT_100HDX       0x4000  /* 100 Mbit half duplex selected */
+ #define PHY_STAT_100FDX       0x8000  /* 100 Mbit full duplex selected */
++#ifndef DEBUG
++static inline unsigned long fec_reg_read(struct fec_enet_private *fep, unsigned int reg)
++{
++      return readl(fep->reg_base + reg);
++}
++
++static inline void fec_reg_write(struct fec_enet_private *fep, unsigned int reg, unsigned long val)
++{
++      writel(val, fep->reg_base + reg);
++}
++#else
++#define fec_reg_read(fep, reg)                __fec_reg_read(fep, reg, __FUNCTION__, #reg)
++#define fec_reg_write(fep, reg, val)  __fec_reg_write(fep, reg, val, __FUNCTION__, #reg)
++
++static inline unsigned long __fec_reg_read(struct fec_enet_private *fep, unsigned int reg,
++                                         const char *func, const char *reg_name)
++{
++      unsigned long val = readl(fep->reg_base + reg);
++      DBG(3, "%s: Read %08lx from %s(%03x)\n", func, val, reg_name, reg);
++      return val;
++}
++
++static inline void __fec_reg_write(struct fec_enet_private *fep, unsigned int reg,
++                                 unsigned long val, const char *func, const char *reg_name)
++{
++      DBG(3, "%s: Writing %08lx to %s(%03x)\n", func, val, reg_name, reg);
++      writel(val, fep->reg_base + reg);
++}
++#endif
++
++static inline void fec_enet_cbd_get(struct fec_enet_private *fep)
++{
++      DBG(2, "%s: Requesting cbd area: %08lx\n", __FUNCTION__,
++          (unsigned long)fep->cbd_phys_base);
++      dma_sync_single_for_cpu(fep->dma_dev, fep->cbd_phys_base,
++                              CBD_BUF_SIZE, DMA_BIDIRECTIONAL);
++}
++
++static inline void fec_enet_cbd_put(struct fec_enet_private *fep)
++{
++      DBG(2, "%s: Flushing changes to cbd area\n", __FUNCTION__);
++      dma_sync_single_for_device(fep->dma_dev, fep->cbd_phys_base,
++                                 CBD_BUF_SIZE, DMA_BIDIRECTIONAL);
++}
++
++static inline void fec_enet_rxbuf_get(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Requesting RX buffer %08lx(%u)\n", __FUNCTION__,
++          (unsigned long)bdp->cbd_bufaddr, len);
++      dma_sync_single_for_cpu(fep->dma_dev, bdp->cbd_bufaddr,
++                              len, DMA_FROM_DEVICE);
++}
++
++static inline void fec_enet_rxbuf_put(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Releasing RX buffer %08lx(%u)\n", __FUNCTION__, (ulong)bdp->cbd_bufaddr, len);
++      dma_sync_single_for_device(fep->dma_dev, bdp->cbd_bufaddr, len, DMA_FROM_DEVICE);
++}
++
++static inline void fec_enet_rxbuf_map(struct fec_enet_private *fep, cbd_t *bdp,
++                                    void *buf, ushort len)
++{
++      BUG_ON(!dma_mapping_error(fep->dma_dev, bdp->cbd_bufaddr));
++      bdp->cbd_bufaddr = dma_map_single(fep->dma_dev, buf,
++                                        len, DMA_FROM_DEVICE);
++      DBG(2, "%s: RX buffer %p(%u) mapped to %08lx\n", __FUNCTION__,
++          buf, len, (unsigned long)bdp->cbd_bufaddr);
++}
++
++static inline void fec_enet_rxbuf_unmap(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Unmapping RX buffer %08lx(%u)\n", __FUNCTION__,
++          (unsigned long)bdp->cbd_bufaddr, len);
++      BUG_ON(dma_mapping_error(fep->dma_dev, bdp->cbd_bufaddr));
++      dma_unmap_single(fep->dma_dev, bdp->cbd_bufaddr,
++                       len, DMA_FROM_DEVICE);
++      bdp->cbd_bufaddr = ~0;
++}
++
++static inline void fec_enet_txbuf_map(struct fec_enet_private *fep, cbd_t *bdp,
++                                    void *buf, ushort len)
++{
++      BUG_ON(!dma_mapping_error(fep->dma_dev, bdp->cbd_bufaddr));
++      bdp->cbd_bufaddr = dma_map_single(fep->dma_dev, buf,
++                                        len, DMA_TO_DEVICE);
++      DBG(2, "%s: TX buffer %p(%u) mapped to %08lx\n", __FUNCTION__,
++          buf, len, (unsigned long)bdp->cbd_bufaddr);
++}
++
++static inline void fec_enet_txbuf_unmap(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Unmapping TX buffer %08lx(%u)\n", __FUNCTION__,
++          (unsigned long)bdp->cbd_bufaddr, len);
++      BUG_ON(dma_mapping_error(fep->dma_dev, bdp->cbd_bufaddr));
++      dma_unmap_single(fep->dma_dev, bdp->cbd_bufaddr,
++                       len, DMA_TO_DEVICE);
++      bdp->cbd_bufaddr = ~0;
++}
++
++static inline void fec_enet_txbuf_get(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Requesting TX buffer %08lx(%u)\n", __FUNCTION__,
++          (unsigned long)bdp->cbd_bufaddr, len);
++      dma_sync_single_for_cpu(fep->dma_dev, bdp->cbd_bufaddr,
++                              len, DMA_TO_DEVICE);
++}
++
++static inline void fec_enet_txbuf_put(struct fec_enet_private *fep, cbd_t *bdp, ushort len)
++{
++      DBG(2, "%s: Releasing TX buffer %08lx(%u)\n", __FUNCTION__,
++          (unsigned long)bdp->cbd_bufaddr, len);
++      dma_sync_single_for_device(fep->dma_dev, bdp->cbd_bufaddr,
++                                 len, DMA_TO_DEVICE);
++}
++
++static void dump_packet(const char *prefix, const unsigned char *data, int len)
++{
++      if (dbg_lvl(3)) {
++              print_hex_dump_bytes(prefix, DUMP_PREFIX_OFFSET, data, len);
++      }
++}
++
++static void dump_tx_buffers(struct fec_enet_private *fep)
++{
++      cbd_t *bdp = fep->tx_bd_base;
++      int i;
++
++      printk(KERN_DEBUG "tx buffers: %u buffers\n", TX_RING_SIZE);
++      for (i = 0; i < TX_RING_SIZE; i++, bdp++) {
++              printk(KERN_DEBUG "  %p: %04x %04x %08x\n",
++                     bdp,
++                     bdp->cbd_sc,
++                     bdp->cbd_datlen,
++                     bdp->cbd_bufaddr);
++              print_hex_dump_bytes("tx buffers:", DUMP_PREFIX_ADDRESS, bdp, sizeof(cbd_t));
++      }
++}
++
++static void dump_rx_buffers(struct fec_enet_private *fep)
++{
++      cbd_t *bdp = fep->rx_bd_base;
++      int i;
++
++      printk(KERN_DEBUG "rx buffers: %lu buffers\n", RX_RING_SIZE);
++      for (i = 0; i < RX_RING_SIZE; i++, bdp++) {
++              printk(KERN_DEBUG "  %p: %04x %04x %08x\n",
++                     bdp,
++                     bdp->cbd_sc,
++                     bdp->cbd_datlen,
++                     bdp->cbd_bufaddr);
++              print_hex_dump_bytes("rx buffers:", DUMP_PREFIX_ADDRESS, bdp, sizeof(cbd_t));
++      }
++}
+ static int
+ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+-      struct fec_enet_private *fep;
+-      volatile fec_t  *fecp;
+-      volatile cbd_t  *bdp;
+-      unsigned short  status;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      cbd_t *bdp;
++      unsigned short status;
+       unsigned long flags;
+-      fep = netdev_priv(dev);
+-      fecp = (volatile fec_t*)dev->base_addr;
+-
+-      if (!fep->link) {
++      if (!fep->linkstatus) {
++              DBG(0, "%s: Cannot send packet; link is down\n", __FUNCTION__);
+               /* Link is down or autonegotiation is in progress. */
+               return 1;
+       }
+-      spin_lock_irqsave(&fep->hw_lock, flags);
++      spin_lock_irqsave(&fep->lock, flags);
++
++      //WARN_ON(fec_reg_read(fep, FEC_TDAR) & TDAR_BUSY);
++      fec_enet_cbd_get(fep);
++
+       /* Fill in a Tx ring entry */
+       bdp = fep->cur_tx;
+       status = bdp->cbd_sc;
+-#ifndef final_version
++#ifdef DEBUG
+       if (status & BD_ENET_TX_READY) {
+               /* Ooops.  All transmit buffers are full.  Bail out.
+                * This should not happen, since dev->tbusy should be set.
+                */
+               printk("%s: tx queue full!.\n", dev->name);
+-              spin_unlock_irqrestore(&fep->hw_lock, flags);
++              fec_enet_cbd_put(fep);
++              spin_unlock_irqrestore(&fep->lock, flags);
+               return 1;
+       }
+ #endif
+-
+       /* Clear all of the status flags.
+        */
+       status &= ~BD_ENET_TX_STATS;
+       /* Set buffer length and buffer pointer.
+       */
+-      bdp->cbd_bufaddr = __pa(skb->data);
+       bdp->cbd_datlen = skb->len;
++      dump_packet("sending packet:", skb->data, skb->len);
+       /*
+        *      On some FEC implementations data must be aligned on
+        *      4-byte boundaries. Use bounce buffers to copy data
+        *      and get it aligned. Ugh.
+        */
+-      if (bdp->cbd_bufaddr & FEC_ALIGNMENT) {
++      if (unlikely((bdp->cbd_bufaddr) & FEC_ALIGNMENT)) {
+               unsigned int index;
+               index = bdp - fep->tx_bd_base;
+-              memcpy(fep->tx_bounce[index], (void *)skb->data, skb->len);
+-              bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]);
++              memcpy(fep->tx_bounce[index], skb->data, skb->len);
++              fec_enet_txbuf_map(fep, bdp, fep->tx_bounce[index], skb->len);
++      } else {
++              fec_enet_txbuf_map(fep, bdp, skb->data, skb->len);
+       }
+       /* Save skb pointer.
+       */
+       fep->tx_skbuff[fep->skb_cur] = skb;
+-      dev->stats.tx_bytes += skb->len;
+-      fep->skb_cur = (fep->skb_cur+1) & TX_RING_MOD_MASK;
+-
+-      /* Push the data cache so the CPM does not get stale memory
+-       * data.
+-       */
+-      dma_sync_single(NULL, bdp->cbd_bufaddr,
+-                      bdp->cbd_datlen, DMA_TO_DEVICE);
++      fep->stats.tx_bytes += skb->len;
++      fep->skb_cur = (fep->skb_cur + 1) & TX_RING_MOD_MASK;
+       /* Send it on its way.  Tell FEC it's ready, interrupt when done,
+        * it's the last BD of the frame, and to put the CRC on the end.
+        */
+-
+       status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR
+                       | BD_ENET_TX_LAST | BD_ENET_TX_TC);
+       bdp->cbd_sc = status;
+       dev->trans_start = jiffies;
+-      /* Trigger transmission start */
+-      fecp->fec_x_des_active = 0;
+-
+       /* If this was the last BD in the ring, start at the beginning again.
+       */
+       if (status & BD_ENET_TX_WRAP) {
+@@ -375,12 +615,22 @@ fec_enet_start_xmit(struct sk_buff *skb,
+       if (bdp == fep->dirty_tx) {
+               fep->tx_full = 1;
++              DBG(0, "TX ring full, stopping netif queue\n");
+               netif_stop_queue(dev);
+       }
+-      fep->cur_tx = (cbd_t *)bdp;
++      fep->cur_tx = bdp;
++      fec_enet_cbd_put(fep);
++#if 0
++      if (dbg_lvl(3)) {
++              dump_tx_buffers(fep);
++              dump_rx_buffers(fep);
++      }
++#endif
++      /* Trigger transmission start */
++      fec_reg_write(fep, FEC_TDAR, DONT_CARE);
+-      spin_unlock_irqrestore(&fep->hw_lock, flags);
++      spin_unlock_irqrestore(&fep->lock, flags);
+       return 0;
+ }
+@@ -390,101 +640,126 @@ fec_timeout(struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      printk("%s: transmit timed out.\n", dev->name);
+-      dev->stats.tx_errors++;
+-#ifndef final_version
++      printk(KERN_WARNING "%s: transmit timed out.\n", dev->name);
++      fep->stats.tx_errors++;
++#ifdef DEBUG
+       {
+-      int     i;
+-      cbd_t   *bdp;
++              int i;
++              cbd_t *bdp;
+-      printk("Ring data dump: cur_tx %lx%s, dirty_tx %lx cur_rx: %lx\n",
+-             (unsigned long)fep->cur_tx, fep->tx_full ? " (full)" : "",
+-             (unsigned long)fep->dirty_tx,
+-             (unsigned long)fep->cur_rx);
++              fec_enet_cbd_get(fep);
+-      bdp = fep->tx_bd_base;
+-      printk(" tx: %u buffers\n",  TX_RING_SIZE);
+-      for (i = 0 ; i < TX_RING_SIZE; i++) {
+-              printk("  %08x: %04x %04x %08x\n",
+-                     (uint) bdp,
+-                     bdp->cbd_sc,
+-                     bdp->cbd_datlen,
+-                     (int) bdp->cbd_bufaddr);
+-              bdp++;
+-      }
++              printk(KERN_DEBUG "%s: Ring data dump: cur_tx %p%s, dirty_tx %p cur_rx: %p\n",
++                     __FUNCTION__,
++                     fep->cur_tx, fep->tx_full ? " (full)" : "",
++                     fep->dirty_tx,
++                     fep->cur_rx);
+-      bdp = fep->rx_bd_base;
+-      printk(" rx: %lu buffers\n",  (unsigned long) RX_RING_SIZE);
+-      for (i = 0 ; i < RX_RING_SIZE; i++) {
+-              printk("  %08x: %04x %04x %08x\n",
+-                     (uint) bdp,
+-                     bdp->cbd_sc,
+-                     bdp->cbd_datlen,
+-                     (int) bdp->cbd_bufaddr);
+-              bdp++;
+-      }
++              bdp = fep->tx_bd_base;
++              printk(" tx: %u buffers\n", TX_RING_SIZE);
++              for (i = 0; i < TX_RING_SIZE; i++) {
++                      printk("  %p: %04x %04x %08x\n",
++                             bdp,
++                             bdp->cbd_sc,
++                             bdp->cbd_datlen,
++                             bdp->cbd_bufaddr);
++                      bdp++;
++              }
++
++              bdp = fep->rx_bd_base;
++              printk(" rx: %lu buffers\n", RX_RING_SIZE);
++              for (i = 0; i < RX_RING_SIZE; i++) {
++                      printk("  %p: %04x %04x %08x\n",
++                             bdp,
++                             bdp->cbd_sc,
++                             bdp->cbd_datlen,
++                             bdp->cbd_bufaddr);
++                      bdp++;
++              }
++              fec_enet_cbd_put(fep);
+       }
+ #endif
+       fec_restart(dev, fep->full_duplex);
+-      netif_wake_queue(dev);
++      DBG(0, "%s: Scheduling netif queue\n", __FUNCTION__);
++      //netif_schedule(dev);
+ }
+ /* The interrupt handler.
+  * This is called from the MPC core interrupt.
+  */
+ static irqreturn_t
+-fec_enet_interrupt(int irq, void * dev_id)
++fec_enet_interrupt(int irq, void *dev_id)
+ {
+-      struct  net_device *dev = dev_id;
+-      volatile fec_t  *fecp;
+-      uint    int_events;
+-      irqreturn_t ret = IRQ_NONE;
+-
+-      fecp = (volatile fec_t*)dev->base_addr;
++      struct net_device *dev = dev_id;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      uint int_events;
++      int handled = 0;
++      unsigned int eimr = fec_reg_read(fep, FEC_EIMR);
++      DBG(2, "%s: %08lx:%08lx\n", __FUNCTION__,
++          fec_reg_read(fep, FEC_EIR), fec_reg_read(fep, FEC_EIMR));
+       /* Get the interrupt events that caused us to be here.
+       */
+-      do {
+-              int_events = fecp->fec_ievent;
+-              fecp->fec_ievent = int_events;
++      while ((int_events = fec_reg_read(fep, FEC_EIR) & FEC_ENET_MASK) != 0) {
++              if (int_events & ~eimr) {
++                      printk(KERN_WARNING "%s: masked interrupt condition: %08x\n",
++                             __FUNCTION__, int_events & ~eimr);
++              }
++
++              fec_reg_write(fep, FEC_EIR, int_events);
+               /* Handle receive event in its own function.
+                */
+-              if (int_events & FEC_ENET_RXF) {
+-                      ret = IRQ_HANDLED;
++              if (int_events & (FEC_ENET_RXF | FEC_ENET_RXB)) {
++                      DBG(2, "%s: Handling RX Interrupt\n", __FUNCTION__);
++                      handled = 1;
+                       fec_enet_rx(dev);
+               }
++              if (int_events & FEC_ENET_UN) {
++                      printk(KERN_WARNING "TX fifo underrun");
++              }
+               /* Transmit OK, or non-fatal error. Update the buffer
+                  descriptors. FEC handles all errors, we just discover
+                  them as part of the transmit process.
+               */
+-              if (int_events & FEC_ENET_TXF) {
+-                      ret = IRQ_HANDLED;
++              if (int_events & (FEC_ENET_TXF | FEC_ENET_TXB)) {
++                      DBG(2, "%s: Handling TX Interrupt\n", __FUNCTION__);
++                      handled = 1;
+                       fec_enet_tx(dev);
+               }
+-              if (int_events & FEC_ENET_MII) {
+-                      ret = IRQ_HANDLED;
++              if (int_events & (FEC_ENET_MII | FEC_ENET_HBERR)) {
++                      DBG(2, "%s: Handling MII Interrupt\n", __FUNCTION__);
++                      handled = 1;
+                       fec_enet_mii(dev);
+               }
+-
+-      } while (int_events);
+-
+-      return ret;
++      }
++      return IRQ_RETVAL(handled);
+ }
++static void fec_free_skb(struct fec_enet_private *fep, cbd_t *bdp, struct sk_buff **pskb)
++{
++      struct sk_buff *skb = *pskb;
++      if (!dma_mapping_error(fep->dma_dev, bdp->cbd_bufaddr)) {
++              fec_enet_txbuf_unmap(fep, bdp, skb->len);
++      }
++      dev_kfree_skb_any(skb);
++      *pskb = NULL;
++}
+ static void
+ fec_enet_tx(struct net_device *dev)
+ {
+-      struct  fec_enet_private *fep;
+-      volatile cbd_t  *bdp;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      cbd_t *bdp;
+       unsigned short status;
+-      struct  sk_buff *skb;
++      struct sk_buff *skb;
+-      fep = netdev_priv(dev);
+-      spin_lock_irq(&fep->hw_lock);
++      spin_lock(&fep->lock);
++
++      //WARN_ON(fec_reg_read(fep, FEC_TDAR) & TDAR_BUSY);
++      fec_enet_cbd_get(fep);
+       bdp = fep->dirty_tx;
+       while (((status = bdp->cbd_sc) & BD_ENET_TX_READY) == 0) {
+@@ -495,22 +770,22 @@ fec_enet_tx(struct net_device *dev)
+               if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC |
+                                  BD_ENET_TX_RL | BD_ENET_TX_UN |
+                                  BD_ENET_TX_CSL)) {
+-                      dev->stats.tx_errors++;
++                      fep->stats.tx_errors++;
+                       if (status & BD_ENET_TX_HB)  /* No heartbeat */
+-                              dev->stats.tx_heartbeat_errors++;
++                              fep->stats.tx_heartbeat_errors++;
+                       if (status & BD_ENET_TX_LC)  /* Late collision */
+-                              dev->stats.tx_window_errors++;
++                              fep->stats.tx_window_errors++;
+                       if (status & BD_ENET_TX_RL)  /* Retrans limit */
+-                              dev->stats.tx_aborted_errors++;
++                              fep->stats.tx_aborted_errors++;
+                       if (status & BD_ENET_TX_UN)  /* Underrun */
+-                              dev->stats.tx_fifo_errors++;
++                              fep->stats.tx_fifo_errors++;
+                       if (status & BD_ENET_TX_CSL) /* Carrier lost */
+-                              dev->stats.tx_carrier_errors++;
++                              fep->stats.tx_carrier_errors++;
+               } else {
+-                      dev->stats.tx_packets++;
++                      fep->stats.tx_packets++;
+               }
+-#ifndef final_version
++#ifdef DEBUG
+               if (status & BD_ENET_TX_READY)
+                       printk("HEY! Enet xmit interrupt and TX_READY.\n");
+ #endif
+@@ -518,12 +793,13 @@ fec_enet_tx(struct net_device *dev)
+                * but we eventually sent the packet OK.
+                */
+               if (status & BD_ENET_TX_DEF)
+-                      dev->stats.collisions++;
++                      fep->stats.collisions++;
++              dump_packet("sent packet:", fep->tx_skbuff[fep->skb_dirty]->data,
++                          fep->tx_skbuff[fep->skb_dirty]->len);
+               /* Free the sk buffer associated with this last transmit.
+                */
+-              dev_kfree_skb_any(skb);
+-              fep->tx_skbuff[fep->skb_dirty] = NULL;
++              fec_free_skb(fep, bdp, &fep->tx_skbuff[fep->skb_dirty]);
+               fep->skb_dirty = (fep->skb_dirty + 1) & TX_RING_MOD_MASK;
+               /* Update pointer to next buffer descriptor to be transmitted.
+@@ -538,12 +814,15 @@ fec_enet_tx(struct net_device *dev)
+                */
+               if (fep->tx_full) {
+                       fep->tx_full = 0;
+-                      if (netif_queue_stopped(dev))
++                      if (netif_queue_stopped(dev)) {
++                              DBG(0, "%s: Waking up netif queue\n", __FUNCTION__);
+                               netif_wake_queue(dev);
++                      }
+               }
+       }
+-      fep->dirty_tx = (cbd_t *)bdp;
+-      spin_unlock_irq(&fep->hw_lock);
++      fec_enet_cbd_put(fep);
++      fep->dirty_tx = bdp;
++      spin_unlock(&fep->lock);
+ }
+@@ -555,22 +834,22 @@ fec_enet_tx(struct net_device *dev)
+ static void
+ fec_enet_rx(struct net_device *dev)
+ {
+-      struct  fec_enet_private *fep;
+-      volatile fec_t  *fecp;
+-      volatile cbd_t *bdp;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      cbd_t *bdp;
+       unsigned short status;
+-      struct  sk_buff *skb;
+-      ushort  pkt_len;
+-      __u8 *data;
++      struct sk_buff *skb;
++      ushort pkt_len;
++      int rx_index;
+ #ifdef CONFIG_M532x
++      /* This is probably nonsense
++         Proper use of dma-mapping functions should make this obsolete
++      */
+       flush_cache_all();
+ #endif
+-
+-      fep = netdev_priv(dev);
+-      fecp = (volatile fec_t*)dev->base_addr;
+-
+-      spin_lock_irq(&fep->hw_lock);
++      /* reserve the dual port memory area for our use */
++      //WARN_ON(fec_reg_read(fep, FEC_RDAR) & RDAR_BUSY);
++      fec_enet_cbd_get(fep);
+       /* First, grab all of the stats for the incoming packet.
+        * These get messed up if we get called due to a busy condition.
+@@ -578,32 +857,34 @@ fec_enet_rx(struct net_device *dev)
+       bdp = fep->cur_rx;
+ while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) {
+-
+-#ifndef final_version
++      rx_index = bdp - fep->rx_bd_base;
++#ifdef DEBUG
+       /* Since we have allocated space to hold a complete frame,
+        * the last indicator should be set.
+        */
+-      if ((status & BD_ENET_RX_LAST) == 0)
+-              printk("FEC ENET: rcv is not +last\n");
++      WARN_ON(!(status & BD_ENET_RX_LAST));
+ #endif
+-      if (!fep->opened)
++      if (WARN_ON(!fep->opened)) {
++              DBG(0, "%s: Driver not opened; ignoring packet\n", __FUNCTION__);
++#if 0
+               goto rx_processing_done;
+-
++#endif
++      }
+       /* Check for errors. */
+       if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO |
+                          BD_ENET_RX_CR | BD_ENET_RX_OV)) {
+-              dev->stats.rx_errors++;
++              fep->stats.rx_errors++;
+               if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH)) {
+               /* Frame too long or too short. */
+-                      dev->stats.rx_length_errors++;
++                      fep->stats.rx_length_errors++;
+               }
+               if (status & BD_ENET_RX_NO)     /* Frame alignment */
+-                      dev->stats.rx_frame_errors++;
++                      fep->stats.rx_frame_errors++;
+               if (status & BD_ENET_RX_CR)     /* CRC Error */
+-                      dev->stats.rx_crc_errors++;
++                      fep->stats.rx_crc_errors++;
+               if (status & BD_ENET_RX_OV)     /* FIFO overrun */
+-                      dev->stats.rx_fifo_errors++;
++                      fep->stats.rx_fifo_errors++;
+       }
+       /* Report late collisions as a frame error.
+@@ -611,39 +892,91 @@ while (!((status = bdp->cbd_sc) & BD_ENE
+        * have in the buffer.  So, just drop this frame on the floor.
+        */
+       if (status & BD_ENET_RX_CL) {
+-              dev->stats.rx_errors++;
+-              dev->stats.rx_frame_errors++;
++              fep->stats.rx_errors++;
++              fep->stats.rx_frame_errors++;
++              DBG(0, "%s: Collision detected; dropping packet\n", __FUNCTION__);
++              if (bdp->cbd_datlen > PKT_MAXBUF_SIZE) {
++                      printk(KERN_ERR "invalid packet size %u; max %u\n", bdp->cbd_datlen,
++                             PKT_MAXBUF_SIZE);
++              } else {
++                      fec_enet_rxbuf_get(fep, bdp, bdp->cbd_datlen);
++                      dump_packet("received packet:",
++                                  fep->rx_skbuff[rx_index]->data, bdp->cbd_datlen);
++                      fec_enet_rxbuf_put(fep, bdp, bdp->cbd_datlen);
++              }
+               goto rx_processing_done;
+       }
+-
++#if 1
++      if (!fep->opened) {
++              DBG(0, "%s: Driver not opened; ignoring packet\n", __FUNCTION__);
++              if (bdp->cbd_datlen > PKT_MAXBUF_SIZE) {
++                      printk(KERN_ERR "invalid packet size %u; max %u\n", bdp->cbd_datlen,
++                             PKT_MAXBUF_SIZE);
++              } else {
++                      fec_enet_rxbuf_get(fep, bdp, bdp->cbd_datlen);
++                      dump_packet("received packet:",
++                                  fep->rx_skbuff[rx_index]->data, bdp->cbd_datlen);
++                      fec_enet_rxbuf_put(fep, bdp, bdp->cbd_datlen);
++              }
++              goto rx_processing_done;
++      }
++#endif
+       /* Process the incoming frame.
+        */
+-      dev->stats.rx_packets++;
++      fep->stats.rx_packets++;
+       pkt_len = bdp->cbd_datlen;
+-      dev->stats.rx_bytes += pkt_len;
+-      data = (__u8*)__va(bdp->cbd_bufaddr);
+-
+-      dma_sync_single(NULL, (unsigned long)__pa(data),
+-                      pkt_len - 4, DMA_FROM_DEVICE);
++      fep->stats.rx_bytes += pkt_len;
+       /* This does 16 byte alignment, exactly what we need.
+        * The packet length includes FCS, but we don't want to
+        * include that when passing upstream as it messes up
+        * bridging applications.
+        */
+-      skb = dev_alloc_skb(pkt_len-4);
++      if ((pkt_len - 4) < fec_copy_threshold) {
++              skb = dev_alloc_skb(pkt_len);
++      } else {
++              skb = dev_alloc_skb(FEC_ENET_RX_FRSIZE);
++      }
+       if (skb == NULL) {
+               printk("%s: Memory squeeze, dropping packet.\n", dev->name);
+-              dev->stats.rx_dropped++;
++              fep->stats.rx_dropped++;
+       } else {
+-              skb_put(skb,pkt_len-4); /* Make room */
+-              skb_copy_to_linear_data(skb, data, pkt_len-4);
+-              skb->protocol=eth_type_trans(skb,dev);
++              if ((pkt_len - 4) < fec_copy_threshold) {
++                      /* skip 2 bytes, so IP header is on a 4 bytes boundary */
++                      skb_reserve(skb, 2);
++                      skb_put(skb, pkt_len - 4); /* Make room */
++                      fec_enet_rxbuf_get(fep, bdp, pkt_len - 4);
++                      skb_copy_to_linear_data(skb,
++                                              fep->rx_skbuff[rx_index]->data,
++                                              pkt_len - 4);
++                      fec_enet_rxbuf_put(fep, bdp, pkt_len - 4);
++              } else {
++                      struct sk_buff *pskb = fep->rx_skbuff[rx_index];
++
++                      /* unmap the skb we are going to hand down to the network layer */
++                      fec_enet_rxbuf_unmap(fep, bdp, FEC_ENET_RX_FRSIZE);
++
++                      /* init the newly allocated skb */
++                      fep->rx_skbuff[rx_index] = skb;
++                      skb->data = FEC_ADDR_ALIGNMENT(skb->data);
++                      /* map the newly allocated skb's data buffer for DMA */
++                      fec_enet_rxbuf_map(fep, bdp, skb->data, FEC_ENET_RX_FRSIZE);
++
++                      skb_put(pskb, pkt_len - 4);        /* Make room */
++                      skb = pskb;
++              }
++              skb->dev = dev;
++              skb->protocol = eth_type_trans(skb, dev);
+               netif_rx(skb);
+       }
+   rx_processing_done:
+-
++#if 0
++      if (dbg_lvl(3)) {
++              dump_rx_buffers(fep);
++              dump_tx_buffers(fep);
++      }
++#endif
+       /* Clear the status flags for this buffer.
+       */
+       status &= ~BD_ENET_RX_STATS;
+@@ -653,6 +986,9 @@ while (!((status = bdp->cbd_sc) & BD_ENE
+       status |= BD_ENET_RX_EMPTY;
+       bdp->cbd_sc = status;
++      /* release the dual port memory area for use by the FEC hardware */
++      fec_enet_cbd_put(fep);
++
+       /* Update BD pointer to next entry.
+       */
+       if (status & BD_ENET_RX_WRAP)
+@@ -665,10 +1001,10 @@ while (!((status = bdp->cbd_sc) & BD_ENE
+        * incoming frames.  On a heavily loaded network, we should be
+        * able to keep up at the expense of system resources.
+        */
+-      fecp->fec_r_des_active = 0;
++      fec_reg_write(fep, FEC_RDAR, DONT_CARE);
+ #endif
+    } /* while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) */
+-      fep->cur_rx = (cbd_t *)bdp;
++      fep->cur_rx = bdp;
+ #if 0
+       /* Doing this here will allow us to process all frames in the
+@@ -678,27 +1014,28 @@ while (!((status = bdp->cbd_sc) & BD_ENE
+        * our way back to the interrupt return only to come right back
+        * here.
+        */
+-      fecp->fec_r_des_active = 0;
++      fec_reg_write(fep, FEC_RDAR, DONT_CARE);
+ #endif
+-
+-      spin_unlock_irq(&fep->hw_lock);
+ }
+-
++#ifdef CONFIG_PHYLIB
+ /* called from interrupt context */
++static void fec_enet_mii(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++      fep->mii_complete = 1;
++}
++#else
+ static void
+ fec_enet_mii(struct net_device *dev)
+ {
+-      struct  fec_enet_private *fep;
+-      volatile fec_t  *ep;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       mii_list_t      *mip;
+       uint            mii_reg;
+-      fep = netdev_priv(dev);
+-      spin_lock_irq(&fep->mii_lock);
++      mii_reg = fec_reg_read(fep, FEC_MMFR);
+-      ep = fep->hwp;
+-      mii_reg = ep->fec_mii_data;
++      spin_lock(&fep->lock);
+       if ((mip = mii_head) == NULL) {
+               printk("MII and no head!\n");
+@@ -713,27 +1050,27 @@ fec_enet_mii(struct net_device *dev)
+       mii_free = mip;
+       if ((mip = mii_head) != NULL)
+-              ep->fec_mii_data = mip->mii_regval;
++              fec_reg_write(fep, FEC_MMFR, mip->mii_regval);
+ unlock:
+-      spin_unlock_irq(&fep->mii_lock);
++      spin_unlock(&fep->lock);
+ }
+ static int
+ mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_device *))
+ {
+-      struct fec_enet_private *fep;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       unsigned long   flags;
+       mii_list_t      *mip;
+       int             retval;
++      retval = 0;
++
++      spin_lock_irqsave(&fep->lock,flags);
++
+       /* Add PHY address to register command.
+       */
+-      fep = netdev_priv(dev);
+-      spin_lock_irqsave(&fep->mii_lock, flags);
+-
+       regval |= fep->phy_addr << 23;
+-      retval = 0;
+       if ((mip = mii_free) != NULL) {
+               mii_free = mip->mii_next;
+@@ -745,32 +1082,32 @@ mii_queue(struct net_device *dev, int re
+                       mii_tail = mip;
+               } else {
+                       mii_head = mii_tail = mip;
+-                      fep->hwp->fec_mii_data = regval;
++                      fec_reg_write(fep, FEC_MMFR, regval);
+               }
+       } else {
+               retval = 1;
+       }
+-      spin_unlock_irqrestore(&fep->mii_lock, flags);
+-      return retval;
++      spin_unlock_irqrestore(&fep->lock,flags);
++
++      return(retval);
+ }
+ static void mii_do_cmd(struct net_device *dev, const phy_cmd_t *c)
+ {
+-      if(!c)
+-              return;
++      int k;
+-      for (; c->mii_data != mk_mii_end; c++)
+-              mii_queue(dev, c->mii_data, c->funct);
++      for (k = 0; c != NULL && c[k].mii_data != mk_mii_end; k++) {
++              mii_queue(dev, c[k].mii_data, c[k].funct);
++      }
+ }
+ static void mii_parse_sr(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_STAT_LINK | PHY_STAT_FAULT | PHY_STAT_ANC);
++      status = fep->phy_status & ~(PHY_STAT_LINK | PHY_STAT_FAULT | PHY_STAT_ANC);
+       if (mii_reg & 0x0004)
+               status |= PHY_STAT_LINK;
+@@ -778,31 +1115,30 @@ static void mii_parse_sr(uint mii_reg, s
+               status |= PHY_STAT_FAULT;
+       if (mii_reg & 0x0020)
+               status |= PHY_STAT_ANC;
+-      *s = status;
++
++      fep->phy_status = status;
+ }
+ static void mii_parse_cr(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_CONF_ANE | PHY_CONF_LOOP);
++      status = fep->phy_status & ~(PHY_CONF_ANE | PHY_CONF_LOOP);
+       if (mii_reg & 0x1000)
+               status |= PHY_CONF_ANE;
+       if (mii_reg & 0x4000)
+               status |= PHY_CONF_LOOP;
+-      *s = status;
++      fep->phy_status = status;
+ }
+ static void mii_parse_anar(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_CONF_SPMASK);
++      status = fep->phy_status & ~(PHY_CONF_SPMASK);
+       if (mii_reg & 0x0020)
+               status |= PHY_CONF_10HDX;
+@@ -812,7 +1148,7 @@ static void mii_parse_anar(uint mii_reg,
+               status |= PHY_CONF_100HDX;
+       if (mii_reg & 0x00100)
+               status |= PHY_CONF_100FDX;
+-      *s = status;
++      fep->phy_status = status;
+ }
+ /* ------------------------------------------------------------------------- */
+@@ -827,10 +1163,9 @@ static void mii_parse_anar(uint mii_reg,
+ static void mii_parse_lxt970_csr(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_STAT_SPMASK);
++      status = fep->phy_status & ~(PHY_STAT_SPMASK);
+       if (mii_reg & 0x0800) {
+               if (mii_reg & 0x1000)
+                       status |= PHY_STAT_100FDX;
+@@ -842,7 +1177,7 @@ static void mii_parse_lxt970_csr(uint mi
+               else
+                       status |= PHY_STAT_10HDX;
+       }
+-      *s = status;
++      fep->phy_status = status;
+ }
+ static phy_cmd_t const phy_cmd_lxt970_config[] = {
+@@ -898,16 +1233,15 @@ static phy_info_t const phy_info_lxt970 
+ static void mii_parse_lxt971_sr2(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_STAT_SPMASK | PHY_STAT_LINK | PHY_STAT_ANC);
++      status = fep->phy_status & ~(PHY_STAT_SPMASK | PHY_STAT_LINK | PHY_STAT_ANC);
+       if (mii_reg & 0x0400) {
+-              fep->link = 1;
++              fep->linkstatus = 1;
+               status |= PHY_STAT_LINK;
+       } else {
+-              fep->link = 0;
++              fep->linkstatus = 0;
+       }
+       if (mii_reg & 0x0080)
+               status |= PHY_STAT_ANC;
+@@ -925,7 +1259,7 @@ static void mii_parse_lxt971_sr2(uint mi
+       if (mii_reg & 0x0008)
+               status |= PHY_STAT_FAULT;
+-      *s = status;
++      fep->phy_status = status;
+ }
+ static phy_cmd_t const phy_cmd_lxt971_config[] = {
+@@ -982,10 +1316,9 @@ static phy_info_t const phy_info_lxt971 
+ static void mii_parse_qs6612_pcr(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_STAT_SPMASK);
++      status = fep->phy_status & ~(PHY_STAT_SPMASK);
+       switch((mii_reg >> 2) & 7) {
+       case 1: status |= PHY_STAT_10HDX; break;
+@@ -994,7 +1327,7 @@ static void mii_parse_qs6612_pcr(uint mi
+       case 6: status |= PHY_STAT_100FDX; break;
+ }
+-      *s = status;
++      fep->phy_status = status;
+ }
+ static phy_cmd_t const phy_cmd_qs6612_config[] = {
+@@ -1052,10 +1385,9 @@ static phy_info_t const phy_info_qs6612 
+ static void mii_parse_am79c874_dr(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+       uint status;
+-      status = *s & ~(PHY_STAT_SPMASK | PHY_STAT_ANC);
++      status = fep->phy_status & ~(PHY_STAT_SPMASK | PHY_STAT_ANC);
+       if (mii_reg & 0x0080)
+               status |= PHY_STAT_ANC;
+@@ -1064,7 +1396,7 @@ static void mii_parse_am79c874_dr(uint m
+       else
+               status |= ((mii_reg & 0x0800) ? PHY_STAT_10FDX : PHY_STAT_10HDX);
+-      *s = status;
++      fep->phy_status = status;
+ }
+ static phy_cmd_t const phy_cmd_am79c874_config[] = {
+@@ -1107,7 +1439,7 @@ static phy_info_t const phy_info_am79c87
+ /* register definitions for the 8721 */
+ #define MII_KS8721BL_RXERCR   21
+-#define MII_KS8721BL_ICSR     27
++#define MII_KS8721BL_ICSR     22
+ #define       MII_KS8721BL_PHYCR      31
+ static phy_cmd_t const phy_cmd_ks8721bl_config[] = {
+@@ -1149,32 +1481,31 @@ static phy_info_t const phy_info_ks8721b
+ static void mii_parse_dp8384x_sr2(uint mii_reg, struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
+-      *s &= ~(PHY_STAT_SPMASK | PHY_STAT_LINK | PHY_STAT_ANC);
++      fep->phy_status &= ~(PHY_STAT_SPMASK | PHY_STAT_LINK | PHY_STAT_ANC);
+       /* Link up */
+       if (mii_reg & 0x0001) {
+-              fep->link = 1;
+-              *s |= PHY_STAT_LINK;
++              fep->linkstatus = 1;
++              fep->phy_status |= PHY_STAT_LINK;
+       } else
+-              fep->link = 0;
++              fep->linkstatus = 0;
+       /* Status of link */
+       if (mii_reg & 0x0010)   /* Autonegotioation complete */
+-              *s |= PHY_STAT_ANC;
++              fep->phy_status |= PHY_STAT_ANC;
+       if (mii_reg & 0x0002) {   /* 10MBps? */
+               if (mii_reg & 0x0004)   /* Full Duplex? */
+-                      *s |= PHY_STAT_10FDX;
++                      fep->phy_status |= PHY_STAT_10FDX;
+               else
+-                      *s |= PHY_STAT_10HDX;
++                      fep->phy_status |= PHY_STAT_10HDX;
+       } else {                  /* 100 Mbps? */
+               if (mii_reg & 0x0004)   /* Full Duplex? */
+-                      *s |= PHY_STAT_100FDX;
++                      fep->phy_status |= PHY_STAT_100FDX;
+               else
+-                      *s |= PHY_STAT_100HDX;
++                      fep->phy_status |= PHY_STAT_100HDX;
+       }
+       if (mii_reg & 0x0008)
+-              *s |= PHY_STAT_FAULT;
++              fep->phy_status |= PHY_STAT_FAULT;
+ }
+ static phy_info_t phy_info_dp83848= {
+@@ -1211,92 +1542,362 @@ static phy_info_t const * const phy_info
+       &phy_info_dp83848,
+       NULL
+ };
+-
+-/* ------------------------------------------------------------------------- */
+-#ifdef HAVE_mii_link_interrupt
+-static irqreturn_t
+-mii_link_interrupt(int irq, void * dev_id);
++#endif
+ /*
+- *    This is specific to the MII interrupt setup of the M5272EVB.
++ * do some initializtion based architecture of this chip
++MOVED to platform_data hooks!
+  */
+-static void __inline__ fec_request_mii_intr(struct net_device *dev)
+-{
+-      if (request_irq(66, mii_link_interrupt, IRQF_DISABLED, "fec(MII)", dev) != 0)
+-              printk("FEC: Could not allocate fec(MII) IRQ(66)!\n");
+-}
+-static void __inline__ fec_disable_phy_intr(void)
+-{
+-      volatile unsigned long *icrp;
+-      icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1);
+-      *icrp = 0x08000000;
+-}
++#define PHY_POLL_LINK_ON      (1 * HZ)
++#define PHY_POLL_LINK_OFF     (HZ / 5)
+-static void __inline__ fec_phy_ack_intr(void)
++static int fec_mii_read(struct mii_bus *bus, int phy_id, int regnum);
++
++#ifdef CONFIG_PHYLIB
++static void fec_link_change(struct net_device *dev)
+ {
+-      volatile unsigned long *icrp;
+-      /* Acknowledge the interrupt */
+-      icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1);
+-      *icrp = 0x0d000000;
+-}
+-#endif
++      struct fec_enet_private *fep = netdev_priv(dev);
++      struct phy_device *phydev = fep->phy;
+-#ifdef CONFIG_M5272
+-static void __inline__ fec_get_mac(struct net_device *dev)
++      if (phydev->link != fep->linkstatus ||
++          phydev->duplex != fep->full_duplex) {
++              DBG(0, "%s: link status changed from %d to %d %s -> %s duplex\n", __FUNCTION__,
++                  fep->linkstatus, phydev->link, fep->full_duplex ? "full" : "half",
++                  phydev->duplex ? "full" : "half");
++              if (phydev->link) {
++                      fec_restart(dev, phydev->duplex);
++              } else {
++                      fec_stop(dev);
++              }
++              if (fep->linkstatus != phydev->link && netif_msg_link(fep)) {
++                      phy_print_status(phydev);
++              }
++              fep->linkstatus = phydev->link;
++#if 0
++              int i;
++              for (i = 0; i < 32; i++) {
++                      DBG(0, "%s: PHY reg[%02x]=%04x\n", __FUNCTION__, i,
++                          fec_mii_read(fep->mii, fep->phy_addr, i));
++              }
++#endif
++      }
++}
++#else
++static void fec_link_change(struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile fec_t *fecp;
+-      unsigned char *iap, tmpaddr[ETH_ALEN];
+-      fecp = fep->hwp;
++      DBG(0, "%s: link status changed from %d to %d\n", __FUNCTION__,
++          fep->old_linkstatus, fep->linkstatus);
++      if (fep->linkstatus) {
++              int duplex;
+-      if (FEC_FLASHMAC) {
+-              /*
+-               * Get MAC address from FLASH.
+-               * If it is all 1's or 0's, use the default.
+-               */
+-              iap = (unsigned char *)FEC_FLASHMAC;
+-              if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) &&
+-                  (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0))
+-                      iap = fec_mac_default;
+-              if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) &&
+-                  (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff))
+-                      iap = fec_mac_default;
++              duplex = 0;
++              if (fep->phy_status & (PHY_STAT_100FDX | PHY_STAT_10FDX)) {
++                      duplex = 1;
++              }
++              fec_restart(dev, duplex);
++              if (fep->phy_timer) {
++                      mod_timer(fep->phy_timer, jiffies + PHY_POLL_LINK_ON);
++              }
+       } else {
+-              *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low;
+-              *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16);
+-              iap = &tmpaddr[0];
++              fec_stop(dev);
++              if (fep->phy_timer) {
++                      mod_timer(fep->phy_timer, jiffies + PHY_POLL_LINK_OFF);
++              }
+       }
+-      memcpy(dev->dev_addr, iap, ETH_ALEN);
+-
+-      /* Adjust MAC if using default MAC address */
+-      if (iap == fec_mac_default)
+-               dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] + fep->index;
++      fep->old_linkstatus = fep->linkstatus;
+ }
+-#endif
+-/* ------------------------------------------------------------------------- */
+-
+-static void mii_display_status(struct net_device *dev)
++static void fec_phy_timer(unsigned long data)
+ {
++      struct net_device *dev = (struct net_device *)data;
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      volatile uint *s = &(fep->phy_status);
++      int link_poll_interval = fep->linkstatus ? PHY_POLL_LINK_ON : PHY_POLL_LINK_OFF;
+-      if (!fep->link && !fep->old_link) {
+-              /* Link is still down - don't print anything */
++      if (fep->old_linkstatus != fep->linkstatus) {
++              fec_link_change(dev);
++      }
++      mod_timer(fep->phy_timer, link_poll_interval);
++}
++#endif
++
++/*
++ * Code specific to Freescale i.MXC
++ */
++static int fec_request_intrs(struct platform_device *pdev, struct net_device *dev)
++{
++      int ret;
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      fep->etn_irq = platform_get_irq(pdev, 0);
++      fep->mii_irq = platform_get_irq(pdev, 1);
++
++      /* Setup interrupt handlers. */
++      ret = request_irq(fep->etn_irq, fec_enet_interrupt, 0, "fec", dev);
++      if (ret != 0) {
++              printk(KERN_ERR "FEC: Could not allocate FEC IRQ(%d)!\n", fep->etn_irq);
++              return ret;
++      }
++#ifndef CONFIG_PHYLIB
++      if (fep->mii_irq >= 0) {
++              /* TODO: disable now due to CPLD issue */
++              ret = request_irq(fep->mii_irq, mii_link_interrupt, 0, "fec(MII)", dev);
++              if (ret != 0) {
++                      printk(KERN_ERR "FEC: Could not allocate FEC(MII) IRQ(%d)!\n",
++                             fep->mii_irq);
++                      free_irq(fep->etn_irq, dev);
++                      return ret;
++              }
++              /*
++               * board specific workaround should be done in board specific code
++               * This is unsafe anyway. An interrupt might have been asserted
++               * already. Use IRQ_NOAUTOEN with request_irq() to have irq initially disabled.
++               */
++              fep->phy_int_enabled = 1;
++      } else {
++              fep->phy_timer = kzalloc(sizeof(struct timer_list), GFP_KERNEL);
++              if (fep->phy_timer == NULL) {
++                      free_irq(fep->etn_irq, dev);
++                      return -ENOMEM;
++              }
++              init_timer(fep->phy_timer);
++              fep->phy_timer->function = fec_phy_timer;
++              fep->phy_timer->data = (unsigned long)dev;
++              fec_link_change(dev);
++      }
++#endif
++
++      return 0;
++}
++
++static void fec_release_intrs(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      free_irq(fep->etn_irq, dev);
++#ifndef CONFIG_PHYLIB
++      if (fep->mii_irq >= 0) {
++              free_irq(fep->mii_irq, dev);
++      }
++#endif
++}
++
++#ifdef CONFIG_MACH_MX25
++/*
++ * i.MX25 allows RMII mode to be configured via a gasket
++ */
++#define FEC_MIIGSK_CFGR                       0x300
++#define FEC_MIIGSK_ENR                        0x308
++
++#define FEC_MIIGSK_CFGR_FRCONT                (1 << 6)
++#define FEC_MIIGSK_CFGR_LBMODE                (1 << 4)
++#define FEC_MIIGSK_CFGR_EMODE         (1 << 3)
++#define FEC_MIIGSK_CFGR_IF_MODE_MASK  (3 << 0)
++#define FEC_MIIGSK_CFGR_IF_MODE_MII   (0 << 0)
++#define FEC_MIIGSK_CFGR_IF_MODE_RMII  (1 << 0)
++
++#define FEC_MIIGSK_ENR_READY          (1 << 2)
++#define FEC_MIIGSK_ENR_EN             (1 << 1)
++
++#ifndef DEBUG
++static inline unsigned long fec_reg_read16(struct fec_enet_private *fep, unsigned int reg)
++{
++      return readw(fep->reg_base + reg);
++}
++
++static inline void fec_reg_write(struct fec_enet_private *fep, unsigned int reg, unsigned long val)
++{
++      writew(val, fep->reg_base + reg);
++}
++#else
++#define fec_reg_read16(fep, reg)      __fec_reg_read16(fep, reg, __FUNCTION__, #reg)
++#define fec_reg_write16(fep, reg, val)        __fec_reg_write16(fep, reg, val, __FUNCTION__, #reg)
++
++static inline u16 __fec_reg_read16(struct fec_enet_private *fep, unsigned int reg,
++                                         const char *func, const char *reg_name)
++{
++      u16 val = readw(fep->reg_base + reg);
++      DBG(0, "%s: Read %04x from %s(%03x)\n", func, val, reg_name, reg);
++      return val;
++}
++
++static inline void __fec_reg_write16(struct fec_enet_private *fep, unsigned int reg,
++                                 u16 val, const char *func, const char *reg_name)
++{
++      DBG(0, "%s: Writing %04x to %s(%03x)\n", func, val, reg_name, reg);
++      writew(val, fep->reg_base + reg);
++}
++#endif
++
++static void fec_localhw_setup(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++      int loops;
++      const int max_loops = 10000;
++
++      /*
++       * Set up the MII gasket for RMII mode
++       */
++      dev_dbg(&dev->dev, "enable RMII gasket\n");
++
++      /* disable the gasket and wait */
++      fec_reg_write16(fep, FEC_MIIGSK_ENR, 0);
++      DBG(0, "%s: Waiting for RMII gasket idle\n", __FUNCTION__);
++      while (fec_reg_read16(fep, FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY)
++              udelay(1);
++      DBG(0, "%s: RMII gasket idle\n", __FUNCTION__);
++
++      /* configure the gasket for RMII, 50 MHz, no loopback, no echo */
++      fec_reg_write16(fep, FEC_MIIGSK_CFGR, FEC_MIIGSK_CFGR_IF_MODE_RMII);
++
++      /* re-enable the gasket */
++      fec_reg_write16(fep, FEC_MIIGSK_ENR, FEC_MIIGSK_ENR_EN);
++      fec_reg_read16(fep, FEC_MIIGSK_CFGR);
++      fec_reg_read16(fep, FEC_MIIGSK_ENR);
++
++#if 1
++      DBG(0, "%s: Waiting for RMII gasket ready\n", __FUNCTION__);
++      for (loops = 0; loops < max_loops; loops++) {
++              if (readw(fep->reg_base + FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY)
++                      break;
++              udelay(1);
++      }
++      if (fec_reg_read16(fep, FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY) {
++              DBG(0, "%s: RMII gasket ready after %u loops\n", __FUNCTION__, loops);
++      } else {
++              DBG(0, "%s: RMII gasket NOT ready after %u loops\n", __FUNCTION__, loops);
++      }
++#endif
++}
++#else
++static inline void fec_localhw_setup(struct net_device *dev)
++{
++}
++#endif
++
++static int fec_set_mii(struct net_device *dev, struct fec_enet_private *fep)
++{
++      unsigned long rate;
++      struct clk *clk;
++
++      DBG(0, "%s: \n", __FUNCTION__);
++
++      fec_reg_write(fep, FEC_RCR, OPT_FRAME_SIZE | RCR_MII_MODE);
++      fec_reg_write(fep, FEC_TCR, 0x00);
++
++      /*
++       * Set MII speed to 2.5 MHz
++       */
++      clk = clk_get(fep->dma_dev, NULL);
++      if (!IS_ERR(clk)) {
++      rate = clk_get_rate(clk);
++      clk_put(clk);
++      } else {
++              printk(KERN_ERR "Failed to get fec clock: %ld\n", PTR_ERR(clk));
++              return PTR_ERR(clk);
++      }
++      fep->phy_speed = ((((rate + 4999999) / 2500000) / 2) & 0x3F) << 1;
++      fec_reg_write(fep, FEC_MSCR, fep->phy_speed);
++      DBG(0, "%s: clkdiv set to %u for MII clock %u at base clock %lu\n",
++          __FUNCTION__, fep->phy_speed >> 1, 2500000, rate);
++      DBG(0, "%s: actual MII clock is: %lu\n", __FUNCTION__, rate / (fep->phy_speed));
++
++      return 0;
++}
++
++static const unsigned char default_mac[ETH_ALEN] = {
++      0x00, 0x04, 0x9f, 0x00, 0x74, 0x4a,
++};
++
++#define FEC_IIM_BASE    IO_ADDRESS(IIM_BASE_ADDR)
++static void fec_get_mac(struct net_device *dev)
++{
++#if 1
++      // keep bootloader assigned MAC address
++      struct fec_enet_private *fep = netdev_priv(dev);
++      unsigned long eth_addr = fec_reg_read(fep, FEC_PALR);
++      dev->dev_addr[0] = eth_addr >> 24;
++      dev->dev_addr[1] = eth_addr >> 16;
++      dev->dev_addr[2] = eth_addr >> 8;
++      dev->dev_addr[3] = eth_addr >> 0;
++      eth_addr = fec_reg_read(fep, FEC_PAUR);
++      dev->dev_addr[5] = eth_addr >> 16;
++      dev->dev_addr[4] = eth_addr >> 24;
++#else
++      int i;
++      unsigned long fec_mac_base = FEC_IIM_BASE + MXC_IIMKEY0;
++
++      if (cpu_is_mx27_rev(CHIP_REV_2_0) > 0) {
++              fec_mac_base = FEC_IIM_BASE + MXC_IIMMAC;
++      }
++
++      DBG(0, "%s: Reading MAC address from %08lx\n", __FUNCTION__, fec_mac_base);
++      for (i = 0; i < ETH_ALEN; i++) {
++              dev->dev_addr[ETH_ALEN - 1 - i] = __raw_readb(fec_mac_base + i * 4);
++      }
++      //memcpy(dev->dev_addr, default_mac, ETH_ALEN);
++#endif
++}
++
++#ifdef CONFIG_PHYLIB
++static inline void fec_enable_phy_intr(struct fec_enet_private *fep)
++{
++}
++static inline void fec_disable_phy_intr(struct fec_enet_private *fep)
++{
++}
++static inline void fec_phy_ack_intr(struct fec_enet_private *fep)
++{
++}
++#else
++static inline void fec_enable_phy_intr(struct fec_enet_private *fep)
++{
++      if (!fep->phy_int_enabled) {
++              fep->phy_int_enabled = 1;
++              enable_irq(fep->mii_irq);
++      }
++}
++
++static inline void fec_disable_phy_intr(struct fec_enet_private *fep)
++{
++      if (fep->phy_int_enabled) {
++              disable_irq(fep->mii_irq);
++              fep->phy_int_enabled = 0;
++      }
++}
++
++static inline void fec_phy_ack_intr(struct fec_enet_private *fep)
++{
++      if (fep->phy_int_enabled) {
++              disable_irq(fep->mii_irq);
++              fep->phy_int_enabled = 0;
++      }
++}
++#endif
++
++/* ------------------------------------------------------------------------- */
++
++#ifndef CONFIG_PHYLIB
++static void mii_display_status(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      if (!fep->linkstatus && !fep->old_linkstatus) {
++              /* Link is still down - don't print anything */
+               return;
+       }
+       printk("%s: status: ", dev->name);
+-      if (!fep->link) {
++      if (!fep->linkstatus) {
+               printk("link down");
+       } else {
+               printk("link up");
+-              switch(*s & PHY_STAT_SPMASK) {
++              switch(fep->phy_status & PHY_STAT_SPMASK) {
+               case PHY_STAT_100FDX: printk(", 100MBit Full Duplex"); break;
+               case PHY_STAT_100HDX: printk(", 100MBit Half Duplex"); break;
+               case PHY_STAT_10FDX: printk(", 10MBit Full Duplex"); break;
+@@ -1305,20 +1906,19 @@ static void mii_display_status(struct ne
+                       printk(", Unknown speed/duplex");
+               }
+-              if (*s & PHY_STAT_ANC)
++              if (fep->phy_status & PHY_STAT_ANC)
+                       printk(", auto-negotiation complete");
+       }
+-      if (*s & PHY_STAT_FAULT)
++      if (fep->phy_status & PHY_STAT_FAULT)
+               printk(", remote fault");
+       printk(".\n");
+ }
+-static void mii_display_config(struct work_struct *work)
++static void mii_display_config(struct work_struct *w)
+ {
+-      struct fec_enet_private *fep = container_of(work, struct fec_enet_private, phy_task);
+-      struct net_device *dev = fep->netdev;
++      struct fec_enet_private *fep = container_of(w, struct fec_enet_private, phy_task);
+       uint status = fep->phy_status;
+       /*
+@@ -1326,7 +1926,7 @@ static void mii_display_config(struct wo
+       ** the workqueue.  It is thus safe to allow to reuse it.
+       */
+       fep->mii_phy_task_queued = 0;
+-      printk("%s: config: auto-negotiation ", dev->name);
++      //printk("%s: config: auto-negotiation ", dev->name);
+       if (status & PHY_CONF_ANE)
+               printk("on");
+@@ -1351,11 +1951,21 @@ static void mii_display_config(struct wo
+       fep->sequence_done = 1;
+ }
++#endif
+-static void mii_relink(struct work_struct *work)
++#ifndef CONFIG_PHYLIB
++static inline void *priv_netdev(struct fec_enet_private  *fep)
+ {
+-      struct fec_enet_private *fep = container_of(work, struct fec_enet_private, phy_task);
+-      struct net_device *dev = fep->netdev;
++      /* ugly hack, stolen from include linux/netdevice.h */
++      return (char *)fep - ((sizeof(struct net_device)
++                             + NETDEV_ALIGN_CONST)
++                            & ~NETDEV_ALIGN_CONST);
++}
++
++static void mii_relink(struct work_struct *w)
++{
++      struct fec_enet_private *fep = container_of(w, struct fec_enet_private, phy_task);
++      struct net_device *dev = priv_netdev(fep);
+       int duplex;
+       /*
+@@ -1363,23 +1973,19 @@ static void mii_relink(struct work_struc
+       ** the workqueue.  It is thus safe to allow to reuse it.
+       */
+       fep->mii_phy_task_queued = 0;
+-      fep->link = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0;
++      fep->linkstatus = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0;
+       mii_display_status(dev);
+-      fep->old_link = fep->link;
++      fep->old_linkstatus = fep->linkstatus;
+-      if (fep->link) {
++      if (fep->linkstatus) {
+               duplex = 0;
+-              if (fep->phy_status
+-                  & (PHY_STAT_100FDX | PHY_STAT_10FDX))
++              if (fep->phy_status & (PHY_STAT_100FDX | PHY_STAT_10FDX)) {
+                       duplex = 1;
++              }
+               fec_restart(dev, duplex);
+-      } else
++      } else {
+               fec_stop(dev);
+-
+-#if 0
+-      enable_irq(fep->mii_irq);
+-#endif
+-
++      }
+ }
+ /* mii_queue_relink is called in interrupt context from mii_link_interrupt */
+@@ -1429,15 +2035,14 @@ phy_cmd_t const phy_cmd_config[] = {
+ static void
+ mii_discover_phy3(uint mii_reg, struct net_device *dev)
+ {
+-      struct fec_enet_private *fep;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       int i;
+-      fep = netdev_priv(dev);
+       fep->phy_id |= (mii_reg & 0xffff);
+       printk("fec: PHY @ 0x%x, ID 0x%08x", fep->phy_addr, fep->phy_id);
+-      for(i = 0; phy_info[i]; i++) {
+-              if(phy_info[i]->id == (fep->phy_id >> 4))
++      for (i = 0; phy_info[i]; i++) {
++              if (phy_info[i]->id == (fep->phy_id >> 4))
+                       break;
+       }
+@@ -1456,13 +2061,9 @@ mii_discover_phy3(uint mii_reg, struct n
+ static void
+ mii_discover_phy(uint mii_reg, struct net_device *dev)
+ {
+-      struct fec_enet_private *fep;
+-      volatile fec_t *fecp;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       uint phytype;
+-      fep = netdev_priv(dev);
+-      fecp = fep->hwp;
+-
+       if (fep->phy_addr < 32) {
+               if ((phytype = (mii_reg & 0xffff)) != 0xffff && phytype != 0) {
+@@ -1470,39 +2071,40 @@ mii_discover_phy(uint mii_reg, struct ne
+                       */
+                       fep->phy_id = phytype << 16;
+                       mii_queue(dev, mk_mii_read(MII_REG_PHYIR2),
+-                                                      mii_discover_phy3);
++                                mii_discover_phy3);
+               } else {
+                       fep->phy_addr++;
+                       mii_queue(dev, mk_mii_read(MII_REG_PHYIR1),
+-                                                      mii_discover_phy);
++                                mii_discover_phy);
+               }
+       } else {
+               printk("FEC: No PHY device found.\n");
+               /* Disable external MII interface */
+-              fecp->fec_mii_speed = fep->phy_speed = 0;
+-#ifdef HAVE_mii_link_interrupt
+-              fec_disable_phy_intr();
+-#endif
++              fec_disable_phy_intr(fep);
++              fec_reg_write(fep, FEC_MSCR, 0);
+       }
+ }
++#endif
+-/* This interrupt occurs when the PHY detects a link change.
+-*/
+-#ifdef HAVE_mii_link_interrupt
++#ifndef CONFIG_PHYLIB
+ static irqreturn_t
+-mii_link_interrupt(int irq, void * dev_id)
++mii_link_interrupt(int irq, void *dev_id)
+ {
+-      struct  net_device *dev = dev_id;
++      struct net_device *dev = dev_id;
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      fec_phy_ack_intr();
++      DBG(0, "%s: \n", __FUNCTION__);
+-#if 0
+-      disable_irq(fep->mii_irq);  /* disable now, enable later */
+-#endif
++      fec_phy_ack_intr(fep);
+-      mii_do_cmd(dev, fep->phy->ack_int);
+-      mii_do_cmd(dev, phy_cmd_relink);  /* restart and display status */
++      /*
++       * Some board will trigger phy interrupt before phy enable.
++       * And at that moment , fep->phy is not initialized.
++       */
++      if (fep->phy) {
++              mii_do_cmd(dev, fep->phy->ack_int);
++              mii_do_cmd(dev, phy_cmd_relink);  /* restart and display status */
++      }
+       return IRQ_HANDLED;
+ }
+@@ -1511,16 +2113,31 @@ mii_link_interrupt(int irq, void * dev_i
+ static int
+ fec_enet_open(struct net_device *dev)
+ {
++      int ret = 0;
+       struct fec_enet_private *fep = netdev_priv(dev);
+       /* I should reset the ring buffers here, but I don't yet know
+        * a simple way to do that.
+        */
+-      fec_set_mac_address(dev);
++      DBG(0, "%s: \n", __FUNCTION__);
++      _fec_set_mac_address(dev);
+-      fep->sequence_done = 0;
+-      fep->link = 0;
++#ifdef CONFIG_PHYLIB
++      fec_restart(dev, 0);
++      ret = fec_connect_phy(dev, fep);
++      if (ret != 0) {
++              DBG(0, "%s: Failed to connect to PHY: %d\n", __FUNCTION__, ret);
++              return ret;
++      }
++      phy_start(fep->phy);
++
++      fep->linkstatus = fep->phy->link;
++      //fec_restart(dev, 0);
++      DBG(0, "%s: Link status is: %d\n", __FUNCTION__, fep->linkstatus);
++#else
++      fep->linkstatus = 0;
++      fep->sequence_done = 0;
+       if (fep->phy) {
+               mii_do_cmd(dev, fep->phy->ack_int);
+               mii_do_cmd(dev, fep->phy->config);
+@@ -1542,16 +2159,20 @@ fec_enet_open(struct net_device *dev)
+                * based on this device does not implement a PHY interrupt,
+                * so we are never notified of link change.
+                */
+-              fep->link = 1;
++              fep->linkstatus = 1;
+       } else {
+-              fep->link = 1; /* lets just try it and see */
++              fep->linkstatus = 1; /* lets just try it and see */
+               /* no phy,  go full duplex,  it's most likely a hub chip */
+               fec_restart(dev, 1);
+       }
+-
+-      netif_start_queue(dev);
++      fep->old_linkstatus = fep->linkstatus;
++#endif
+       fep->opened = 1;
+-      return 0;               /* Success */
++#if 1
++      /* enable receiver */
++      fec_reg_write(fep, FEC_RDAR, DONT_CARE);
++#endif
++      return ret;
+ }
+ static int
+@@ -1559,15 +2180,46 @@ fec_enet_close(struct net_device *dev)
+ {
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      /* Don't know what to do yet.
+-      */
++      DBG(0, "%s: \n", __FUNCTION__);
++
+       fep->opened = 0;
+-      netif_stop_queue(dev);
+-      fec_stop(dev);
++      if (fep->linkstatus) {
++              fec_stop(dev);
++      }
++#ifdef CONFIG_PHYLIB
++      if (fep->phy) {
++              DBG(0, "%s: Stopping PHY %p\n", __FUNCTION__, fep->phy);
++              phy_stop(fep->phy);
++              DBG(0, "%s: Disconnecting PHY %p\n", __FUNCTION__, fep->phy);
++              phy_disconnect(fep->phy);
++              fep->phy = NULL;
++      }
++#endif
++#if 1
++      /* Whack a reset.  We should wait for this.
++      */
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_RESET);
++      udelay(10);
++
++      /* Mask and clear outstanding MII command interrupts.
++      */
++      fec_reg_write(fep, FEC_EIMR, 0);
++      fec_reg_write(fep, FEC_EIR, FEC_ENET_MII);
++      fec_disable_phy_intr(fep);
++      /* Switch off MII */
++      fec_reg_write(fep, FEC_MSCR, 0);
++#endif
+       return 0;
+ }
++static struct net_device_stats *fec_enet_get_stats(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      return &fep->stats;
++}
++
+ /* Set or clear the multicast filter for this adaptor.
+  * Skeleton taken from sunlance driver.
+  * The CPM Ethernet implementation allows Multicast as well as individual
+@@ -1583,37 +2235,32 @@ fec_enet_close(struct net_device *dev)
+ static void set_multicast_list(struct net_device *dev)
+ {
+-      struct fec_enet_private *fep;
+-      volatile fec_t *ep;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       struct dev_mc_list *dmi;
+       unsigned int i, j, bit, data, crc;
+       unsigned char hash;
+-      fep = netdev_priv(dev);
+-      ep = fep->hwp;
+-
+-      if (dev->flags&IFF_PROMISC) {
+-              ep->fec_r_cntrl |= 0x0008;
++      if (dev->flags & IFF_PROMISC) {
++              fec_reg_write(fep, FEC_RCR, fec_reg_read(fep, FEC_RCR) | RCR_PROM);
+       } else {
+-              ep->fec_r_cntrl &= ~0x0008;
++              fec_reg_write(fep, FEC_RCR, fec_reg_read(fep, FEC_RCR) & ~RCR_PROM);
+               if (dev->flags & IFF_ALLMULTI) {
+                       /* Catch all multicast addresses, so set the
+                        * filter to all 1's.
+                        */
+-                      ep->fec_grp_hash_table_high = 0xffffffff;
+-                      ep->fec_grp_hash_table_low = 0xffffffff;
++                      fec_reg_write(fep, FEC_IAUR, ~0);
++                      fec_reg_write(fep, FEC_IALR, ~0);
+               } else {
+                       /* Clear filter and add the addresses in hash register.
+                       */
+-                      ep->fec_grp_hash_table_high = 0;
+-                      ep->fec_grp_hash_table_low = 0;
++                      fec_reg_write(fep, FEC_IAUR, 0);
++                      fec_reg_write(fep, FEC_IALR, 0);
+                       dmi = dev->mc_list;
+-                      for (j = 0; j < dev->mc_count; j++, dmi = dmi->next)
+-                      {
++                      for (j = 0; j < dev->mc_count; j++, dmi = dmi->next) {
+                               /* Only support group multicast for now.
+                               */
+                               if (!(dmi->dmi_addr[0] & 1))
+@@ -1621,13 +2268,11 @@ static void set_multicast_list(struct ne
+                               /* calculate crc32 value of mac address
+                               */
+-                              crc = 0xffffffff;
++                              crc = ~0;
+-                              for (i = 0; i < dmi->dmi_addrlen; i++)
+-                              {
++                              for (i = 0; i < dmi->dmi_addrlen; i++) {
+                                       data = dmi->dmi_addr[i];
+-                                      for (bit = 0; bit < 8; bit++, data >>= 1)
+-                                      {
++                                      for (bit = 0; bit < 8; bit++, data >>= 1) {
+                                               crc = (crc >> 1) ^
+                                               (((crc ^ data) & 1) ? CRC32_POLY : 0);
+                                       }
+@@ -1639,9 +2284,13 @@ static void set_multicast_list(struct ne
+                               hash = (crc >> (32 - HASH_BITS)) & 0x3f;
+                               if (hash > 31)
+-                                      ep->fec_grp_hash_table_high |= 1 << (hash - 32);
++                                      fec_reg_write(fep, FEC_IAUR,
++                                                    fec_reg_read(fep, FEC_IAUR) |
++                                                    (1 << (hash - 32)));
+                               else
+-                                      ep->fec_grp_hash_table_low |= 1 << hash;
++                                      fec_reg_write(fep, FEC_IALR,
++                                                    fec_reg_read(fep, FEC_IALR) |
++                                                    (1 << hash));
+                       }
+               }
+       }
+@@ -1650,106 +2299,272 @@ static void set_multicast_list(struct ne
+ /* Set a MAC change in hardware.
+  */
+ static void
+-fec_set_mac_address(struct net_device *dev)
++_fec_set_mac_address(struct net_device *dev)
+ {
+-      volatile fec_t *fecp;
+-
+-      fecp = ((struct fec_enet_private *)netdev_priv(dev))->hwp;
++      struct fec_enet_private *fep = netdev_priv(dev);
+       /* Set station address. */
+-      fecp->fec_addr_low = dev->dev_addr[3] | (dev->dev_addr[2] << 8) |
+-              (dev->dev_addr[1] << 16) | (dev->dev_addr[0] << 24);
+-      fecp->fec_addr_high = (dev->dev_addr[5] << 16) |
+-              (dev->dev_addr[4] << 24);
++      fec_reg_write(fep, FEC_PALR, dev->dev_addr[3] | (dev->dev_addr[2] << 8) |
++              (dev->dev_addr[1] << 16) | (dev->dev_addr[0] << 24));
++      fec_reg_write(fep, FEC_PAUR, (dev->dev_addr[5] << 16) |
++              (dev->dev_addr[4] << 24));
++}
++
++static int
++fec_set_mac_address(struct net_device *dev, void *_addr)
++{
++      struct sockaddr *addr = _addr;
++
++      if (!is_valid_ether_addr((const char *)&addr->sa_data)) {
++              printk(KERN_WARNING "Bad ethernet address: %02x:%02x:%02x:%02x:%02x:%02x\n",
++                     addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3],
++                     addr->sa_data[4], addr->sa_data[5]);
++              return -EINVAL;
++      }
++      printk(KERN_DEBUG "Setting MAC address to %02x:%02x:%02x:%02x:%02x:%02x\n",
++             addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3],
++             addr->sa_data[4], addr->sa_data[5]);
++
++      memcpy(&dev->dev_addr, &addr->sa_data, ETH_ALEN);
++      _fec_set_mac_address(dev);
++
++      return 0;
+ }
+- /*
+-  * XXX:  We need to clean up on failure exits here.
+-  *
+-  * index is only used in legacy code
+-  */
+-int __init fec_enet_init(struct net_device *dev, int index)
++static void fec_enet_free_buffers(struct fec_enet_private *fep)
++{
++      cbd_t *bdp = fep->rx_bd_base;
++      int i;
++
++      DBG(0, "%s: Freeing TX bounce buffers %p\n", __FUNCTION__, fep->tx_bounce[0]);
++      kfree(fep->tx_bounce[0]);
++      memset(fep->tx_bounce, 0, TX_RING_SIZE * sizeof(void*));
++      for (i = 0; i < RX_RING_SIZE; i++, bdp++) {
++              if (fep->rx_skbuff[i] != NULL) {
++                      DBG(0, "%s: Freeing RX skb %p\n", __FUNCTION__, fep->rx_skbuff[i]);
++                      fec_enet_rxbuf_unmap(fep, bdp, FEC_ENET_RX_FRSIZE);
++                      kfree_skb(fep->rx_skbuff[i]);
++                      fep->rx_skbuff[i] = NULL;
++              }
++      }
++}
++
++#ifdef CONFIG_PHYLIB
++/* called by the generic PHY layer in interrupt context */
++static int phy_regs[32] = { [0 ... ARRAY_SIZE(phy_regs) - 1] = -1};
++static int fec_mii_read(struct mii_bus *bus, int phy_id, int regnum)
+ {
++      int ret;
++      struct net_device *dev = bus->priv;
+       struct fec_enet_private *fep = netdev_priv(dev);
+-      unsigned long   mem_addr;
+-      volatile cbd_t  *bdp;
+-      cbd_t           *cbd_base;
+-      volatile fec_t  *fecp;
+-      int             i, j;
++      unsigned long regval = mk_mii_read(regnum) | phy_id << 23;
++      unsigned long flags;
++      int loops = 0;
+-      /* Allocate memory for buffer descriptors.
+-      */
+-      mem_addr = (unsigned long)dma_alloc_coherent(NULL, PAGE_SIZE,
+-                      &fep->bd_dma, GFP_KERNEL);
+-      if (mem_addr == 0) {
+-              printk("FEC: allocate descriptor memory failed?\n");
++      DBG(1, "%s: \n", __FUNCTION__);
++#if 0
++      DBG(0, "%s: ECR:  %08lx\n", __FUNCTION__, fec_reg_read(fep, FEC_ECR));
++      DBG(0, "%s: EIR:  %08lx\n", __FUNCTION__, fec_reg_read(fep, FEC_EIR));
++      DBG(0, "%s: EIMR: %08lx\n", __FUNCTION__, fec_reg_read(fep, FEC_EIMR));
++      DBG(0, "%s: RCR:  %08lx\n", __FUNCTION__, fec_reg_read(fep, FEC_RCR));
++      DBG(0, "%s: TCR:  %08lx\n", __FUNCTION__, fec_reg_read(fep, FEC_TCR));
++#endif
++      spin_lock_irqsave(&fep->lock, flags);
++      fep->mii_complete = 0;
++      fec_reg_write(fep, FEC_MMFR, regval);
++      spin_unlock_irqrestore(&fep->lock, flags);
++
++      while (!fep->mii_complete) {
++              if (loops++ == 1000) {
++                      DBG(1, "%s: Waiting for MII completion\n", __FUNCTION__);
++              }
++              cpu_relax();
++      }
++      if (loops >= 1000) {
++              DBG(1, "%s: MII transaction completed\n", __FUNCTION__);
++      }
++      ret = fec_reg_read(fep, FEC_MMFR);
++      if (ret < 0) {
++              DBG(0, "%s: Failed to read PHY[%02x] reg %02x: %d\n", __FUNCTION__,
++                  phy_id, regnum, ret);
++              return ret;
++      }
++      ret &= 0xffff;
++      if (phy_regs[regnum] != ret) {
++              DBG(1, "%s: Read %04x from PHY[%02x] reg %02x\n", __FUNCTION__,
++                  ret, phy_id, regnum);
++              phy_regs[regnum] = ret;
++      }
++      return ret;
++}
++
++static int fec_mii_write(struct mii_bus *bus, int phy_id, int regnum, u16 val)
++{
++      struct net_device *dev = bus->priv;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      unsigned long regval = mk_mii_write(regnum, val) | phy_id << 23;
++      unsigned long flags;
++
++      DBG(0, "%s: \n", __FUNCTION__);
++
++      spin_lock_irqsave(&fep->lock, flags);
++      fep->mii_complete = 0;
++      fec_reg_write(fep, FEC_MMFR, regval);
++      spin_unlock_irqrestore(&fep->lock, flags);
++
++      while (!fep->mii_complete) {
++              cpu_relax();
++      }
++      DBG(1, "%s: Wrote %04x to PHY[%02x] reg %02x\n", __FUNCTION__, val, phy_id, regnum);
++      return 0;
++}
++
++static int fec_mii_reset(struct mii_bus *bus)
++{
++      DBG(0, "%s: \n", __FUNCTION__);
++      memset(phy_regs, -1, sizeof(phy_regs));
++      return 0;
++}
++
++static int fec_init_phy(struct net_device *dev, struct fec_enet_private *fep)
++{
++      int ret;
++      int i;
++      struct mii_bus *mii;
++
++      mii = mdiobus_alloc();
++      if (mii == NULL) {
+               return -ENOMEM;
+       }
++      mii->name = "fec mii";
++      mii->read = fec_mii_read;
++      mii->write = fec_mii_write;
++      mii->reset = fec_mii_reset;
++      mii->priv = dev;
++      snprintf(mii->id, MII_BUS_ID_SIZE, "%x", 0);
++      mii->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
++      for (i = 0; i < PHY_MAX_ADDR; i++) {
++              mii->irq[i] = fep->mii_irq >= 0 ? fep->mii_irq : PHY_POLL;
++      }
++
++      ret = mdiobus_register(mii);
++      if (ret != 0) {
++              DBG(0, "%s: Failed to register MII bus: %d\n", __FUNCTION__, ret);
++              kfree(mii->irq);
++              mdiobus_free(mii);
++              return ret;
++      }
++      fep->phy_addr = -1;
++      DBG(0, "%s: MII bus registered\n", __FUNCTION__);
++      for (i = 0; i < PHY_MAX_ADDR; i++) {
++              if (mii->phy_map[i] != NULL) {
++                      fep->phy_addr = i;
++                      break;
++              }
++      }
++      if (fep->phy_addr == -1) {
++              DBG(0, "%s: No PHY found\n", __FUNCTION__);
++              return -ENODEV;
++      }
++      DBG(0, "%s: Using PHY at addr %02x\n", __FUNCTION__, fep->phy_addr);
++      fep->mii = mii;
+-      spin_lock_init(&fep->hw_lock);
+-      spin_lock_init(&fep->mii_lock);
++      return 0;
++}
+-      /* Create an Ethernet device instance.
+-      */
+-      fecp = (volatile fec_t *)dev->base_addr;
++static int fec_connect_phy(struct net_device *dev, struct fec_enet_private *fep)
++{
++      struct mii_bus *mii = fep->mii;
+-      fep->index = index;
+-      fep->hwp = fecp;
+-      fep->netdev = dev;
++      DBG(0, "%s: Connecting PHY at addr %02x\n", __FUNCTION__,
++          fep->phy_addr);
+-      /* Whack a reset.  We should wait for this.
+-      */
+-      fecp->fec_ecntrl = 1;
+-      udelay(10);
++      fep->phy = phy_connect(dev, dev_name(&mii->phy_map[fep->phy_addr]->dev),
++                             fec_link_change, 0, mii->phy_map[fep->phy_addr]->interface);
++      if (IS_ERR(fep->phy)) {
++              int ret = PTR_ERR(fep->phy);
++              printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
++              fep->phy = NULL;
++              return ret;
++      }
++      DBG(0, "%s: Registered PHY %s[%02x] IRQ %d with %s\n", __FUNCTION__,
++          dev_name(&fep->phy->dev), fep->phy_addr, fep->phy->irq, dev->name);
+-      /* Set the Ethernet address */
+-#ifdef CONFIG_M5272
+-      fec_get_mac(dev);
++      return 0;
++}
+ #else
+-      {
+-              unsigned long l;
+-              l = fecp->fec_addr_low;
+-              dev->dev_addr[0] = (unsigned char)((l & 0xFF000000) >> 24);
+-              dev->dev_addr[1] = (unsigned char)((l & 0x00FF0000) >> 16);
+-              dev->dev_addr[2] = (unsigned char)((l & 0x0000FF00) >> 8);
+-              dev->dev_addr[3] = (unsigned char)((l & 0x000000FF) >> 0);
+-              l = fecp->fec_addr_high;
+-              dev->dev_addr[4] = (unsigned char)((l & 0xFF000000) >> 24);
+-              dev->dev_addr[5] = (unsigned char)((l & 0x00FF0000) >> 16);
+-      }
++static int fec_init_phy(struct net_device *dev, struct fec_enet_private *fep)
++{
++      /* Queue up command to detect the PHY and initialize the
++       * remainder of the interface.
++       */
++      fep->phy_id_done = 0;
++      fep->phy_addr = 0;
++      mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy);
++
++      return 0;
++}
+ #endif
+-      cbd_base = (cbd_t *)mem_addr;
++/* Initialize the FEC Ethernet on 860T (or ColdFire 5272).
++ */
++ /*
++  * XXX:  We need to clean up on failure exits here.
++  */
+-      /* Set receive and transmit descriptor base.
++int __devinit fec_enet_init(struct platform_device *pdev, struct net_device *dev)
++{
++      int ret;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      cbd_t *bdp;
++      struct sk_buff *pskb;
++      int i;
++      void *mem;
++
++      spin_lock_init(&fep->lock);
++
++      /* Whack a reset.  We should wait for this.
+       */
+-      fep->rx_bd_base = cbd_base;
+-      fep->tx_bd_base = cbd_base + RX_RING_SIZE;
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_RESET);
++      udelay(10);
++
++      /* Set the Ethernet address.  If using multiple Enets on the 8xx,
++       * this needs some work to get unique addresses.
++       *
++       * This is our default MAC address unless the user changes
++       * it via eth_mac_addr (our dev->set_mac_addr handler).
++       */
++      fec_get_mac(dev);
+       fep->dirty_tx = fep->cur_tx = fep->tx_bd_base;
+       fep->cur_rx = fep->rx_bd_base;
+       fep->skb_cur = fep->skb_dirty = 0;
+-      /* Initialize the receive buffer descriptors.
++      /* allocate memory for TX bounce buffers */
++      mem = kzalloc(TX_RING_SIZE * FEC_ENET_TX_FRSIZE, GFP_KERNEL);
++      if (mem == NULL) {
++              return -ENOMEM;
++      }
++
++      fec_enet_cbd_get(fep);
++
++      /* Initialize the transmit buffer descriptors.
+       */
+-      bdp = fep->rx_bd_base;
+-      for (i=0; i<FEC_ENET_RX_PAGES; i++) {
++      bdp = fep->tx_bd_base;
+-              /* Allocate a page.
+-              */
+-              mem_addr = __get_free_page(GFP_KERNEL);
+-              /* XXX: missing check for allocation failure */
++      DBG(0, "%s: Allocated %d byte of TX buffer memory @ %p\n", __FUNCTION__,
++          TX_RING_SIZE * FEC_ENET_TX_FRSIZE, mem);
++      for (i = 0; i < TX_RING_SIZE; i++) {
++              fep->tx_bounce[i] = mem;
++              DBG(0, "%s: TX bounce buffer[%d]=%p\n", __FUNCTION__, i, fep->tx_bounce[i]);
++              mem = (void *)((unsigned long)(mem + FEC_ENET_TX_FRSIZE));
+               /* Initialize the BD for every fragment in the page.
+               */
+-              for (j=0; j<FEC_ENET_RX_FRPPG; j++) {
+-                      bdp->cbd_sc = BD_ENET_RX_EMPTY;
+-                      bdp->cbd_bufaddr = __pa(mem_addr);
+-                      mem_addr += FEC_ENET_RX_FRSIZE;
+-                      bdp++;
+-              }
++              bdp->cbd_bufaddr = ~0;
++              bdp++;
+       }
+       /* Set the last buffer to wrap.
+@@ -1757,87 +2572,88 @@ int __init fec_enet_init(struct net_devi
+       bdp--;
+       bdp->cbd_sc |= BD_SC_WRAP;
+-      /* ...and the same for transmmit.
++      /* ...and the same for receive.
+       */
+-      bdp = fep->tx_bd_base;
+-      for (i=0, j=FEC_ENET_TX_FRPPG; i<TX_RING_SIZE; i++) {
+-              if (j >= FEC_ENET_TX_FRPPG) {
+-                      mem_addr = __get_free_page(GFP_KERNEL);
+-                      j = 1;
+-              } else {
+-                      mem_addr += FEC_ENET_TX_FRSIZE;
+-                      j++;
++      bdp = fep->rx_bd_base;
++      for (i = 0; i < RX_RING_SIZE; i++, bdp++) {
++              pskb = __dev_alloc_skb(FEC_ENET_RX_FRSIZE, GFP_KERNEL);
++              if (pskb == NULL) {
++                      DBG(0, "%s: Failed to allocate RX skb; cleaning up\n", __FUNCTION__);
++                      ret = -ENOMEM;
++                      goto cleanup;
+               }
+-              fep->tx_bounce[i] = (unsigned char *) mem_addr;
+-
+-              /* Initialize the BD for every fragment in the page.
+-              */
+-              bdp->cbd_sc = 0;
+-              bdp->cbd_bufaddr = 0;
+-              bdp++;
++              DBG(0, "%s: RX skb allocated @ %p\n", __FUNCTION__, pskb);
++              fep->rx_skbuff[i] = pskb;
++              pskb->data = FEC_ADDR_ALIGNMENT(pskb->data);
++              bdp->cbd_sc = BD_ENET_RX_EMPTY;
++              bdp->cbd_bufaddr = ~0;
++              fec_enet_rxbuf_map(fep, bdp, pskb->data, FEC_ENET_RX_FRSIZE);
+       }
+-
+       /* Set the last buffer to wrap.
+       */
+       bdp--;
+       bdp->cbd_sc |= BD_SC_WRAP;
++      fec_enet_cbd_put(fep);
+       /* Set receive and transmit descriptor base.
+       */
+-      fecp->fec_r_des_start = fep->bd_dma;
+-      fecp->fec_x_des_start = (unsigned long)fep->bd_dma + sizeof(cbd_t)
+-                              * RX_RING_SIZE;
+-
+-#ifdef HAVE_mii_link_interrupt
+-      fec_request_mii_intr(dev);
+-#endif
+-
+-      fecp->fec_grp_hash_table_high = 0;
+-      fecp->fec_grp_hash_table_low = 0;
+-      fecp->fec_r_buff_size = PKT_MAXBLR_SIZE;
+-      fecp->fec_ecntrl = 2;
+-      fecp->fec_r_des_active = 0;
+-#ifndef CONFIG_M5272
+-      fecp->fec_hash_table_high = 0;
+-      fecp->fec_hash_table_low = 0;
+-#endif
++      fec_reg_write(fep, FEC_ERDSR, fep->cbd_phys_base);
++      fec_reg_write(fep, FEC_ETDSR, fep->cbd_phys_base + RX_RING_SIZE * sizeof(cbd_t));
++      /* Install our interrupt handlers. This varies depending on
++       * the architecture.
++      */
++      ret = fec_request_intrs(pdev, dev);
++      if (ret != 0) {
++              goto cleanup;
++      }
++      /* Clear and enable interrupts */
++      fec_reg_write(fep, FEC_EIR, fec_reg_read(fep, FEC_EIR));
++      fec_reg_write(fep, FEC_EIMR, FEC_ENET_TXF | FEC_ENET_TXB |
++                    FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII);
++
++      fec_reg_write(fep, FEC_IAUR, 0);
++      fec_reg_write(fep, FEC_IALR, 0);
++      fec_reg_write(fep, FEC_EMRBR, PKT_MAXBLR_SIZE);
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_ETHER_EN);
++      fec_localhw_setup(dev);
++#if 0
++      /* do this in enet_open()! */
++      fec_reg_write(fep, FEC_RDAR, DONT_CARE);
++#endif
+       /* The FEC Ethernet specific entries in the device structure. */
+       dev->open = fec_enet_open;
+       dev->hard_start_xmit = fec_enet_start_xmit;
+       dev->tx_timeout = fec_timeout;
+       dev->watchdog_timeo = TX_TIMEOUT;
+       dev->stop = fec_enet_close;
++      dev->get_stats = fec_enet_get_stats;
+       dev->set_multicast_list = set_multicast_list;
++      dev->set_mac_address = fec_set_mac_address;
+-      for (i=0; i<NMII-1; i++)
+-              mii_cmds[i].mii_next = &mii_cmds[i+1];
++#ifndef CONFIG_PHYLIB
++      for (i = 1; i < NMII; i++) {
++              mii_cmds[i - 1].mii_next = &mii_cmds[i];
++      }
+       mii_free = mii_cmds;
+-
++#endif
+       /* setup MII interface */
+-      fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04;
+-      fecp->fec_x_cntrl = 0x00;
+-
+-      /*
+-       * Set MII speed to 2.5 MHz
+-       */
+-      fep->phy_speed = ((((clk_get_rate(fep->clk) / 2 + 4999999)
+-                                      / 2500000) / 2) & 0x3F) << 1;
+-      fecp->fec_mii_speed = fep->phy_speed;
+-      fec_restart(dev, 0);
+-
+-      /* Clear and enable interrupts */
+-      fecp->fec_ievent = 0xffc00000;
+-      fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII);
+-
+-      /* Queue up command to detect the PHY and initialize the
+-       * remainder of the interface.
+-       */
+-      fep->phy_id_done = 0;
+-      fep->phy_addr = 0;
+-      mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy);
++      ret = fec_set_mii(dev, fep);
++      if (ret) {
++              DBG(0, "%s: Failed to initialize MII interface: %d\n", __FUNCTION__, ret);
++              goto cleanup;
++      }
++      ret = fec_init_phy(dev, fep);
++      if (ret) {
++              DBG(0, "%s: Failed to initialize PHY: %d\n", __FUNCTION__, ret);
++              goto cleanup;
++      }
+       return 0;
++ cleanup:
++      fec_enet_free_buffers(fep);
++      fec_enet_cbd_put(fep);
++      return ret;
+ }
+ /* This function is called to start or restart the FEC during a link
+@@ -1847,60 +2663,67 @@ int __init fec_enet_init(struct net_devi
+ static void
+ fec_restart(struct net_device *dev, int duplex)
+ {
+-      struct fec_enet_private *fep;
+-      volatile cbd_t *bdp;
+-      volatile fec_t *fecp;
++      struct fec_enet_private *fep = netdev_priv(dev);
++      cbd_t *bdp;
+       int i;
++      u32 rcr = OPT_FRAME_SIZE | RCR_MII_MODE;        /* MII enable */
++      u32 tcr = TCR_HBC;
+-      fep = netdev_priv(dev);
+-      fecp = fep->hwp;
+-
++      DBG(0, "%s: Restarting FEC in %s-duplex mode\n", __FUNCTION__,
++          duplex ? "full" : "half");
+       /* Whack a reset.  We should wait for this.
+-      */
+-      fecp->fec_ecntrl = 1;
++       */
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_RESET);
+       udelay(10);
++      /* Enable interrupts we wish to service.
++       */
++      fec_reg_write(fep, FEC_EIMR, FEC_ENET_TXF | FEC_ENET_TXB |
++                    FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII);
++
+       /* Clear any outstanding interrupt.
+-      */
+-      fecp->fec_ievent = 0xffc00000;
++       *
++       */
++      fec_reg_write(fep, FEC_EIR, FEC_ENET_MASK);
++
++      fec_enable_phy_intr(fep);
+       /* Set station address.
+-      */
+-      fec_set_mac_address(dev);
++       */
++      _fec_set_mac_address(dev);
+       /* Reset all multicast.
+-      */
+-      fecp->fec_grp_hash_table_high = 0;
+-      fecp->fec_grp_hash_table_low = 0;
++       */
++      fec_reg_write(fep, FEC_IAUR, 0);
++      fec_reg_write(fep, FEC_IALR, 0);
+       /* Set maximum receive buffer size.
+-      */
+-      fecp->fec_r_buff_size = PKT_MAXBLR_SIZE;
++       */
++      fec_reg_write(fep, FEC_EMRBR, PKT_MAXBLR_SIZE);
+       /* Set receive and transmit descriptor base.
+-      */
+-      fecp->fec_r_des_start = fep->bd_dma;
+-      fecp->fec_x_des_start = (unsigned long)fep->bd_dma + sizeof(cbd_t)
+-                              * RX_RING_SIZE;
++       */
++      fec_reg_write(fep, FEC_ERDSR, fep->cbd_phys_base);
++      fec_reg_write(fep, FEC_ETDSR, fep->cbd_phys_base + RX_RING_SIZE * sizeof(cbd_t));
+       fep->dirty_tx = fep->cur_tx = fep->tx_bd_base;
+       fep->cur_rx = fep->rx_bd_base;
+       /* Reset SKB transmit buffers.
+-      */
++       */
+       fep->skb_cur = fep->skb_dirty = 0;
+-      for (i=0; i<=TX_RING_MOD_MASK; i++) {
++      bdp = fep->tx_bd_base;
++      for (i = 0; i <= TX_RING_MOD_MASK; i++) {
+               if (fep->tx_skbuff[i] != NULL) {
+-                      dev_kfree_skb_any(fep->tx_skbuff[i]);
+-                      fep->tx_skbuff[i] = NULL;
++                      fec_free_skb(fep, bdp, &fep->tx_skbuff[i]);
++                      bdp++;
+               }
+       }
+       /* Initialize the receive buffer descriptors.
+-      */
++       */
+       bdp = fep->rx_bd_base;
+-      for (i=0; i<RX_RING_SIZE; i++) {
+-
++      for (i = 0; i < RX_RING_SIZE; i++) {
+               /* Initialize the BD for every fragment in the page.
+               */
+               bdp->cbd_sc = BD_ENET_RX_EMPTY;
+@@ -1908,246 +2731,366 @@ fec_restart(struct net_device *dev, int 
+       }
+       /* Set the last buffer to wrap.
+-      */
++       */
+       bdp--;
+       bdp->cbd_sc |= BD_SC_WRAP;
+       /* ...and the same for transmmit.
+-      */
++       */
+       bdp = fep->tx_bd_base;
+-      for (i=0; i<TX_RING_SIZE; i++) {
+-
++      for (i = 0; i < TX_RING_SIZE; i++) {
+               /* Initialize the BD for every fragment in the page.
+               */
+               bdp->cbd_sc = 0;
+-              bdp->cbd_bufaddr = 0;
++              bdp->cbd_bufaddr = ~0;
+               bdp++;
+       }
+       /* Set the last buffer to wrap.
+-      */
++       */
+       bdp--;
+       bdp->cbd_sc |= BD_SC_WRAP;
+       /* Enable MII mode.
+-      */
++       */
+       if (duplex) {
+-              fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04;/* MII enable */
+-              fecp->fec_x_cntrl = 0x04;                 /* FD enable */
++              tcr |= TCR_FDEN;        /* FD enable */
+       } else {
+-              /* MII enable|No Rcv on Xmit */
+-              fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x06;
+-              fecp->fec_x_cntrl = 0x00;
++              rcr |= RCR_DRT;         /* No Rcv on Xmit */
+       }
++      fec_reg_write(fep, FEC_RCR, rcr);
++      fec_reg_write(fep, FEC_TCR, tcr);
+       fep->full_duplex = duplex;
+       /* Set MII speed.
+-      */
+-      fecp->fec_mii_speed = fep->phy_speed;
++       */
++      fec_reg_write(fep, FEC_MSCR, fep->phy_speed);
+       /* And last, enable the transmit and receive processing.
+-      */
+-      fecp->fec_ecntrl = 2;
+-      fecp->fec_r_des_active = 0;
++       */
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_ETHER_EN);
++      fec_localhw_setup(dev);
++      fec_reg_write(fep, FEC_RDAR, DONT_CARE);
+-      /* Enable interrupts we wish to service.
+-      */
+-      fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII);
++      DBG(0, "%s: Starting netif queue\n", __FUNCTION__);
++      netif_start_queue(dev);
+ }
+ static void
+ fec_stop(struct net_device *dev)
+ {
+-      volatile fec_t *fecp;
+-      struct fec_enet_private *fep;
++      struct fec_enet_private *fep = netdev_priv(dev);
+-      fep = netdev_priv(dev);
+-      fecp = fep->hwp;
++      DBG(0, "%s: Stopping netif queue\n", __FUNCTION__);
++      netif_stop_queue(dev);
+       /*
+-      ** We cannot expect a graceful transmit stop without link !!!
+-      */
+-      if (fep->link)
+-              {
+-              fecp->fec_x_cntrl = 0x01;       /* Graceful transmit stop */
++       * We cannot expect a graceful transmit stop without link!
++       */
++      if (fep->linkstatus) {
++              fec_reg_write(fep, FEC_TCR, 0x01);      /* Graceful transmit stop */
+               udelay(10);
+-              if (!(fecp->fec_ievent & FEC_ENET_GRA))
+-                      printk("fec_stop : Graceful transmit stop did not complete !\n");
+-              }
+-
++              if (!(fec_reg_read(fep, FEC_EIR) & FEC_ENET_GRA))
++                      dev_warn(&dev->dev, "Graceful transmit stop did not complete!\n");
++      }
++#if 0
+       /* Whack a reset.  We should wait for this.
+-      */
+-      fecp->fec_ecntrl = 1;
++       */
++      fec_reg_write(fep, FEC_ECR, FEC_ECR_RESET);
+       udelay(10);
+-
+-      /* Clear outstanding MII command interrupts.
+-      */
+-      fecp->fec_ievent = FEC_ENET_MII;
+-
+-      fecp->fec_imask = FEC_ENET_MII;
+-      fecp->fec_mii_speed = fep->phy_speed;
++      /* Mask and clear outstanding MII command interrupts.
++       */
++      fec_reg_write(fep, FEC_EIMR, 0);
++      fec_reg_write(fep, FEC_EIR, FEC_ENET_MII);
++      fec_enable_phy_intr(fep);
++      fec_reg_write(fep, FEC_MSCR, fep->phy_speed);
++#endif
+ }
+-static int __devinit
+-fec_probe(struct platform_device *pdev)
++static int __devinit fec_enet_probe(struct platform_device *pdev)
+ {
++      int ret;
+       struct fec_enet_private *fep;
+-      struct net_device *ndev;
+-      int i, irq, ret = 0;
+-      struct resource *r;
+-
+-      r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+-      if (!r)
+-              return -ENXIO;
++      struct net_device *dev;
++      struct fec_enet_platform_data *pdata = pdev->dev.platform_data;
++      struct resource *res_mem1;
++      struct resource *res_mem2;
++
++      res_mem1 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (res_mem1 == NULL) {
++              return -ENODEV;
++      }
+-      r = request_mem_region(r->start, resource_size(r), pdev->name);
+-      if (!r)
++      res_mem1 = request_mem_region(res_mem1->start,
++                                    resource_size(res_mem1),
++                                    DRV_NAME);
++      if (res_mem1 == NULL) {
+               return -EBUSY;
++      }
++      res_mem2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++      if (res_mem2 != NULL) {
++              res_mem2 = request_mem_region(res_mem2->start,
++                                            resource_size(res_mem2),
++                                            DRV_NAME);
++              if (res_mem2 == NULL) {
++                      ret = -EBUSY;
++                      goto release1;
++              }
++      }
+-      /* Init network device */
+-      ndev = alloc_etherdev(sizeof(struct fec_enet_private));
+-      if (!ndev)
+-              return -ENOMEM;
+-
+-      SET_NETDEV_DEV(ndev, &pdev->dev);
+-
+-      /* setup board info structure */
+-      fep = netdev_priv(ndev);
+-      memset(fep, 0, sizeof(*fep));
++      dev = alloc_etherdev(sizeof(struct fec_enet_private));
++      if (dev == NULL) {
++              ret = -ENOMEM;
++              goto release2;
++      }
++      platform_set_drvdata(pdev, dev);
++      fep = netdev_priv(dev);
++      fep->res_mem1 = res_mem1;
++      fep->res_mem2 = res_mem2;
++      fep->dma_dev = &pdev->dev;
++
++      fep->reg_base = ioremap(res_mem1->start, resource_size(res_mem1));
++      if (fep->reg_base == NULL) {
++              printk("FEC: Mapping FEC registers failed\n");
++              ret = -ENOMEM;
++              goto free_netdev;
++      }
++      DBG(0, "%s: FEC registers @ %08lx mapped to %p\n", __FUNCTION__,
++          (unsigned long)res_mem1->start, fep->reg_base);
+-      ndev->base_addr = (unsigned long)ioremap(r->start, resource_size(r));
++      fep->mib_base = ioremap(res_mem2->start, resource_size(res_mem2));
++      if (fep->mib_base == NULL) {
++              printk("FEC: Mapping FEC registers failed\n");
++              ret = -ENOMEM;
++              goto unmap1;
++      }
++      DBG(0, "%s: FEC registers @ %08lx mapped to %p\n", __FUNCTION__,
++          (unsigned long)res_mem2->start, fep->mib_base);
+-      if (!ndev->base_addr) {
++      /* Allocate memory for buffer descriptors. */
++      fep->cbd_mem_base = dma_alloc_coherent(&pdev->dev, CBD_BUF_SIZE,
++                                             &fep->cbd_phys_base,
++                                             GFP_KERNEL);
++      if (fep->cbd_mem_base == NULL) {
++              printk("FEC: allocate descriptor memory failed\n");
+               ret = -ENOMEM;
+-              goto failed_ioremap;
++              goto unmap2;
+       }
++      DBG(0, "%s: Allocated %lu [(%u + %lu) * %d] byte for CBD buffer @ %p[%08lx]\n",
++          __FUNCTION__, CBD_BUF_SIZE, TX_RING_SIZE, RX_RING_SIZE,
++          sizeof(cbd_t), fep->cbd_mem_base,
++          (unsigned long)fep->cbd_phys_base);
+-      platform_set_drvdata(pdev, ndev);
++      /* Set receive and transmit descriptor base.
++      */
++      fep->rx_bd_base = fep->cbd_mem_base;
++      fep->tx_bd_base = fep->rx_bd_base + RX_RING_SIZE;
+-      /* This device has up to three irqs on some platforms */
+-      for (i = 0; i < 3; i++) {
+-              irq = platform_get_irq(pdev, i);
+-              if (i && irq < 0)
+-                      break;
+-              ret = request_irq(irq, fec_enet_interrupt, IRQF_DISABLED, pdev->name, ndev);
+-              if (ret) {
+-                      while (i >= 0) {
+-                              irq = platform_get_irq(pdev, i);
+-                              free_irq(irq, ndev);
+-                              i--;
+-                      }
+-                      goto failed_irq;
+-              }
++      printk("FEC ENET Driver\n");
++      ret = platform_func(pdata->arch_init, pdev);
++      if (ret != 0) {
++              dev_err(&pdev->dev, "platform init failed: %d\n", ret);
++              goto free_dma;
+       }
+-      fep->clk = clk_get(&pdev->dev, "fec_clk");
+-      if (IS_ERR(fep->clk)) {
+-              ret = PTR_ERR(fep->clk);
+-              goto failed_clk;
++      ret = fec_enet_init(pdev, dev);
++      if (ret != 0) {
++              goto fec_disable;
+       }
+-      clk_enable(fep->clk);
+-      ret = fec_enet_init(ndev, 0);
+-      if (ret)
+-              goto failed_init;
++      /* Enable most messages by default */
++      fep->msg_enable = (NETIF_MSG_IFUP << 1) - 1;
++      ret = register_netdev(dev);
++      if (ret != 0) {
++              /* XXX: missing cleanup here */
++              goto free_buffers;
++      }
+-      ret = register_netdev(ndev);
+-      if (ret)
+-              goto failed_register;
++      printk(KERN_INFO "%s: ethernet %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
++             dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
++             dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+       return 0;
+-failed_register:
+-failed_init:
+-      clk_disable(fep->clk);
+-      clk_put(fep->clk);
+-failed_clk:
+-      for (i = 0; i < 3; i++) {
+-              irq = platform_get_irq(pdev, i);
+-              if (irq > 0)
+-                      free_irq(irq, ndev);
+-      }
+-failed_irq:
+-      iounmap((void __iomem *)ndev->base_addr);
+-failed_ioremap:
+-      free_netdev(ndev);
++ free_buffers:
++      fec_enet_free_buffers(fep);
++
++ fec_disable:
++      platform_func(pdata->arch_exit, pdev);
++
++ free_dma:
++      dma_free_coherent(&pdev->dev, CBD_BUF_SIZE, fep->cbd_mem_base, fep->cbd_phys_base);
++
++ unmap2:
++      if (fep->mib_base)
++              iounmap(fep->mib_base);
++
++ unmap1:
++      iounmap(fep->reg_base);
++
++ free_netdev:
++      free_netdev(dev);
++
++ release2:
++      if (res_mem2 != NULL) {
++              release_resource(res_mem2);
++      }
++
++ release1:
++      release_resource(res_mem1);
+       return ret;
+ }
+-static int __devexit
+-fec_drv_remove(struct platform_device *pdev)
++static int __devexit fec_enet_remove(struct platform_device *pdev)
+ {
+-      struct net_device *ndev = platform_get_drvdata(pdev);
+-      struct fec_enet_private *fep = netdev_priv(ndev);
++      struct net_device *dev = platform_get_drvdata(pdev);
++      struct fec_enet_private *fep = netdev_priv(dev);
++
++      unregister_netdev(dev);
++      free_netdev(dev);
++
++#ifdef CONFIG_PHYLIB
++      if (fep->mii != NULL) {
++              kfree(fep->mii->irq);
++              mdiobus_unregister(fep->mii);
++      }
++      mdiobus_free(fep->mii);
++#endif
++      fec_release_intrs(dev);
++
++      DBG(0, "%s: Unmapping FEC registers %p\n", __FUNCTION__, fep->reg_base);
++      iounmap(fep->reg_base);
++      if (fep->mib_base)
++              iounmap(fep->mib_base);
++
++      fec_enet_free_buffers(fep);
+-      platform_set_drvdata(pdev, NULL);
++      DBG(0, "%s: Freeing CBD buffer area %p[%08lx]\n", __FUNCTION__,
++          fep->cbd_mem_base, (unsigned long)fep->cbd_phys_base);
++      dma_free_coherent(&pdev->dev, CBD_BUF_SIZE, fep->cbd_mem_base, fep->cbd_phys_base);
+-      fec_stop(ndev);
+-      clk_disable(fep->clk);
+-      clk_put(fep->clk);
+-      iounmap((void __iomem *)ndev->base_addr);
+-      unregister_netdev(ndev);
+-      free_netdev(ndev);
++      release_resource(fep->res_mem1);
++      if (fep->res_mem2 != NULL) {
++              release_resource(fep->res_mem2);
++      }
+       return 0;
+ }
+-static int
+-fec_suspend(struct platform_device *dev, pm_message_t state)
++static void fec_enet_shutdown(struct platform_device *pdev)
+ {
+-      struct net_device *ndev = platform_get_drvdata(dev);
+-      struct fec_enet_private *fep;
++      struct fec_enet_platform_data *pdata = pdev->dev.platform_data;
++
++      DBG(0, "%s: Shutting down FEC Hardware\n", __FUNCTION__);
++      platform_func(pdata->arch_exit, pdev);
++}
++
++#ifdef CONFIG_PM
++static int fec_enet_suspend(struct platform_device *pdev, pm_message_t state)
++{
++      int ret;
++      struct fec_enet_platform_data *pdata = pdev->dev.platform_data;
++      struct net_device *ndev = platform_get_drvdata(pdev);
++      struct fec_enet_private *fep = netdev_priv(ndev);
+-      if (ndev) {
+-              fep = netdev_priv(ndev);
+-              if (netif_running(ndev)) {
+-                      netif_device_detach(ndev);
+-                      fec_stop(ndev);
++      if (netif_running(ndev)) {
++              DBG(0, "%s: Detaching netif\n", __FUNCTION__);
++              netif_device_detach(ndev);
++#ifdef CONFIG_PHYLIB
++              DBG(0, "%s: Disconnecting PHY %p\n", __FUNCTION__, fep->phy);
++              phy_disconnect(fep->phy);
++              fep->phy = NULL;
++#endif
++      }
++#ifndef CONFIG_PHYLIB
++      if (fep->phy_timer) {
++              ret = del_timer_sync(fep->phy_timer);
++              if (ret != 0) {
++                      DBG(0, "%s: Failed to delete PHY timer: %d\n", __FUNCTION__, ret);
++                      return ret;
+               }
+       }
+-      return 0;
++#endif
++      DBG(0, "%s: Shutting down FEC Hardware %d\n", __FUNCTION__,
++          netif_running(ndev));
++      ret = platform_func(pdata->suspend, pdev);
++      if (ret != 0 && netif_running(ndev)) {
++              DBG(0, "%s: Failed to suspend: %d\n", __FUNCTION__, ret);
++              /* Undo suspend */
++#ifdef CONFIG_PHYLIB
++              DBG(0, "%s: Reconnecting PHY\n", __FUNCTION__);
++              if (fec_connect_phy(ndev, fep) != 0) {
++                      DBG(0, "%s: Failed to connect to PHY\n", __FUNCTION__);
++                      return ret;
++              }
++              phy_start(fep->phy);
++#endif
++              fec_link_change(ndev);
++              netif_device_attach(ndev);
++      }
++      return ret;
+ }
+-static int
+-fec_resume(struct platform_device *dev)
++static int fec_enet_resume(struct platform_device *pdev)
+ {
+-      struct net_device *ndev = platform_get_drvdata(dev);
++      int ret;
++      struct fec_enet_platform_data *pdata = pdev->dev.platform_data;
++      struct net_device *ndev = platform_get_drvdata(pdev);
+-      if (ndev) {
+-              if (netif_running(ndev)) {
+-                      fec_enet_init(ndev, 0);
+-                      netif_device_attach(ndev);
++      DBG(0, "%s: Powering up FEC Hardware %d\n", __FUNCTION__,
++          netif_running(ndev));
++      ret = platform_func(pdata->resume, pdev);
++      if (ret != 0) {
++              DBG(0, "%s: Failed to resume: %d\n", __FUNCTION__, ret);
++              return ret;
++      }
++      if (netif_running(ndev)) {
++#ifdef CONFIG_PHYLIB
++              struct fec_enet_private *fep = netdev_priv(ndev);
++
++              DBG(0, "%s: Reconnecting PHY\n", __FUNCTION__);
++              ret = fec_connect_phy(ndev, fep);
++              if (ret != 0) {
++                      DBG(0, "%s: Failed to connect to PHY: %d\n", __FUNCTION__, ret);
++                      return ret;
+               }
++              phy_start(fep->phy);
++#endif
++              fec_link_change(ndev);
++              netif_device_attach(ndev);
+       }
+       return 0;
+ }
++#else
++#define fec_enet_suspend      NULL
++#define fec_enet_resume               NULL
++#endif
+-static struct platform_driver fec_driver = {
+-      .driver = {
+-              .name    = "fec",
+-              .owner   = THIS_MODULE,
++static struct platform_driver fec_enet_driver = {
++      .driver = {
++              .name = DRV_NAME,
+       },
+-      .probe   = fec_probe,
+-      .remove  = __devexit_p(fec_drv_remove),
+-      .suspend = fec_suspend,
+-      .resume  = fec_resume,
++      .probe = fec_enet_probe,
++      .remove = __devexit_p(fec_enet_remove),
++      .shutdown = fec_enet_shutdown,
++      .suspend = fec_enet_suspend,
++      .resume = fec_enet_resume,
+ };
+-static int __init
+-fec_enet_module_init(void)
++static int __init fec_enet_module_init(void)
+ {
+-      printk(KERN_INFO "FEC Ethernet Driver\n");
++      int ret;
++
++      ret = platform_driver_register(&fec_enet_driver);
+-      return platform_driver_register(&fec_driver);
++      return ret;
+ }
++module_init(fec_enet_module_init);
+-static void __exit
+-fec_enet_cleanup(void)
++static void __exit fec_enet_module_cleanup(void)
+ {
+-      platform_driver_unregister(&fec_driver);
++      platform_driver_unregister(&fec_enet_driver);
+ }
+-
+-module_exit(fec_enet_cleanup);
+-module_init(fec_enet_module_init);
++module_exit(fec_enet_module_cleanup);
+ MODULE_LICENSE("GPL");
+diff -urNp linux-2.6.30-rc4/drivers/net/fec.h linux-2.6.30-rc4-karo/drivers/net/fec.h
+--- linux-2.6.30-rc4/drivers/net/fec.h 2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/net/fec.h    2009-06-02 18:43:03.000000000 +0200
+@@ -13,6 +13,15 @@
+ #define       FEC_H
+ /****************************************************************************/
++/*
++ * dummy value to write into RDAR,TDAR. FEC hardware will scan the TX/RX
++ * descriptors in memory upon any write access to those registers.
++ * The actual value written to those registers does not matter.
++*/
++#define DONT_CARE             0
++#define RDAR_BUSY             (1 << 24)
++#define TDAR_BUSY             (1 << 24)
++
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+     defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARCH_MXC)
+ /*
+@@ -20,6 +29,36 @@
+  *    registers in the same peripheral device on different models
+  *    of the ColdFire!
+  */
++// relying on structure alignment for hardware register is just evil
++#ifndef GARBAGE
++#define FEC_EIR                       0x004
++#define FEC_EIMR              0x008
++#define       FEC_RDAR                0x010
++#define       FEC_TDAR                0x014
++#define       FEC_ECR                 0x024
++#define       FEC_MMFR                0x040
++#define       FEC_MSCR                0x044
++#define       FEC_MIBC                0x064
++#define       FEC_RCR                 0x084
++#define       FEC_TCR                 0x0c4
++#define       FEC_PALR                0x0e4
++#define       FEC_PAUR                0x0e8
++#define       FEC_OPD                 0x0ec
++#define       FEC_IAUR                0x118
++#define       FEC_IALR                0x11c
++#define       FEC_GAUR                0x120
++#define       FEC_GALR                0x124
++#define       FEC_TFWR                0x144
++#define       FEC_FRBR                0x14c
++#define       FEC_FRSR                0x150
++#define       FEC_ERDSR               0x180
++#define       FEC_ETDSR               0x184
++#define       FEC_EMRBR               0x188
++
++#define FEC_ECR_RESET         (1 << 0)
++#define FEC_ECR_ETHER_EN      (1 << 1)
++#else
++
+ typedef struct fec {
+       unsigned long   fec_reserved0;
+       unsigned long   fec_ievent;             /* Interrupt event reg */
+@@ -57,6 +96,7 @@ typedef struct fec {
+       unsigned long   fec_x_des_start;        /* Transmit descriptor ring */
+       unsigned long   fec_r_buff_size;        /* Maximum receive buff size */
+ } fec_t;
++#endif
+ #else
+@@ -88,8 +128,8 @@ typedef struct fec {
+       unsigned long   fec_reserved7[158];
+       unsigned long   fec_addr_low;           /* Low 32bits MAC address */
+       unsigned long   fec_addr_high;          /* High 16bits MAC address */
+-      unsigned long   fec_grp_hash_table_high;/* High 32bits hash table */
+-      unsigned long   fec_grp_hash_table_low; /* Low 32bits hash table */
++      unsigned long   fec_hash_table_high;    /* High 32bits hash table */
++      unsigned long   fec_hash_table_low;     /* Low 32bits hash table */
+       unsigned long   fec_r_des_start;        /* Receive descriptor ring */
+       unsigned long   fec_x_des_start;        /* Transmit descriptor ring */
+       unsigned long   fec_r_buff_size;        /* Maximum receive buff size */
+@@ -103,17 +143,20 @@ typedef struct fec {
+ /*
+  *    Define the buffer descriptor structure.
+  */
+-#ifdef CONFIG_ARCH_MXC
++/* Please see "Receive Buffer Descriptor Field Definitions" in Specification.
++ * It's LE.
++ */
++#if defined(CONFIG_ARCH_MXC)
+ typedef struct bufdesc {
+-      unsigned short cbd_datlen;      /* Data length */
+-      unsigned short cbd_sc;  /* Control and status info */
+-      unsigned long cbd_bufaddr;      /* Buffer address */
++      unsigned short  cbd_datlen;             /* Data length */
++      unsigned short  cbd_sc;                 /* Control and status info */
++      dma_addr_t      cbd_bufaddr;            /* Buffer address as seen by FEC Hardware */
+ } cbd_t;
+ #else
+ typedef struct bufdesc {
+       unsigned short  cbd_sc;                 /* Control and status info */
+       unsigned short  cbd_datlen;             /* Data length */
+-      unsigned long   cbd_bufaddr;            /* Buffer address */
++      dma_addr_t      cbd_bufaddr;            /* Buffer address */
+ } cbd_t;
+ #endif
+@@ -121,7 +164,7 @@ typedef struct bufdesc {
+  *    The following definitions courtesy of commproc.h, which where
+  *    Copyright (c) 1997 Dan Malek (dmalek@jlc.net).
+  */
+-#define BD_SC_EMPTY     ((ushort)0x8000)        /* Recieve is empty */
++#define BD_SC_EMPTY     ((ushort)0x8000)        /* Receive is empty */
+ #define BD_SC_READY     ((ushort)0x8000)        /* Transmit is ready */
+ #define BD_SC_WRAP      ((ushort)0x2000)        /* Last buffer descriptor */
+ #define BD_SC_INTRPT    ((ushort)0x1000)        /* Interrupt on change */
+@@ -168,5 +211,22 @@ typedef struct bufdesc {
+ #define BD_ENET_TX_STATS        ((ushort)0x03ff)        /* All status bits */
++#define RCR_LOOP              (1 << 0)
++#define RCR_DRT                       (1 << 1)
++#define RCR_MII_MODE          (1 << 2)
++#define RCR_PROM              (1 << 3)
++#define RCR_BC_REJ            (1 << 4)
++#define RCR_FCE                       (1 << 5)
++#define RCR_MAX_FL_SHIFT      16
++#define RCR_MAX_FL_MASK               (0x7ff << (RCR_MAX_FL_SHIFT))
++#define RCR_MAX_FL_set(n)     (((n) << (RCR_MAX_FL_SHIFT)) & (RCR_MAX_FL_MASK))
++#define RCR_MAX_FL_get(n)     (((n) & (RCR_MAX_FL_MASK)) >> (RCR_MAX_FL_SHIFT))
++
++#define TCR_GTS                       (1 << 0)
++#define TCR_HBC                       (1 << 1)
++#define TCR_FDEN              (1 << 2)
++#define TCR_TFCPAUSE          (1 << 3)
++#define TCR_RFCPAUSE          (1 << 4)
++
+ /****************************************************************************/
+ #endif /* FEC_H */
+diff -urNp linux-2.6.30-rc4/drivers/video/imxfb.c linux-2.6.30-rc4-karo/drivers/video/imxfb.c
+--- linux-2.6.30-rc4/drivers/video/imxfb.c     2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/drivers/video/imxfb.c        2009-06-02 18:58:52.000000000 +0200
+@@ -570,7 +570,7 @@ static int imxfb_resume(struct platform_
+ #define imxfb_resume  NULL
+ #endif
+-static int __init imxfb_init_fbinfo(struct platform_device *pdev)
++static int __devinit imxfb_init_fbinfo(struct platform_device *pdev)
+ {
+       struct imx_fb_platform_data *pdata = pdev->dev.platform_data;
+       struct fb_info *info = dev_get_drvdata(&pdev->dev);
+@@ -636,7 +636,7 @@ static int __init imxfb_init_fbinfo(stru
+       return 0;
+ }
+-static int __init imxfb_probe(struct platform_device *pdev)
++static int __devinit imxfb_probe(struct platform_device *pdev)
+ {
+       struct imxfb_info *fbi;
+       struct fb_info *info;
+@@ -754,7 +754,7 @@ failed_map:
+ failed_getclock:
+       iounmap(fbi->regs);
+ failed_ioremap:
+-      release_mem_region(res->start, res->end - res->start);
++      release_mem_region(res->start, resource_size(res));
+ failed_req:
+       kfree(info->pseudo_palette);
+ failed_init:
+@@ -763,7 +763,7 @@ failed_init:
+       return ret;
+ }
+-static int __devexit imxfb_remove(struct platform_device *pdev)
++static int imxfb_remove(struct platform_device *pdev)
+ {
+       struct imx_fb_platform_data *pdata;
+       struct fb_info *info = platform_get_drvdata(pdev);
+@@ -785,7 +785,7 @@ static int __devexit imxfb_remove(struct
+       framebuffer_release(info);
+       iounmap(fbi->regs);
+-      release_mem_region(res->start, res->end - res->start + 1);
++      release_mem_region(res->start, resource_size(res));
+       clk_disable(fbi->clk);
+       clk_put(fbi->clk);
+@@ -794,7 +794,7 @@ static int __devexit imxfb_remove(struct
+       return 0;
+ }
+-void  imxfb_shutdown(struct platform_device * dev)
++void imxfb_shutdown(struct platform_device *dev)
+ {
+       struct fb_info *info = platform_get_drvdata(dev);
+       struct imxfb_info *fbi = info->par;
+@@ -804,7 +804,8 @@ void  imxfb_shutdown(struct platform_dev
+ static struct platform_driver imxfb_driver = {
+       .suspend        = imxfb_suspend,
+       .resume         = imxfb_resume,
+-      .remove         = __devexit_p(imxfb_remove),
++//    .remove         = __devexit_p(imxfb_remove),
++      .remove         = imxfb_remove,
+       .shutdown       = imxfb_shutdown,
+       .driver         = {
+               .name   = DRIVER_NAME,
+diff -urNp linux-2.6.30-rc4/include/linux/fec_enet.h linux-2.6.30-rc4-karo/include/linux/fec_enet.h
+--- linux-2.6.30-rc4/include/linux/fec_enet.h  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.30-rc4-karo/include/linux/fec_enet.h     2009-03-16 12:49:03.000000000 +0100
+@@ -0,0 +1,26 @@
++/*
++ * Copyright (C) 2007  Lothar Wassmann <LW@KARO-electronics.de>
++ *
++ * platform_data definitions for fec_enet device
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the:
++ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
++ */
++
++struct fec_enet_platform_data {
++      /* callback for platform specific initialization */
++      int (*arch_init)(struct platform_device *dev);
++      void (*arch_exit)(struct platform_device *dev);
++      int (*suspend)(struct platform_device *dev);
++      int (*resume)(struct platform_device *dev);
++};
+diff -urNp linux-2.6.30-rc4/kernel/printk.c linux-2.6.30-rc4-karo/kernel/printk.c
+--- linux-2.6.30-rc4/kernel/printk.c   2009-05-13 09:46:19.000000000 +0200
++++ linux-2.6.30-rc4-karo/kernel/printk.c      2009-06-02 19:21:25.000000000 +0200
+@@ -637,9 +637,12 @@ static int acquire_console_semaphore_for
+ static const char recursion_bug_msg [] =
+               KERN_CRIT "BUG: recent printk recursion!\n";
+ static int recursion_bug;
+-static int new_text_line = 1;
++      static int new_text_line = 1;
+ static char printk_buf[1024];
++#ifdef CONFIG_DEBUG_LL
++extern void asmlinkage printascii(const char *);
++#endif
+ asmlinkage int vprintk(const char *fmt, va_list args)
+ {
+       int printed_len = 0;
+@@ -687,6 +690,9 @@ asmlinkage int vprintk(const char *fmt, 
+                                 sizeof(printk_buf) - printed_len, fmt, args);
++#ifdef CONFIG_DEBUG_LL
++      printascii(printk_buf);
++#endif
+       /*
+        * Copy the output into log_buf.  If the caller didn't provide
+        * appropriate log level tags, we insert them here
diff --git a/recipes/linux/linux_2.6.30-rc4.bb b/recipes/linux/linux_2.6.30-rc4.bb
new file mode 100644 (file)
index 0000000..05af05c
--- /dev/null
@@ -0,0 +1,15 @@
+require linux.inc
+
+PR = "r0"
+
+S = "${WORKDIR}/linux-${PV}"
+
+# Mark archs/machines that this kernel supports
+DEFAULT_PREFERENCE = "-1"
+DEFAULT_PREFERENCE_tx25 = "1"
+
+SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/testing/linux-${PV}.tar.bz2 \
+           file://defconfig"
+
+SRC_URI_append_tx25 = " linux-2.6.30-rc4-git.patch;patch=1 \
+       file://linux-2.6.30-rc4-karo.diff;patch=1"