summaryrefslogtreecommitdiffstats
path: root/recipes
diff options
context:
space:
mode:
authorFlorian Boor <florian.boor@kernelconcepts.de>2009-07-01 02:01:33 +0200
committerFlorian Boor <florian.boor@kernelconcepts.de>2009-07-01 02:03:25 +0200
commit0eccce7f44d593607b18fde848e4f65db9e428d0 (patch)
tree5bfd454a974181805cb90a51f7796cc598f5cb5b /recipes
parent599bfe6146ea5a403c14e6b8a2c60be69daac3f9 (diff)
downloadopenembedded-0eccce7f44d593607b18fde848e4f65db9e428d0.tar.gz
linux: Add 2.6.30-rc4 and necessary patches for tx25
Diffstat (limited to 'recipes')
-rw-r--r--recipes/linux/linux-2.6.30-rc4/tx25/defconfig1211
-rw-r--r--recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch55110
-rw-r--r--recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff15337
-rw-r--r--recipes/linux/linux_2.6.30-rc4.bb15
4 files changed, 71673 insertions, 0 deletions
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
index 0000000000..290f8df24c
--- /dev/null
+++ b/recipes/linux/linux-2.6.30-rc4/tx25/defconfig
@@ -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
index 0000000000..b030555df6
--- /dev/null
+++ b/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch
@@ -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
+-
+-
+-
+-#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 */
+-
+-
+-/*-----------------------------------------------.
+-| 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;
+- }
+-}
+-
+-
+-/* 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
++
++
++
++#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 */
++
++
++/*-----------------------------------------------.
++| 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;
++ }
++}
++
++
++/* 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
index 0000000000..17765b46f6
--- /dev/null
+++ b/recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff
@@ -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
index 0000000000..05af05c72d
--- /dev/null
+++ b/recipes/linux/linux_2.6.30-rc4.bb
@@ -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"