diff options
author | Florian Boor <florian.boor@kernelconcepts.de> | 2009-07-01 02:01:33 +0200 |
---|---|---|
committer | Florian Boor <florian.boor@kernelconcepts.de> | 2009-07-01 02:03:25 +0200 |
commit | 0eccce7f44d593607b18fde848e4f65db9e428d0 (patch) | |
tree | 5bfd454a974181805cb90a51f7796cc598f5cb5b /recipes | |
parent | 599bfe6146ea5a403c14e6b8a2c60be69daac3f9 (diff) |
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/defconfig | 1211 | ||||
-rw-r--r-- | recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-git.patch | 55110 | ||||
-rw-r--r-- | recipes/linux/linux-2.6.30-rc4/tx25/linux-2.6.30-rc4-karo.diff | 15337 | ||||
-rw-r--r-- | recipes/linux/linux_2.6.30-rc4.bb | 15 |
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, ®_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, ®_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" |