[kernel] remove 2.6.24, no target is relying on it
authorFlorian Fainelli <florian@openwrt.org>
Fri, 24 Apr 2009 14:35:19 +0000 (14:35 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Fri, 24 Apr 2009 14:35:19 +0000 (14:35 +0000)
SVN-Revision: 15388

58 files changed:
include/kernel-version.mk
target/linux/generic-2.6/config-2.6.24 [deleted file]
target/linux/generic-2.6/patches-2.6.24/001-squashfs.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/002-lzma_decompress.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/003-squashfs_lzma.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/004-extra_optimization.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/005-squashfs_fix.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/006-gcc4_inline_fix.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/007-samsung_flash.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/009-revert_intel_flash_breakage.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/010-disable_old_squashfs_compatibility.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/011-mips_boot.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/012-mips_cpu_tlb.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/013-mips_gdb_stub.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/060-block2mtd_init.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/065-rootfs_split.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/070-redboot_space.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/080-mtd_plat_nand_chip_fixup.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/100-netfilter_layer7_2.17.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/101-netfilter_layer7_pktmatch.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/130-netfilter_ipset.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/140-netfilter_time.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/150-netfilter_imq.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/180-netfilter_depends.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/190-netfilter_rtsp.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/200-sched_esfq.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/202-mips-freestanding.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/204-jffs2_eofdetect.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/207-powerpc_asm_segment_h.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/208-rtl8110sb_fix.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/209-mini_fo.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/213-kobject_uevent.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/220-sound_kconfig.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/400-ledtrig_morse.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/401-led_alix.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/402-ledtrig_default_on.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/403-ds1672_detect.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/410-gpio_buttons.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/510-yaffs_support.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/600-phy_extension.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/601-br2684-routed-support.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/801-usb_serial_endpoint_size.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/840-unable_to_open_console.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/850-jffs2_erase_progress_indicator.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/900-headers_type_and_time.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/902-darwin_scripts_include.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/903-stddef_include.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/904-ls_time_locale.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/905-i386_build.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/921-gpio_spi_driver.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/922-w1_gpio_driver_backport.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/930-ppc_big_endian_io_memory_accessors.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/940-arm_mach_types.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/950-mtd_cfi_intel_p33_compatbility.patch [deleted file]
target/linux/generic-2.6/patches-2.6.24/975-crypto_kconfig_hacks.patch [deleted file]

index 07c318d942ddc0625e2970b2f8a3cdea11c2f414..0f9621ed8a3bf72c85b07e0a60528bd546a0148c 100644 (file)
@@ -19,9 +19,6 @@ endif
 ifeq ($(LINUX_VERSION),2.6.23.17)
   LINUX_KERNEL_MD5SUM:=a0300a393ac91ce9c64bf31522b45e2e
 endif
-ifeq ($(LINUX_VERSION),2.6.24.7)
-  LINUX_KERNEL_MD5SUM:=40a73780d51525d28d36dec852c680c4
-endif
 ifeq ($(LINUX_VERSION),2.6.25.20)
   LINUX_KERNEL_MD5SUM:=0da698edccf03e2235abc2830a495114
 endif
diff --git a/target/linux/generic-2.6/config-2.6.24 b/target/linux/generic-2.6/config-2.6.24
deleted file mode 100644 (file)
index 13d07a5..0000000
+++ /dev/null
@@ -1,1817 +0,0 @@
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_9P_FS is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AIRO is not set
-# CONFIG_AIRO_CS is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMIGA_PARTITION is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APPLICOM is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCNET is not set
-CONFIG_ARPD=y
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_ATA is not set
-# CONFIG_ATALK is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATL1 is not set
-# CONFIG_ATM is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATM_AMBASSADOR is not set
-# CONFIG_ATM_BR2684 is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E_MAYBE is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX88796 is not set
-# CONFIG_B44 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-CONFIG_BASE_FULL=y
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-# CONFIG_BCM43XX is not set
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-CONFIG_BCM43XX_PIO=y
-# CONFIG_BCM43XX_PIO_MODE is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_BLINK is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_CPQ_DA is not set
-CONFIG_BLK_DEV=y
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HD is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_IDE_SWARM is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-CONFIG_BLOCK=y
-# CONFIG_BNX2 is not set
-# CONFIG_BONDING is not set
-# CONFIG_BPQETHER is not set
-CONFIG_BRIDGE=y
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_ULOG is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_BSD_DISKLABEL=y
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_BT is not set
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUART is not set
-# CONFIG_BT_HCIDTL1 is not set
-# CONFIG_BT_HCIUART is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUSB is not set
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT_L2CAP is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BT_SCO is not set
-CONFIG_BUG=y
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CASSINI is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-CONFIG_CIFS_POSIX=y
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_STATS2 is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-CONFIG_CLS_U32_MARK=y
-CONFIG_CLS_U32_PERF=y
-CONFIG_CMDLINE=""
-# CONFIG_CODA_FS is not set
-CONFIG_CONFIGFS_FS=y
-# CONFIG_CONNECTOR is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CROSSCOMPILE=y
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_AEAD is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_ALGAPI is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLKCIPHER 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_CBC is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_MANAGER is not set
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_PCBC is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-# CONFIG_DAB is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DECNET is not set
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_BIC is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_CUBIC is not set
-CONFIG_DEFAULT_DEADLINE=y
-# CONFIG_DEFAULT_HTCP is not set
-CONFIG_DEFAULT_IOSCHED="deadline"
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="vegas"
-CONFIG_DEFAULT_VEGAS=y
-# CONFIG_DEFAULT_WESTWOOD is not set
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DGRS is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DRM is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-# CONFIG_DVB is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_E100 is not set
-# CONFIG_E1000 is not set
-# CONFIG_ECONET is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_ELF_CORE is not set
-CONFIG_EMBEDDED=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-CONFIG_EVENTFD=y
-CONFIG_EXPERIMENTAL=y
-# CONFIG_EXPORTFS is not set
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4DEV_FS is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_FS is not set
-# CONFIG_FB is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-CONFIG_FIB_RULES=y
-# CONFIG_FIREWIRE is not set
-CONFIG_FLATMEM=y
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FORCEDETH is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FTL is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FW_LOADER=y
-CONFIG_GACT_PROB=y
-# CONFIG_GAMEPORT is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GFS2_FS is not set
-# CONFIG_GPIO_DEVICE is not set
-# CONFIG_HAMACHI is not set
-CONFIG_HAMRADIO=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HID is not set
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HID_FF is not set
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_HIDRAW is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HIPPI is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_CS is not set
-CONFIG_HOSTAP_FIRMWARE=y
-CONFIG_HOSTAP_FIRMWARE_NVRAM=y
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-CONFIG_HOTPLUG=y
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-# CONFIG_HP100 is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-CONFIG_HZ=100
-CONFIG_HZ_100=y
-# CONFIG_HZ_1000 is not set
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_CHARDEV 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_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIBYTE is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2O is not set
-# CONFIG_I82092 is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-CONFIG_IDE_MAX_HWIFS=4
-CONFIG_IDE_PROC_FS=y
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_IEEE1394_DV1394 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394_OHCI1394 is not set
-# CONFIG_IEEE1394_PCILYNX is not set
-# CONFIG_IEEE1394_RAWIO is not set
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_CRYPT_WEP is not set
-# CONFIG_IEEE80211_DEBUG is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-# CONFIG_IFB is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IMQ is not set
-# CONFIG_IMQ_BEHAVIOR_AA is not set
-# CONFIG_IMQ_BEHAVIOR_AB is not set
-CONFIG_IMQ_BEHAVIOR_BA=y
-# CONFIG_IMQ_BEHAVIOR_BB is not set
-CONFIG_IMQ_NUM_DEVS=2
-CONFIG_INET=y
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INOTIFY is not set
-# CONFIG_INOTIFY_USER is not set
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_MISC is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INSTRUMENTATION is not set
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_LIMIT is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_OWNER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_IMQ is not set
-# CONFIG_IP6_NF_TARGET_LOG is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_ROUTE is not set
-# CONFIG_IPC_NS is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_IPSEC_NAT_TRAVERSAL=y
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_IPV6_ROUTER_PREF=y
-# CONFIG_IPV6_ROUTE_INFO is not set
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IPW2100 is not set
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200 is not set
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPX is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IP_DCCP is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-# CONFIG_IP_MROUTE is not set
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-CONFIG_IP_NF_CONNTRACK=y
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
-# CONFIG_IP_NF_MATCH_IPP2P is not set
-# CONFIG_IP_NF_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
-# CONFIG_IP_NF_MATCH_SET is not set
-# CONFIG_IP_NF_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-CONFIG_IP_NF_NAT=y
-# CONFIG_IP_NF_NAT_AMANDA is not set
-# CONFIG_IP_NF_NAT_FTP is not set
-# CONFIG_IP_NF_NAT_H323 is not set
-# CONFIG_IP_NF_NAT_IRC is not set
-CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_NAT_PPTP is not set
-# CONFIG_IP_NF_NAT_SIP is not set
-# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
-# CONFIG_IP_NF_NAT_TFTP is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_RAW is not set
-# CONFIG_IP_NF_SET is not set
-CONFIG_IP_NF_SET_HASHSIZE=1024
-# CONFIG_IP_NF_SET_IPHASH is not set
-# CONFIG_IP_NF_SET_IPMAP is not set
-# CONFIG_IP_NF_SET_IPPORTHASH is not set
-# CONFIG_IP_NF_SET_IPTREE is not set
-# CONFIG_IP_NF_SET_IPTREEMAP is not set
-# CONFIG_IP_NF_SET_MACIPMAP is not set
-CONFIG_IP_NF_SET_MAX=256
-# CONFIG_IP_NF_SET_NETHASH is not set
-# CONFIG_IP_NF_SET_PORTMAP is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_IMQ is not set
-# CONFIG_IP_NF_TARGET_LOG is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_ROUTE is not set
-# CONFIG_IP_NF_TARGET_SAME is not set
-# CONFIG_IP_NF_TARGET_SET is not set
-# CONFIG_IP_NF_TARGET_TOS is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_NF_TARGET_ULOG is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
-# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IRDA is not set
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_ISDN is not set
-# CONFIG_ISDN_CAPI is not set
-# CONFIG_ISDN_CAPI_CAPI20 is not set
-# CONFIG_ISDN_CAPI_CAPIFS is not set
-CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
-CONFIG_ISDN_CAPI_MIDDLEWARE=y
-# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set
-# CONFIG_ISDN_I4L is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_IXGB is not set
-# CONFIG_JBD is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_JOLIET=y
-# CONFIG_KALLSYMS is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KEXEC is not set
-# CONFIG_KEYS is not set
-# CONFIG_KMOD is not set
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-# CONFIG_LBD is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_LEDS_ALIX is not set
-CONFIG_LEDS_CLASS=y
-# CONFIG_LEDS_GPIO is not set
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-# CONFIG_LEDS_TRIGGER_MORSE is not set
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_USB is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-# CONFIG_LOCKD is not set
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_LOCKD_V4=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_LSF is not set
-# CONFIG_LXT_PHY is not set
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC80211_DEBUG is not set
-# CONFIG_MAC80211_LEDS is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-CONFIG_MAC_PARTITION=y
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MD is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MFD_SM501 is not set
-CONFIG_MII=y
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-CONFIG_MINI_FO=y
-CONFIG_MISC_DEVICES=y
-# CONFIG_MKISS is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC_ARMMMCI is not set
-CONFIG_MMU=y
-CONFIG_MODULES=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-CONFIG_MTD_ROOTFS_SPLIT=y
-# CONFIG_MTD_UBI is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NCP_FS is not set
-CONFIG_NET=y
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETDEBUG is not set
-CONFIG_NETDEVICES=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NETROM is not set
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_PEDIT is not set
-CONFIG_NET_ACT_POLICE=y
-# CONFIG_NET_ACT_SIMP is not set
-CONFIG_NET_CLS=y
-CONFIG_NET_CLS_ACT=y
-# CONFIG_NET_CLS_BASIC is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-CONFIG_NET_CLS_POLICE=y
-CONFIG_NET_CLS_ROUTE=y
-# CONFIG_NET_CLS_ROUTE4 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_EMATCH=y
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_ETHERNET=y
-# CONFIG_NET_FC is not set
-# CONFIG_NET_IPGRE is not set
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_NET_PCI=y
-# CONFIG_NET_PCMCIA is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-CONFIG_NET_RADIO=y
-# CONFIG_NET_SB1000 is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_DSMARK is not set
-# CONFIG_NET_SCH_ESFQ is not set
-CONFIG_NET_SCH_ESFQ_NFCT=y
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_RR is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_TULIP is not set
-CONFIG_NET_WIRELESS=y
-CONFIG_NET_WIRELESS_RTNETLINK=y
-# CONFIG_NEW_GPIO is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NFSD is not set
-CONFIG_NFSD_TCP=y
-# CONFIG_NFSD_V2_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFS_FS is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-# CONFIG_NFTL is not set
-# CONFIG_NF_CONNTRACK is not set
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-CONFIG_NF_CONNTRACK_ENABLED=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IPV4 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-CONFIG_NF_CONNTRACK_MARK=y
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_NF_CONNTRACK_RTSP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-CONFIG_NF_CONNTRACK_SUPPORT=y
-# CONFIG_NF_CONNTRACK_TFTP is not set
-CONFIG_NF_CT_ACCT=y
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_NAT is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-CONFIG_NF_NAT_NEEDED=y
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_RTSP is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NLS is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# 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_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_ISO8859_1 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_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_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OSF_PARTITION is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OF_PLATFORM is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCI is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_LEGACY is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_IOCTL is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONE is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PID_NS is not set
-CONFIG_PLIST=y
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PM is not set
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_PPP is not set
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_PRINTK=y
-# CONFIG_PRINTK_TIME is not set
-# CONFIG_PRISM54 is not set
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROFILING is not set
-# CONFIG_QEMU is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QUOTA is not set
-# CONFIG_R3964 is not set
-# CONFIG_R8169 is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID_ATTRS is not set
-CONFIG_RAMFS=y
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_RFKILL is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_RTC_CLASS is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTL8187 is not set
-CONFIG_RT_MUTEXES=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SC92031 is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESP_CORE is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_LOGGING is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-# CONFIG_SCSI_LPFC is not set
-CONFIG_SCSI_MULTI_LUN=y
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_PAS16 is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SEAGATE is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SECCOMP is not set
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ABITUGURU3 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_ADT7470 is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 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_M41T00 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF 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_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIO is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SHAPER is not set
-CONFIG_SHMEM=y
-CONFIG_SIGNALFD=y
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-CONFIG_SLAB=y
-# CONFIG_SLHC is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-# CONFIG_SLUB is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_SND is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPI is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_TLE62X0 is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-CONFIG_SQUASHFS=y
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB_DRIVER_MIPS is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_STANDALONE=y
-# CONFIG_STRIP is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUNRPC is not set
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUN_PARTITION is not set
-CONFIG_SUSPEND_UP_POSSIBLE=y
-CONFIG_SWAP=y
-# CONFIG_SYNCLINK_CS is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_SYSCTL=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSFS=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSV68_PARTITION is not set
-CONFIG_SYSVIPC=y
-# CONFIG_SYSV_FS is not set
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_TCG_TPM is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CUBIC is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-CONFIG_TCP_CONG_VEGAS=y
-# CONFIG_TCP_CONG_VENO is not set
-# CONFIG_TCP_CONG_WESTWOOD is not set
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-CONFIG_TIMERFD=y
-# CONFIG_TINY_SHMEM is not set
-# CONFIG_TIPC is not set
-# CONFIG_TLAN is not set
-# CONFIG_TMD_HERMES is not set
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-# CONFIG_TR is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_TUN is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_TUNER_TEA5761 is not set
-# CONFIG_UDF_FS is not set
-CONFIG_UDF_NLS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UIO is not set
-# CONFIG_ULTRIX_PARTITION is not set
-CONFIG_UNIX=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_USB is not set
-# CONFIG_USBPCWATCHDOG is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_APPLETOUCH is not set
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_ATM is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_DABUSB is not set
-# CONFIG_USB_DEBUG is not set
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DEVICE_CLASS is not set
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_EZUSB=y
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_HID is not set
-# CONFIG_USB_HIDDEV is not set
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LIBUSUAL is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STORAGE is not set
-CONFIG_USB_STORAGE_ALAUDA=y
-CONFIG_USB_STORAGE_DATAFAB=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_FREECOM=y
-# CONFIG_USB_STORAGE_ISD200 is not set
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_KARMA=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_USBAT=y
-# CONFIG_USB_STV680 is not set
-CONFIG_USB_SUPPORT=y
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_VETH is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA7111 is not set
-# CONFIG_VIDEO_SAA7114 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SAA7191 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_TCM825X is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TDA9875 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_VIDEO_V4L1 is not set
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VITESSE_PHY is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VT is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2760 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83697HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WAN_ROUTER is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-# CONFIG_WDTPCI is not set
-CONFIG_WIRELESS_EXT=y
-CONFIG_WLAN_80211=y
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WR_PPMC is not set
-# CONFIG_X25 is not set
-CONFIG_XFRM=y
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_YAFFS_FS is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-CONFIG_ZISOFS=y
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZONE_DMA=y
-CONFIG_ZONE_DMA_FLAG=1
diff --git a/target/linux/generic-2.6/patches-2.6.24/001-squashfs.patch b/target/linux/generic-2.6/patches-2.6.24/001-squashfs.patch
deleted file mode 100644 (file)
index 1db4091..0000000
+++ /dev/null
@@ -1,4170 +0,0 @@
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -1405,6 +1405,71 @@ config CRAMFS
-         If unsure, say N.
-+config SQUASHFS
-+      tristate "SquashFS 3.0 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+        System).  Squashfs is a highly compressed read-only filesystem for Linux.
-+        It uses zlib compression to compress both files, inodes and directories.
-+        Inodes in the system are very small and all blocks are packed to minimise
-+        data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+        SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+        uid/gid information, hard links and timestamps.
-+
-+        Squashfs is intended for general read-only filesystem use, for archival
-+        use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+        systems where low overhead is needed.  Further information and filesystem tools
-+        are available from http://squashfs.sourceforge.net.
-+
-+        If you want to compile this as a module ( = code which can be
-+        inserted in and removed from the running kernel whenever you want),
-+        say M here and read <file:Documentation/modules.txt>.  The module
-+        will be called squashfs.  Note that the root file system (the one
-+        containing the directory /) cannot be compiled as a module.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+      bool "Additional options for memory-constrained systems"
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache sizes and how Squashfs
-+        allocates memory.  This is only intended for memory constrained
-+        systems.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+      int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default "3"
-+      help
-+        By default SquashFS caches the last 3 fragments read from
-+        the filesystem.  Increasing this amount may mean SquashFS
-+        has to re-read fragments less often from disk, at the expense
-+        of extra system memory.  Decreasing this amount will mean
-+        SquashFS uses less memory at the expense of extra reads from disk.
-+
-+        Note there must be at least one cached fragment.  Anything
-+        much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+      bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default n
-+      help
-+        By default SquashFS uses kmalloc to obtain fragment cache memory.
-+        Kmalloc memory is the standard kernel allocator, but it can fail
-+        on memory constrained systems.  Because of the way Vmalloc works,
-+        Vmalloc can succeed when kmalloc fails.  Specifying this option
-+        will make SquashFS always use Vmalloc to allocate the
-+        fragment cache memory.
-+
-+        If unsure, say N.
-+
- config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       depends on BLOCK
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -72,6 +72,7 @@ obj-$(CONFIG_JBD)            += jbd/
- obj-$(CONFIG_JBD2)            += jbd2/
- obj-$(CONFIG_EXT2_FS)         += ext2/
- obj-$(CONFIG_CRAMFS)          += cramfs/
-+obj-$(CONFIG_SQUASHFS)                += squashfs/
- obj-y                         += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
---- /dev/null
-+++ b/fs/squashfs/inode.c
-@@ -0,0 +1,2122 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_get_sb(struct file_system_type *, int,
-+                      const char *, void *, struct vfsmount *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+      .owner = THIS_MODULE,
-+      .name = "squashfs",
-+      .get_sb = squashfs_get_sb,
-+      .kill_sb = kill_block_super,
-+      .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+      .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+      .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+                              int *cur_index, int *offset, int *c_byte)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
-+      struct buffer_head *bh;
-+
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
-+
-+      if (msblk->devblksize - *offset == 1) {
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              else
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              brelse(bh);
-+              if (!(bh = sb_bread(s, ++(*cur_index))))
-+                      goto out;
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              bh->b_data);
-+              else
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              bh->b_data);
-+              *c_byte = temp;
-+              *offset = 1;
-+      } else {
-+              if (msblk->swap) {
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1));
-+              } else {
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1));
-+              }
-+              *c_byte = temp;
-+              *offset += 2;
-+      }
-+
-+      if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+              if (*offset == msblk->devblksize) {
-+                      brelse(bh);
-+                      if (!(bh = sb_bread(s, ++(*cur_index))))
-+                              goto out;
-+                      *offset = 0;
-+              }
-+              if (*((unsigned char *) (bh->b_data + *offset)) !=
-+                                              SQUASHFS_MARKER_BYTE) {
-+                      ERROR("Metadata block marker corrupt @ %x\n",
-+                                              *cur_index);
-+                      brelse(bh);
-+                      goto out;
-+              }
-+              (*offset)++;
-+      }
-+      return bh;
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                      long long index, unsigned int length,
-+                      long long *next_index)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+                      msblk->devblksize_log2) + 2];
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k;
-+      char *c_buffer;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
-+
-+      if (c_byte) {
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              if (!(bh[0] = sb_getblk(s, cur_index)))
-+                      goto block_release;
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b, bh);
-+      } else {
-+              if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+                                                              &c_byte)))
-+                      goto read_failure;
-+
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b - 1, bh + 1);
-+      }
-+
-+      if (compressed)
-+              down(&msblk->read_data_mutex);
-+
-+      for (bytes = 0, k = 0; k < b; k++) {
-+              avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+                                      msblk->devblksize - offset :
-+                                      c_byte - bytes;
-+              wait_on_buffer(bh[k]);
-+              if (!buffer_uptodate(bh[k]))
-+                      goto block_release;
-+              memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+              bytes += avail_bytes;
-+              offset = 0;
-+              brelse(bh[k]);
-+      }
-+
-+      /*
-+       * uncompress block
-+       */
-+      if (compressed) {
-+              int zlib_err;
-+
-+              stream.next_in = c_buffer;
-+              stream.avail_in = c_byte;
-+              stream.next_out = buffer;
-+              stream.avail_out = msblk->read_size;
-+
-+              if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+                              ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+                               != Z_STREAM_END) || ((zlib_err =
-+                              zlib_inflateEnd(&stream)) != Z_OK)) {
-+                      ERROR("zlib_fs returned unexpected result 0x%x\n",
-+                              zlib_err);
-+                      bytes = 0;
-+              } else
-+                      bytes = stream.total_out;
-+
-+              up(&msblk->read_data_mutex);
-+      }
-+
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+                               ? 3 : 2));
-+      return bytes;
-+
-+block_release:
-+      while (--b >= 0)
-+              brelse(bh[b]);
-+
-+read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      int n, i, bytes, return_length = length;
-+      long long next_index;
-+
-+      TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+      while ( 1 ) {
-+              for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                      if (msblk->block_cache[i].block == block)
-+                              break;
-+
-+              down(&msblk->block_cache_mutex);
-+
-+              if (i == SQUASHFS_CACHED_BLKS) {
-+                      /* read inode header block */
-+                      for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+                                      n ; n --, i = (i + 1) %
-+                                      SQUASHFS_CACHED_BLKS)
-+                              if (msblk->block_cache[i].block !=
-+                                                      SQUASHFS_USED_BLK)
-+                                      break;
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->waitq, &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->block_cache_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->waitq, &wait);
-+                              continue;
-+                      }
-+                      msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+                      if (msblk->block_cache[i].block ==
-+                                                      SQUASHFS_INVALID_BLK) {
-+                              if (!(msblk->block_cache[i].data =
-+                                              kmalloc(SQUASHFS_METADATA_SIZE,
-+                                              GFP_KERNEL))) {
-+                                      ERROR("Failed to allocate cache"
-+                                                      "block\n");
-+                                      up(&msblk->block_cache_mutex);
-+                                      goto out;
-+                              }
-+                      }
-+
-+                      msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+                      up(&msblk->block_cache_mutex);
-+
-+                      if (!(msblk->block_cache[i].length =
-+                                              squashfs_read_data(s,
-+                                              msblk->block_cache[i].data,
-+                                              block, 0, &next_index))) {
-+                              ERROR("Unable to read cache block [%llx:%x]\n",
-+                                              block, offset);
-+                              goto out;
-+                      }
-+
-+                      down(&msblk->block_cache_mutex);
-+                      wake_up(&msblk->waitq);
-+                      msblk->block_cache[i].block = block;
-+                      msblk->block_cache[i].next_index = next_index;
-+                      TRACE("Read cache block [%llx:%x]\n", block, offset);
-+              }
-+
-+              if (msblk->block_cache[i].block != block) {
-+                      up(&msblk->block_cache_mutex);
-+                      continue;
-+              }
-+
-+              if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+                      if (buffer)
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, length);
-+                      if (msblk->block_cache[i].length - offset == length) {
-+                              *next_block = msblk->block_cache[i].next_index;
-+                              *next_offset = 0;
-+                      } else {
-+                              *next_block = block;
-+                              *next_offset = offset + length;
-+                      }
-+                      up(&msblk->block_cache_mutex);
-+                      goto finish;
-+              } else {
-+                      if (buffer) {
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, bytes);
-+                              buffer += bytes;
-+                      }
-+                      block = msblk->block_cache[i].next_index;
-+                      up(&msblk->block_cache_mutex);
-+                      length -= bytes;
-+                      offset = 0;
-+              }
-+      }
-+
-+finish:
-+      return return_length;
-+out:
-+      return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+      struct squashfs_fragment_entry fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment)
-+{
-+      down(&msblk->fragment_mutex);
-+      fragment->locked --;
-+      wake_up(&msblk->fragment_wait_queue);
-+      up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length)
-+{
-+      int i, n;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+      while ( 1 ) {
-+              down(&msblk->fragment_mutex);
-+
-+              for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+                              msblk->fragment[i].block != start_block; i++);
-+
-+              if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+                      for (i = msblk->next_fragment, n =
-+                              SQUASHFS_CACHED_FRAGMENTS; n &&
-+                              msblk->fragment[i].locked; n--, i = (i + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS);
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->fragment_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              continue;
-+                      }
-+                      msblk->next_fragment = (msblk->next_fragment + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS;
-+
-+                      if (msblk->fragment[i].data == NULL)
-+                              if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+                                              (SQUASHFS_FILE_MAX_SIZE))) {
-+                                      ERROR("Failed to allocate fragment "
-+                                                      "cache block\n");
-+                                      up(&msblk->fragment_mutex);
-+                                      goto out;
-+                              }
-+
-+                      msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+                      msblk->fragment[i].locked = 1;
-+                      up(&msblk->fragment_mutex);
-+
-+                      if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+                                              msblk->fragment[i].data,
-+                                              start_block, length, NULL))) {
-+                              ERROR("Unable to read fragment cache block "
-+                                                      "[%llx]\n", start_block);
-+                              msblk->fragment[i].locked = 0;
-+                              goto out;
-+                      }
-+
-+                      msblk->fragment[i].block = start_block;
-+                      TRACE("New fragment %d, start block %lld, locked %d\n",
-+                                              i, msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+                      break;
-+              }
-+
-+              msblk->fragment[i].locked++;
-+              up(&msblk->fragment_mutex);
-+              TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+                                              msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+              break;
-+      }
-+
-+      return &msblk->fragment[i];
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header *inodeb)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = inodeb->inode_number;
-+              i->i_mtime.tv_sec = inodeb->mtime;
-+              i->i_atime.tv_sec = inodeb->mtime;
-+              i->i_ctime.tv_sec = inodeb->mtime;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header id, sid;
-+      struct squashfs_base_inode_header *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_reg_inode_header *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = 1;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_LREG_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+                      struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header *sinodep =
-+                                                              &sid.symlink;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+                      struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      /* Allocate fragment index table */
-+      if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              long long fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+                                              &msblk->fragment_index[i], 1);
-+                      msblk->fragment_index[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget;
-+      msblk->read_blocklist = read_blocklist;
-+      msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+      if (sblk->s_major == 1) {
-+              if (!squashfs_1_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 1.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if (sblk->s_major == 2) {
-+              if (!squashfs_2_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 2.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+                      SQUASHFS_MINOR) {
-+              SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+                              "filesystem\n", sblk->s_major, sblk->s_minor);
-+              SERROR("Please update your kernel\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+      struct squashfs_sb_info *msblk;
-+      struct squashfs_super_block *sblk;
-+      int i;
-+      char b[BDEVNAME_SIZE];
-+      struct inode *root;
-+
-+      TRACE("Entered squashfs_read_superblock\n");
-+
-+      if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+                                              GFP_KERNEL))) {
-+              ERROR("Failed to allocate superblock\n");
-+              goto failure;
-+      }
-+      memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+      msblk = s->s_fs_info;
-+      sblk = &msblk->sblk;
-+
-+      msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+      msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+      init_MUTEX(&msblk->read_data_mutex);
-+      init_MUTEX(&msblk->read_page_mutex);
-+      init_MUTEX(&msblk->block_cache_mutex);
-+      init_MUTEX(&msblk->fragment_mutex);
-+      init_MUTEX(&msblk->meta_index_mutex);
-+
-+      init_waitqueue_head(&msblk->waitq);
-+      init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+                                      sizeof(struct squashfs_super_block) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              SERROR("unable to read superblock\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Check it is a SQUASHFS superblock */
-+      msblk->swap = 0;
-+      if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+              if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+                      struct squashfs_super_block ssblk;
-+
-+                      WARNING("Mounting a different endian SQUASHFS "
-+                              "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+                      SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+                      memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+                      msblk->swap = 1;
-+              } else  {
-+                      SERROR("Can't find a SQUASHFS superblock on %s\n",
-+                                                      bdevname(s->s_bdev, b));
-+                      goto failed_mount;
-+              }
-+      }
-+
-+      /* Check the MAJOR & MINOR versions */
-+      if(!supported_squashfs_filesystem(msblk, silent))
-+              goto failed_mount;
-+
-+      TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+      TRACE("Inodes are %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_INODES
-+                                      (sblk->flags) ? "un" : "");
-+      TRACE("Data is %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+                                      ? "un" : "");
-+      TRACE("Check data is %s present in the filesystem\n",
-+                                      SQUASHFS_CHECK_DATA(sblk->flags) ?
-+                                      "" : "not");
-+      TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+      TRACE("Block size %d\n", sblk->block_size);
-+      TRACE("Number of inodes %d\n", sblk->inodes);
-+      if (sblk->s_major > 1)
-+              TRACE("Number of fragments %d\n", sblk->fragments);
-+      TRACE("Number of uids %d\n", sblk->no_uids);
-+      TRACE("Number of gids %d\n", sblk->no_guids);
-+      TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+      TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+      if (sblk->s_major > 1)
-+              TRACE("sblk->fragment_table_start %llx\n",
-+                                      sblk->fragment_table_start);
-+      TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+      s->s_flags |= MS_RDONLY;
-+      s->s_op = &squashfs_ops;
-+
-+      /* Init inode_table block pointer array */
-+      if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+                                      SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+              msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+      msblk->next_cache = 0;
-+
-+      /* Allocate read_data block */
-+      msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+                                      SQUASHFS_METADATA_SIZE :
-+                                      sblk->block_size;
-+
-+      if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_data block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate read_page block */
-+      if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_page block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate uid and gid tables */
-+      if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+                                      sizeof(unsigned int), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              goto failed_mount;
-+      }
-+      msblk->guid = msblk->uid + sblk->no_uids;
-+
-+      if (msblk->swap) {
-+              unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+              if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+              SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+                      sblk->no_guids), (sizeof(unsigned int) * 8));
-+      } else
-+              if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+
-+      if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+              goto allocate_root;
-+
-+      if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+                              SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate fragment block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+              msblk->fragment[i].locked = 0;
-+              msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+              msblk->fragment[i].data = NULL;
-+      }
-+
-+      msblk->next_fragment = 0;
-+
-+      /* Allocate fragment index table */
-+      if (msblk->read_fragment_index_table(s) == 0)
-+              goto failed_mount;
-+
-+allocate_root:
-+      if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+              goto failed_mount;
-+
-+      if ((s->s_root = d_alloc_root(root)) == NULL) {
-+              ERROR("Root inode create failed\n");
-+              iput(root);
-+              goto failed_mount;
-+      }
-+
-+      TRACE("Leaving squashfs_read_super\n");
-+      return 0;
-+
-+failed_mount:
-+      kfree(msblk->fragment_index);
-+      kfree(msblk->fragment);
-+      kfree(msblk->uid);
-+      kfree(msblk->read_page);
-+      kfree(msblk->read_data);
-+      kfree(msblk->block_cache);
-+      kfree(msblk->fragment_index_2);
-+      kfree(s->s_fs_info);
-+      s->s_fs_info = NULL;
-+      return -EINVAL;
-+
-+failure:
-+      return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-+{
-+      struct squashfs_sb_info *msblk = dentry->d_inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      TRACE("Entered squashfs_statfs\n");
-+
-+      buf->f_type = SQUASHFS_MAGIC;
-+      buf->f_bsize = sblk->block_size;
-+      buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+      buf->f_bfree = buf->f_bavail = 0;
-+      buf->f_files = sblk->inodes;
-+      buf->f_ffree = 0;
-+      buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+      long long block = SQUASHFS_I(inode)->start_block;
-+      int offset = SQUASHFS_I(inode)->offset;
-+      void *pageaddr = kmap(page);
-+
-+      TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+                              "%llx, offset %x\n", page->index,
-+                              SQUASHFS_I(inode)->start_block,
-+                              SQUASHFS_I(inode)->offset);
-+
-+      for (length = 0; length < index; length += bytes) {
-+              if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+                              block, offset, PAGE_CACHE_SIZE, &block,
-+                              &offset))) {
-+                      ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+                                      offset);
-+                      goto skip_read;
-+              }
-+      }
-+
-+      if (length != index) {
-+              ERROR("(squashfs_symlink_readpage) length != index\n");
-+              bytes = 0;
-+              goto skip_read;
-+      }
-+
-+      bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+                                      i_size_read(inode) - length;
-+
-+      if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+                                      offset, bytes, &block, &offset)))
-+              ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+      struct meta_index *meta = NULL;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+      if(msblk->meta_index == NULL)
-+              goto not_allocated;
-+
-+      for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+              if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+                              msblk->meta_index[i].offset >= offset &&
-+                              msblk->meta_index[i].offset <= index &&
-+                              msblk->meta_index[i].locked == 0) {
-+                      TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+                                      msblk->meta_index[i].offset);
-+                      meta = &msblk->meta_index[i];
-+                      offset = meta->offset;
-+              }
-+
-+      if (meta)
-+              meta->locked = 1;
-+
-+not_allocated:
-+      up(&msblk->meta_index_mutex);
-+
-+      return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct meta_index *meta = NULL;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+      if(msblk->meta_index == NULL) {
-+              if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+                                      SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+                      ERROR("Failed to allocate meta_index\n");
-+                      goto failed;
-+              }
-+              for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+                      msblk->meta_index[i].inode_number = 0;
-+                      msblk->meta_index[i].locked = 0;
-+              }
-+              msblk->next_meta_index = 0;
-+      }
-+
-+      for(i = SQUASHFS_META_NUMBER; i &&
-+                      msblk->meta_index[msblk->next_meta_index].locked; i --)
-+              msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      if(i == 0) {
-+              TRACE("empty_meta_index: failed!\n");
-+              goto failed;
-+      }
-+
-+      TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+                      msblk->next_meta_index,
-+                      &msblk->meta_index[msblk->next_meta_index]);
-+
-+      meta = &msblk->meta_index[msblk->next_meta_index];
-+      msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      meta->inode_number = inode->i_ino;
-+      meta->offset = offset;
-+      meta->skip = skip;
-+      meta->entries = 0;
-+      meta->locked = 1;
-+
-+failed:
-+      up(&msblk->meta_index_mutex);
-+      return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+      meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+              long long *start_block, int *offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned int *block_listp;
-+      int block = 0;
-+
-+      if (msblk->swap) {
-+              char sblock_list[blocks << 2];
-+
-+              if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+              SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+                              ((unsigned int *)sblock_list), blocks);
-+      } else
-+              if (!squashfs_get_cached_block(s, block_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+
-+      for (block_listp = (unsigned int *) block_list; blocks;
-+                              block_listp++, blocks --)
-+              block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+      return block;
-+
-+failure:
-+      return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+      int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+      return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+              long long *index_block, int *index_offset,
-+              long long *data_block, char *block_list)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+      int offset = 0;
-+      struct meta_index *meta;
-+      struct meta_entry *meta_entry;
-+      long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+      int cur_offset = SQUASHFS_I(inode)->offset;
-+      long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+      int i;
-+
-+      index /= SQUASHFS_META_INDEXES * skip;
-+
-+      while ( offset < index ) {
-+              meta = locate_meta_index(inode, index, offset + 1);
-+
-+              if (meta == NULL) {
-+                      if ((meta = empty_meta_index(inode, offset + 1,
-+                                                      skip)) == NULL)
-+                              goto all_done;
-+              } else {
-+                      offset = index < meta->offset + meta->entries ? index :
-+                              meta->offset + meta->entries - 1;
-+                      meta_entry = &meta->meta_entry[offset - meta->offset];
-+                      cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+                      cur_offset = meta_entry->offset;
-+                      cur_data_block = meta_entry->data_block;
-+                      TRACE("get_meta_index: offset %d, meta->offset %d, "
-+                              "meta->entries %d\n", offset, meta->offset,
-+                              meta->entries);
-+                      TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+                              " data_block 0x%llx\n", cur_index_block,
-+                              cur_offset, cur_data_block);
-+              }
-+
-+              for (i = meta->offset + meta->entries; i <= index &&
-+                              i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+                      int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+                      while (blocks) {
-+                              int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+                                      blocks;
-+                              int res = read_block_index(inode->i_sb, block,
-+                                      block_list, &cur_index_block,
-+                                      &cur_offset);
-+
-+                              if (res == -1)
-+                                      goto failed;
-+
-+                              cur_data_block += res;
-+                              blocks -= block;
-+                      }
-+
-+                      meta_entry = &meta->meta_entry[i - meta->offset];
-+                      meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+                      meta_entry->offset = cur_offset;
-+                      meta_entry->data_block = cur_data_block;
-+                      meta->entries ++;
-+                      offset ++;
-+              }
-+
-+              TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+                              meta->offset, meta->entries);
-+
-+              release_meta_index(inode, meta);
-+      }
-+
-+all_done:
-+      *index_block = cur_index_block;
-+      *index_offset = cur_offset;
-+      *data_block = cur_data_block;
-+
-+      return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+      release_meta_index(inode, meta);
-+      return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize)
-+{
-+      long long block_ptr;
-+      int offset;
-+      long long block;
-+      int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+              block_list);
-+
-+      TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+                     " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+                     block);
-+
-+      if(res == -1)
-+              goto failure;
-+
-+      index -= res;
-+
-+      while ( index ) {
-+              int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+              int res = read_block_index(inode->i_sb, blocks, block_list,
-+                      &block_ptr, &offset);
-+              if (res == -1)
-+                      goto failure;
-+              block += res;
-+              index -= blocks;
-+      }
-+
-+      if (read_block_index(inode->i_sb, 1, block_list,
-+                      &block_ptr, &offset) == -1)
-+              goto failure;
-+      *bsize = *((unsigned int *) block_list);
-+
-+      return block;
-+
-+failure:
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
-+      struct squashfs_fragment_cache *fragment = NULL;
-+      char *data_ptr = msblk->read_page;
-+
-+      int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+      int start_index = page->index & ~mask;
-+      int end_index = start_index | mask;
-+
-+      TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT))
-+              goto skip_read;
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              if ((block = (msblk->read_blocklist)(inode, index, 1,
-+                                      block_list, NULL, &bsize)) == 0)
-+                      goto skip_read;
-+
-+              down(&msblk->read_page_mutex);
-+
-+              if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+                                      block, bsize, NULL))) {
-+                      ERROR("Unable to read page, block %llx, size %x\n", block,
-+                                      bsize);
-+                      up(&msblk->read_page_mutex);
-+                      goto skip_read;
-+              }
-+      } else {
-+              if ((fragment = get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)->u.s1.fragment_size))
-+                                      == NULL) {
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      (int) SQUASHFS_I(inode)->
-+                                      u.s1.fragment_size);
-+                      goto skip_read;
-+              }
-+              bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+                                      (i_size_read(inode) & (sblk->block_size
-+                                      - 1));
-+              byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+              data_ptr = fragment->data;
-+      }
-+
-+      for (i = start_index; i <= end_index && byte_offset < bytes;
-+                                      i++, byte_offset += PAGE_CACHE_SIZE) {
-+              struct page *push_page;
-+              int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+                                      PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+              TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+                                      bytes, i, byte_offset, available_bytes);
-+
-+              if (i == page->index)  {
-+                      pageaddr = kmap_atomic(page, KM_USER0);
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(page);
-+                      SetPageUptodate(page);
-+                      unlock_page(page);
-+              } else if ((push_page =
-+                              grab_cache_page_nowait(page->mapping, i))) {
-+                      pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(push_page);
-+                      SetPageUptodate(push_page);
-+                      unlock_page(push_page);
-+                      page_cache_release(push_page);
-+              }
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log))
-+              up(&msblk->read_page_mutex);
-+      else
-+              release_cached_fragment(msblk, fragment);
-+
-+      return 0;
-+
-+skip_read:
-+      pageaddr = kmap_atomic(page, KM_USER0);
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, bytes = 0;
-+      void *pageaddr;
-+
-+      TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT)) {
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              goto skip_read;
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || page->index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              block = (msblk->read_blocklist)(inode, page->index, 1,
-+                                      block_list, NULL, &bsize);
-+
-+              down(&msblk->read_page_mutex);
-+              bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+                                      bsize, NULL);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (bytes)
-+                      memcpy(pageaddr, msblk->read_page, bytes);
-+              else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      block, bsize);
-+              up(&msblk->read_page_mutex);
-+      } else {
-+              struct squashfs_fragment_cache *fragment =
-+                      get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (fragment) {
-+                      bytes = i_size_read(inode) & (sblk->block_size - 1);
-+                      memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+                                      u.s1.fragment_offset, bytes);
-+                      release_cached_fragment(msblk, fragment);
-+              } else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block, (int)
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+      }
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      f_pos =- 3;
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length + 3;
-+}
-+
-+
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+      while(file->f_pos < 3) {
-+              char *name;
-+              int size, i_ino;
-+
-+              if(file->f_pos == 0) {
-+                      name = ".";
-+                      size = 1;
-+                      i_ino = i->i_ino;
-+              } else {
-+                      name = "..";
-+                      size = 2;
-+                      i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+              }
-+              TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+                              (unsigned int) dirent, name, size, (int)
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]);
-+
-+              if (filldir(dirent, name, size,
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]) < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+              }
-+              file->f_pos += size;
-+              dirs_read++;
-+      }
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %d\n", name,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+      int i;
-+
-+      if (s->s_fs_info) {
-+              struct squashfs_sb_info *sbi = s->s_fs_info;
-+              if (sbi->block_cache)
-+                      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                              if (sbi->block_cache[i].block !=
-+                                                      SQUASHFS_INVALID_BLK)
-+                                      kfree(sbi->block_cache[i].data);
-+              if (sbi->fragment)
-+                      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++)
-+                              SQUASHFS_FREE(sbi->fragment[i].data);
-+              kfree(sbi->fragment);
-+              kfree(sbi->block_cache);
-+              kfree(sbi->read_data);
-+              kfree(sbi->read_page);
-+              kfree(sbi->uid);
-+              kfree(sbi->fragment_index);
-+              kfree(sbi->fragment_index_2);
-+              kfree(sbi->meta_index);
-+              kfree(s->s_fs_info);
-+              s->s_fs_info = NULL;
-+      }
-+}
-+
-+
-+static int squashfs_get_sb(struct file_system_type *fs_type,
-+                      int flags, const char *dev_name, void *data,
-+                      struct vfsmount *mnt)
-+{
-+      return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+      int err = init_inodecache();
-+      if (err)
-+              goto out;
-+
-+      printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+              "Phillip Lougher\n");
-+
-+      if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+              ERROR("Failed to allocate zlib workspace\n");
-+              destroy_inodecache();
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      if ((err = register_filesystem(&squashfs_fs_type))) {
-+              vfree(stream.workspace);
-+              destroy_inodecache();
-+      }
-+
-+out:
-+      return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+      vfree(stream.workspace);
-+      unregister_filesystem(&squashfs_fs_type);
-+      destroy_inodecache();
-+}
-+
-+
-+static struct kmem_cache * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+      struct squashfs_inode_info *ei;
-+      ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL);
-+      if (!ei)
-+              return NULL;
-+      return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+      kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
-+{
-+      struct squashfs_inode_info *ei = foo;
-+
-+      inode_init_once(&ei->vfs_inode);
-+}
-+
-+
-+static int __init init_inodecache(void)
-+{
-+      squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+           sizeof(struct squashfs_inode_info),
-+           0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+           init_once);
-+      if (squashfs_inode_cachep == NULL)
-+              return -ENOMEM;
-+      return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+      kmem_cache_destroy(squashfs_inode_cachep);
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/fs/squashfs/Makefile
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
---- /dev/null
-+++ b/fs/squashfs/squashfs2_0.c
-@@ -0,0 +1,758 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+      .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index_2,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              unsigned int fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+                                              &msblk->fragment_index_2[i], 1);
-+                      msblk->fragment_index_2[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+      struct squashfs_fragment_entry_2 fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = ino;
-+              i->i_mtime.tv_sec = sblk->mkfs_time;
-+              i->i_atime.tv_sec = sblk->mkfs_time;
-+              i->i_ctime.tv_sec = sblk->mkfs_time;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_nlink = 1;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+              - sblk->inode_table_start, offset);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header_2 id, sid;
-+      struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+                      long long frag_blk;
-+                      unsigned int frag_size;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location_2(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      i->i_blksize = PAGE_CACHE_SIZE;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %x, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header_2 *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header_2 *sinodep =
-+                                                              &sid.symlink;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index_2 index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index_2),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length;
-+}
-+
-+
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+      TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos, SQUASHFS_MK_VFS_INODE(
-+                                      dirh.start_block, dire->offset),
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+      int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (sorted && name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %lld\n", name,
-+                                      dirh.start_block, dire->offset, ino);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget_2;
-+      msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+      sblk->bytes_used = sblk->bytes_used_2;
-+      sblk->uid_start = sblk->uid_start_2;
-+      sblk->guid_start = sblk->guid_start_2;
-+      sblk->inode_table_start = sblk->inode_table_start_2;
-+      sblk->directory_table_start = sblk->directory_table_start_2;
-+      sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+      return 1;
-+}
---- /dev/null
-+++ b/fs/squashfs/squashfs.h
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...)     {}
-+#endif
-+
-+#define ERROR(s, args...)     printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...)    do { \
-+                              if (!silent) \
-+                              printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+                              } while(0)
-+
-+#define WARNING(s, args...)   printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+      return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                              long long index, unsigned int length,
-+                              long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
---- a/include/linux/magic.h
-+++ b/include/linux/magic.h
-@@ -35,6 +35,9 @@
- #define REISER2FS_SUPER_MAGIC_STRING  "ReIsEr2Fs"
- #define REISER2FS_JR_SUPER_MAGIC_STRING       "ReIsEr3Fs"
-+#define SQUASHFS_MAGIC                        0x73717368
-+#define SQUASHFS_MAGIC_SWAP           0x68737173
-+
- #define SMB_SUPER_MAGIC               0x517B
- #define USBDEVICE_SUPER_MAGIC 0x9fa2
- #define CGROUP_SUPER_MAGIC    0x27e0eb
---- /dev/null
-+++ b/include/linux/squashfs_fs.h
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef        CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a)             vmalloc(a)
-+#define SQUASHFS_FREE(a)              vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a)             kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a)              kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS     CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
-+#define SQUASHFS_MAJOR                        3
-+#define SQUASHFS_MINOR                        0
-+#define SQUASHFS_START                        0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE                8192
-+#define SQUASHFS_METADATA_LOG         13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE            65536
-+#define SQUASHFS_FILE_LOG             16
-+
-+#define SQUASHFS_FILE_MAX_SIZE                65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS                 256
-+#define SQUASHFS_GUIDS                        255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN             256
-+
-+#define SQUASHFS_INVALID              ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG         ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK          ((long long) -1)
-+#define SQUASHFS_USED_BLK             ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI                  0
-+#define SQUASHFS_NOD                  1
-+#define SQUASHFS_CHECK                        2
-+#define SQUASHFS_NOF                  3
-+#define SQUASHFS_NO_FRAG              4
-+#define SQUASHFS_ALWAYS_FRAG          5
-+#define SQUASHFS_DUPLICATE            6
-+
-+#define SQUASHFS_BIT(flag, bit)               ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags)   SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags)     SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)        SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags)          SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags)      SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+              duplicate_checking)     (noi | (nod << 1) | (check_data << 2) \
-+              | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+              (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE             1
-+#define SQUASHFS_FILE_TYPE            2
-+#define SQUASHFS_SYMLINK_TYPE         3
-+#define SQUASHFS_BLKDEV_TYPE          4
-+#define SQUASHFS_CHRDEV_TYPE          5
-+#define SQUASHFS_FIFO_TYPE            6
-+#define SQUASHFS_SOCKET_TYPE          7
-+#define SQUASHFS_LDIR_TYPE            8
-+#define SQUASHFS_LREG_TYPE            9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES                        5
-+#define SQUASHFS_IPC_TYPE             0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT               (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B)   (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+              (B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B)                (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK         (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)     (((B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B)  (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops.  Inodes consist of a compressed block number, and an
-+ * uncompressed  offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a)         ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a)      ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B)                ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+                                      << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b)   ((unsigned int) (((a) << 8) + \
-+                                      ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a)              ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A)    (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A)    (SQUASHFS_FRAGMENT_BYTES(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)     (SQUASHFS_FRAGMENT_BYTES(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A)  ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)      (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+                                              sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS          8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG    64
-+
-+#define SQUASHFS_MAX_FILE_SIZE                ((long long) 1 << \
-+                                      (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE          0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER  8
-+#define SQUASHFS_SLOTS                4
-+
-+#include <linux/magic.h>
-+
-+struct meta_entry {
-+      long long               data_block;
-+      unsigned int            index_block;
-+      unsigned short          offset;
-+      unsigned short          pad;
-+};
-+
-+struct meta_index {
-+      unsigned int            inode_number;
-+      unsigned int            offset;
-+      unsigned short          entries;
-+      unsigned short          skip;
-+      unsigned short          locked;
-+      unsigned short          pad;
-+      struct meta_entry       meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long             squashfs_block_t;
-+typedef long long             squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+      unsigned int            s_magic;
-+      unsigned int            inodes;
-+      unsigned int            bytes_used_2;
-+      unsigned int            uid_start_2;
-+      unsigned int            guid_start_2;
-+      unsigned int            inode_table_start_2;
-+      unsigned int            directory_table_start_2;
-+      unsigned int            s_major:16;
-+      unsigned int            s_minor:16;
-+      unsigned int            block_size_1:16;
-+      unsigned int            block_log:16;
-+      unsigned int            flags:8;
-+      unsigned int            no_uids:8;
-+      unsigned int            no_guids:8;
-+      unsigned int            mkfs_time /* time of filesystem creation */;
-+      squashfs_inode_t        root_inode;
-+      unsigned int            block_size;
-+      unsigned int            fragments;
-+      unsigned int            fragment_table_start_2;
-+      long long               bytes_used;
-+      long long               uid_start;
-+      long long               guid_start;
-+      long long               inode_table_start;
-+      long long               directory_table_start;
-+      long long               fragment_table_start;
-+      long long               unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+      unsigned int            index;
-+      unsigned int            start_block;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER            \
-+      unsigned int            inode_type:4;   \
-+      unsigned int            mode:12;        \
-+      unsigned int            uid:8;          \
-+      unsigned int            guid:8;         \
-+      unsigned int            mtime;          \
-+      unsigned int            inode_number;
-+
-+struct squashfs_base_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      long long               file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            parent_inode;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            i_count:16;
-+      unsigned int            parent_inode;
-+      struct squashfs_dir_index       index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header {
-+      struct squashfs_base_inode_header       base;
-+      struct squashfs_dev_inode_header        dev;
-+      struct squashfs_symlink_inode_header    symlink;
-+      struct squashfs_reg_inode_header        reg;
-+      struct squashfs_lreg_inode_header       lreg;
-+      struct squashfs_dir_inode_header        dir;
-+      struct squashfs_ldir_inode_header       ldir;
-+      struct squashfs_ipc_inode_header        ipc;
-+};
-+
-+struct squashfs_dir_entry {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      int                     inode_number:16;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+      unsigned int            count:8;
-+      unsigned int            start_block;
-+      unsigned int            inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+      long long               start_block;
-+      unsigned int            size;
-+      unsigned int            unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa.  These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+      int bits;\
-+      int b_pos;\
-+      unsigned long long val;\
-+      unsigned char *s;\
-+      unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+      SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+      SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+      SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+      SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+      SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+      SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+      SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+      SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+      SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+      SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+      SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+      SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+      SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+      SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+      SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+      SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+      SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+      SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header))\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header)); \
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header));\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_lreg_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+      SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 2);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      16)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 4);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      32)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      64)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      bits)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            type:4;
-+      unsigned int            offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+      SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header_1));\
-+      SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+      SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_1));\
-+      SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_1));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_1));\
-+      SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_1));\
-+      SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+      unsigned int            index:27;
-+      unsigned int            start_block:29;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+      unsigned int            i_count:16;
-+      struct squashfs_dir_index_2     index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header_2 {
-+      struct squashfs_base_inode_header_2     base;
-+      struct squashfs_dev_inode_header_2      dev;
-+      struct squashfs_symlink_inode_header_2  symlink;
-+      struct squashfs_reg_inode_header_2      reg;
-+      struct squashfs_dir_inode_header_2      dir;
-+      struct squashfs_ldir_inode_header_2     ldir;
-+      struct squashfs_ipc_inode_header_2      ipc;
-+};
-+
-+struct squashfs_dir_header_2 {
-+      unsigned int            count:8;
-+      unsigned int            start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+      unsigned int            start_block;
-+      unsigned int            size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+      SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_2)); \
-+      SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_2));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_2));\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+      SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+      SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+      SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A)  (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A)  (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A)   (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A)        ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A)    (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+                                              sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+      /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, b_pos)
-+#else
-+      /* convert from big endian to little endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+      b_pos = pos % 8;\
-+      val = 0;\
-+      s = (unsigned char *)p + (pos / 8);\
-+      d = ((unsigned char *) &val) + 7;\
-+      for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+              *d-- = *s++;\
-+      value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n)      memset(s, 0, n);
-+
-+#endif
-+#endif
---- /dev/null
-+++ b/include/linux/squashfs_fs_i.h
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+      long long       start_block;
-+      unsigned int    offset;
-+      union {
-+              struct {
-+                      long long       fragment_start_block;
-+                      unsigned int    fragment_size;
-+                      unsigned int    fragment_offset;
-+                      long long       block_list_start;
-+              } s1;
-+              struct {
-+                      long long       directory_index_start;
-+                      unsigned int    directory_index_offset;
-+                      unsigned int    directory_index_count;
-+                      unsigned int    parent_inode;
-+              } s2;
-+      } u;
-+      struct inode    vfs_inode;
-+};
-+#endif
---- /dev/null
-+++ b/include/linux/squashfs_fs_sb.h
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * This 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+      long long       block;
-+      int             length;
-+      long long       next_index;
-+      char            *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+      long long       block;
-+      int             length;
-+      unsigned int    locked;
-+      char            *data;
-+};
-+
-+struct squashfs_sb_info {
-+      struct squashfs_super_block     sblk;
-+      int                     devblksize;
-+      int                     devblksize_log2;
-+      int                     swap;
-+      struct squashfs_cache   *block_cache;
-+      struct squashfs_fragment_cache  *fragment;
-+      int                     next_cache;
-+      int                     next_fragment;
-+      int                     next_meta_index;
-+      unsigned int            *uid;
-+      unsigned int            *guid;
-+      long long               *fragment_index;
-+      unsigned int            *fragment_index_2;
-+      unsigned int            read_size;
-+      char                    *read_data;
-+      char                    *read_page;
-+      struct semaphore        read_data_mutex;
-+      struct semaphore        read_page_mutex;
-+      struct semaphore        block_cache_mutex;
-+      struct semaphore        fragment_mutex;
-+      struct semaphore        meta_index_mutex;
-+      wait_queue_head_t       waitq;
-+      wait_queue_head_t       fragment_wait_queue;
-+      struct meta_index       *meta_index;
-+      struct inode            *(*iget)(struct super_block *s,  squashfs_inode_t \
-+                              inode);
-+      long long               (*read_blocklist)(struct inode *inode, int \
-+                              index, int readahead_blks, char *block_list, \
-+                              unsigned short **block_p, unsigned int *bsize);
-+      int                     (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
---- a/init/do_mounts_rd.c
-+++ b/init/do_mounts_rd.c
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
-  * numbers could not be found.
-  *
-  * We currently check for the following magic numbers:
-+ *      squashfs
-  *    minix
-  *    ext2
-  *    romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       struct cramfs_super *cramfsb;
-+      struct squashfs_super_block *squashfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       cramfsb = (struct cramfs_super *) buf;
-+      squashfsb = (struct squashfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-       /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
-               goto done;
-       }
-+      /* squashfs is at block zero too */
-+      if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+              printk(KERN_NOTICE
-+                     "RAMDISK: squashfs filesystem found at block %d\n",
-+                     start_block);
-+              nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+              goto done;
-+      }
-+
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
diff --git a/target/linux/generic-2.6/patches-2.6.24/002-lzma_decompress.patch b/target/linux/generic-2.6/patches-2.6.24/002-lzma_decompress.patch
deleted file mode 100644 (file)
index 4a4e266..0000000
+++ /dev/null
@@ -1,788 +0,0 @@
---- /dev/null
-+++ b/include/linux/LzmaDecode.h
-@@ -0,0 +1,100 @@
-+/*
-+  LzmaDecode.h
-+  LZMA Decoder interface
-+
-+  LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
-+  http://www.7-zip.org/
-+
-+  LZMA SDK is licensed under two licenses:
-+  1) GNU Lesser General Public License (GNU LGPL)
-+  2) Common Public License (CPL)
-+  It means that you can select one of these two licenses and
-+  follow rules of that license.
-+
-+  SPECIAL EXCEPTION:
-+  Igor Pavlov, as the author of this code, expressly permits you to
-+  statically or dynamically link your code (or bind by name) to the
-+  interfaces of this file without subjecting your linked code to the
-+  terms of the CPL or GNU LGPL. Any modifications or additions
-+  to this file, however, are subject to the LGPL or CPL terms.
-+*/
-+
-+#ifndef __LZMADECODE_H
-+#define __LZMADECODE_H
-+
-+/* #define _LZMA_IN_CB */
-+/* Use callback for input data */
-+
-+/* #define _LZMA_OUT_READ */
-+/* Use read function for output data */
-+
-+/* #define _LZMA_PROB32 */
-+/* It can increase speed on some 32-bit CPUs,
-+   but memory usage will be doubled in that case */
-+
-+/* #define _LZMA_LOC_OPT */
-+/* Enable local speed optimizations inside code */
-+
-+#ifndef UInt32
-+#ifdef _LZMA_UINT32_IS_ULONG
-+#define UInt32 unsigned long
-+#else
-+#define UInt32 unsigned int
-+#endif
-+#endif
-+
-+#ifdef _LZMA_PROB32
-+#define CProb UInt32
-+#else
-+#define CProb unsigned short
-+#endif
-+
-+#define LZMA_RESULT_OK 0
-+#define LZMA_RESULT_DATA_ERROR 1
-+#define LZMA_RESULT_NOT_ENOUGH_MEM 2
-+
-+#ifdef _LZMA_IN_CB
-+typedef struct _ILzmaInCallback
-+{
-+  int (*Read)(void *object, unsigned char **buffer, UInt32 *bufferSize);
-+} ILzmaInCallback;
-+#endif
-+
-+#define LZMA_BASE_SIZE 1846
-+#define LZMA_LIT_SIZE 768
-+
-+/*
-+bufferSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb)
-+bufferSize += 100 in case of _LZMA_OUT_READ
-+by default CProb is unsigned short,
-+but if specify _LZMA_PROB_32, CProb will be UInt32(unsigned int)
-+*/
-+
-+#ifdef _LZMA_OUT_READ
-+int LzmaDecoderInit(
-+    unsigned char *buffer, UInt32 bufferSize,
-+    int lc, int lp, int pb,
-+    unsigned char *dictionary, UInt32 dictionarySize,
-+  #ifdef _LZMA_IN_CB
-+    ILzmaInCallback *inCallback
-+  #else
-+    unsigned char *inStream, UInt32 inSize
-+  #endif
-+);
-+#endif
-+
-+int LzmaDecode(
-+    unsigned char *buffer,
-+  #ifndef _LZMA_OUT_READ
-+    UInt32 bufferSize,
-+    int lc, int lp, int pb,
-+  #ifdef _LZMA_IN_CB
-+    ILzmaInCallback *inCallback,
-+  #else
-+    unsigned char *inStream, UInt32 inSize,
-+  #endif
-+  #endif
-+    unsigned char *outStream, UInt32 outSize,
-+    UInt32 *outSizeProcessed);
-+
-+#endif
---- /dev/null
-+++ b/lib/LzmaDecode.c
-@@ -0,0 +1,663 @@
-+/*
-+  LzmaDecode.c
-+  LZMA Decoder
-+
-+  LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
-+  http://www.7-zip.org/
-+
-+  LZMA SDK is licensed under two licenses:
-+  1) GNU Lesser General Public License (GNU LGPL)
-+  2) Common Public License (CPL)
-+  It means that you can select one of these two licenses and
-+  follow rules of that license.
-+
-+  SPECIAL EXCEPTION:
-+  Igor Pavlov, as the author of this code, expressly permits you to
-+  statically or dynamically link your code (or bind by name) to the
-+  interfaces of this file without subjecting your linked code to the
-+  terms of the CPL or GNU LGPL. Any modifications or additions
-+  to this file, however, are subject to the LGPL or CPL terms.
-+*/
-+
-+#include <linux/LzmaDecode.h>
-+
-+#ifndef Byte
-+#define Byte unsigned char
-+#endif
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+
-+typedef struct _CRangeDecoder
-+{
-+  Byte *Buffer;
-+  Byte *BufferLim;
-+  UInt32 Range;
-+  UInt32 Code;
-+  #ifdef _LZMA_IN_CB
-+  ILzmaInCallback *InCallback;
-+  int Result;
-+  #endif
-+  int ExtraBytes;
-+} CRangeDecoder;
-+
-+Byte RangeDecoderReadByte(CRangeDecoder *rd)
-+{
-+  if (rd->Buffer == rd->BufferLim)
-+  {
-+    #ifdef _LZMA_IN_CB
-+    UInt32 size;
-+    rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size);
-+    rd->BufferLim = rd->Buffer + size;
-+    if (size == 0)
-+    #endif
-+    {
-+      rd->ExtraBytes = 1;
-+      return 0xFF;
-+    }
-+  }
-+  return (*rd->Buffer++);
-+}
-+
-+/* #define ReadByte (*rd->Buffer++) */
-+#define ReadByte (RangeDecoderReadByte(rd))
-+
-+void RangeDecoderInit(CRangeDecoder *rd,
-+  #ifdef _LZMA_IN_CB
-+    ILzmaInCallback *inCallback
-+  #else
-+    Byte *stream, UInt32 bufferSize
-+  #endif
-+    )
-+{
-+  int i;
-+  #ifdef _LZMA_IN_CB
-+  rd->InCallback = inCallback;
-+  rd->Buffer = rd->BufferLim = 0;
-+  #else
-+  rd->Buffer = stream;
-+  rd->BufferLim = stream + bufferSize;
-+  #endif
-+  rd->ExtraBytes = 0;
-+  rd->Code = 0;
-+  rd->Range = (0xFFFFFFFF);
-+  for(i = 0; i < 5; i++)
-+    rd->Code = (rd->Code << 8) | ReadByte;
-+}
-+
-+#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code;
-+#define RC_FLUSH_VAR rd->Range = range; rd->Code = code;
-+#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; }
-+
-+UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits)
-+{
-+  RC_INIT_VAR
-+  UInt32 result = 0;
-+  int i;
-+  for (i = numTotalBits; i > 0; i--)
-+  {
-+    /* UInt32 t; */
-+    range >>= 1;
-+
-+    result <<= 1;
-+    if (code >= range)
-+    {
-+      code -= range;
-+      result |= 1;
-+    }
-+    /*
-+    t = (code - range) >> 31;
-+    t &= 1;
-+    code -= range & (t - 1);
-+    result = (result + result) | (1 - t);
-+    */
-+    RC_NORMALIZE
-+  }
-+  RC_FLUSH_VAR
-+  return result;
-+}
-+
-+int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd)
-+{
-+  UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob;
-+  if (rd->Code < bound)
-+  {
-+    rd->Range = bound;
-+    *prob += (kBitModelTotal - *prob) >> kNumMoveBits;
-+    if (rd->Range < kTopValue)
-+    {
-+      rd->Code = (rd->Code << 8) | ReadByte;
-+      rd->Range <<= 8;
-+    }
-+    return 0;
-+  }
-+  else
-+  {
-+    rd->Range -= bound;
-+    rd->Code -= bound;
-+    *prob -= (*prob) >> kNumMoveBits;
-+    if (rd->Range < kTopValue)
-+    {
-+      rd->Code = (rd->Code << 8) | ReadByte;
-+      rd->Range <<= 8;
-+    }
-+    return 1;
-+  }
-+}
-+
-+#define RC_GET_BIT2(prob, mi, A0, A1) \
-+  UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \
-+  if (code < bound) \
-+    { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \
-+  else \
-+    { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \
-+  RC_NORMALIZE
-+
-+#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;)
-+
-+int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+  int mi = 1;
-+  int i;
-+  #ifdef _LZMA_LOC_OPT
-+  RC_INIT_VAR
-+  #endif
-+  for(i = numLevels; i > 0; i--)
-+  {
-+    #ifdef _LZMA_LOC_OPT
-+    CProb *prob = probs + mi;
-+    RC_GET_BIT(prob, mi)
-+    #else
-+    mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
-+    #endif
-+  }
-+  #ifdef _LZMA_LOC_OPT
-+  RC_FLUSH_VAR
-+  #endif
-+  return mi - (1 << numLevels);
-+}
-+
-+int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+  int mi = 1;
-+  int i;
-+  int symbol = 0;
-+  #ifdef _LZMA_LOC_OPT
-+  RC_INIT_VAR
-+  #endif
-+  for(i = 0; i < numLevels; i++)
-+  {
-+    #ifdef _LZMA_LOC_OPT
-+    CProb *prob = probs + mi;
-+    RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i))
-+    #else
-+    int bit = RangeDecoderBitDecode(probs + mi, rd);
-+    mi = mi + mi + bit;
-+    symbol |= (bit << i);
-+    #endif
-+  }
-+  #ifdef _LZMA_LOC_OPT
-+  RC_FLUSH_VAR
-+  #endif
-+  return symbol;
-+}
-+
-+Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd)
-+{
-+  int symbol = 1;
-+  #ifdef _LZMA_LOC_OPT
-+  RC_INIT_VAR
-+  #endif
-+  do
-+  {
-+    #ifdef _LZMA_LOC_OPT
-+    CProb *prob = probs + symbol;
-+    RC_GET_BIT(prob, symbol)
-+    #else
-+    symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+    #endif
-+  }
-+  while (symbol < 0x100);
-+  #ifdef _LZMA_LOC_OPT
-+  RC_FLUSH_VAR
-+  #endif
-+  return symbol;
-+}
-+
-+Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte)
-+{
-+  int symbol = 1;
-+  #ifdef _LZMA_LOC_OPT
-+  RC_INIT_VAR
-+  #endif
-+  do
-+  {
-+    int bit;
-+    int matchBit = (matchByte >> 7) & 1;
-+    matchByte <<= 1;
-+    #ifdef _LZMA_LOC_OPT
-+    {
-+      CProb *prob = probs + ((1 + matchBit) << 8) + symbol;
-+      RC_GET_BIT2(prob, symbol, bit = 0, bit = 1)
-+    }
-+    #else
-+    bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
-+    symbol = (symbol << 1) | bit;
-+    #endif
-+    if (matchBit != bit)
-+    {
-+      while (symbol < 0x100)
-+      {
-+        #ifdef _LZMA_LOC_OPT
-+        CProb *prob = probs + symbol;
-+        RC_GET_BIT(prob, symbol)
-+        #else
-+        symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+        #endif
-+      }
-+      break;
-+    }
-+  }
-+  while (symbol < 0x100);
-+  #ifdef _LZMA_LOC_OPT
-+  RC_FLUSH_VAR
-+  #endif
-+  return symbol;
-+}
-+
-+#define kNumPosBitsMax 4
-+#define kNumPosStatesMax (1 << kNumPosBitsMax)
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define LenChoice 0
-+#define LenChoice2 (LenChoice + 1)
-+#define LenLow (LenChoice2 + 1)
-+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-+
-+int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)
-+{
-+  if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)
-+    return RangeDecoderBitTreeDecode(p + LenLow +
-+        (posState << kLenNumLowBits), kLenNumLowBits, rd);
-+  if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
-+    return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid +
-+        (posState << kLenNumMidBits), kLenNumMidBits, rd);
-+  return kLenNumLowSymbols + kLenNumMidSymbols +
-+      RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);
-+}
-+
-+#define kNumStates 12
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#define kNumPosSlotBits 6
-+#define kNumLenToPosStates 4
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+
-+#define kMatchMinLen 2
-+
-+#define IsMatch 0
-+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-+#define IsRepG0 (IsRep + kNumStates)
-+#define IsRepG1 (IsRepG0 + kNumStates)
-+#define IsRepG2 (IsRepG1 + kNumStates)
-+#define IsRep0Long (IsRepG2 + kNumStates)
-+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-+#define LenCoder (Align + kAlignTableSize)
-+#define RepLenCoder (LenCoder + kNumLenProbs)
-+#define Literal (RepLenCoder + kNumLenProbs)
-+
-+#if Literal != LZMA_BASE_SIZE
-+StopCompilingDueBUG
-+#endif
-+
-+#ifdef _LZMA_OUT_READ
-+
-+typedef struct _LzmaVarState
-+{
-+  CRangeDecoder RangeDecoder;
-+  Byte *Dictionary;
-+  UInt32 DictionarySize;
-+  UInt32 DictionaryPos;
-+  UInt32 GlobalPos;
-+  UInt32 Reps[4];
-+  int lc;
-+  int lp;
-+  int pb;
-+  int State;
-+  int PreviousIsMatch;
-+  int RemainLen;
-+} LzmaVarState;
-+
-+int LzmaDecoderInit(
-+    unsigned char *buffer, UInt32 bufferSize,
-+    int lc, int lp, int pb,
-+    unsigned char *dictionary, UInt32 dictionarySize,
-+    #ifdef _LZMA_IN_CB
-+    ILzmaInCallback *inCallback
-+    #else
-+    unsigned char *inStream, UInt32 inSize
-+    #endif
-+    )
-+{
-+  LzmaVarState *vs = (LzmaVarState *)buffer;
-+  CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
-+  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
-+  UInt32 i;
-+  if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))
-+    return LZMA_RESULT_NOT_ENOUGH_MEM;
-+  vs->Dictionary = dictionary;
-+  vs->DictionarySize = dictionarySize;
-+  vs->DictionaryPos = 0;
-+  vs->GlobalPos = 0;
-+  vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
-+  vs->lc = lc;
-+  vs->lp = lp;
-+  vs->pb = pb;
-+  vs->State = 0;
-+  vs->PreviousIsMatch = 0;
-+  vs->RemainLen = 0;
-+  dictionary[dictionarySize - 1] = 0;
-+  for (i = 0; i < numProbs; i++)
-+    p[i] = kBitModelTotal >> 1;
-+  RangeDecoderInit(&vs->RangeDecoder,
-+      #ifdef _LZMA_IN_CB
-+      inCallback
-+      #else
-+      inStream, inSize
-+      #endif
-+  );
-+  return LZMA_RESULT_OK;
-+}
-+
-+int LzmaDecode(unsigned char *buffer,
-+    unsigned char *outStream, UInt32 outSize,
-+    UInt32 *outSizeProcessed)
-+{
-+  LzmaVarState *vs = (LzmaVarState *)buffer;
-+  CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
-+  CRangeDecoder rd = vs->RangeDecoder;
-+  int state = vs->State;
-+  int previousIsMatch = vs->PreviousIsMatch;
-+  Byte previousByte;
-+  UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
-+  UInt32 nowPos = 0;
-+  UInt32 posStateMask = (1 << (vs->pb)) - 1;
-+  UInt32 literalPosMask = (1 << (vs->lp)) - 1;
-+  int lc = vs->lc;
-+  int len = vs->RemainLen;
-+  UInt32 globalPos = vs->GlobalPos;
-+
-+  Byte *dictionary = vs->Dictionary;
-+  UInt32 dictionarySize = vs->DictionarySize;
-+  UInt32 dictionaryPos = vs->DictionaryPos;
-+
-+  if (len == -1)
-+  {
-+    *outSizeProcessed = 0;
-+    return LZMA_RESULT_OK;
-+  }
-+
-+  while(len > 0 && nowPos < outSize)
-+  {
-+    UInt32 pos = dictionaryPos - rep0;
-+    if (pos >= dictionarySize)
-+      pos += dictionarySize;
-+    outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
-+    if (++dictionaryPos == dictionarySize)
-+      dictionaryPos = 0;
-+    len--;
-+  }
-+  if (dictionaryPos == 0)
-+    previousByte = dictionary[dictionarySize - 1];
-+  else
-+    previousByte = dictionary[dictionaryPos - 1];
-+#else
-+
-+int LzmaDecode(
-+    Byte *buffer, UInt32 bufferSize,
-+    int lc, int lp, int pb,
-+    #ifdef _LZMA_IN_CB
-+    ILzmaInCallback *inCallback,
-+    #else
-+    unsigned char *inStream, UInt32 inSize,
-+    #endif
-+    unsigned char *outStream, UInt32 outSize,
-+    UInt32 *outSizeProcessed)
-+{
-+  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
-+  CProb *p = (CProb *)buffer;
-+  CRangeDecoder rd;
-+  UInt32 i;
-+  int state = 0;
-+  int previousIsMatch = 0;
-+  Byte previousByte = 0;
-+  UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
-+  UInt32 nowPos = 0;
-+  UInt32 posStateMask = (1 << pb) - 1;
-+  UInt32 literalPosMask = (1 << lp) - 1;
-+  int len = 0;
-+  if (bufferSize < numProbs * sizeof(CProb))
-+    return LZMA_RESULT_NOT_ENOUGH_MEM;
-+  for (i = 0; i < numProbs; i++)
-+    p[i] = kBitModelTotal >> 1;
-+  RangeDecoderInit(&rd,
-+      #ifdef _LZMA_IN_CB
-+      inCallback
-+      #else
-+      inStream, inSize
-+      #endif
-+      );
-+#endif
-+
-+  *outSizeProcessed = 0;
-+  while(nowPos < outSize)
-+  {
-+    int posState = (int)(
-+        (nowPos
-+        #ifdef _LZMA_OUT_READ
-+        + globalPos
-+        #endif
-+        )
-+        & posStateMask);
-+    #ifdef _LZMA_IN_CB
-+    if (rd.Result != LZMA_RESULT_OK)
-+      return rd.Result;
-+    #endif
-+    if (rd.ExtraBytes != 0)
-+      return LZMA_RESULT_DATA_ERROR;
-+    if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)
-+    {
-+      CProb *probs = p + Literal + (LZMA_LIT_SIZE *
-+        (((
-+        (nowPos
-+        #ifdef _LZMA_OUT_READ
-+        + globalPos
-+        #endif
-+        )
-+        & literalPosMask) << lc) + (previousByte >> (8 - lc))));
-+
-+      if (state < 4) state = 0;
-+      else if (state < 10) state -= 3;
-+      else state -= 6;
-+      if (previousIsMatch)
-+      {
-+        Byte matchByte;
-+        #ifdef _LZMA_OUT_READ
-+        UInt32 pos = dictionaryPos - rep0;
-+        if (pos >= dictionarySize)
-+          pos += dictionarySize;
-+        matchByte = dictionary[pos];
-+        #else
-+        matchByte = outStream[nowPos - rep0];
-+        #endif
-+        previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte);
-+        previousIsMatch = 0;
-+      }
-+      else
-+        previousByte = LzmaLiteralDecode(probs, &rd);
-+      outStream[nowPos++] = previousByte;
-+      #ifdef _LZMA_OUT_READ
-+      dictionary[dictionaryPos] = previousByte;
-+      if (++dictionaryPos == dictionarySize)
-+        dictionaryPos = 0;
-+      #endif
-+    }
-+    else
-+    {
-+      previousIsMatch = 1;
-+      if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)
-+      {
-+        if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)
-+        {
-+          if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)
-+          {
-+            #ifdef _LZMA_OUT_READ
-+            UInt32 pos;
-+            #endif
-+            if (
-+               (nowPos
-+                #ifdef _LZMA_OUT_READ
-+                + globalPos
-+                #endif
-+               )
-+               == 0)
-+              return LZMA_RESULT_DATA_ERROR;
-+            state = state < 7 ? 9 : 11;
-+            #ifdef _LZMA_OUT_READ
-+            pos = dictionaryPos - rep0;
-+            if (pos >= dictionarySize)
-+              pos += dictionarySize;
-+            previousByte = dictionary[pos];
-+            dictionary[dictionaryPos] = previousByte;
-+            if (++dictionaryPos == dictionarySize)
-+              dictionaryPos = 0;
-+            #else
-+            previousByte = outStream[nowPos - rep0];
-+            #endif
-+            outStream[nowPos++] = previousByte;
-+            continue;
-+          }
-+        }
-+        else
-+        {
-+          UInt32 distance;
-+          if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)
-+            distance = rep1;
-+          else
-+          {
-+            if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)
-+              distance = rep2;
-+            else
-+            {
-+              distance = rep3;
-+              rep3 = rep2;
-+            }
-+            rep2 = rep1;
-+          }
-+          rep1 = rep0;
-+          rep0 = distance;
-+        }
-+        len = LzmaLenDecode(p + RepLenCoder, &rd, posState);
-+        state = state < 7 ? 8 : 11;
-+      }
-+      else
-+      {
-+        int posSlot;
-+        rep3 = rep2;
-+        rep2 = rep1;
-+        rep1 = rep0;
-+        state = state < 7 ? 7 : 10;
-+        len = LzmaLenDecode(p + LenCoder, &rd, posState);
-+        posSlot = RangeDecoderBitTreeDecode(p + PosSlot +
-+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-+            kNumPosSlotBits), kNumPosSlotBits, &rd);
-+        if (posSlot >= kStartPosModelIndex)
-+        {
-+          int numDirectBits = ((posSlot >> 1) - 1);
-+          rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits);
-+          if (posSlot < kEndPosModelIndex)
-+          {
-+            rep0 += RangeDecoderReverseBitTreeDecode(
-+                p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd);
-+          }
-+          else
-+          {
-+            rep0 += RangeDecoderDecodeDirectBits(&rd,
-+                numDirectBits - kNumAlignBits) << kNumAlignBits;
-+            rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);
-+          }
-+        }
-+        else
-+          rep0 = posSlot;
-+        rep0++;
-+      }
-+      if (rep0 == (UInt32)(0))
-+      {
-+        /* it's for stream version */
-+        len = -1;
-+        break;
-+      }
-+      if (rep0 > nowPos
-+        #ifdef _LZMA_OUT_READ
-+        + globalPos
-+        #endif
-+        )
-+      {
-+        return LZMA_RESULT_DATA_ERROR;
-+      }
-+      len += kMatchMinLen;
-+      do
-+      {
-+        #ifdef _LZMA_OUT_READ
-+        UInt32 pos = dictionaryPos - rep0;
-+        if (pos >= dictionarySize)
-+          pos += dictionarySize;
-+        previousByte = dictionary[pos];
-+        dictionary[dictionaryPos] = previousByte;
-+        if (++dictionaryPos == dictionarySize)
-+          dictionaryPos = 0;
-+        #else
-+        previousByte = outStream[nowPos - rep0];
-+        #endif
-+        outStream[nowPos++] = previousByte;
-+        len--;
-+      }
-+      while(len > 0 && nowPos < outSize);
-+    }
-+  }
-+
-+  #ifdef _LZMA_OUT_READ
-+  vs->RangeDecoder = rd;
-+  vs->DictionaryPos = dictionaryPos;
-+  vs->GlobalPos = globalPos + nowPos;
-+  vs->Reps[0] = rep0;
-+  vs->Reps[1] = rep1;
-+  vs->Reps[2] = rep2;
-+  vs->Reps[3] = rep3;
-+  vs->State = state;
-+  vs->PreviousIsMatch = previousIsMatch;
-+  vs->RemainLen = len;
-+  #endif
-+
-+  *outSizeProcessed = nowPos;
-+  return LZMA_RESULT_OK;
-+}
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -14,7 +14,7 @@ lib-$(CONFIG_SMP) += cpumask.o
- lib-y += kobject.o kref.o klist.o
- obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
--       bust_spinlocks.o hexdump.o kasprintf.o bitmap.o
-+       bust_spinlocks.o hexdump.o kasprintf.o bitmap.o LzmaDecode.o
- ifeq ($(CONFIG_DEBUG_KOBJECT),y)
- CFLAGS_kobject.o += -DDEBUG
-@@ -64,6 +64,7 @@ obj-$(CONFIG_SMP) += percpu_counter.o
- obj-$(CONFIG_AUDIT_GENERIC) += audit.o
- obj-$(CONFIG_SWIOTLB) += swiotlb.o
-+
- obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o
- lib-$(CONFIG_GENERIC_BUG) += bug.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/003-squashfs_lzma.patch b/target/linux/generic-2.6/patches-2.6.24/003-squashfs_lzma.patch
deleted file mode 100644 (file)
index 9050e37..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -4,6 +4,9 @@
-  * Copyright (c) 2002, 2003, 2004, 2005, 2006
-  * Phillip Lougher <phillip@lougher.org.uk>
-  *
-+ * LZMA decompressor support added by Oleg I. Vdovikin
-+ * Copyright (c) 2005 Oleg I.Vdovikin <oleg@cs.msu.su>
-+ *
-  * This 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,
-@@ -21,6 +24,7 @@
-  * inode.c
-  */
-+#define SQUASHFS_LZMA
- #include <linux/types.h>
- #include <linux/squashfs_fs.h>
- #include <linux/module.h>
-@@ -44,6 +48,19 @@
- #include "squashfs.h"
-+#ifdef SQUASHFS_LZMA
-+#include <linux/LzmaDecode.h>
-+
-+/* default LZMA settings, should be in sync with mksquashfs */
-+#define LZMA_LC 3
-+#define LZMA_LP 0
-+#define LZMA_PB 2
-+
-+#define LZMA_WORKSPACE_SIZE ((LZMA_BASE_SIZE + \
-+      (LZMA_LIT_SIZE << (LZMA_LC + LZMA_LP))) * sizeof(CProb))
-+
-+#endif
-+
- static void squashfs_put_super(struct super_block *);
- static int squashfs_statfs(struct dentry *, struct kstatfs *);
- static int squashfs_symlink_readpage(struct file *file, struct page *page);
-@@ -64,7 +81,11 @@ static int squashfs_get_sb(struct file_s
-                       const char *, void *, struct vfsmount *);
-+#ifdef SQUASHFS_LZMA
-+static unsigned char lzma_workspace[LZMA_WORKSPACE_SIZE];
-+#else
- static z_stream stream;
-+#endif
- static struct file_system_type squashfs_fs_type = {
-       .owner = THIS_MODULE,
-@@ -249,6 +270,15 @@ SQSH_EXTERN unsigned int squashfs_read_d
-       if (compressed) {
-               int zlib_err;
-+#ifdef SQUASHFS_LZMA
-+              if ((zlib_err = LzmaDecode(lzma_workspace,
-+                      LZMA_WORKSPACE_SIZE, LZMA_LC, LZMA_LP, LZMA_PB,
-+                      c_buffer, c_byte, buffer, msblk->read_size, &bytes)) != LZMA_RESULT_OK)
-+              {
-+                      ERROR("lzma returned unexpected result 0x%x\n", zlib_err);
-+                      bytes = 0;
-+              }
-+#else
-               stream.next_in = c_buffer;
-               stream.avail_in = c_byte;
-               stream.next_out = buffer;
-@@ -263,7 +293,7 @@ SQSH_EXTERN unsigned int squashfs_read_d
-                       bytes = 0;
-               } else
-                       bytes = stream.total_out;
--
-+#endif
-               up(&msblk->read_data_mutex);
-       }
-@@ -2045,15 +2075,19 @@ static int __init init_squashfs_fs(void)
-       printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-               "Phillip Lougher\n");
-+#ifndef SQUASHFS_LZMA
-       if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-               ERROR("Failed to allocate zlib workspace\n");
-               destroy_inodecache();
-               err = -ENOMEM;
-               goto out;
-       }
-+#endif
-       if ((err = register_filesystem(&squashfs_fs_type))) {
-+#ifndef SQUASHFS_LZMA
-               vfree(stream.workspace);
-+#endif
-               destroy_inodecache();
-       }
-@@ -2064,7 +2098,9 @@ out:
- static void __exit exit_squashfs_fs(void)
- {
-+#ifndef SQUASHFS_LZMA
-       vfree(stream.workspace);
-+#endif
-       unregister_filesystem(&squashfs_fs_type);
-       destroy_inodecache();
- }
diff --git a/target/linux/generic-2.6/patches-2.6.24/004-extra_optimization.patch b/target/linux/generic-2.6/patches-2.6.24/004-extra_optimization.patch
deleted file mode 100644 (file)
index 9167a7b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/Makefile
-+++ b/Makefile
-@@ -527,6 +527,9 @@ KBUILD_CFLAGS         += $(call cc-optio
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS     += $(NOSTDINC_FLAGS)
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
diff --git a/target/linux/generic-2.6/patches-2.6.24/005-squashfs_fix.patch b/target/linux/generic-2.6/patches-2.6.24/005-squashfs_fix.patch
deleted file mode 100644 (file)
index 56b7fc2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -33,6 +33,7 @@
- #include <linux/fs.h>
- #include <linux/smp_lock.h>
- #include <linux/slab.h>
-+#include <linux/exportfs.h>
- #include <linux/squashfs_fs_sb.h>
- #include <linux/squashfs_fs_i.h>
- #include <linux/buffer_head.h>
-@@ -2125,7 +2126,7 @@ static void squashfs_destroy_inode(struc
- }
--static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
-+static void init_once(struct kmem_cache * cachep, void *foo)
- {
-       struct squashfs_inode_info *ei = foo;
diff --git a/target/linux/generic-2.6/patches-2.6.24/006-gcc4_inline_fix.patch b/target/linux/generic-2.6/patches-2.6.24/006-gcc4_inline_fix.patch
deleted file mode 100644 (file)
index cd62e9c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/include/asm-mips/system.h
-+++ b/include/asm-mips/system.h
-@@ -185,7 +185,7 @@ extern __u64 __xchg_u64_unsupported_on_3
-    if something tries to do an invalid xchg().  */
- extern void __xchg_called_with_bad_pointer(void);
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
-       switch (size) {
-       case 4:
diff --git a/target/linux/generic-2.6/patches-2.6.24/007-samsung_flash.patch b/target/linux/generic-2.6/patches-2.6.24/007-samsung_flash.patch
deleted file mode 100644 (file)
index 1d679e0..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B           0x0050
- #define SST49LF008A           0x005a
- #define AT49BV6416            0x00d6
-+#define MANUFACTURER_SAMSUNG  0x00ec
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -294,12 +295,19 @@ struct mtd_info *cfi_cmdset_0002(struct 
-               if (extp->MajorVersion != '1' ||
-                   (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
--                      printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
--                             "version %c.%c.\n",  extp->MajorVersion,
--                             extp->MinorVersion);
--                      kfree(extp);
--                      kfree(mtd);
--                      return NULL;
-+                      if (cfi->mfr == MANUFACTURER_SAMSUNG &&
-+                          (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
-+                          printk(KERN_NOTICE "  Newer Samsung flash detected, "
-+                                 "should be compatibile with Amd/Fujitsu.\n");
-+                      }
-+                      else {
-+                          printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
-+                                 "version %c.%c.\n",  extp->MajorVersion,
-+                                 extp->MinorVersion);
-+                          kfree(extp);
-+                          kfree(mtd);
-+                          return NULL;
-+                      }
-               }
-               /* Install our own private info structure */
diff --git a/target/linux/generic-2.6/patches-2.6.24/009-revert_intel_flash_breakage.patch b/target/linux/generic-2.6/patches-2.6.24/009-revert_intel_flash_breakage.patch
deleted file mode 100644 (file)
index 0237dca..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
---- a/drivers/mtd/chips/cfi_cmdset_0001.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
-@@ -944,7 +944,7 @@ static void __xipram xip_enable(struct m
- static int __xipram xip_wait_for_operation(
-               struct map_info *map, struct flchip *chip,
--              unsigned long adr, unsigned int chip_op_time )
-+              unsigned long adr, int *chip_op_time )
- {
-       struct cfi_private *cfi = map->fldrv_priv;
-       struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
-@@ -953,7 +953,7 @@ static int __xipram xip_wait_for_operati
-       flstate_t oldstate, newstate;
-               start = xip_currtime();
--      usec = chip_op_time * 8;
-+      usec = *chip_op_time * 8;
-       if (usec == 0)
-               usec = 500000;
-       done = 0;
-@@ -1063,8 +1063,8 @@ static int __xipram xip_wait_for_operati
- #define XIP_INVAL_CACHED_RANGE(map, from, size)  \
-       INVALIDATE_CACHED_RANGE(map, from, size)
--#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec) \
--      xip_wait_for_operation(map, chip, cmd_adr, usec)
-+#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, p_usec) \
-+      xip_wait_for_operation(map, chip, cmd_adr, p_usec)
- #else
-@@ -1076,65 +1076,65 @@ static int __xipram xip_wait_for_operati
- static int inval_cache_and_wait_for_operation(
-               struct map_info *map, struct flchip *chip,
-               unsigned long cmd_adr, unsigned long inval_adr, int inval_len,
--              unsigned int chip_op_time)
-+              int *chip_op_time )
- {
-       struct cfi_private *cfi = map->fldrv_priv;
-       map_word status, status_OK = CMD(0x80);
--      int chip_state = chip->state;
--      unsigned int timeo, sleep_time;
-+      int z, chip_state = chip->state;
-+      unsigned long timeo;
-       spin_unlock(chip->mutex);
-       if (inval_len)
-               INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len);
-+      if (*chip_op_time)
-+              cfi_udelay(*chip_op_time);
-       spin_lock(chip->mutex);
--      /* set our timeout to 8 times the expected delay */
--      timeo = chip_op_time * 8;
--      if (!timeo)
--              timeo = 500000;
--      sleep_time = chip_op_time / 2;
-+      timeo = *chip_op_time * 8 * HZ / 1000000;
-+      if (timeo < HZ/2)
-+              timeo = HZ/2;
-+      timeo += jiffies;
-+      z = 0;
-       for (;;) {
-+              if (chip->state != chip_state) {
-+                      /* Someone's suspended the operation: sleep */
-+                      DECLARE_WAITQUEUE(wait, current);
-+
-+                      set_current_state(TASK_UNINTERRUPTIBLE);
-+                      add_wait_queue(&chip->wq, &wait);
-+                      spin_unlock(chip->mutex);
-+                      schedule();
-+                      remove_wait_queue(&chip->wq, &wait);
-+                      timeo = jiffies + (HZ / 2); /* FIXME */
-+                      spin_lock(chip->mutex);
-+                      continue;
-+              }
-+
-               status = map_read(map, cmd_adr);
-               if (map_word_andequal(map, status, status_OK, status_OK))
-                       break;
--              if (!timeo) {
-+              /* OK Still waiting */
-+              if (time_after(jiffies, timeo)) {
-                       map_write(map, CMD(0x70), cmd_adr);
-                       chip->state = FL_STATUS;
-                       return -ETIME;
-               }
--              /* OK Still waiting. Drop the lock, wait a while and retry. */
-+              /* Latency issues. Drop the lock, wait a while and retry */
-+              z++;
-               spin_unlock(chip->mutex);
--              if (sleep_time >= 1000000/HZ) {
--                      /*
--                       * Half of the normal delay still remaining
--                       * can be performed with a sleeping delay instead
--                       * of busy waiting.
--                       */
--                      msleep(sleep_time/1000);
--                      timeo -= sleep_time;
--                      sleep_time = 1000000/HZ;
--              } else {
--                      udelay(1);
--                      cond_resched();
--                      timeo--;
--              }
-+              cfi_udelay(1);
-               spin_lock(chip->mutex);
--
--              while (chip->state != chip_state) {
--                      /* Someone's suspended the operation: sleep */
--                      DECLARE_WAITQUEUE(wait, current);
--                      set_current_state(TASK_UNINTERRUPTIBLE);
--                      add_wait_queue(&chip->wq, &wait);
--                      spin_unlock(chip->mutex);
--                      schedule();
--                      remove_wait_queue(&chip->wq, &wait);
--                      spin_lock(chip->mutex);
--              }
-       }
-+      if (!z) {
-+              if (!--(*chip_op_time))
-+                      *chip_op_time = 1;
-+      } else if (z > 1)
-+              ++(*chip_op_time);
-+
-       /* Done and happy. */
-       chip->state = FL_STATUS;
-       return 0;
-@@ -1143,7 +1143,8 @@ static int inval_cache_and_wait_for_oper
- #endif
- #define WAIT_TIMEOUT(map, chip, adr, udelay) \
--      INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay);
-+      ({ int __udelay = (udelay); \
-+         INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, &__udelay); })
- static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len)
-@@ -1374,7 +1375,7 @@ static int __xipram do_write_oneword(str
-       ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
-                                  adr, map_bankwidth(map),
--                                 chip->word_write_time);
-+                                 &chip->word_write_time);
-       if (ret) {
-               xip_enable(map, chip, adr);
-               printk(KERN_ERR "%s: word write error (status timeout)\n", map->name);
-@@ -1614,7 +1615,7 @@ static int __xipram do_write_buffer(stru
-       ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
-                                  initial_adr, initial_len,
--                                 chip->buffer_write_time);
-+                                 &chip->buffer_write_time);
-       if (ret) {
-               map_write(map, CMD(0x70), cmd_adr);
-               chip->state = FL_STATUS;
-@@ -1749,7 +1750,7 @@ static int __xipram do_erase_oneblock(st
-       ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
-                                  adr, len,
--                                 chip->erase_time);
-+                                 &chip->erase_time);
-       if (ret) {
-               map_write(map, CMD(0x70), adr);
-               chip->state = FL_STATUS;
diff --git a/target/linux/generic-2.6/patches-2.6.24/010-disable_old_squashfs_compatibility.patch b/target/linux/generic-2.6/patches-2.6.24/010-disable_old_squashfs_compatibility.patch
deleted file mode 100644 (file)
index 01e2757..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,3 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += inode.o
--squashfs-y += squashfs2_0.o
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -24,6 +24,9 @@
- #ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
- #undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
- #endif
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
- #ifdef SQUASHFS_TRACE
- #define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
diff --git a/target/linux/generic-2.6/patches-2.6.24/011-mips_boot.patch b/target/linux/generic-2.6/patches-2.6.24/011-mips_boot.patch
deleted file mode 100644 (file)
index 4eba909..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -120,6 +120,8 @@
- #endif
-       .endm
-+      j kernel_entry
-+      nop
- #ifndef CONFIG_NO_EXCEPT_FILL
-       /*
-        * Reserved space for exception handlers.
diff --git a/target/linux/generic-2.6/patches-2.6.24/012-mips_cpu_tlb.patch b/target/linux/generic-2.6/patches-2.6.24/012-mips_cpu_tlb.patch
deleted file mode 100644 (file)
index 0b07c30..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/arch/mips/mm/tlbex.c
-+++ b/arch/mips/mm/tlbex.c
-@@ -902,7 +902,6 @@ static __init void build_tlb_write_entry
-       case CPU_R10000:
-       case CPU_R12000:
-       case CPU_R14000:
--      case CPU_4KC:
-       case CPU_SB1:
-       case CPU_SB1A:
-       case CPU_4KSC:
-@@ -935,6 +934,7 @@ static __init void build_tlb_write_entry
-               tlbw(p);
-               break;
-+      case CPU_4KC:
-       case CPU_4KEC:
-       case CPU_24K:
-       case CPU_34K:
diff --git a/target/linux/generic-2.6/patches-2.6.24/013-mips_gdb_stub.patch b/target/linux/generic-2.6/patches-2.6.24/013-mips_gdb_stub.patch
deleted file mode 100644 (file)
index 877fe9b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/arch/mips/kernel/gdb-stub.c
-+++ b/arch/mips/kernel/gdb-stub.c
-@@ -656,6 +656,7 @@ void set_async_breakpoint(unsigned long 
-       *epc = (unsigned long)async_breakpoint;
- }
-+#ifdef CONFIG_SMP
- static void kgdb_wait(void *arg)
- {
-       unsigned flags;
-@@ -668,6 +669,7 @@ static void kgdb_wait(void *arg)
-       local_irq_restore(flags);
- }
-+#endif
- /*
-  * GDB stub needs to call kgdb_wait on all processor with interrupts
diff --git a/target/linux/generic-2.6/patches-2.6.24/060-block2mtd_init.patch b/target/linux/generic-2.6/patches-2.6.24/060-block2mtd_init.patch
deleted file mode 100644 (file)
index f5d9b0c..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -16,6 +16,7 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
- #include <linux/buffer_head.h>
- #include <linux/mutex.h>
- #include <linux/mount.h>
-@@ -237,10 +238,11 @@ static void block2mtd_free_device(struct
- /* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size)
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
- {
-       struct block_device *bdev;
-       struct block2mtd_dev *dev;
-+      struct mtd_partition *part;
-       if (!devname)
-               return NULL;
-@@ -279,14 +281,18 @@ static struct block2mtd_dev *add_device(
-       /* Setup the MTD structure */
-       /* make the name contain the block device in */
--      dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname),
--                      GFP_KERNEL);
-+
-+      if (!mtdname)
-+              mtdname = devname;
-+
-+      dev->mtd.name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
-+
-       if (!dev->mtd.name)
-               goto devinit_err;
-+      
-+      strcpy(dev->mtd.name, mtdname);
--      sprintf(dev->mtd.name, "block2mtd: %s", devname);
--
--      dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
-+      dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
-       dev->mtd.erasesize = erase_size;
-       dev->mtd.writesize = 1;
-       dev->mtd.type = MTD_RAM;
-@@ -298,15 +304,18 @@ static struct block2mtd_dev *add_device(
-       dev->mtd.read = block2mtd_read;
-       dev->mtd.priv = dev;
-       dev->mtd.owner = THIS_MODULE;
--
--      if (add_mtd_device(&dev->mtd)) {
-+      
-+      part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+      part->name = dev->mtd.name;
-+      part->offset = 0;
-+      part->size = dev->mtd.size;
-+      if (add_mtd_partitions(&dev->mtd, part, 1)) {
-               /* Device didnt get added, so free the entry */
-               goto devinit_err;
-       }
-       list_add(&dev->list, &blkmtd_device_list);
-       INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
--                      dev->mtd.name + strlen("blkmtd: "),
--                      dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-+                      mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-       return dev;
- devinit_err:
-@@ -379,9 +388,9 @@ static char block2mtd_paramline[80 + 12]
- static int block2mtd_setup2(const char *val)
- {
--      char buf[80 + 12]; /* 80 for device, 12 for erase size */
-+      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
-       char *str = buf;
--      char *token[2];
-+      char *token[3];
-       char *name;
-       size_t erase_size = PAGE_SIZE;
-       int i, ret;
-@@ -392,7 +401,7 @@ static int block2mtd_setup2(const char *
-       strcpy(str, val);
-       kill_final_newline(str);
--      for (i = 0; i < 2; i++)
-+      for (i = 0; i < 3; i++)
-               token[i] = strsep(&str, ",");
-       if (str)
-@@ -411,8 +420,10 @@ static int block2mtd_setup2(const char *
-                       parse_err("illegal erase size");
-               }
-       }
-+      if (token[2] && (strlen(token[2]) + 1 > 80))
-+              parse_err("mtd device name too long");
--      add_device(name, erase_size);
-+      add_device(name, erase_size, token[2]);
-       return 0;
- }
-@@ -446,7 +457,7 @@ static int block2mtd_setup(const char *v
- module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
-+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
- static int __init block2mtd_init(void)
- {
diff --git a/target/linux/generic-2.6/patches-2.6.24/065-rootfs_split.patch b/target/linux/generic-2.6/patches-2.6.24/065-rootfs_split.patch
deleted file mode 100644 (file)
index 6916e06..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -47,6 +47,16 @@ config MTD_PARTITIONS
-         devices. Partitioning on NFTL 'devices' is a different - that's the
-         'normal' form of partitioning used on a block device.
-+config MTD_ROOTFS_ROOT_DEV
-+      bool "Automatically set 'rootfs' partition to be root filesystem"
-+      depends on MTD_PARTITIONS
-+      default y
-+
-+config MTD_ROOTFS_SPLIT
-+      bool "Automatically split 'rootfs' partition for squashfs"
-+      depends on MTD_PARTITIONS
-+      default y
-+
- config MTD_REDBOOT_PARTS
-       tristate "RedBoot partition table parsing"
-       depends on MTD_PARTITIONS
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -20,6 +20,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/root_dev.h>
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -39,7 +41,7 @@ struct mtd_part {
-  * the pointer to that structure with this macro.
-  */
- #define PART(x)  ((struct mtd_part *)(x))
--
-+#define IS_PART(mtd) (mtd->read == part_read)
- /*
-  * MTD methods which simply translate the effective address and pass through
-@@ -308,6 +310,312 @@ int del_mtd_partitions(struct mtd_info *
-       return 0;
- }
-+static u_int32_t cur_offset = 0;
-+static int add_one_partition(struct mtd_info *master, const struct mtd_partition *part,
-+              int i, struct mtd_part **slp)
-+{
-+      struct mtd_part *slave;
-+
-+      /* allocate the partition structure */
-+      slave = kzalloc (sizeof(*slave), GFP_KERNEL);
-+      if (!slave) {
-+              printk ("memory allocation error while creating partitions for \"%s\"\n",
-+                      master->name);
-+              del_mtd_partitions(master);
-+              return -ENOMEM;
-+      }
-+      list_add(&slave->list, &mtd_partitions);
-+
-+      /* set up the MTD object for this partition */
-+      slave->mtd.type = master->type;
-+      slave->mtd.flags = master->flags & ~part->mask_flags;
-+      slave->mtd.size = part->size;
-+      slave->mtd.writesize = master->writesize;
-+      slave->mtd.oobsize = master->oobsize;
-+      slave->mtd.oobavail = master->oobavail;
-+      slave->mtd.subpage_sft = master->subpage_sft;
-+
-+      slave->mtd.name = part->name;
-+      slave->mtd.owner = master->owner;
-+
-+      slave->mtd.read = part_read;
-+      slave->mtd.write = part_write;
-+      slave->mtd.refresh_device = part->refresh_partition;
-+
-+      if(master->point && master->unpoint){
-+              slave->mtd.point = part_point;
-+              slave->mtd.unpoint = part_unpoint;
-+      }
-+
-+      if (master->read_oob)
-+              slave->mtd.read_oob = part_read_oob;
-+      if (master->write_oob)
-+              slave->mtd.write_oob = part_write_oob;
-+      if(master->read_user_prot_reg)
-+              slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
-+      if(master->read_fact_prot_reg)
-+              slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
-+      if(master->write_user_prot_reg)
-+              slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
-+      if(master->lock_user_prot_reg)
-+              slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
-+      if(master->get_user_prot_info)
-+              slave->mtd.get_user_prot_info = part_get_user_prot_info;
-+      if(master->get_fact_prot_info)
-+              slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
-+      if (master->sync)
-+              slave->mtd.sync = part_sync;
-+      if (!i && master->suspend && master->resume) {
-+                      slave->mtd.suspend = part_suspend;
-+                      slave->mtd.resume = part_resume;
-+      }
-+      if (master->writev)
-+              slave->mtd.writev = part_writev;
-+      if (master->lock)
-+              slave->mtd.lock = part_lock;
-+      if (master->unlock)
-+              slave->mtd.unlock = part_unlock;
-+      if (master->block_isbad)
-+              slave->mtd.block_isbad = part_block_isbad;
-+      if (master->block_markbad)
-+              slave->mtd.block_markbad = part_block_markbad;
-+      slave->mtd.erase = part_erase;
-+      slave->master = master;
-+      slave->offset = part->offset;
-+      slave->index = i;
-+
-+      if (slave->offset == MTDPART_OFS_APPEND)
-+              slave->offset = cur_offset;
-+      if (slave->offset == MTDPART_OFS_NXTBLK) {
-+              slave->offset = cur_offset;
-+              if ((cur_offset % master->erasesize) != 0) {
-+                      /* Round up to next erasesize */
-+                      slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize;
-+                      printk(KERN_NOTICE "Moving partition %d: "
-+                             "0x%08x -> 0x%08x\n", i,
-+                             cur_offset, slave->offset);
-+              }
-+      }
-+      if (slave->mtd.size == MTDPART_SIZ_FULL)
-+              slave->mtd.size = master->size - slave->offset;
-+      cur_offset = slave->offset + slave->mtd.size;
-+
-+      printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
-+              slave->offset + slave->mtd.size, slave->mtd.name);
-+
-+      /* let's do some sanity checks */
-+      if (slave->offset >= master->size) {
-+                      /* let's register it anyway to preserve ordering */
-+              slave->offset = 0;
-+              slave->mtd.size = 0;
-+              printk ("mtd: partition \"%s\" is out of reach -- disabled\n",
-+                      part->name);
-+      }
-+      if (slave->offset + slave->mtd.size > master->size) {
-+              slave->mtd.size = master->size - slave->offset;
-+              printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n",
-+                      part->name, master->name, slave->mtd.size);
-+      }
-+      if (master->numeraseregions>1) {
-+              /* Deal with variable erase size stuff */
-+              int i;
-+              struct mtd_erase_region_info *regions = master->eraseregions;
-+
-+              /* Find the first erase regions which is part of this partition. */
-+              for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++)
-+                      ;
-+
-+              for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) {
-+                      if (slave->mtd.erasesize < regions[i].erasesize) {
-+                              slave->mtd.erasesize = regions[i].erasesize;
-+                      }
-+              }
-+      } else {
-+              /* Single erase size */
-+              slave->mtd.erasesize = master->erasesize;
-+      }
-+
-+      if ((slave->mtd.flags & MTD_WRITEABLE) &&
-+          (slave->offset % slave->mtd.erasesize)) {
-+              /* Doesn't start on a boundary of major erase size */
-+              /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */
-+              slave->mtd.flags &= ~MTD_WRITEABLE;
-+              printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-+                      part->name);
-+      }
-+      if ((slave->mtd.flags & MTD_WRITEABLE) &&
-+          (slave->mtd.size % slave->mtd.erasesize)) {
-+              slave->mtd.flags &= ~MTD_WRITEABLE;
-+              printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-+                      part->name);
-+      }
-+
-+      slave->mtd.ecclayout = master->ecclayout;
-+      if (master->block_isbad) {
-+              uint32_t offs = 0;
-+
-+              while(offs < slave->mtd.size) {
-+                      if (master->block_isbad(master,
-+                                              offs + slave->offset))
-+                              slave->mtd.ecc_stats.badblocks++;
-+                      offs += slave->mtd.erasesize;
-+              }
-+      }
-+
-+      if(part->mtdp)
-+      {       /* store the object pointer (caller may or may not register it */
-+              *part->mtdp = &slave->mtd;
-+              slave->registered = 0;
-+      }
-+      else
-+      {
-+              /* register our partition */
-+              add_mtd_device(&slave->mtd);
-+              slave->registered = 1;
-+      }
-+
-+      if (slp)
-+              *slp = slave;
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+#define ROOTFS_REMOVED_NAME "<removed>"
-+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
-+{
-+      char buf[512];
-+      struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
-+      int len, ret;
-+
-+      ret = master->read(master, offset, sizeof(*sb), &len, buf);
-+      if (ret || (len != sizeof(*sb))) {
-+              printk(KERN_ALERT "split_squashfs: error occured while reading "
-+                      "from \"%s\"\n", master->name);
-+              return -EINVAL;
-+      }
-+
-+      if (*((u32 *) buf) != SQUASHFS_MAGIC) {
-+              printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
-+                      master->name);
-+              *split_offset = 0;
-+              return 0;
-+      }
-+
-+      if (sb->bytes_used <= 0) {
-+              printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
-+                      master->name);
-+              *split_offset = 0;
-+              return 0;
-+      }
-+
-+      len = (u32) sb->bytes_used;
-+      len += (offset & 0x000fffff);
-+      len +=  (master->erasesize - 1);
-+      len &= ~(master->erasesize - 1);
-+      len -= (offset & 0x000fffff);
-+      *split_offset = offset + len;
-+
-+      return 0;
-+}
-+
-+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, struct mtd_partition *part,
-+              int index)
-+{
-+      struct mtd_partition *dpart;
-+      struct mtd_part *slave = NULL;
-+      int split_offset = 0;
-+      int ret;
-+
-+      ret = split_squashfs(master, part->offset, &split_offset);
-+      if (ret)
-+              return ret;
-+
-+      if (split_offset <= 0)
-+              return 0;
-+
-+      dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
-+      if (dpart == NULL) {
-+              printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
-+                      ROOTFS_SPLIT_NAME);
-+              return -ENOMEM;
-+      }
-+
-+      memcpy(dpart, part, sizeof(*part));
-+      dpart->name = (unsigned char *)&dpart[1];
-+      strcpy(dpart->name, ROOTFS_SPLIT_NAME);
-+
-+      dpart->size -= split_offset - dpart->offset;
-+      dpart->offset = split_offset;
-+
-+      if (dpart == NULL)
-+              return 1;
-+
-+      printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%X, len=%X \n",
-+              ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
-+
-+      ret = add_one_partition(master, dpart, index, &slave);
-+      if (ret)
-+              kfree(dpart);
-+      else if (slave)
-+              rpart->split = &slave->mtd;
-+
-+      return ret;
-+}
-+
-+static int refresh_rootfs_split(struct mtd_info *mtd)
-+{
-+      struct mtd_partition tpart;
-+      struct mtd_part *part;
-+      int index = 0;
-+      int offset, size;
-+      int ret;
-+
-+      part = PART(mtd);
-+
-+      /* check for the new squashfs offset first */
-+      ret = split_squashfs(part->master, part->offset, &offset);
-+      if (ret)
-+              return ret;
-+
-+      if ((offset > 0) && !mtd->split) {
-+              printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
-+              /* if we don't have a rootfs split partition, create a new one */
-+              tpart.name = mtd->name;
-+              tpart.size = mtd->size;
-+              tpart.offset = part->offset;
-+
-+              /* find the index of the last partition */
-+              if (!list_empty(&mtd_partitions))
-+                      index = list_first_entry(&mtd_partitions, struct mtd_part, list)->index + 1;
-+
-+              return split_rootfs_data(part->master, &part->mtd, &tpart, index);
-+      } else if ((offset > 0) && mtd->split) {
-+              /* update the offsets of the existing partition */
-+              size = mtd->size + part->offset - offset;
-+
-+              part = PART(mtd->split);
-+              part->offset = offset;
-+              part->mtd.size = size;
-+              printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
-+                      __func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
-+                      part->offset, part->mtd.size);
-+              strcpy(part->mtd.name, ROOTFS_SPLIT_NAME);
-+      } else if ((offset <= 0) && mtd->split) {
-+              printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
-+
-+              /* mark existing partition as removed */
-+              part = PART(mtd->split);
-+              strcpy(part->mtd.name, ROOTFS_REMOVED_NAME);
-+              part->offset = 0;
-+              part->mtd.size = 0;
-+      }
-+
-+      return 0;
-+}
-+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
-+
- /*
-  * This function, given a master MTD object and a partition table, creates
-  * and registers slave MTD objects which are bound to the master according to
-@@ -320,168 +628,31 @@ int add_mtd_partitions(struct mtd_info *
-                      int nbparts)
- {
-       struct mtd_part *slave;
--      u_int32_t cur_offset = 0;
--      int i;
-+      struct mtd_partition *part;
-+      int i, j, ret = 0;
-       printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
--      for (i = 0; i < nbparts; i++) {
--
--              /* allocate the partition structure */
--              slave = kzalloc (sizeof(*slave), GFP_KERNEL);
--              if (!slave) {
--                      printk ("memory allocation error while creating partitions for \"%s\"\n",
--                              master->name);
--                      del_mtd_partitions(master);
--                      return -ENOMEM;
--              }
--              list_add(&slave->list, &mtd_partitions);
--
--              /* set up the MTD object for this partition */
--              slave->mtd.type = master->type;
--              slave->mtd.flags = master->flags & ~parts[i].mask_flags;
--              slave->mtd.size = parts[i].size;
--              slave->mtd.writesize = master->writesize;
--              slave->mtd.oobsize = master->oobsize;
--              slave->mtd.oobavail = master->oobavail;
--              slave->mtd.subpage_sft = master->subpage_sft;
--
--              slave->mtd.name = parts[i].name;
--              slave->mtd.owner = master->owner;
--
--              slave->mtd.read = part_read;
--              slave->mtd.write = part_write;
--
--              if(master->point && master->unpoint){
--                      slave->mtd.point = part_point;
--                      slave->mtd.unpoint = part_unpoint;
--              }
--
--              if (master->read_oob)
--                      slave->mtd.read_oob = part_read_oob;
--              if (master->write_oob)
--                      slave->mtd.write_oob = part_write_oob;
--              if(master->read_user_prot_reg)
--                      slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
--              if(master->read_fact_prot_reg)
--                      slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
--              if(master->write_user_prot_reg)
--                      slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
--              if(master->lock_user_prot_reg)
--                      slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
--              if(master->get_user_prot_info)
--                      slave->mtd.get_user_prot_info = part_get_user_prot_info;
--              if(master->get_fact_prot_info)
--                      slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
--              if (master->sync)
--                      slave->mtd.sync = part_sync;
--              if (!i && master->suspend && master->resume) {
--                              slave->mtd.suspend = part_suspend;
--                              slave->mtd.resume = part_resume;
--              }
--              if (master->writev)
--                      slave->mtd.writev = part_writev;
--              if (master->lock)
--                      slave->mtd.lock = part_lock;
--              if (master->unlock)
--                      slave->mtd.unlock = part_unlock;
--              if (master->block_isbad)
--                      slave->mtd.block_isbad = part_block_isbad;
--              if (master->block_markbad)
--                      slave->mtd.block_markbad = part_block_markbad;
--              slave->mtd.erase = part_erase;
--              slave->master = master;
--              slave->offset = parts[i].offset;
--              slave->index = i;
--
--              if (slave->offset == MTDPART_OFS_APPEND)
--                      slave->offset = cur_offset;
--              if (slave->offset == MTDPART_OFS_NXTBLK) {
--                      slave->offset = cur_offset;
--                      if ((cur_offset % master->erasesize) != 0) {
--                              /* Round up to next erasesize */
--                              slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize;
--                              printk(KERN_NOTICE "Moving partition %d: "
--                                     "0x%08x -> 0x%08x\n", i,
--                                     cur_offset, slave->offset);
--                      }
--              }
--              if (slave->mtd.size == MTDPART_SIZ_FULL)
--                      slave->mtd.size = master->size - slave->offset;
--              cur_offset = slave->offset + slave->mtd.size;
--
--              printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
--                      slave->offset + slave->mtd.size, slave->mtd.name);
--
--              /* let's do some sanity checks */
--              if (slave->offset >= master->size) {
--                              /* let's register it anyway to preserve ordering */
--                      slave->offset = 0;
--                      slave->mtd.size = 0;
--                      printk ("mtd: partition \"%s\" is out of reach -- disabled\n",
--                              parts[i].name);
--              }
--              if (slave->offset + slave->mtd.size > master->size) {
--                      slave->mtd.size = master->size - slave->offset;
--                      printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n",
--                              parts[i].name, master->name, slave->mtd.size);
--              }
--              if (master->numeraseregions>1) {
--                      /* Deal with variable erase size stuff */
--                      int i;
--                      struct mtd_erase_region_info *regions = master->eraseregions;
--
--                      /* Find the first erase regions which is part of this partition. */
--                      for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++)
--                              ;
--
--                      for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) {
--                              if (slave->mtd.erasesize < regions[i].erasesize) {
--                                      slave->mtd.erasesize = regions[i].erasesize;
--                              }
-+      for (i = 0, j = 0; i < nbparts; i++) {
-+              part = (struct mtd_partition *) &parts[i];
-+              ret = add_one_partition(master, part, j, &slave);
-+              if (ret)
-+                      return ret;
-+              j++;
-+
-+              if (strcmp(part->name, "rootfs") == 0 && slave->registered) {
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+                      if (ROOT_DEV == 0) {
-+                              printk(KERN_NOTICE "mtd: partition \"rootfs\" "
-+                                      "set to be root filesystem\n");
-+                              ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
-                       }
--              } else {
--                      /* Single erase size */
--                      slave->mtd.erasesize = master->erasesize;
--              }
--
--              if ((slave->mtd.flags & MTD_WRITEABLE) &&
--                  (slave->offset % slave->mtd.erasesize)) {
--                      /* Doesn't start on a boundary of major erase size */
--                      /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */
--                      slave->mtd.flags &= ~MTD_WRITEABLE;
--                      printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
--                              parts[i].name);
--              }
--              if ((slave->mtd.flags & MTD_WRITEABLE) &&
--                  (slave->mtd.size % slave->mtd.erasesize)) {
--                      slave->mtd.flags &= ~MTD_WRITEABLE;
--                      printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
--                              parts[i].name);
--              }
--
--              slave->mtd.ecclayout = master->ecclayout;
--              if (master->block_isbad) {
--                      uint32_t offs = 0;
--
--                      while(offs < slave->mtd.size) {
--                              if (master->block_isbad(master,
--                                                      offs + slave->offset))
--                                      slave->mtd.ecc_stats.badblocks++;
--                              offs += slave->mtd.erasesize;
--                      }
--              }
--
--              if(parts[i].mtdp)
--              {       /* store the object pointer (caller may or may not register it */
--                      *parts[i].mtdp = &slave->mtd;
--                      slave->registered = 0;
--              }
--              else
--              {
--                      /* register our partition */
--                      add_mtd_device(&slave->mtd);
--                      slave->registered = 1;
-+#endif
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+                      ret = split_rootfs_data(master, &slave->mtd, part, j);
-+                      if (ret == 0)
-+                              j++;
-+#endif
-               }
-       }
-@@ -557,6 +728,32 @@ int parse_mtd_partitions(struct mtd_info
-       return ret;
- }
-+int refresh_mtd_partitions(struct mtd_info *mtd)
-+{
-+      int ret = 0;
-+
-+      if (IS_PART(mtd)) {
-+              struct mtd_part *part;
-+              struct mtd_info *master;
-+
-+              part = PART(mtd);
-+              master = part->master;
-+              if (master->refresh_device)
-+                      ret = master->refresh_device(master);
-+      }
-+
-+      if (!ret && mtd->refresh_device)
-+              ret = mtd->refresh_device(mtd);
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+      if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
-+              refresh_rootfs_split(mtd);
-+#endif
-+
-+      return 0;
-+}
-+
- EXPORT_SYMBOL_GPL(parse_mtd_partitions);
-+EXPORT_SYMBOL_GPL(refresh_mtd_partitions);
- EXPORT_SYMBOL_GPL(register_mtd_parser);
- EXPORT_SYMBOL_GPL(deregister_mtd_parser);
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -34,6 +34,8 @@ struct block2mtd_dev {
-       struct block_device *blkdev;
-       struct mtd_info mtd;
-       struct mutex write_mutex;
-+      rwlock_t bdev_mutex;
-+      char devname[0];
- };
-@@ -86,6 +88,12 @@ static int block2mtd_erase(struct mtd_in
-       size_t len = instr->len;
-       int err;
-+      read_lock(&dev->bdev_mutex);
-+      if (!dev->blkdev) {
-+              err = -EINVAL;
-+              goto done;
-+      }
-+
-       instr->state = MTD_ERASING;
-       mutex_lock(&dev->write_mutex);
-       err = _block2mtd_erase(dev, from, len);
-@@ -98,6 +106,10 @@ static int block2mtd_erase(struct mtd_in
-       instr->state = MTD_ERASE_DONE;
-       mtd_erase_callback(instr);
-+
-+done:
-+      read_unlock(&dev->bdev_mutex);
-+
-       return err;
- }
-@@ -109,10 +121,14 @@ static int block2mtd_read(struct mtd_inf
-       struct page *page;
-       int index = from >> PAGE_SHIFT;
-       int offset = from & (PAGE_SIZE-1);
--      int cpylen;
-+      int cpylen, err = 0;
-+
-+      read_lock(&dev->bdev_mutex);
-+      if (!dev->blkdev || (from > mtd->size)) {
-+              err = -EINVAL;
-+              goto done;
-+      }
--      if (from > mtd->size)
--              return -EINVAL;
-       if (from + len > mtd->size)
-               len = mtd->size - from;
-@@ -127,10 +143,14 @@ static int block2mtd_read(struct mtd_inf
-               len = len - cpylen;
-               page = page_read(dev->blkdev->bd_inode->i_mapping, index);
--              if (!page)
--                      return -ENOMEM;
--              if (IS_ERR(page))
--                      return PTR_ERR(page);
-+              if (!page) {
-+                      err = -ENOMEM;
-+                      goto done;
-+              }
-+              if (IS_ERR(page)) {
-+                      err = PTR_ERR(page);
-+                      goto done;
-+              }
-               memcpy(buf, page_address(page) + offset, cpylen);
-               page_cache_release(page);
-@@ -141,7 +161,10 @@ static int block2mtd_read(struct mtd_inf
-               offset = 0;
-               index++;
-       }
--      return 0;
-+
-+done:
-+      read_unlock(&dev->bdev_mutex);
-+      return err;
- }
-@@ -193,12 +216,22 @@ static int block2mtd_write(struct mtd_in
-               size_t *retlen, const u_char *buf)
- {
-       struct block2mtd_dev *dev = mtd->priv;
--      int err;
-+      int err = 0;
-+
-+      read_lock(&dev->bdev_mutex);
-+      if (!dev->blkdev) {
-+              err = -EINVAL;
-+              goto done;
-+      }
-       if (!len)
--              return 0;
--      if (to >= mtd->size)
--              return -ENOSPC;
-+              goto done;
-+
-+      if (to >= mtd->size) {
-+              err = -ENOSPC;
-+              goto done;
-+      }
-+
-       if (to + len > mtd->size)
-               len = mtd->size - to;
-@@ -207,6 +240,9 @@ static int block2mtd_write(struct mtd_in
-       mutex_unlock(&dev->write_mutex);
-       if (err > 0)
-               err = 0;
-+
-+done:
-+      read_unlock(&dev->bdev_mutex);
-       return err;
- }
-@@ -215,51 +251,29 @@ static int block2mtd_write(struct mtd_in
- static void block2mtd_sync(struct mtd_info *mtd)
- {
-       struct block2mtd_dev *dev = mtd->priv;
--      sync_blockdev(dev->blkdev);
--      return;
--}
--
--
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
--      if (!dev)
--              return;
--
--      kfree(dev->mtd.name);
--      if (dev->blkdev) {
--              invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
--                                      0, -1);
--              close_bdev_excl(dev->blkdev);
--      }
-+      read_lock(&dev->bdev_mutex);
-+      if (dev->blkdev)
-+              sync_blockdev(dev->blkdev);
-+      read_unlock(&dev->bdev_mutex);
--      kfree(dev);
-+      return;
- }
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+static int _open_bdev(struct block2mtd_dev *dev)
- {
-       struct block_device *bdev;
--      struct block2mtd_dev *dev;
--      struct mtd_partition *part;
--
--      if (!devname)
--              return NULL;
--
--      dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
--      if (!dev)
--              return NULL;
-       /* Get a handle on the device */
--      bdev = open_bdev_excl(devname, O_RDWR, NULL);
-+      bdev = open_bdev_excl(dev->devname, O_RDWR, NULL);
- #ifndef MODULE
-       if (IS_ERR(bdev)) {
-               /* We might not have rootfs mounted at this point. Try
-                  to resolve the device name by other means. */
--              dev_t devt = name_to_dev_t(devname);
-+              dev_t devt = name_to_dev_t(dev->devname);
-               if (devt) {
-                       bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-               }
-@@ -267,17 +281,96 @@ static struct block2mtd_dev *add_device(
- #endif
-       if (IS_ERR(bdev)) {
--              ERROR("error: cannot open device %s", devname);
--              goto devinit_err;
-+              ERROR("error: cannot open device %s", dev->devname);
-+              return 1;
-       }
-       dev->blkdev = bdev;
-       if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
-               ERROR("attempting to use an MTD device as a block device");
--              goto devinit_err;
-+              return 1;
-       }
-+      return 0;
-+}
-+
-+static void _close_bdev(struct block2mtd_dev *dev)
-+{
-+      struct block_device *bdev;
-+
-+      if (!dev->blkdev)
-+              return;
-+
-+      bdev = dev->blkdev;
-+      invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
-+      close_bdev_excl(dev->blkdev);
-+      dev->blkdev = NULL;
-+}
-+
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+      if (!dev)
-+              return;
-+
-+      kfree(dev->mtd.name);
-+      _close_bdev(dev);
-+      kfree(dev);
-+}
-+
-+
-+static int block2mtd_refresh(struct mtd_info *mtd)
-+{
-+      struct block2mtd_dev *dev = mtd->priv;
-+      struct block_device *bdev;
-+      dev_t devt;
-+      int err = 0;
-+
-+      /* no other mtd function can run at this point */
-+      write_lock(&dev->bdev_mutex);
-+
-+      /* get the device number for the whole disk */
-+      devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
-+      /* close the old block device */
-+      _close_bdev(dev);
-+
-+      /* open the whole disk, issue a partition rescan, then */
-+      bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-+      if (!bdev || !bdev->bd_disk)
-+              err = -EINVAL;
-+      else {
-+              err = rescan_partitions(bdev->bd_disk, bdev);
-+      }
-+      if (bdev)
-+              close_bdev_excl(bdev);
-+
-+      /* try to open the partition block device again */
-+      _open_bdev(dev);
-+      write_unlock(&dev->bdev_mutex);
-+
-+      return err;
-+}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+      struct block2mtd_dev *dev;
-+      struct mtd_partition *part;
-+
-+      if (!devname)
-+              return NULL;
-+
-+      dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+      if (!dev)
-+              return NULL;
-+
-+      strcpy(dev->devname, devname);
-+
-+      if (_open_bdev(dev))
-+              goto devinit_err;
-+
-       mutex_init(&dev->write_mutex);
-+      rwlock_init(&dev->bdev_mutex);
-       /* Setup the MTD structure */
-       /* make the name contain the block device in */
-@@ -304,6 +397,7 @@ static struct block2mtd_dev *add_device(
-       dev->mtd.read = block2mtd_read;
-       dev->mtd.priv = dev;
-       dev->mtd.owner = THIS_MODULE;
-+      dev->mtd.refresh_device = block2mtd_refresh;
-       
-       part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-       part->name = dev->mtd.name;
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -17,6 +17,7 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/mtd/partitions.h>
- #include <asm/uaccess.h>
-@@ -754,6 +755,13 @@ static int mtd_ioctl(struct inode *inode
-               file->f_pos = 0;
-               break;
-       }
-+#ifdef CONFIG_MTD_PARTITIONS
-+      case MTDREFRESH:
-+      {
-+              ret = refresh_mtd_partitions(mtd);
-+              break;
-+      }
-+#endif
-       default:
-               ret = -ENOTTY;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -98,6 +98,7 @@ struct mtd_oob_ops {
-       uint8_t         *oobbuf;
- };
-+struct mtd_info;
- struct mtd_info {
-       u_char type;
-       u_int32_t flags;
-@@ -202,6 +203,9 @@ struct mtd_info {
-       struct module *owner;
-       int usecount;
-+      int (*refresh_device)(struct mtd_info *mtd);
-+      struct mtd_info *split;
-+
-       /* If the driver is something smart, like UBI, it may need to maintain
-        * its own reference counting. The below functions are only for driver.
-        * The driver may register its callbacks. These callbacks are not
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -36,6 +36,7 @@
-  * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
-  */
-+struct mtd_partition;
- struct mtd_partition {
-       char *name;                     /* identifier string */
-       u_int32_t size;                 /* partition size */
-@@ -43,6 +44,7 @@ struct mtd_partition {
-       u_int32_t mask_flags;           /* master MTD flags to mask out for this partition */
-       struct nand_ecclayout *ecclayout;       /* out of band layout for this partition (NAND only)*/
-       struct mtd_info **mtdp;         /* pointer to store the MTD object */
-+      int (*refresh_partition)(struct mtd_info *);
- };
- #define MTDPART_OFS_NXTBLK    (-2)
-@@ -52,6 +54,7 @@ struct mtd_partition {
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+int refresh_mtd_partitions(struct mtd_info *);
- /*
-  * Functions dealing with the various ways of partitioning the space
---- a/include/mtd/mtd-abi.h
-+++ b/include/mtd/mtd-abi.h
-@@ -95,6 +95,7 @@ struct otp_info {
- #define ECCGETLAYOUT          _IOR('M', 17, struct nand_ecclayout)
- #define ECCGETSTATS           _IOR('M', 18, struct mtd_ecc_stats)
- #define MTDFILEMODE           _IO('M', 19)
-+#define MTDREFRESH            _IO('M', 23)
- /*
-  * Obsolete legacy interface. Keep it in order not to break userspace
diff --git a/target/linux/generic-2.6/patches-2.6.24/070-redboot_space.patch b/target/linux/generic-2.6/patches-2.6.24/070-redboot_space.patch
deleted file mode 100644 (file)
index 940536d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -236,14 +236,21 @@ static int parse_redboot_partitions(stru
- #endif
-               names += strlen(names)+1;
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-               if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
--                      i++;
--                      parts[i].offset = parts[i-1].size + parts[i-1].offset;
--                      parts[i].size = fl->next->img->flash_base - parts[i].offset;
--                      parts[i].name = nullname;
--              }
-+                      if (!strcmp(parts[i].name, "rootfs")) {
-+                              parts[i].size = fl->next->img->flash_base;
-+                              parts[i].size &= ~(master->erasesize - 1);
-+                              parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+                              nrparts--;
-+                      } else {
-+                              i++;
-+                              parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+                              parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+                              parts[i].name = nullname;
- #endif
-+                      }
-+              }
-               tmp_fl = fl;
-               fl = fl->next;
-               kfree(tmp_fl);
diff --git a/target/linux/generic-2.6/patches-2.6.24/080-mtd_plat_nand_chip_fixup.patch b/target/linux/generic-2.6/patches-2.6.24/080-mtd_plat_nand_chip_fixup.patch
deleted file mode 100644 (file)
index 61f2806..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -573,6 +573,7 @@ struct platform_nand_chip {
-       int                     chip_delay;
-       unsigned int            options;
-       const char              **part_probe_types;
-+      int                     (*chip_fixup)(struct mtd_info *mtd);
-       void                    *priv;
- };
---- a/drivers/mtd/nand/plat_nand.c
-+++ b/drivers/mtd/nand/plat_nand.c
-@@ -70,7 +70,18 @@ static int __init plat_nand_probe(struct
-       platform_set_drvdata(pdev, data);
-       /* Scan to find existance of the device */
--      if (nand_scan(&data->mtd, 1)) {
-+      if (nand_scan_ident(&data->mtd, 1)) {
-+              res = -ENXIO;
-+              goto out;
-+      }
-+
-+      if (pdata->chip.chip_fixup) {
-+              res = pdata->chip.chip_fixup(&data->mtd);
-+              if (res)
-+                      goto out;
-+      }
-+
-+      if (nand_scan_tail(&data->mtd)) {
-               res = -ENXIO;
-               goto out;
-       }
diff --git a/target/linux/generic-2.6/patches-2.6.24/100-netfilter_layer7_2.17.patch b/target/linux/generic-2.6/patches-2.6.24/100-netfilter_layer7_2.17.patch
deleted file mode 100644 (file)
index 9315486..0000000
+++ /dev/null
@@ -1,2101 +0,0 @@
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -633,6 +633,27 @@ config NETFILTER_XT_MATCH_STATE
-         To compile it as a module, choose M here.  If unsure, say N.
-+config NETFILTER_XT_MATCH_LAYER7
-+      tristate '"layer7" match support'
-+      depends on NETFILTER_XTABLES
-+      depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
-+       depends on NF_CT_ACCT
-+      help
-+        Say Y if you want to be able to classify connections (and their
-+        packets) based on regular expression matching of their application
-+        layer data.   This is one way to classify applications such as
-+        peer-to-peer filesharing systems that do not always use the same
-+        port.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config NETFILTER_XT_MATCH_LAYER7_DEBUG
-+        bool 'Layer 7 debugging output'
-+        depends on NETFILTER_XT_MATCH_LAYER7
-+        help
-+          Say Y to get lots of debugging output.
-+
-+
- config NETFILTER_XT_MATCH_STATISTIC
-       tristate '"statistic" match support'
-       depends on NETFILTER_XTABLES
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -73,6 +73,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) +
- obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
-+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
---- /dev/null
-+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,634 @@
-+/*
-+  Kernel module to match application layer (OSI layer 7) data in connections.
-+
-+  http://l7-filter.sf.net
-+
-+  (C) 2003, 2004, 2005, 2006, 2007 Matthew Strait and Ethan Sommer.
-+
-+  This 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.
-+  http://www.gnu.org/licenses/gpl.txt
-+
-+  Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
-+  xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
-+  Ethan Sommer, Justin Levandoski.
-+*/
-+
-+#include <linux/spinlock.h>
-+#include <linux/version.h>
-+#include <net/ip.h>
-+#include <net/tcp.h>
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_layer7.h>
-+#include <linux/ctype.h>
-+#include <linux/proc_fs.h>
-+
-+#include "regexp/regexp.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
-+MODULE_DESCRIPTION("iptables application layer match module");
-+MODULE_ALIAS("ipt_layer7");
-+MODULE_VERSION("2.17");
-+
-+static int maxdatalen = 2048; // this is the default
-+module_param(maxdatalen, int, 0444);
-+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
-+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
-+      #define DPRINTK(format,args...) printk(format,##args)
-+#else
-+      #define DPRINTK(format,args...)
-+#endif
-+
-+#define TOTAL_PACKETS master_conntrack->counters[IP_CT_DIR_ORIGINAL].packets + \
-+                    master_conntrack->counters[IP_CT_DIR_REPLY].packets
-+
-+/* Number of packets whose data we look at.
-+This can be modified through /proc/net/layer7_numpackets */
-+static int num_packets = 10;
-+
-+static struct pattern_cache {
-+      char * regex_string;
-+      regexp * pattern;
-+      struct pattern_cache * next;
-+} * first_pattern_cache = NULL;
-+
-+DEFINE_SPINLOCK(l7_lock);
-+
-+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+/* Converts an unfriendly string into a friendly one by
-+replacing unprintables with periods and all whitespace with " ". */
-+static char * friendly_print(unsigned char * s)
-+{
-+      char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
-+      int i;
-+
-+      if(!f) {
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: out of memory in "
-+                                      "friendly_print, bailing.\n");
-+              return NULL;
-+      }
-+
-+      for(i = 0; i < strlen(s); i++){
-+              if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
-+              else if(isspace(s[i]))          f[i] = ' ';
-+              else                            f[i] = '.';
-+      }
-+      f[i] = '\0';
-+      return f;
-+}
-+
-+static char dec2hex(int i)
-+{
-+      switch (i) {
-+              case 0 ... 9:
-+                      return (i + '0');
-+                      break;
-+              case 10 ... 15:
-+                      return (i - 10 + 'a');
-+                      break;
-+              default:
-+                      if (net_ratelimit())
-+                              printk("layer7: Problem in dec2hex\n");
-+                      return '\0';
-+      }
-+}
-+
-+static char * hex_print(unsigned char * s)
-+{
-+      char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
-+      int i;
-+
-+      if(!g) {
-+             if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: out of memory in hex_print, "
-+                                      "bailing.\n");
-+             return NULL;
-+      }
-+
-+      for(i = 0; i < strlen(s); i++) {
-+              g[i*3    ] = dec2hex(s[i]/16);
-+              g[i*3 + 1] = dec2hex(s[i]%16);
-+              g[i*3 + 2] = ' ';
-+      }
-+      g[i*3] = '\0';
-+
-+      return g;
-+}
-+#endif // DEBUG
-+
-+/* Use instead of regcomp.  As we expect to be seeing the same regexps over and
-+over again, it make sense to cache the results. */
-+static regexp * compile_and_cache(const char * regex_string, 
-+                                  const char * protocol)
-+{
-+      struct pattern_cache * node               = first_pattern_cache;
-+      struct pattern_cache * last_pattern_cache = first_pattern_cache;
-+      struct pattern_cache * tmp;
-+      unsigned int len;
-+
-+      while (node != NULL) {
-+              if (!strcmp(node->regex_string, regex_string))
-+              return node->pattern;
-+
-+              last_pattern_cache = node;/* points at the last non-NULL node */
-+              node = node->next;
-+      }
-+
-+      /* If we reach the end of the list, then we have not yet cached
-+         the pattern for this regex. Let's do that now.
-+         Be paranoid about running out of memory to avoid list corruption. */
-+      tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
-+
-+      if(!tmp) {
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: out of memory in "
-+                                      "compile_and_cache, bailing.\n");
-+              return NULL;
-+      }
-+
-+      tmp->regex_string  = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
-+      tmp->pattern       = kmalloc(sizeof(struct regexp),    GFP_ATOMIC);
-+      tmp->next = NULL;
-+
-+      if(!tmp->regex_string || !tmp->pattern) {
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: out of memory in "
-+                                      "compile_and_cache, bailing.\n");
-+              kfree(tmp->regex_string);
-+              kfree(tmp->pattern);
-+              kfree(tmp);
-+              return NULL;
-+      }
-+
-+      /* Ok.  The new node is all ready now. */
-+      node = tmp;
-+
-+      if(first_pattern_cache == NULL) /* list is empty */
-+              first_pattern_cache = node; /* make node the beginning */
-+      else
-+              last_pattern_cache->next = node; /* attach node to the end */
-+
-+      /* copy the string and compile the regex */
-+      len = strlen(regex_string);
-+      DPRINTK("About to compile this: \"%s\"\n", regex_string);
-+      node->pattern = regcomp((char *)regex_string, &len);
-+      if ( !node->pattern ) {
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: Error compiling regexp "
-+                                      "\"%s\" (%s)\n", 
-+                                      regex_string, protocol);
-+              /* pattern is now cached as NULL, so we won't try again. */
-+      }
-+
-+      strcpy(node->regex_string, regex_string);
-+      return node->pattern;
-+}
-+
-+static int can_handle(const struct sk_buff *skb)
-+{
-+      if(!ip_hdr(skb)) /* not IP */
-+              return 0;
-+      if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
-+         ip_hdr(skb)->protocol != IPPROTO_UDP &&
-+         ip_hdr(skb)->protocol != IPPROTO_ICMP)
-+              return 0;
-+      return 1;
-+}
-+
-+/* Returns offset the into the skb->data that the application data starts */
-+static int app_data_offset(const struct sk_buff *skb)
-+{
-+      /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
-+      isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
-+      int ip_hl = 4*ip_hdr(skb)->ihl;
-+
-+      if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
-+              /* 12 == offset into TCP header for the header length field.
-+              Can't get this with skb->h.th->doff because the tcphdr
-+              struct doesn't get set when routing (this is confirmed to be
-+              true in Netfilter as well as QoS.) */
-+              int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
-+
-+              return ip_hl + tcp_hl;
-+      } else if( ip_hdr(skb)->protocol == IPPROTO_UDP  ) {
-+              return ip_hl + 8; /* UDP header is always 8 bytes */
-+      } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
-+              return ip_hl + 8; /* ICMP header is 8 bytes */
-+      } else {
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: tried to handle unknown "
-+                                      "protocol!\n");
-+              return ip_hl + 8; /* something reasonable */
-+      }
-+}
-+
-+/* handles whether there's a match when we aren't appending data anymore */
-+static int match_no_append(struct nf_conn * conntrack, 
-+                           struct nf_conn * master_conntrack, 
-+                           enum ip_conntrack_info ctinfo,
-+                           enum ip_conntrack_info master_ctinfo,
-+                           const struct xt_layer7_info * info)
-+{
-+      /* If we're in here, throw the app data away */
-+      if(master_conntrack->layer7.app_data != NULL) {
-+
-+      #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+              if(!master_conntrack->layer7.app_proto) {
-+                      char * f = 
-+                        friendly_print(master_conntrack->layer7.app_data);
-+                      char * g = 
-+                        hex_print(master_conntrack->layer7.app_data);
-+                      DPRINTK("\nl7-filter gave up after %d bytes "
-+                              "(%d packets):\n%s\n",
-+                              strlen(f), TOTAL_PACKETS, f);
-+                      kfree(f);
-+                      DPRINTK("In hex: %s\n", g);
-+                      kfree(g);
-+              }
-+      #endif
-+
-+              kfree(master_conntrack->layer7.app_data);
-+              master_conntrack->layer7.app_data = NULL; /* don't free again */
-+      }
-+
-+      if(master_conntrack->layer7.app_proto){
-+              /* Here child connections set their .app_proto (for /proc) */
-+              if(!conntrack->layer7.app_proto) {
-+                      conntrack->layer7.app_proto = 
-+                        kmalloc(strlen(master_conntrack->layer7.app_proto)+1, 
-+                          GFP_ATOMIC);
-+                      if(!conntrack->layer7.app_proto){
-+                              if (net_ratelimit())
-+                                      printk(KERN_ERR "layer7: out of memory "
-+                                                      "in match_no_append, "
-+                                                      "bailing.\n");
-+                              return 1;
-+                      }
-+                      strcpy(conntrack->layer7.app_proto, 
-+                              master_conntrack->layer7.app_proto);
-+              }
-+
-+              return (!strcmp(master_conntrack->layer7.app_proto, 
-+                              info->protocol));
-+      }
-+      else {
-+              /* If not classified, set to "unknown" to distinguish from
-+              connections that are still being tested. */
-+              master_conntrack->layer7.app_proto = 
-+                      kmalloc(strlen("unknown")+1, GFP_ATOMIC);
-+              if(!master_conntrack->layer7.app_proto){
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "layer7: out of memory in "
-+                                              "match_no_append, bailing.\n");
-+                      return 1;
-+              }
-+              strcpy(master_conntrack->layer7.app_proto, "unknown");
-+              return 0;
-+      }
-+}
-+
-+/* add the new app data to the conntrack.  Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+                    char * app_data, int appdatalen)
-+{
-+      int length = 0, i;
-+      int oldlength = master_conntrack->layer7.app_data_len;
-+
-+      /* This is a fix for a race condition by Deti Fliegl. However, I'm not 
-+         clear on whether the race condition exists or whether this really 
-+         fixes it.  I might just be being dense... Anyway, if it's not really 
-+         a fix, all it does is waste a very small amount of time. */
-+      if(!master_conntrack->layer7.app_data) return 0;
-+
-+      /* Strip nulls. Make everything lower case (our regex lib doesn't
-+      do case insensitivity).  Add it to the end of the current data. */
-+      for(i = 0; i < maxdatalen-oldlength-1 &&
-+                 i < appdatalen; i++) {
-+              if(app_data[i] != '\0') {
-+                      /* the kernel version of tolower mungs 'upper ascii' */
-+                      master_conntrack->layer7.app_data[length+oldlength] =
-+                              isascii(app_data[i])? 
-+                                      tolower(app_data[i]) : app_data[i];
-+                      length++;
-+              }
-+      }
-+
-+      master_conntrack->layer7.app_data[length+oldlength] = '\0';
-+      master_conntrack->layer7.app_data_len = length + oldlength;
-+
-+      return length;
-+}
-+
-+/* taken from drivers/video/modedb.c */
-+static int my_atoi(const char *s)
-+{
-+      int val = 0;
-+
-+      for (;; s++) {
-+              switch (*s) {
-+                      case '0'...'9':
-+                      val = 10*val+(*s-'0');
-+                      break;
-+              default:
-+                      return val;
-+              }
-+      }
-+}
-+
-+/* write out num_packets to userland. */
-+static int layer7_read_proc(char* page, char ** start, off_t off, int count,
-+                            int* eof, void * data)
-+{
-+      if(num_packets > 99 && net_ratelimit())
-+              printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n");
-+
-+      page[0] = num_packets/10 + '0';
-+      page[1] = num_packets%10 + '0';
-+      page[2] = '\n';
-+      page[3] = '\0';
-+
-+      *eof=1;
-+
-+      return 3;
-+}
-+
-+/* Read in num_packets from userland */
-+static int layer7_write_proc(struct file* file, const char* buffer,
-+                             unsigned long count, void *data)
-+{
-+      char * foo = kmalloc(count, GFP_ATOMIC);
-+
-+      if(!foo){
-+              if (net_ratelimit())
-+                      printk(KERN_ERR "layer7: out of memory, bailing. "
-+                                      "num_packets unchanged.\n");
-+              return count;
-+      }
-+
-+      if(copy_from_user(foo, buffer, count)) {
-+              return -EFAULT;
-+      }
-+
-+
-+      num_packets = my_atoi(foo);
-+      kfree (foo);
-+
-+      /* This has an arbitrary limit to make the math easier. I'm lazy.
-+      But anyway, 99 is a LOT! If you want more, you're doing it wrong! */
-+      if(num_packets > 99) {
-+              printk(KERN_WARNING "layer7: num_packets can't be > 99.\n");
-+              num_packets = 99;
-+      } else if(num_packets < 1) {
-+              printk(KERN_WARNING "layer7: num_packets can't be < 1.\n");
-+              num_packets = 1;
-+      }
-+
-+      return count;
-+}
-+
-+static bool
-+match(const struct sk_buff *skbin,
-+      const struct net_device *in,
-+      const struct net_device *out,
-+      const struct xt_match *match,
-+      const void *matchinfo,
-+      int offset,
-+      unsigned int protoff,
-+      bool *hotdrop)
-+{
-+      /* sidestep const without getting a compiler warning... */
-+      struct sk_buff * skb = (struct sk_buff *)skbin; 
-+
-+      const struct xt_layer7_info * info = matchinfo;
-+      enum ip_conntrack_info master_ctinfo, ctinfo;
-+      struct nf_conn *master_conntrack, *conntrack;
-+      unsigned char * app_data;
-+      unsigned int pattern_result, appdatalen;
-+      regexp * comppattern;
-+
-+      /* Be paranoid/incompetent - lock the entire match function. */
-+      spin_lock_bh(&l7_lock);
-+
-+      if(!can_handle(skb)){
-+              DPRINTK("layer7: This is some protocol I can't handle.\n");
-+              spin_unlock_bh(&l7_lock);
-+              return info->invert;
-+      }
-+
-+      /* Treat parent & all its children together as one connection, except
-+      for the purpose of setting conntrack->layer7.app_proto in the actual
-+      connection. This makes /proc/net/ip_conntrack more satisfying. */
-+      if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
-+         !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
-+              DPRINTK("layer7: couldn't get conntrack.\n");
-+              spin_unlock_bh(&l7_lock);
-+              return info->invert;
-+      }
-+
-+      /* Try to get a master conntrack (and its master etc) for FTP, etc. */
-+      while (master_ct(master_conntrack) != NULL)
-+              master_conntrack = master_ct(master_conntrack);
-+
-+      /* if we've classified it or seen too many packets */
-+      if(TOTAL_PACKETS > num_packets ||
-+         master_conntrack->layer7.app_proto) {
-+
-+              pattern_result = match_no_append(conntrack, master_conntrack, 
-+                                               ctinfo, master_ctinfo, info);
-+
-+              /* skb->cb[0] == seen. Don't do things twice if there are 
-+              multiple l7 rules. I'm not sure that using cb for this purpose 
-+              is correct, even though it says "put your private variables 
-+              there". But it doesn't look like it is being used for anything
-+              else in the skbs that make it here. */
-+              skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
-+
-+              spin_unlock_bh(&l7_lock);
-+              return (pattern_result ^ info->invert);
-+      }
-+
-+      if(skb_is_nonlinear(skb)){
-+              if(skb_linearize(skb) != 0){
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "layer7: failed to linearize "
-+                                              "packet, bailing.\n");
-+                      spin_unlock_bh(&l7_lock);
-+                      return info->invert;
-+              }
-+      }
-+
-+      /* now that the skb is linearized, it's safe to set these. */
-+      app_data = skb->data + app_data_offset(skb);
-+      appdatalen = skb_tail_pointer(skb) - app_data;
-+
-+      /* the return value gets checked later, when we're ready to use it */
-+      comppattern = compile_and_cache(info->pattern, info->protocol);
-+
-+      /* On the first packet of a connection, allocate space for app data */
-+      if(TOTAL_PACKETS == 1 && !skb->cb[0] && 
-+         !master_conntrack->layer7.app_data){
-+              master_conntrack->layer7.app_data = 
-+                      kmalloc(maxdatalen, GFP_ATOMIC);
-+              if(!master_conntrack->layer7.app_data){
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "layer7: out of memory in "
-+                                              "match, bailing.\n");
-+                      spin_unlock_bh(&l7_lock);
-+                      return info->invert;
-+              }
-+
-+              master_conntrack->layer7.app_data[0] = '\0';
-+      }
-+
-+      /* Can be here, but unallocated, if numpackets is increased near
-+      the beginning of a connection */
-+      if(master_conntrack->layer7.app_data == NULL){
-+              spin_unlock_bh(&l7_lock);
-+              return (info->invert); /* unmatched */
-+      }
-+
-+      if(!skb->cb[0]){
-+              int newbytes;
-+              newbytes = add_data(master_conntrack, app_data, appdatalen);
-+
-+              if(newbytes == 0) { /* didn't add any data */
-+                      skb->cb[0] = 1;
-+                      /* Didn't match before, not going to match now */
-+                      spin_unlock_bh(&l7_lock);
-+                      return info->invert;
-+              }
-+      }
-+
-+      /* If looking for "unknown", then never match.  "Unknown" means that
-+      we've given up; we're still trying with these packets. */
-+      if(!strcmp(info->protocol, "unknown")) {
-+              pattern_result = 0;
-+      /* If looking for "unset", then always match. "Unset" means that we
-+      haven't yet classified the connection. */
-+      } else if(!strcmp(info->protocol, "unset")) {
-+              pattern_result = 2;
-+              DPRINTK("layer7: matched unset: not yet classified "
-+                      "(%d/%d packets)\n", TOTAL_PACKETS, num_packets);
-+      /* If the regexp failed to compile, don't bother running it */
-+      } else if(comppattern && 
-+                regexec(comppattern, master_conntrack->layer7.app_data)){
-+              DPRINTK("layer7: matched %s\n", info->protocol);
-+              pattern_result = 1;
-+      } else pattern_result = 0;
-+
-+      if(pattern_result == 1) {
-+              master_conntrack->layer7.app_proto = 
-+                      kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
-+              if(!master_conntrack->layer7.app_proto){
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "layer7: out of memory in "
-+                                              "match, bailing.\n");
-+                      spin_unlock_bh(&l7_lock);
-+                      return (pattern_result ^ info->invert);
-+              }
-+              strcpy(master_conntrack->layer7.app_proto, info->protocol);
-+      } else if(pattern_result > 1) { /* cleanup from "unset" */
-+              pattern_result = 1;
-+      }
-+
-+      /* mark the packet seen */
-+      skb->cb[0] = 1;
-+
-+      spin_unlock_bh(&l7_lock);
-+      return (pattern_result ^ info->invert);
-+}
-+
-+static bool check(const char *tablename,
-+               const void *inf,
-+               const struct xt_match *match,
-+               void *matchinfo,
-+               unsigned int hook_mask)
-+
-+{
-+      // load nf_conntrack_ipv4
-+        if (nf_ct_l3proto_try_module_get(match->family) < 0) {
-+                printk(KERN_WARNING "can't load conntrack support for "
-+                                    "proto=%d\n", match->family);
-+                return false;
-+        }
-+      return true;
-+}
-+
-+static void
-+destroy(const struct xt_match *match, void *matchinfo)
-+{
-+      nf_ct_l3proto_module_put(match->family);
-+}
-+
-+static struct xt_match xt_layer7_match[] = {
-+{
-+      .name           = "layer7",
-+      .family         = AF_INET,
-+      .checkentry     = check,
-+      .match          = match,
-+      .destroy        = destroy,
-+      .matchsize      = sizeof(struct xt_layer7_info),
-+      .me             = THIS_MODULE
-+}
-+};
-+
-+static void layer7_cleanup_proc(void)
-+{
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
-+      remove_proc_entry("layer7_numpackets", proc_net);
-+#else
-+      remove_proc_entry("layer7_numpackets", init_net.proc_net);
-+#endif
-+}
-+
-+/* register the proc file */
-+static void layer7_init_proc(void)
-+{
-+      struct proc_dir_entry* entry;
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
-+      entry = create_proc_entry("layer7_numpackets", 0644, proc_net);
-+#else
-+      entry = create_proc_entry("layer7_numpackets", 0644, init_net.proc_net);
-+#endif
-+      entry->read_proc = layer7_read_proc;
-+      entry->write_proc = layer7_write_proc;
-+}
-+
-+static int __init xt_layer7_init(void)
-+{
-+      need_conntrack();
-+
-+      layer7_init_proc();
-+      if(maxdatalen < 1) {
-+              printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
-+                      "using 1\n");
-+              maxdatalen = 1;
-+      }
-+      /* This is not a hard limit.  It's just here to prevent people from
-+      bringing their slow machines to a grinding halt. */
-+      else if(maxdatalen > 65536) {
-+              printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
-+                      "using 65536\n");
-+              maxdatalen = 65536;
-+      }
-+      return xt_register_matches(xt_layer7_match,
-+                                 ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+static void __exit xt_layer7_fini(void)
-+{
-+      layer7_cleanup_proc();
-+      xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+module_init(xt_layer7_init);
-+module_exit(xt_layer7_fini);
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.c
-@@ -0,0 +1,1197 @@
-+/*
-+ * regcomp and regexec -- regsub and regerror are elsewhere
-+ * @(#)regexp.c       1.3 of 18 April 87
-+ *
-+ *    Copyright (c) 1986 by University of Toronto.
-+ *    Written by Henry Spencer.  Not derived from licensed software.
-+ *
-+ *    Permission is granted to anyone to use this software for any
-+ *    purpose on any computer system, and to redistribute it freely,
-+ *    subject to the following restrictions:
-+ *
-+ *    1. The author is not responsible for the consequences of use of
-+ *            this software, no matter how awful, even if they arise
-+ *            from defects in it.
-+ *
-+ *    2. The origin of this software must not be misrepresented, either
-+ *            by explicit claim or by omission.
-+ *
-+ *    3. Altered versions must be plainly marked as such, and must not
-+ *            be misrepresented as being the original software.
-+ *
-+ * Beware that some of this code is subtly aware of the way operator
-+ * precedence is structured in regular expressions.  Serious changes in
-+ * regular-expression syntax might require a total rethink.
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ * Modified slightly by Matthew Strait to use more modern C.
-+ */
-+
-+#include "regexp.h"
-+#include "regmagic.h"
-+
-+/* added by ethan and matt.  Lets it work in both kernel and user space.
-+(So iptables can use it, for instance.)  Yea, it goes both ways... */
-+#if __KERNEL__
-+  #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
-+#else
-+  #define printk(format,args...) printf(format,##args)
-+#endif
-+
-+void regerror(char * s)
-+{
-+        printk("<3>Regexp: %s\n", s);
-+        /* NOTREACHED */
-+}
-+
-+/*
-+ * The "internal use only" fields in regexp.h are present to pass info from
-+ * compile to execute that permits the execute phase to run lots faster on
-+ * simple cases.  They are:
-+ *
-+ * regstart   char that must begin a match; '\0' if none obvious
-+ * reganch    is the match anchored (at beginning-of-line only)?
-+ * regmust    string (pointer into program) that match must include, or NULL
-+ * regmlen    length of regmust string
-+ *
-+ * Regstart and reganch permit very fast decisions on suitable starting points
-+ * for a match, cutting down the work a lot.  Regmust permits fast rejection
-+ * of lines that cannot possibly match.  The regmust tests are costly enough
-+ * that regcomp() supplies a regmust only if the r.e. contains something
-+ * potentially expensive (at present, the only such thing detected is * or +
-+ * at the start of the r.e., which can involve a lot of backup).  Regmlen is
-+ * supplied because the test in regexec() needs it and regcomp() is computing
-+ * it anyway.
-+ */
-+
-+/*
-+ * Structure for regexp "program".  This is essentially a linear encoding
-+ * of a nondeterministic finite-state machine (aka syntax charts or
-+ * "railroad normal form" in parsing technology).  Each node is an opcode
-+ * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
-+ * all nodes except BRANCH implement concatenation; a "next" pointer with
-+ * a BRANCH on both ends of it is connecting two alternatives.  (Here we
-+ * have one of the subtle syntax dependencies:  an individual BRANCH (as
-+ * opposed to a collection of them) is never concatenated with anything
-+ * because of operator precedence.)  The operand of some types of node is
-+ * a literal string; for others, it is a node leading into a sub-FSM.  In
-+ * particular, the operand of a BRANCH node is the first node of the branch.
-+ * (NB this is *not* a tree structure:  the tail of the branch connects
-+ * to the thing following the set of BRANCHes.)  The opcodes are:
-+ */
-+
-+/* definition number  opnd?   meaning */
-+#define       END     0       /* no   End of program. */
-+#define       BOL     1       /* no   Match "" at beginning of line. */
-+#define       EOL     2       /* no   Match "" at end of line. */
-+#define       ANY     3       /* no   Match any one character. */
-+#define       ANYOF   4       /* str  Match any character in this string. */
-+#define       ANYBUT  5       /* str  Match any character not in this string. */
-+#define       BRANCH  6       /* node Match this alternative, or the next... */
-+#define       BACK    7       /* no   Match "", "next" ptr points backward. */
-+#define       EXACTLY 8       /* str  Match this string. */
-+#define       NOTHING 9       /* no   Match empty string. */
-+#define       STAR    10      /* node Match this (simple) thing 0 or more times. */
-+#define       PLUS    11      /* node Match this (simple) thing 1 or more times. */
-+#define       OPEN    20      /* no   Mark this point in input as start of #n. */
-+                      /*      OPEN+1 is number 1, etc. */
-+#define       CLOSE   30      /* no   Analogous to OPEN. */
-+
-+/*
-+ * Opcode notes:
-+ *
-+ * BRANCH     The set of branches constituting a single choice are hooked
-+ *            together with their "next" pointers, since precedence prevents
-+ *            anything being concatenated to any individual branch.  The
-+ *            "next" pointer of the last BRANCH in a choice points to the
-+ *            thing following the whole choice.  This is also where the
-+ *            final "next" pointer of each individual branch points; each
-+ *            branch starts with the operand node of a BRANCH node.
-+ *
-+ * BACK               Normal "next" pointers all implicitly point forward; BACK
-+ *            exists to make loop structures possible.
-+ *
-+ * STAR,PLUS  '?', and complex '*' and '+', are implemented as circular
-+ *            BRANCH structures using BACK.  Simple cases (one character
-+ *            per match) are implemented with STAR and PLUS for speed
-+ *            and to minimize recursive plunges.
-+ *
-+ * OPEN,CLOSE ...are numbered at compile time.
-+ */
-+
-+/*
-+ * A node is one char of opcode followed by two chars of "next" pointer.
-+ * "Next" pointers are stored as two 8-bit pieces, high order first.  The
-+ * value is a positive offset from the opcode of the node containing it.
-+ * An operand, if any, simply follows the node.  (Note that much of the
-+ * code generation knows about this implicit relationship.)
-+ *
-+ * Using two bytes for the "next" pointer is vast overkill for most things,
-+ * but allows patterns to get big without disasters.
-+ */
-+#define       OP(p)   (*(p))
-+#define       NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-+#define       OPERAND(p)      ((p) + 3)
-+
-+/*
-+ * See regmagic.h for one further detail of program structure.
-+ */
-+
-+
-+/*
-+ * Utility definitions.
-+ */
-+#ifndef CHARBITS
-+#define       UCHARAT(p)      ((int)*(unsigned char *)(p))
-+#else
-+#define       UCHARAT(p)      ((int)*(p)&CHARBITS)
-+#endif
-+
-+#define       FAIL(m) { regerror(m); return(NULL); }
-+#define       ISMULT(c)       ((c) == '*' || (c) == '+' || (c) == '?')
-+#define       META    "^$.[()|?+*\\"
-+
-+/*
-+ * Flags to be passed up and down.
-+ */
-+#define       HASWIDTH        01      /* Known never to match null string. */
-+#define       SIMPLE          02      /* Simple enough to be STAR/PLUS operand. */
-+#define       SPSTART         04      /* Starts with * or +. */
-+#define       WORST           0       /* Worst case. */
-+
-+/*
-+ * Global work variables for regcomp().
-+ */
-+struct match_globals {
-+char *reginput;               /* String-input pointer. */
-+char *regbol;         /* Beginning of input, for ^ check. */
-+char **regstartp;     /* Pointer to startp array. */
-+char **regendp;               /* Ditto for endp. */
-+char *regparse;               /* Input-scan pointer. */
-+int regnpar;          /* () count. */
-+char regdummy;
-+char *regcode;                /* Code-emit pointer; &regdummy = don't. */
-+long regsize;         /* Code size. */
-+};
-+
-+/*
-+ * Forward declarations for regcomp()'s friends.
-+ */
-+#ifndef STATIC
-+#define       STATIC  static
-+#endif
-+STATIC char *reg(struct match_globals *g, int paren,int *flagp);
-+STATIC char *regbranch(struct match_globals *g, int *flagp);
-+STATIC char *regpiece(struct match_globals *g, int *flagp);
-+STATIC char *regatom(struct match_globals *g, int *flagp);
-+STATIC char *regnode(struct match_globals *g, char op);
-+STATIC char *regnext(struct match_globals *g, char *p);
-+STATIC void regc(struct match_globals *g, char b);
-+STATIC void reginsert(struct match_globals *g, char op, char *opnd);
-+STATIC void regtail(struct match_globals *g, char *p, char *val);
-+STATIC void regoptail(struct match_globals *g, char *p, char *val);
-+
-+
-+__kernel_size_t my_strcspn(const char *s1,const char *s2)
-+{
-+        char *scan1;
-+        char *scan2;
-+        int count;
-+
-+        count = 0;
-+        for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
-+                for (scan2 = (char *)s2; *scan2 != '\0';)       /* ++ moved down. */
-+                        if (*scan1 == *scan2++)
-+                                return(count);
-+                count++;
-+        }
-+        return(count);
-+}
-+
-+/*
-+ - regcomp - compile a regular expression into internal code
-+ *
-+ * We can't allocate space until we know how big the compiled form will be,
-+ * but we can't compile it (and thus know how big it is) until we've got a
-+ * place to put the code.  So we cheat:  we compile it twice, once with code
-+ * generation turned off and size counting turned on, and once "for real".
-+ * This also means that we don't allocate space until we are sure that the
-+ * thing really will compile successfully, and we never have to move the
-+ * code and thus invalidate pointers into it.  (Note that it has to be in
-+ * one piece because free() must be able to free it all.)
-+ *
-+ * Beware that the optimization-preparation code in here knows about some
-+ * of the structure of the compiled regexp.
-+ */
-+regexp *
-+regcomp(char *exp,int *patternsize)
-+{
-+      register regexp *r;
-+      register char *scan;
-+      register char *longest;
-+      register int len;
-+      int flags;
-+      struct match_globals g;
-+      
-+      /* commented out by ethan
-+         extern char *malloc();
-+      */
-+
-+      if (exp == NULL)
-+              FAIL("NULL argument");
-+
-+      /* First pass: determine size, legality. */
-+      g.regparse = exp;
-+      g.regnpar = 1;
-+      g.regsize = 0L;
-+      g.regcode = &g.regdummy;
-+      regc(&g, MAGIC);
-+      if (reg(&g, 0, &flags) == NULL)
-+              return(NULL);
-+
-+      /* Small enough for pointer-storage convention? */
-+      if (g.regsize >= 32767L)                /* Probably could be 65535L. */
-+              FAIL("regexp too big");
-+
-+      /* Allocate space. */
-+      *patternsize=sizeof(regexp) + (unsigned)g.regsize;
-+      r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
-+      if (r == NULL)
-+              FAIL("out of space");
-+
-+      /* Second pass: emit code. */
-+      g.regparse = exp;
-+      g.regnpar = 1;
-+      g.regcode = r->program;
-+      regc(&g, MAGIC);
-+      if (reg(&g, 0, &flags) == NULL)
-+              return(NULL);
-+
-+      /* Dig out information for optimizations. */
-+      r->regstart = '\0';     /* Worst-case defaults. */
-+      r->reganch = 0;
-+      r->regmust = NULL;
-+      r->regmlen = 0;
-+      scan = r->program+1;                    /* First BRANCH. */
-+      if (OP(regnext(&g, scan)) == END) {             /* Only one top-level choice. */
-+              scan = OPERAND(scan);
-+
-+              /* Starting-point info. */
-+              if (OP(scan) == EXACTLY)
-+                      r->regstart = *OPERAND(scan);
-+              else if (OP(scan) == BOL)
-+                      r->reganch++;
-+
-+              /*
-+               * If there's something expensive in the r.e., find the
-+               * longest literal string that must appear and make it the
-+               * regmust.  Resolve ties in favor of later strings, since
-+               * the regstart check works with the beginning of the r.e.
-+               * and avoiding duplication strengthens checking.  Not a
-+               * strong reason, but sufficient in the absence of others.
-+               */
-+              if (flags&SPSTART) {
-+                      longest = NULL;
-+                      len = 0;
-+                      for (; scan != NULL; scan = regnext(&g, scan))
-+                              if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
-+                                      longest = OPERAND(scan);
-+                                      len = strlen(OPERAND(scan));
-+                              }
-+                      r->regmust = longest;
-+                      r->regmlen = len;
-+              }
-+      }
-+
-+      return(r);
-+}
-+
-+/*
-+ - reg - regular expression, i.e. main body or parenthesized thing
-+ *
-+ * Caller must absorb opening parenthesis.
-+ *
-+ * Combining parenthesis handling with the base level of regular expression
-+ * is a trifle forced, but the need to tie the tails of the branches to what
-+ * follows makes it hard to avoid.
-+ */
-+static char *
-+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
-+{
-+      register char *ret;
-+      register char *br;
-+      register char *ender;
-+      register int parno = 0; /* 0 makes gcc happy */
-+      int flags;
-+
-+      *flagp = HASWIDTH;      /* Tentatively. */
-+
-+      /* Make an OPEN node, if parenthesized. */
-+      if (paren) {
-+              if (g->regnpar >= NSUBEXP)
-+                      FAIL("too many ()");
-+              parno = g->regnpar;
-+              g->regnpar++;
-+              ret = regnode(g, OPEN+parno);
-+      } else
-+              ret = NULL;
-+
-+      /* Pick up the branches, linking them together. */
-+      br = regbranch(g, &flags);
-+      if (br == NULL)
-+              return(NULL);
-+      if (ret != NULL)
-+              regtail(g, ret, br);    /* OPEN -> first. */
-+      else
-+              ret = br;
-+      if (!(flags&HASWIDTH))
-+              *flagp &= ~HASWIDTH;
-+      *flagp |= flags&SPSTART;
-+      while (*g->regparse == '|') {
-+              g->regparse++;
-+              br = regbranch(g, &flags);
-+              if (br == NULL)
-+                      return(NULL);
-+              regtail(g, ret, br);    /* BRANCH -> BRANCH. */
-+              if (!(flags&HASWIDTH))
-+                      *flagp &= ~HASWIDTH;
-+              *flagp |= flags&SPSTART;
-+      }
-+
-+      /* Make a closing node, and hook it on the end. */
-+      ender = regnode(g, (paren) ? CLOSE+parno : END);        
-+      regtail(g, ret, ender);
-+
-+      /* Hook the tails of the branches to the closing node. */
-+      for (br = ret; br != NULL; br = regnext(g, br))
-+              regoptail(g, br, ender);
-+
-+      /* Check for proper termination. */
-+      if (paren && *g->regparse++ != ')') {
-+              FAIL("unmatched ()");
-+      } else if (!paren && *g->regparse != '\0') {
-+              if (*g->regparse == ')') {
-+                      FAIL("unmatched ()");
-+              } else
-+                      FAIL("junk on end");    /* "Can't happen". */
-+              /* NOTREACHED */
-+      }
-+
-+      return(ret);
-+}
-+
-+/*
-+ - regbranch - one alternative of an | operator
-+ *
-+ * Implements the concatenation operator.
-+ */
-+static char *
-+regbranch(struct match_globals *g, int *flagp)
-+{
-+      register char *ret;
-+      register char *chain;
-+      register char *latest;
-+      int flags;
-+
-+      *flagp = WORST;         /* Tentatively. */
-+
-+      ret = regnode(g, BRANCH);
-+      chain = NULL;
-+      while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
-+              latest = regpiece(g, &flags);
-+              if (latest == NULL)
-+                      return(NULL);
-+              *flagp |= flags&HASWIDTH;
-+              if (chain == NULL)      /* First piece. */
-+                      *flagp |= flags&SPSTART;
-+              else
-+                      regtail(g, chain, latest);
-+              chain = latest;
-+      }
-+      if (chain == NULL)      /* Loop ran zero times. */
-+              (void) regnode(g, NOTHING);
-+
-+      return(ret);
-+}
-+
-+/*
-+ - regpiece - something followed by possible [*+?]
-+ *
-+ * Note that the branching code sequences used for ? and the general cases
-+ * of * and + are somewhat optimized:  they use the same NOTHING node as
-+ * both the endmarker for their branch list and the body of the last branch.
-+ * It might seem that this node could be dispensed with entirely, but the
-+ * endmarker role is not redundant.
-+ */
-+static char *
-+regpiece(struct match_globals *g, int *flagp)
-+{
-+      register char *ret;
-+      register char op;
-+      register char *next;
-+      int flags;
-+
-+      ret = regatom(g, &flags);
-+      if (ret == NULL)
-+              return(NULL);
-+
-+      op = *g->regparse;
-+      if (!ISMULT(op)) {
-+              *flagp = flags;
-+              return(ret);
-+      }
-+
-+      if (!(flags&HASWIDTH) && op != '?')
-+              FAIL("*+ operand could be empty");
-+      *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
-+
-+      if (op == '*' && (flags&SIMPLE))
-+              reginsert(g, STAR, ret);
-+      else if (op == '*') {
-+              /* Emit x* as (x&|), where & means "self". */
-+              reginsert(g, BRANCH, ret);                      /* Either x */
-+              regoptail(g, ret, regnode(g, BACK));            /* and loop */
-+              regoptail(g, ret, ret);                 /* back */
-+              regtail(g, ret, regnode(g, BRANCH));            /* or */
-+              regtail(g, ret, regnode(g, NOTHING));           /* null. */
-+      } else if (op == '+' && (flags&SIMPLE))
-+              reginsert(g, PLUS, ret);
-+      else if (op == '+') {
-+              /* Emit x+ as x(&|), where & means "self". */
-+              next = regnode(g, BRANCH);                      /* Either */
-+              regtail(g, ret, next);
-+              regtail(g, regnode(g, BACK), ret);              /* loop back */
-+              regtail(g, next, regnode(g, BRANCH));           /* or */
-+              regtail(g, ret, regnode(g, NOTHING));           /* null. */
-+      } else if (op == '?') {
-+              /* Emit x? as (x|) */
-+              reginsert(g, BRANCH, ret);                      /* Either x */
-+              regtail(g, ret, regnode(g, BRANCH));            /* or */
-+              next = regnode(g, NOTHING);             /* null. */
-+              regtail(g, ret, next);
-+              regoptail(g, ret, next);
-+      }
-+      g->regparse++;
-+      if (ISMULT(*g->regparse))
-+              FAIL("nested *?+");
-+
-+      return(ret);
-+}
-+
-+/*
-+ - regatom - the lowest level
-+ *
-+ * Optimization:  gobbles an entire sequence of ordinary characters so that
-+ * it can turn them into a single node, which is smaller to store and
-+ * faster to run.  Backslashed characters are exceptions, each becoming a
-+ * separate node; the code is simpler that way and it's not worth fixing.
-+ */
-+static char *
-+regatom(struct match_globals *g, int *flagp)
-+{
-+      register char *ret;
-+      int flags;
-+
-+      *flagp = WORST;         /* Tentatively. */
-+
-+      switch (*g->regparse++) {
-+      case '^':
-+              ret = regnode(g, BOL);
-+              break;
-+      case '$':
-+              ret = regnode(g, EOL);
-+              break;
-+      case '.':
-+              ret = regnode(g, ANY);
-+              *flagp |= HASWIDTH|SIMPLE;
-+              break;
-+      case '[': {
-+                      register int class;
-+                      register int classend;
-+
-+                      if (*g->regparse == '^') {      /* Complement of range. */
-+                              ret = regnode(g, ANYBUT);
-+                              g->regparse++;
-+                      } else
-+                              ret = regnode(g, ANYOF);
-+                      if (*g->regparse == ']' || *g->regparse == '-')
-+                              regc(g, *g->regparse++);
-+                      while (*g->regparse != '\0' && *g->regparse != ']') {
-+                              if (*g->regparse == '-') {
-+                                      g->regparse++;
-+                                      if (*g->regparse == ']' || *g->regparse == '\0')
-+                                              regc(g, '-');
-+                                      else {
-+                                              class = UCHARAT(g->regparse-2)+1;
-+                                              classend = UCHARAT(g->regparse);
-+                                              if (class > classend+1)
-+                                                      FAIL("invalid [] range");
-+                                              for (; class <= classend; class++)
-+                                                      regc(g, class);
-+                                              g->regparse++;
-+                                      }
-+                              } else
-+                                      regc(g, *g->regparse++);
-+                      }
-+                      regc(g, '\0');
-+                      if (*g->regparse != ']')
-+                              FAIL("unmatched []");
-+                      g->regparse++;
-+                      *flagp |= HASWIDTH|SIMPLE;
-+              }
-+              break;
-+      case '(':
-+              ret = reg(g, 1, &flags);
-+              if (ret == NULL)
-+                      return(NULL);
-+              *flagp |= flags&(HASWIDTH|SPSTART);
-+              break;
-+      case '\0':
-+      case '|':
-+      case ')':
-+              FAIL("internal urp");   /* Supposed to be caught earlier. */
-+              break;
-+      case '?':
-+      case '+':
-+      case '*':
-+              FAIL("?+* follows nothing");
-+              break;
-+      case '\\':
-+              if (*g->regparse == '\0')
-+                      FAIL("trailing \\");
-+              ret = regnode(g, EXACTLY);
-+              regc(g, *g->regparse++);
-+              regc(g, '\0');
-+              *flagp |= HASWIDTH|SIMPLE;
-+              break;
-+      default: {
-+                      register int len;
-+                      register char ender;
-+
-+                      g->regparse--;
-+                      len = my_strcspn((const char *)g->regparse, (const char *)META);
-+                      if (len <= 0)
-+                              FAIL("internal disaster");
-+                      ender = *(g->regparse+len);
-+                      if (len > 1 && ISMULT(ender))
-+                              len--;          /* Back off clear of ?+* operand. */
-+                      *flagp |= HASWIDTH;
-+                      if (len == 1)
-+                              *flagp |= SIMPLE;
-+                      ret = regnode(g, EXACTLY);
-+                      while (len > 0) {
-+                              regc(g, *g->regparse++);
-+                              len--;
-+                      }
-+                      regc(g, '\0');
-+              }
-+              break;
-+      }
-+
-+      return(ret);
-+}
-+
-+/*
-+ - regnode - emit a node
-+ */
-+static char *                 /* Location. */
-+regnode(struct match_globals *g, char op)
-+{
-+      register char *ret;
-+      register char *ptr;
-+
-+      ret = g->regcode;
-+      if (ret == &g->regdummy) {
-+              g->regsize += 3;
-+              return(ret);
-+      }
-+
-+      ptr = ret;
-+      *ptr++ = op;
-+      *ptr++ = '\0';          /* Null "next" pointer. */
-+      *ptr++ = '\0';
-+      g->regcode = ptr;
-+
-+      return(ret);
-+}
-+
-+/*
-+ - regc - emit (if appropriate) a byte of code
-+ */
-+static void
-+regc(struct match_globals *g, char b)
-+{
-+      if (g->regcode != &g->regdummy)
-+              *g->regcode++ = b;
-+      else
-+              g->regsize++;
-+}
-+
-+/*
-+ - reginsert - insert an operator in front of already-emitted operand
-+ *
-+ * Means relocating the operand.
-+ */
-+static void
-+reginsert(struct match_globals *g, char op, char* opnd)
-+{
-+      register char *src;
-+      register char *dst;
-+      register char *place;
-+
-+      if (g->regcode == &g->regdummy) {
-+              g->regsize += 3;
-+              return;
-+      }
-+
-+      src = g->regcode;
-+      g->regcode += 3;
-+      dst = g->regcode;
-+      while (src > opnd)
-+              *--dst = *--src;
-+
-+      place = opnd;           /* Op node, where operand used to be. */
-+      *place++ = op;
-+      *place++ = '\0';
-+      *place++ = '\0';
-+}
-+
-+/*
-+ - regtail - set the next-pointer at the end of a node chain
-+ */
-+static void
-+regtail(struct match_globals *g, char *p, char *val)
-+{
-+      register char *scan;
-+      register char *temp;
-+      register int offset;
-+
-+      if (p == &g->regdummy)
-+              return;
-+
-+      /* Find last node. */
-+      scan = p;
-+      for (;;) {
-+              temp = regnext(g, scan);
-+              if (temp == NULL)
-+                      break;
-+              scan = temp;
-+      }
-+
-+      if (OP(scan) == BACK)
-+              offset = scan - val;
-+      else
-+              offset = val - scan;
-+      *(scan+1) = (offset>>8)&0377;
-+      *(scan+2) = offset&0377;
-+}
-+
-+/*
-+ - regoptail - regtail on operand of first argument; nop if operandless
-+ */
-+static void
-+regoptail(struct match_globals *g, char *p, char *val)
-+{
-+      /* "Operandless" and "op != BRANCH" are synonymous in practice. */
-+      if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
-+              return;
-+      regtail(g, OPERAND(p), val);
-+}
-+
-+/*
-+ * regexec and friends
-+ */
-+
-+
-+/*
-+ * Forwards.
-+ */
-+STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
-+STATIC int regmatch(struct match_globals *g, char *prog);
-+STATIC int regrepeat(struct match_globals *g, char *p);
-+
-+#ifdef DEBUG
-+int regnarrate = 0;
-+void regdump();
-+STATIC char *regprop(char *op);
-+#endif
-+
-+/*
-+ - regexec - match a regexp against a string
-+ */
-+int
-+regexec(regexp *prog, char *string)
-+{
-+      register char *s;
-+      struct match_globals g;
-+
-+      /* Be paranoid... */
-+      if (prog == NULL || string == NULL) {
-+              printk("<3>Regexp: NULL parameter\n");
-+              return(0);
-+      }
-+
-+      /* Check validity of program. */
-+      if (UCHARAT(prog->program) != MAGIC) {
-+              printk("<3>Regexp: corrupted program\n");
-+              return(0);
-+      }
-+
-+      /* If there is a "must appear" string, look for it. */
-+      if (prog->regmust != NULL) {
-+              s = string;
-+              while ((s = strchr(s, prog->regmust[0])) != NULL) {
-+                      if (strncmp(s, prog->regmust, prog->regmlen) == 0)
-+                              break;  /* Found it. */
-+                      s++;
-+              }
-+              if (s == NULL)  /* Not present. */
-+                      return(0);
-+      }
-+
-+      /* Mark beginning of line for ^ . */
-+      g.regbol = string;
-+
-+      /* Simplest case:  anchored match need be tried only once. */
-+      if (prog->reganch)
-+              return(regtry(&g, prog, string));
-+
-+      /* Messy cases:  unanchored match. */
-+      s = string;
-+      if (prog->regstart != '\0')
-+              /* We know what char it must start with. */
-+              while ((s = strchr(s, prog->regstart)) != NULL) {
-+                      if (regtry(&g, prog, s))
-+                              return(1);
-+                      s++;
-+              }
-+      else
-+              /* We don't -- general case. */
-+              do {
-+                      if (regtry(&g, prog, s))
-+                              return(1);
-+              } while (*s++ != '\0');
-+
-+      /* Failure. */
-+      return(0);
-+}
-+
-+/*
-+ - regtry - try match at specific point
-+ */
-+static int                    /* 0 failure, 1 success */
-+regtry(struct match_globals *g, regexp *prog, char *string)
-+{
-+      register int i;
-+      register char **sp;
-+      register char **ep;
-+
-+      g->reginput = string;
-+      g->regstartp = prog->startp;
-+      g->regendp = prog->endp;
-+
-+      sp = prog->startp;
-+      ep = prog->endp;
-+      for (i = NSUBEXP; i > 0; i--) {
-+              *sp++ = NULL;
-+              *ep++ = NULL;
-+      }
-+      if (regmatch(g, prog->program + 1)) {
-+              prog->startp[0] = string;
-+              prog->endp[0] = g->reginput;
-+              return(1);
-+      } else
-+              return(0);
-+}
-+
-+/*
-+ - regmatch - main matching routine
-+ *
-+ * Conceptually the strategy is simple:  check to see whether the current
-+ * node matches, call self recursively to see whether the rest matches,
-+ * and then act accordingly.  In practice we make some effort to avoid
-+ * recursion, in particular by going through "ordinary" nodes (that don't
-+ * need to know whether the rest of the match failed) by a loop instead of
-+ * by recursion.
-+ */
-+static int                    /* 0 failure, 1 success */
-+regmatch(struct match_globals *g, char *prog)
-+{
-+      register char *scan = prog; /* Current node. */
-+      char *next;                 /* Next node. */
-+
-+#ifdef DEBUG
-+      if (scan != NULL && regnarrate)
-+              fprintf(stderr, "%s(\n", regprop(scan));
-+#endif
-+      while (scan != NULL) {
-+#ifdef DEBUG
-+              if (regnarrate)
-+                      fprintf(stderr, "%s...\n", regprop(scan));
-+#endif
-+              next = regnext(g, scan);
-+
-+              switch (OP(scan)) {
-+              case BOL:
-+                      if (g->reginput != g->regbol)
-+                              return(0);
-+                      break;
-+              case EOL:
-+                      if (*g->reginput != '\0')
-+                              return(0);
-+                      break;
-+              case ANY:
-+                      if (*g->reginput == '\0')
-+                              return(0);
-+                      g->reginput++;
-+                      break;
-+              case EXACTLY: {
-+                              register int len;
-+                              register char *opnd;
-+
-+                              opnd = OPERAND(scan);
-+                              /* Inline the first character, for speed. */
-+                              if (*opnd != *g->reginput)
-+                                      return(0);
-+                              len = strlen(opnd);
-+                              if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
-+                                      return(0);
-+                              g->reginput += len;
-+                      }
-+                      break;
-+              case ANYOF:
-+                      if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
-+                              return(0);
-+                      g->reginput++;
-+                      break;
-+              case ANYBUT:
-+                      if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
-+                              return(0);
-+                      g->reginput++;
-+                      break;
-+              case NOTHING:
-+              case BACK:
-+                      break;
-+              case OPEN+1:
-+              case OPEN+2:
-+              case OPEN+3:
-+              case OPEN+4:
-+              case OPEN+5:
-+              case OPEN+6:
-+              case OPEN+7:
-+              case OPEN+8:
-+              case OPEN+9: {
-+                              register int no;
-+                              register char *save;
-+
-+                              no = OP(scan) - OPEN;
-+                              save = g->reginput;
-+
-+                              if (regmatch(g, next)) {
-+                                      /*
-+                                       * Don't set startp if some later
-+                                       * invocation of the same parentheses
-+                                       * already has.
-+                                       */
-+                                      if (g->regstartp[no] == NULL)
-+                                              g->regstartp[no] = save;
-+                                      return(1);
-+                              } else
-+                                      return(0);
-+                      }
-+                      break;
-+              case CLOSE+1:
-+              case CLOSE+2:
-+              case CLOSE+3:
-+              case CLOSE+4:
-+              case CLOSE+5:
-+              case CLOSE+6:
-+              case CLOSE+7:
-+              case CLOSE+8:
-+              case CLOSE+9:
-+                      {
-+                              register int no;
-+                              register char *save;
-+
-+                              no = OP(scan) - CLOSE;
-+                              save = g->reginput;
-+
-+                              if (regmatch(g, next)) {
-+                                      /*
-+                                       * Don't set endp if some later
-+                                       * invocation of the same parentheses
-+                                       * already has.
-+                                       */
-+                                      if (g->regendp[no] == NULL)
-+                                              g->regendp[no] = save;
-+                                      return(1);
-+                              } else
-+                                      return(0);
-+                      }
-+                      break;
-+              case BRANCH: {
-+                              register char *save;
-+
-+                              if (OP(next) != BRANCH)         /* No choice. */
-+                                      next = OPERAND(scan);   /* Avoid recursion. */
-+                              else {
-+                                      do {
-+                                              save = g->reginput;
-+                                              if (regmatch(g, OPERAND(scan)))
-+                                                      return(1);
-+                                              g->reginput = save;
-+                                              scan = regnext(g, scan);
-+                                      } while (scan != NULL && OP(scan) == BRANCH);
-+                                      return(0);
-+                                      /* NOTREACHED */
-+                              }
-+                      }
-+                      break;
-+              case STAR:
-+              case PLUS: {
-+                              register char nextch;
-+                              register int no;
-+                              register char *save;
-+                              register int min;
-+
-+                              /*
-+                               * Lookahead to avoid useless match attempts
-+                               * when we know what character comes next.
-+                               */
-+                              nextch = '\0';
-+                              if (OP(next) == EXACTLY)
-+                                      nextch = *OPERAND(next);
-+                              min = (OP(scan) == STAR) ? 0 : 1;
-+                              save = g->reginput;
-+                              no = regrepeat(g, OPERAND(scan));
-+                              while (no >= min) {
-+                                      /* If it could work, try it. */
-+                                      if (nextch == '\0' || *g->reginput == nextch)
-+                                              if (regmatch(g, next))
-+                                                      return(1);
-+                                      /* Couldn't or didn't -- back up. */
-+                                      no--;
-+                                      g->reginput = save + no;
-+                              }
-+                              return(0);
-+                      }
-+                      break;
-+              case END:
-+                      return(1);      /* Success! */
-+                      break;
-+              default:
-+                      printk("<3>Regexp: memory corruption\n");
-+                      return(0);
-+                      break;
-+              }
-+
-+              scan = next;
-+      }
-+
-+      /*
-+       * We get here only if there's trouble -- normally "case END" is
-+       * the terminating point.
-+       */
-+      printk("<3>Regexp: corrupted pointers\n");
-+      return(0);
-+}
-+
-+/*
-+ - regrepeat - repeatedly match something simple, report how many
-+ */
-+static int
-+regrepeat(struct match_globals *g, char *p)
-+{
-+      register int count = 0;
-+      register char *scan;
-+      register char *opnd;
-+
-+      scan = g->reginput;
-+      opnd = OPERAND(p);
-+      switch (OP(p)) {
-+      case ANY:
-+              count = strlen(scan);
-+              scan += count;
-+              break;
-+      case EXACTLY:
-+              while (*opnd == *scan) {
-+                      count++;
-+                      scan++;
-+              }
-+              break;
-+      case ANYOF:
-+              while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
-+                      count++;
-+                      scan++;
-+              }
-+              break;
-+      case ANYBUT:
-+              while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
-+                      count++;
-+                      scan++;
-+              }
-+              break;
-+      default:                /* Oh dear.  Called inappropriately. */
-+              printk("<3>Regexp: internal foulup\n");
-+              count = 0;      /* Best compromise. */
-+              break;
-+      }
-+      g->reginput = scan;
-+
-+      return(count);
-+}
-+
-+/*
-+ - regnext - dig the "next" pointer out of a node
-+ */
-+static char*
-+regnext(struct match_globals *g, char *p)
-+{
-+      register int offset;
-+
-+      if (p == &g->regdummy)
-+              return(NULL);
-+
-+      offset = NEXT(p);
-+      if (offset == 0)
-+              return(NULL);
-+
-+      if (OP(p) == BACK)
-+              return(p-offset);
-+      else
-+              return(p+offset);
-+}
-+
-+#ifdef DEBUG
-+
-+STATIC char *regprop();
-+
-+/*
-+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
-+ */
-+void
-+regdump(regexp *r)
-+{
-+      register char *s;
-+      register char op = EXACTLY;     /* Arbitrary non-END op. */
-+      register char *next;
-+      /* extern char *strchr(); */
-+
-+
-+      s = r->program + 1;
-+      while (op != END) {     /* While that wasn't END last time... */
-+              op = OP(s);
-+              printf("%2d%s", s-r->program, regprop(s));      /* Where, what. */
-+              next = regnext(s);
-+              if (next == NULL)               /* Next ptr. */
-+                      printf("(0)");
-+              else
-+                      printf("(%d)", (s-r->program)+(next-s));
-+              s += 3;
-+              if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
-+                      /* Literal string, where present. */
-+                      while (*s != '\0') {
-+                              putchar(*s);
-+                              s++;
-+                      }
-+                      s++;
-+              }
-+              putchar('\n');
-+      }
-+
-+      /* Header fields of interest. */
-+      if (r->regstart != '\0')
-+              printf("start `%c' ", r->regstart);
-+      if (r->reganch)
-+              printf("anchored ");
-+      if (r->regmust != NULL)
-+              printf("must have \"%s\"", r->regmust);
-+      printf("\n");
-+}
-+
-+/*
-+ - regprop - printable representation of opcode
-+ */
-+static char *
-+regprop(char *op)
-+{
-+#define BUFLEN 50
-+      register char *p;
-+      static char buf[BUFLEN];
-+
-+      strcpy(buf, ":");
-+
-+      switch (OP(op)) {
-+      case BOL:
-+              p = "BOL";
-+              break;
-+      case EOL:
-+              p = "EOL";
-+              break;
-+      case ANY:
-+              p = "ANY";
-+              break;
-+      case ANYOF:
-+              p = "ANYOF";
-+              break;
-+      case ANYBUT:
-+              p = "ANYBUT";
-+              break;
-+      case BRANCH:
-+              p = "BRANCH";
-+              break;
-+      case EXACTLY:
-+              p = "EXACTLY";
-+              break;
-+      case NOTHING:
-+              p = "NOTHING";
-+              break;
-+      case BACK:
-+              p = "BACK";
-+              break;
-+      case END:
-+              p = "END";
-+              break;
-+      case OPEN+1:
-+      case OPEN+2:
-+      case OPEN+3:
-+      case OPEN+4:
-+      case OPEN+5:
-+      case OPEN+6:
-+      case OPEN+7:
-+      case OPEN+8:
-+      case OPEN+9:
-+              snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
-+              p = NULL;
-+              break;
-+      case CLOSE+1:
-+      case CLOSE+2:
-+      case CLOSE+3:
-+      case CLOSE+4:
-+      case CLOSE+5:
-+      case CLOSE+6:
-+      case CLOSE+7:
-+      case CLOSE+8:
-+      case CLOSE+9:
-+              snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
-+              p = NULL;
-+              break;
-+      case STAR:
-+              p = "STAR";
-+              break;
-+      case PLUS:
-+              p = "PLUS";
-+              break;
-+      default:
-+              printk("<3>Regexp: corrupted opcode\n");
-+              break;
-+      }
-+      if (p != NULL)
-+              strncat(buf, p, BUFLEN-strlen(buf));
-+      return(buf);
-+}
-+#endif
-+
-+
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Definitions etc. for regexp(3) routines.
-+ *
-+ * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
-+ * not the System V one.
-+ */
-+
-+#ifndef REGEXP_H
-+#define REGEXP_H
-+
-+
-+/*
-+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
-+which contains a version of this library, says:
-+
-+ *
-+ * NSUBEXP must be at least 10, and no greater than 117 or the parser
-+ * will not work properly.
-+ *
-+
-+However, it looks rather like this library is limited to 10.  If you think
-+otherwise, let us know.
-+*/
-+
-+#define NSUBEXP  10
-+typedef struct regexp {
-+      char *startp[NSUBEXP];
-+      char *endp[NSUBEXP];
-+      char regstart;          /* Internal use only. */
-+      char reganch;           /* Internal use only. */
-+      char *regmust;          /* Internal use only. */
-+      int regmlen;            /* Internal use only. */
-+      char program[1];        /* Unwarranted chumminess with compiler. */
-+} regexp;
-+
-+regexp * regcomp(char *exp, int *patternsize);
-+int regexec(regexp *prog, char *string);
-+void regsub(regexp *prog, char *source, char *dest);
-+void regerror(char *s);
-+
-+#endif
---- /dev/null
-+++ b/net/netfilter/regexp/regmagic.h
-@@ -0,0 +1,5 @@
-+/*
-+ * The first byte of the regexp internal "program" is actually this magic
-+ * number; the start node begins in the second byte.
-+ */
-+#define       MAGIC   0234
---- /dev/null
-+++ b/net/netfilter/regexp/regsub.c
-@@ -0,0 +1,95 @@
-+/*
-+ * regsub
-+ * @(#)regsub.c       1.3 of 2 April 86
-+ *
-+ *    Copyright (c) 1986 by University of Toronto.
-+ *    Written by Henry Spencer.  Not derived from licensed software.
-+ *
-+ *    Permission is granted to anyone to use this software for any
-+ *    purpose on any computer system, and to redistribute it freely,
-+ *    subject to the following restrictions:
-+ *
-+ *    1. The author is not responsible for the consequences of use of
-+ *            this software, no matter how awful, even if they arise
-+ *            from defects in it.
-+ *
-+ *    2. The origin of this software must not be misrepresented, either
-+ *            by explicit claim or by omission.
-+ *
-+ *    3. Altered versions must be plainly marked as such, and must not
-+ *            be misrepresented as being the original software.
-+ *
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ */
-+#include "regexp.h"
-+#include "regmagic.h"
-+#include <linux/string.h>
-+
-+
-+#ifndef CHARBITS
-+#define       UCHARAT(p)      ((int)*(unsigned char *)(p))
-+#else
-+#define       UCHARAT(p)      ((int)*(p)&CHARBITS)
-+#endif
-+
-+#if 0
-+//void regerror(char * s)
-+//{
-+//        printk("regexp(3): %s", s);
-+//        /* NOTREACHED */
-+//}
-+#endif
-+
-+/*
-+ - regsub - perform substitutions after a regexp match
-+ */
-+void
-+regsub(regexp * prog, char * source, char * dest)
-+{
-+      register char *src;
-+      register char *dst;
-+      register char c;
-+      register int no;
-+      register int len;
-+      
-+      /* Not necessary and gcc doesn't like it -MLS */
-+      /*extern char *strncpy();*/
-+
-+      if (prog == NULL || source == NULL || dest == NULL) {
-+              regerror("NULL parm to regsub");
-+              return;
-+      }
-+      if (UCHARAT(prog->program) != MAGIC) {
-+              regerror("damaged regexp fed to regsub");
-+              return;
-+      }
-+
-+      src = source;
-+      dst = dest;
-+      while ((c = *src++) != '\0') {
-+              if (c == '&')
-+                      no = 0;
-+              else if (c == '\\' && '0' <= *src && *src <= '9')
-+                      no = *src++ - '0';
-+              else
-+                      no = -1;
-+
-+              if (no < 0) {   /* Ordinary character. */
-+                      if (c == '\\' && (*src == '\\' || *src == '&'))
-+                              c = *src++;
-+                      *dst++ = c;
-+              } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
-+                      len = prog->endp[no] - prog->startp[no];
-+                      (void) strncpy(dst, prog->startp[no], len);
-+                      dst += len;
-+                      if (len != 0 && *(dst-1) == '\0') {     /* strncpy hit NUL. */
-+                              regerror("damaged match string");
-+                              return;
-+                      }
-+              }
-+      }
-+      *dst++ = '\0';
-+}
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -206,6 +206,14 @@ destroy_conntrack(struct nf_conntrack *n
-        * too. */
-       nf_ct_remove_expectations(ct);
-+      #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+      if(ct->layer7.app_proto)
-+              kfree(ct->layer7.app_proto);
-+      if(ct->layer7.app_data)
-+      kfree(ct->layer7.app_data);
-+      #endif
-+
-+
-       /* We overload first tuple to link into unconfirmed list. */
-       if (!nf_ct_is_confirmed(ct)) {
-               BUG_ON(hlist_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnode));
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -180,7 +180,12 @@ static int ct_seq_show(struct seq_file *
-               return -ENOSPC;
- #endif
--      if (seq_printf(s, "use=%u\n", atomic_read(&conntrack->ct_general.use)))
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+      if(conntrack->layer7.app_proto)
-+              if(seq_printf(s, "l7proto=%s ", conntrack->layer7.app_proto))
-+                      return -ENOSPC;
-+#endif
-+      if (seq_printf(s, "asdfuse=%u\n", atomic_read(&conntrack->ct_general.use)))
-               return -ENOSPC;
-       return 0;
---- a/include/net/netfilter/nf_conntrack.h
-+++ b/include/net/netfilter/nf_conntrack.h
-@@ -124,6 +124,22 @@ struct nf_conn
-       u_int32_t secmark;
- #endif
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
-+    defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+      struct {
-+              /*
-+               * e.g. "http". NULL before decision. "unknown" after decision
-+               * if no match.
-+               */
-+              char *app_proto;
-+              /*
-+               * application layer data so far. NULL after match decision.
-+               */
-+              char *app_data;
-+              unsigned int app_data_len;
-+      } layer7;
-+#endif
-+
-       /* Storage reserved for other modules: */
-       union nf_conntrack_proto proto;
---- /dev/null
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -0,0 +1,13 @@
-+#ifndef _XT_LAYER7_H
-+#define _XT_LAYER7_H
-+
-+#define MAX_PATTERN_LEN 8192
-+#define MAX_PROTOCOL_LEN 256
-+
-+struct xt_layer7_info {
-+    char protocol[MAX_PROTOCOL_LEN];
-+    char pattern[MAX_PATTERN_LEN];
-+    u_int8_t invert;
-+};
-+
-+#endif /* _XT_LAYER7_H */
diff --git a/target/linux/generic-2.6/patches-2.6.24/101-netfilter_layer7_pktmatch.patch b/target/linux/generic-2.6/patches-2.6.24/101-netfilter_layer7_pktmatch.patch
deleted file mode 100644 (file)
index be2dff8..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
---- a/include/linux/netfilter/xt_layer7.h
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -8,6 +8,7 @@ struct xt_layer7_info {
-     char protocol[MAX_PROTOCOL_LEN];
-     char pattern[MAX_PATTERN_LEN];
-     u_int8_t invert;
-+    u_int8_t pkt;
- };
- #endif /* _XT_LAYER7_H */
---- a/net/netfilter/xt_layer7.c
-+++ b/net/netfilter/xt_layer7.c
-@@ -297,34 +297,36 @@ static int match_no_append(struct nf_con
- }
- /* add the new app data to the conntrack.  Return number of bytes added. */
--static int add_data(struct nf_conn * master_conntrack,
--                    char * app_data, int appdatalen)
-+static int add_datastr(char *target, int offset, char *app_data, int len)
- {
-       int length = 0, i;
--      int oldlength = master_conntrack->layer7.app_data_len;
--
--      /* This is a fix for a race condition by Deti Fliegl. However, I'm not 
--         clear on whether the race condition exists or whether this really 
--         fixes it.  I might just be being dense... Anyway, if it's not really 
--         a fix, all it does is waste a very small amount of time. */
--      if(!master_conntrack->layer7.app_data) return 0;
-+      
-+      if (!target) return 0;
-       /* Strip nulls. Make everything lower case (our regex lib doesn't
-       do case insensitivity).  Add it to the end of the current data. */
--      for(i = 0; i < maxdatalen-oldlength-1 &&
--                 i < appdatalen; i++) {
-+      for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
-               if(app_data[i] != '\0') {
-                       /* the kernel version of tolower mungs 'upper ascii' */
--                      master_conntrack->layer7.app_data[length+oldlength] =
-+                      target[length+offset] =
-                               isascii(app_data[i])? 
-                                       tolower(app_data[i]) : app_data[i];
-                       length++;
-               }
-       }
-+      target[length+offset] = '\0';
-+      
-+      return length;
-+}
--      master_conntrack->layer7.app_data[length+oldlength] = '\0';
--      master_conntrack->layer7.app_data_len = length + oldlength;
-+/* add the new app data to the conntrack.  Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+                    char * app_data, int appdatalen)
-+{
-+      int length;
-+      length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
-+      master_conntrack->layer7.app_data_len += length;
-       return length;
- }
-@@ -411,7 +413,7 @@ match(const struct sk_buff *skbin,
-       const struct xt_layer7_info * info = matchinfo;
-       enum ip_conntrack_info master_ctinfo, ctinfo;
-       struct nf_conn *master_conntrack, *conntrack;
--      unsigned char * app_data;
-+      unsigned char *app_data, *tmp_data;
-       unsigned int pattern_result, appdatalen;
-       regexp * comppattern;
-@@ -439,8 +441,8 @@ match(const struct sk_buff *skbin,
-               master_conntrack = master_ct(master_conntrack);
-       /* if we've classified it or seen too many packets */
--      if(TOTAL_PACKETS > num_packets ||
--         master_conntrack->layer7.app_proto) {
-+      if(!info->pkt && (TOTAL_PACKETS > num_packets ||
-+         master_conntrack->layer7.app_proto)) {
-               pattern_result = match_no_append(conntrack, master_conntrack, 
-                                                ctinfo, master_ctinfo, info);
-@@ -473,6 +475,25 @@ match(const struct sk_buff *skbin,
-       /* the return value gets checked later, when we're ready to use it */
-       comppattern = compile_and_cache(info->pattern, info->protocol);
-+      if (info->pkt) {
-+              tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
-+              if(!tmp_data){
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
-+                      return info->invert;
-+              }
-+
-+              tmp_data[0] = '\0';
-+              add_datastr(tmp_data, 0, app_data, appdatalen);
-+              pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
-+
-+              kfree(tmp_data);
-+              tmp_data = NULL;
-+              spin_unlock_bh(&l7_lock);
-+
-+              return (pattern_result ^ info->invert);
-+      }
-+
-       /* On the first packet of a connection, allocate space for app data */
-       if(TOTAL_PACKETS == 1 && !skb->cb[0] && 
-          !master_conntrack->layer7.app_data){
diff --git a/target/linux/generic-2.6/patches-2.6.24/130-netfilter_ipset.patch b/target/linux/generic-2.6/patches-2.6.24/130-netfilter_ipset.patch
deleted file mode 100644 (file)
index 641d8b4..0000000
+++ /dev/null
@@ -1,7688 +0,0 @@
---- a/include/linux/netfilter_ipv4/Kbuild
-+++ b/include/linux/netfilter_ipv4/Kbuild
-@@ -45,3 +45,14 @@ header-y += ipt_ttl.h
- unifdef-y += ip_queue.h
- unifdef-y += ip_tables.h
-+
-+unifdef-y += ip_set.h
-+header-y  += ip_set_iphash.h
-+header-y  += ip_set_ipmap.h
-+header-y  += ip_set_ipporthash.h
-+unifdef-y += ip_set_iptree.h
-+unifdef-y += ip_set_iptreemap.h
-+header-y  += ip_set_jhash.h
-+header-y  += ip_set_macipmap.h
-+unifdef-y += ip_set_nethash.h
-+header-y  += ip_set_portmap.h
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set.h
-@@ -0,0 +1,498 @@
-+#ifndef _IP_SET_H
-+#define _IP_SET_H
-+
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ *                         Martin Josefsson <gandalf@wlug.westbo.se>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+#if 0
-+#define IP_SET_DEBUG
-+#endif
-+
-+/*
-+ * A sockopt of such quality has hardly ever been seen before on the open
-+ * market!  This little beauty, hardly ever used: above 64, so it's
-+ * traditionally used for firewalling, not touched (even once!) by the
-+ * 2.0, 2.2 and 2.4 kernels!
-+ *
-+ * Comes with its own certificate of authenticity, valid anywhere in the
-+ * Free world!
-+ *
-+ * Rusty, 19.4.2000
-+ */
-+#define SO_IP_SET             83
-+
-+/*
-+ * Heavily modify by Joakim Axelsson 08.03.2002
-+ * - Made it more modulebased
-+ *
-+ * Additional heavy modifications by Jozsef Kadlecsik 22.02.2004
-+ * - bindings added
-+ * - in order to "deal with" backward compatibility, renamed to ipset
-+ */
-+
-+/* 
-+ * Used so that the kernel module and ipset-binary can match their versions 
-+ */
-+#define IP_SET_PROTOCOL_VERSION 2
-+
-+#define IP_SET_MAXNAMELEN 32  /* set names and set typenames */
-+
-+/* Lets work with our own typedef for representing an IP address.
-+ * We hope to make the code more portable, possibly to IPv6...
-+ *
-+ * The representation works in HOST byte order, because most set types
-+ * will perform arithmetic operations and compare operations.
-+ * 
-+ * For now the type is an uint32_t.
-+ *
-+ * Make sure to ONLY use the functions when translating and parsing
-+ * in order to keep the host byte order and make it more portable:
-+ *  parse_ip()
-+ *  parse_mask()
-+ *  parse_ipandmask()
-+ *  ip_tostring()
-+ * (Joakim: where are they???)
-+ */
-+
-+typedef uint32_t ip_set_ip_t;
-+
-+/* Sets are identified by an id in kernel space. Tweak with ip_set_id_t
-+ * and IP_SET_INVALID_ID if you want to increase the max number of sets.
-+ */
-+typedef uint16_t ip_set_id_t;
-+
-+#define IP_SET_INVALID_ID     65535
-+
-+/* How deep we follow bindings */
-+#define IP_SET_MAX_BINDINGS   6
-+
-+/*
-+ * Option flags for kernel operations (ipt_set_info)
-+ */
-+#define IPSET_SRC             0x01    /* Source match/add */
-+#define IPSET_DST             0x02    /* Destination match/add */
-+#define IPSET_MATCH_INV               0x04    /* Inverse matching */
-+
-+/*
-+ * Set features
-+ */
-+#define IPSET_TYPE_IP         0x01    /* IP address type of set */
-+#define IPSET_TYPE_PORT               0x02    /* Port type of set */
-+#define IPSET_DATA_SINGLE     0x04    /* Single data storage */
-+#define IPSET_DATA_DOUBLE     0x08    /* Double data storage */
-+
-+/* Reserved keywords */
-+#define IPSET_TOKEN_DEFAULT   ":default:"
-+#define IPSET_TOKEN_ALL               ":all:"
-+
-+/* SO_IP_SET operation constants, and their request struct types.
-+ *
-+ * Operation ids:
-+ *      0-99:  commands with version checking
-+ *    100-199: add/del/test/bind/unbind
-+ *    200-299: list, save, restore
-+ */
-+
-+/* Single shot operations: 
-+ * version, create, destroy, flush, rename and swap 
-+ *
-+ * Sets are identified by name.
-+ */
-+
-+#define IP_SET_REQ_STD                \
-+      unsigned op;            \
-+      unsigned version;       \
-+      char name[IP_SET_MAXNAMELEN]
-+
-+#define IP_SET_OP_CREATE      0x00000001      /* Create a new (empty) set */
-+struct ip_set_req_create {
-+      IP_SET_REQ_STD;
-+      char typename[IP_SET_MAXNAMELEN];
-+};
-+
-+#define IP_SET_OP_DESTROY     0x00000002      /* Remove a (empty) set */
-+struct ip_set_req_std {
-+      IP_SET_REQ_STD;
-+};
-+
-+#define IP_SET_OP_FLUSH               0x00000003      /* Remove all IPs in a set */
-+/* Uses ip_set_req_std */
-+
-+#define IP_SET_OP_RENAME      0x00000004      /* Rename a set */
-+/* Uses ip_set_req_create */
-+
-+#define IP_SET_OP_SWAP                0x00000005      /* Swap two sets */
-+/* Uses ip_set_req_create */
-+
-+union ip_set_name_index {
-+      char name[IP_SET_MAXNAMELEN];
-+      ip_set_id_t index;
-+};
-+
-+#define IP_SET_OP_GET_BYNAME  0x00000006      /* Get set index by name */
-+struct ip_set_req_get_set {
-+      unsigned op;
-+      unsigned version;
-+      union ip_set_name_index set;
-+};
-+
-+#define IP_SET_OP_GET_BYINDEX 0x00000007      /* Get set name by index */
-+/* Uses ip_set_req_get_set */
-+
-+#define IP_SET_OP_VERSION     0x00000100      /* Ask kernel version */
-+struct ip_set_req_version {
-+      unsigned op;
-+      unsigned version;
-+};
-+
-+/* Double shots operations: 
-+ * add, del, test, bind and unbind.
-+ *
-+ * First we query the kernel to get the index and type of the target set,
-+ * then issue the command. Validity of IP is checked in kernel in order
-+ * to minimalize sockopt operations.
-+ */
-+
-+/* Get minimal set data for add/del/test/bind/unbind IP */
-+#define IP_SET_OP_ADT_GET     0x00000010      /* Get set and type */
-+struct ip_set_req_adt_get {
-+      unsigned op;
-+      unsigned version;
-+      union ip_set_name_index set;
-+      char typename[IP_SET_MAXNAMELEN];
-+};
-+
-+#define IP_SET_REQ_BYINDEX    \
-+      unsigned op;            \
-+      ip_set_id_t index;
-+
-+struct ip_set_req_adt {
-+      IP_SET_REQ_BYINDEX;
-+};
-+
-+#define IP_SET_OP_ADD_IP      0x00000101      /* Add an IP to a set */
-+/* Uses ip_set_req_adt, with type specific addage */
-+
-+#define IP_SET_OP_DEL_IP      0x00000102      /* Remove an IP from a set */
-+/* Uses ip_set_req_adt, with type specific addage */
-+
-+#define IP_SET_OP_TEST_IP     0x00000103      /* Test an IP in a set */
-+/* Uses ip_set_req_adt, with type specific addage */
-+
-+#define IP_SET_OP_BIND_SET    0x00000104      /* Bind an IP to a set */
-+/* Uses ip_set_req_bind, with type specific addage */
-+struct ip_set_req_bind {
-+      IP_SET_REQ_BYINDEX;
-+      char binding[IP_SET_MAXNAMELEN];
-+};
-+
-+#define IP_SET_OP_UNBIND_SET  0x00000105      /* Unbind an IP from a set */
-+/* Uses ip_set_req_bind, with type speficic addage 
-+ * index = 0 means unbinding for all sets */
-+
-+#define IP_SET_OP_TEST_BIND_SET       0x00000106      /* Test binding an IP to a set */
-+/* Uses ip_set_req_bind, with type specific addage */
-+
-+/* Multiple shots operations: list, save, restore.
-+ *
-+ * - check kernel version and query the max number of sets
-+ * - get the basic information on all sets
-+ *   and size required for the next step
-+ * - get actual set data: header, data, bindings
-+ */
-+
-+/* Get max_sets and the index of a queried set
-+ */
-+#define IP_SET_OP_MAX_SETS    0x00000020
-+struct ip_set_req_max_sets {
-+      unsigned op;
-+      unsigned version;
-+      ip_set_id_t max_sets;           /* max_sets */
-+      ip_set_id_t sets;               /* real number of sets */
-+      union ip_set_name_index set;    /* index of set if name used */
-+};
-+
-+/* Get the id and name of the sets plus size for next step */
-+#define IP_SET_OP_LIST_SIZE   0x00000201
-+#define IP_SET_OP_SAVE_SIZE   0x00000202
-+struct ip_set_req_setnames {
-+      unsigned op;
-+      ip_set_id_t index;              /* set to list/save */
-+      size_t size;                    /* size to get setdata/bindings */
-+      /* followed by sets number of struct ip_set_name_list */
-+};
-+
-+struct ip_set_name_list {
-+      char name[IP_SET_MAXNAMELEN];
-+      char typename[IP_SET_MAXNAMELEN];
-+      ip_set_id_t index;
-+      ip_set_id_t id;
-+};
-+
-+/* The actual list operation */
-+#define IP_SET_OP_LIST                0x00000203
-+struct ip_set_req_list {
-+      IP_SET_REQ_BYINDEX;
-+      /* sets number of struct ip_set_list in reply */ 
-+};
-+
-+struct ip_set_list {
-+      ip_set_id_t index;
-+      ip_set_id_t binding;
-+      u_int32_t ref;
-+      size_t header_size;     /* Set header data of header_size */
-+      size_t members_size;    /* Set members data of members_size */
-+      size_t bindings_size;   /* Set bindings data of bindings_size */
-+};
-+
-+struct ip_set_hash_list {
-+      ip_set_ip_t ip;
-+      ip_set_id_t binding;
-+};
-+
-+/* The save operation */
-+#define IP_SET_OP_SAVE                0x00000204
-+/* Uses ip_set_req_list, in the reply replaced by
-+ * sets number of struct ip_set_save plus a marker
-+ * ip_set_save followed by ip_set_hash_save structures.
-+ */
-+struct ip_set_save {
-+      ip_set_id_t index;
-+      ip_set_id_t binding;
-+      size_t header_size;     /* Set header data of header_size */
-+      size_t members_size;    /* Set members data of members_size */
-+};
-+
-+/* At restoring, ip == 0 means default binding for the given set: */
-+struct ip_set_hash_save {
-+      ip_set_ip_t ip;
-+      ip_set_id_t id;
-+      ip_set_id_t binding;
-+};
-+
-+/* The restore operation */
-+#define IP_SET_OP_RESTORE     0x00000205
-+/* Uses ip_set_req_setnames followed by ip_set_restore structures
-+ * plus a marker ip_set_restore, followed by ip_set_hash_save 
-+ * structures.
-+ */
-+struct ip_set_restore {
-+      char name[IP_SET_MAXNAMELEN];
-+      char typename[IP_SET_MAXNAMELEN];
-+      ip_set_id_t index;
-+      size_t header_size;     /* Create data of header_size */
-+      size_t members_size;    /* Set members data of members_size */
-+};
-+
-+static inline int bitmap_bytes(ip_set_ip_t a, ip_set_ip_t b)
-+{
-+      return 4 * ((((b - a + 8) / 8) + 3) / 4);
-+}
-+
-+#ifdef __KERNEL__
-+
-+#define ip_set_printk(format, args...)                        \
-+      do {                                                    \
-+              printk("%s: %s: ", __FILE__, __FUNCTION__);     \
-+              printk(format "\n" , ## args);                  \
-+      } while (0)
-+
-+#if defined(IP_SET_DEBUG)
-+#define DP(format, args...)                                   \
-+      do {                                                    \
-+              printk("%s: %s (DBG): ", __FILE__, __FUNCTION__);\
-+              printk(format "\n" , ## args);                  \
-+      } while (0)
-+#define IP_SET_ASSERT(x)                                      \
-+      do {                                                    \
-+              if (!(x))                                       \
-+                      printk("IP_SET_ASSERT: %s:%i(%s)\n",    \
-+                              __FILE__, __LINE__, __FUNCTION__); \
-+      } while (0)
-+#else
-+#define DP(format, args...)
-+#define IP_SET_ASSERT(x)
-+#endif
-+
-+struct ip_set;
-+
-+/*
-+ * The ip_set_type definition - one per set type, e.g. "ipmap".
-+ *
-+ * Each individual set has a pointer, set->type, going to one
-+ * of these structures. Function pointers inside the structure implement
-+ * the real behaviour of the sets.
-+ *
-+ * If not mentioned differently, the implementation behind the function
-+ * pointers of a set_type, is expected to return 0 if ok, and a negative
-+ * errno (e.g. -EINVAL) on error.
-+ */
-+struct ip_set_type {
-+      struct list_head list;  /* next in list of set types */
-+
-+      /* test for IP in set (kernel: iptables -m set src|dst)
-+       * return 0 if not in set, 1 if in set.
-+       */
-+      int (*testip_kernel) (struct ip_set *set,
-+                            const struct sk_buff * skb, 
-+                            ip_set_ip_t *ip,
-+                            const u_int32_t *flags,
-+                            unsigned char index);
-+
-+      /* test for IP in set (userspace: ipset -T set IP)
-+       * return 0 if not in set, 1 if in set.
-+       */
-+      int (*testip) (struct ip_set *set,
-+                     const void *data, size_t size,
-+                     ip_set_ip_t *ip);
-+
-+      /*
-+       * Size of the data structure passed by when
-+       * adding/deletin/testing an entry.
-+       */
-+      size_t reqsize;
-+
-+      /* Add IP into set (userspace: ipset -A set IP)
-+       * Return -EEXIST if the address is already in the set,
-+       * and -ERANGE if the address lies outside the set bounds.
-+       * If the address was not already in the set, 0 is returned.
-+       */
-+      int (*addip) (struct ip_set *set, 
-+                    const void *data, size_t size,
-+                    ip_set_ip_t *ip);
-+
-+      /* Add IP into set (kernel: iptables ... -j SET set src|dst)
-+       * Return -EEXIST if the address is already in the set,
-+       * and -ERANGE if the address lies outside the set bounds.
-+       * If the address was not already in the set, 0 is returned.
-+       */
-+      int (*addip_kernel) (struct ip_set *set,
-+                           const struct sk_buff * skb, 
-+                           ip_set_ip_t *ip,
-+                           const u_int32_t *flags,
-+                           unsigned char index);
-+
-+      /* remove IP from set (userspace: ipset -D set --entry x)
-+       * Return -EEXIST if the address is NOT in the set,
-+       * and -ERANGE if the address lies outside the set bounds.
-+       * If the address really was in the set, 0 is returned.
-+       */
-+      int (*delip) (struct ip_set *set, 
-+                    const void *data, size_t size,
-+                    ip_set_ip_t *ip);
-+
-+      /* remove IP from set (kernel: iptables ... -j SET --entry x)
-+       * Return -EEXIST if the address is NOT in the set,
-+       * and -ERANGE if the address lies outside the set bounds.
-+       * If the address really was in the set, 0 is returned.
-+       */
-+      int (*delip_kernel) (struct ip_set *set,
-+                           const struct sk_buff * skb, 
-+                           ip_set_ip_t *ip,
-+                           const u_int32_t *flags,
-+                           unsigned char index);
-+
-+      /* new set creation - allocated type specific items
-+       */
-+      int (*create) (struct ip_set *set,
-+                     const void *data, size_t size);
-+
-+      /* retry the operation after successfully tweaking the set
-+       */
-+      int (*retry) (struct ip_set *set);
-+
-+      /* set destruction - free type specific items
-+       * There is no return value.
-+       * Can be called only when child sets are destroyed.
-+       */
-+      void (*destroy) (struct ip_set *set);
-+
-+      /* set flushing - reset all bits in the set, or something similar.
-+       * There is no return value.
-+       */
-+      void (*flush) (struct ip_set *set);
-+
-+      /* Listing: size needed for header
-+       */
-+      size_t header_size;
-+
-+      /* Listing: Get the header
-+       *
-+       * Fill in the information in "data".
-+       * This function is always run after list_header_size() under a 
-+       * writelock on the set. Therefor is the length of "data" always 
-+       * correct. 
-+       */
-+      void (*list_header) (const struct ip_set *set, 
-+                           void *data);
-+
-+      /* Listing: Get the size for the set members
-+       */
-+      int (*list_members_size) (const struct ip_set *set);
-+
-+      /* Listing: Get the set members
-+       *
-+       * Fill in the information in "data".
-+       * This function is always run after list_member_size() under a 
-+       * writelock on the set. Therefor is the length of "data" always 
-+       * correct. 
-+       */
-+      void (*list_members) (const struct ip_set *set,
-+                            void *data);
-+
-+      char typename[IP_SET_MAXNAMELEN];
-+      unsigned char features;
-+      int protocol_version;
-+
-+      /* Set this to THIS_MODULE if you are a module, otherwise NULL */
-+      struct module *me;
-+};
-+
-+extern int ip_set_register_set_type(struct ip_set_type *set_type);
-+extern void ip_set_unregister_set_type(struct ip_set_type *set_type);
-+
-+/* A generic ipset */
-+struct ip_set {
-+      char name[IP_SET_MAXNAMELEN];   /* the name of the set */
-+      rwlock_t lock;                  /* lock for concurrency control */
-+      ip_set_id_t id;                 /* set id for swapping */
-+      ip_set_id_t binding;            /* default binding for the set */
-+      atomic_t ref;                   /* in kernel and in hash references */
-+      struct ip_set_type *type;       /* the set types */
-+      void *data;                     /* pooltype specific data */
-+};
-+
-+/* Structure to bind set elements to sets */
-+struct ip_set_hash {
-+      struct list_head list;          /* list of clashing entries in hash */
-+      ip_set_ip_t ip;                 /* ip from set */
-+      ip_set_id_t id;                 /* set id */
-+      ip_set_id_t binding;            /* set we bind the element to */
-+};
-+
-+/* register and unregister set references */
-+extern ip_set_id_t ip_set_get_byname(const char name[IP_SET_MAXNAMELEN]);
-+extern ip_set_id_t ip_set_get_byindex(ip_set_id_t id);
-+extern void ip_set_put(ip_set_id_t id);
-+
-+/* API for iptables set match, and SET target */
-+extern void ip_set_addip_kernel(ip_set_id_t id,
-+                              const struct sk_buff *skb,
-+                              const u_int32_t *flags);
-+extern void ip_set_delip_kernel(ip_set_id_t id,
-+                              const struct sk_buff *skb,
-+                              const u_int32_t *flags);
-+extern int ip_set_testip_kernel(ip_set_id_t id,
-+                              const struct sk_buff *skb,
-+                              const u_int32_t *flags);
-+
-+#endif                                /* __KERNEL__ */
-+
-+#endif /*_IP_SET_H*/
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_iphash.h
-@@ -0,0 +1,30 @@
-+#ifndef __IP_SET_IPHASH_H
-+#define __IP_SET_IPHASH_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "iphash"
-+#define MAX_RANGE 0x0000FFFF
-+
-+struct ip_set_iphash {
-+      ip_set_ip_t *members;           /* the iphash proper */
-+      uint32_t elements;              /* number of elements */
-+      uint32_t hashsize;              /* hash size */
-+      uint16_t probes;                /* max number of probes  */
-+      uint16_t resize;                /* resize factor in percent */
-+      ip_set_ip_t netmask;            /* netmask */
-+      void *initval[0];               /* initvals for jhash_1word */
-+};
-+
-+struct ip_set_req_iphash_create {
-+      uint32_t hashsize;
-+      uint16_t probes;
-+      uint16_t resize;
-+      ip_set_ip_t netmask;
-+};
-+
-+struct ip_set_req_iphash {
-+      ip_set_ip_t ip;
-+};
-+
-+#endif        /* __IP_SET_IPHASH_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_ipmap.h
-@@ -0,0 +1,56 @@
-+#ifndef __IP_SET_IPMAP_H
-+#define __IP_SET_IPMAP_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "ipmap"
-+#define MAX_RANGE 0x0000FFFF
-+
-+struct ip_set_ipmap {
-+      void *members;                  /* the ipmap proper */
-+      ip_set_ip_t first_ip;           /* host byte order, included in range */
-+      ip_set_ip_t last_ip;            /* host byte order, included in range */
-+      ip_set_ip_t netmask;            /* subnet netmask */
-+      ip_set_ip_t sizeid;             /* size of set in IPs */
-+      ip_set_ip_t hosts;              /* number of hosts in a subnet */
-+};
-+
-+struct ip_set_req_ipmap_create {
-+      ip_set_ip_t from;
-+      ip_set_ip_t to;
-+      ip_set_ip_t netmask;
-+};
-+
-+struct ip_set_req_ipmap {
-+      ip_set_ip_t ip;
-+};
-+
-+unsigned int
-+mask_to_bits(ip_set_ip_t mask)
-+{
-+      unsigned int bits = 32;
-+      ip_set_ip_t maskaddr;
-+      
-+      if (mask == 0xFFFFFFFF)
-+              return bits;
-+      
-+      maskaddr = 0xFFFFFFFE;
-+      while (--bits >= 0 && maskaddr != mask)
-+              maskaddr <<= 1;
-+      
-+      return bits;
-+}
-+
-+ip_set_ip_t
-+range_to_mask(ip_set_ip_t from, ip_set_ip_t to, unsigned int *bits)
-+{
-+      ip_set_ip_t mask = 0xFFFFFFFE;
-+      
-+      *bits = 32;
-+      while (--(*bits) >= 0 && mask && (to & mask) != from)
-+              mask <<= 1;
-+              
-+      return mask;
-+}
-+      
-+#endif /* __IP_SET_IPMAP_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_ipporthash.h
-@@ -0,0 +1,34 @@
-+#ifndef __IP_SET_IPPORTHASH_H
-+#define __IP_SET_IPPORTHASH_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "ipporthash"
-+#define MAX_RANGE 0x0000FFFF
-+#define INVALID_PORT  (MAX_RANGE + 1)
-+
-+struct ip_set_ipporthash {
-+      ip_set_ip_t *members;           /* the ipporthash proper */
-+      uint32_t elements;              /* number of elements */
-+      uint32_t hashsize;              /* hash size */
-+      uint16_t probes;                /* max number of probes  */
-+      uint16_t resize;                /* resize factor in percent */
-+      ip_set_ip_t first_ip;           /* host byte order, included in range */
-+      ip_set_ip_t last_ip;            /* host byte order, included in range */
-+      void *initval[0];               /* initvals for jhash_1word */
-+};
-+
-+struct ip_set_req_ipporthash_create {
-+      uint32_t hashsize;
-+      uint16_t probes;
-+      uint16_t resize;
-+      ip_set_ip_t from;
-+      ip_set_ip_t to;
-+};
-+
-+struct ip_set_req_ipporthash {
-+      ip_set_ip_t ip;
-+      ip_set_ip_t port;
-+};
-+
-+#endif        /* __IP_SET_IPPORTHASH_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_iptree.h
-@@ -0,0 +1,40 @@
-+#ifndef __IP_SET_IPTREE_H
-+#define __IP_SET_IPTREE_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "iptree"
-+#define MAX_RANGE 0x0000FFFF
-+
-+struct ip_set_iptreed {
-+      unsigned long expires[256];             /* x.x.x.ADDR */
-+};
-+
-+struct ip_set_iptreec {
-+      struct ip_set_iptreed *tree[256];       /* x.x.ADDR.* */
-+};
-+
-+struct ip_set_iptreeb {
-+      struct ip_set_iptreec *tree[256];       /* x.ADDR.*.* */
-+};
-+
-+struct ip_set_iptree {
-+      unsigned int timeout;
-+      unsigned int gc_interval;
-+#ifdef __KERNEL__
-+      uint32_t elements;              /* number of elements */
-+      struct timer_list gc;
-+      struct ip_set_iptreeb *tree[256];       /* ADDR.*.*.* */
-+#endif
-+};
-+
-+struct ip_set_req_iptree_create {
-+      unsigned int timeout;
-+};
-+
-+struct ip_set_req_iptree {
-+      ip_set_ip_t ip;
-+      unsigned int timeout;
-+};
-+
-+#endif        /* __IP_SET_IPTREE_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_iptreemap.h
-@@ -0,0 +1,40 @@
-+#ifndef __IP_SET_IPTREEMAP_H
-+#define __IP_SET_IPTREEMAP_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "iptreemap"
-+
-+#ifdef __KERNEL__
-+struct ip_set_iptreemap_d {
-+      unsigned char bitmap[32]; /* x.x.x.y */
-+};
-+
-+struct ip_set_iptreemap_c {
-+      struct ip_set_iptreemap_d *tree[256]; /* x.x.y.x */
-+};
-+
-+struct ip_set_iptreemap_b {
-+      struct ip_set_iptreemap_c *tree[256]; /* x.y.x.x */
-+      unsigned char dirty[32];
-+};
-+#endif
-+
-+struct ip_set_iptreemap {
-+      unsigned int gc_interval;
-+#ifdef __KERNEL__
-+      struct timer_list gc;
-+      struct ip_set_iptreemap_b *tree[256]; /* y.x.x.x */
-+#endif
-+};
-+
-+struct ip_set_req_iptreemap_create {
-+      unsigned int gc_interval;
-+};
-+
-+struct ip_set_req_iptreemap {
-+      ip_set_ip_t start;
-+      ip_set_ip_t end;
-+};
-+
-+#endif /* __IP_SET_IPTREEMAP_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_jhash.h
-@@ -0,0 +1,148 @@
-+#ifndef _LINUX_IPSET_JHASH_H
-+#define _LINUX_IPSET_JHASH_H
-+
-+/* This is a copy of linux/jhash.h but the types u32/u8 are changed
-+ * to __u32/__u8 so that the header file can be included into
-+ * userspace code as well. Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
-+ */
-+
-+/* jhash.h: Jenkins hash support.
-+ *
-+ * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net)
-+ *
-+ * http://burtleburtle.net/bob/hash/
-+ *
-+ * These are the credits from Bob's sources:
-+ *
-+ * lookup2.c, by Bob Jenkins, December 1996, Public Domain.
-+ * hash(), hash2(), hash3, and mix() are externally useful functions.
-+ * Routines to test the hash are included if SELF_TEST is defined.
-+ * You can use this free for any purpose.  It has no warranty.
-+ *
-+ * Copyright (C) 2003 David S. Miller (davem@redhat.com)
-+ *
-+ * I've modified Bob's hash to be useful in the Linux kernel, and
-+ * any bugs present are surely my fault.  -DaveM
-+ */
-+
-+/* NOTE: Arguments are modified. */
-+#define __jhash_mix(a, b, c) \
-+{ \
-+  a -= b; a -= c; a ^= (c>>13); \
-+  b -= c; b -= a; b ^= (a<<8); \
-+  c -= a; c -= b; c ^= (b>>13); \
-+  a -= b; a -= c; a ^= (c>>12);  \
-+  b -= c; b -= a; b ^= (a<<16); \
-+  c -= a; c -= b; c ^= (b>>5); \
-+  a -= b; a -= c; a ^= (c>>3);  \
-+  b -= c; b -= a; b ^= (a<<10); \
-+  c -= a; c -= b; c ^= (b>>15); \
-+}
-+
-+/* The golden ration: an arbitrary value */
-+#define JHASH_GOLDEN_RATIO    0x9e3779b9
-+
-+/* The most generic version, hashes an arbitrary sequence
-+ * of bytes.  No alignment or length assumptions are made about
-+ * the input key.
-+ */
-+static inline __u32 jhash(void *key, __u32 length, __u32 initval)
-+{
-+      __u32 a, b, c, len;
-+      __u8 *k = key;
-+
-+      len = length;
-+      a = b = JHASH_GOLDEN_RATIO;
-+      c = initval;
-+
-+      while (len >= 12) {
-+              a += (k[0] +((__u32)k[1]<<8) +((__u32)k[2]<<16) +((__u32)k[3]<<24));
-+              b += (k[4] +((__u32)k[5]<<8) +((__u32)k[6]<<16) +((__u32)k[7]<<24));
-+              c += (k[8] +((__u32)k[9]<<8) +((__u32)k[10]<<16)+((__u32)k[11]<<24));
-+
-+              __jhash_mix(a,b,c);
-+
-+              k += 12;
-+              len -= 12;
-+      }
-+
-+      c += length;
-+      switch (len) {
-+      case 11: c += ((__u32)k[10]<<24);
-+      case 10: c += ((__u32)k[9]<<16);
-+      case 9 : c += ((__u32)k[8]<<8);
-+      case 8 : b += ((__u32)k[7]<<24);
-+      case 7 : b += ((__u32)k[6]<<16);
-+      case 6 : b += ((__u32)k[5]<<8);
-+      case 5 : b += k[4];
-+      case 4 : a += ((__u32)k[3]<<24);
-+      case 3 : a += ((__u32)k[2]<<16);
-+      case 2 : a += ((__u32)k[1]<<8);
-+      case 1 : a += k[0];
-+      };
-+
-+      __jhash_mix(a,b,c);
-+
-+      return c;
-+}
-+
-+/* A special optimized version that handles 1 or more of __u32s.
-+ * The length parameter here is the number of __u32s in the key.
-+ */
-+static inline __u32 jhash2(__u32 *k, __u32 length, __u32 initval)
-+{
-+      __u32 a, b, c, len;
-+
-+      a = b = JHASH_GOLDEN_RATIO;
-+      c = initval;
-+      len = length;
-+
-+      while (len >= 3) {
-+              a += k[0];
-+              b += k[1];
-+              c += k[2];
-+              __jhash_mix(a, b, c);
-+              k += 3; len -= 3;
-+      }
-+
-+      c += length * 4;
-+
-+      switch (len) {
-+      case 2 : b += k[1];
-+      case 1 : a += k[0];
-+      };
-+
-+      __jhash_mix(a,b,c);
-+
-+      return c;
-+}
-+
-+
-+/* A special ultra-optimized versions that knows they are hashing exactly
-+ * 3, 2 or 1 word(s).
-+ *
-+ * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally
-+ *       done at the end is not done here.
-+ */
-+static inline __u32 jhash_3words(__u32 a, __u32 b, __u32 c, __u32 initval)
-+{
-+      a += JHASH_GOLDEN_RATIO;
-+      b += JHASH_GOLDEN_RATIO;
-+      c += initval;
-+
-+      __jhash_mix(a, b, c);
-+
-+      return c;
-+}
-+
-+static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval)
-+{
-+      return jhash_3words(a, b, 0, initval);
-+}
-+
-+static inline __u32 jhash_1word(__u32 a, __u32 initval)
-+{
-+      return jhash_3words(a, 0, 0, initval);
-+}
-+
-+#endif /* _LINUX_IPSET_JHASH_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_macipmap.h
-@@ -0,0 +1,38 @@
-+#ifndef __IP_SET_MACIPMAP_H
-+#define __IP_SET_MACIPMAP_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "macipmap"
-+#define MAX_RANGE 0x0000FFFF
-+
-+/* general flags */
-+#define IPSET_MACIP_MATCHUNSET        1
-+
-+/* per ip flags */
-+#define IPSET_MACIP_ISSET     1
-+
-+struct ip_set_macipmap {
-+      void *members;                  /* the macipmap proper */
-+      ip_set_ip_t first_ip;           /* host byte order, included in range */
-+      ip_set_ip_t last_ip;            /* host byte order, included in range */
-+      u_int32_t flags;
-+};
-+
-+struct ip_set_req_macipmap_create {
-+      ip_set_ip_t from;
-+      ip_set_ip_t to;
-+      u_int32_t flags;
-+};
-+
-+struct ip_set_req_macipmap {
-+      ip_set_ip_t ip;
-+      unsigned char ethernet[ETH_ALEN];
-+};
-+
-+struct ip_set_macip {
-+      unsigned short flags;
-+      unsigned char ethernet[ETH_ALEN];
-+};
-+
-+#endif        /* __IP_SET_MACIPMAP_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_malloc.h
-@@ -0,0 +1,116 @@
-+#ifndef _IP_SET_MALLOC_H
-+#define _IP_SET_MALLOC_H
-+
-+#ifdef __KERNEL__
-+
-+/* Memory allocation and deallocation */
-+static size_t max_malloc_size = 0;
-+
-+static inline void init_max_malloc_size(void)
-+{
-+#define CACHE(x) max_malloc_size = x;
-+#include <linux/kmalloc_sizes.h>
-+#undef CACHE
-+}
-+
-+static inline void * ip_set_malloc(size_t bytes)
-+{
-+      if (bytes > max_malloc_size)
-+              return vmalloc(bytes);
-+      else
-+              return kmalloc(bytes, GFP_KERNEL);
-+}
-+
-+static inline void ip_set_free(void * data, size_t bytes)
-+{
-+      if (bytes > max_malloc_size)
-+              vfree(data);
-+      else
-+              kfree(data);
-+}
-+
-+struct harray {
-+      size_t max_elements;
-+      void *arrays[0];
-+};
-+
-+static inline void * 
-+harray_malloc(size_t hashsize, size_t typesize, int flags)
-+{
-+      struct harray *harray;
-+      size_t max_elements, size, i, j;
-+
-+      if (!max_malloc_size)
-+              init_max_malloc_size();
-+
-+      if (typesize > max_malloc_size)
-+              return NULL;
-+
-+      max_elements = max_malloc_size/typesize;
-+      size = hashsize/max_elements;
-+      if (hashsize % max_elements)
-+              size++;
-+      
-+      /* Last pointer signals end of arrays */
-+      harray = kmalloc(sizeof(struct harray) + (size + 1) * sizeof(void *),
-+                       flags);
-+
-+      if (!harray)
-+              return NULL;
-+      
-+      for (i = 0; i < size - 1; i++) {
-+              harray->arrays[i] = kmalloc(max_elements * typesize, flags);
-+              if (!harray->arrays[i])
-+                      goto undo;
-+              memset(harray->arrays[i], 0, max_elements * typesize);
-+      }
-+      harray->arrays[i] = kmalloc((hashsize - i * max_elements) * typesize, 
-+                                  flags);
-+      if (!harray->arrays[i])
-+              goto undo;
-+      memset(harray->arrays[i], 0, (hashsize - i * max_elements) * typesize);
-+
-+      harray->max_elements = max_elements;
-+      harray->arrays[size] = NULL;
-+      
-+      return (void *)harray;
-+
-+    undo:
-+      for (j = 0; j < i; j++) {
-+              kfree(harray->arrays[j]);
-+      }
-+      kfree(harray);
-+      return NULL;
-+}
-+
-+static inline void harray_free(void *h)
-+{
-+      struct harray *harray = (struct harray *) h;
-+      size_t i;
-+      
-+      for (i = 0; harray->arrays[i] != NULL; i++)
-+              kfree(harray->arrays[i]);
-+      kfree(harray);
-+}
-+
-+static inline void harray_flush(void *h, size_t hashsize, size_t typesize)
-+{
-+      struct harray *harray = (struct harray *) h;
-+      size_t i;
-+      
-+      for (i = 0; harray->arrays[i+1] != NULL; i++)
-+              memset(harray->arrays[i], 0, harray->max_elements * typesize);
-+      memset(harray->arrays[i], 0, 
-+             (hashsize - i * harray->max_elements) * typesize);
-+}
-+
-+#define HARRAY_ELEM(h, type, which)                           \
-+({                                                            \
-+      struct harray *__h = (struct harray *)(h);              \
-+      ((type)((__h)->arrays[(which)/(__h)->max_elements])     \
-+              + (which)%(__h)->max_elements);                 \
-+})
-+
-+#endif                                /* __KERNEL__ */
-+
-+#endif /*_IP_SET_MALLOC_H*/
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_nethash.h
-@@ -0,0 +1,55 @@
-+#ifndef __IP_SET_NETHASH_H
-+#define __IP_SET_NETHASH_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME "nethash"
-+#define MAX_RANGE 0x0000FFFF
-+
-+struct ip_set_nethash {
-+      ip_set_ip_t *members;           /* the nethash proper */
-+      uint32_t elements;              /* number of elements */
-+      uint32_t hashsize;              /* hash size */
-+      uint16_t probes;                /* max number of probes  */
-+      uint16_t resize;                /* resize factor in percent */
-+      unsigned char cidr[30];         /* CIDR sizes */
-+      void *initval[0];               /* initvals for jhash_1word */
-+};
-+
-+struct ip_set_req_nethash_create {
-+      uint32_t hashsize;
-+      uint16_t probes;
-+      uint16_t resize;
-+};
-+
-+struct ip_set_req_nethash {
-+      ip_set_ip_t ip;
-+      unsigned char cidr;
-+};
-+
-+static unsigned char shifts[] = {255, 253, 249, 241, 225, 193, 129, 1};
-+
-+static inline ip_set_ip_t 
-+pack(ip_set_ip_t ip, unsigned char cidr)
-+{
-+      ip_set_ip_t addr, *paddr = &addr;
-+      unsigned char n, t, *a;
-+
-+      addr = htonl(ip & (0xFFFFFFFF << (32 - (cidr))));
-+#ifdef __KERNEL__
-+      DP("ip:%u.%u.%u.%u/%u", NIPQUAD(addr), cidr);
-+#endif
-+      n = cidr / 8;
-+      t = cidr % 8;   
-+      a = &((unsigned char *)paddr)[n];
-+      *a = *a /(1 << (8 - t)) + shifts[t];
-+#ifdef __KERNEL__
-+      DP("n: %u, t: %u, a: %u", n, t, *a);
-+      DP("ip:%u.%u.%u.%u/%u, %u.%u.%u.%u",
-+         HIPQUAD(ip), cidr, NIPQUAD(addr));
-+#endif
-+
-+      return ntohl(addr);
-+}
-+
-+#endif        /* __IP_SET_NETHASH_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ip_set_portmap.h
-@@ -0,0 +1,25 @@
-+#ifndef __IP_SET_PORTMAP_H
-+#define __IP_SET_PORTMAP_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+#define SETTYPE_NAME  "portmap"
-+#define MAX_RANGE     0x0000FFFF
-+#define INVALID_PORT  (MAX_RANGE + 1)
-+
-+struct ip_set_portmap {
-+      void *members;                  /* the portmap proper */
-+      ip_set_ip_t first_port;         /* host byte order, included in range */
-+      ip_set_ip_t last_port;          /* host byte order, included in range */
-+};
-+
-+struct ip_set_req_portmap_create {
-+      ip_set_ip_t from;
-+      ip_set_ip_t to;
-+};
-+
-+struct ip_set_req_portmap {
-+      ip_set_ip_t port;
-+};
-+
-+#endif /* __IP_SET_PORTMAP_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_set.h
-@@ -0,0 +1,21 @@
-+#ifndef _IPT_SET_H
-+#define _IPT_SET_H
-+
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+struct ipt_set_info {
-+      ip_set_id_t index;
-+      u_int32_t flags[IP_SET_MAX_BINDINGS + 1];
-+};
-+
-+/* match info */
-+struct ipt_set_info_match {
-+      struct ipt_set_info match_set;
-+};
-+
-+struct ipt_set_info_target {
-+      struct ipt_set_info add_set;
-+      struct ipt_set_info del_set;
-+};
-+
-+#endif /*_IPT_SET_H*/
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set.c
-@@ -0,0 +1,2003 @@
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module for IP set management */
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+#include <linux/config.h>
-+#endif
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/kmod.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/random.h>
-+#include <linux/jhash.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <asm/semaphore.h>
-+#include <linux/spinlock.h>
-+#include <linux/vmalloc.h>
-+
-+#define ASSERT_READ_LOCK(x)
-+#define ASSERT_WRITE_LOCK(x)
-+#include <linux/netfilter_ipv4/ip_set.h>
-+
-+static struct list_head set_type_list;                /* all registered sets */
-+static struct ip_set **ip_set_list;           /* all individual sets */
-+static DEFINE_RWLOCK(ip_set_lock);            /* protects the lists and the hash */
-+static DECLARE_MUTEX(ip_set_app_mutex);               /* serializes user access */
-+static ip_set_id_t ip_set_max = CONFIG_IP_NF_SET_MAX;
-+static ip_set_id_t ip_set_bindings_hash_size =  CONFIG_IP_NF_SET_HASHSIZE;
-+static struct list_head *ip_set_hash;         /* hash of bindings */
-+static unsigned int ip_set_hash_random;               /* random seed */
-+
-+/*
-+ * Sets are identified either by the index in ip_set_list or by id.
-+ * The id never changes and is used to find a key in the hash. 
-+ * The index may change by swapping and used at all other places 
-+ * (set/SET netfilter modules, binding value, etc.)
-+ *
-+ * Userspace requests are serialized by ip_set_mutex and sets can
-+ * be deleted only from userspace. Therefore ip_set_list locking 
-+ * must obey the following rules:
-+ *
-+ * - kernel requests: read and write locking mandatory
-+ * - user requests: read locking optional, write locking mandatory
-+ */
-+
-+static inline void
-+__ip_set_get(ip_set_id_t index)
-+{
-+      atomic_inc(&ip_set_list[index]->ref);
-+}
-+
-+static inline void
-+__ip_set_put(ip_set_id_t index)
-+{
-+      atomic_dec(&ip_set_list[index]->ref);
-+}
-+
-+/*
-+ * Binding routines
-+ */
-+
-+static inline struct ip_set_hash *
-+__ip_set_find(u_int32_t key, ip_set_id_t id, ip_set_ip_t ip)
-+{
-+      struct ip_set_hash *set_hash;
-+
-+      list_for_each_entry(set_hash, &ip_set_hash[key], list)
-+              if (set_hash->id == id && set_hash->ip == ip)
-+                      return set_hash;
-+                      
-+      return NULL;
-+}
-+
-+static ip_set_id_t
-+ip_set_find_in_hash(ip_set_id_t id, ip_set_ip_t ip)
-+{
-+      u_int32_t key = jhash_2words(id, ip, ip_set_hash_random) 
-+                              % ip_set_bindings_hash_size;
-+      struct ip_set_hash *set_hash;
-+
-+      ASSERT_READ_LOCK(&ip_set_lock);
-+      IP_SET_ASSERT(ip_set_list[id]);
-+      DP("set: %s, ip: %u.%u.%u.%u", ip_set_list[id]->name, HIPQUAD(ip));     
-+      
-+      set_hash = __ip_set_find(key, id, ip);
-+      
-+      DP("set: %s, ip: %u.%u.%u.%u, binding: %s", ip_set_list[id]->name, 
-+         HIPQUAD(ip),
-+         set_hash != NULL ? ip_set_list[set_hash->binding]->name : "");
-+
-+      return (set_hash != NULL ? set_hash->binding : IP_SET_INVALID_ID);
-+}
-+
-+static inline void 
-+__set_hash_del(struct ip_set_hash *set_hash)
-+{
-+      ASSERT_WRITE_LOCK(&ip_set_lock);
-+      IP_SET_ASSERT(ip_set_list[set_hash->binding]);  
-+
-+      __ip_set_put(set_hash->binding);
-+      list_del(&set_hash->list);
-+      kfree(set_hash);
-+}
-+
-+static int
-+ip_set_hash_del(ip_set_id_t id, ip_set_ip_t ip)
-+{
-+      u_int32_t key = jhash_2words(id, ip, ip_set_hash_random)
-+                              % ip_set_bindings_hash_size;
-+      struct ip_set_hash *set_hash;
-+      
-+      IP_SET_ASSERT(ip_set_list[id]);
-+      DP("set: %s, ip: %u.%u.%u.%u", ip_set_list[id]->name, HIPQUAD(ip));     
-+      write_lock_bh(&ip_set_lock);
-+      set_hash = __ip_set_find(key, id, ip);
-+      DP("set: %s, ip: %u.%u.%u.%u, binding: %s", ip_set_list[id]->name,
-+         HIPQUAD(ip),
-+         set_hash != NULL ? ip_set_list[set_hash->binding]->name : "");
-+
-+      if (set_hash != NULL)
-+              __set_hash_del(set_hash);
-+      write_unlock_bh(&ip_set_lock);
-+      return 0;
-+}
-+
-+static int 
-+ip_set_hash_add(ip_set_id_t id, ip_set_ip_t ip, ip_set_id_t binding)
-+{
-+      u_int32_t key = jhash_2words(id, ip, ip_set_hash_random)
-+                              % ip_set_bindings_hash_size;
-+      struct ip_set_hash *set_hash;
-+      int ret = 0;
-+      
-+      IP_SET_ASSERT(ip_set_list[id]);
-+      IP_SET_ASSERT(ip_set_list[binding]);
-+      DP("set: %s, ip: %u.%u.%u.%u, binding: %s", ip_set_list[id]->name, 
-+         HIPQUAD(ip), ip_set_list[binding]->name);
-+      write_lock_bh(&ip_set_lock);
-+      set_hash = __ip_set_find(key, id, ip);
-+      if (!set_hash) {
-+              set_hash = kmalloc(sizeof(struct ip_set_hash), GFP_ATOMIC);
-+              if (!set_hash) {
-+                      ret = -ENOMEM;
-+                      goto unlock;
-+              }
-+              INIT_LIST_HEAD(&set_hash->list);
-+              set_hash->id = id;
-+              set_hash->ip = ip;
-+              list_add(&set_hash->list, &ip_set_hash[key]);
-+      } else {
-+              IP_SET_ASSERT(ip_set_list[set_hash->binding]);  
-+              DP("overwrite binding: %s",
-+                 ip_set_list[set_hash->binding]->name);
-+              __ip_set_put(set_hash->binding);
-+      }
-+      set_hash->binding = binding;
-+      __ip_set_get(set_hash->binding);
-+      DP("stored: key %u, id %u (%s), ip %u.%u.%u.%u, binding %u (%s)",
-+         key, id, ip_set_list[id]->name,
-+         HIPQUAD(ip), binding, ip_set_list[binding]->name);
-+    unlock:
-+      write_unlock_bh(&ip_set_lock);
-+      return ret;
-+}
-+
-+#define FOREACH_HASH_DO(fn, args...)                                          \
-+({                                                                            \
-+      ip_set_id_t __key;                                                      \
-+      struct ip_set_hash *__set_hash;                                         \
-+                                                                              \
-+      for (__key = 0; __key < ip_set_bindings_hash_size; __key++) {           \
-+              list_for_each_entry(__set_hash, &ip_set_hash[__key], list)      \
-+                      fn(__set_hash , ## args);                               \
-+      }                                                                       \
-+})
-+
-+#define FOREACH_HASH_RW_DO(fn, args...)                                               \
-+({                                                                            \
-+      ip_set_id_t __key;                                                      \
-+      struct ip_set_hash *__set_hash, *__n;                                   \
-+                                                                              \
-+      ASSERT_WRITE_LOCK(&ip_set_lock);                                        \
-+      for (__key = 0; __key < ip_set_bindings_hash_size; __key++) {           \
-+              list_for_each_entry_safe(__set_hash, __n, &ip_set_hash[__key], list)\
-+                      fn(__set_hash , ## args);                               \
-+      }                                                                       \
-+})
-+
-+/* Add, del and test set entries from kernel */
-+
-+#define follow_bindings(index, set, ip)                                       \
-+((index = ip_set_find_in_hash((set)->id, ip)) != IP_SET_INVALID_ID    \
-+ || (index = (set)->binding) != IP_SET_INVALID_ID)
-+
-+int
-+ip_set_testip_kernel(ip_set_id_t index,
-+                   const struct sk_buff *skb,
-+                   const u_int32_t *flags)
-+{
-+      struct ip_set *set;
-+      ip_set_ip_t ip;
-+      int res;
-+      unsigned char i = 0;
-+      
-+      IP_SET_ASSERT(flags[i]);
-+      read_lock_bh(&ip_set_lock);
-+      do {
-+              set = ip_set_list[index];
-+              IP_SET_ASSERT(set);
-+              DP("set %s, index %u", set->name, index);
-+              read_lock_bh(&set->lock);
-+              res = set->type->testip_kernel(set, skb, &ip, flags, i++);
-+              read_unlock_bh(&set->lock);
-+              i += !!(set->type->features & IPSET_DATA_DOUBLE);
-+      } while (res > 0 
-+               && flags[i] 
-+               && follow_bindings(index, set, ip));
-+      read_unlock_bh(&ip_set_lock);
-+
-+      return res;
-+}
-+
-+void
-+ip_set_addip_kernel(ip_set_id_t index,
-+                  const struct sk_buff *skb,
-+                  const u_int32_t *flags)
-+{
-+      struct ip_set *set;
-+      ip_set_ip_t ip;
-+      int res;
-+      unsigned char i = 0;
-+
-+      IP_SET_ASSERT(flags[i]);
-+   retry:
-+      read_lock_bh(&ip_set_lock);
-+      do {
-+              set = ip_set_list[index];
-+              IP_SET_ASSERT(set);
-+              DP("set %s, index %u", set->name, index);
-+              write_lock_bh(&set->lock);
-+              res = set->type->addip_kernel(set, skb, &ip, flags, i++);
-+              write_unlock_bh(&set->lock);
-+              i += !!(set->type->features & IPSET_DATA_DOUBLE);
-+      } while ((res == 0 || res == -EEXIST)
-+               && flags[i] 
-+               && follow_bindings(index, set, ip));
-+      read_unlock_bh(&ip_set_lock);
-+
-+      if (res == -EAGAIN
-+          && set->type->retry
-+          && (res = set->type->retry(set)) == 0)
-+              goto retry;
-+}
-+
-+void
-+ip_set_delip_kernel(ip_set_id_t index,
-+                  const struct sk_buff *skb,
-+                  const u_int32_t *flags)
-+{
-+      struct ip_set *set;
-+      ip_set_ip_t ip;
-+      int res;
-+      unsigned char i = 0;
-+
-+      IP_SET_ASSERT(flags[i]);
-+      read_lock_bh(&ip_set_lock);
-+      do {
-+              set = ip_set_list[index];
-+              IP_SET_ASSERT(set);
-+              DP("set %s, index %u", set->name, index);
-+              write_lock_bh(&set->lock);
-+              res = set->type->delip_kernel(set, skb, &ip, flags, i++);
-+              write_unlock_bh(&set->lock);
-+              i += !!(set->type->features & IPSET_DATA_DOUBLE);
-+      } while ((res == 0 || res == -EEXIST)
-+               && flags[i] 
-+               && follow_bindings(index, set, ip));
-+      read_unlock_bh(&ip_set_lock);
-+}
-+
-+/* Register and deregister settype */
-+
-+static inline struct ip_set_type *
-+find_set_type(const char *name)
-+{
-+      struct ip_set_type *set_type;
-+
-+      list_for_each_entry(set_type, &set_type_list, list)
-+              if (!strncmp(set_type->typename, name, IP_SET_MAXNAMELEN - 1))
-+                      return set_type;
-+      return NULL;
-+}
-+
-+int 
-+ip_set_register_set_type(struct ip_set_type *set_type)
-+{
-+      int ret = 0;
-+      
-+      if (set_type->protocol_version != IP_SET_PROTOCOL_VERSION) {
-+              ip_set_printk("'%s' uses wrong protocol version %u (want %u)",
-+                            set_type->typename,
-+                            set_type->protocol_version,
-+                            IP_SET_PROTOCOL_VERSION);
-+              return -EINVAL;
-+      }
-+
-+      write_lock_bh(&ip_set_lock);
-+      if (find_set_type(set_type->typename)) {
-+              /* Duplicate! */
-+              ip_set_printk("'%s' already registered!", 
-+                            set_type->typename);
-+              ret = -EINVAL;
-+              goto unlock;
-+      }
-+      if (!try_module_get(THIS_MODULE)) {
-+              ret = -EFAULT;
-+              goto unlock;
-+      }
-+      list_add(&set_type->list, &set_type_list);
-+      DP("'%s' registered.", set_type->typename);
-+   unlock:
-+      write_unlock_bh(&ip_set_lock);
-+      return ret;
-+}
-+
-+void
-+ip_set_unregister_set_type(struct ip_set_type *set_type)
-+{
-+      write_lock_bh(&ip_set_lock);
-+      if (!find_set_type(set_type->typename)) {
-+              ip_set_printk("'%s' not registered?",
-+                            set_type->typename);
-+              goto unlock;
-+      }
-+      list_del(&set_type->list);
-+      module_put(THIS_MODULE);
-+      DP("'%s' unregistered.", set_type->typename);
-+   unlock:
-+      write_unlock_bh(&ip_set_lock);
-+
-+}
-+
-+/*
-+ * Userspace routines
-+ */
-+
-+/*
-+ * Find set by name, reference it once. The reference makes sure the
-+ * thing pointed to, does not go away under our feet. Drop the reference
-+ * later, using ip_set_put().
-+ */
-+ip_set_id_t
-+ip_set_get_byname(const char *name)
-+{
-+      ip_set_id_t i, index = IP_SET_INVALID_ID;
-+      
-+      down(&ip_set_app_mutex);
-+      for (i = 0; i < ip_set_max; i++) {
-+              if (ip_set_list[i] != NULL
-+                  && strcmp(ip_set_list[i]->name, name) == 0) {
-+                      __ip_set_get(i);
-+                      index = i;
-+                      break;
-+              }
-+      }
-+      up(&ip_set_app_mutex);
-+      return index;
-+}
-+
-+/*
-+ * Find set by index, reference it once. The reference makes sure the
-+ * thing pointed to, does not go away under our feet. Drop the reference
-+ * later, using ip_set_put().
-+ */
-+ip_set_id_t
-+ip_set_get_byindex(ip_set_id_t index)
-+{
-+      down(&ip_set_app_mutex);
-+
-+      if (index >= ip_set_max)
-+              return IP_SET_INVALID_ID;
-+      
-+      if (ip_set_list[index])
-+              __ip_set_get(index);
-+      else
-+              index = IP_SET_INVALID_ID;
-+              
-+      up(&ip_set_app_mutex);
-+      return index;
-+}
-+
-+/*
-+ * If the given set pointer points to a valid set, decrement
-+ * reference count by 1. The caller shall not assume the index
-+ * to be valid, after calling this function.
-+ */
-+void ip_set_put(ip_set_id_t index)
-+{
-+      down(&ip_set_app_mutex);
-+      if (ip_set_list[index])
-+              __ip_set_put(index);
-+      up(&ip_set_app_mutex);
-+}
-+
-+/* Find a set by name or index */
-+static ip_set_id_t
-+ip_set_find_byname(const char *name)
-+{
-+      ip_set_id_t i, index = IP_SET_INVALID_ID;
-+      
-+      for (i = 0; i < ip_set_max; i++) {
-+              if (ip_set_list[i] != NULL
-+                  && strcmp(ip_set_list[i]->name, name) == 0) {
-+                      index = i;
-+                      break;
-+              }
-+      }
-+      return index;
-+}
-+
-+static ip_set_id_t
-+ip_set_find_byindex(ip_set_id_t index)
-+{
-+      if (index >= ip_set_max || ip_set_list[index] == NULL)
-+              index = IP_SET_INVALID_ID;
-+      
-+      return index;
-+}
-+
-+/*
-+ * Add, del, test, bind and unbind
-+ */
-+
-+static inline int
-+__ip_set_testip(struct ip_set *set,
-+              const void *data,
-+              size_t size,
-+              ip_set_ip_t *ip)
-+{
-+      int res;
-+
-+      read_lock_bh(&set->lock);
-+      res = set->type->testip(set, data, size, ip);
-+      read_unlock_bh(&set->lock);
-+
-+      return res;
-+}
-+
-+static int
-+__ip_set_addip(ip_set_id_t index,
-+             const void *data,
-+             size_t size)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      ip_set_ip_t ip;
-+      int res;
-+      
-+      IP_SET_ASSERT(set);
-+      do {
-+              write_lock_bh(&set->lock);
-+              res = set->type->addip(set, data, size, &ip);
-+              write_unlock_bh(&set->lock);
-+      } while (res == -EAGAIN
-+               && set->type->retry
-+               && (res = set->type->retry(set)) == 0);
-+
-+      return res;
-+}
-+
-+static int
-+ip_set_addip(ip_set_id_t index,
-+           const void *data,
-+           size_t size)
-+{
-+
-+      return __ip_set_addip(index,
-+                            data + sizeof(struct ip_set_req_adt),
-+                            size - sizeof(struct ip_set_req_adt));
-+}
-+
-+static int
-+ip_set_delip(ip_set_id_t index,
-+           const void *data,
-+           size_t size)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      ip_set_ip_t ip;
-+      int res;
-+      
-+      IP_SET_ASSERT(set);
-+      write_lock_bh(&set->lock);
-+      res = set->type->delip(set,
-+                             data + sizeof(struct ip_set_req_adt),
-+                             size - sizeof(struct ip_set_req_adt),
-+                             &ip);
-+      write_unlock_bh(&set->lock);
-+
-+      return res;
-+}
-+
-+static int
-+ip_set_testip(ip_set_id_t index,
-+            const void *data,
-+            size_t size)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      ip_set_ip_t ip;
-+      int res;
-+
-+      IP_SET_ASSERT(set);
-+      res = __ip_set_testip(set,
-+                            data + sizeof(struct ip_set_req_adt),
-+                            size - sizeof(struct ip_set_req_adt),
-+                            &ip);
-+
-+      return (res > 0 ? -EEXIST : res);
-+}
-+
-+static int
-+ip_set_bindip(ip_set_id_t index,
-+            const void *data,
-+            size_t size)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      struct ip_set_req_bind *req_bind;
-+      ip_set_id_t binding;
-+      ip_set_ip_t ip;
-+      int res;
-+
-+      IP_SET_ASSERT(set);
-+      if (size < sizeof(struct ip_set_req_bind))
-+              return -EINVAL;
-+              
-+      req_bind = (struct ip_set_req_bind *) data;
-+      req_bind->binding[IP_SET_MAXNAMELEN - 1] = '\0';
-+
-+      if (strcmp(req_bind->binding, IPSET_TOKEN_DEFAULT) == 0) {
-+              /* Default binding of a set */
-+              char *binding_name;
-+              
-+              if (size != sizeof(struct ip_set_req_bind) + IP_SET_MAXNAMELEN)
-+                      return -EINVAL;
-+
-+              binding_name = (char *)(data + sizeof(struct ip_set_req_bind)); 
-+              binding_name[IP_SET_MAXNAMELEN - 1] = '\0';
-+
-+              binding = ip_set_find_byname(binding_name);
-+              if (binding == IP_SET_INVALID_ID)
-+                      return -ENOENT;
-+
-+              write_lock_bh(&ip_set_lock);
-+              /* Sets as binding values are referenced */
-+              if (set->binding != IP_SET_INVALID_ID)
-+                      __ip_set_put(set->binding);
-+              set->binding = binding;
-+              __ip_set_get(set->binding);
-+              write_unlock_bh(&ip_set_lock);
-+
-+              return 0;
-+      }
-+      binding = ip_set_find_byname(req_bind->binding);
-+      if (binding == IP_SET_INVALID_ID)
-+              return -ENOENT;
-+
-+      res = __ip_set_testip(set,
-+                            data + sizeof(struct ip_set_req_bind),
-+                            size - sizeof(struct ip_set_req_bind),
-+                            &ip);
-+      DP("set %s, ip: %u.%u.%u.%u, binding %s",
-+         set->name, HIPQUAD(ip), ip_set_list[binding]->name);
-+      
-+      if (res >= 0)
-+              res = ip_set_hash_add(set->id, ip, binding);
-+
-+      return res;
-+}
-+
-+#define FOREACH_SET_DO(fn, args...)                           \
-+({                                                            \
-+      ip_set_id_t __i;                                        \
-+      struct ip_set *__set;                                   \
-+                                                              \
-+      for (__i = 0; __i < ip_set_max; __i++) {                \
-+              __set = ip_set_list[__i];                       \
-+              if (__set != NULL)                              \
-+                      fn(__set , ##args);                     \
-+      }                                                       \
-+})
-+
-+static inline void
-+__set_hash_del_byid(struct ip_set_hash *set_hash, ip_set_id_t id)
-+{
-+      if (set_hash->id == id)
-+              __set_hash_del(set_hash);
-+}
-+
-+static inline void
-+__unbind_default(struct ip_set *set)
-+{
-+      if (set->binding != IP_SET_INVALID_ID) {
-+              /* Sets as binding values are referenced */
-+              __ip_set_put(set->binding);
-+              set->binding = IP_SET_INVALID_ID;
-+      }
-+}
-+
-+static int
-+ip_set_unbindip(ip_set_id_t index,
-+              const void *data,
-+              size_t size)
-+{
-+      struct ip_set *set;
-+      struct ip_set_req_bind *req_bind;
-+      ip_set_ip_t ip;
-+      int res;
-+
-+      DP("");
-+      if (size < sizeof(struct ip_set_req_bind))
-+              return -EINVAL;
-+              
-+      req_bind = (struct ip_set_req_bind *) data;
-+      req_bind->binding[IP_SET_MAXNAMELEN - 1] = '\0';
-+      
-+      DP("%u %s", index, req_bind->binding);
-+      if (index == IP_SET_INVALID_ID) {
-+              /* unbind :all: */
-+              if (strcmp(req_bind->binding, IPSET_TOKEN_DEFAULT) == 0) {
-+                      /* Default binding of sets */
-+                      write_lock_bh(&ip_set_lock);
-+                      FOREACH_SET_DO(__unbind_default);
-+                      write_unlock_bh(&ip_set_lock);
-+                      return 0;
-+              } else if (strcmp(req_bind->binding, IPSET_TOKEN_ALL) == 0) {
-+                      /* Flush all bindings of all sets*/
-+                      write_lock_bh(&ip_set_lock);
-+                      FOREACH_HASH_RW_DO(__set_hash_del);
-+                      write_unlock_bh(&ip_set_lock);
-+                      return 0;
-+              }
-+              DP("unreachable reached!");
-+              return -EINVAL;
-+      }
-+      
-+      set = ip_set_list[index];
-+      IP_SET_ASSERT(set);
-+      if (strcmp(req_bind->binding, IPSET_TOKEN_DEFAULT) == 0) {
-+              /* Default binding of set */
-+              ip_set_id_t binding = ip_set_find_byindex(set->binding);
-+
-+              if (binding == IP_SET_INVALID_ID)
-+                      return -ENOENT;
-+                      
-+              write_lock_bh(&ip_set_lock);
-+              /* Sets in hash values are referenced */
-+              __ip_set_put(set->binding);
-+              set->binding = IP_SET_INVALID_ID;
-+              write_unlock_bh(&ip_set_lock);
-+
-+              return 0;
-+      } else if (strcmp(req_bind->binding, IPSET_TOKEN_ALL) == 0) {
-+              /* Flush all bindings */
-+
-+              write_lock_bh(&ip_set_lock);
-+              FOREACH_HASH_RW_DO(__set_hash_del_byid, set->id);
-+              write_unlock_bh(&ip_set_lock);
-+              return 0;
-+      }
-+      
-+      res = __ip_set_testip(set,
-+                            data + sizeof(struct ip_set_req_bind),
-+                            size - sizeof(struct ip_set_req_bind),
-+                            &ip);
-+
-+      DP("set %s, ip: %u.%u.%u.%u", set->name, HIPQUAD(ip));
-+      if (res >= 0)
-+              res = ip_set_hash_del(set->id, ip);
-+
-+      return res;
-+}
-+
-+static int
-+ip_set_testbind(ip_set_id_t index,
-+              const void *data,
-+              size_t size)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      struct ip_set_req_bind *req_bind;
-+      ip_set_id_t binding;
-+      ip_set_ip_t ip;
-+      int res;
-+
-+      IP_SET_ASSERT(set);
-+      if (size < sizeof(struct ip_set_req_bind))
-+              return -EINVAL;
-+              
-+      req_bind = (struct ip_set_req_bind *) data;
-+      req_bind->binding[IP_SET_MAXNAMELEN - 1] = '\0';
-+
-+      if (strcmp(req_bind->binding, IPSET_TOKEN_DEFAULT) == 0) {
-+              /* Default binding of set */
-+              char *binding_name;
-+              
-+              if (size != sizeof(struct ip_set_req_bind) + IP_SET_MAXNAMELEN)
-+                      return -EINVAL;
-+
-+              binding_name = (char *)(data + sizeof(struct ip_set_req_bind)); 
-+              binding_name[IP_SET_MAXNAMELEN - 1] = '\0';
-+
-+              binding = ip_set_find_byname(binding_name);
-+              if (binding == IP_SET_INVALID_ID)
-+                      return -ENOENT;
-+              
-+              res = (set->binding == binding) ? -EEXIST : 0;
-+
-+              return res;
-+      }
-+      binding = ip_set_find_byname(req_bind->binding);
-+      if (binding == IP_SET_INVALID_ID)
-+              return -ENOENT;
-+              
-+      
-+      res = __ip_set_testip(set,
-+                            data + sizeof(struct ip_set_req_bind),
-+                            size - sizeof(struct ip_set_req_bind),
-+                            &ip);
-+      DP("set %s, ip: %u.%u.%u.%u, binding %s",
-+         set->name, HIPQUAD(ip), ip_set_list[binding]->name);
-+         
-+      if (res >= 0)
-+              res = (ip_set_find_in_hash(set->id, ip) == binding)
-+                      ? -EEXIST : 0;
-+
-+      return res;
-+}
-+
-+static struct ip_set_type *
-+find_set_type_rlock(const char *typename)
-+{
-+      struct ip_set_type *type;
-+      
-+      read_lock_bh(&ip_set_lock);
-+      type = find_set_type(typename);
-+      if (type == NULL)
-+              read_unlock_bh(&ip_set_lock);
-+
-+      return type;
-+}
-+
-+static int
-+find_free_id(const char *name,
-+           ip_set_id_t *index,
-+           ip_set_id_t *id)
-+{
-+      ip_set_id_t i;
-+
-+      *id = IP_SET_INVALID_ID;
-+      for (i = 0;  i < ip_set_max; i++) {
-+              if (ip_set_list[i] == NULL) {
-+                      if (*id == IP_SET_INVALID_ID)
-+                              *id = *index = i;
-+              } else if (strcmp(name, ip_set_list[i]->name) == 0)
-+                      /* Name clash */
-+                      return -EEXIST;
-+      }
-+      if (*id == IP_SET_INVALID_ID)
-+              /* No free slot remained */
-+              return -ERANGE;
-+      /* Check that index is usable as id (swapping) */
-+    check:    
-+      for (i = 0;  i < ip_set_max; i++) {
-+              if (ip_set_list[i] != NULL
-+                  && ip_set_list[i]->id == *id) {
-+                  *id = i;
-+                  goto check;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * Create a set
-+ */
-+static int
-+ip_set_create(const char *name,
-+            const char *typename,
-+            ip_set_id_t restore,
-+            const void *data,
-+            size_t size)
-+{
-+      struct ip_set *set;
-+      ip_set_id_t index = 0, id;
-+      int res = 0;
-+
-+      DP("setname: %s, typename: %s, id: %u", name, typename, restore);
-+      /*
-+       * First, and without any locks, allocate and initialize
-+       * a normal base set structure.
-+       */
-+      set = kmalloc(sizeof(struct ip_set), GFP_KERNEL);
-+      if (!set)
-+              return -ENOMEM;
-+      set->lock = RW_LOCK_UNLOCKED;
-+      strncpy(set->name, name, IP_SET_MAXNAMELEN);
-+      set->binding = IP_SET_INVALID_ID;
-+      atomic_set(&set->ref, 0);
-+
-+      /*
-+       * Next, take the &ip_set_lock, check that we know the type,
-+       * and take a reference on the type, to make sure it
-+       * stays available while constructing our new set.
-+       *
-+       * After referencing the type, we drop the &ip_set_lock,
-+       * and let the new set construction run without locks.
-+       */
-+      set->type = find_set_type_rlock(typename);
-+      if (set->type == NULL) {
-+              /* Try loading the module */
-+              char modulename[IP_SET_MAXNAMELEN + strlen("ip_set_") + 1];
-+              strcpy(modulename, "ip_set_");
-+              strcat(modulename, typename);
-+              DP("try to load %s", modulename);
-+              request_module(modulename);
-+              set->type = find_set_type_rlock(typename);
-+      }
-+      if (set->type == NULL) {
-+              ip_set_printk("no set type '%s', set '%s' not created",
-+                            typename, name);
-+              res = -ENOENT;
-+              goto out;
-+      }
-+      if (!try_module_get(set->type->me)) {
-+              read_unlock_bh(&ip_set_lock);
-+              res = -EFAULT;
-+              goto out;
-+      }
-+      read_unlock_bh(&ip_set_lock);
-+
-+      /*
-+       * Without holding any locks, create private part.
-+       */
-+      res = set->type->create(set, data, size);
-+      if (res != 0)
-+              goto put_out;
-+
-+      /* BTW, res==0 here. */
-+
-+      /*
-+       * Here, we have a valid, constructed set. &ip_set_lock again,
-+       * find free id/index and check that it is not already in 
-+       * ip_set_list.
-+       */
-+      write_lock_bh(&ip_set_lock);
-+      if ((res = find_free_id(set->name, &index, &id)) != 0) {
-+              DP("no free id!");
-+              goto cleanup;
-+      }
-+
-+      /* Make sure restore gets the same index */
-+      if (restore != IP_SET_INVALID_ID && index != restore) {
-+              DP("Can't restore, sets are screwed up");
-+              res = -ERANGE;
-+              goto cleanup;
-+      }
-+       
-+      /*
-+       * Finally! Add our shiny new set to the list, and be done.
-+       */
-+      DP("create: '%s' created with index %u, id %u!", set->name, index, id);
-+      set->id = id;
-+      ip_set_list[index] = set;
-+      write_unlock_bh(&ip_set_lock);
-+      return res;
-+      
-+    cleanup:
-+      write_unlock_bh(&ip_set_lock);
-+      set->type->destroy(set);
-+    put_out:
-+      module_put(set->type->me);
-+    out:
-+      kfree(set);
-+      return res;
-+}
-+
-+/*
-+ * Destroy a given existing set
-+ */
-+static void
-+ip_set_destroy_set(ip_set_id_t index)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+
-+      IP_SET_ASSERT(set);
-+      DP("set: %s",  set->name);
-+      write_lock_bh(&ip_set_lock);
-+      FOREACH_HASH_RW_DO(__set_hash_del_byid, set->id);
-+      if (set->binding != IP_SET_INVALID_ID)
-+              __ip_set_put(set->binding);
-+      ip_set_list[index] = NULL;
-+      write_unlock_bh(&ip_set_lock);
-+
-+      /* Must call it without holding any lock */
-+      set->type->destroy(set);
-+      module_put(set->type->me);
-+      kfree(set);
-+}
-+
-+/*
-+ * Destroy a set - or all sets
-+ * Sets must not be referenced/used.
-+ */
-+static int
-+ip_set_destroy(ip_set_id_t index)
-+{
-+      ip_set_id_t i;
-+
-+      /* ref modification always protected by the mutex */
-+      if (index != IP_SET_INVALID_ID) {
-+              if (atomic_read(&ip_set_list[index]->ref))
-+                      return -EBUSY;
-+              ip_set_destroy_set(index);
-+      } else {
-+              for (i = 0; i < ip_set_max; i++) {
-+                      if (ip_set_list[i] != NULL 
-+                          && (atomic_read(&ip_set_list[i]->ref)))
-+                              return -EBUSY;
-+              }
-+
-+              for (i = 0; i < ip_set_max; i++) {
-+                      if (ip_set_list[i] != NULL)
-+                              ip_set_destroy_set(i);
-+              }
-+      }
-+      return 0;
-+}
-+
-+static void
-+ip_set_flush_set(struct ip_set *set)
-+{
-+      DP("set: %s %u",  set->name, set->id);
-+
-+      write_lock_bh(&set->lock);
-+      set->type->flush(set);
-+      write_unlock_bh(&set->lock);
-+}
-+
-+/* 
-+ * Flush data in a set - or in all sets
-+ */
-+static int
-+ip_set_flush(ip_set_id_t index)
-+{
-+      if (index != IP_SET_INVALID_ID) {
-+              IP_SET_ASSERT(ip_set_list[index]);
-+              ip_set_flush_set(ip_set_list[index]);
-+      } else
-+              FOREACH_SET_DO(ip_set_flush_set);
-+
-+      return 0;
-+}
-+
-+/* Rename a set */
-+static int
-+ip_set_rename(ip_set_id_t index, const char *name)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      ip_set_id_t i;
-+      int res = 0;
-+
-+      DP("set: %s to %s",  set->name, name);
-+      write_lock_bh(&ip_set_lock);
-+      for (i = 0; i < ip_set_max; i++) {
-+              if (ip_set_list[i] != NULL
-+                  && strncmp(ip_set_list[i]->name, 
-+                             name,
-+                             IP_SET_MAXNAMELEN - 1) == 0) {
-+                      res = -EEXIST;
-+                      goto unlock;
-+              }
-+      }
-+      strncpy(set->name, name, IP_SET_MAXNAMELEN);
-+    unlock:
-+      write_unlock_bh(&ip_set_lock);
-+      return res;
-+}
-+
-+/*
-+ * Swap two sets so that name/index points to the other.
-+ * References are also swapped.
-+ */
-+static int
-+ip_set_swap(ip_set_id_t from_index, ip_set_id_t to_index)
-+{
-+      struct ip_set *from = ip_set_list[from_index];
-+      struct ip_set *to = ip_set_list[to_index];
-+      char from_name[IP_SET_MAXNAMELEN];
-+      u_int32_t from_ref;
-+
-+      DP("set: %s to %s",  from->name, to->name);
-+      /* Features must not change. Artifical restriction. */
-+      if (from->type->features != to->type->features)
-+              return -ENOEXEC;
-+
-+      /* No magic here: ref munging protected by the mutex */ 
-+      write_lock_bh(&ip_set_lock);
-+      strncpy(from_name, from->name, IP_SET_MAXNAMELEN);
-+      from_ref = atomic_read(&from->ref);
-+
-+      strncpy(from->name, to->name, IP_SET_MAXNAMELEN);
-+      atomic_set(&from->ref, atomic_read(&to->ref));
-+      strncpy(to->name, from_name, IP_SET_MAXNAMELEN);
-+      atomic_set(&to->ref, from_ref);
-+      
-+      ip_set_list[from_index] = to;
-+      ip_set_list[to_index] = from;
-+      
-+      write_unlock_bh(&ip_set_lock);
-+      return 0;
-+}
-+
-+/*
-+ * List set data
-+ */
-+
-+static inline void
-+__set_hash_bindings_size_list(struct ip_set_hash *set_hash,
-+                            ip_set_id_t id, size_t *size)
-+{
-+      if (set_hash->id == id)
-+              *size += sizeof(struct ip_set_hash_list);
-+}
-+
-+static inline void
-+__set_hash_bindings_size_save(struct ip_set_hash *set_hash,
-+                            ip_set_id_t id, size_t *size)
-+{
-+      if (set_hash->id == id)
-+              *size += sizeof(struct ip_set_hash_save);
-+}
-+
-+static inline void
-+__set_hash_bindings(struct ip_set_hash *set_hash,
-+                  ip_set_id_t id, void *data, int *used)
-+{
-+      if (set_hash->id == id) {
-+              struct ip_set_hash_list *hash_list = 
-+                      (struct ip_set_hash_list *)(data + *used);
-+
-+              hash_list->ip = set_hash->ip;
-+              hash_list->binding = set_hash->binding;
-+              *used += sizeof(struct ip_set_hash_list);
-+      }
-+}
-+
-+static int ip_set_list_set(ip_set_id_t index,
-+                         void *data,
-+                         int *used,
-+                         int len)
-+{
-+      struct ip_set *set = ip_set_list[index];
-+      struct ip_set_list *set_list;
-+
-+      /* Pointer to our header */
-+      set_list = (struct ip_set_list *) (data + *used);
-+
-+      DP("set: %s, used: %d %p %p", set->name, *used, data, data + *used);
-+
-+      /* Get and ensure header size */
-+      if (*used + sizeof(struct ip_set_list) > len)
-+              goto not_enough_mem;
-+      *used += sizeof(struct ip_set_list);
-+
-+      read_lock_bh(&set->lock);
-+      /* Get and ensure set specific header size */
-+      set_list->header_size = set->type->header_size;
-+      if (*used + set_list->header_size > len)
-+              goto unlock_set;
-+
-+      /* Fill in the header */
-+      set_list->index = index;
-+      set_list->binding = set->binding;
-+      set_list->ref = atomic_read(&set->ref);
-+
-+      /* Fill in set spefific header data */
-+      set->type->list_header(set, data + *used);
-+      *used += set_list->header_size;
-+
-+      /* Get and ensure set specific members size */
-+      set_list->members_size = set->type->list_members_size(set);
-+      if (*used + set_list->members_size > len)
-+              goto unlock_set;
-+
-+      /* Fill in set spefific members data */
-+      set->type->list_members(set, data + *used);
-+      *used += set_list->members_size;
-+      read_unlock_bh(&set->lock);
-+
-+      /* Bindings */
-+
-+      /* Get and ensure set specific bindings size */
-+      set_list->bindings_size = 0;
-+      FOREACH_HASH_DO(__set_hash_bindings_size_list,
-+                      set->id, &set_list->bindings_size);
-+      if (*used + set_list->bindings_size > len)
-+              goto not_enough_mem;
-+
-+      /* Fill in set spefific bindings data */
-+      FOREACH_HASH_DO(__set_hash_bindings, set->id, data, used);
-+      
-+      return 0;
-+
-+    unlock_set:
-+      read_unlock_bh(&set->lock);
-+    not_enough_mem:
-+      DP("not enough mem, try again");
-+      return -EAGAIN;
-+}
-+
-+/*
-+ * Save sets
-+ */
-+static int ip_set_save_set(ip_set_id_t index,
-+                         void *data,
-+                         int *used,
-+                         int len)
-+{
-+      struct ip_set *set;
-+      struct ip_set_save *set_save;
-+
-+      /* Pointer to our header */
-+      set_save = (struct ip_set_save *) (data + *used);
-+
-+      /* Get and ensure header size */
-+      if (*used + sizeof(struct ip_set_save) > len)
-+              goto not_enough_mem;
-+      *used += sizeof(struct ip_set_save);
-+
-+      set = ip_set_list[index];
-+      DP("set: %s, used: %u(%u) %p %p", set->name, *used, len, 
-+         data, data + *used);
-+
-+      read_lock_bh(&set->lock);
-+      /* Get and ensure set specific header size */
-+      set_save->header_size = set->type->header_size;
-+      if (*used + set_save->header_size > len)
-+              goto unlock_set;
-+
-+      /* Fill in the header */
-+      set_save->index = index;
-+      set_save->binding = set->binding;
-+
-+      /* Fill in set spefific header data */
-+      set->type->list_header(set, data + *used);
-+      *used += set_save->header_size;
-+
-+      DP("set header filled: %s, used: %u(%u) %p %p", set->name, *used,
-+         set_save->header_size, data, data + *used);
-+      /* Get and ensure set specific members size */
-+      set_save->members_size = set->type->list_members_size(set);
-+      if (*used + set_save->members_size > len)
-+              goto unlock_set;
-+
-+      /* Fill in set spefific members data */
-+      set->type->list_members(set, data + *used);
-+      *used += set_save->members_size;
-+      read_unlock_bh(&set->lock);
-+      DP("set members filled: %s, used: %u(%u) %p %p", set->name, *used,
-+         set_save->members_size, data, data + *used);
-+      return 0;
-+
-+    unlock_set:
-+      read_unlock_bh(&set->lock);
-+    not_enough_mem:
-+      DP("not enough mem, try again");
-+      return -EAGAIN;
-+}
-+
-+static inline void
-+__set_hash_save_bindings(struct ip_set_hash *set_hash,
-+                       ip_set_id_t id,
-+                       void *data,
-+                       int *used,
-+                       int len,
-+                       int *res)
-+{
-+      if (*res == 0
-+          && (id == IP_SET_INVALID_ID || set_hash->id == id)) {
-+              struct ip_set_hash_save *hash_save = 
-+                      (struct ip_set_hash_save *)(data + *used);
-+              /* Ensure bindings size */
-+              if (*used + sizeof(struct ip_set_hash_save) > len) {
-+                      *res = -ENOMEM;
-+                      return;
-+              }
-+              hash_save->id = set_hash->id;
-+              hash_save->ip = set_hash->ip;
-+              hash_save->binding = set_hash->binding;
-+              *used += sizeof(struct ip_set_hash_save);
-+      }
-+}
-+
-+static int ip_set_save_bindings(ip_set_id_t index,
-+                              void *data,
-+                              int *used,
-+                              int len)
-+{
-+      int res = 0;
-+      struct ip_set_save *set_save;
-+
-+      DP("used %u, len %u", *used, len);
-+      /* Get and ensure header size */
-+      if (*used + sizeof(struct ip_set_save) > len)
-+              return -ENOMEM;
-+
-+      /* Marker */
-+      set_save = (struct ip_set_save *) (data + *used);
-+      set_save->index = IP_SET_INVALID_ID;
-+      set_save->header_size = 0;
-+      set_save->members_size = 0;
-+      *used += sizeof(struct ip_set_save);
-+
-+      DP("marker added used %u, len %u", *used, len);
-+      /* Fill in bindings data */
-+      if (index != IP_SET_INVALID_ID)
-+              /* Sets are identified by id in hash */
-+              index = ip_set_list[index]->id;
-+      FOREACH_HASH_DO(__set_hash_save_bindings, index, data, used, len, &res);
-+
-+      return res;     
-+}
-+
-+/*
-+ * Restore sets
-+ */
-+static int ip_set_restore(void *data,
-+                        int len)
-+{
-+      int res = 0;
-+      int line = 0, used = 0, members_size;
-+      struct ip_set *set;
-+      struct ip_set_hash_save *hash_save;
-+      struct ip_set_restore *set_restore;
-+      ip_set_id_t index;
-+
-+      /* Loop to restore sets */
-+      while (1) {
-+              line++;
-+              
-+              DP("%u %u %u", used, sizeof(struct ip_set_restore), len);
-+              /* Get and ensure header size */
-+              if (used + sizeof(struct ip_set_restore) > len)
-+                      return line;
-+              set_restore = (struct ip_set_restore *) (data + used);
-+              used += sizeof(struct ip_set_restore);
-+
-+              /* Ensure data size */
-+              if (used 
-+                  + set_restore->header_size 
-+                  + set_restore->members_size > len)
-+                      return line;
-+
-+              /* Check marker */
-+              if (set_restore->index == IP_SET_INVALID_ID) {
-+                      line--;
-+                      goto bindings;
-+              }
-+              
-+              /* Try to create the set */
-+              DP("restore %s %s", set_restore->name, set_restore->typename);
-+              res = ip_set_create(set_restore->name,
-+                                  set_restore->typename,
-+                                  set_restore->index,
-+                                  data + used,
-+                                  set_restore->header_size);
-+              
-+              if (res != 0)
-+                      return line;
-+              used += set_restore->header_size;
-+
-+              index = ip_set_find_byindex(set_restore->index);
-+              DP("index %u, restore_index %u", index, set_restore->index);
-+              if (index != set_restore->index)
-+                      return line;
-+              /* Try to restore members data */
-+              set = ip_set_list[index];
-+              members_size = 0;
-+              DP("members_size %u reqsize %u",
-+                 set_restore->members_size, set->type->reqsize);
-+              while (members_size + set->type->reqsize <=
-+                     set_restore->members_size) {
-+                      line++;
-+                      DP("members: %u, line %u", members_size, line);
-+                      res = __ip_set_addip(index,
-+                                         data + used + members_size,
-+                                         set->type->reqsize);
-+                      if (!(res == 0 || res == -EEXIST)) 
-+                              return line;
-+                      members_size += set->type->reqsize;
-+              }
-+
-+              DP("members_size %u  %u",
-+                 set_restore->members_size, members_size);
-+              if (members_size != set_restore->members_size)
-+                      return line++;
-+              used += set_restore->members_size;              
-+      }
-+      
-+   bindings:
-+      /* Loop to restore bindings */
-+      while (used < len) {
-+              line++;
-+
-+              DP("restore binding, line %u", line);           
-+              /* Get and ensure size */
-+              if (used + sizeof(struct ip_set_hash_save) > len)
-+                      return line;
-+              hash_save = (struct ip_set_hash_save *) (data + used);
-+              used += sizeof(struct ip_set_hash_save);
-+              
-+              /* hash_save->id is used to store the index */
-+              index = ip_set_find_byindex(hash_save->id);
-+              DP("restore binding index %u, id %u, %u -> %u",
-+                 index, hash_save->id, hash_save->ip, hash_save->binding);            
-+              if (index != hash_save->id)
-+                      return line;
-+              if (ip_set_find_byindex(hash_save->binding) == IP_SET_INVALID_ID) {
-+                      DP("corrupt binding set index %u", hash_save->binding);
-+                      return line;
-+              }
-+              set = ip_set_list[hash_save->id];
-+              /* Null valued IP means default binding */
-+              if (hash_save->ip)
-+                      res = ip_set_hash_add(set->id, 
-+                                            hash_save->ip,
-+                                            hash_save->binding);
-+              else {
-+                      IP_SET_ASSERT(set->binding == IP_SET_INVALID_ID);
-+                      write_lock_bh(&ip_set_lock);
-+                      set->binding = hash_save->binding;
-+                      __ip_set_get(set->binding);
-+                      write_unlock_bh(&ip_set_lock);
-+                      DP("default binding: %u", set->binding);
-+              }
-+              if (res != 0)
-+                      return line;
-+      }
-+      if (used != len)
-+              return line;
-+      
-+      return 0;       
-+}
-+
-+static int
-+ip_set_sockfn_set(struct sock *sk, int optval, void *user, unsigned int len)
-+{
-+      void *data;
-+      int res = 0;            /* Assume OK */
-+      unsigned *op;
-+      struct ip_set_req_adt *req_adt;
-+      ip_set_id_t index = IP_SET_INVALID_ID;
-+      int (*adtfn)(ip_set_id_t index,
-+                   const void *data, size_t size);
-+      struct fn_table {
-+              int (*fn)(ip_set_id_t index,
-+                        const void *data, size_t size);
-+      } adtfn_table[] =
-+      { { ip_set_addip }, { ip_set_delip }, { ip_set_testip},
-+        { ip_set_bindip}, { ip_set_unbindip }, { ip_set_testbind },
-+      };
-+
-+      DP("optval=%d, user=%p, len=%d", optval, user, len);
-+      if (!capable(CAP_NET_ADMIN))
-+              return -EPERM;
-+      if (optval != SO_IP_SET)
-+              return -EBADF;
-+      if (len <= sizeof(unsigned)) {
-+              ip_set_printk("short userdata (want >%zu, got %u)",
-+                            sizeof(unsigned), len);
-+              return -EINVAL;
-+      }
-+      data = vmalloc(len);
-+      if (!data) {
-+              DP("out of mem for %u bytes", len);
-+              return -ENOMEM;
-+      }
-+      if (copy_from_user(data, user, len) != 0) {
-+              res = -EFAULT;
-+              goto done;
-+      }
-+      if (down_interruptible(&ip_set_app_mutex)) {
-+              res = -EINTR;
-+              goto done;
-+      }
-+
-+      op = (unsigned *)data;
-+      DP("op=%x", *op);
-+      
-+      if (*op < IP_SET_OP_VERSION) {
-+              /* Check the version at the beginning of operations */
-+              struct ip_set_req_version *req_version =
-+                      (struct ip_set_req_version *) data;
-+              if (req_version->version != IP_SET_PROTOCOL_VERSION) {
-+                      res = -EPROTO;
-+                      goto done;
-+              }
-+      }
-+
-+      switch (*op) {
-+      case IP_SET_OP_CREATE:{
-+              struct ip_set_req_create *req_create
-+                      = (struct ip_set_req_create *) data;
-+              
-+              if (len < sizeof(struct ip_set_req_create)) {
-+                      ip_set_printk("short CREATE data (want >=%zu, got %u)",
-+                                    sizeof(struct ip_set_req_create), len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              req_create->name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              req_create->typename[IP_SET_MAXNAMELEN - 1] = '\0';
-+              res = ip_set_create(req_create->name,
-+                                  req_create->typename,
-+                                  IP_SET_INVALID_ID,
-+                                  data + sizeof(struct ip_set_req_create),
-+                                  len - sizeof(struct ip_set_req_create));
-+              goto done;
-+      }
-+      case IP_SET_OP_DESTROY:{
-+              struct ip_set_req_std *req_destroy
-+                      = (struct ip_set_req_std *) data;
-+              
-+              if (len != sizeof(struct ip_set_req_std)) {
-+                      ip_set_printk("invalid DESTROY data (want %zu, got %u)",
-+                                    sizeof(struct ip_set_req_std), len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              if (strcmp(req_destroy->name, IPSET_TOKEN_ALL) == 0) {
-+                      /* Destroy all sets */
-+                      index = IP_SET_INVALID_ID;
-+              } else {
-+                      req_destroy->name[IP_SET_MAXNAMELEN - 1] = '\0';
-+                      index = ip_set_find_byname(req_destroy->name);
-+
-+                      if (index == IP_SET_INVALID_ID) {
-+                              res = -ENOENT;
-+                              goto done;
-+                      }
-+              }
-+                      
-+              res = ip_set_destroy(index);
-+              goto done;
-+      }
-+      case IP_SET_OP_FLUSH:{
-+              struct ip_set_req_std *req_flush =
-+                      (struct ip_set_req_std *) data;
-+
-+              if (len != sizeof(struct ip_set_req_std)) {
-+                      ip_set_printk("invalid FLUSH data (want %zu, got %u)",
-+                                    sizeof(struct ip_set_req_std), len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              if (strcmp(req_flush->name, IPSET_TOKEN_ALL) == 0) {
-+                      /* Flush all sets */
-+                      index = IP_SET_INVALID_ID;
-+              } else {
-+                      req_flush->name[IP_SET_MAXNAMELEN - 1] = '\0';
-+                      index = ip_set_find_byname(req_flush->name);
-+
-+                      if (index == IP_SET_INVALID_ID) {
-+                              res = -ENOENT;
-+                              goto done;
-+                      }
-+              }
-+              res = ip_set_flush(index);
-+              goto done;
-+      }
-+      case IP_SET_OP_RENAME:{
-+              struct ip_set_req_create *req_rename
-+                      = (struct ip_set_req_create *) data;
-+
-+              if (len != sizeof(struct ip_set_req_create)) {
-+                      ip_set_printk("invalid RENAME data (want %zu, got %u)",
-+                                    sizeof(struct ip_set_req_create), len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+
-+              req_rename->name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              req_rename->typename[IP_SET_MAXNAMELEN - 1] = '\0';
-+                      
-+              index = ip_set_find_byname(req_rename->name);
-+              if (index == IP_SET_INVALID_ID) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              res = ip_set_rename(index, req_rename->typename);
-+              goto done;
-+      }
-+      case IP_SET_OP_SWAP:{
-+              struct ip_set_req_create *req_swap
-+                      = (struct ip_set_req_create *) data;
-+              ip_set_id_t to_index;
-+
-+              if (len != sizeof(struct ip_set_req_create)) {
-+                      ip_set_printk("invalid SWAP data (want %zu, got %u)",
-+                                    sizeof(struct ip_set_req_create), len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+
-+              req_swap->name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              req_swap->typename[IP_SET_MAXNAMELEN - 1] = '\0';
-+
-+              index = ip_set_find_byname(req_swap->name);
-+              if (index == IP_SET_INVALID_ID) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              to_index = ip_set_find_byname(req_swap->typename);
-+              if (to_index == IP_SET_INVALID_ID) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              res = ip_set_swap(index, to_index);
-+              goto done;
-+      }
-+      default: 
-+              break;  /* Set identified by id */
-+      }
-+      
-+      /* There we may have add/del/test/bind/unbind/test_bind operations */
-+      if (*op < IP_SET_OP_ADD_IP || *op > IP_SET_OP_TEST_BIND_SET) {
-+              res = -EBADMSG;
-+              goto done;
-+      }
-+      adtfn = adtfn_table[*op - IP_SET_OP_ADD_IP].fn;
-+
-+      if (len < sizeof(struct ip_set_req_adt)) {
-+              ip_set_printk("short data in adt request (want >=%zu, got %u)",
-+                            sizeof(struct ip_set_req_adt), len);
-+              res = -EINVAL;
-+              goto done;
-+      }
-+      req_adt = (struct ip_set_req_adt *) data;
-+
-+      /* -U :all: :all:|:default: uses IP_SET_INVALID_ID */
-+      if (!(*op == IP_SET_OP_UNBIND_SET 
-+            && req_adt->index == IP_SET_INVALID_ID)) {
-+              index = ip_set_find_byindex(req_adt->index);
-+              if (index == IP_SET_INVALID_ID) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+      }
-+      res = adtfn(index, data, len);
-+
-+    done:
-+      up(&ip_set_app_mutex);
-+      vfree(data);
-+      if (res > 0)
-+              res = 0;
-+      DP("final result %d", res);
-+      return res;
-+}
-+
-+static int 
-+ip_set_sockfn_get(struct sock *sk, int optval, void *user, int *len)
-+{
-+      int res = 0;
-+      unsigned *op;
-+      ip_set_id_t index = IP_SET_INVALID_ID;
-+      void *data;
-+      int copylen = *len;
-+
-+      DP("optval=%d, user=%p, len=%d", optval, user, *len);
-+      if (!capable(CAP_NET_ADMIN))
-+              return -EPERM;
-+      if (optval != SO_IP_SET)
-+              return -EBADF;
-+      if (*len < sizeof(unsigned)) {
-+              ip_set_printk("short userdata (want >=%zu, got %d)",
-+                            sizeof(unsigned), *len);
-+              return -EINVAL;
-+      }
-+      data = vmalloc(*len);
-+      if (!data) {
-+              DP("out of mem for %d bytes", *len);
-+              return -ENOMEM;
-+      }
-+      if (copy_from_user(data, user, *len) != 0) {
-+              res = -EFAULT;
-+              goto done;
-+      }
-+      if (down_interruptible(&ip_set_app_mutex)) {
-+              res = -EINTR;
-+              goto done;
-+      }
-+
-+      op = (unsigned *) data;
-+      DP("op=%x", *op);
-+
-+      if (*op < IP_SET_OP_VERSION) {
-+              /* Check the version at the beginning of operations */
-+              struct ip_set_req_version *req_version =
-+                      (struct ip_set_req_version *) data;
-+              if (req_version->version != IP_SET_PROTOCOL_VERSION) {
-+                      res = -EPROTO;
-+                      goto done;
-+              }
-+      }
-+
-+      switch (*op) {
-+      case IP_SET_OP_VERSION: {
-+              struct ip_set_req_version *req_version =
-+                  (struct ip_set_req_version *) data;
-+
-+              if (*len != sizeof(struct ip_set_req_version)) {
-+                      ip_set_printk("invalid VERSION (want %zu, got %d)",
-+                                    sizeof(struct ip_set_req_version),
-+                                    *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+
-+              req_version->version = IP_SET_PROTOCOL_VERSION;
-+              res = copy_to_user(user, req_version,
-+                                 sizeof(struct ip_set_req_version));
-+              goto done;
-+      }
-+      case IP_SET_OP_GET_BYNAME: {
-+              struct ip_set_req_get_set *req_get
-+                      = (struct ip_set_req_get_set *) data;
-+
-+              if (*len != sizeof(struct ip_set_req_get_set)) {
-+                      ip_set_printk("invalid GET_BYNAME (want %zu, got %d)",
-+                                    sizeof(struct ip_set_req_get_set), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              req_get->set.name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              index = ip_set_find_byname(req_get->set.name);
-+              req_get->set.index = index;
-+              goto copy;
-+      }
-+      case IP_SET_OP_GET_BYINDEX: {
-+              struct ip_set_req_get_set *req_get
-+                      = (struct ip_set_req_get_set *) data;
-+
-+              if (*len != sizeof(struct ip_set_req_get_set)) {
-+                      ip_set_printk("invalid GET_BYINDEX (want %zu, got %d)",
-+                                    sizeof(struct ip_set_req_get_set), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              req_get->set.name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              index = ip_set_find_byindex(req_get->set.index);
-+              strncpy(req_get->set.name,
-+                      index == IP_SET_INVALID_ID ? ""
-+                      : ip_set_list[index]->name, IP_SET_MAXNAMELEN);
-+              goto copy;
-+      }
-+      case IP_SET_OP_ADT_GET: {
-+              struct ip_set_req_adt_get *req_get
-+                      = (struct ip_set_req_adt_get *) data;
-+
-+              if (*len != sizeof(struct ip_set_req_adt_get)) {
-+                      ip_set_printk("invalid ADT_GET (want %zu, got %d)",
-+                                    sizeof(struct ip_set_req_adt_get), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              req_get->set.name[IP_SET_MAXNAMELEN - 1] = '\0';
-+              index = ip_set_find_byname(req_get->set.name);
-+              if (index != IP_SET_INVALID_ID) {
-+                      req_get->set.index = index;
-+                      strncpy(req_get->typename,
-+                              ip_set_list[index]->type->typename,
-+                              IP_SET_MAXNAMELEN - 1);
-+              } else {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              goto copy;
-+      }
-+      case IP_SET_OP_MAX_SETS: {
-+              struct ip_set_req_max_sets *req_max_sets
-+                      = (struct ip_set_req_max_sets *) data;
-+              ip_set_id_t i;
-+
-+              if (*len != sizeof(struct ip_set_req_max_sets)) {
-+                      ip_set_printk("invalid MAX_SETS (want %zu, got %d)",
-+                                    sizeof(struct ip_set_req_max_sets), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+
-+              if (strcmp(req_max_sets->set.name, IPSET_TOKEN_ALL) == 0) {
-+                      req_max_sets->set.index = IP_SET_INVALID_ID;
-+              } else {
-+                      req_max_sets->set.name[IP_SET_MAXNAMELEN - 1] = '\0';
-+                      req_max_sets->set.index = 
-+                              ip_set_find_byname(req_max_sets->set.name);
-+                      if (req_max_sets->set.index == IP_SET_INVALID_ID) {
-+                              res = -ENOENT;
-+                              goto done;
-+                      }
-+              }
-+              req_max_sets->max_sets = ip_set_max;
-+              req_max_sets->sets = 0;
-+              for (i = 0; i < ip_set_max; i++) {
-+                      if (ip_set_list[i] != NULL)
-+                              req_max_sets->sets++;
-+              }
-+              goto copy;
-+      }
-+      case IP_SET_OP_LIST_SIZE: 
-+      case IP_SET_OP_SAVE_SIZE: {
-+              struct ip_set_req_setnames *req_setnames
-+                      = (struct ip_set_req_setnames *) data;
-+              struct ip_set_name_list *name_list;
-+              struct ip_set *set;
-+              ip_set_id_t i;
-+              int used;
-+
-+              if (*len < sizeof(struct ip_set_req_setnames)) {
-+                      ip_set_printk("short LIST_SIZE (want >=%zu, got %d)",
-+                                    sizeof(struct ip_set_req_setnames), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+
-+              req_setnames->size = 0;
-+              used = sizeof(struct ip_set_req_setnames);
-+              for (i = 0; i < ip_set_max; i++) {
-+                      if (ip_set_list[i] == NULL)
-+                              continue;
-+                      name_list = (struct ip_set_name_list *) 
-+                              (data + used);
-+                      used += sizeof(struct ip_set_name_list);
-+                      if (used > copylen) {
-+                              res = -EAGAIN;
-+                              goto done;
-+                      }
-+                      set = ip_set_list[i];
-+                      /* Fill in index, name, etc. */
-+                      name_list->index = i;
-+                      name_list->id = set->id;
-+                      strncpy(name_list->name,
-+                              set->name,
-+                              IP_SET_MAXNAMELEN - 1);
-+                      strncpy(name_list->typename,
-+                              set->type->typename,
-+                              IP_SET_MAXNAMELEN - 1);
-+                      DP("filled %s of type %s, index %u\n",
-+                         name_list->name, name_list->typename,
-+                         name_list->index);
-+                      if (!(req_setnames->index == IP_SET_INVALID_ID
-+                            || req_setnames->index == i))
-+                            continue;
-+                      /* Update size */
-+                      switch (*op) {
-+                      case IP_SET_OP_LIST_SIZE: {
-+                              req_setnames->size += sizeof(struct ip_set_list)
-+                                      + set->type->header_size
-+                                      + set->type->list_members_size(set);
-+                              /* Sets are identified by id in the hash */
-+                              FOREACH_HASH_DO(__set_hash_bindings_size_list, 
-+                                              set->id, &req_setnames->size);
-+                              break;
-+                      }
-+                      case IP_SET_OP_SAVE_SIZE: {
-+                              req_setnames->size += sizeof(struct ip_set_save)
-+                                      + set->type->header_size
-+                                      + set->type->list_members_size(set);
-+                              FOREACH_HASH_DO(__set_hash_bindings_size_save,
-+                                              set->id, &req_setnames->size);
-+                              break;
-+                      }
-+                      default:
-+                              break;
-+                      }
-+              }
-+              if (copylen != used) {
-+                      res = -EAGAIN;
-+                      goto done;
-+              }
-+              goto copy;
-+      }
-+      case IP_SET_OP_LIST: {
-+              struct ip_set_req_list *req_list
-+                      = (struct ip_set_req_list *) data;
-+              ip_set_id_t i;
-+              int used;
-+
-+              if (*len < sizeof(struct ip_set_req_list)) {
-+                      ip_set_printk("short LIST (want >=%zu, got %d)",
-+                                    sizeof(struct ip_set_req_list), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              index = req_list->index;
-+              if (index != IP_SET_INVALID_ID
-+                  && ip_set_find_byindex(index) != index) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              used = 0;
-+              if (index == IP_SET_INVALID_ID) {
-+                      /* List all sets */
-+                      for (i = 0; i < ip_set_max && res == 0; i++) {
-+                              if (ip_set_list[i] != NULL)
-+                                      res = ip_set_list_set(i, data, &used, *len);
-+                      }
-+              } else {
-+                      /* List an individual set */
-+                      res = ip_set_list_set(index, data, &used, *len);
-+              }
-+              if (res != 0)
-+                      goto done;
-+              else if (copylen != used) {
-+                      res = -EAGAIN;
-+                      goto done;
-+              }
-+              goto copy;
-+      }
-+      case IP_SET_OP_SAVE: {
-+              struct ip_set_req_list *req_save
-+                      = (struct ip_set_req_list *) data;
-+              ip_set_id_t i;
-+              int used;
-+
-+              if (*len < sizeof(struct ip_set_req_list)) {
-+                      ip_set_printk("short SAVE (want >=%zu, got %d)",
-+                                    sizeof(struct ip_set_req_list), *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              index = req_save->index;
-+              if (index != IP_SET_INVALID_ID
-+                  && ip_set_find_byindex(index) != index) {
-+                      res = -ENOENT;
-+                      goto done;
-+              }
-+              used = 0;
-+              if (index == IP_SET_INVALID_ID) {
-+                      /* Save all sets */
-+                      for (i = 0; i < ip_set_max && res == 0; i++) {
-+                              if (ip_set_list[i] != NULL)
-+                                      res = ip_set_save_set(i, data, &used, *len);
-+                      }
-+              } else {
-+                      /* Save an individual set */
-+                      res = ip_set_save_set(index, data, &used, *len);
-+              }
-+              if (res == 0)
-+                      res = ip_set_save_bindings(index, data, &used, *len);
-+                      
-+              if (res != 0)
-+                      goto done;
-+              else if (copylen != used) {
-+                      res = -EAGAIN;
-+                      goto done;
-+              }
-+              goto copy;
-+      }
-+      case IP_SET_OP_RESTORE: {
-+              struct ip_set_req_setnames *req_restore
-+                      = (struct ip_set_req_setnames *) data;
-+              int line;
-+
-+              if (*len < sizeof(struct ip_set_req_setnames)
-+                  || *len != req_restore->size) {
-+                      ip_set_printk("invalid RESTORE (want =%zu, got %d)",
-+                                    req_restore->size, *len);
-+                      res = -EINVAL;
-+                      goto done;
-+              }
-+              line = ip_set_restore(data + sizeof(struct ip_set_req_setnames),
-+                                    req_restore->size - sizeof(struct ip_set_req_setnames));
-+              DP("ip_set_restore: %u", line);
-+              if (line != 0) {
-+                      res = -EAGAIN;
-+                      req_restore->size = line;
-+                      copylen = sizeof(struct ip_set_req_setnames);
-+                      goto copy;
-+              }
-+              goto done;
-+      }
-+      default:
-+              res = -EBADMSG;
-+              goto done;
-+      }       /* end of switch(op) */
-+
-+    copy:
-+      DP("set %s, copylen %u", index != IP_SET_INVALID_ID
-+                               && ip_set_list[index]
-+                   ? ip_set_list[index]->name
-+                   : ":all:", copylen);
-+      res = copy_to_user(user, data, copylen);
-+      
-+    done:
-+      up(&ip_set_app_mutex);
-+      vfree(data);
-+      if (res > 0)
-+              res = 0;
-+      DP("final result %d", res);
-+      return res;
-+}
-+
-+static struct nf_sockopt_ops so_set = {
-+      .pf             = PF_INET,
-+      .set_optmin     = SO_IP_SET,
-+      .set_optmax     = SO_IP_SET + 1,
-+      .set            = &ip_set_sockfn_set,
-+      .get_optmin     = SO_IP_SET,
-+      .get_optmax     = SO_IP_SET + 1,
-+      .get            = &ip_set_sockfn_get,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      .owner          = THIS_MODULE,
-+#endif
-+};
-+
-+static int max_sets, hash_size;
-+module_param(max_sets, int, 0600);
-+MODULE_PARM_DESC(max_sets, "maximal number of sets");
-+module_param(hash_size, int, 0600);
-+MODULE_PARM_DESC(hash_size, "hash size for bindings");
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("module implementing core IP set support");
-+
-+static int __init ip_set_init(void)
-+{
-+      int res;
-+      ip_set_id_t i;
-+
-+      get_random_bytes(&ip_set_hash_random, 4);
-+      if (max_sets)
-+              ip_set_max = max_sets;
-+      ip_set_list = vmalloc(sizeof(struct ip_set *) * ip_set_max);
-+      if (!ip_set_list) {
-+              printk(KERN_ERR "Unable to create ip_set_list\n");
-+              return -ENOMEM;
-+      }
-+      memset(ip_set_list, 0, sizeof(struct ip_set *) * ip_set_max);
-+      if (hash_size)
-+              ip_set_bindings_hash_size = hash_size;
-+      ip_set_hash = vmalloc(sizeof(struct list_head) * ip_set_bindings_hash_size);
-+      if (!ip_set_hash) {
-+              printk(KERN_ERR "Unable to create ip_set_hash\n");
-+              vfree(ip_set_list);
-+              return -ENOMEM;
-+      }
-+      for (i = 0; i < ip_set_bindings_hash_size; i++)
-+              INIT_LIST_HEAD(&ip_set_hash[i]);
-+
-+      INIT_LIST_HEAD(&set_type_list);
-+
-+      res = nf_register_sockopt(&so_set);
-+      if (res != 0) {
-+              ip_set_printk("SO_SET registry failed: %d", res);
-+              vfree(ip_set_list);
-+              vfree(ip_set_hash);
-+              return res;
-+      }
-+      return 0;
-+}
-+
-+static void __exit ip_set_fini(void)
-+{
-+      /* There can't be any existing set or binding */
-+      nf_unregister_sockopt(&so_set);
-+      vfree(ip_set_list);
-+      vfree(ip_set_hash);
-+      DP("these are the famous last words");
-+}
-+
-+EXPORT_SYMBOL(ip_set_register_set_type);
-+EXPORT_SYMBOL(ip_set_unregister_set_type);
-+
-+EXPORT_SYMBOL(ip_set_get_byname);
-+EXPORT_SYMBOL(ip_set_get_byindex);
-+EXPORT_SYMBOL(ip_set_put);
-+
-+EXPORT_SYMBOL(ip_set_addip_kernel);
-+EXPORT_SYMBOL(ip_set_delip_kernel);
-+EXPORT_SYMBOL(ip_set_testip_kernel);
-+
-+module_init(ip_set_init);
-+module_exit(ip_set_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_iphash.c
-@@ -0,0 +1,429 @@
-+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing an ip hash set */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/jhash.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+#include <linux/vmalloc.h>
-+#include <linux/random.h>
-+
-+#include <net/ip.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_malloc.h>
-+#include <linux/netfilter_ipv4/ip_set_iphash.h>
-+
-+static int limit = MAX_RANGE;
-+
-+static inline __u32
-+jhash_ip(const struct ip_set_iphash *map, uint16_t i, ip_set_ip_t ip)
-+{
-+      return jhash_1word(ip, *(((uint32_t *) map->initval) + i));
-+}
-+
-+static inline __u32
-+hash_id(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      __u32 id;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+
-+      *hash_ip = ip & map->netmask;
-+      DP("set: %s, ip:%u.%u.%u.%u, %u.%u.%u.%u, %u.%u.%u.%u",
-+         set->name, HIPQUAD(ip), HIPQUAD(*hash_ip), HIPQUAD(map->netmask));
-+      
-+      for (i = 0; i < map->probes; i++) {
-+              id = jhash_ip(map, i, *hash_ip) % map->hashsize;
-+              DP("hash key: %u", id);
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+              if (*elem == *hash_ip)
-+                      return id;
-+              /* No shortcut at testing - there can be deleted
-+               * entries. */
-+      }
-+      return UINT_MAX;
-+}
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      return (ip && hash_id(set, ip, hash_ip) != UINT_MAX);
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iphash *req = 
-+          (struct ip_set_req_iphash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iphash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iphash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __testip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      return __testip(set,
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip);
-+}
-+
-+static inline int
-+__addip(struct ip_set_iphash *map, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      __u32 probe;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+      
-+      if (!ip || map->elements >= limit)
-+              return -ERANGE;
-+
-+      *hash_ip = ip & map->netmask;
-+      
-+      for (i = 0; i < map->probes; i++) {
-+              probe = jhash_ip(map, i, *hash_ip) % map->hashsize;
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, probe);
-+              if (*elem == *hash_ip)
-+                      return -EEXIST;
-+              if (!*elem) {
-+                      *elem = *hash_ip;
-+                      map->elements++;
-+                      return 0;
-+              }
-+      }
-+      /* Trigger rehashing */
-+      return -EAGAIN;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iphash *req = 
-+          (struct ip_set_req_iphash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iphash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iphash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __addip((struct ip_set_iphash *) set->data, req->ip, hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __addip((struct ip_set_iphash *) set->data,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+static int retry(struct ip_set *set)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      ip_set_ip_t hash_ip, *elem;
-+      void *members;
-+      u_int32_t i, hashsize = map->hashsize;
-+      int res;
-+      struct ip_set_iphash *tmp;
-+      
-+      if (map->resize == 0)
-+              return -ERANGE;
-+
-+    again:
-+      res = 0;
-+      
-+      /* Calculate new hash size */
-+      hashsize += (hashsize * map->resize)/100;
-+      if (hashsize == map->hashsize)
-+              hashsize++;
-+      
-+      ip_set_printk("rehashing of set %s triggered: "
-+                    "hashsize grows from %u to %u",
-+                    set->name, map->hashsize, hashsize);
-+
-+      tmp = kmalloc(sizeof(struct ip_set_iphash) 
-+                    + map->probes * sizeof(uint32_t), GFP_ATOMIC);
-+      if (!tmp) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_iphash)
-+                 + map->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      tmp->members = harray_malloc(hashsize, sizeof(ip_set_ip_t), GFP_ATOMIC);
-+      if (!tmp->members) {
-+              DP("out of memory for %d bytes", hashsize * sizeof(ip_set_ip_t));
-+              kfree(tmp);
-+              return -ENOMEM;
-+      }
-+      tmp->hashsize = hashsize;
-+      tmp->elements = 0;
-+      tmp->probes = map->probes;
-+      tmp->resize = map->resize;
-+      tmp->netmask = map->netmask;
-+      memcpy(tmp->initval, map->initval, map->probes * sizeof(uint32_t));
-+      
-+      write_lock_bh(&set->lock);
-+      map = (struct ip_set_iphash *) set->data; /* Play safe */
-+      for (i = 0; i < map->hashsize && res == 0; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              if (*elem)
-+                      res = __addip(tmp, *elem, &hash_ip);
-+      }
-+      if (res) {
-+              /* Failure, try again */
-+              write_unlock_bh(&set->lock);
-+              harray_free(tmp->members);
-+              kfree(tmp);
-+              goto again;
-+      }
-+      
-+      /* Success at resizing! */
-+      members = map->members;
-+
-+      map->hashsize = tmp->hashsize;
-+      map->members = tmp->members;
-+      write_unlock_bh(&set->lock);
-+
-+      harray_free(members);
-+      kfree(tmp);
-+
-+      return 0;
-+}
-+
-+static inline int
-+__delip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      ip_set_ip_t id, *elem;
-+
-+      if (!ip)
-+              return -ERANGE;
-+
-+      id = hash_id(set, ip, hash_ip);
-+      if (id == UINT_MAX)
-+              return -EEXIST;
-+              
-+      elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+      *elem = 0;
-+      map->elements--;
-+
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iphash *req =
-+          (struct ip_set_req_iphash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iphash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iphash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __delip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      struct ip_set_req_iphash_create *req =
-+          (struct ip_set_req_iphash_create *) data;
-+      struct ip_set_iphash *map;
-+      uint16_t i;
-+
-+      if (size != sizeof(struct ip_set_req_iphash_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                             sizeof(struct ip_set_req_iphash_create),
-+                             size);
-+              return -EINVAL;
-+      }
-+
-+      if (req->hashsize < 1) {
-+              ip_set_printk("hashsize too small");
-+              return -ENOEXEC;
-+      }
-+
-+      if (req->probes < 1) {
-+              ip_set_printk("probes too small");
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_iphash) 
-+                    + req->probes * sizeof(uint32_t), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_iphash)
-+                 + req->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      for (i = 0; i < req->probes; i++)
-+              get_random_bytes(((uint32_t *) map->initval)+i, 4);
-+      map->elements = 0;
-+      map->hashsize = req->hashsize;
-+      map->probes = req->probes;
-+      map->resize = req->resize;
-+      map->netmask = req->netmask;
-+      map->members = harray_malloc(map->hashsize, sizeof(ip_set_ip_t), GFP_KERNEL);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", map->hashsize * sizeof(ip_set_ip_t));
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+
-+      harray_free(map->members);
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      harray_flush(map->members, map->hashsize, sizeof(ip_set_ip_t));
-+      map->elements = 0;
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      struct ip_set_req_iphash_create *header =
-+          (struct ip_set_req_iphash_create *) data;
-+
-+      header->hashsize = map->hashsize;
-+      header->probes = map->probes;
-+      header->resize = map->resize;
-+      header->netmask = map->netmask;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+
-+      return (map->hashsize * sizeof(ip_set_ip_t));
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iphash *map = (struct ip_set_iphash *) set->data;
-+      ip_set_ip_t i, *elem;
-+
-+      for (i = 0; i < map->hashsize; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              ((ip_set_ip_t *)data)[i] = *elem;
-+      }
-+}
-+
-+static struct ip_set_type ip_set_iphash = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_iphash),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .retry                  = &retry,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_iphash_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("iphash type of IP sets");
-+module_param(limit, int, 0600);
-+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets");
-+
-+static int __init ip_set_iphash_init(void)
-+{
-+      return ip_set_register_set_type(&ip_set_iphash);
-+}
-+
-+static void __exit ip_set_iphash_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_iphash);
-+}
-+
-+module_init(ip_set_iphash_init);
-+module_exit(ip_set_iphash_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_ipmap.c
-@@ -0,0 +1,336 @@
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing an IP set type: the single bitmap type */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_ipmap.h>
-+
-+static inline ip_set_ip_t
-+ip_to_id(const struct ip_set_ipmap *map, ip_set_ip_t ip)
-+{
-+      return (ip - map->first_ip)/map->hosts;
-+}
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+      
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      *hash_ip = ip & map->netmask;
-+      DP("set: %s, ip:%u.%u.%u.%u, %u.%u.%u.%u",
-+         set->name, HIPQUAD(ip), HIPQUAD(*hash_ip));
-+      return !!test_bit(ip_to_id(map, *hash_ip), map->members);
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipmap *req = 
-+          (struct ip_set_req_ipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __testip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      int res =  __testip(set,
-+                      ntohl(flags[index] & IPSET_SRC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip);
-+      return (res < 0 ? 0 : res);
-+}
-+
-+static inline int
-+__addip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      *hash_ip = ip & map->netmask;
-+      DP("%u.%u.%u.%u, %u.%u.%u.%u", HIPQUAD(ip), HIPQUAD(*hash_ip));
-+      if (test_and_set_bit(ip_to_id(map, *hash_ip), map->members))
-+              return -EEXIST;
-+
-+      return 0;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipmap *req = 
-+          (struct ip_set_req_ipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      DP("%u.%u.%u.%u", HIPQUAD(req->ip));
-+      return __addip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __addip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+static inline int 
-+__delip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      *hash_ip = ip & map->netmask;
-+      DP("%u.%u.%u.%u, %u.%u.%u.%u", HIPQUAD(ip), HIPQUAD(*hash_ip));
-+      if (!test_and_clear_bit(ip_to_id(map, *hash_ip), map->members))
-+              return -EEXIST;
-+      
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipmap *req =
-+          (struct ip_set_req_ipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set,
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __delip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      int newbytes;
-+      struct ip_set_req_ipmap_create *req =
-+          (struct ip_set_req_ipmap_create *) data;
-+      struct ip_set_ipmap *map;
-+
-+      if (size != sizeof(struct ip_set_req_ipmap_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipmap_create),
-+                            size);
-+              return -EINVAL;
-+      }
-+
-+      DP("from %u.%u.%u.%u to %u.%u.%u.%u",
-+         HIPQUAD(req->from), HIPQUAD(req->to));
-+
-+      if (req->from > req->to) {
-+              DP("bad ip range");
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_ipmap), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_ipmap));
-+              return -ENOMEM;
-+      }
-+      map->first_ip = req->from;
-+      map->last_ip = req->to;
-+      map->netmask = req->netmask;
-+
-+      if (req->netmask == 0xFFFFFFFF) {
-+              map->hosts = 1;
-+              map->sizeid = map->last_ip - map->first_ip + 1;
-+      } else {
-+              unsigned int mask_bits, netmask_bits;
-+              ip_set_ip_t mask;
-+              
-+              map->first_ip &= map->netmask;  /* Should we better bark? */
-+              
-+              mask = range_to_mask(map->first_ip, map->last_ip, &mask_bits);
-+              netmask_bits = mask_to_bits(map->netmask);
-+              
-+              if ((!mask && (map->first_ip || map->last_ip != 0xFFFFFFFF))
-+                  || netmask_bits <= mask_bits)
-+                      return -ENOEXEC;
-+
-+              DP("mask_bits %u, netmask_bits %u",
-+                 mask_bits, netmask_bits);
-+              map->hosts = 2 << (32 - netmask_bits - 1);
-+              map->sizeid = 2 << (netmask_bits - mask_bits - 1);
-+      }
-+      if (map->sizeid > MAX_RANGE + 1) {
-+              ip_set_printk("range too big (max %d addresses)",
-+                             MAX_RANGE+1);
-+              kfree(map);
-+              return -ENOEXEC;
-+      }
-+      DP("hosts %u, sizeid %u", map->hosts, map->sizeid);
-+      newbytes = bitmap_bytes(0, map->sizeid - 1);
-+      map->members = kmalloc(newbytes, GFP_KERNEL);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", newbytes);
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+      memset(map->members, 0, newbytes);
-+      
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+      
-+      kfree(map->members);
-+      kfree(map);
-+      
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+      memset(map->members, 0, bitmap_bytes(0, map->sizeid - 1));
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+      struct ip_set_req_ipmap_create *header =
-+          (struct ip_set_req_ipmap_create *) data;
-+
-+      header->from = map->first_ip;
-+      header->to = map->last_ip;
-+      header->netmask = map->netmask;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+
-+      return bitmap_bytes(0, map->sizeid - 1);
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_ipmap *map = (struct ip_set_ipmap *) set->data;
-+      int bytes = bitmap_bytes(0, map->sizeid - 1);
-+
-+      memcpy(data, map->members, bytes);
-+}
-+
-+static struct ip_set_type ip_set_ipmap = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_ipmap),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_ipmap_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("ipmap type of IP sets");
-+
-+static int __init ip_set_ipmap_init(void)
-+{
-+      return ip_set_register_set_type(&ip_set_ipmap);
-+}
-+
-+static void __exit ip_set_ipmap_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_ipmap);
-+}
-+
-+module_init(ip_set_ipmap_init);
-+module_exit(ip_set_ipmap_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_ipporthash.c
-@@ -0,0 +1,581 @@
-+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing an ip+port hash set */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/udp.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/jhash.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+#include <linux/vmalloc.h>
-+#include <linux/random.h>
-+
-+#include <net/ip.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_malloc.h>
-+#include <linux/netfilter_ipv4/ip_set_ipporthash.h>
-+
-+static int limit = MAX_RANGE;
-+
-+/* We must handle non-linear skbs */
-+static inline ip_set_ip_t
-+get_port(const struct sk_buff *skb, u_int32_t flags)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+      struct iphdr *iph = ip_hdr(skb);
-+#else
-+      struct iphdr *iph = skb->nh.iph;
-+#endif
-+      u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET;
-+
-+      switch (iph->protocol) {
-+      case IPPROTO_TCP: {
-+              struct tcphdr tcph;
-+              
-+              /* See comments at tcp_match in ip_tables.c */
-+              if (offset)
-+                      return INVALID_PORT;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+              if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0)
-+#else
-+              if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0)
-+#endif
-+                      /* No choice either */
-+                      return INVALID_PORT;
-+              
-+              return ntohs(flags & IPSET_SRC ?
-+                           tcph.source : tcph.dest);
-+          }
-+      case IPPROTO_UDP: {
-+              struct udphdr udph;
-+
-+              if (offset)
-+                      return INVALID_PORT;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+              if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0)
-+#else
-+              if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0)
-+#endif
-+                      /* No choice either */
-+                      return INVALID_PORT;
-+              
-+              return ntohs(flags & IPSET_SRC ?
-+                           udph.source : udph.dest);
-+          }
-+      default:
-+              return INVALID_PORT;
-+      }
-+}
-+
-+static inline __u32
-+jhash_ip(const struct ip_set_ipporthash *map, uint16_t i, ip_set_ip_t ip)
-+{
-+      return jhash_1word(ip, *(((uint32_t *) map->initval) + i));
-+}
-+
-+#define HASH_IP(map, ip, port) (port + ((ip - ((map)->first_ip)) << 16))
-+
-+static inline __u32
-+hash_id(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t port,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipporthash *map = 
-+              (struct ip_set_ipporthash *) set->data;
-+      __u32 id;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+
-+      *hash_ip = HASH_IP(map, ip, port);
-+      DP("set: %s, ipport:%u.%u.%u.%u:%u, %u.%u.%u.%u",
-+         set->name, HIPQUAD(ip), port, HIPQUAD(*hash_ip));
-+      
-+      for (i = 0; i < map->probes; i++) {
-+              id = jhash_ip(map, i, *hash_ip) % map->hashsize;
-+              DP("hash key: %u", id);
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+              if (*elem == *hash_ip)
-+                      return id;
-+              /* No shortcut at testing - there can be deleted
-+               * entries. */
-+      }
-+      return UINT_MAX;
-+}
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t port,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      return (hash_id(set, ip, port, hash_ip) != UINT_MAX);
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipporthash *req = 
-+          (struct ip_set_req_ipporthash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipporthash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipporthash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __testip(set, req->ip, req->port, hash_ip);
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      ip_set_ip_t port;
-+      int res;
-+
-+      if (flags[index+1] == 0)
-+              return 0;
-+              
-+      port = get_port(skb, flags[index+1]);
-+
-+      DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u",
-+         flags[index] & IPSET_SRC ? "SRC" : "DST",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+         NIPQUAD(ip_hdr(skb)->saddr),
-+         NIPQUAD(ip_hdr(skb)->daddr));
-+#else
-+         NIPQUAD(skb->nh.iph->saddr),
-+         NIPQUAD(skb->nh.iph->daddr));
-+#endif
-+      DP("flag %s port %u",
-+         flags[index+1] & IPSET_SRC ? "SRC" : "DST", 
-+         port);       
-+      if (port == INVALID_PORT)
-+              return 0;       
-+
-+      res =  __testip(set,
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                                      ? ip_hdr(skb)->saddr 
-+                                      : ip_hdr(skb)->daddr),
-+#else
-+                                      ? skb->nh.iph->saddr 
-+                                      : skb->nh.iph->daddr),
-+#endif
-+                      port,
-+                      hash_ip);
-+      return (res < 0 ? 0 : res);
-+      
-+}
-+
-+static inline int
-+__add_haship(struct ip_set_ipporthash *map, ip_set_ip_t hash_ip)
-+{
-+      __u32 probe;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+
-+      for (i = 0; i < map->probes; i++) {
-+              probe = jhash_ip(map, i, hash_ip) % map->hashsize;
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, probe);
-+              if (*elem == hash_ip)
-+                      return -EEXIST;
-+              if (!*elem) {
-+                      *elem = hash_ip;
-+                      map->elements++;
-+                      return 0;
-+              }
-+      }
-+      /* Trigger rehashing */
-+      return -EAGAIN;
-+}
-+
-+static inline int
-+__addip(struct ip_set_ipporthash *map, ip_set_ip_t ip, ip_set_ip_t port,
-+      ip_set_ip_t *hash_ip)
-+{
-+      if (map->elements > limit)
-+              return -ERANGE;
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      *hash_ip = HASH_IP(map, ip, port);
-+      
-+      return __add_haship(map, *hash_ip);
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipporthash *req = 
-+          (struct ip_set_req_ipporthash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipporthash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipporthash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __addip((struct ip_set_ipporthash *) set->data, 
-+                      req->ip, req->port, hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      ip_set_ip_t port;
-+
-+      if (flags[index+1] == 0)
-+              return -EINVAL;
-+              
-+      port = get_port(skb, flags[index+1]);
-+
-+      DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u",
-+         flags[index] & IPSET_SRC ? "SRC" : "DST",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+         NIPQUAD(ip_hdr(skb)->saddr),
-+         NIPQUAD(ip_hdr(skb)->daddr));
-+#else
-+         NIPQUAD(skb->nh.iph->saddr),
-+         NIPQUAD(skb->nh.iph->daddr));
-+#endif
-+      DP("flag %s port %u", 
-+         flags[index+1] & IPSET_SRC ? "SRC" : "DST", 
-+         port);       
-+      if (port == INVALID_PORT)
-+              return -EINVAL; 
-+
-+      return __addip((struct ip_set_ipporthash *) set->data,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     port,
-+                     hash_ip);
-+}
-+
-+static int retry(struct ip_set *set)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      ip_set_ip_t *elem;
-+      void *members;
-+      u_int32_t i, hashsize = map->hashsize;
-+      int res;
-+      struct ip_set_ipporthash *tmp;
-+      
-+      if (map->resize == 0)
-+              return -ERANGE;
-+
-+    again:
-+      res = 0;
-+      
-+      /* Calculate new hash size */
-+      hashsize += (hashsize * map->resize)/100;
-+      if (hashsize == map->hashsize)
-+              hashsize++;
-+      
-+      ip_set_printk("rehashing of set %s triggered: "
-+                    "hashsize grows from %u to %u",
-+                    set->name, map->hashsize, hashsize);
-+
-+      tmp = kmalloc(sizeof(struct ip_set_ipporthash) 
-+                    + map->probes * sizeof(uint32_t), GFP_ATOMIC);
-+      if (!tmp) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_ipporthash)
-+                 + map->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      tmp->members = harray_malloc(hashsize, sizeof(ip_set_ip_t), GFP_ATOMIC);
-+      if (!tmp->members) {
-+              DP("out of memory for %d bytes", hashsize * sizeof(ip_set_ip_t));
-+              kfree(tmp);
-+              return -ENOMEM;
-+      }
-+      tmp->hashsize = hashsize;
-+      tmp->elements = 0;
-+      tmp->probes = map->probes;
-+      tmp->resize = map->resize;
-+      tmp->first_ip = map->first_ip;
-+      tmp->last_ip = map->last_ip;
-+      memcpy(tmp->initval, map->initval, map->probes * sizeof(uint32_t));
-+      
-+      write_lock_bh(&set->lock);
-+      map = (struct ip_set_ipporthash *) set->data; /* Play safe */
-+      for (i = 0; i < map->hashsize && res == 0; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              if (*elem)
-+                      res = __add_haship(tmp, *elem);
-+      }
-+      if (res) {
-+              /* Failure, try again */
-+              write_unlock_bh(&set->lock);
-+              harray_free(tmp->members);
-+              kfree(tmp);
-+              goto again;
-+      }
-+      
-+      /* Success at resizing! */
-+      members = map->members;
-+
-+      map->hashsize = tmp->hashsize;
-+      map->members = tmp->members;
-+      write_unlock_bh(&set->lock);
-+
-+      harray_free(members);
-+      kfree(tmp);
-+
-+      return 0;
-+}
-+
-+static inline int
-+__delip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t port,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      ip_set_ip_t id;
-+      ip_set_ip_t *elem;
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+
-+      id = hash_id(set, ip, port, hash_ip);
-+
-+      if (id == UINT_MAX)
-+              return -EEXIST;
-+              
-+      elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+      *elem = 0;
-+      map->elements--;
-+
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_ipporthash *req =
-+          (struct ip_set_req_ipporthash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_ipporthash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_ipporthash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delip(set, req->ip, req->port, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      ip_set_ip_t port;
-+
-+      if (flags[index+1] == 0)
-+              return -EINVAL;
-+              
-+      port = get_port(skb, flags[index+1]);
-+
-+      DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u",
-+         flags[index] & IPSET_SRC ? "SRC" : "DST",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+         NIPQUAD(ip_hdr(skb)->saddr),
-+         NIPQUAD(ip_hdr(skb)->daddr));
-+#else
-+         NIPQUAD(skb->nh.iph->saddr),
-+         NIPQUAD(skb->nh.iph->daddr));
-+#endif
-+      DP("flag %s port %u",
-+         flags[index+1] & IPSET_SRC ? "SRC" : "DST", 
-+         port);       
-+      if (port == INVALID_PORT)
-+              return -EINVAL; 
-+
-+      return __delip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     port,
-+                     hash_ip);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      struct ip_set_req_ipporthash_create *req =
-+          (struct ip_set_req_ipporthash_create *) data;
-+      struct ip_set_ipporthash *map;
-+      uint16_t i;
-+
-+      if (size != sizeof(struct ip_set_req_ipporthash_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                             sizeof(struct ip_set_req_ipporthash_create),
-+                             size);
-+              return -EINVAL;
-+      }
-+
-+      if (req->hashsize < 1) {
-+              ip_set_printk("hashsize too small");
-+              return -ENOEXEC;
-+      }
-+
-+      if (req->probes < 1) {
-+              ip_set_printk("probes too small");
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_ipporthash) 
-+                    + req->probes * sizeof(uint32_t), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_ipporthash)
-+                 + req->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      for (i = 0; i < req->probes; i++)
-+              get_random_bytes(((uint32_t *) map->initval)+i, 4);
-+      map->elements = 0;
-+      map->hashsize = req->hashsize;
-+      map->probes = req->probes;
-+      map->resize = req->resize;
-+      map->first_ip = req->from;
-+      map->last_ip = req->to;
-+      map->members = harray_malloc(map->hashsize, sizeof(ip_set_ip_t), GFP_KERNEL);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", map->hashsize * sizeof(ip_set_ip_t));
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+
-+      harray_free(map->members);
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      harray_flush(map->members, map->hashsize, sizeof(ip_set_ip_t));
-+      map->elements = 0;
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      struct ip_set_req_ipporthash_create *header =
-+          (struct ip_set_req_ipporthash_create *) data;
-+
-+      header->hashsize = map->hashsize;
-+      header->probes = map->probes;
-+      header->resize = map->resize;
-+      header->from = map->first_ip;
-+      header->to = map->last_ip;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+
-+      return (map->hashsize * sizeof(ip_set_ip_t));
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data;
-+      ip_set_ip_t i, *elem;
-+
-+      for (i = 0; i < map->hashsize; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              ((ip_set_ip_t *)data)[i] = *elem;
-+      }
-+}
-+
-+static struct ip_set_type ip_set_ipporthash = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_TYPE_PORT | IPSET_DATA_DOUBLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_ipporthash),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .retry                  = &retry,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_ipporthash_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("ipporthash type of IP sets");
-+module_param(limit, int, 0600);
-+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets");
-+
-+static int __init ip_set_ipporthash_init(void)
-+{
-+      return ip_set_register_set_type(&ip_set_ipporthash);
-+}
-+
-+static void __exit ip_set_ipporthash_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_ipporthash);
-+}
-+
-+module_init(ip_set_ipporthash_init);
-+module_exit(ip_set_ipporthash_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_iptree.c
-@@ -0,0 +1,612 @@
-+/* Copyright (C) 2005 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing an IP set type: the iptree type */
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+
-+/* Backward compatibility */
-+#ifndef __nocast
-+#define __nocast
-+#endif
-+
-+#include <linux/netfilter_ipv4/ip_set_iptree.h>
-+
-+static int limit = MAX_RANGE;
-+
-+/* Garbage collection interval in seconds: */
-+#define IPTREE_GC_TIME                5*60
-+/* Sleep so many milliseconds before trying again 
-+ * to delete the gc timer at destroying/flushing a set */ 
-+#define IPTREE_DESTROY_SLEEP  100
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+static struct kmem_cache *branch_cachep;
-+static struct kmem_cache *leaf_cachep;
-+#else
-+static kmem_cache_t *branch_cachep;
-+static kmem_cache_t *leaf_cachep;
-+#endif
-+
-+#if defined(__LITTLE_ENDIAN)
-+#define ABCD(a,b,c,d,addrp) do {              \
-+      a = ((unsigned char *)addrp)[3];        \
-+      b = ((unsigned char *)addrp)[2];        \
-+      c = ((unsigned char *)addrp)[1];        \
-+      d = ((unsigned char *)addrp)[0];        \
-+} while (0)
-+#elif defined(__BIG_ENDIAN)
-+#define ABCD(a,b,c,d,addrp) do {              \
-+      a = ((unsigned char *)addrp)[0];        \
-+      b = ((unsigned char *)addrp)[1];        \
-+      c = ((unsigned char *)addrp)[2];        \
-+      d = ((unsigned char *)addrp)[3];        \
-+} while (0)
-+#else
-+#error "Please fix asm/byteorder.h"
-+#endif /* __LITTLE_ENDIAN */
-+
-+#define TESTIP_WALK(map, elem, branch) do {   \
-+      if ((map)->tree[elem]) {                \
-+              branch = (map)->tree[elem];     \
-+      } else                                  \
-+              return 0;                       \
-+} while (0)
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned char a,b,c,d;
-+
-+      if (!ip)
-+              return -ERANGE;
-+      
-+      *hash_ip = ip;
-+      ABCD(a, b, c, d, hash_ip);
-+      DP("%u %u %u %u timeout %u", a, b, c, d, map->timeout);
-+      TESTIP_WALK(map, a, btree);
-+      TESTIP_WALK(btree, b, ctree);
-+      TESTIP_WALK(ctree, c, dtree);
-+      DP("%lu %lu", dtree->expires[d], jiffies);
-+      return dtree->expires[d]
-+             && (!map->timeout
-+                 || time_after(dtree->expires[d], jiffies));
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iptree *req = 
-+          (struct ip_set_req_iptree *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptree)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iptree),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __testip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      int res;
-+      
-+      DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u",
-+         flags[index] & IPSET_SRC ? "SRC" : "DST",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+         NIPQUAD(ip_hdr(skb)->saddr),
-+         NIPQUAD(ip_hdr(skb)->daddr));
-+#else
-+         NIPQUAD(skb->nh.iph->saddr),
-+         NIPQUAD(skb->nh.iph->daddr));
-+#endif
-+
-+      res =  __testip(set,
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip);
-+      return (res < 0 ? 0 : res);
-+}
-+
-+#define ADDIP_WALK(map, elem, branch, type, cachep) do {      \
-+      if ((map)->tree[elem]) {                                \
-+              DP("found %u", elem);                           \
-+              branch = (map)->tree[elem];                     \
-+      } else {                                                \
-+              branch = (type *)                               \
-+                      kmem_cache_alloc(cachep, GFP_ATOMIC);   \
-+              if (branch == NULL)                             \
-+                      return -ENOMEM;                         \
-+              memset(branch, 0, sizeof(*branch));             \
-+              (map)->tree[elem] = branch;                     \
-+              DP("alloc %u", elem);                           \
-+      }                                                       \
-+} while (0)   
-+
-+static inline int
-+__addip(struct ip_set *set, ip_set_ip_t ip, unsigned int timeout,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned char a,b,c,d;
-+      int ret = 0;
-+      
-+      if (!ip || map->elements >= limit)
-+              /* We could call the garbage collector
-+               * but it's probably overkill */
-+              return -ERANGE;
-+      
-+      *hash_ip = ip;
-+      ABCD(a, b, c, d, hash_ip);
-+      DP("%u %u %u %u timeout %u", a, b, c, d, timeout);
-+      ADDIP_WALK(map, a, btree, struct ip_set_iptreeb, branch_cachep);
-+      ADDIP_WALK(btree, b, ctree, struct ip_set_iptreec, branch_cachep);
-+      ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreed, leaf_cachep);
-+      if (dtree->expires[d]
-+          && (!map->timeout || time_after(dtree->expires[d], jiffies)))
-+              ret = -EEXIST;
-+      dtree->expires[d] = map->timeout ? (timeout * HZ + jiffies) : 1;
-+      /* Lottery: I won! */
-+      if (dtree->expires[d] == 0)
-+              dtree->expires[d] = 1;
-+      DP("%u %lu", d, dtree->expires[d]);
-+      if (ret == 0)
-+              map->elements++;
-+      return ret;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_req_iptree *req = 
-+              (struct ip_set_req_iptree *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptree)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iptree),
-+                            size);
-+              return -EINVAL;
-+      }
-+      DP("%u.%u.%u.%u %u", HIPQUAD(req->ip), req->timeout);
-+      return __addip(set, req->ip,
-+                     req->timeout ? req->timeout : map->timeout,
-+                     hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+
-+      return __addip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     map->timeout,
-+                     hash_ip);
-+}
-+
-+#define DELIP_WALK(map, elem, branch) do {    \
-+      if ((map)->tree[elem]) {                \
-+              branch = (map)->tree[elem];     \
-+      } else                                  \
-+              return -EEXIST;                 \
-+} while (0)
-+
-+static inline int 
-+__delip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned char a,b,c,d;
-+      
-+      if (!ip)
-+              return -ERANGE;
-+              
-+      *hash_ip = ip;
-+      ABCD(a, b, c, d, hash_ip);
-+      DELIP_WALK(map, a, btree);
-+      DELIP_WALK(btree, b, ctree);
-+      DELIP_WALK(ctree, c, dtree);
-+
-+      if (dtree->expires[d]) {
-+              dtree->expires[d] = 0;
-+              map->elements--;
-+              return 0;
-+      }
-+      return -EEXIST;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iptree *req =
-+          (struct ip_set_req_iptree *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptree)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iptree),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __delip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+#define LOOP_WALK_BEGIN(map, i, branch) \
-+      for (i = 0; i < 256; i++) {     \
-+              if (!(map)->tree[i])    \
-+                      continue;       \
-+              branch = (map)->tree[i]
-+
-+#define LOOP_WALK_END }
-+
-+static void ip_tree_gc(unsigned long ul_set)
-+{
-+      struct ip_set *set = (void *) ul_set;
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned int a,b,c,d;
-+      unsigned char i,j,k;
-+
-+      i = j = k = 0;
-+      DP("gc: %s", set->name);
-+      write_lock_bh(&set->lock);
-+      LOOP_WALK_BEGIN(map, a, btree);
-+      LOOP_WALK_BEGIN(btree, b, ctree);
-+      LOOP_WALK_BEGIN(ctree, c, dtree);
-+      for (d = 0; d < 256; d++) {
-+              if (dtree->expires[d]) {
-+                      DP("gc: %u %u %u %u: expires %lu jiffies %lu",
-+                          a, b, c, d,
-+                          dtree->expires[d], jiffies);
-+                      if (map->timeout
-+                          && time_before(dtree->expires[d], jiffies)) {
-+                              dtree->expires[d] = 0;
-+                              map->elements--;
-+                      } else
-+                              k = 1;
-+              }
-+      }
-+      if (k == 0) {
-+              DP("gc: %s: leaf %u %u %u empty",
-+                  set->name, a, b, c);
-+              kmem_cache_free(leaf_cachep, dtree);
-+              ctree->tree[c] = NULL;
-+      } else {
-+              DP("gc: %s: leaf %u %u %u not empty",
-+                  set->name, a, b, c);
-+              j = 1;
-+              k = 0;
-+      }
-+      LOOP_WALK_END;
-+      if (j == 0) {
-+              DP("gc: %s: branch %u %u empty",
-+                  set->name, a, b);
-+              kmem_cache_free(branch_cachep, ctree);
-+              btree->tree[b] = NULL;
-+      } else {
-+              DP("gc: %s: branch %u %u not empty",
-+                  set->name, a, b);
-+              i = 1;
-+              j = k = 0;
-+      }
-+      LOOP_WALK_END;
-+      if (i == 0) {
-+              DP("gc: %s: branch %u empty",
-+                  set->name, a);
-+              kmem_cache_free(branch_cachep, btree);
-+              map->tree[a] = NULL;
-+      } else {
-+              DP("gc: %s: branch %u not empty",
-+                  set->name, a);
-+              i = j = k = 0;
-+      }
-+      LOOP_WALK_END;
-+      write_unlock_bh(&set->lock);
-+      
-+      map->gc.expires = jiffies + map->gc_interval * HZ;
-+      add_timer(&map->gc);
-+}
-+
-+static inline void init_gc_timer(struct ip_set *set)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+
-+      /* Even if there is no timeout for the entries,
-+       * we still have to call gc because delete
-+       * do not clean up empty branches */
-+      map->gc_interval = IPTREE_GC_TIME;
-+      init_timer(&map->gc);
-+      map->gc.data = (unsigned long) set;
-+      map->gc.function = ip_tree_gc;
-+      map->gc.expires = jiffies + map->gc_interval * HZ;
-+      add_timer(&map->gc);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      struct ip_set_req_iptree_create *req =
-+          (struct ip_set_req_iptree_create *) data;
-+      struct ip_set_iptree *map;
-+
-+      if (size != sizeof(struct ip_set_req_iptree_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_iptree_create),
-+                            size);
-+              return -EINVAL;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_iptree), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_iptree));
-+              return -ENOMEM;
-+      }
-+      memset(map, 0, sizeof(*map));
-+      map->timeout = req->timeout;
-+      map->elements = 0;
-+      set->data = map;
-+
-+      init_gc_timer(set);
-+
-+      return 0;
-+}
-+
-+static void __flush(struct ip_set_iptree *map)
-+{
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned int a,b,c;
-+
-+      LOOP_WALK_BEGIN(map, a, btree);
-+      LOOP_WALK_BEGIN(btree, b, ctree);
-+      LOOP_WALK_BEGIN(ctree, c, dtree);
-+      kmem_cache_free(leaf_cachep, dtree);
-+      LOOP_WALK_END;
-+      kmem_cache_free(branch_cachep, ctree);
-+      LOOP_WALK_END;
-+      kmem_cache_free(branch_cachep, btree);
-+      LOOP_WALK_END;
-+      map->elements = 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+
-+      /* gc might be running */
-+      while (!del_timer(&map->gc))
-+              msleep(IPTREE_DESTROY_SLEEP);
-+      __flush(map);
-+      kfree(map);
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      unsigned int timeout = map->timeout;
-+      
-+      /* gc might be running */
-+      while (!del_timer(&map->gc))
-+              msleep(IPTREE_DESTROY_SLEEP);
-+      __flush(map);
-+      memset(map, 0, sizeof(*map));
-+      map->timeout = timeout;
-+
-+      init_gc_timer(set);
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_req_iptree_create *header =
-+          (struct ip_set_req_iptree_create *) data;
-+
-+      header->timeout = map->timeout;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned int a,b,c,d;
-+      unsigned int count = 0;
-+
-+      LOOP_WALK_BEGIN(map, a, btree);
-+      LOOP_WALK_BEGIN(btree, b, ctree);
-+      LOOP_WALK_BEGIN(ctree, c, dtree);
-+      for (d = 0; d < 256; d++) {
-+              if (dtree->expires[d]
-+                  && (!map->timeout || time_after(dtree->expires[d], jiffies)))
-+                      count++;
-+      }
-+      LOOP_WALK_END;
-+      LOOP_WALK_END;
-+      LOOP_WALK_END;
-+
-+      DP("members %u", count);
-+      return (count * sizeof(struct ip_set_req_iptree));
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iptree *map = (struct ip_set_iptree *) set->data;
-+      struct ip_set_iptreeb *btree;
-+      struct ip_set_iptreec *ctree;
-+      struct ip_set_iptreed *dtree;
-+      unsigned int a,b,c,d;
-+      size_t offset = 0;
-+      struct ip_set_req_iptree *entry;
-+
-+      LOOP_WALK_BEGIN(map, a, btree);
-+      LOOP_WALK_BEGIN(btree, b, ctree);
-+      LOOP_WALK_BEGIN(ctree, c, dtree);
-+      for (d = 0; d < 256; d++) {
-+              if (dtree->expires[d]
-+                  && (!map->timeout || time_after(dtree->expires[d], jiffies))) {
-+                      entry = (struct ip_set_req_iptree *)(data + offset);
-+                      entry->ip = ((a << 24) | (b << 16) | (c << 8) | d);
-+                      entry->timeout = !map->timeout ? 0 
-+                              : (dtree->expires[d] - jiffies)/HZ;
-+                      offset += sizeof(struct ip_set_req_iptree);
-+              }
-+      }
-+      LOOP_WALK_END;
-+      LOOP_WALK_END;
-+      LOOP_WALK_END;
-+}
-+
-+static struct ip_set_type ip_set_iptree = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_iptree),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_iptree_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("iptree type of IP sets");
-+module_param(limit, int, 0600);
-+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets");
-+
-+static int __init ip_set_iptree_init(void)
-+{
-+      int ret;
-+      
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      branch_cachep = kmem_cache_create("ip_set_iptreeb",
-+                              sizeof(struct ip_set_iptreeb),
-+                              0, 0, NULL);
-+#else
-+      branch_cachep = kmem_cache_create("ip_set_iptreeb",
-+                              sizeof(struct ip_set_iptreeb),
-+                              0, 0, NULL, NULL);
-+#endif
-+      if (!branch_cachep) {
-+              printk(KERN_ERR "Unable to create ip_set_iptreeb slab cache\n");
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      leaf_cachep = kmem_cache_create("ip_set_iptreed",
-+                              sizeof(struct ip_set_iptreed),
-+                              0, 0, NULL);
-+#else
-+      leaf_cachep = kmem_cache_create("ip_set_iptreed",
-+                              sizeof(struct ip_set_iptreed),
-+                              0, 0, NULL, NULL);
-+#endif
-+      if (!leaf_cachep) {
-+              printk(KERN_ERR "Unable to create ip_set_iptreed slab cache\n");
-+              ret = -ENOMEM;
-+              goto free_branch;
-+      }
-+      ret = ip_set_register_set_type(&ip_set_iptree);
-+      if (ret == 0)
-+              goto out;
-+
-+      kmem_cache_destroy(leaf_cachep);
-+    free_branch:      
-+      kmem_cache_destroy(branch_cachep);
-+    out:
-+      return ret;
-+}
-+
-+static void __exit ip_set_iptree_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_iptree);
-+      kmem_cache_destroy(leaf_cachep);
-+      kmem_cache_destroy(branch_cachep);
-+}
-+
-+module_init(ip_set_iptree_init);
-+module_exit(ip_set_iptree_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_iptreemap.c
-@@ -0,0 +1,829 @@
-+/* Copyright (C) 2007 Sven Wegener <sven.wegener@stealer.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 by
-+ * the Free Software Foundation.
-+ */
-+
-+/* This modules implements the iptreemap ipset type. It uses bitmaps to
-+ * represent every single IPv4 address as a single bit. The bitmaps are managed
-+ * in a tree structure, where the first three octets of an addresses are used
-+ * as an index to find the bitmap and the last octet is used as the bit number.
-+ */
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_iptreemap.h>
-+
-+#define IPTREEMAP_DEFAULT_GC_TIME (5 * 60)
-+#define IPTREEMAP_DESTROY_SLEEP (100)
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+static struct kmem_cache *cachep_b;
-+static struct kmem_cache *cachep_c;
-+static struct kmem_cache *cachep_d;
-+#else
-+static kmem_cache_t *cachep_b;
-+static kmem_cache_t *cachep_c;
-+static kmem_cache_t *cachep_d;
-+#endif
-+
-+static struct ip_set_iptreemap_d *fullbitmap_d;
-+static struct ip_set_iptreemap_c *fullbitmap_c;
-+static struct ip_set_iptreemap_b *fullbitmap_b;
-+
-+#if defined(__LITTLE_ENDIAN)
-+#define ABCD(a, b, c, d, addr) \
-+      do { \
-+              a = ((unsigned char *)addr)[3]; \
-+              b = ((unsigned char *)addr)[2]; \
-+              c = ((unsigned char *)addr)[1]; \
-+              d = ((unsigned char *)addr)[0]; \
-+      } while (0)
-+#elif defined(__BIG_ENDIAN)
-+#define ABCD(a,b,c,d,addrp) do {              \
-+      a = ((unsigned char *)addrp)[0];        \
-+      b = ((unsigned char *)addrp)[1];        \
-+      c = ((unsigned char *)addrp)[2];        \
-+      d = ((unsigned char *)addrp)[3];        \
-+} while (0)
-+#else
-+#error "Please fix asm/byteorder.h"
-+#endif /* __LITTLE_ENDIAN */
-+
-+#define TESTIP_WALK(map, elem, branch, full) \
-+      do { \
-+              branch = (map)->tree[elem]; \
-+              if (!branch) \
-+                      return 0; \
-+              else if (branch == full) \
-+                      return 1; \
-+      } while (0)
-+
-+#define ADDIP_WALK(map, elem, branch, type, cachep, full) \
-+      do { \
-+              branch = (map)->tree[elem]; \
-+              if (!branch) { \
-+                      branch = (type *) kmem_cache_alloc(cachep, GFP_ATOMIC); \
-+                      if (!branch) \
-+                              return -ENOMEM; \
-+                      memset(branch, 0, sizeof(*branch)); \
-+                      (map)->tree[elem] = branch; \
-+              } else if (branch == full) { \
-+                      return -EEXIST; \
-+              } \
-+      } while (0)
-+
-+#define ADDIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free) \
-+      for (a = a1; a <= a2; a++) { \
-+              branch = (map)->tree[a]; \
-+              if (branch != full) { \
-+                      if ((a > a1 && a < a2) || (hint)) { \
-+                              if (branch) \
-+                                      free(branch); \
-+                              (map)->tree[a] = full; \
-+                              continue; \
-+                      } else if (!branch) { \
-+                              branch = kmem_cache_alloc(cachep, GFP_ATOMIC); \
-+                              if (!branch) \
-+                                      return -ENOMEM; \
-+                              memset(branch, 0, sizeof(*branch)); \
-+                              (map)->tree[a] = branch; \
-+                      }
-+
-+#define ADDIP_RANGE_LOOP_END() \
-+              } \
-+      }
-+
-+#define DELIP_WALK(map, elem, branch, cachep, full, flags) \
-+      do { \
-+              branch = (map)->tree[elem]; \
-+              if (!branch) { \
-+                      return -EEXIST; \
-+              } else if (branch == full) { \
-+                      branch = kmem_cache_alloc(cachep, flags); \
-+                      if (!branch) \
-+                              return -ENOMEM; \
-+                      memcpy(branch, full, sizeof(*full)); \
-+                      (map)->tree[elem] = branch; \
-+              } \
-+      } while (0)
-+
-+#define DELIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free, flags) \
-+      for (a = a1; a <= a2; a++) { \
-+              branch = (map)->tree[a]; \
-+              if (branch) { \
-+                      if ((a > a1 && a < a2) || (hint)) { \
-+                              if (branch != full) \
-+                                      free(branch); \
-+                              (map)->tree[a] = NULL; \
-+                              continue; \
-+                      } else if (branch == full) { \
-+                              branch = kmem_cache_alloc(cachep, flags); \
-+                              if (!branch) \
-+                                      return -ENOMEM; \
-+                              memcpy(branch, full, sizeof(*branch)); \
-+                              (map)->tree[a] = branch; \
-+                      }
-+
-+#define DELIP_RANGE_LOOP_END() \
-+              } \
-+      }
-+
-+#define LOOP_WALK_BEGIN(map, i, branch) \
-+      for (i = 0; i < 256; i++) { \
-+              branch = (map)->tree[i]; \
-+              if (likely(!branch)) \
-+                      continue;
-+
-+#define LOOP_WALK_END() \
-+      }
-+
-+#define LOOP_WALK_BEGIN_GC(map, i, branch, full, cachep, count) \
-+      count = -256; \
-+      for (i = 0; i < 256; i++) { \
-+              branch = (map)->tree[i]; \
-+              if (likely(!branch)) \
-+                      continue; \
-+              count++; \
-+              if (branch == full) { \
-+                      count++; \
-+                      continue; \
-+              }
-+
-+#define LOOP_WALK_END_GC(map, i, branch, full, cachep, count) \
-+              if (-256 == count) { \
-+                      kmem_cache_free(cachep, branch); \
-+                      (map)->tree[i] = NULL; \
-+              } else if (256 == count) { \
-+                      kmem_cache_free(cachep, branch); \
-+                      (map)->tree[i] = full; \
-+              } \
-+      }
-+
-+#define LOOP_WALK_BEGIN_COUNT(map, i, branch, inrange, count) \
-+      for (i = 0; i < 256; i++) { \
-+              if (!(map)->tree[i]) { \
-+                      if (inrange) { \
-+                              count++; \
-+                              inrange = 0; \
-+                      } \
-+                      continue; \
-+              } \
-+              branch = (map)->tree[i];
-+
-+#define LOOP_WALK_END_COUNT() \
-+      }
-+
-+#define MIN(a, b) (a < b ? a : b)
-+#define MAX(a, b) (a > b ? a : b)
-+
-+#define GETVALUE1(a, a1, b1, r) \
-+      (a == a1 ? b1 : r)
-+
-+#define GETVALUE2(a, b, a1, b1, c1, r) \
-+      (a == a1 && b == b1 ? c1 : r)
-+
-+#define GETVALUE3(a, b, c, a1, b1, c1, d1, r) \
-+      (a == a1 && b == b1 && c == c1 ? d1 : r)
-+
-+#define CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2) \
-+      ( \
-+              GETVALUE1(a, a1, b1, 0) == 0 \
-+              && GETVALUE1(a, a2, b2, 255) == 255 \
-+              && c1 == 0 \
-+              && c2 == 255 \
-+              && d1 == 0 \
-+              && d2 == 255 \
-+      )
-+
-+#define CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2) \
-+      ( \
-+              GETVALUE2(a, b, a1, b1, c1, 0) == 0 \
-+              && GETVALUE2(a, b, a2, b2, c2, 255) == 255 \
-+              && d1 == 0 \
-+              && d2 == 255 \
-+      )
-+
-+#define CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2) \
-+      ( \
-+              GETVALUE3(a, b, c, a1, b1, c1, d1, 0) == 0 \
-+              && GETVALUE3(a, b, c, a2, b2, c2, d2, 255) == 255 \
-+      )
-+
-+
-+static inline void
-+free_d(struct ip_set_iptreemap_d *map)
-+{
-+      kmem_cache_free(cachep_d, map);
-+}
-+
-+static inline void
-+free_c(struct ip_set_iptreemap_c *map)
-+{
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int i;
-+
-+      LOOP_WALK_BEGIN(map, i, dtree) {
-+              if (dtree != fullbitmap_d)
-+                      free_d(dtree);
-+      } LOOP_WALK_END();
-+
-+      kmem_cache_free(cachep_c, map);
-+}
-+
-+static inline void
-+free_b(struct ip_set_iptreemap_b *map)
-+{
-+      struct ip_set_iptreemap_c *ctree;
-+      unsigned int i;
-+
-+      LOOP_WALK_BEGIN(map, i, ctree) {
-+              if (ctree != fullbitmap_c)
-+                      free_c(ctree);
-+      } LOOP_WALK_END();
-+
-+      kmem_cache_free(cachep_b, map);
-+}
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned char a, b, c, d;
-+
-+      *hash_ip = ip;
-+
-+      ABCD(a, b, c, d, hash_ip);
-+
-+      TESTIP_WALK(map, a, btree, fullbitmap_b);
-+      TESTIP_WALK(btree, b, ctree, fullbitmap_c);
-+      TESTIP_WALK(ctree, c, dtree, fullbitmap_d);
-+
-+      return !!test_bit(d, (void *) dtree->bitmap);
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptreemap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size);
-+              return -EINVAL;
-+      }
-+
-+      return __testip(set, req->start, hash_ip);
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index)
-+{
-+      int res;
-+
-+      res = __testip(set, 
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+
-+      return (res < 0 ? 0 : res);
-+}
-+
-+static inline int
-+__addip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned char a, b, c, d;
-+
-+      *hash_ip = ip;
-+
-+      ABCD(a, b, c, d, hash_ip);
-+
-+      ADDIP_WALK(map, a, btree, struct ip_set_iptreemap_b, cachep_b, fullbitmap_b);
-+      ADDIP_WALK(btree, b, ctree, struct ip_set_iptreemap_c, cachep_c, fullbitmap_c);
-+      ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreemap_d, cachep_d, fullbitmap_d);
-+
-+      if (test_and_set_bit(d, (void *) dtree->bitmap))
-+              return -EEXIST;
-+
-+      set_bit(b, (void *) btree->dirty);
-+
-+      return 0;
-+}
-+
-+static inline int
-+__addip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int a, b, c, d;
-+      unsigned char a1, b1, c1, d1;
-+      unsigned char a2, b2, c2, d2;
-+
-+      if (start == end)
-+              return __addip_single(set, start, hash_ip);
-+
-+      *hash_ip = start;
-+
-+      ABCD(a1, b1, c1, d1, &start);
-+      ABCD(a2, b2, c2, d2, &end);
-+
-+      /* This is sooo ugly... */
-+      ADDIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b) {
-+              ADDIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c) {
-+                      ADDIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d) {
-+                              for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++)
-+                                      set_bit(d, (void *) dtree->bitmap);
-+                              set_bit(b, (void *) btree->dirty);
-+                      } ADDIP_RANGE_LOOP_END();
-+              } ADDIP_RANGE_LOOP_END();
-+      } ADDIP_RANGE_LOOP_END();
-+
-+      return 0;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptreemap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size);
-+              return -EINVAL;
-+      }
-+
-+      return __addip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index)
-+{
-+
-+      return __addip_single(set,
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip);
-+}
-+
-+static inline int
-+__delip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip, unsigned int __nocast flags)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned char a,b,c,d;
-+
-+      *hash_ip = ip;
-+
-+      ABCD(a, b, c, d, hash_ip);
-+
-+      DELIP_WALK(map, a, btree, cachep_b, fullbitmap_b, flags);
-+      DELIP_WALK(btree, b, ctree, cachep_c, fullbitmap_c, flags);
-+      DELIP_WALK(ctree, c, dtree, cachep_d, fullbitmap_d, flags);
-+
-+      if (!test_and_clear_bit(d, (void *) dtree->bitmap))
-+              return -EEXIST;
-+
-+      set_bit(b, (void *) btree->dirty);
-+
-+      return 0;
-+}
-+
-+static inline int
-+__delip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip, unsigned int __nocast flags)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int a, b, c, d;
-+      unsigned char a1, b1, c1, d1;
-+      unsigned char a2, b2, c2, d2;
-+
-+      if (start == end)
-+              return __delip_single(set, start, hash_ip, flags);
-+
-+      *hash_ip = start;
-+
-+      ABCD(a1, b1, c1, d1, &start);
-+      ABCD(a2, b2, c2, d2, &end);
-+
-+      /* This is sooo ugly... */
-+      DELIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b, flags) {
-+              DELIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c, flags) {
-+                      DELIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d, flags) {
-+                              for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++)
-+                                      clear_bit(d, (void *) dtree->bitmap);
-+                              set_bit(b, (void *) btree->dirty);
-+                      } DELIP_RANGE_LOOP_END();
-+              } DELIP_RANGE_LOOP_END();
-+      } DELIP_RANGE_LOOP_END();
-+
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_iptreemap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size);
-+              return -EINVAL;
-+      }
-+
-+      return __delip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip, GFP_KERNEL);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index)
-+{
-+      return __delip_single(set, 
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip,
-+                      GFP_ATOMIC);
-+}
-+
-+/* Check the status of the bitmap
-+ * -1 == all bits cleared
-+ *  1 == all bits set
-+ *  0 == anything else
-+ */
-+static inline int
-+bitmap_status(struct ip_set_iptreemap_d *dtree)
-+{
-+      unsigned char first = dtree->bitmap[0];
-+      int a;
-+
-+      for (a = 1; a < 32; a++)
-+              if (dtree->bitmap[a] != first)
-+                      return 0;
-+
-+      return (first == 0 ? -1 : (first == 255 ? 1 : 0));
-+}
-+
-+static void
-+gc(unsigned long addr)
-+{
-+      struct ip_set *set = (struct ip_set *) addr;
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int a, b, c;
-+      int i, j, k;
-+
-+      write_lock_bh(&set->lock);
-+
-+      LOOP_WALK_BEGIN_GC(map, a, btree, fullbitmap_b, cachep_b, i) {
-+              LOOP_WALK_BEGIN_GC(btree, b, ctree, fullbitmap_c, cachep_c, j) {
-+                      if (!test_and_clear_bit(b, (void *) btree->dirty))
-+                              continue;
-+                      LOOP_WALK_BEGIN_GC(ctree, c, dtree, fullbitmap_d, cachep_d, k) {
-+                              switch (bitmap_status(dtree)) {
-+                                      case -1:
-+                                              kmem_cache_free(cachep_d, dtree);
-+                                              ctree->tree[c] = NULL;
-+                                              k--;
-+                                      break;
-+                                      case 1:
-+                                              kmem_cache_free(cachep_d, dtree);
-+                                              ctree->tree[c] = fullbitmap_d;
-+                                              k++;
-+                                      break;
-+                              }
-+                      } LOOP_WALK_END();
-+              } LOOP_WALK_END_GC(btree, b, ctree, fullbitmap_c, cachep_c, k);
-+      } LOOP_WALK_END_GC(map, a, btree, fullbitmap_b, cachep_b, j);
-+
-+      write_unlock_bh(&set->lock);
-+
-+      map->gc.expires = jiffies + map->gc_interval * HZ;
-+      add_timer(&map->gc);
-+}
-+
-+static inline void
-+init_gc_timer(struct ip_set *set)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+
-+      init_timer(&map->gc);
-+      map->gc.data = (unsigned long) set;
-+      map->gc.function = gc;
-+      map->gc.expires = jiffies + map->gc_interval * HZ;
-+      add_timer(&map->gc);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      struct ip_set_req_iptreemap_create *req = (struct ip_set_req_iptreemap_create *) data;
-+      struct ip_set_iptreemap *map;
-+
-+      if (size != sizeof(struct ip_set_req_iptreemap_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap_create), size);
-+              return -EINVAL;
-+      }
-+
-+      map = kzalloc(sizeof(*map), GFP_KERNEL);
-+      if (!map)
-+              return -ENOMEM;
-+
-+      map->gc_interval = req->gc_interval ? req->gc_interval : IPTREEMAP_DEFAULT_GC_TIME;
-+      set->data = map;
-+
-+      init_gc_timer(set);
-+
-+      return 0;
-+}
-+
-+static inline void __flush(struct ip_set_iptreemap *map)
-+{
-+      struct ip_set_iptreemap_b *btree;
-+      unsigned int a;
-+
-+      LOOP_WALK_BEGIN(map, a, btree);
-+              if (btree != fullbitmap_b)
-+                      free_b(btree);
-+      LOOP_WALK_END();
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+
-+      while (!del_timer(&map->gc))
-+              msleep(IPTREEMAP_DESTROY_SLEEP);
-+
-+      __flush(map);
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+
-+      while (!del_timer(&map->gc))
-+              msleep(IPTREEMAP_DESTROY_SLEEP);
-+
-+      __flush(map);
-+
-+      memset(map, 0, sizeof(*map));
-+
-+      init_gc_timer(set);
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_req_iptreemap_create *header = (struct ip_set_req_iptreemap_create *) data;
-+
-+      header->gc_interval = map->gc_interval;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int a, b, c, d, inrange = 0, count = 0;
-+
-+      LOOP_WALK_BEGIN_COUNT(map, a, btree, inrange, count) {
-+              LOOP_WALK_BEGIN_COUNT(btree, b, ctree, inrange, count) {
-+                      LOOP_WALK_BEGIN_COUNT(ctree, c, dtree, inrange, count) {
-+                              for (d = 0; d < 256; d++) {
-+                                      if (test_bit(d, (void *) dtree->bitmap)) {
-+                                              inrange = 1;
-+                                      } else if (inrange) {
-+                                              count++;
-+                                              inrange = 0;
-+                                      }
-+                              }
-+                      } LOOP_WALK_END_COUNT();
-+              } LOOP_WALK_END_COUNT();
-+      } LOOP_WALK_END_COUNT();
-+
-+      if (inrange)
-+              count++;
-+
-+      return (count * sizeof(struct ip_set_req_iptreemap));
-+}
-+
-+static inline size_t add_member(void *data, size_t offset, ip_set_ip_t start, ip_set_ip_t end)
-+{
-+      struct ip_set_req_iptreemap *entry = (struct ip_set_req_iptreemap *) (data + offset);
-+
-+      entry->start = start;
-+      entry->end = end;
-+
-+      return sizeof(*entry);
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data;
-+      struct ip_set_iptreemap_b *btree;
-+      struct ip_set_iptreemap_c *ctree;
-+      struct ip_set_iptreemap_d *dtree;
-+      unsigned int a, b, c, d, inrange = 0;
-+      size_t offset = 0;
-+      ip_set_ip_t start = 0, end = 0, ip;
-+
-+      LOOP_WALK_BEGIN(map, a, btree) {
-+              LOOP_WALK_BEGIN(btree, b, ctree) {
-+                      LOOP_WALK_BEGIN(ctree, c, dtree) {
-+                              for (d = 0; d < 256; d++) {
-+                                      if (test_bit(d, (void *) dtree->bitmap)) {
-+                                              ip = ((a << 24) | (b << 16) | (c << 8) | d);
-+                                              if (!inrange) {
-+                                                      inrange = 1;
-+                                                      start = ip;
-+                                              } else if (end < ip - 1) {
-+                                                      offset += add_member(data, offset, start, end);
-+                                                      start = ip;
-+                                              }
-+                                              end = ip;
-+                                      } else if (inrange) {
-+                                              offset += add_member(data, offset, start, end);
-+                                              inrange = 0;
-+                                      }
-+                              }
-+                      } LOOP_WALK_END();
-+              } LOOP_WALK_END();
-+      } LOOP_WALK_END();
-+
-+      if (inrange)
-+              add_member(data, offset, start, end);
-+}
-+
-+static struct ip_set_type ip_set_iptreemap = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = create,
-+      .destroy                = destroy,
-+      .flush                  = flush,
-+      .reqsize                = sizeof(struct ip_set_req_iptreemap),
-+      .addip                  = addip,
-+      .addip_kernel           = addip_kernel,
-+      .delip                  = delip,
-+      .delip_kernel           = delip_kernel,
-+      .testip                 = testip,
-+      .testip_kernel          = testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_iptreemap_create),
-+      .list_header            = list_header,
-+      .list_members_size      = list_members_size,
-+      .list_members           = list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Sven Wegener <sven.wegener@stealer.net>");
-+MODULE_DESCRIPTION("iptreemap type of IP sets");
-+
-+static int __init ip_set_iptreemap_init(void)
-+{
-+      int ret = -ENOMEM;
-+      int a;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      cachep_b = kmem_cache_create("ip_set_iptreemap_b", 
-+                                   sizeof(struct ip_set_iptreemap_b), 
-+                                   0, 0, NULL);
-+#else
-+      cachep_b = kmem_cache_create("ip_set_iptreemap_b", 
-+                                   sizeof(struct ip_set_iptreemap_b), 
-+                                   0, 0, NULL, NULL);
-+#endif
-+      if (!cachep_b) {
-+              ip_set_printk("Unable to create ip_set_iptreemap_b slab cache");
-+              goto out;
-+      }
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      cachep_c = kmem_cache_create("ip_set_iptreemap_c", 
-+                                   sizeof(struct ip_set_iptreemap_c),
-+                                   0, 0, NULL);
-+#else
-+      cachep_c = kmem_cache_create("ip_set_iptreemap_c", 
-+                                   sizeof(struct ip_set_iptreemap_c),
-+                                   0, 0, NULL, NULL);
-+#endif
-+      if (!cachep_c) {
-+              ip_set_printk("Unable to create ip_set_iptreemap_c slab cache");
-+              goto outb;
-+      }
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      cachep_d = kmem_cache_create("ip_set_iptreemap_d",
-+                                   sizeof(struct ip_set_iptreemap_d),
-+                                   0, 0, NULL);
-+#else
-+      cachep_d = kmem_cache_create("ip_set_iptreemap_d",
-+                                   sizeof(struct ip_set_iptreemap_d),
-+                                   0, 0, NULL, NULL);
-+#endif
-+      if (!cachep_d) {
-+              ip_set_printk("Unable to create ip_set_iptreemap_d slab cache");
-+              goto outc;
-+      }
-+
-+      fullbitmap_d = kmem_cache_alloc(cachep_d, GFP_KERNEL);
-+      if (!fullbitmap_d)
-+              goto outd;
-+
-+      fullbitmap_c = kmem_cache_alloc(cachep_c, GFP_KERNEL);
-+      if (!fullbitmap_c)
-+              goto outbitmapd;
-+
-+      fullbitmap_b = kmem_cache_alloc(cachep_b, GFP_KERNEL);
-+      if (!fullbitmap_b)
-+              goto outbitmapc;
-+
-+      ret = ip_set_register_set_type(&ip_set_iptreemap);
-+      if (0 > ret)
-+              goto outbitmapb;
-+
-+      /* Now init our global bitmaps */
-+      memset(fullbitmap_d->bitmap, 0xff, sizeof(fullbitmap_d->bitmap));
-+
-+      for (a = 0; a < 256; a++)
-+              fullbitmap_c->tree[a] = fullbitmap_d;
-+
-+      for (a = 0; a < 256; a++)
-+              fullbitmap_b->tree[a] = fullbitmap_c;
-+      memset(fullbitmap_b->dirty, 0, sizeof(fullbitmap_b->dirty));
-+
-+      return 0;
-+
-+outbitmapb:
-+      kmem_cache_free(cachep_b, fullbitmap_b);
-+outbitmapc:
-+      kmem_cache_free(cachep_c, fullbitmap_c);
-+outbitmapd:
-+      kmem_cache_free(cachep_d, fullbitmap_d);
-+outd:
-+      kmem_cache_destroy(cachep_d);
-+outc:
-+      kmem_cache_destroy(cachep_c);
-+outb:
-+      kmem_cache_destroy(cachep_b);
-+out:
-+
-+      return ret;
-+}
-+
-+static void __exit ip_set_iptreemap_fini(void)
-+{
-+      ip_set_unregister_set_type(&ip_set_iptreemap);
-+      kmem_cache_free(cachep_d, fullbitmap_d);
-+      kmem_cache_free(cachep_c, fullbitmap_c);
-+      kmem_cache_free(cachep_b, fullbitmap_b);
-+      kmem_cache_destroy(cachep_d);
-+      kmem_cache_destroy(cachep_c);
-+      kmem_cache_destroy(cachep_b);
-+}
-+
-+module_init(ip_set_iptreemap_init);
-+module_exit(ip_set_iptreemap_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_macipmap.c
-@@ -0,0 +1,375 @@
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ *                         Martin Josefsson <gandalf@wlug.westbo.se>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing an IP set type: the macipmap type */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+#include <linux/if_ether.h>
-+#include <linux/vmalloc.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_malloc.h>
-+#include <linux/netfilter_ipv4/ip_set_macipmap.h>
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_macipmap *map = (struct ip_set_macipmap *) set->data;
-+      struct ip_set_macip *table = (struct ip_set_macip *) map->members;      
-+      struct ip_set_req_macipmap *req = (struct ip_set_req_macipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_macipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_macipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+
-+      if (req->ip < map->first_ip || req->ip > map->last_ip)
-+              return -ERANGE;
-+
-+      *hash_ip = req->ip;
-+      DP("set: %s, ip:%u.%u.%u.%u, %u.%u.%u.%u",
-+         set->name, HIPQUAD(req->ip), HIPQUAD(*hash_ip));             
-+      if (test_bit(IPSET_MACIP_ISSET,
-+                   (void *) &table[req->ip - map->first_ip].flags)) {
-+              return (memcmp(req->ethernet,
-+                             &table[req->ip - map->first_ip].ethernet,
-+                             ETH_ALEN) == 0);
-+      } else {
-+              return (map->flags & IPSET_MACIP_MATCHUNSET ? 1 : 0);
-+      }
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+      struct ip_set_macip *table =
-+          (struct ip_set_macip *) map->members;
-+      ip_set_ip_t ip;
-+      
-+      ip = ntohl(flags[index] & IPSET_SRC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                      ? ip_hdr(skb)->saddr 
-+                      : ip_hdr(skb)->daddr);
-+#else
-+                      ? skb->nh.iph->saddr
-+                      : skb->nh.iph->daddr);
-+#endif
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return 0;
-+
-+      *hash_ip = ip;  
-+      DP("set: %s, ip:%u.%u.%u.%u, %u.%u.%u.%u",
-+         set->name, HIPQUAD(ip), HIPQUAD(*hash_ip));          
-+      if (test_bit(IPSET_MACIP_ISSET,
-+          (void *) &table[ip - map->first_ip].flags)) {
-+              /* Is mac pointer valid?
-+               * If so, compare... */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+              return (skb_mac_header(skb) >= skb->head
-+                      && (skb_mac_header(skb) + ETH_HLEN) <= skb->data
-+#else
-+              return (skb->mac.raw >= skb->head
-+                      && (skb->mac.raw + ETH_HLEN) <= skb->data
-+#endif
-+                      && (memcmp(eth_hdr(skb)->h_source,
-+                                 &table[ip - map->first_ip].ethernet,
-+                                 ETH_ALEN) == 0));
-+      } else {
-+              return (map->flags & IPSET_MACIP_MATCHUNSET ? 1 : 0);
-+      }
-+}
-+
-+/* returns 0 on success */
-+static inline int
-+__addip(struct ip_set *set, 
-+      ip_set_ip_t ip, unsigned char *ethernet, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+      struct ip_set_macip *table =
-+          (struct ip_set_macip *) map->members;
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+      if (test_and_set_bit(IPSET_MACIP_ISSET, 
-+                           (void *) &table[ip - map->first_ip].flags))
-+              return -EEXIST;
-+
-+      *hash_ip = ip;
-+      DP("%u.%u.%u.%u, %u.%u.%u.%u", HIPQUAD(ip), HIPQUAD(*hash_ip));
-+      memcpy(&table[ip - map->first_ip].ethernet, ethernet, ETH_ALEN);
-+      return 0;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+      ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_macipmap *req =
-+          (struct ip_set_req_macipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_macipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_macipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __addip(set, req->ip, req->ethernet, hash_ip);
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      ip_set_ip_t ip;
-+      
-+      ip = ntohl(flags[index] & IPSET_SRC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                      ? ip_hdr(skb)->saddr 
-+                      : ip_hdr(skb)->daddr);
-+#else
-+                      ? skb->nh.iph->saddr
-+                      : skb->nh.iph->daddr);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+      if (!(skb_mac_header(skb) >= skb->head
-+            && (skb_mac_header(skb) + ETH_HLEN) <= skb->data))
-+#else
-+      if (!(skb->mac.raw >= skb->head
-+            && (skb->mac.raw + ETH_HLEN) <= skb->data))
-+#endif
-+              return -EINVAL;
-+
-+      return __addip(set, ip, eth_hdr(skb)->h_source, hash_ip);
-+}
-+
-+static inline int
-+__delip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+      struct ip_set_macip *table =
-+          (struct ip_set_macip *) map->members;
-+
-+      if (ip < map->first_ip || ip > map->last_ip)
-+              return -ERANGE;
-+      if (!test_and_clear_bit(IPSET_MACIP_ISSET, 
-+                              (void *)&table[ip - map->first_ip].flags))
-+              return -EEXIST;
-+
-+      *hash_ip = ip;
-+      DP("%u.%u.%u.%u, %u.%u.%u.%u", HIPQUAD(ip), HIPQUAD(*hash_ip));
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+     ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_macipmap *req =
-+          (struct ip_set_req_macipmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_macipmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_macipmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delip(set, req->ip, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set,
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      return __delip(set,
-+                     ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                     hash_ip);
-+}
-+
-+static inline size_t members_size(ip_set_id_t from, ip_set_id_t to)
-+{
-+      return (size_t)((to - from + 1) * sizeof(struct ip_set_macip));
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      int newbytes;
-+      struct ip_set_req_macipmap_create *req =
-+          (struct ip_set_req_macipmap_create *) data;
-+      struct ip_set_macipmap *map;
-+
-+      if (size != sizeof(struct ip_set_req_macipmap_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_macipmap_create),
-+                            size);
-+              return -EINVAL;
-+      }
-+
-+      DP("from %u.%u.%u.%u to %u.%u.%u.%u",
-+         HIPQUAD(req->from), HIPQUAD(req->to));
-+
-+      if (req->from > req->to) {
-+              DP("bad ip range");
-+              return -ENOEXEC;
-+      }
-+
-+      if (req->to - req->from > MAX_RANGE) {
-+              ip_set_printk("range too big (max %d addresses)",
-+                             MAX_RANGE+1);
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_macipmap), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_macipmap));
-+              return -ENOMEM;
-+      }
-+      map->flags = req->flags;
-+      map->first_ip = req->from;
-+      map->last_ip = req->to;
-+      newbytes = members_size(map->first_ip, map->last_ip);
-+      map->members = ip_set_malloc(newbytes);
-+      DP("members: %u %p", newbytes, map->members);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", newbytes);
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+      memset(map->members, 0, newbytes);
-+      
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+
-+      ip_set_free(map->members, members_size(map->first_ip, map->last_ip));
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+      memset(map->members, 0, members_size(map->first_ip, map->last_ip));
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+      struct ip_set_req_macipmap_create *header =
-+          (struct ip_set_req_macipmap_create *) data;
-+
-+      DP("list_header %x %x %u", map->first_ip, map->last_ip,
-+         map->flags);
-+
-+      header->from = map->first_ip;
-+      header->to = map->last_ip;
-+      header->flags = map->flags;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+
-+      DP("%u", members_size(map->first_ip, map->last_ip));
-+      return members_size(map->first_ip, map->last_ip);
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_macipmap *map =
-+          (struct ip_set_macipmap *) set->data;
-+
-+      int bytes = members_size(map->first_ip, map->last_ip);
-+
-+      DP("members: %u %p", bytes, map->members);
-+      memcpy(data, map->members, bytes);
-+}
-+
-+static struct ip_set_type ip_set_macipmap = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_macipmap),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_macipmap_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("macipmap type of IP sets");
-+
-+static int __init ip_set_macipmap_init(void)
-+{
-+      init_max_malloc_size();
-+      return ip_set_register_set_type(&ip_set_macipmap);
-+}
-+
-+static void __exit ip_set_macipmap_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_macipmap);
-+}
-+
-+module_init(ip_set_macipmap_init);
-+module_exit(ip_set_macipmap_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_nethash.c
-@@ -0,0 +1,497 @@
-+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing a cidr nethash set */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/jhash.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+#include <linux/vmalloc.h>
-+#include <linux/random.h>
-+
-+#include <net/ip.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_malloc.h>
-+#include <linux/netfilter_ipv4/ip_set_nethash.h>
-+
-+static int limit = MAX_RANGE;
-+
-+static inline __u32
-+jhash_ip(const struct ip_set_nethash *map, uint16_t i, ip_set_ip_t ip)
-+{
-+      return jhash_1word(ip, *(((uint32_t *) map->initval) + i));
-+}
-+
-+static inline __u32
-+hash_id_cidr(struct ip_set_nethash *map,
-+           ip_set_ip_t ip,
-+           unsigned char cidr,
-+           ip_set_ip_t *hash_ip)
-+{
-+      __u32 id;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+
-+      *hash_ip = pack(ip, cidr);
-+      
-+      for (i = 0; i < map->probes; i++) {
-+              id = jhash_ip(map, i, *hash_ip) % map->hashsize;
-+              DP("hash key: %u", id);
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+              if (*elem == *hash_ip)
-+                      return id;
-+      }
-+      return UINT_MAX;
-+}
-+
-+static inline __u32
-+hash_id(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      __u32 id = UINT_MAX;
-+      int i;
-+
-+      for (i = 0; i < 30 && map->cidr[i]; i++) {
-+              id = hash_id_cidr(map, ip, map->cidr[i], hash_ip);
-+              if (id != UINT_MAX)
-+                      break;
-+      }
-+      return id;
-+}
-+
-+static inline int
-+__testip_cidr(struct ip_set *set, ip_set_ip_t ip, unsigned char cidr,
-+            ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+
-+      return (ip && hash_id_cidr(map, ip, cidr, hash_ip) != UINT_MAX);
-+}
-+
-+static inline int
-+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip)
-+{
-+      return (ip && hash_id(set, ip, hash_ip) != UINT_MAX);
-+}
-+
-+static int
-+testip(struct ip_set *set, const void *data, size_t size,
-+       ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_nethash *req = 
-+          (struct ip_set_req_nethash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_nethash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_nethash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return (req->cidr == 32 ? __testip(set, req->ip, hash_ip)
-+              : __testip_cidr(set, req->ip, req->cidr, hash_ip));
-+}
-+
-+static int
-+testip_kernel(struct ip_set *set, 
-+            const struct sk_buff *skb,
-+            ip_set_ip_t *hash_ip,
-+            const u_int32_t *flags,
-+            unsigned char index)
-+{
-+      return __testip(set,
-+                      ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                              ? ip_hdr(skb)->saddr 
-+                              : ip_hdr(skb)->daddr),
-+#else
-+                              ? skb->nh.iph->saddr 
-+                              : skb->nh.iph->daddr),
-+#endif
-+                      hash_ip);
-+}
-+
-+static inline int
-+__addip_base(struct ip_set_nethash *map, ip_set_ip_t ip)
-+{
-+      __u32 probe;
-+      u_int16_t i;
-+      ip_set_ip_t *elem;
-+      
-+      for (i = 0; i < map->probes; i++) {
-+              probe = jhash_ip(map, i, ip) % map->hashsize;
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, probe);
-+              if (*elem == ip)
-+                      return -EEXIST;
-+              if (!*elem) {
-+                      *elem = ip;
-+                      map->elements++;
-+                      return 0;
-+              }
-+      }
-+      /* Trigger rehashing */
-+      return -EAGAIN;
-+}
-+
-+static inline int
-+__addip(struct ip_set_nethash *map, ip_set_ip_t ip, unsigned char cidr,
-+      ip_set_ip_t *hash_ip)
-+{
-+      if (!ip || map->elements >= limit)
-+              return -ERANGE;
-+      
-+      *hash_ip = pack(ip, cidr);
-+      DP("%u.%u.%u.%u/%u, %u.%u.%u.%u", HIPQUAD(ip), cidr, HIPQUAD(*hash_ip));
-+      
-+      return __addip_base(map, *hash_ip);
-+}
-+
-+static void
-+update_cidr_sizes(struct ip_set_nethash *map, unsigned char cidr)
-+{
-+      unsigned char next;
-+      int i;
-+      
-+      for (i = 0; i < 30 && map->cidr[i]; i++) {
-+              if (map->cidr[i] == cidr) {
-+                      return;
-+              } else if (map->cidr[i] < cidr) {
-+                      next = map->cidr[i];
-+                      map->cidr[i] = cidr;
-+                      cidr = next;
-+              }
-+      }
-+      if (i < 30)
-+              map->cidr[i] = cidr;
-+}
-+
-+static int
-+addip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_nethash *req = 
-+          (struct ip_set_req_nethash *) data;
-+      int ret;
-+
-+      if (size != sizeof(struct ip_set_req_nethash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_nethash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      ret = __addip((struct ip_set_nethash *) set->data, 
-+                    req->ip, req->cidr, hash_ip);
-+      
-+      if (ret == 0)
-+              update_cidr_sizes((struct ip_set_nethash *) set->data,
-+                                req->cidr);
-+      
-+      return ret;
-+}
-+
-+static int
-+addip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      int ret = -ERANGE;
-+      ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                                      ? ip_hdr(skb)->saddr 
-+                                      : ip_hdr(skb)->daddr);
-+#else
-+                                      ? skb->nh.iph->saddr
-+                                      : skb->nh.iph->daddr);
-+#endif
-+      
-+      if (map->cidr[0])
-+              ret = __addip(map, ip, map->cidr[0], hash_ip);
-+              
-+      return ret;
-+}
-+
-+static int retry(struct ip_set *set)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      ip_set_ip_t *elem;
-+      void *members;
-+      u_int32_t i, hashsize = map->hashsize;
-+      int res;
-+      struct ip_set_nethash *tmp;
-+      
-+      if (map->resize == 0)
-+              return -ERANGE;
-+
-+    again:
-+      res = 0;
-+      
-+      /* Calculate new parameters */
-+      hashsize += (hashsize * map->resize)/100;
-+      if (hashsize == map->hashsize)
-+              hashsize++;
-+      
-+      ip_set_printk("rehashing of set %s triggered: "
-+                    "hashsize grows from %u to %u",
-+                    set->name, map->hashsize, hashsize);
-+
-+      tmp = kmalloc(sizeof(struct ip_set_nethash) 
-+                    + map->probes * sizeof(uint32_t), GFP_ATOMIC);
-+      if (!tmp) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_nethash)
-+                 + map->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      tmp->members = harray_malloc(hashsize, sizeof(ip_set_ip_t), GFP_ATOMIC);
-+      if (!tmp->members) {
-+              DP("out of memory for %d bytes", hashsize * sizeof(ip_set_ip_t));
-+              kfree(tmp);
-+              return -ENOMEM;
-+      }
-+      tmp->hashsize = hashsize;
-+      tmp->elements = 0;
-+      tmp->probes = map->probes;
-+      tmp->resize = map->resize;
-+      memcpy(tmp->initval, map->initval, map->probes * sizeof(uint32_t));
-+      memcpy(tmp->cidr, map->cidr, 30 * sizeof(unsigned char));
-+      
-+      write_lock_bh(&set->lock);
-+      map = (struct ip_set_nethash *) set->data; /* Play safe */
-+      for (i = 0; i < map->hashsize && res == 0; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              if (*elem)
-+                      res = __addip_base(tmp, *elem);
-+      }
-+      if (res) {
-+              /* Failure, try again */
-+              write_unlock_bh(&set->lock);
-+              harray_free(tmp->members);
-+              kfree(tmp);
-+              goto again;
-+      }
-+      
-+      /* Success at resizing! */
-+      members = map->members;
-+      
-+      map->hashsize = tmp->hashsize;
-+      map->members = tmp->members;
-+      write_unlock_bh(&set->lock);
-+
-+      harray_free(members);
-+      kfree(tmp);
-+
-+      return 0;
-+}
-+
-+static inline int
-+__delip(struct ip_set_nethash *map, ip_set_ip_t ip, unsigned char cidr,
-+      ip_set_ip_t *hash_ip)
-+{
-+      ip_set_ip_t id, *elem;
-+
-+      if (!ip)
-+              return -ERANGE;
-+      
-+      id = hash_id_cidr(map, ip, cidr, hash_ip);
-+      if (id == UINT_MAX)
-+              return -EEXIST;
-+              
-+      elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id);
-+      *elem = 0;
-+      map->elements--;
-+      return 0;
-+}
-+
-+static int
-+delip(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_ip)
-+{
-+      struct ip_set_req_nethash *req =
-+          (struct ip_set_req_nethash *) data;
-+
-+      if (size != sizeof(struct ip_set_req_nethash)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_nethash),
-+                            size);
-+              return -EINVAL;
-+      }
-+      /* TODO: no garbage collection in map->cidr */          
-+      return __delip((struct ip_set_nethash *) set->data, 
-+                     req->ip, req->cidr, hash_ip);
-+}
-+
-+static int
-+delip_kernel(struct ip_set *set, 
-+           const struct sk_buff *skb,
-+           ip_set_ip_t *hash_ip,
-+           const u_int32_t *flags,
-+           unsigned char index)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      int ret = -ERANGE;
-+      ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+                                      ? ip_hdr(skb)->saddr 
-+                                      : ip_hdr(skb)->daddr);
-+#else
-+                                      ? skb->nh.iph->saddr
-+                                      : skb->nh.iph->daddr);
-+#endif
-+      
-+      if (map->cidr[0])
-+              ret = __delip(map, ip, map->cidr[0], hash_ip);
-+      
-+      return ret;
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      struct ip_set_req_nethash_create *req =
-+          (struct ip_set_req_nethash_create *) data;
-+      struct ip_set_nethash *map;
-+      uint16_t i;
-+
-+      if (size != sizeof(struct ip_set_req_nethash_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                             sizeof(struct ip_set_req_nethash_create),
-+                             size);
-+              return -EINVAL;
-+      }
-+
-+      if (req->hashsize < 1) {
-+              ip_set_printk("hashsize too small");
-+              return -ENOEXEC;
-+      }
-+      if (req->probes < 1) {
-+              ip_set_printk("probes too small");
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_nethash)
-+                    + req->probes * sizeof(uint32_t), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_nethash)
-+                 + req->probes * sizeof(uint32_t));
-+              return -ENOMEM;
-+      }
-+      for (i = 0; i < req->probes; i++)
-+              get_random_bytes(((uint32_t *) map->initval)+i, 4);
-+      map->elements = 0;
-+      map->hashsize = req->hashsize;
-+      map->probes = req->probes;
-+      map->resize = req->resize;
-+      memset(map->cidr, 0, 30 * sizeof(unsigned char));
-+      map->members = harray_malloc(map->hashsize, sizeof(ip_set_ip_t), GFP_KERNEL);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", map->hashsize * sizeof(ip_set_ip_t));
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+      
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+
-+      harray_free(map->members);
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      harray_flush(map->members, map->hashsize, sizeof(ip_set_ip_t));
-+      memset(map->cidr, 0, 30 * sizeof(unsigned char));
-+      map->elements = 0;
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      struct ip_set_req_nethash_create *header =
-+          (struct ip_set_req_nethash_create *) data;
-+
-+      header->hashsize = map->hashsize;
-+      header->probes = map->probes;
-+      header->resize = map->resize;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+
-+      return (map->hashsize * sizeof(ip_set_ip_t));
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_nethash *map = (struct ip_set_nethash *) set->data;
-+      ip_set_ip_t i, *elem;
-+
-+      for (i = 0; i < map->hashsize; i++) {
-+              elem = HARRAY_ELEM(map->members, ip_set_ip_t *, i);     
-+              ((ip_set_ip_t *)data)[i] = *elem;
-+      }
-+}
-+
-+static struct ip_set_type ip_set_nethash = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_nethash),
-+      .addip                  = &addip,
-+      .addip_kernel           = &addip_kernel,
-+      .retry                  = &retry,
-+      .delip                  = &delip,
-+      .delip_kernel           = &delip_kernel,
-+      .testip                 = &testip,
-+      .testip_kernel          = &testip_kernel,
-+      .header_size            = sizeof(struct ip_set_req_nethash_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("nethash type of IP sets");
-+module_param(limit, int, 0600);
-+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets");
-+
-+static int __init ip_set_nethash_init(void)
-+{
-+      return ip_set_register_set_type(&ip_set_nethash);
-+}
-+
-+static void __exit ip_set_nethash_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_nethash);
-+}
-+
-+module_init(ip_set_nethash_init);
-+module_exit(ip_set_nethash_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ip_set_portmap.c
-@@ -0,0 +1,346 @@
-+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module implementing a port set type as a bitmap */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/udp.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/errno.h>
-+#include <asm/uaccess.h>
-+#include <asm/bitops.h>
-+#include <linux/spinlock.h>
-+
-+#include <net/ip.h>
-+
-+#include <linux/netfilter_ipv4/ip_set_portmap.h>
-+
-+/* We must handle non-linear skbs */
-+static inline ip_set_ip_t
-+get_port(const struct sk_buff *skb, u_int32_t flags)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+      struct iphdr *iph = ip_hdr(skb);
-+#else
-+      struct iphdr *iph = skb->nh.iph;
-+#endif
-+      u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET;
-+      switch (iph->protocol) {
-+      case IPPROTO_TCP: {
-+              struct tcphdr tcph;
-+              
-+              /* See comments at tcp_match in ip_tables.c */
-+              if (offset)
-+                      return INVALID_PORT;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+              if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0)
-+#else
-+              if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0)
-+#endif
-+                      /* No choice either */
-+                      return INVALID_PORT;
-+              
-+              return ntohs(flags & IPSET_SRC ?
-+                           tcph.source : tcph.dest);
-+          }
-+      case IPPROTO_UDP: {
-+              struct udphdr udph;
-+
-+              if (offset)
-+                      return INVALID_PORT;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+              if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0)
-+#else
-+              if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0)
-+#endif
-+                      /* No choice either */
-+                      return INVALID_PORT;
-+              
-+              return ntohs(flags & IPSET_SRC ?
-+                           udph.source : udph.dest);
-+          }
-+      default:
-+              return INVALID_PORT;
-+      }
-+}
-+
-+static inline int
-+__testport(struct ip_set *set, ip_set_ip_t port, ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+
-+      if (port < map->first_port || port > map->last_port)
-+              return -ERANGE;
-+              
-+      *hash_port = port;
-+      DP("set: %s, port:%u, %u", set->name, port, *hash_port);
-+      return !!test_bit(port - map->first_port, map->members);
-+}
-+
-+static int
-+testport(struct ip_set *set, const void *data, size_t size,
-+         ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_req_portmap *req = 
-+          (struct ip_set_req_portmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_portmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_portmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __testport(set, req->port, hash_port);
-+}
-+
-+static int
-+testport_kernel(struct ip_set *set, 
-+              const struct sk_buff *skb,
-+              ip_set_ip_t *hash_port,
-+              const u_int32_t *flags,
-+              unsigned char index)
-+{
-+      int res;
-+      ip_set_ip_t port = get_port(skb, flags[index]);
-+
-+      DP("flag %s port %u", flags[index] & IPSET_SRC ? "SRC" : "DST", port);  
-+      if (port == INVALID_PORT)
-+              return 0;       
-+
-+      res =  __testport(set, port, hash_port);
-+      
-+      return (res < 0 ? 0 : res);
-+}
-+
-+static inline int
-+__addport(struct ip_set *set, ip_set_ip_t port, ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+
-+      if (port < map->first_port || port > map->last_port)
-+              return -ERANGE;
-+      if (test_and_set_bit(port - map->first_port, map->members))
-+              return -EEXIST;
-+              
-+      *hash_port = port;
-+      DP("port %u", port);
-+      return 0;
-+}
-+
-+static int
-+addport(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_req_portmap *req = 
-+          (struct ip_set_req_portmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_portmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_portmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __addport(set, req->port, hash_port);
-+}
-+
-+static int
-+addport_kernel(struct ip_set *set, 
-+             const struct sk_buff *skb,
-+             ip_set_ip_t *hash_port,
-+             const u_int32_t *flags,
-+             unsigned char index)
-+{
-+      ip_set_ip_t port = get_port(skb, flags[index]);
-+      
-+      if (port == INVALID_PORT)
-+              return -EINVAL;
-+
-+      return __addport(set, port, hash_port);
-+}
-+
-+static inline int
-+__delport(struct ip_set *set, ip_set_ip_t port, ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+
-+      if (port < map->first_port || port > map->last_port)
-+              return -ERANGE;
-+      if (!test_and_clear_bit(port - map->first_port, map->members))
-+              return -EEXIST;
-+              
-+      *hash_port = port;
-+      DP("port %u", port);
-+      return 0;
-+}
-+
-+static int
-+delport(struct ip_set *set, const void *data, size_t size,
-+        ip_set_ip_t *hash_port)
-+{
-+      struct ip_set_req_portmap *req =
-+          (struct ip_set_req_portmap *) data;
-+
-+      if (size != sizeof(struct ip_set_req_portmap)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                            sizeof(struct ip_set_req_portmap),
-+                            size);
-+              return -EINVAL;
-+      }
-+      return __delport(set, req->port, hash_port);
-+}
-+
-+static int
-+delport_kernel(struct ip_set *set, 
-+             const struct sk_buff *skb,
-+             ip_set_ip_t *hash_port,
-+             const u_int32_t *flags,
-+             unsigned char index)
-+{
-+      ip_set_ip_t port = get_port(skb, flags[index]);
-+      
-+      if (port == INVALID_PORT)
-+              return -EINVAL;
-+
-+      return __delport(set, port, hash_port);
-+}
-+
-+static int create(struct ip_set *set, const void *data, size_t size)
-+{
-+      int newbytes;
-+      struct ip_set_req_portmap_create *req =
-+          (struct ip_set_req_portmap_create *) data;
-+      struct ip_set_portmap *map;
-+
-+      if (size != sizeof(struct ip_set_req_portmap_create)) {
-+              ip_set_printk("data length wrong (want %zu, have %zu)",
-+                             sizeof(struct ip_set_req_portmap_create),
-+                             size);
-+              return -EINVAL;
-+      }
-+
-+      DP("from %u to %u", req->from, req->to);
-+
-+      if (req->from > req->to) {
-+              DP("bad port range");
-+              return -ENOEXEC;
-+      }
-+
-+      if (req->to - req->from > MAX_RANGE) {
-+              ip_set_printk("range too big (max %d ports)",
-+                             MAX_RANGE+1);
-+              return -ENOEXEC;
-+      }
-+
-+      map = kmalloc(sizeof(struct ip_set_portmap), GFP_KERNEL);
-+      if (!map) {
-+              DP("out of memory for %d bytes",
-+                 sizeof(struct ip_set_portmap));
-+              return -ENOMEM;
-+      }
-+      map->first_port = req->from;
-+      map->last_port = req->to;
-+      newbytes = bitmap_bytes(req->from, req->to);
-+      map->members = kmalloc(newbytes, GFP_KERNEL);
-+      if (!map->members) {
-+              DP("out of memory for %d bytes", newbytes);
-+              kfree(map);
-+              return -ENOMEM;
-+      }
-+      memset(map->members, 0, newbytes);
-+
-+      set->data = map;
-+      return 0;
-+}
-+
-+static void destroy(struct ip_set *set)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+
-+      kfree(map->members);
-+      kfree(map);
-+
-+      set->data = NULL;
-+}
-+
-+static void flush(struct ip_set *set)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+      memset(map->members, 0, bitmap_bytes(map->first_port, map->last_port));
-+}
-+
-+static void list_header(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+      struct ip_set_req_portmap_create *header =
-+          (struct ip_set_req_portmap_create *) data;
-+
-+      DP("list_header %u %u", map->first_port, map->last_port);
-+
-+      header->from = map->first_port;
-+      header->to = map->last_port;
-+}
-+
-+static int list_members_size(const struct ip_set *set)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+
-+      return bitmap_bytes(map->first_port, map->last_port);
-+}
-+
-+static void list_members(const struct ip_set *set, void *data)
-+{
-+      struct ip_set_portmap *map = (struct ip_set_portmap *) set->data;
-+      int bytes = bitmap_bytes(map->first_port, map->last_port);
-+
-+      memcpy(data, map->members, bytes);
-+}
-+
-+static struct ip_set_type ip_set_portmap = {
-+      .typename               = SETTYPE_NAME,
-+      .features               = IPSET_TYPE_PORT | IPSET_DATA_SINGLE,
-+      .protocol_version       = IP_SET_PROTOCOL_VERSION,
-+      .create                 = &create,
-+      .destroy                = &destroy,
-+      .flush                  = &flush,
-+      .reqsize                = sizeof(struct ip_set_req_portmap),
-+      .addip                  = &addport,
-+      .addip_kernel           = &addport_kernel,
-+      .delip                  = &delport,
-+      .delip_kernel           = &delport_kernel,
-+      .testip                 = &testport,
-+      .testip_kernel          = &testport_kernel,
-+      .header_size            = sizeof(struct ip_set_req_portmap_create),
-+      .list_header            = &list_header,
-+      .list_members_size      = &list_members_size,
-+      .list_members           = &list_members,
-+      .me                     = THIS_MODULE,
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("portmap type of IP sets");
-+
-+static int __init ip_set_portmap_init(void)
-+{
-+      return ip_set_register_set_type(&ip_set_portmap);
-+}
-+
-+static void __exit ip_set_portmap_fini(void)
-+{
-+      /* FIXME: possible race with ip_set_create() */
-+      ip_set_unregister_set_type(&ip_set_portmap);
-+}
-+
-+module_init(ip_set_portmap_init);
-+module_exit(ip_set_portmap_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ipt_set.c
-@@ -0,0 +1,160 @@
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ *                         Martin Josefsson <gandalf@wlug.westbo.se>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* Kernel module to match an IP set. */
-+
-+#include <linux/module.h>
-+#include <linux/ip.h>
-+#include <linux/skbuff.h>
-+#include <linux/version.h>
-+
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ip_set.h>
-+#include <linux/netfilter_ipv4/ipt_set.h>
-+
-+static inline int
-+match_set(const struct ipt_set_info *info,
-+        const struct sk_buff *skb,
-+        int inv)
-+{     
-+      if (ip_set_testip_kernel(info->index, skb, info->flags))
-+              inv = !inv;
-+      return inv;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+static bool
-+#else
-+static int
-+#endif
-+match(const struct sk_buff *skb,
-+      const struct net_device *in,
-+      const struct net_device *out,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+      const struct xt_match *match,
-+#endif
-+      const void *matchinfo,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+      int offset, unsigned int protoff, bool *hotdrop)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      int offset, unsigned int protoff, int *hotdrop)
-+#else
-+      int offset, int *hotdrop)
-+#endif
-+{
-+      const struct ipt_set_info_match *info = matchinfo;
-+              
-+      return match_set(&info->match_set,
-+                       skb,
-+                       info->match_set.flags[0] & IPSET_MATCH_INV);
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+bool
-+#else
-+static int
-+#endif
-+checkentry(const char *tablename,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+         const void *inf,
-+#else
-+         const struct ipt_ip *ip,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+         const struct xt_match *match,
-+#endif
-+         void *matchinfo,
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+         unsigned int matchsize,
-+#endif
-+         unsigned int hook_mask)
-+{
-+      struct ipt_set_info_match *info = 
-+              (struct ipt_set_info_match *) matchinfo;
-+      ip_set_id_t index;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+      if (matchsize != IPT_ALIGN(sizeof(struct ipt_set_info_match))) {
-+              ip_set_printk("invalid matchsize %d", matchsize);
-+              return 0;
-+      }
-+#endif
-+
-+      index = ip_set_get_byindex(info->match_set.index);
-+              
-+      if (index == IP_SET_INVALID_ID) {
-+              ip_set_printk("Cannot find set indentified by id %u to match",
-+                            info->match_set.index);
-+              return 0;       /* error */
-+      }
-+      if (info->match_set.flags[IP_SET_MAX_BINDINGS] != 0) {
-+              ip_set_printk("That's nasty!");
-+              return 0;       /* error */
-+      }
-+
-+      return 1;
-+}
-+
-+static void destroy(
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+                  const struct xt_match *match,
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+                  void *matchinfo, unsigned int matchsize)
-+#else
-+                  void *matchinfo)
-+#endif
-+{
-+      struct ipt_set_info_match *info = matchinfo;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+      if (matchsize != IPT_ALIGN(sizeof(struct ipt_set_info_match))) {
-+              ip_set_printk("invalid matchsize %d", matchsize);
-+              return;
-+      }
-+#endif
-+      ip_set_put(info->match_set.index);
-+}
-+
-+static struct ipt_match set_match = {
-+      .name           = "set",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+      .family         = AF_INET,
-+#endif
-+      .match          = &match,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+      .matchsize      = sizeof(struct ipt_set_info_match),
-+#endif
-+      .checkentry     = &checkentry,
-+      .destroy        = &destroy,
-+      .me             = THIS_MODULE
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("iptables IP set match module");
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+#define ipt_register_match    xt_register_match
-+#define ipt_unregister_match  xt_unregister_match
-+#endif
-+
-+static int __init ipt_ipset_init(void)
-+{
-+      return ipt_register_match(&set_match);
-+}
-+
-+static void __exit ipt_ipset_fini(void)
-+{
-+      ipt_unregister_match(&set_match);
-+}
-+
-+module_init(ipt_ipset_init);
-+module_exit(ipt_ipset_fini);
---- /dev/null
-+++ b/net/ipv4/netfilter/ipt_SET.c
-@@ -0,0 +1,179 @@
-+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
-+ *                         Patrick Schaaf <bof@bof.de>
-+ *                         Martin Josefsson <gandalf@wlug.westbo.se>
-+ * Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
-+ *
-+ * 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.  
-+ */
-+
-+/* ipt_SET.c - netfilter target to manipulate IP sets */
-+
-+#include <linux/types.h>
-+#include <linux/ip.h>
-+#include <linux/timer.h>
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/netdevice.h>
-+#include <linux/if.h>
-+#include <linux/inetdevice.h>
-+#include <linux/version.h>
-+#include <net/protocol.h>
-+#include <net/checksum.h>
-+#include <linux/netfilter_ipv4.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ipt_set.h>
-+
-+static unsigned int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
-+target(struct sk_buff *skb,
-+#else
-+target(struct sk_buff **pskb,
-+#endif
-+       const struct net_device *in,
-+       const struct net_device *out,
-+       unsigned int hooknum,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+       const struct xt_target *target,
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+       const void *targinfo,
-+       void *userinfo)
-+#else
-+       const void *targinfo)
-+#endif
-+{
-+      const struct ipt_set_info_target *info = targinfo;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-+      struct sk_buff *skb = *pskb;
-+#endif
-+      
-+      if (info->add_set.index != IP_SET_INVALID_ID)
-+              ip_set_addip_kernel(info->add_set.index,
-+                                  skb,
-+                                  info->add_set.flags);
-+      if (info->del_set.index != IP_SET_INVALID_ID)
-+              ip_set_delip_kernel(info->del_set.index,
-+                                  skb,
-+                                  info->del_set.flags);
-+
-+      return IPT_CONTINUE;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-+static bool
-+#else
-+static int
-+#endif
-+checkentry(const char *tablename,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+         const void *e,
-+#else
-+         const struct ipt_entry *e,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+         const struct xt_target *target,
-+#endif
-+         void *targinfo,
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+         unsigned int targinfosize, 
-+#endif
-+         unsigned int hook_mask)
-+{
-+      struct ipt_set_info_target *info = 
-+              (struct ipt_set_info_target *) targinfo;
-+      ip_set_id_t index;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+      if (targinfosize != IPT_ALIGN(sizeof(*info))) {
-+              DP("bad target info size %u", targinfosize);
-+              return 0;
-+      }
-+#endif
-+
-+      if (info->add_set.index != IP_SET_INVALID_ID) {
-+              index = ip_set_get_byindex(info->add_set.index);
-+              if (index == IP_SET_INVALID_ID) {
-+                      ip_set_printk("cannot find add_set index %u as target",
-+                                    info->add_set.index);
-+                      return 0;       /* error */
-+              }
-+      }
-+
-+      if (info->del_set.index != IP_SET_INVALID_ID) {
-+              index = ip_set_get_byindex(info->del_set.index);
-+              if (index == IP_SET_INVALID_ID) {
-+                      ip_set_printk("cannot find del_set index %u as target",
-+                                    info->del_set.index);
-+                      return 0;       /* error */
-+              }
-+      }
-+      if (info->add_set.flags[IP_SET_MAX_BINDINGS] != 0
-+          || info->del_set.flags[IP_SET_MAX_BINDINGS] != 0) {
-+              ip_set_printk("That's nasty!");
-+              return 0;       /* error */
-+      }
-+
-+      return 1;
-+}
-+
-+static void destroy(
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+                  const struct xt_target *target,
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+                  void *targetinfo, unsigned int targetsize)
-+#else
-+                  void *targetinfo)
-+#endif
-+{
-+      struct ipt_set_info_target *info = targetinfo;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+      if (targetsize != IPT_ALIGN(sizeof(struct ipt_set_info_target))) {
-+              ip_set_printk("invalid targetsize %d", targetsize);
-+              return;
-+      }
-+#endif
-+      if (info->add_set.index != IP_SET_INVALID_ID)
-+              ip_set_put(info->add_set.index);
-+      if (info->del_set.index != IP_SET_INVALID_ID)
-+              ip_set_put(info->del_set.index);
-+}
-+
-+static struct ipt_target SET_target = {
-+      .name           = "SET",
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+      .family         = AF_INET,
-+#endif
-+      .target         = target,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
-+      .targetsize     = sizeof(struct ipt_set_info_target),
-+#endif
-+      .checkentry     = checkentry,
-+      .destroy        = destroy,
-+      .me             = THIS_MODULE
-+};
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>");
-+MODULE_DESCRIPTION("iptables IP set target module");
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
-+#define ipt_register_target      xt_register_target
-+#define ipt_unregister_target    xt_unregister_target
-+#endif
-+
-+static int __init ipt_SET_init(void)
-+{
-+      return ipt_register_target(&SET_target);
-+}
-+
-+static void __exit ipt_SET_fini(void)
-+{
-+      ipt_unregister_target(&SET_target);
-+}
-+
-+module_init(ipt_SET_init);
-+module_exit(ipt_SET_fini);
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -402,5 +402,122 @@ config IP_NF_ARP_MANGLE
-         Allows altering the ARP packet payload: source and destination
-         hardware and network addresses.
-+config IP_NF_SET
-+      tristate "IP set support"
-+      depends on INET && NETFILTER
-+      help
-+        This option adds IP set support to the kernel.
-+        In order to define and use sets, you need the userspace utility
-+        ipset(8).
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_MAX
-+      int "Maximum number of IP sets"
-+      default 256
-+      range 2 65534
-+      depends on IP_NF_SET
-+      help
-+        You can define here default value of the maximum number 
-+        of IP sets for the kernel.
-+
-+        The value can be overriden by the 'max_sets' module
-+        parameter of the 'ip_set' module.
-+
-+config IP_NF_SET_HASHSIZE
-+      int "Hash size for bindings of IP sets"
-+      default 1024
-+      depends on IP_NF_SET
-+      help
-+        You can define here default value of the hash size for
-+        bindings of IP sets.
-+
-+        The value can be overriden by the 'hash_size' module
-+        parameter of the 'ip_set' module.
-+
-+config IP_NF_SET_IPMAP
-+      tristate "ipmap set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the ipmap set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_MACIPMAP
-+      tristate "macipmap set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the macipmap set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_PORTMAP
-+      tristate "portmap set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the portmap set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_IPHASH
-+      tristate "iphash set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the iphash set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_NETHASH
-+      tristate "nethash set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the nethash set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_IPPORTHASH
-+      tristate "ipporthash set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the ipporthash set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_IPTREE
-+      tristate "iptree set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the iptree set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_SET_IPTREEMAP
-+      tristate "iptreemap set support"
-+      depends on IP_NF_SET
-+      help
-+        This option adds the iptreemap set type support.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_MATCH_SET
-+      tristate "set match support"
-+      depends on IP_NF_SET
-+      help
-+        Set matching matches against given IP sets.
-+        You need the ipset utility to create and set up the sets.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_TARGET_SET
-+      tristate "SET target support"
-+      depends on IP_NF_SET
-+      help
-+        The SET target makes possible to add/delete entries
-+        in IP sets.
-+        You need the ipset utility to create and set up the sets.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+
-+
- endmenu
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -49,6 +49,7 @@ obj-$(CONFIG_IP_NF_MATCH_OWNER) += ipt_o
- obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_recent.o
- obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o
- obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl.o
-+obj-$(CONFIG_IP_NF_MATCH_SET) += ipt_set.o
- # targets
- obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o
-@@ -62,6 +63,18 @@ obj-$(CONFIG_IP_NF_TARGET_SAME) += ipt_S
- obj-$(CONFIG_IP_NF_TARGET_TOS) += ipt_TOS.o
- obj-$(CONFIG_IP_NF_TARGET_TTL) += ipt_TTL.o
- obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o
-+obj-$(CONFIG_IP_NF_TARGET_SET) += ipt_SET.o
-+
-+# sets
-+obj-$(CONFIG_IP_NF_SET) += ip_set.o
-+obj-$(CONFIG_IP_NF_SET_IPMAP) += ip_set_ipmap.o
-+obj-$(CONFIG_IP_NF_SET_PORTMAP) += ip_set_portmap.o
-+obj-$(CONFIG_IP_NF_SET_MACIPMAP) += ip_set_macipmap.o
-+obj-$(CONFIG_IP_NF_SET_IPHASH) += ip_set_iphash.o
-+obj-$(CONFIG_IP_NF_SET_NETHASH) += ip_set_nethash.o
-+obj-$(CONFIG_IP_NF_SET_IPPORTHASH) += ip_set_ipporthash.o
-+obj-$(CONFIG_IP_NF_SET_IPTREE) += ip_set_iptree.o
-+obj-$(CONFIG_IP_NF_SET_IPTREEMAP) += ip_set_iptreemap.o
- # generic ARP tables
- obj-$(CONFIG_IP_NF_ARPTABLES) += arp_tables.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/140-netfilter_time.patch b/target/linux/generic-2.6/patches-2.6.24/140-netfilter_time.patch
deleted file mode 100644 (file)
index 7430de0..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_time.h
-@@ -0,0 +1,18 @@
-+#ifndef __ipt_time_h_included__
-+#define __ipt_time_h_included__
-+
-+
-+struct ipt_time_info {
-+      u_int8_t  days_match;   /* 1 bit per day. -SMTWTFS                      */
-+      u_int16_t time_start;   /* 0 < time_start < 23*60+59 = 1439             */
-+      u_int16_t time_stop;    /* 0:0 < time_stat < 23:59                      */
-+
-+                              /* FIXME: Keep this one for userspace iptables binary compability: */
-+      u_int8_t  kerneltime;   /* ignore skb time (and use kerneltime) or not. */
-+
-+      time_t    date_start;
-+      time_t    date_stop;
-+};
-+
-+
-+#endif /* __ipt_time_h_included__ */
---- /dev/null
-+++ b/net/ipv4/netfilter/ipt_time.c
-@@ -0,0 +1,180 @@
-+/*
-+  This is a module which is used for time matching
-+  It is using some modified code from dietlibc (localtime() function)
-+  that you can find at http://www.fefe.de/dietlibc/
-+  This file is distributed under the terms of the GNU General Public
-+  License (GPL). Copies of the GPL can be obtained from: ftp://prep.ai.mit.edu/pub/gnu/GPL
-+  2001-05-04 Fabrice MARIE <fabrice@netfilter.org> : initial development.
-+  2001-21-05 Fabrice MARIE <fabrice@netfilter.org> : bug fix in the match code,
-+     thanks to "Zeng Yu" <zengy@capitel.com.cn> for bug report.
-+  2001-26-09 Fabrice MARIE <fabrice@netfilter.org> : force the match to be in LOCAL_IN or PRE_ROUTING only.
-+  2001-30-11 Fabrice : added the possibility to use the match in FORWARD/OUTPUT with a little hack,
-+     added Nguyen Dang Phuoc Dong <dongnd@tlnet.com.vn> patch to support timezones.
-+  2004-05-02 Fabrice : added support for date matching, from an idea of Fabien COELHO.
-+*/
-+
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ipt_time.h>
-+#include <linux/time.h>
-+
-+MODULE_AUTHOR("Fabrice MARIE <fabrice@netfilter.org>");
-+MODULE_DESCRIPTION("Match arrival timestamp/date");
-+MODULE_LICENSE("GPL");
-+
-+struct tm
-+{
-+      int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */
-+      int tm_min;                   /* Minutes.     [0-59] */
-+      int tm_hour;                  /* Hours.       [0-23] */
-+      int tm_mday;                  /* Day.         [1-31] */
-+      int tm_mon;                   /* Month.       [0-11] */
-+      int tm_year;                  /* Year - 1900.  */
-+      int tm_wday;                  /* Day of week. [0-6] */
-+      int tm_yday;                  /* Days in year.[0-365] */
-+      int tm_isdst;                 /* DST.         [-1/0/1]*/
-+
-+      long int tm_gmtoff;           /* we don't care, we count from GMT */
-+      const char *tm_zone;          /* we don't care, we count from GMT */
-+};
-+
-+void
-+localtime(const u32 time, struct tm *r);
-+
-+static bool
-+match(const struct sk_buff *skb,
-+      const struct net_device *in,
-+      const struct net_device *out,
-+      const struct xt_match *match,
-+      const void *matchinfo,
-+      int offset,
-+      unsigned int protoff,
-+      bool *hotdrop)
-+{
-+      const struct ipt_time_info *info = matchinfo;   /* match info for rule */
-+      struct timeval tv;
-+      struct tm currenttime;                          /* time human readable */
-+      u_int8_t days_of_week[7] = {64, 32, 16, 8, 4, 2, 1};
-+      u_int16_t packet_time;
-+
-+      /* We might not have a timestamp, get one */
-+      if (skb->tstamp.tv64 == 0)
-+              __net_timestamp((struct sk_buff *)skb);
-+
-+      skb_get_timestamp(skb, &tv);
-+      /* First we make sure we are in the date start-stop boundaries */
-+      if ((tv.tv_sec < info->date_start) || (tv.tv_sec > info->date_stop))
-+              return 0; /* We are outside the date boundaries */
-+
-+      /* Transform the timestamp of the packet, in a human readable form */
-+      localtime(tv.tv_sec, &currenttime);
-+
-+      /* check if we match this timestamp, we start by the days... */
-+      if ((days_of_week[currenttime.tm_wday] & info->days_match) != days_of_week[currenttime.tm_wday])
-+              return 0; /* the day doesn't match */
-+
-+      /* ... check the time now */
-+      packet_time = (currenttime.tm_hour * 60) + currenttime.tm_min;
-+      if ((packet_time < info->time_start) || (packet_time > info->time_stop))
-+              return 0;
-+
-+      /* here we match ! */
-+      return 1;
-+}
-+
-+static bool
-+checkentry(const char *tablename,
-+           const void *ip,
-+         const struct xt_match *match,
-+           void *matchinfo,
-+           unsigned int hook_mask)
-+{
-+      struct ipt_time_info *info = matchinfo;   /* match info for rule */
-+
-+      /* First, check that we are in the correct hooks */
-+      if (hook_mask
-+            & ~((1 << NF_IP_PRE_ROUTING) | (1 << NF_IP_LOCAL_IN) | (1 << NF_IP_FORWARD) | (1 << NF_IP_LOCAL_OUT)))
-+      {
-+              printk("ipt_time: error, only valid for PRE_ROUTING, LOCAL_IN, FORWARD and OUTPUT)\n");
-+              return 0;
-+      }
-+
-+      /* Now check the coherence of the data ... */
-+      if ((info->time_start > 1439) ||        /* 23*60+59 = 1439*/
-+          (info->time_stop  > 1439))
-+      {
-+              printk(KERN_WARNING "ipt_time: invalid argument\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+static struct ipt_match time_match = {
-+      .name = "time",
-+      .match = &match,
-+      .matchsize = sizeof(struct ipt_time_info),
-+      .checkentry = &checkentry,
-+      .me = THIS_MODULE
-+};
-+
-+static int __init init(void)
-+{
-+      printk("ipt_time loading\n");
-+      return xt_register_match(&time_match);
-+}
-+
-+static void __exit fini(void)
-+{
-+      xt_unregister_match(&time_match);
-+      printk("ipt_time unloaded\n");
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+
-+/* The part below is borowed and modified from dietlibc */
-+
-+/* seconds per day */
-+#define SPD 24*60*60
-+
-+void
-+localtime(const u32 time, struct tm *r) {
-+      u32 i, timep;
-+      extern struct timezone sys_tz;
-+      const unsigned int __spm[12] =
-+              { 0,
-+                (31),
-+                (31+28),
-+                (31+28+31),
-+                (31+28+31+30),
-+                (31+28+31+30+31),
-+                (31+28+31+30+31+30),
-+                (31+28+31+30+31+30+31),
-+                (31+28+31+30+31+30+31+31),
-+                (31+28+31+30+31+30+31+31+30),
-+                (31+28+31+30+31+30+31+31+30+31),
-+                (31+28+31+30+31+30+31+31+30+31+30),
-+              };
-+      register u32 work;
-+
-+      timep = time - (sys_tz.tz_minuteswest * 60);
-+      work=timep%(SPD);
-+      r->tm_sec=work%60; work/=60;
-+      r->tm_min=work%60; r->tm_hour=work/60;
-+      work=timep/(SPD);
-+      r->tm_wday=(4+work)%7;
-+      for (i=1970; ; ++i) {
-+              register time_t k= (!(i%4) && ((i%100) || !(i%400)))?366:365;
-+              if (work>k)
-+                      work-=k;
-+              else
-+                      break;
-+      }
-+      r->tm_year=i-1900;
-+      for (i=11; i && __spm[i]>work; --i) ;
-+      r->tm_mon=i;
-+      r->tm_mday=work-__spm[i]+1;
-+}
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -72,6 +72,22 @@ config IP_NF_MATCH_TOS
-         To compile it as a module, choose M here.  If unsure, say N.
-+
-+config IP_NF_MATCH_TIME
-+      tristate  'TIME match support'
-+      depends on IP_NF_IPTABLES
-+      help
-+        This option adds a `time' match, which allows you
-+        to match based on the packet arrival time/date
-+        (arrival time/date at the machine which netfilter is running on) or
-+        departure time/date (for locally generated packets).
-+
-+        If you say Y here, try iptables -m time --help for more information.
-+        If you want to compile it as a module, say M here and read
-+
-+        Documentation/modules.txt.  If unsure, say `N'.
-+
-+
- config IP_NF_MATCH_RECENT
-       tristate "recent match support"
-       depends on IP_NF_IPTABLES
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -50,6 +50,7 @@ obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_
- obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o
- obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl.o
- obj-$(CONFIG_IP_NF_MATCH_SET) += ipt_set.o
-+obj-$(CONFIG_IP_NF_MATCH_TIME) += ipt_time.o
- # targets
- obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/150-netfilter_imq.patch b/target/linux/generic-2.6/patches-2.6.24/150-netfilter_imq.patch
deleted file mode 100644 (file)
index 15d6f49..0000000
+++ /dev/null
@@ -1,858 +0,0 @@
---- /dev/null
-+++ b/drivers/net/imq.c
-@@ -0,0 +1,409 @@
-+/*
-+ *             Pseudo-driver for the intermediate queue device.
-+ *
-+ *             This 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.
-+ *
-+ * Authors:    Patrick McHardy, <kaber@trash.net>
-+ *
-+ *            The first version was written by Martin Devera, <devik@cdi.cz>
-+ *
-+ * Credits:    Jan Rafaj <imq2t@cedric.vabo.cz>
-+ *              - Update patch to 2.4.21
-+ *             Sebastian Strollo <sstrollo@nortelnetworks.com>
-+ *              - Fix "Dead-loop on netdevice imq"-issue
-+ *             Marcel Sebek <sebek64@post.cz>
-+ *              - Update to 2.6.2-rc1
-+ *
-+ *           After some time of inactivity there is a group taking care
-+ *           of IMQ again: http://www.linuximq.net
-+ *
-+ *
-+ *           2004/06/30 - New version of IMQ patch to kernels <=2.6.7 including
-+ *           the following changes:
-+ *
-+ *           - Correction of ipv6 support "+"s issue (Hasso Tepper)
-+ *           - Correction of imq_init_devs() issue that resulted in
-+ *           kernel OOPS unloading IMQ as module (Norbert Buchmuller)
-+ *           - Addition of functionality to choose number of IMQ devices
-+ *           during kernel config (Andre Correa)
-+ *           - Addition of functionality to choose how IMQ hooks on
-+ *           PRE and POSTROUTING (after or before NAT) (Andre Correa)
-+ *           - Cosmetic corrections (Norbert Buchmuller) (Andre Correa)
-+ *
-+ *
-+ *             2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were
-+ *             released with almost no problems. 2.6.14-x was released
-+ *             with some important changes: nfcache was removed; After
-+ *             some weeks of trouble we figured out that some IMQ fields
-+ *             in skb were missing in skbuff.c - skb_clone and copy_skb_header.
-+ *             These functions are correctly patched by this new patch version.
-+ *
-+ *             Thanks for all who helped to figure out all the problems with
-+ *             2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX,
-+ *             Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully
-+ *             I didn't forget anybody). I apologize again for my lack of time.
-+ *
-+ *             More info at: http://www.linuximq.net/ (Andre Correa)
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/moduleparam.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/if_arp.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_ipv4.h>
-+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-+      #include <linux/netfilter_ipv6.h>
-+#endif
-+#include <linux/imq.h>
-+#include <net/pkt_sched.h>
-+
-+extern int qdisc_restart1(struct net_device *dev);
-+
-+static nf_hookfn imq_nf_hook;
-+
-+static struct nf_hook_ops imq_ingress_ipv4 = {
-+      .hook           = imq_nf_hook,
-+      .owner          = THIS_MODULE,
-+      .pf             = PF_INET,
-+      .hooknum        = NF_IP_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+      .priority       = NF_IP_PRI_MANGLE + 1
-+#else
-+      .priority       = NF_IP_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv4 = {
-+      .hook           = imq_nf_hook,
-+      .owner          = THIS_MODULE,
-+      .pf             = PF_INET,
-+      .hooknum        = NF_IP_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+      .priority       = NF_IP_PRI_LAST
-+#else
-+      .priority       = NF_IP_PRI_NAT_SRC - 1
-+#endif
-+};
-+
-+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-+static struct nf_hook_ops imq_ingress_ipv6 = {
-+      .hook           = imq_nf_hook,
-+      .owner          = THIS_MODULE,
-+      .pf             = PF_INET6,
-+      .hooknum        = NF_IP6_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+      .priority       = NF_IP6_PRI_MANGLE + 1
-+#else
-+      .priority       = NF_IP6_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv6 = {
-+      .hook           = imq_nf_hook,
-+      .owner          = THIS_MODULE,
-+      .pf             = PF_INET6,
-+      .hooknum        = NF_IP6_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+      .priority       = NF_IP6_PRI_LAST
-+#else
-+      .priority       = NF_IP6_PRI_NAT_SRC - 1
-+#endif
-+};
-+#endif
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS;
-+#else
-+static unsigned int numdevs = 16;
-+#endif
-+
-+static struct net_device *imq_devs;
-+
-+static struct net_device_stats *imq_get_stats(struct net_device *dev)
-+{
-+      return (struct net_device_stats *)dev->priv;
-+}
-+
-+/* called for packets kfree'd in qdiscs at places other than enqueue */
-+static void imq_skb_destructor(struct sk_buff *skb)
-+{
-+      struct nf_info *info = skb->nf_info;
-+
-+      if (info) {
-+              if (info->indev)
-+                      dev_put(info->indev);
-+              if (info->outdev)
-+                      dev_put(info->outdev);
-+              kfree(info);
-+      }
-+}
-+
-+static int imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+      struct net_device_stats *stats = (struct net_device_stats*) dev->priv;
-+
-+      stats->tx_bytes += skb->len;
-+      stats->tx_packets++;
-+
-+      skb->imq_flags = 0;
-+      skb->destructor = NULL;
-+
-+      dev->trans_start = jiffies;
-+      nf_reinject(skb, skb->nf_info, NF_ACCEPT);
-+      return 0;
-+}
-+
-+static int imq_nf_queue(struct sk_buff *skb, struct nf_info *info, unsigned queue_num, void *data)
-+{
-+      struct net_device *dev;
-+      struct net_device_stats *stats;
-+      struct sk_buff *skb2 = NULL;
-+      struct Qdisc *q;
-+      unsigned int index = skb->imq_flags&IMQ_F_IFMASK;
-+      int ret = -1;
-+
-+      if (index > numdevs)
-+              return -1;
-+
-+      dev = imq_devs + index;
-+      if (!(dev->flags & IFF_UP)) {
-+              skb->imq_flags = 0;
-+              nf_reinject(skb, info, NF_ACCEPT);
-+              return 0;
-+      }
-+      dev->last_rx = jiffies;
-+
-+      if (skb->destructor) {
-+              skb2 = skb;
-+              skb = skb_clone(skb, GFP_ATOMIC);
-+              if (!skb)
-+                      return -1;
-+      }
-+      skb->nf_info = info;
-+
-+      stats = (struct net_device_stats *)dev->priv;
-+      stats->rx_bytes+= skb->len;
-+      stats->rx_packets++;
-+
-+      spin_lock_bh(&dev->queue_lock);
-+      q = dev->qdisc;
-+      if (q->enqueue) {
-+              q->enqueue(skb_get(skb), q);
-+              if (skb_shared(skb)) {
-+                      skb->destructor = imq_skb_destructor;
-+                      kfree_skb(skb);
-+                      ret = 0;
-+              }
-+      }
-+      if (spin_is_locked(&dev->_xmit_lock))
-+              netif_schedule(dev);
-+      else
-+              while (!netif_queue_stopped(dev) && qdisc_restart1(dev) < 0)
-+                      /* NOTHING */;
-+
-+      spin_unlock_bh(&dev->queue_lock);
-+
-+      if (skb2)
-+              kfree_skb(ret ? skb : skb2);
-+
-+      return ret;
-+}
-+
-+static struct nf_queue_handler nfqh = {
-+      .name  = "imq",
-+      .outfn = imq_nf_queue,
-+};
-+
-+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
-+                              const struct net_device *indev,
-+                              const struct net_device *outdev,
-+                              int (*okfn)(struct sk_buff *))
-+{
-+      if (pskb->imq_flags & IMQ_F_ENQUEUE)
-+              return NF_QUEUE;
-+
-+      return NF_ACCEPT;
-+}
-+
-+
-+static int __init imq_init_hooks(void)
-+{
-+      int err;
-+
-+      err = nf_register_queue_handler(PF_INET, &nfqh);
-+      if (err > 0)
-+              goto err1;
-+      if ((err = nf_register_hook(&imq_ingress_ipv4)))
-+              goto err2;
-+      if ((err = nf_register_hook(&imq_egress_ipv4)))
-+              goto err3;
-+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-+      if ((err = nf_register_queue_handler(PF_INET6, &nfqh)))
-+              goto err4;
-+      if ((err = nf_register_hook(&imq_ingress_ipv6)))
-+              goto err5;
-+      if ((err = nf_register_hook(&imq_egress_ipv6)))
-+              goto err6;
-+#endif
-+
-+      return 0;
-+
-+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-+err6:
-+      nf_unregister_hook(&imq_ingress_ipv6);
-+err5:
-+      nf_unregister_queue_handler(PF_INET6, &nfqh);
-+err4:
-+      nf_unregister_hook(&imq_egress_ipv4);
-+#endif
-+err3:
-+      nf_unregister_hook(&imq_ingress_ipv4);
-+err2:
-+      nf_unregister_queue_handler(PF_INET, &nfqh);
-+err1:
-+      return err;
-+}
-+
-+static void __exit imq_unhook(void)
-+{
-+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
-+      nf_unregister_hook(&imq_ingress_ipv6);
-+      nf_unregister_hook(&imq_egress_ipv6);
-+      nf_unregister_queue_handler(PF_INET6, &nfqh);
-+#endif
-+      nf_unregister_hook(&imq_ingress_ipv4);
-+      nf_unregister_hook(&imq_egress_ipv4);
-+      nf_unregister_queue_handler(PF_INET, &nfqh);
-+}
-+
-+static int __init imq_dev_init(struct net_device *dev)
-+{
-+      dev->hard_start_xmit    = imq_dev_xmit;
-+      dev->type               = ARPHRD_VOID;
-+      dev->mtu                = 16000;
-+      dev->tx_queue_len       = 11000;
-+      dev->flags              = IFF_NOARP;
-+      dev->priv = kzalloc(sizeof(struct net_device_stats), GFP_KERNEL);
-+      if (dev->priv == NULL)
-+              return -ENOMEM;
-+      dev->get_stats          = imq_get_stats;
-+
-+      return 0;
-+}
-+
-+static void imq_dev_uninit(struct net_device *dev)
-+{
-+      kfree(dev->priv);
-+}
-+
-+static int __init imq_init_devs(struct net *net)
-+{
-+      struct net_device *dev;
-+      int i,j;
-+      j = numdevs;
-+
-+      if (!numdevs || numdevs > IMQ_MAX_DEVS) {
-+              printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
-+                     IMQ_MAX_DEVS);
-+              return -EINVAL;
-+      }
-+
-+      imq_devs = kzalloc(sizeof(struct net_device) * numdevs, GFP_KERNEL);
-+      if (!imq_devs)
-+              return -ENOMEM;
-+
-+      /* we start counting at zero */
-+      numdevs--;
-+
-+      for (i = 0, dev = imq_devs; i <= numdevs; i++, dev++) {
-+              strcpy(dev->name, "imq%d");
-+              dev->init   = imq_dev_init;
-+              dev->uninit = imq_dev_uninit;
-+              dev->nd_net = net;
-+
-+              if (register_netdev(dev) < 0)
-+                      goto err_register;
-+      }
-+      printk(KERN_INFO "IMQ starting with %u devices...\n", j);
-+      return 0;
-+
-+err_register:
-+      for (; i; i--)
-+              unregister_netdev(--dev);
-+      kfree(imq_devs);
-+      return -EIO;
-+}
-+
-+static void imq_cleanup_devs(void)
-+{
-+      int i;
-+      struct net_device *dev = imq_devs;
-+
-+      for (i = 0; i <= numdevs; i++)
-+              unregister_netdev(dev++);
-+
-+      kfree(imq_devs);
-+}
-+
-+static __net_init int imq_init_module(struct net *net)
-+{
-+      int err;
-+
-+      if ((err = imq_init_devs(net))) {
-+              printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
-+              return err;
-+      }
-+      if ((err = imq_init_hooks())) {
-+              printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n");
-+              imq_cleanup_devs();
-+              return err;
-+      }
-+
-+      printk(KERN_INFO "IMQ driver loaded successfully.\n");
-+
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+      printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n");
-+#else
-+      printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n");
-+#endif
-+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+      printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n");
-+#else
-+      printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n");
-+#endif
-+
-+      return 0;
-+}
-+
-+static __net_exit void imq_exit_module(struct net *net)
-+{
-+      imq_unhook();
-+      imq_cleanup_devs();
-+      printk(KERN_INFO "IMQ driver unloaded successfully.\n");
-+}
-+
-+static struct pernet_operations __net_initdata imq_net_ops = {
-+    .init = imq_init_module,
-+    .exit = imq_exit_module,
-+};
-+ 
-+static int __init imq_init(void)
-+{
-+    return register_pernet_device(&imq_net_ops);
-+}
-+
-+module_init(imq_init);
-+//module_exit(imq_cleanup_module);
-+
-+module_param(numdevs, int, 0);
-+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will be created)");
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -112,6 +112,129 @@ config EQUALIZER
-         To compile this driver as a module, choose M here: the module
-         will be called eql.  If unsure, say N.
-+config IMQ
-+      tristate "IMQ (intermediate queueing device) support"
-+      depends on NETDEVICES && NETFILTER
-+      ---help---
-+        The IMQ device(s) is used as placeholder for QoS queueing
-+        disciplines. Every packet entering/leaving the IP stack can be
-+        directed through the IMQ device where it's enqueued/dequeued to the
-+        attached qdisc. This allows you to treat network devices as classes
-+        and distribute bandwidth among them. Iptables is used to specify
-+        through which IMQ device, if any, packets travel.
-+
-+        More information at: http://www.linuximq.net/
-+
-+        To compile this driver as a module, choose M here: the module
-+        will be called imq.  If unsure, say N.
-+
-+choice
-+      prompt "IMQ behavior (PRE/POSTROUTING)"
-+      depends on IMQ
-+      default IMQ_BEHAVIOR_BB
-+      help
-+
-+              This settings defines how IMQ behaves in respect to its
-+              hooking in PREROUTING and POSTROUTING.
-+
-+              IMQ can work in any of the following ways:
-+
-+                  PREROUTING   |      POSTROUTING
-+              -----------------|-------------------
-+              #1  After NAT    |      After NAT
-+              #2  After NAT    |      Before NAT
-+              #3  Before NAT   |      After NAT
-+              #4  Before NAT   |      Before NAT
-+
-+              The default behavior is to hook before NAT on PREROUTING
-+              and after NAT on POSTROUTING (#3).
-+
-+              This settings are specially usefull when trying to use IMQ
-+              to shape NATed clients.
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AA
-+      bool "IMQ AA"
-+      help
-+              This settings defines how IMQ behaves in respect to its
-+              hooking in PREROUTING and POSTROUTING.
-+
-+              Choosing this option will make IMQ hook like this:
-+
-+              PREROUTING:   After NAT
-+              POSTROUTING:  After NAT
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AB
-+      bool "IMQ AB"
-+      help
-+              This settings defines how IMQ behaves in respect to its
-+              hooking in PREROUTING and POSTROUTING.
-+
-+              Choosing this option will make IMQ hook like this:
-+
-+              PREROUTING:   After NAT
-+              POSTROUTING:  Before NAT
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BA
-+      bool "IMQ BA"
-+      help
-+              This settings defines how IMQ behaves in respect to its
-+              hooking in PREROUTING and POSTROUTING.
-+
-+              Choosing this option will make IMQ hook like this:
-+
-+              PREROUTING:   Before NAT
-+              POSTROUTING:  After NAT
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BB
-+      bool "IMQ BB"
-+      help
-+              This settings defines how IMQ behaves in respect to its
-+              hooking in PREROUTING and POSTROUTING.
-+
-+              Choosing this option will make IMQ hook like this:
-+
-+              PREROUTING:   Before NAT
-+              POSTROUTING:  Before NAT
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
-+endchoice
-+
-+config IMQ_NUM_DEVS
-+
-+      int "Number of IMQ devices"
-+      range 2 16
-+      depends on IMQ
-+      default "16"
-+      help
-+
-+              This settings defines how many IMQ devices will be
-+              created.
-+
-+              The default value is 16.
-+
-+              More information can be found at: www.linuximq.net
-+
-+              If not sure leave the default settings alone.
-+
- config TUN
-       tristate "Universal TUN/TAP device driver support"
-       select CRC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -139,6 +139,7 @@ obj-$(CONFIG_SLHC) += slhc.o
- obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_IMQ) += imq.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACVLAN) += macvlan.o
- obj-$(CONFIG_DE600) += de600.o
---- /dev/null
-+++ b/include/linux/imq.h
-@@ -0,0 +1,9 @@
-+#ifndef _IMQ_H
-+#define _IMQ_H
-+
-+#define IMQ_MAX_DEVS   16
-+
-+#define IMQ_F_IFMASK   0x7f
-+#define IMQ_F_ENQUEUE  0x80
-+
-+#endif /* _IMQ_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
-@@ -0,0 +1,8 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
-+
-+struct ipt_imq_info {
-+      unsigned int todev;     /* target imq device */
-+};
-+
-+#endif /* _IPT_IMQ_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
-@@ -0,0 +1,8 @@
-+#ifndef _IP6T_IMQ_H
-+#define _IP6T_IMQ_H
-+
-+struct ip6t_imq_info {
-+      unsigned int todev;     /* target imq device */
-+};
-+
-+#endif /* _IP6T_IMQ_H */
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -295,6 +295,10 @@ struct sk_buff {
-       struct nf_conntrack     *nfct;
-       struct sk_buff          *nfct_reasm;
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+      unsigned char           imq_flags;
-+      struct nf_info          *nf_info;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
-       struct nf_bridge_info   *nf_bridge;
- #endif
-@@ -1728,6 +1732,10 @@ static inline void __nf_copy(struct sk_b
-       dst->nfct_reasm = src->nfct_reasm;
-       nf_conntrack_get_reasm(src->nfct_reasm);
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+      dst->imq_flags = src->imq_flags;
-+      dst->nf_info = src->nf_info;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
-       dst->nf_bridge  = src->nf_bridge;
-       nf_bridge_get(src->nf_bridge);
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -95,6 +95,9 @@
- #include <net/net_namespace.h>
- #include <net/sock.h>
- #include <linux/rtnetlink.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/stat.h>
-@@ -1533,7 +1536,11 @@ static int dev_gso_segment(struct sk_buf
- int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
-       if (likely(!skb->next)) {
--              if (!list_empty(&ptype_all))
-+              if (!list_empty(&ptype_all)
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+                  && !(skb->imq_flags & IMQ_F_ENQUEUE)
-+#endif
-+                  )
-                       dev_queue_xmit_nit(skb, dev);
-               if (netif_needs_gso(dev, skb)) {
---- /dev/null
-+++ b/net/ipv4/netfilter/ipt_IMQ.c
-@@ -0,0 +1,69 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ipt_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+                             const struct net_device *in,
-+                             const struct net_device *out,
-+                             unsigned int hooknum,
-+                             const struct xt_target *target,
-+                             const void *targinfo)
-+{
-+      struct ipt_imq_info *mr = (struct ipt_imq_info*)targinfo;
-+
-+      pskb->imq_flags = mr->todev | IMQ_F_ENQUEUE;
-+
-+      return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const char *tablename,
-+                        const void *e,
-+                        const struct xt_target *target,
-+                        void *targinfo,
-+                        unsigned int hook_mask)
-+{
-+      struct ipt_imq_info *mr;
-+
-+      mr = (struct ipt_imq_info*)targinfo;
-+
-+      if (mr->todev > IMQ_MAX_DEVS) {
-+              printk(KERN_WARNING
-+                     "IMQ: invalid device specified, highest is %u\n",
-+                     IMQ_MAX_DEVS);
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+static struct xt_target ipt_imq_reg = {
-+      .name           = "IMQ",
-+      .family         = AF_INET,
-+      .target         = imq_target,
-+      .targetsize     = sizeof(struct ipt_imq_info),
-+      .checkentry     = imq_checkentry,
-+      .me             = THIS_MODULE,
-+      .table          = "mangle"
-+};
-+
-+static int __init init(void)
-+{
-+      return xt_register_target(&ipt_imq_reg);
-+}
-+
-+static void __exit fini(void)
-+{
-+      xt_unregister_target(&ipt_imq_reg);
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -327,6 +327,17 @@ config IP_NF_MANGLE
-         To compile it as a module, choose M here.  If unsure, say N.
-+config IP_NF_TARGET_IMQ
-+       tristate "IMQ target support"
-+       depends on IP_NF_MANGLE
-+       help
-+         This option adds a `IMQ' target which is used to specify if and
-+         to which IMQ device packets should get enqueued/dequeued.
-+
-+       For more information visit: http://www.linuximq.net/
-+
-+         To compile it as a module, choose M here.  If unsure, say N.
-+
- config IP_NF_TARGET_TOS
-       tristate "TOS target support"
-       depends on IP_NF_MANGLE
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -56,6 +56,7 @@ obj-$(CONFIG_IP_NF_MATCH_TIME) += ipt_ti
- obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o
- obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o
- obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o
-+obj-$(CONFIG_IP_NF_TARGET_IMQ) += ipt_IMQ.o
- obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o
- obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o
- obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o
---- /dev/null
-+++ b/net/ipv6/netfilter/ip6t_IMQ.c
-@@ -0,0 +1,69 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter_ipv6/ip6_tables.h>
-+#include <linux/netfilter_ipv6/ip6t_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+                             const struct net_device *in,
-+                             const struct net_device *out,
-+                             unsigned int hooknum,
-+                             const struct xt_target *target,
-+                             const void *targinfo)
-+{
-+      struct ip6t_imq_info *mr = (struct ip6t_imq_info*)targinfo;
-+
-+      pskb->imq_flags = mr->todev | IMQ_F_ENQUEUE;
-+
-+      return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const char *tablename,
-+                        const void *entry,
-+                        const struct xt_target *target,
-+                        void *targinfo,
-+                        unsigned int hook_mask)
-+{
-+      struct ip6t_imq_info *mr;
-+
-+      mr = (struct ip6t_imq_info*)targinfo;
-+
-+      if (mr->todev > IMQ_MAX_DEVS) {
-+              printk(KERN_WARNING
-+                     "IMQ: invalid device specified, highest is %u\n",
-+                     IMQ_MAX_DEVS);
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+static struct xt_target ip6t_imq_reg = {
-+      .name           = "IMQ",
-+      .family         = AF_INET6,
-+      .target         = imq_target,
-+      .targetsize     = sizeof(struct ip6t_imq_info),
-+      .table          = "mangle",
-+      .checkentry     = imq_checkentry,
-+      .me             = THIS_MODULE
-+};
-+
-+static int __init init(void)
-+{
-+      return xt_register_target(&ip6t_imq_reg);
-+}
-+
-+static void __exit fini(void)
-+{
-+      xt_unregister_target(&ip6t_imq_reg);
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
---- a/net/ipv6/netfilter/Kconfig
-+++ b/net/ipv6/netfilter/Kconfig
-@@ -173,6 +173,15 @@ config IP6_NF_MANGLE
-         To compile it as a module, choose M here.  If unsure, say N.
-+config IP6_NF_TARGET_IMQ
-+      tristate "IMQ target support"
-+      depends on IP6_NF_MANGLE
-+      help
-+          This option adds a `IMQ' target which is used to specify if and
-+          to which imq device packets should get enqueued/dequeued.
-+
-+          To compile it as a module, choose M here.  If unsure, say N.
-+
- config IP6_NF_TARGET_HL
-       tristate  'HL (hoplimit) target support'
-       depends on IP6_NF_MANGLE
---- a/net/ipv6/netfilter/Makefile
-+++ b/net/ipv6/netfilter/Makefile
-@@ -6,6 +6,7 @@
- obj-$(CONFIG_IP6_NF_IPTABLES) += ip6_tables.o
- obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o
- obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o
-+obj-$(CONFIG_IP6_NF_TARGET_IMQ) += ip6t_IMQ.o
- obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o
- obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o
---- a/net/sched/sch_generic.c
-+++ b/net/sched/sch_generic.c
-@@ -176,6 +176,11 @@ static inline int qdisc_restart(struct n
-       return ret;
- }
-+int qdisc_restart1(struct net_device *dev)
-+{
-+      return qdisc_restart(dev);
-+}
-+
- void __qdisc_run(struct net_device *dev)
- {
-       unsigned long start_time = jiffies;
-@@ -650,3 +655,4 @@ EXPORT_SYMBOL(qdisc_destroy);
- EXPORT_SYMBOL(qdisc_reset);
- EXPORT_SYMBOL(qdisc_lock_tree);
- EXPORT_SYMBOL(qdisc_unlock_tree);
-+EXPORT_SYMBOL(qdisc_restart1);
diff --git a/target/linux/generic-2.6/patches-2.6.24/180-netfilter_depends.patch b/target/linux/generic-2.6/patches-2.6.24/180-netfilter_depends.patch
deleted file mode 100644 (file)
index dee5eb7..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -143,7 +143,7 @@ config NF_CONNTRACK_FTP
- config NF_CONNTRACK_H323
-       tristate "H.323 protocol support (EXPERIMENTAL)"
--      depends on EXPERIMENTAL && NF_CONNTRACK && (IPV6 || IPV6=n)
-+      depends on EXPERIMENTAL && NF_CONNTRACK
-       help
-         H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-         important VoIP protocols, it is widely used by voice hardware and
-@@ -387,7 +387,7 @@ config NETFILTER_XT_TARGET_CONNSECMARK
- config NETFILTER_XT_TARGET_TCPMSS
-       tristate '"TCPMSS" target support'
--      depends on NETFILTER_XTABLES && (IPV6 || IPV6=n)
-+      depends on NETFILTER_XTABLES
-       ---help---
-         This option adds a `TCPMSS' target, which allows you to alter the
-         MSS value of TCP SYN packets, to control the maximum size for that
diff --git a/target/linux/generic-2.6/patches-2.6.24/190-netfilter_rtsp.patch b/target/linux/generic-2.6/patches-2.6.24/190-netfilter_rtsp.patch
deleted file mode 100644 (file)
index 182d0d6..0000000
+++ /dev/null
@@ -1,1362 +0,0 @@
---- /dev/null
-+++ b/include/linux/netfilter/nf_conntrack_rtsp.h
-@@ -0,0 +1,63 @@
-+/*
-+ * RTSP extension for IP connection tracking.
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.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.
-+ */
-+#ifndef _IP_CONNTRACK_RTSP_H
-+#define _IP_CONNTRACK_RTSP_H
-+
-+//#define IP_NF_RTSP_DEBUG 1
-+#define IP_NF_RTSP_VERSION "0.6.21"
-+
-+#ifdef __KERNEL__
-+/* port block types */
-+typedef enum {
-+    pb_single,  /* client_port=x */
-+    pb_range,   /* client_port=x-y */
-+    pb_discon   /* client_port=x/y (rtspbis) */
-+} portblock_t;
-+
-+/* We record seq number and length of rtsp headers here, all in host order. */
-+
-+/*
-+ * This structure is per expected connection.  It is a member of struct
-+ * ip_conntrack_expect.  The TCP SEQ for the conntrack expect is stored
-+ * there and we are expected to only store the length of the data which
-+ * needs replaced.  If a packet contains multiple RTSP messages, we create
-+ * one expected connection per message.
-+ *
-+ * We use these variables to mark the entire header block.  This may seem
-+ * like overkill, but the nature of RTSP requires it.  A header may appear
-+ * multiple times in a message.  We must treat two Transport headers the
-+ * same as one Transport header with two entries.
-+ */
-+struct ip_ct_rtsp_expect
-+{
-+    u_int32_t   len;        /* length of header block */
-+    portblock_t pbtype;     /* Type of port block that was requested */
-+    u_int16_t   loport;     /* Port that was requested, low or first */
-+    u_int16_t   hiport;     /* Port that was requested, high or second */
-+#if 0
-+    uint        method;     /* RTSP method */
-+    uint        cseq;       /* CSeq from request */
-+#endif
-+};
-+
-+extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+                               enum ip_conntrack_info ctinfo,
-+                               unsigned int matchoff, unsigned int matchlen,
-+                               struct ip_ct_rtsp_expect *prtspexp,
-+                               struct nf_conntrack_expect *exp);
-+
-+extern void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+#define RTSP_PORT   554
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _IP_CONNTRACK_RTSP_H */
---- /dev/null
-+++ b/include/linux/netfilter_helpers.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Helpers for netfiler modules.  This file provides implementations for basic
-+ * functions such as strncasecmp(), etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested.  The following macros are used:
-+ *   NF_NEED_STRNCASECMP        nf_strncasecmp()
-+ *   NF_NEED_STRTOU16           nf_strtou16()
-+ *   NF_NEED_STRTOU32           nf_strtou32()
-+ */
-+#ifndef _NETFILTER_HELPERS_H
-+#define _NETFILTER_HELPERS_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+#define iseol(c) ( (c) == '\r' || (c) == '\n' )
-+
-+/*
-+ * The standard strncasecmp()
-+ */
-+#ifdef NF_NEED_STRNCASECMP
-+static int
-+nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
-+{
-+    if (s1 == NULL || s2 == NULL)
-+    {
-+        if (s1 == NULL && s2 == NULL)
-+        {
-+            return 0;
-+        }
-+        return (s1 == NULL) ? -1 : 1;
-+    }
-+    while (len > 0 && tolower(*s1) == tolower(*s2))
-+    {
-+        len--;
-+        s1++;
-+        s2++;
-+    }
-+    return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
-+}
-+#endif /* NF_NEED_STRNCASECMP */
-+
-+/*
-+ * Parse a string containing a 16-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU16
-+static int
-+nf_strtou16(const char* pbuf, u_int16_t* pval)
-+{
-+    int n = 0;
-+
-+    *pval = 0;
-+    while (isdigit(pbuf[n]))
-+    {
-+        *pval = (*pval * 10) + (pbuf[n] - '0');
-+        n++;
-+    }
-+
-+    return n;
-+}
-+#endif /* NF_NEED_STRTOU16 */
-+
-+/*
-+ * Parse a string containing a 32-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU32
-+static int
-+nf_strtou32(const char* pbuf, u_int32_t* pval)
-+{
-+    int n = 0;
-+
-+    *pval = 0;
-+    while (pbuf[n] >= '0' && pbuf[n] <= '9')
-+    {
-+        *pval = (*pval * 10) + (pbuf[n] - '0');
-+        n++;
-+    }
-+
-+    return n;
-+}
-+#endif /* NF_NEED_STRTOU32 */
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.
-+ */
-+#ifdef NF_NEED_NEXTLINE
-+static int
-+nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+    uint    off = *poff;
-+    uint    physlen = 0;
-+
-+    if (off >= len)
-+    {
-+        return 0;
-+    }
-+
-+    while (p[off] != '\n')
-+    {
-+        if (len-off <= 1)
-+        {
-+            return 0;
-+        }
-+
-+        physlen++;
-+        off++;
-+    }
-+
-+    /* if we saw a crlf, physlen needs adjusted */
-+    if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+    {
-+        physlen--;
-+    }
-+
-+    /* advance past the newline */
-+    off++;
-+
-+    *plineoff = *poff;
-+    *plinelen = physlen;
-+    *poff = off;
-+
-+    return 1;
-+}
-+#endif /* NF_NEED_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_HELPERS_H */
---- /dev/null
-+++ b/include/linux/netfilter_mime.h
-@@ -0,0 +1,89 @@
-+/*
-+ * MIME functions for netfilter modules.  This file provides implementations
-+ * for basic MIME parsing.  MIME headers are used in many protocols, such as
-+ * HTTP, RTSP, SIP, etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested.  The following macros are used:
-+ *   NF_NEED_MIME_NEXTLINE      nf_mime_nextline()
-+ */
-+#ifndef _NETFILTER_MIME_H
-+#define _NETFILTER_MIME_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.  If the current line is empty, *plinelen will be set to zero.  If
-+ * not, it will be set to the actual line length (including CRLF).
-+ *
-+ * 'line' in this context means logical line (includes LWS continuations).
-+ * Returns 1 on success, 0 on failure.
-+ */
-+#ifdef NF_NEED_MIME_NEXTLINE
-+static int
-+nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+    uint    off = *poff;
-+    uint    physlen = 0;
-+    int     is_first_line = 1;
-+
-+    if (off >= len)
-+    {
-+        return 0;
-+    }
-+
-+    do
-+    {
-+        while (p[off] != '\n')
-+        {
-+            if (len-off <= 1)
-+            {
-+                return 0;
-+            }
-+
-+            physlen++;
-+            off++;
-+        }
-+
-+        /* if we saw a crlf, physlen needs adjusted */
-+        if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+        {
-+            physlen--;
-+        }
-+
-+        /* advance past the newline */
-+        off++;
-+
-+        /* check for an empty line */
-+        if (physlen == 0)
-+        {
-+            break;
-+        }
-+
-+        /* check for colon on the first physical line */
-+        if (is_first_line)
-+        {
-+            is_first_line = 0;
-+            if (memchr(p+(*poff), ':', physlen) == NULL)
-+            {
-+                return 0;
-+            }
-+        }
-+    }
-+    while (p[off] == ' ' || p[off] == '\t');
-+
-+    *plineoff = *poff;
-+    *plinelen = (physlen == 0) ? 0 : (off - *poff);
-+    *poff = off;
-+
-+    return 1;
-+}
-+#endif /* NF_NEED_MIME_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_MIME_H */
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -23,6 +23,7 @@ obj-$(CONFIG_NF_NAT_AMANDA) += nf_nat_am
- obj-$(CONFIG_NF_NAT_FTP) += nf_nat_ftp.o
- obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o
- obj-$(CONFIG_NF_NAT_IRC) += nf_nat_irc.o
-+obj-$(CONFIG_NF_NAT_RTSP) += nf_nat_rtsp.o
- obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o
- obj-$(CONFIG_NF_NAT_SIP) += nf_nat_sip.o
- obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -249,6 +249,16 @@ config NF_CONNTRACK_TFTP
-         To compile it as a module, choose M here.  If unsure, say N.
-+config NF_CONNTRACK_RTSP
-+      tristate "RTSP protocol support"
-+      depends on NF_CONNTRACK
-+      help
-+              Support the RTSP protocol.  This allows UDP transports to be setup
-+              properly, including RTP and RDT.
-+
-+              If you want to compile it as a module, say 'M' here and read
-+              Documentation/modules.txt.  If unsure, say 'Y'.
-+
- config NF_CT_NETLINK
-       tristate 'Connection tracking netlink interface (EXPERIMENTAL)'
-       depends on EXPERIMENTAL && NF_CONNTRACK && NETFILTER_NETLINK
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -33,6 +33,7 @@ obj-$(CONFIG_NF_CONNTRACK_PPTP) += nf_co
- obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o
- obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o
- obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o
-+obj-$(CONFIG_NF_CONNTRACK_RTSP) += nf_conntrack_rtsp.o
- # generic X tables 
- obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -290,6 +290,11 @@ config NF_NAT_IRC
-       depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-       default NF_NAT && NF_CONNTRACK_IRC
-+config NF_NAT_RTSP
-+      tristate
-+      depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-+      default NF_NAT && NF_CONNTRACK_RTSP
-+
- config NF_NAT_TFTP
-       tristate
-       depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtsp.c
-@@ -0,0 +1,513 @@
-+/*
-+ * RTSP extension for IP connection tracking
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.c
-+ *
-+ *      This 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.
-+ *
-+ * Module load syntax:
-+ *   insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ *                              max_outstanding=n setup_timeout=secs
-+ *
-+ * If no ports are specified, the default will be port 554.
-+ *
-+ * With max_outstanding you can define the maximum number of not yet
-+ * answered SETUP requests per RTSP session (default 8).
-+ * With setup_timeout you can specify how long the system waits for
-+ * an expected data channel (default 300 seconds).
-+ *
-+ * 2005-02-13: Harald Welte <laforge at netfilter.org>
-+ *    - port to 2.6
-+ *    - update to recent post-2.6.11 api changes
-+ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
-+ *      - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
-+ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
-+ *                    - Port to new NF API
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/ip.h>
-+#include <linux/inet.h>
-+#include <net/tcp.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#define NF_NEED_STRTOU32
-+#define NF_NEED_NEXTLINE
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#include <linux/ctype.h>
-+#define MAX_SIMUL_SETUP 8 /* XXX: use max_outstanding */
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+static int ports[MAX_PORTS];
-+static int num_ports = 0;
-+static int max_outstanding = 8;
-+static unsigned int setup_timeout = 300;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP connection tracking module");
-+MODULE_LICENSE("GPL");
-+module_param_array(ports, int, &num_ports, 0400);
-+MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
-+module_param(max_outstanding, int, 0400);
-+MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
-+module_param(setup_timeout, int, 0400);
-+MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
-+
-+static char *rtsp_buffer;
-+static DEFINE_SPINLOCK(rtsp_buffer_lock);
-+
-+unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+                               enum ip_conntrack_info ctinfo,
-+                               unsigned int matchoff, unsigned int matchlen,struct ip_ct_rtsp_expect* prtspexp,
-+                               struct nf_conntrack_expect *exp);
-+void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
-+
-+/*
-+ * Max mappings we will allow for one RTSP connection (for RTP, the number
-+ * of allocated ports is twice this value).  Note that SMIL burns a lot of
-+ * ports so keep this reasonably high.  If this is too low, you will see a
-+ * lot of "no free client map entries" messages.
-+ */
-+#define MAX_PORT_MAPS 16
-+
-+/*** default port list was here in the masq code: 554, 3030, 4040 ***/
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*
-+ * Parse an RTSP packet.
-+ *
-+ * Returns zero if parsing failed.
-+ *
-+ * Parameters:
-+ *  IN      ptcp        tcp data pointer
-+ *  IN      tcplen      tcp data len
-+ *  IN/OUT  ptcpoff     points to current tcp offset
-+ *  OUT     phdrsoff    set to offset of rtsp headers
-+ *  OUT     phdrslen    set to length of rtsp headers
-+ *  OUT     pcseqoff    set to offset of CSeq header
-+ *  OUT     pcseqlen    set to length of CSeq header
-+ */
-+static int
-+rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
-+                   uint* phdrsoff, uint* phdrslen,
-+                   uint* pcseqoff, uint* pcseqlen,
-+                   uint* transoff, uint* translen)
-+{
-+      uint    entitylen = 0;
-+      uint    lineoff;
-+      uint    linelen;
-+      
-+      if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
-+              return 0;
-+      
-+      *phdrsoff = *ptcpoff;
-+      while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
-+              if (linelen == 0) {
-+                      if (entitylen > 0)
-+                              *ptcpoff += min(entitylen, tcplen - *ptcpoff);
-+                      break;
-+              }
-+              if (lineoff+linelen > tcplen) {
-+                      INFOP("!! overrun !!\n");
-+                      break;
-+              }
-+              
-+              if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
-+                      *pcseqoff = lineoff;
-+                      *pcseqlen = linelen;
-+              } 
-+
-+              if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
-+                      *transoff = lineoff;
-+                      *translen = linelen;
-+              }
-+              
-+              if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
-+                      uint off = lineoff+15;
-+                      SKIP_WSPACE(ptcp+lineoff, linelen, off);
-+                      nf_strtou32(ptcp+off, &entitylen);
-+              }
-+      }
-+      *phdrslen = (*ptcpoff) - (*phdrsoff);
-+      
-+      return 1;
-+}
-+
-+/*
-+ * Find lo/hi client ports (if any) in transport header
-+ * In:
-+ *   ptcp, tcplen = packet
-+ *   tranoff, tranlen = buffer to search
-+ *
-+ * Out:
-+ *   pport_lo, pport_hi = lo/hi ports (host endian)
-+ *
-+ * Returns nonzero if any client ports found
-+ *
-+ * Note: it is valid (and expected) for the client to request multiple
-+ * transports, so we need to parse the entire line.
-+ */
-+static int
-+rtsp_parse_transport(char* ptran, uint tranlen,
-+                     struct ip_ct_rtsp_expect* prtspexp)
-+{
-+      int     rc = 0;
-+      uint    off = 0;
-+      
-+      if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+          nf_strncasecmp(ptran, "Transport:", 10) != 0) {
-+              INFOP("sanity check failed\n");
-+              return 0;
-+      }
-+      
-+      DEBUGP("tran='%.*s'\n", (int)tranlen, ptran);
-+      off += 10;
-+      SKIP_WSPACE(ptran, tranlen, off);
-+      
-+      /* Transport: tran;field;field=val,tran;field;field=val,... */
-+      while (off < tranlen) {
-+              const char* pparamend;
-+              uint        nextparamoff;
-+              
-+              pparamend = memchr(ptran+off, ',', tranlen-off);
-+              pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+              nextparamoff = pparamend-ptran;
-+              
-+              while (off < nextparamoff) {
-+                      const char* pfieldend;
-+                      uint        nextfieldoff;
-+                      
-+                      pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+                      nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+                 
-+                      if (strncmp(ptran+off, "client_port=", 12) == 0) {
-+                              u_int16_t   port;
-+                              uint        numlen;
-+                  
-+                              off += 12;
-+                              numlen = nf_strtou16(ptran+off, &port);
-+                              off += numlen;
-+                              if (prtspexp->loport != 0 && prtspexp->loport != port)
-+                                      DEBUGP("multiple ports found, port %hu ignored\n", port);
-+                              else {
-+                                      DEBUGP("lo port found : %hu\n", port);
-+                                      prtspexp->loport = prtspexp->hiport = port;
-+                                      if (ptran[off] == '-') {
-+                                              off++;
-+                                              numlen = nf_strtou16(ptran+off, &port);
-+                                              off += numlen;
-+                                              prtspexp->pbtype = pb_range;
-+                                              prtspexp->hiport = port;
-+                                              
-+                                              // If we have a range, assume rtp:
-+                                              // loport must be even, hiport must be loport+1
-+                                              if ((prtspexp->loport & 0x0001) != 0 ||
-+                                                  prtspexp->hiport != prtspexp->loport+1) {
-+                                                      DEBUGP("incorrect range: %hu-%hu, correcting\n",
-+                                                             prtspexp->loport, prtspexp->hiport);
-+                                                      prtspexp->loport &= 0xfffe;
-+                                                      prtspexp->hiport = prtspexp->loport+1;
-+                                              }
-+                                      } else if (ptran[off] == '/') {
-+                                              off++;
-+                                              numlen = nf_strtou16(ptran+off, &port);
-+                                              off += numlen;
-+                                              prtspexp->pbtype = pb_discon;
-+                                              prtspexp->hiport = port;
-+                                      }
-+                                      rc = 1;
-+                              }
-+                      }
-+                      
-+                      /*
-+                       * Note we don't look for the destination parameter here.
-+                       * If we are using NAT, the NAT module will handle it.  If not,
-+                       * and the client is sending packets elsewhere, the expectation
-+                       * will quietly time out.
-+                       */
-+                      
-+                      off = nextfieldoff;
-+              }
-+              
-+              off = nextparamoff;
-+      }
-+      
-+      return rc;
-+}
-+
-+void expected(struct nf_conn *ct, struct nf_conntrack_expect *exp)
-+{
-+    if(nf_nat_rtsp_hook_expectfn) {
-+        nf_nat_rtsp_hook_expectfn(ct,exp);
-+    }
-+}
-+
-+/*** conntrack functions ***/
-+
-+/* outbound packet: client->server */
-+
-+static inline int
-+help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
-+                struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+      struct ip_ct_rtsp_expect expinfo;
-+      
-+      int dir = CTINFO2DIR(ctinfo);   /* = IP_CT_DIR_ORIGINAL */
-+      //struct  tcphdr* tcph = (void*)iph + iph->ihl * 4;
-+      //uint    tcplen = pktlen - iph->ihl * 4;
-+      char*   pdata = rb_ptr;
-+      //uint    datalen = tcplen - tcph->doff * 4;
-+      uint    dataoff = 0;
-+      int ret = NF_ACCEPT;
-+      
-+      struct nf_conntrack_expect *exp;
-+      
-+      __be16 be_loport;
-+      
-+      memset(&expinfo, 0, sizeof(expinfo));
-+      
-+      while (dataoff < datalen) {
-+              uint    cmdoff = dataoff;
-+              uint    hdrsoff = 0;
-+              uint    hdrslen = 0;
-+              uint    cseqoff = 0;
-+              uint    cseqlen = 0;
-+              uint    transoff = 0;
-+              uint    translen = 0;
-+              uint    off;
-+              
-+              if (!rtsp_parse_message(pdata, datalen, &dataoff,
-+                                      &hdrsoff, &hdrslen,
-+                                      &cseqoff, &cseqlen,
-+                                      &transoff, &translen))
-+                      break;      /* not a valid message */
-+              
-+              if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
-+                      continue;   /* not a SETUP message */
-+              DEBUGP("found a setup message\n");
-+
-+              off = 0;
-+              if(translen) {
-+                      rtsp_parse_transport(pdata+transoff, translen, &expinfo);
-+              }
-+
-+              if (expinfo.loport == 0) {
-+                      DEBUGP("no udp transports found\n");
-+                      continue;   /* no udp transports found */
-+              }
-+
-+              DEBUGP("udp transport found, ports=(%d,%hu,%hu)\n",
-+                     (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
-+
-+              exp = nf_ct_expect_alloc(ct);
-+              if (!exp) {
-+                      ret = NF_DROP;
-+                      goto out;
-+              }
-+
-+              be_loport = htons(expinfo.loport);
-+
-+              nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
-+                      &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3,
-+                      IPPROTO_UDP, NULL, &be_loport); 
-+
-+              exp->master = ct;
-+
-+              exp->expectfn = expected;
-+              exp->flags = 0;
-+
-+              if (expinfo.pbtype == pb_range) {
-+                      DEBUGP("Changing expectation mask to handle multiple ports\n");
-+                      exp->mask.src.u.udp.port  = 0xfffe;
-+              }
-+
-+              DEBUGP("expect_related %u.%u.%u.%u:%u-%u.%u.%u.%u:%u\n",
-+                     NIPQUAD(exp->tuple.src.u3.ip),
-+                     ntohs(exp->tuple.src.u.udp.port),
-+                     NIPQUAD(exp->tuple.dst.u3.ip),
-+                     ntohs(exp->tuple.dst.u.udp.port));
-+
-+              if (nf_nat_rtsp_hook)
-+                      /* pass the request off to the nat helper */
-+                      ret = nf_nat_rtsp_hook(skb, ctinfo, hdrsoff, hdrslen, &expinfo, exp);
-+              else if (nf_ct_expect_related(exp) != 0) {
-+                      INFOP("nf_ct_expect_related failed\n");
-+                      ret  = NF_DROP;
-+              }
-+              nf_ct_expect_put(exp);
-+              goto out;
-+      }
-+out:
-+
-+      return ret;
-+}
-+
-+
-+static inline int
-+help_in(struct sk_buff *skb, size_t pktlen,
-+ struct nf_conn* ct, enum ip_conntrack_info ctinfo)
-+{
-+ return NF_ACCEPT;
-+}
-+
-+static int help(struct sk_buff *skb, unsigned int protoff,
-+              struct nf_conn *ct, enum ip_conntrack_info ctinfo) 
-+{
-+      struct tcphdr _tcph, *th;
-+      unsigned int dataoff, datalen;
-+      char *rb_ptr;
-+      int ret = NF_DROP;
-+
-+      /* Until there's been traffic both ways, don't look in packets. */
-+      if (ctinfo != IP_CT_ESTABLISHED && 
-+          ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
-+              DEBUGP("conntrackinfo = %u\n", ctinfo);
-+              return NF_ACCEPT;
-+      }
-+
-+      /* Not whole TCP header? */
-+      th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
-+
-+      if (!th)
-+              return NF_ACCEPT;
-+   
-+      /* No data ? */
-+      dataoff = protoff + th->doff*4;
-+      datalen = skb->len - dataoff;
-+      if (dataoff >= skb->len)
-+              return NF_ACCEPT;
-+
-+      spin_lock_bh(&rtsp_buffer_lock);
-+      rb_ptr = skb_header_pointer(skb, dataoff,
-+                                  skb->len - dataoff, rtsp_buffer);
-+      BUG_ON(rb_ptr == NULL);
-+
-+#if 0
-+      /* Checksum invalid?  Ignore. */
-+      /* FIXME: Source route IP option packets --RR */
-+      if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-+                       csum_partial((char*)tcph, tcplen, 0)))
-+      {
-+              DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-+                     tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
-+              return NF_ACCEPT;
-+      }
-+#endif
-+
-+      switch (CTINFO2DIR(ctinfo)) {
-+      case IP_CT_DIR_ORIGINAL:
-+              ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
-+              break;
-+      case IP_CT_DIR_REPLY:
-+              DEBUGP("IP_CT_DIR_REPLY\n");
-+              /* inbound packet: server->client */
-+              ret = NF_ACCEPT;
-+              break;
-+      }
-+
-+      spin_unlock_bh(&rtsp_buffer_lock);
-+
-+      return ret;
-+}
-+
-+static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
-+static char rtsp_names[MAX_PORTS][10];
-+
-+/* This function is intentionally _NOT_ defined as __exit */
-+static void
-+fini(void)
-+{
-+      int i;
-+      for (i = 0; i < num_ports; i++) {
-+              DEBUGP("unregistering port %d\n", ports[i]);
-+              nf_conntrack_helper_unregister(&rtsp_helpers[i]);
-+      }
-+      kfree(rtsp_buffer);
-+}
-+
-+static int __init
-+init(void)
-+{
-+      int i, ret;
-+      struct nf_conntrack_helper *hlpr;
-+      char *tmpname;
-+
-+      printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+      if (max_outstanding < 1) {
-+              printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
-+              return -EBUSY;
-+      }
-+      if (setup_timeout < 0) {
-+              printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
-+              return -EBUSY;
-+      }
-+
-+      rtsp_buffer = kmalloc(65536, GFP_KERNEL);
-+      if (!rtsp_buffer) 
-+              return -ENOMEM;
-+
-+      /* If no port given, default to standard rtsp port */
-+      if (ports[0] == 0) {
-+              ports[0] = RTSP_PORT;
-+      }
-+
-+      for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
-+              hlpr = &rtsp_helpers[i];
-+              memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
-+              hlpr->tuple.src.u.tcp.port = htons(ports[i]);
-+              hlpr->tuple.dst.protonum = IPPROTO_TCP;
-+              hlpr->max_expected = max_outstanding;
-+              hlpr->timeout = setup_timeout;
-+              hlpr->me = THIS_MODULE;
-+              hlpr->help = help;
-+
-+              tmpname = &rtsp_names[i][0];
-+              if (ports[i] == RTSP_PORT) {
-+                      sprintf(tmpname, "rtsp");
-+              } else {
-+                      sprintf(tmpname, "rtsp-%d", i);
-+              }
-+              hlpr->name = tmpname;
-+
-+              DEBUGP("port #%d: %d\n", i, ports[i]);
-+
-+              ret = nf_conntrack_helper_register(hlpr);
-+
-+              if (ret) {
-+                      printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
-+                      fini();
-+                      return -EBUSY;
-+              }
-+              num_ports++;
-+      }
-+      return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+EXPORT_SYMBOL(nf_nat_rtsp_hook_expectfn);
-+
---- /dev/null
-+++ b/net/ipv4/netfilter/nf_nat_rtsp.c
-@@ -0,0 +1,496 @@
-+/*
-+ * RTSP extension for TCP NAT alteration
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_nat_irc.c
-+ *
-+ *      This 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.
-+ *
-+ * Module load syntax:
-+ *      insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ *                           stunaddr=<address>
-+ *                           destaction=[auto|strip|none]
-+ *
-+ * If no ports are specified, the default will be port 554 only.
-+ *
-+ * stunaddr specifies the address used to detect that a client is using STUN.
-+ * If this address is seen in the destination parameter, it is assumed that
-+ * the client has already punched a UDP hole in the firewall, so we don't
-+ * mangle the client_port.  If none is specified, it is autodetected.  It
-+ * only needs to be set if you have multiple levels of NAT.  It should be
-+ * set to the external address that the STUN clients detect.  Note that in
-+ * this case, it will not be possible for clients to use UDP with servers
-+ * between the NATs.
-+ *
-+ * If no destaction is specified, auto is used.
-+ *   destaction=auto:  strip destination parameter if it is not stunaddr.
-+ *   destaction=strip: always strip destination parameter (not recommended).
-+ *   destaction=none:  do not touch destination parameter (not recommended).
-+ */
-+
-+#include <linux/module.h>
-+#include <net/tcp.h>
-+#include <net/netfilter/nf_nat_helper.h>
-+#include <net/netfilter/nf_nat_rule.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+
-+#include <linux/inet.h>
-+#include <linux/ctype.h>
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0 
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS       8
-+#define DSTACT_AUTO     0
-+#define DSTACT_STRIP    1
-+#define DSTACT_NONE     2
-+
-+static char*    stunaddr = NULL;
-+static char*    destaction = NULL;
-+
-+static u_int32_t extip = 0;
-+static int       dstact = 0;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP network address translation module");
-+MODULE_LICENSE("GPL");
-+module_param(stunaddr, charp, 0644);
-+MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
-+module_param(destaction, charp, 0644);
-+MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*** helper functions ***/
-+
-+static void
-+get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
-+{
-+    struct iphdr*   iph  = ip_hdr(skb);
-+    struct tcphdr*  tcph = (void *)iph + ip_hdrlen(skb);
-+
-+    *pptcpdata = (char*)tcph +  tcph->doff*4;
-+    *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
-+}
-+
-+/*** nat functions ***/
-+
-+/*
-+ * Mangle the "Transport:" header:
-+ *   - Replace all occurences of "client_port=<spec>"
-+ *   - Handle destination parameter
-+ *
-+ * In:
-+ *   ct, ctinfo = conntrack context
-+ *   skb        = packet
-+ *   tranoff    = Transport header offset from TCP data
-+ *   tranlen    = Transport header length (incl. CRLF)
-+ *   rport_lo   = replacement low  port (host endian)
-+ *   rport_hi   = replacement high port (host endian)
-+ *
-+ * Returns packet size difference.
-+ *
-+ * Assumes that a complete transport header is present, ending with CR or LF
-+ */
-+static int
-+rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
-+                 struct nf_conntrack_expect* exp,
-+                                                               struct ip_ct_rtsp_expect* prtspexp,
-+                 struct sk_buff* skb, uint tranoff, uint tranlen)
-+{
-+    char*       ptcp;
-+    uint        tcplen;
-+    char*       ptran;
-+    char        rbuf1[16];      /* Replacement buffer (one port) */
-+    uint        rbuf1len;       /* Replacement len (one port) */
-+    char        rbufa[16];      /* Replacement buffer (all ports) */
-+    uint        rbufalen;       /* Replacement len (all ports) */
-+    u_int32_t   newip;
-+    u_int16_t   loport, hiport;
-+    uint        off = 0;
-+    uint        diff;           /* Number of bytes we removed */
-+
-+    struct nf_conn *ct = exp->master;
-+    struct nf_conntrack_tuple *t;
-+
-+    char    szextaddr[15+1];
-+    uint    extaddrlen;
-+    int     is_stun;
-+
-+    get_skb_tcpdata(skb, &ptcp, &tcplen);
-+    ptran = ptcp+tranoff;
-+
-+    if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
-+        tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+        nf_strncasecmp(ptran, "Transport:", 10) != 0)
-+    {
-+        INFOP("sanity check failed\n");
-+        return 0;
-+    }
-+    off += 10;
-+    SKIP_WSPACE(ptcp+tranoff, tranlen, off);
-+
-+    newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+    t = &exp->tuple;
-+    t->dst.u3.ip = newip;
-+
-+    extaddrlen = extip ? sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(extip))
-+                       : sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(newip));
-+    DEBUGP("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
-+
-+    rbuf1len = rbufalen = 0;
-+    switch (prtspexp->pbtype)
-+    {
-+    case pb_single:
-+        for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+        {
-+            t->dst.u.udp.port = htons(loport);
-+            if (nf_ct_expect_related(exp) == 0)
-+            {
-+                DEBUGP("using port %hu\n", loport);
-+                break;
-+            }
-+        }
-+        if (loport != 0)
-+        {
-+            rbuf1len = sprintf(rbuf1, "%hu", loport);
-+            rbufalen = sprintf(rbufa, "%hu", loport);
-+        }
-+        break;
-+    case pb_range:
-+        for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
-+        {
-+            t->dst.u.udp.port = htons(loport);
-+            if (nf_ct_expect_related(exp) == 0)
-+            {
-+                hiport = loport + ~exp->mask.src.u.udp.port;
-+                DEBUGP("using ports %hu-%hu\n", loport, hiport);
-+                break;
-+            }
-+        }
-+        if (loport != 0)
-+        {
-+            rbuf1len = sprintf(rbuf1, "%hu", loport);
-+            rbufalen = sprintf(rbufa, "%hu-%hu", loport, loport+1);
-+        }
-+        break;
-+    case pb_discon:
-+        for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+        {
-+            t->dst.u.udp.port = htons(loport);
-+            if (nf_ct_expect_related(exp) == 0)
-+            {
-+                DEBUGP("using port %hu (1 of 2)\n", loport);
-+                break;
-+            }
-+        }
-+        for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
-+        {
-+            t->dst.u.udp.port = htons(hiport);
-+            if (nf_ct_expect_related(exp) == 0)
-+            {
-+                DEBUGP("using port %hu (2 of 2)\n", hiport);
-+                break;
-+            }
-+        }
-+        if (loport != 0 && hiport != 0)
-+        {
-+            rbuf1len = sprintf(rbuf1, "%hu", loport);
-+            if (hiport == loport+1)
-+            {
-+                rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
-+            }
-+            else
-+            {
-+                rbufalen = sprintf(rbufa, "%hu/%hu", loport, hiport);
-+            }
-+        }
-+        break;
-+    }
-+
-+    if (rbuf1len == 0)
-+    {
-+        return 0;   /* cannot get replacement port(s) */
-+    }
-+
-+    /* Transport: tran;field;field=val,tran;field;field=val,... */
-+    while (off < tranlen)
-+    {
-+        uint        saveoff;
-+        const char* pparamend;
-+        uint        nextparamoff;
-+
-+        pparamend = memchr(ptran+off, ',', tranlen-off);
-+        pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+        nextparamoff = pparamend-ptcp;
-+
-+        /*
-+         * We pass over each param twice.  On the first pass, we look for a
-+         * destination= field.  It is handled by the security policy.  If it
-+         * is present, allowed, and equal to our external address, we assume
-+         * that STUN is being used and we leave the client_port= field alone.
-+         */
-+        is_stun = 0;
-+        saveoff = off;
-+        while (off < nextparamoff)
-+        {
-+            const char* pfieldend;
-+            uint        nextfieldoff;
-+
-+            pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+            nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+            if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0)
-+            {
-+                if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
-+                {
-+                    is_stun = 1;
-+                }
-+                if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun))
-+                {
-+                    diff = nextfieldoff-off;
-+                    if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+                                                         off, diff, NULL, 0))
-+                    {
-+                        /* mangle failed, all we can do is bail */
-+                      nf_ct_unexpect_related(exp);
-+                        return 0;
-+                    }
-+                    get_skb_tcpdata(skb, &ptcp, &tcplen);
-+                    ptran = ptcp+tranoff;
-+                    tranlen -= diff;
-+                    nextparamoff -= diff;
-+                    nextfieldoff -= diff;
-+                }
-+            }
-+
-+            off = nextfieldoff;
-+        }
-+        if (is_stun)
-+        {
-+            continue;
-+        }
-+        off = saveoff;
-+        while (off < nextparamoff)
-+        {
-+            const char* pfieldend;
-+            uint        nextfieldoff;
-+
-+            pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+            nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+            if (strncmp(ptran+off, "client_port=", 12) == 0)
-+            {
-+                u_int16_t   port;
-+                uint        numlen;
-+                uint        origoff;
-+                uint        origlen;
-+                char*       rbuf    = rbuf1;
-+                uint        rbuflen = rbuf1len;
-+
-+                off += 12;
-+                origoff = (ptran-ptcp)+off;
-+                origlen = 0;
-+                numlen = nf_strtou16(ptran+off, &port);
-+                off += numlen;
-+                origlen += numlen;
-+                if (port != prtspexp->loport)
-+                {
-+                    DEBUGP("multiple ports found, port %hu ignored\n", port);
-+                }
-+                else
-+                {
-+                    if (ptran[off] == '-' || ptran[off] == '/')
-+                    {
-+                        off++;
-+                        origlen++;
-+                        numlen = nf_strtou16(ptran+off, &port);
-+                        off += numlen;
-+                        origlen += numlen;
-+                        rbuf = rbufa;
-+                        rbuflen = rbufalen;
-+                    }
-+
-+                    /*
-+                     * note we cannot just memcpy() if the sizes are the same.
-+                     * the mangle function does skb resizing, checks for a
-+                     * cloned skb, and updates the checksums.
-+                     *
-+                     * parameter 4 below is offset from start of tcp data.
-+                     */
-+                    diff = origlen-rbuflen;
-+                    if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+                                              origoff, origlen, rbuf, rbuflen))
-+                    {
-+                        /* mangle failed, all we can do is bail */
-+                      nf_ct_unexpect_related(exp);
-+                        return 0;
-+                    }
-+                    get_skb_tcpdata(skb, &ptcp, &tcplen);
-+                    ptran = ptcp+tranoff;
-+                    tranlen -= diff;
-+                    nextparamoff -= diff;
-+                    nextfieldoff -= diff;
-+                }
-+            }
-+
-+            off = nextfieldoff;
-+        }
-+
-+        off = nextparamoff;
-+    }
-+
-+    return 1;
-+}
-+
-+static uint
-+help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+       unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp, 
-+       struct nf_conntrack_expect* exp)
-+{
-+    char*   ptcp;
-+    uint    tcplen;
-+    uint    hdrsoff;
-+    uint    hdrslen;
-+    uint    lineoff;
-+    uint    linelen;
-+    uint    off;
-+
-+    //struct iphdr* iph = (struct iphdr*)skb->nh.iph;
-+    //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
-+
-+    get_skb_tcpdata(skb, &ptcp, &tcplen);
-+    hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
-+    hdrslen = matchlen;
-+    off = hdrsoff;
-+    DEBUGP("NAT rtsp help_out\n");
-+
-+    while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen))
-+    {
-+        if (linelen == 0)
-+        {
-+            break;
-+        }
-+        if (off > hdrsoff+hdrslen)
-+        {
-+            INFOP("!! overrun !!");
-+            break;
-+        }
-+        DEBUGP("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+
-+        if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
-+        {
-+            uint oldtcplen = tcplen;
-+          DEBUGP("hdr: Transport\n");
-+            if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, skb, lineoff, linelen))
-+            {
-+              DEBUGP("hdr: Transport mangle failed");
-+                break;
-+            }
-+            get_skb_tcpdata(skb, &ptcp, &tcplen);
-+            hdrslen -= (oldtcplen-tcplen);
-+            off -= (oldtcplen-tcplen);
-+            lineoff -= (oldtcplen-tcplen);
-+            linelen -= (oldtcplen-tcplen);
-+            DEBUGP("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+        }
-+    }
-+
-+    return NF_ACCEPT;
-+}
-+
-+static unsigned int
-+help(struct sk_buff *skb, enum ip_conntrack_info ctinfo, 
-+     unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+     struct nf_conntrack_expect* exp)
-+{
-+    int dir = CTINFO2DIR(ctinfo);
-+    int rc = NF_ACCEPT;
-+
-+    switch (dir)
-+    {
-+    case IP_CT_DIR_ORIGINAL:
-+        rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp, exp);
-+        break;
-+    case IP_CT_DIR_REPLY:
-+      DEBUGP("unmangle ! %u\n", ctinfo);
-+      /* XXX: unmangle */
-+      rc = NF_ACCEPT;
-+        break;
-+    }
-+    //UNLOCK_BH(&ip_rtsp_lock);
-+
-+    return rc;
-+}
-+
-+static void expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
-+{
-+    struct nf_nat_multi_range_compat mr;
-+    u_int32_t newdstip, newsrcip, newip;
-+
-+    struct nf_conn *master = ct->master;
-+
-+    newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+    newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+    //FIXME (how to port that ?)
-+    //code from 2.4 : newip = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) ? newsrcip : newdstip;
-+    newip = newdstip;
-+
-+    DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
-+           NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
-+
-+    mr.rangesize = 1;
-+    // We don't want to manip the per-protocol, just the IPs. 
-+    mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
-+    mr.range[0].min_ip = mr.range[0].max_ip = newip;
-+
-+    nf_nat_setup_info(ct, &mr.range[0], NF_IP_PRE_ROUTING);
-+}
-+
-+
-+static void __exit fini(void)
-+{
-+      nf_nat_rtsp_hook = NULL;
-+        nf_nat_rtsp_hook_expectfn = NULL;
-+      synchronize_net();
-+}
-+
-+static int __init init(void)
-+{
-+      printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+      BUG_ON(nf_nat_rtsp_hook);
-+      nf_nat_rtsp_hook = help;
-+        nf_nat_rtsp_hook_expectfn = &expected;
-+
-+      if (stunaddr != NULL)
-+              extip = in_aton(stunaddr);
-+
-+      if (destaction != NULL) {
-+              if (strcmp(destaction, "auto") == 0)
-+                      dstact = DSTACT_AUTO;
-+
-+              if (strcmp(destaction, "strip") == 0)
-+                      dstact = DSTACT_STRIP;
-+
-+              if (strcmp(destaction, "none") == 0)
-+                      dstact = DSTACT_NONE;
-+      }
-+
-+      return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
diff --git a/target/linux/generic-2.6/patches-2.6.24/200-sched_esfq.patch b/target/linux/generic-2.6/patches-2.6.24/200-sched_esfq.patch
deleted file mode 100644 (file)
index 0596539..0000000
+++ /dev/null
@@ -1,795 +0,0 @@
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -155,8 +155,37 @@ struct tc_sfq_qopt
-  *
-  *    The only reason for this is efficiency, it is possible
-  *    to change these parameters in compile time.
-+ *    
-+ *    If you need to play with these values, use esfq instead.
-  */
-+/* ESFQ section */
-+
-+enum
-+{
-+        /* traditional */
-+      TCA_SFQ_HASH_CLASSIC,
-+      TCA_SFQ_HASH_DST,
-+      TCA_SFQ_HASH_SRC,
-+      TCA_SFQ_HASH_FWMARK,
-+      /* conntrack */
-+      TCA_SFQ_HASH_CTORIGDST,
-+      TCA_SFQ_HASH_CTORIGSRC,
-+      TCA_SFQ_HASH_CTREPLDST,
-+      TCA_SFQ_HASH_CTREPLSRC,
-+      TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+      unsigned        quantum;        /* Bytes per round allocated to flow */
-+      int             perturb_period; /* Period of hash perturbation */
-+      __u32           limit;          /* Maximal packets in queue */
-+      unsigned        divisor;        /* Hash divisor  */
-+      unsigned        flows;          /* Maximal number of flows  */
-+      unsigned        hash_kind;      /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
- enum
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -139,6 +139,37 @@ config NET_SCH_SFQ
-         To compile this code as a module, choose M here: the
-         module will be called sch_sfq.
-+config NET_SCH_ESFQ
-+      tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
-+      ---help---
-+        Say Y here if you want to use the Enhanced Stochastic Fairness
-+        Queueing (ESFQ) packet scheduling algorithm for some of your network
-+        devices or as a leaf discipline for a classful qdisc such as HTB or
-+        CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
-+        references to the SFQ algorithm).
-+
-+        This is an enchanced SFQ version which allows you to control some
-+        hardcoded values in the SFQ scheduler.
-+
-+        ESFQ also adds control of the hash function used to identify packet
-+        flows. The original SFQ discipline hashes by connection; ESFQ add
-+        several other hashing methods, such as by src IP or by dst IP, which
-+        can be more fair to users in some networking situations.
-+        
-+        To compile this code as a module, choose M here: the
-+        module will be called sch_esfq.
-+
-+config NET_SCH_ESFQ_NFCT
-+      bool "Connection Tracking Hash Types"
-+      depends on NET_SCH_ESFQ && NF_CONNTRACK
-+      ---help---
-+        Say Y here to enable support for hashing based on netfilter connection
-+        tracking information. This is useful for a router that is also using
-+        NAT to connect privately-addressed hosts to the Internet. If you want
-+        to provide fair distribution of upstream bandwidth, ESFQ must use
-+        connection tracking information, since all outgoing packets will share
-+        the same source address.
-+
- config NET_SCH_TEQL
-       tristate "True Link Equalizer (TEQL)"
-       ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -23,6 +23,7 @@ obj-$(CONFIG_NET_SCH_GRED)   += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o 
- obj-$(CONFIG_NET_SCH_DSMARK)  += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFQ)     += sch_sfq.o
-+obj-$(CONFIG_NET_SCH_ESFQ)    += sch_esfq.o
- obj-$(CONFIG_NET_SCH_TBF)     += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL)    += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO)    += sch_prio.o
---- /dev/null
-+++ b/net/sched/sch_esfq.c
-@@ -0,0 +1,702 @@
-+/*
-+ * net/sched/sch_esfq.c       Extended Stochastic Fairness Queueing discipline.
-+ *
-+ *            This 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.
-+ *
-+ * Authors:   Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes:   Alexander Atanasov, <alex@ssi.bg>
-+ *            Added dynamic depth,limit,divisor,hash_kind options.
-+ *            Added dst and src hashes.
-+ *
-+ *            Alexander Clouter, <alex@digriz.org.uk>
-+ *            Ported ESFQ to Linux 2.6.
-+ *
-+ *            Corey Hickey, <bugfood-c@fatooh.org>
-+ *            Maintenance of the Linux 2.6 port.
-+ *            Added fwmark hash (thanks to Robert Kurjata).
-+ *            Added usage of jhash.
-+ *            Added conntrack support.
-+ *            Added ctnatchg hash (thanks to Ben Pfountz).
-+ */
-+
-+#include <linux/module.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <linux/bitops.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/in.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/if_ether.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/notifier.h>
-+#include <linux/init.h>
-+#include <net/ip.h>
-+#include <linux/ipv6.h>
-+#include <net/route.h>
-+#include <linux/skbuff.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <linux/jhash.h>
-+#include <net/netfilter/nf_conntrack.h>
-+
-+/*    Stochastic Fairness Queuing algorithm.
-+      For more comments look at sch_sfq.c.
-+      The difference is that you can change limit, depth,
-+      hash table size and choose alternate hash types.
-+      
-+      classic:        same as in sch_sfq.c
-+      dst:            destination IP address
-+      src:            source IP address
-+      fwmark:         netfilter mark value
-+      ctorigdst:      original destination IP address
-+      ctorigsrc:      original source IP address
-+      ctrepldst:      reply destination IP address
-+      ctreplsrc:      reply source IP 
-+      
-+*/
-+
-+#define ESFQ_HEAD 0
-+#define ESFQ_TAIL 1
-+
-+/* This type should contain at least SFQ_DEPTH*2 values */
-+typedef unsigned int esfq_index;
-+
-+struct esfq_head
-+{
-+      esfq_index      next;
-+      esfq_index      prev;
-+};
-+
-+struct esfq_sched_data
-+{
-+/* Parameters */
-+      int             perturb_period;
-+      unsigned        quantum;        /* Allotment per round: MUST BE >= MTU */
-+      int             limit;
-+      unsigned        depth;
-+      unsigned        hash_divisor;
-+      unsigned        hash_kind;
-+/* Variables */
-+      struct timer_list perturb_timer;
-+      int             perturbation;
-+      esfq_index      tail;           /* Index of current slot in round */
-+      esfq_index      max_depth;      /* Maximal depth */
-+
-+      esfq_index      *ht;                    /* Hash table */
-+      esfq_index      *next;                  /* Active slots link */
-+      short           *allot;                 /* Current allotment per slot */
-+      unsigned short  *hash;                  /* Hash value indexed by slots */
-+      struct sk_buff_head     *qs;            /* Slot queue */
-+      struct esfq_head        *dep;           /* Linked list of slots, indexed by depth */
-+};
-+
-+/* This contains the info we will hash. */
-+struct esfq_packet_info
-+{
-+      u32     proto;          /* protocol or port */
-+      u32     src;            /* source from packet header */
-+      u32     dst;            /* destination from packet header */
-+      u32     ctorigsrc;      /* original source from conntrack */
-+      u32     ctorigdst;      /* original destination from conntrack */
-+      u32     ctreplsrc;      /* reply source from conntrack */
-+      u32     ctrepldst;      /* reply destination from conntrack */
-+      u32     mark;           /* netfilter mark (fwmark) */
-+};
-+
-+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
-+{
-+      return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
-+{
-+      return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
-+{
-+      return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
-+{
-+      struct esfq_packet_info info;
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+      enum ip_conntrack_info ctinfo;
-+      struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-+#endif
-+      
-+      switch (skb->protocol) {
-+      case __constant_htons(ETH_P_IP):
-+      {
-+              struct iphdr *iph = ip_hdr(skb);
-+              info.dst = iph->daddr;
-+              info.src = iph->saddr;
-+              if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
-+                  (iph->protocol == IPPROTO_TCP ||
-+                   iph->protocol == IPPROTO_UDP ||
-+                   iph->protocol == IPPROTO_SCTP ||
-+                   iph->protocol == IPPROTO_DCCP ||
-+                   iph->protocol == IPPROTO_ESP))
-+                      info.proto = *(((u32*)iph) + iph->ihl);
-+              else
-+                      info.proto = iph->protocol;
-+              break;
-+      }
-+      case __constant_htons(ETH_P_IPV6):
-+      {
-+              struct ipv6hdr *iph = ipv6_hdr(skb);
-+              /* Hash ipv6 addresses into a u32. This isn't ideal,
-+               * but the code is simple. */
-+              info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
-+              info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
-+              if (iph->nexthdr == IPPROTO_TCP ||
-+                  iph->nexthdr == IPPROTO_UDP ||
-+                  iph->nexthdr == IPPROTO_SCTP ||
-+                  iph->nexthdr == IPPROTO_DCCP ||
-+                  iph->nexthdr == IPPROTO_ESP)
-+                      info.proto = *(u32*)&iph[1];
-+              else
-+                      info.proto = iph->nexthdr;
-+              break;
-+      }
-+      default:
-+              info.dst   = (u32)(unsigned long)skb->dst;
-+              info.src   = (u32)(unsigned long)skb->sk;
-+              info.proto = skb->protocol;
-+      }
-+
-+      info.mark = skb->mark;
-+
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+      /* defaults if there is no conntrack info */
-+      info.ctorigsrc = info.src;
-+      info.ctorigdst = info.dst;
-+      info.ctreplsrc = info.dst;
-+      info.ctrepldst = info.src;
-+      /* collect conntrack info */
-+      if (ct && ct != &nf_conntrack_untracked) {
-+              if (skb->protocol == __constant_htons(ETH_P_IP)) {
-+                      info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+                      info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
-+                      info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
-+                      info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+              }
-+              else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
-+                      /* Again, hash ipv6 addresses into a single u32. */
-+                      info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
-+                      info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
-+                      info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
-+                      info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
-+              }
-+
-+      }
-+#endif
-+
-+      switch(q->hash_kind) {
-+      case TCA_SFQ_HASH_CLASSIC:
-+              return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+      case TCA_SFQ_HASH_DST:
-+              return esfq_jhash_1word(q, info.dst);
-+      case TCA_SFQ_HASH_SRC:
-+              return esfq_jhash_1word(q, info.src);
-+      case TCA_SFQ_HASH_FWMARK:
-+              return esfq_jhash_1word(q, info.mark);
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+      case TCA_SFQ_HASH_CTORIGDST:
-+              return esfq_jhash_1word(q, info.ctorigdst);
-+      case TCA_SFQ_HASH_CTORIGSRC:
-+              return esfq_jhash_1word(q, info.ctorigsrc);
-+      case TCA_SFQ_HASH_CTREPLDST:
-+              return esfq_jhash_1word(q, info.ctrepldst);
-+      case TCA_SFQ_HASH_CTREPLSRC:
-+              return esfq_jhash_1word(q, info.ctreplsrc);
-+      case TCA_SFQ_HASH_CTNATCHG:
-+      {
-+              if (info.ctorigdst == info.ctreplsrc)
-+                      return esfq_jhash_1word(q, info.ctorigsrc);
-+              return esfq_jhash_1word(q, info.ctreplsrc);
-+      }
-+#endif
-+      default:
-+              if (net_ratelimit())
-+                      printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
-+      }
-+      return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+}
-+
-+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
-+{
-+      esfq_index p, n;
-+      int d = q->qs[x].qlen + q->depth;
-+
-+      p = d;
-+      n = q->dep[d].next;
-+      q->dep[x].next = n;
-+      q->dep[x].prev = p;
-+      q->dep[p].next = q->dep[n].prev = x;
-+}
-+
-+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
-+{
-+      esfq_index p, n;
-+
-+      n = q->dep[x].next;
-+      p = q->dep[x].prev;
-+      q->dep[p].next = n;
-+      q->dep[n].prev = p;
-+
-+      if (n == p && q->max_depth == q->qs[x].qlen + 1)
-+              q->max_depth--;
-+
-+      esfq_link(q, x);
-+}
-+
-+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
-+{
-+      esfq_index p, n;
-+      int d;
-+
-+      n = q->dep[x].next;
-+      p = q->dep[x].prev;
-+      q->dep[p].next = n;
-+      q->dep[n].prev = p;
-+      d = q->qs[x].qlen;
-+      if (q->max_depth < d)
-+              q->max_depth = d;
-+
-+      esfq_link(q, x);
-+}
-+
-+static unsigned int esfq_drop(struct Qdisc *sch)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      esfq_index d = q->max_depth;
-+      struct sk_buff *skb;
-+      unsigned int len;
-+
-+      /* Queue is full! Find the longest slot and
-+         drop a packet from it */
-+
-+      if (d > 1) {
-+              esfq_index x = q->dep[d+q->depth].next;
-+              skb = q->qs[x].prev;
-+              len = skb->len;
-+              __skb_unlink(skb, &q->qs[x]);
-+              kfree_skb(skb);
-+              esfq_dec(q, x);
-+              sch->q.qlen--;
-+              sch->qstats.drops++;
-+              sch->qstats.backlog -= len;
-+              return len;
-+      }
-+
-+      if (d == 1) {
-+              /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
-+              d = q->next[q->tail];
-+              q->next[q->tail] = q->next[d];
-+              q->allot[q->next[d]] += q->quantum;
-+              skb = q->qs[d].prev;
-+              len = skb->len;
-+              __skb_unlink(skb, &q->qs[d]);
-+              kfree_skb(skb);
-+              esfq_dec(q, d);
-+              sch->q.qlen--;
-+              q->ht[q->hash[d]] = q->depth;
-+              sch->qstats.drops++;
-+              sch->qstats.backlog -= len;
-+              return len;
-+      }
-+
-+      return 0;
-+}
-+
-+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
-+{
-+      unsigned hash = esfq_hash(q, skb);
-+      unsigned depth = q->depth;
-+      esfq_index x;
-+
-+      x = q->ht[hash];
-+      if (x == depth) {
-+              q->ht[hash] = x = q->dep[depth].next;
-+              q->hash[x] = hash;
-+      }
-+
-+      if (end == ESFQ_TAIL)
-+              __skb_queue_tail(&q->qs[x], skb);
-+      else
-+              __skb_queue_head(&q->qs[x], skb);
-+
-+      esfq_inc(q, x);
-+      if (q->qs[x].qlen == 1) {               /* The flow is new */
-+              if (q->tail == depth) { /* It is the first flow */
-+                      q->tail = x;
-+                      q->next[x] = x;
-+                      q->allot[x] = q->quantum;
-+              } else {
-+                      q->next[x] = q->next[q->tail];
-+                      q->next[q->tail] = x;
-+                      q->tail = x;
-+              }
-+      }
-+}
-+
-+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      esfq_q_enqueue(skb, q, ESFQ_TAIL);
-+      sch->qstats.backlog += skb->len;
-+      if (++sch->q.qlen < q->limit-1) {
-+              sch->bstats.bytes += skb->len;
-+              sch->bstats.packets++;
-+              return 0;
-+      }
-+
-+      sch->qstats.drops++;
-+      esfq_drop(sch);
-+      return NET_XMIT_CN;
-+}
-+
-+
-+static int esfq_requeue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      esfq_q_enqueue(skb, q, ESFQ_HEAD);
-+      sch->qstats.backlog += skb->len;
-+      if (++sch->q.qlen < q->limit - 1) {
-+              sch->qstats.requeues++;
-+              return 0;
-+      }
-+
-+      sch->qstats.drops++;
-+      esfq_drop(sch);
-+      return NET_XMIT_CN;
-+}
-+
-+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
-+{
-+      struct sk_buff *skb;
-+      unsigned depth = q->depth;
-+      esfq_index a, old_a;
-+
-+      /* No active slots */
-+      if (q->tail == depth)
-+              return NULL;
-+      
-+      a = old_a = q->next[q->tail];
-+      
-+      /* Grab packet */
-+      skb = __skb_dequeue(&q->qs[a]);
-+      esfq_dec(q, a);
-+      
-+      /* Is the slot empty? */
-+      if (q->qs[a].qlen == 0) {
-+              q->ht[q->hash[a]] = depth;
-+              a = q->next[a];
-+              if (a == old_a) {
-+                      q->tail = depth;
-+                      return skb;
-+              }
-+              q->next[q->tail] = a;
-+              q->allot[a] += q->quantum;
-+      } else if ((q->allot[a] -= skb->len) <= 0) {
-+              q->tail = a;
-+              a = q->next[a];
-+              q->allot[a] += q->quantum;
-+      }
-+      
-+      return skb;
-+}
-+
-+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      struct sk_buff *skb;
-+
-+      skb = esfq_q_dequeue(q);
-+      if (skb == NULL)
-+              return NULL;
-+      sch->q.qlen--;
-+      sch->qstats.backlog -= skb->len;
-+      return skb;
-+}
-+
-+static void esfq_q_destroy(struct esfq_sched_data *q)
-+{
-+      del_timer(&q->perturb_timer);
-+      if(q->ht)
-+              kfree(q->ht);
-+      if(q->dep)
-+              kfree(q->dep);
-+      if(q->next)
-+              kfree(q->next);
-+      if(q->allot)
-+              kfree(q->allot);
-+      if(q->hash)
-+              kfree(q->hash);
-+      if(q->qs)
-+              kfree(q->qs);
-+}
-+
-+static void esfq_destroy(struct Qdisc *sch)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      esfq_q_destroy(q);
-+}
-+
-+
-+static void esfq_reset(struct Qdisc* sch)
-+{
-+      struct sk_buff *skb;
-+
-+      while ((skb = esfq_dequeue(sch)) != NULL)
-+              kfree_skb(skb);
-+}
-+
-+static void esfq_perturbation(unsigned long arg)
-+{
-+      struct Qdisc *sch = (struct Qdisc*)arg;
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+
-+      q->perturbation = net_random()&0x1F;
-+
-+      if (q->perturb_period) {
-+              q->perturb_timer.expires = jiffies + q->perturb_period;
-+              add_timer(&q->perturb_timer);
-+      }
-+}
-+
-+static unsigned int esfq_check_hash(unsigned int kind)
-+{
-+      switch (kind) {
-+      case TCA_SFQ_HASH_CTORIGDST:
-+      case TCA_SFQ_HASH_CTORIGSRC:
-+      case TCA_SFQ_HASH_CTREPLDST:
-+      case TCA_SFQ_HASH_CTREPLSRC:
-+      case TCA_SFQ_HASH_CTNATCHG:
-+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
-+      {
-+              if (net_ratelimit())
-+                      printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
-+              return TCA_SFQ_HASH_CLASSIC;
-+      }
-+#endif
-+      case TCA_SFQ_HASH_CLASSIC:
-+      case TCA_SFQ_HASH_DST:
-+      case TCA_SFQ_HASH_SRC:
-+      case TCA_SFQ_HASH_FWMARK:
-+              return kind;
-+      default:
-+      {
-+              if (net_ratelimit())
-+                      printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
-+              return TCA_SFQ_HASH_CLASSIC;
-+      }
-+      }
-+}
-+      
-+static int esfq_q_init(struct esfq_sched_data *q, struct rtattr *opt)
-+{
-+      struct tc_esfq_qopt *ctl = RTA_DATA(opt);
-+      esfq_index p = ~0U/2;
-+      int i;
-+      
-+      if (opt && opt->rta_len < RTA_LENGTH(sizeof(*ctl)))
-+              return -EINVAL;
-+
-+      q->perturbation = 0;
-+      q->hash_kind = TCA_SFQ_HASH_CLASSIC;
-+      q->max_depth = 0;
-+      if (opt == NULL) {
-+              q->perturb_period = 0;
-+              q->hash_divisor = 1024;
-+              q->tail = q->limit = q->depth = 128;
-+              
-+      } else {
-+              struct tc_esfq_qopt *ctl = RTA_DATA(opt);
-+              if (ctl->quantum)
-+                      q->quantum = ctl->quantum;
-+              q->perturb_period = ctl->perturb_period*HZ;
-+              q->hash_divisor = ctl->divisor ? : 1024;
-+              q->tail = q->limit = q->depth = ctl->flows ? : 128;
-+              
-+              if ( q->depth > p - 1 )
-+                      return -EINVAL;
-+              
-+              if (ctl->limit)
-+                      q->limit = min_t(u32, ctl->limit, q->depth);
-+              
-+              if (ctl->hash_kind) {
-+                      q->hash_kind = esfq_check_hash(ctl->hash_kind);
-+              }
-+      }
-+      
-+      q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
-+      if (!q->ht)
-+              goto err_case;
-+      q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
-+      if (!q->dep)
-+              goto err_case;
-+      q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
-+      if (!q->next)
-+              goto err_case;
-+      q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
-+      if (!q->allot)
-+              goto err_case;
-+      q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
-+      if (!q->hash)
-+              goto err_case;
-+      q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
-+      if (!q->qs)
-+              goto err_case;
-+      
-+      for (i=0; i< q->hash_divisor; i++)
-+              q->ht[i] = q->depth;
-+      for (i=0; i<q->depth; i++) {
-+              skb_queue_head_init(&q->qs[i]);
-+              q->dep[i+q->depth].next = i+q->depth;
-+              q->dep[i+q->depth].prev = i+q->depth;
-+      }
-+      
-+      for (i=0; i<q->depth; i++)
-+              esfq_link(q, i);
-+      return 0;
-+err_case:
-+      esfq_q_destroy(q);
-+      return -ENOBUFS;
-+}
-+
-+static int esfq_init(struct Qdisc *sch, struct rtattr *opt)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      int err;
-+      
-+      q->quantum = psched_mtu(sch->dev); /* default */
-+      if ((err = esfq_q_init(q, opt)))
-+              return err;
-+
-+      init_timer(&q->perturb_timer);
-+      q->perturb_timer.data = (unsigned long)sch;
-+      q->perturb_timer.function = esfq_perturbation;
-+      if (q->perturb_period) {
-+              q->perturb_timer.expires = jiffies + q->perturb_period;
-+              add_timer(&q->perturb_timer);
-+      }
-+      
-+      return 0;
-+}
-+
-+static int esfq_change(struct Qdisc *sch, struct rtattr *opt)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      struct esfq_sched_data new;
-+      struct sk_buff *skb;
-+      int err;
-+      
-+      /* set up new queue */
-+      memset(&new, 0, sizeof(struct esfq_sched_data));
-+      new.quantum = psched_mtu(sch->dev); /* default */
-+      if ((err = esfq_q_init(&new, opt)))
-+              return err;
-+
-+      /* copy all packets from the old queue to the new queue */
-+      sch_tree_lock(sch);
-+      while ((skb = esfq_q_dequeue(q)) != NULL)
-+              esfq_q_enqueue(skb, &new, ESFQ_TAIL);
-+      
-+      /* clean up the old queue */
-+      esfq_q_destroy(q);
-+
-+      /* copy elements of the new queue into the old queue */
-+      q->perturb_period = new.perturb_period;
-+      q->quantum        = new.quantum;
-+      q->limit          = new.limit;
-+      q->depth          = new.depth;
-+      q->hash_divisor   = new.hash_divisor;
-+      q->hash_kind      = new.hash_kind;
-+      q->tail           = new.tail;
-+      q->max_depth      = new.max_depth;
-+      q->ht    = new.ht;
-+      q->dep   = new.dep;
-+      q->next  = new.next;
-+      q->allot = new.allot;
-+      q->hash  = new.hash;
-+      q->qs    = new.qs;
-+
-+      /* finish up */
-+      if (q->perturb_period) {
-+              q->perturb_timer.expires = jiffies + q->perturb_period;
-+              add_timer(&q->perturb_timer);
-+      } else {
-+              q->perturbation = 0;
-+      }
-+      sch_tree_unlock(sch);
-+      return 0;
-+}
-+
-+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
-+{
-+      struct esfq_sched_data *q = qdisc_priv(sch);
-+      unsigned char *b = skb->tail;
-+      struct tc_esfq_qopt opt;
-+
-+      opt.quantum = q->quantum;
-+      opt.perturb_period = q->perturb_period/HZ;
-+
-+      opt.limit = q->limit;
-+      opt.divisor = q->hash_divisor;
-+      opt.flows = q->depth;
-+      opt.hash_kind = q->hash_kind;
-+
-+      RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
-+      return skb->len;
-+
-+rtattr_failure:
-+      skb_trim(skb, b - skb->data);
-+      return -1;
-+}
-+
-+static struct Qdisc_ops esfq_qdisc_ops =
-+{
-+      .next           =       NULL,
-+      .cl_ops         =       NULL,
-+      .id             =       "esfq",
-+      .priv_size      =       sizeof(struct esfq_sched_data),
-+      .enqueue        =       esfq_enqueue,
-+      .dequeue        =       esfq_dequeue,
-+      .requeue        =       esfq_requeue,
-+      .drop           =       esfq_drop,
-+      .init           =       esfq_init,
-+      .reset          =       esfq_reset,
-+      .destroy        =       esfq_destroy,
-+      .change         =       esfq_change,
-+      .dump           =       esfq_dump,
-+      .owner          =       THIS_MODULE,
-+};
-+
-+static int __init esfq_module_init(void)
-+{
-+      return register_qdisc(&esfq_qdisc_ops);
-+}
-+static void __exit esfq_module_exit(void) 
-+{
-+      unregister_qdisc(&esfq_qdisc_ops);
-+}
-+module_init(esfq_module_init)
-+module_exit(esfq_module_exit)
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/generic-2.6/patches-2.6.24/202-mips-freestanding.patch b/target/linux/generic-2.6/patches-2.6.24/202-mips-freestanding.patch
deleted file mode 100644 (file)
index e8da7e7..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -576,6 +576,9 @@ core-$(CONFIG_TOSHIBA_RBTX4938) += arch/
- cflags-$(CONFIG_TOSHIBA_RBTX4938) += -Iinclude/asm-mips/mach-tx49xx
- load-$(CONFIG_TOSHIBA_RBTX4938) += 0xffffffff80100000
-+# temporary until string.h is fixed
-+cflags-y += -ffreestanding
-+
- cflags-y                      += -Iinclude/asm-mips/mach-generic
- drivers-$(CONFIG_PCI)         += arch/mips/pci/
diff --git a/target/linux/generic-2.6/patches-2.6.24/204-jffs2_eofdetect.patch b/target/linux/generic-2.6/patches-2.6.24/204-jffs2_eofdetect.patch
deleted file mode 100644 (file)
index eccdbe2..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -105,6 +105,17 @@ static int jffs2_build_filesystem(struct
-       dbg_fsbuild("scanned flash completely\n");
-       jffs2_dbg_dump_block_lists_nolock(c);
-+      if (c->flags & (1 << 7)) {
-+              printk("%s(): unlocking the mtd device... ", __func__);
-+              if (c->mtd->unlock)
-+                      c->mtd->unlock(c->mtd, 0, c->mtd->size);
-+              printk("done.\n");
-+              
-+              printk("%s(): erasing all blocks after the end marker... ", __func__);
-+              jffs2_erase_pending_blocks(c, -1);
-+              printk("done.\n");
-+      }
-+
-       dbg_fsbuild("pass 1 starting\n");
-       c->flags |= JFFS2_SB_FLAG_BUILDING;
-       /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -142,9 +142,12 @@ int jffs2_scan_medium(struct jffs2_sb_in
-               /* reset summary info for next eraseblock scan */
-               jffs2_sum_reset_collected(s);
--
--              ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
--                                              buf_size, s);
-+              
-+              if (c->flags & (1 << 7))
-+                      ret = BLK_STATE_ALLFF;
-+              else
-+                      ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+                                                      buf_size, s);
-               if (ret < 0)
-                       goto out;
-@@ -545,6 +548,17 @@ static int jffs2_scan_eraseblock (struct
-                       return err;
-       }
-+      if ((buf[0] == 0xde) &&
-+              (buf[1] == 0xad) &&
-+              (buf[2] == 0xc0) &&
-+              (buf[3] == 0xde)) {
-+              /* end of filesystem. erase everything after this point */
-+              printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+              c->flags |= (1 << 7);
-+
-+              return BLK_STATE_ALLFF;
-+      }
-+      
-       /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
-       ofs = 0;
diff --git a/target/linux/generic-2.6/patches-2.6.24/207-powerpc_asm_segment_h.patch b/target/linux/generic-2.6/patches-2.6.24/207-powerpc_asm_segment_h.patch
deleted file mode 100644 (file)
index 1272e82..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
---- /dev/null
-+++ b/include/asm-powerpc/segment.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/* Only here because we have some old header files that expect it.. */
-+
-+#endif /* _ASM_SEGMENT_H */
diff --git a/target/linux/generic-2.6/patches-2.6.24/208-rtl8110sb_fix.patch b/target/linux/generic-2.6/patches-2.6.24/208-rtl8110sb_fix.patch
deleted file mode 100644 (file)
index 8f99a0e..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/drivers/net/r8169.c
-+++ b/drivers/net/r8169.c
-@@ -1537,7 +1537,7 @@ static const struct rtl_cfg_info {
-               .hw_start       = rtl_hw_start_8169,
-               .region         = 1,
-               .align          = 0,
--              .intr_event     = SYSErr | LinkChg | RxOverflow |
-+              .intr_event     = LinkChg | RxOverflow |
-                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
-               .msi            = 0
-@@ -1546,7 +1546,7 @@ static const struct rtl_cfg_info {
-               .hw_start       = rtl_hw_start_8168,
-               .region         = 2,
-               .align          = 8,
--              .intr_event     = SYSErr | LinkChg | RxOverflow |
-+              .intr_event     = LinkChg | RxOverflow |
-                                 TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = TxErr | TxOK | RxOK | RxOverflow,
-               .msi            = RTL_FEATURE_MSI
-@@ -1555,7 +1555,7 @@ static const struct rtl_cfg_info {
-               .hw_start       = rtl_hw_start_8101,
-               .region         = 2,
-               .align          = 8,
--              .intr_event     = SYSErr | LinkChg | RxOverflow | PCSTimeout |
-+              .intr_event     = LinkChg | RxOverflow | PCSTimeout |
-                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
-               .msi            = RTL_FEATURE_MSI
-@@ -2903,10 +2903,12 @@ static irqreturn_t rtl8169_interrupt(int
-                       break;
-               }
-+#if 0
-               if (unlikely(status & SYSErr)) {
-                       rtl8169_pcierr_interrupt(dev);
-                       break;
-               }
-+#endif
-               if (status & LinkChg)
-                       rtl8169_check_link_status(dev, tp, ioaddr);
diff --git a/target/linux/generic-2.6/patches-2.6.24/209-mini_fo.patch b/target/linux/generic-2.6/patches-2.6.24/209-mini_fo.patch
deleted file mode 100644 (file)
index 511f203..0000000
+++ /dev/null
@@ -1,7776 +0,0 @@
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -468,6 +468,9 @@ config OCFS2_DEBUG_FS
-         this option for debugging only as it is likely to decrease
-         performance of the filesystem.
-+config MINI_FO
-+      tristate "Mini fanout overlay filesystem"
-+
- config MINIX_FS
-       tristate "Minix fs support"
-       help
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -76,6 +76,7 @@ obj-$(CONFIG_SQUASHFS)               += squashfs/
- obj-y                         += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
-+obj-$(CONFIG_MINI_FO)         += mini_fo/
- obj-$(CONFIG_MINIX_FS)                += minix/
- obj-$(CONFIG_FAT_FS)          += fat/
- obj-$(CONFIG_MSDOS_FS)                += msdos/
---- /dev/null
-+++ b/fs/mini_fo/aux.c
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/* check if file exists in storage  */
-+int exists_in_storage(dentry_t *dentry)
-+{
-+      check_mini_fo_dentry(dentry);
-+      if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN)
-+              return 1;
-+      return 0;       
-+}
-+
-+/* check if dentry is in an existing state */
-+int is_mini_fo_existant(dentry_t *dentry) 
-+{
-+      check_mini_fo_dentry(dentry);
-+
-+      if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT)
-+              return 0;
-+      else
-+              return 1;
-+}
-+
-+/* 
-+ * This function will create a negative storage dentry for 
-+ * dentry, what is required for many create like options.
-+ * It will create the storage structure if necessary.
-+ */
-+int get_neg_sto_dentry(dentry_t *dentry) 
-+{
-+      int err = 0;
-+      unsigned int len;
-+      const unsigned char *name;
-+
-+      if(!dentry ||
-+         !dtopd(dentry) ||
-+         !(dtost(dentry) == UNMODIFIED ||
-+           dtost(dentry) == NON_EXISTANT ||
-+           dtost(dentry) == DELETED)) {
-+              printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      /* Have we got a neg. dentry already? */
-+      if(dtohd2(dentry)) {
-+              err = 0;
-+              goto out;
-+      }
-+      if(dtost(dentry->d_parent) == UNMODIFIED) {
-+              /* build sto struct */
-+              err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent);
-+              if(err || 
-+                 dtost(dentry->d_parent) != MODIFIED) {
-+                      printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n");
-+                      err = -1;
-+                      goto out;
-+              }               
-+      }
-+
-+      len = dentry->d_name.len;
-+      name = dentry->d_name.name;
-+       
-+      dtohd2(dentry) = 
-+              lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+
-+ out:
-+      return err;
-+}
-+
-+int check_mini_fo_dentry(dentry_t *dentry)
-+{
-+      ASSERT(dentry != NULL);
-+      ASSERT(dtopd(dentry) != NULL);
-+      ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL));
-+             
-+/*    if(dtost(dentry) == MODIFIED) { */
-+/*            ASSERT(dentry->d_inode != NULL); */
-+/*            ASSERT(dtohd(dentry) != NULL); */
-+/*            ASSERT(dtohd(dentry)->d_inode != NULL); */
-+/*            ASSERT(dtohd2(dentry) != NULL); */
-+/*            ASSERT(dtohd2(dentry)->d_inode != NULL); */
-+/*    } */
-+/*    else if(dtost(dentry) == UNMODIFIED) { */
-+/*            ASSERT(dentry->d_inode != NULL); */
-+/*            ASSERT( */
-+/*    } */
-+      return 0;              
-+}
-+
-+int check_mini_fo_file(file_t *file)
-+{
-+      ASSERT(file != NULL);
-+      ASSERT(ftopd(file) != NULL);
-+      ASSERT(file->f_dentry != NULL);
-+      
-+      /* violent checking, check depending of state and type 
-+       *      if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {}
-+       */
-+      ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL));
-+      return 0;
-+}
-+
-+int check_mini_fo_inode(inode_t *inode)
-+{
-+      ASSERT(inode != NULL);
-+      ASSERT(itopd(inode) != NULL);
-+      ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL));
-+      return 0;
-+}
-+
-+/* 
-+ * will walk a base path as provided by get_mini_fo_bpath and return
-+ * the (hopefully ;-) ) positive dentry of the renamed base dir.
-+ *
-+ * This does some work of path_init.
-+ */
-+dentry_t *bpath_walk(super_block_t *sb, char *bpath) 
-+{
-+      int err;
-+        struct vfsmount *mnt;
-+      struct nameidata nd;
-+
-+      /* be paranoid */
-+      if(!bpath || bpath[0] != '/') {
-+              printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n");
-+              return NULL;
-+      }
-+      if(!sb || !stopd(sb)) {
-+              printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n");
-+              return NULL;
-+      }
-+      
-+      /* fix this: how do I reach this lock? 
-+       * read_lock(&current->fs->lock); */
-+      mnt = mntget(stopd(sb)->hidden_mnt);
-+      /* read_unlock(&current->fs->lock); */
-+      
-+      err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-+
-+      /* validate */
-+      if (err || !nd.dentry || !nd.dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
-+              return NULL;
-+      }
-+      return nd.dentry;
-+}
-+
-+
-+/* returns the full path of the basefile incl. its name */
-+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len)
-+{
-+      char *buf_walker;
-+      int len = 0;
-+      dentry_t *sky_walker;
-+      
-+      if(!dentry || !dtohd(dentry)) {
-+              printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n");
-+              return -1;
-+      }
-+      sky_walker = dtohd(dentry);
-+
-+      do {
-+              len += sky_walker->d_name.len + 1 ; /* 1 for '/' */
-+              sky_walker = sky_walker->d_parent;
-+      } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+      /* 1 to oil the loop */
-+      *bpath = (char*)  kmalloc(len + 1, GFP_KERNEL);
-+      if(!*bpath) {
-+              printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n");
-+              return -1;
-+      }
-+      buf_walker = *bpath+len; /* put it on last char */
-+      *buf_walker = '\n';
-+      sky_walker = dtohd(dentry);
-+      
-+      do {
-+              buf_walker -= sky_walker->d_name.len;
-+              strncpy(buf_walker, 
-+                      sky_walker->d_name.name, 
-+                      sky_walker->d_name.len);
-+              *(--buf_walker) = '/';
-+              sky_walker = sky_walker->d_parent;
-+      } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+      /* bpath_len doesn't count newline! */
-+      *bpath_len = len;
-+      return 0;
-+}
-+
-+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+                  dentry_t *src_dentry, struct vfsmount *src_mnt)
-+{
-+      void *buf;
-+      mm_segment_t old_fs;
-+      file_t *tgt_file;
-+      file_t *src_file;
-+      int bytes, len, tmp, err;
-+      err = 0;
-+
-+      if(!(tgt_dentry->d_inode && src_dentry->d_inode)) {
-+              printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      dget(tgt_dentry);
-+      dget(src_dentry);
-+      mntget(tgt_mnt);
-+      mntget(src_mnt);
-+
-+      /* open file write only */
-+      tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+      if(!tgt_file || IS_ERR(tgt_file)) {
-+              printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
-+              err = PTR_ERR(tgt_file);
-+              goto out_err;
-+      }
-+
-+      /* open file read only */
-+      src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+      if(!src_file || IS_ERR(src_file)) {
-+              printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
-+              err = PTR_ERR(src_file);
-+
-+              /* close target file */
-+              fput(tgt_file);
-+              goto out_err;
-+      }
-+
-+      /* check if the filesystem(s) support read respective write */
-+      if(!src_file->f_op->read || !tgt_file->f_op->write) {
-+              printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n");
-+              err = -EPERM;
-+              goto out_close;
-+      }
-+
-+      /* allocate a page for transfering the data */
-+      buf = (void *) __get_free_page(GFP_KERNEL);
-+      if(!buf) {
-+              printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n");
-+              goto out_err;
-+      }
-+
-+      tgt_file->f_pos = 0;
-+      src_file->f_pos = 0;
-+
-+      old_fs = get_fs();
-+      set_fs(KERNEL_DS);
-+
-+      /* Doing this I assume that a read operation will return a full
-+       * buffer while there is still data to read, and a less than
-+       * full buffer when all data has been read.
-+       */
-+      bytes = len = PAGE_SIZE;
-+      while(bytes == len) {
-+              bytes = src_file->f_op->read(src_file, buf, len, 
-+                                           &src_file->f_pos);
-+              tmp = tgt_file->f_op->write(tgt_file, buf, bytes, 
-+                                          &tgt_file->f_pos);
-+              if(tmp != bytes) {
-+                      printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n");
-+                      goto out_close_unset;
-+              }
-+      }
-+
-+      free_page((unsigned long) buf);
-+      set_fs(old_fs);
-+      fput(tgt_file);
-+      fput(src_file);
-+      goto out;
-+
-+ out_close_unset:
-+      free_page((unsigned long) buf);
-+      set_fs(old_fs);
-+
-+ out_close:
-+      fput(tgt_file);
-+      fput(src_file);
-+
-+ out_err:
-+      dput(tgt_dentry);
-+      dput(src_dentry);
-+
-+      /* mk: not sure if this need to be done */
-+      mntput(tgt_mnt);
-+      mntput(src_mnt);
-+
-+ out:
-+      return err;
-+}
-+
-+/* mk:
-+ * ndl (no-duplicate list) stuff
-+ * This is used in mini_fo_readdir, to save the storage directory contents
-+ * and later when reading base, match them against the list in order
-+ * to avoid duplicates.
-+ */
-+
-+/* add a file specified by name and len to the ndl
-+ * Return values: 0 on success, <0 on failure.
-+ */
-+int ndl_add_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+      struct ndl_entry *tmp_entry;
-+
-+      tmp_entry = (struct ndl_entry *) 
-+              kmalloc(sizeof(struct ndl_entry), GFP_KERNEL);
-+      if(!tmp_entry) {
-+                printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+                return -ENOMEM;
-+        }
-+        tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+        if(!tmp_entry->name) {
-+                printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+                return -ENOMEM;
-+        }
-+      strncpy(tmp_entry->name, name, len);
-+        tmp_entry->len = len;
-+
-+        list_add(&tmp_entry->list, &rd->ndl_list);
-+        rd->ndl_size++;
-+        return 0;
-+}
-+
-+/* delete all list entries and free memory */
-+void ndl_put_list(struct readdir_data *rd)
-+{
-+      struct list_head *tmp;
-+      struct ndl_entry *tmp_entry;
-+
-+      if(rd->ndl_size <= 0)
-+              return;
-+      while(!list_empty(&rd->ndl_list)) {
-+              tmp = rd->ndl_list.next;
-+                list_del(tmp);
-+                tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+              kfree(tmp_entry->name);
-+                kfree(tmp_entry);
-+        }
-+      rd->ndl_size = 0;
-+}
-+
-+/* Check if a file specified by name and len is in the ndl
-+ * Return value: 0 if not in list, 1 if file is found in ndl.
-+ */
-+int ndl_check_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+      struct list_head *tmp;
-+      struct ndl_entry *tmp_entry;
-+
-+      if(rd->ndl_size <= 0)
-+              return 0;
-+
-+      list_for_each(tmp, &rd->ndl_list) {
-+                tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+                if(tmp_entry->len != len)
-+                        continue;
-+                if(!strncmp(tmp_entry->name, name, len))
-+                        return 1;
-+        }
-+        return 0;
-+}
-+
-+/* mk:
-+ * Recursive function to create corresponding directorys in the storage fs.
-+ * The function will build the storage directorys up to dentry.
-+ */
-+int build_sto_structure(dentry_t *dir, dentry_t *dentry)
-+{
-+      int err;
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+
-+      if(dentry->d_parent != dir) {
-+              printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n");
-+              return 1;
-+      }
-+
-+              if(dtost(dir) != MODIFIED) {
-+              err = build_sto_structure(dir->d_parent, dentry->d_parent);
-+              if(err)
-+                      return err;
-+      }
-+
-+      /* ok, coming back again. */
-+      check_mini_fo_dentry(dentry);
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      if(!hidden_sto_dentry) {
-+              /*
-+               * This is the case after creating the first 
-+               * hidden_sto_dentry.
-+               * After one negative storage_dentry, all pointers to 
-+               * hidden_storage dentries are set to NULL. We need to
-+               * create the negative dentry before we create the storage
-+               * file.
-+               */
-+              unsigned int len;
-+              const unsigned char *name;
-+              len = dtohd(dentry)->d_name.len;
-+              name = dtohd(dentry)->d_name.name;
-+              hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+              dtohd2(dentry) = hidden_sto_dentry;
-+      }
-+
-+      /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      /* lets be safe */
-+      if(dtohd2(dir) != hidden_sto_dir_dentry) {
-+              printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n");
-+              return 1;
-+      }
-+
-+      /* check for errors in lock_parent */
-+      err = PTR_ERR(hidden_sto_dir_dentry);
-+      if(IS_ERR(hidden_sto_dir_dentry)) {
-+              printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n");
-+              return err;
-+      }
-+
-+      err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+                      hidden_sto_dentry,
-+                      dir->d_inode->i_mode);
-+
-+      if(err) {
-+              printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n");
-+              /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+              up(&dir->d_inode->i_sem);
-+#endif
-+              dput(dir);
-+              return err;
-+      }
-+      
-+      /* everything ok! */
-+      if(!dtohd2(dentry)->d_inode) {
-+              printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n");
-+              /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+              up(&dir->d_inode->i_sem);
-+#endif
-+              dput(dir);
-+              return 1;
-+      }
-+
-+      /* interpose the new inode and set new state */
-+      itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+      dtopd(dentry)->state = MODIFIED;
-+
-+      /* initalize the wol list */
-+      itopd(dentry->d_inode)->deleted_list_size = -1;
-+      itopd(dentry->d_inode)->renamed_list_size = -1;
-+      meta_build_lists(dentry);
-+      
-+      fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+      fist_copy_attr_timesizes(dir->d_inode, 
-+                               hidden_sto_dir_dentry->d_inode);
-+      dir->d_inode->i_nlink++;
-+      /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+      return 0;
-+}
-+
-+
-+#if 0 /* unused */
-+
-+/*
-+ * Read "len" bytes from "filename" into "buf".
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_read_file(const char *filename, void *buf, int len)
-+{
-+    file_t *filp;
-+    mm_segment_t oldfs;
-+    int bytes;
-+    /* Chroot? Maybe NULL isn't right here */
-+    filp = filp_open(filename, O_RDONLY, 0);
-+    if (!filp || IS_ERR(filp)) {
-+      printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp));
-+      return -1;  /* or do something else */
-+    }
-+
-+    if (!filp->f_op->read)
-+      return -2;  /* file(system) doesn't allow reads */
-+
-+    /* now read len bytes from offset 0 */
-+    filp->f_pos = 0;          /* start offset */
-+    oldfs = get_fs();
-+    set_fs(KERNEL_DS);
-+    bytes = filp->f_op->read(filp, buf, len, &filp->f_pos);
-+    set_fs(oldfs);
-+
-+    /* close the file */
-+    fput(filp);
-+
-+    return bytes;
-+}
-+
-+
-+
-+/*
-+ * Write "len" bytes from "buf" to "filename"
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_write_file(const char *filename, void *buf, int len)
-+{
-+    file_t *filp;
-+    mm_segment_t oldfs;
-+    int bytes;
-+                              /* Chroot? Maybe NULL isn't right here */
-+    filp = filp_open(filename, O_RDWR|O_CREAT, 0640);
-+    if (!filp || IS_ERR(filp)) {
-+      printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp));
-+      return -1;  /* or do something else */
-+    }
-+
-+    if (!filp->f_op->write)
-+      return -2;  /* file(system) doesn't allow writes */
-+
-+    /* now write len bytes from offset 0 */
-+    filp->f_pos = 0;          /* start offset */
-+    oldfs = get_fs();
-+    set_fs(KERNEL_DS);
-+    bytes = filp->f_op->write(filp, buf, len, &filp->f_pos);
-+    set_fs(oldfs);
-+
-+    /* close the file */
-+    fput(filp);
-+
-+    return bytes;
-+}
-+
-+#endif /* unused */
-+
---- /dev/null
-+++ b/fs/mini_fo/ChangeLog
-@@ -0,0 +1,281 @@
-+2006-01-24  Markus Klotzbuecher  <mk@mary.denx.de>
-+
-+      * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to
-+          retain backwards compatibility.
-+      
-+2006-01-24  Ed L. Cashin <ecashin@coraid.com>
-+
-+      * Support for the new mutex infrastructure
-+      (7892f2f48d165a34b0b8130c8a195dfd807b8cb6)
-+
-+2005-10-15  Markus Klotzbuecher  <mk@localhost.localdomain>
-+
-+      * Bugfix for a serious memory leak in mini_fo_follow_link.
-+
-+2005-09-21  Markus Klotzbuecher  <mk@mary>
-+
-+      * new release 0.6.1
-+
-+      * fix of a compiler warning due to changes in 2.6.13
-+
-+2005-09-21  Klaus Wenninger  <klaus.wenninger@siemens.com>
-+
-+      * file.c: readdir: fix for a bug that caused directory entries
-+          to show up twice when using storage filesystems such as
-+          minixfs or pramfs.
-+
-+2005-06-30  Eric Lammerts <eric@lammerts.org>
-+
-+      * fix for an oops when overwriting a binary thats beeing
-+          executed.
-+
-+2005-06-09    <mk@mary>
-+
-+      * Renamed overlay to mini_fo-overlay.
-+
-+      * Added mini_fo-merge script to allow merging of storage and base
-+      after making modifications.
-+
-+2005-05-22  root  <mk@mary>
-+
-+      * Added overlay script that allows to easily mount mini_fo ontop
-+      of a given base directory
-+
-+2005-05-10    <mk@mary>
-+
-+      * inode.c: xattr functions return -EOPNOSUPP instead of
-+          -ENOSUPP, what confuses "ls -l"
-+
-+      * Changed license from LGPL to GPL.
-+
-+2005-05-08  root  <mk@mary>
-+
-+      * Makefile: clean it up and added make install and make
-+          uninstall.
-+      
-+2005-05-06    <mk@mary>
-+
-+      * merged devel branch back to main. [v0-6-0-pre3]
-+
-+      * removed unused files print.c and fist_ioctl. [devel-0-0-18]
-+
-+      * ioctl: removed fist_ioctl stuff, that is not needed for
-+          now.
-+
-+2005-05-03    <mk@mary>
-+
-+      * file.c: simplified mini_fo_open and mini_fo_setattr using
-+          new state changing functions. [devel-0-0-17]
-+
-+      * inode.c: Fixed getattr state bug (see below) in 2.4 function
-+          mini_fo_inode revalidate.
-+
-+      * inode.c: found an other bug in mini_fo_getattr. States are not
-+        reliable in this function, as a file can be opened, unlinked and
-+        the getattr function called. This results in a deleted dentry
-+        with an inode. Fix is to ignore states and simply use the inode
-+        available.
-+
-+2005-04-29    <mk@mary>
-+
-+      * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16]
-+
-+      * file.c: do not use mini_fo_lock so the generic version is
-+          used (I guess).
-+
-+      * inode.c: getattr, never call getattr on lower files, as this
-+          will cause the inum to change.
-+
-+      * inode.c: rename_reg_file renamed to rename_nondir, as it
-+          doesn't matter as long it't not a dir. Removed all
-+          rename_dev_file etc.          
-+
-+      * tagged as devel-0-0-15
-+
-+      * inode.c: added support for chosing support for extended
-+          attrs at compile time by XATTR define in mini_fo.h .
-+
-+      * inode.c: fixed mini_fo_getattr to use mini_fo inode and not
-+          lower again, what avoids inode number changes that confused
-+          rm again. This is the proper solution.
-+
-+2005-04-24    <mk@mary>
-+
-+      * all files: updated Copyright notive to 2005. [devel-0-0-14]
-+
-+      * inode.c: fixed mini_fo_getattr to not change the inode
-+          number, even if lower files change.
-+
-+      * super.c: fixed a bug that caused deleted base file to show
-+          up suddenly after some time, or after creating a special
-+          file. The problem was that after some time or after special
-+          file creating sync_sb_inodes is called by the vfs, that
-+          called our mini_fo_put_inode. There was (wrongly) called
-+          __meta_put_lists, that nuked the lists, although the inode
-+          was going to continue its life. Moving __meta_put_lists to
-+          mini_fo_clear_inode, where an inode is really destroyed,
-+          solved the problem.
-+
-+
-+2005-04-23    <mk@mary>
-+
-+      * state.c, aux.c: more cleaning up and
-+          simplifications. [devel-0-0-13] 
-+
-+      * inode.c: implemented mini_fo_getattr, that was required for
-+          2.6 because inode_revalidate has been remove there, and the
-+        old "du" bug returned.
-+
-+
-+2005-04-20    <mk@mary>
-+
-+      * aux.c: get_neg_sto_dentry(): allow to be called for dentries
-+          in state UNMODIFIED, NON_EXISTANT _and_ DELETED.
-+
-+2005-04-19    <mk@mary>
-+
-+      * Fixed a bug under 2.6 that caused files deleted via mini_fo
-+          not to be deleted properly and therefore the fs filled up
-+          untill no memory was left. [devel-0-0-12]
-+
-+      * Added basic hard link support. This means that creating
-+          hardlinks will work, but existing ones will be treated as
-+          individual files. [devel-0-0-11]
-+
-+2005-04-17    <mk@mary>
-+
-+      * Bugfixes
-+
-+2005-04-13  root  <mk@mary>
-+
-+      * Added file state.c for the state transition
-+          functions. Doesn't work very well yet, though...
-+
-+2005-04-12    <mk@mary>
-+
-+      * Porting to 2.6 started, which is easier than expected, also
-+          due to Olivier previous work.
-+
-+2005-04-08    <mk@mary>
-+
-+      * Fixed the bug that caused du to return invalid sizes of
-+          directory trees. The problem was that
-+          mini_fo_inode_revalidate didn't always copy the attributes
-+          from the base inode properly.
-+
-+2005-04-01  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Merged devel branch back to main trunk and updated the
-+          RELEASE notes. This will be 0-6-0-pre1.
-+
-+2005-03-31  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Fixed some bugs in rename_reg_file, that only showed up in
-+          the kernel compile test. Kernel compiles cleanly ontop of
-+          mini_fo, now also make mrproper etc. work. Seems pretty stable.
-+
-+2005-03-28  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Many, many directory renaming bugfixes and a lot of other
-+          cleanup. Dir renaming seems to work relatively stable.
-+
-+2005-03-22  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Finished implementing lightweight directory renaming. Some
-+          basic testing indicates it works fine.
-+        Next is to implement testcases for the testsuite and confirm
-+          everything is really working ok.
-+
-+2005-03-18  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Finished implementing meta.c stuff required for directory
-+          renaming.
-+
-+2005-03-17  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Fixed all compile warnings + an extremly old bug that
-+          somehow crept in while reworking the wol stuff to the META
-+          system. Turning on -Werror again... :-)
-+
-+      * Fixed some bugs in the new rename_reg_file function.
-+
-+      * Rewrote mini_fo rename and split it into several
-+          subfunctions, that handle the different types
-+          seperately. Rewrote the regular file function aswell, as it
-+          was implemented somewhat inefficient. 
-+
-+2005-03-16  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Implemented new META subsystem, removed old WOL stuff in favor 
-+        if it.
-+
-+      * After some basic testing everything seems ok...
-+
-+2005-03-11  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Renaming a non regular file caused trouble because I always
-+        tried to copy the contents. Now I only do this for regular
-+        files. mini_fo_rename still isn't implemented properly, renaming
-+        of device files, symlinks etc. results in a empty regular file
-+        instead of the proper type.
-+      
-+      * Directory renaming suddenly works! What a surprise! I guess
-+          this is because renaming is implemented as making a copy and
-+          removing the original. Still this might not work
-+          everywhere...
-+
-+2005-03-09  Markus Klotzbuecher  <mk@chasey>
-+
-+      * Bugfix, when a mini_fo directory that exists in storage
-+        (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a
-+        possibly existing WOL file contained in it needs to be
-+        deleted too.
-+
-+      * Starting cleanup: defined state names in order to get rid of
-+          the state numbers.
-+
-+2005-03-08  Markus Klotzbuecher  <mk@chasey>
-+      
-+      * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um
-+
-+      * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 =
-+          DEL_REWRITTEN the hash was calculated from the base dentry,
-+          which was wrong and and caused assertions in
-+          __mini_fo_hidden_dentry to fail.
-+
-+2005-02-21    <mk@mary>
-+
-+      * Implemented directory deleting (inode.c)
-+
-+      * main.c: made mini_fo_parse_options a little more robust.
-+
-+2004-12-22    <mk@mary>
-+
-+      * Makefile cleanup and uml stuff, removed unneccessary files
-+
-+      * Created a new and hopefully more informative README
-+
-+      * CHANGELOG: created a new CHANGELOG and added old entries reversely
-+
-+
-+2004-10-24 Gleb Natapov <gleb@nbase.co.il>
-+
-+      * Fix: owner and group where not correctly copied from base to
-+          storage. 
-+
-+
-+2004-10-05 Gleb Natapov <gleb@nbase.co.il>
-+
-+      * Implementation of fsync, fasync and lock mini_fo functions.
-+      
-+
-+2004-09-29 Bob Lee <bob@pantasys.com>
-+
-+      * Fix of a serious pointer bug
-+      
-+
-+2004-09-28 Gleb Natapov <gleb@nbase.co.il>
-+
-+      * Implementation of mini_fo_mknod and mini_fo_rename, support
-+          for device files.
-+      
---- /dev/null
-+++ b/fs/mini_fo/dentry.c
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/*
-+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise.
-+ */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd)
-+#else
-+mini_fo_d_revalidate(dentry_t *dentry, int flags)
-+#endif
-+{
-+      int err1 = 1; /* valid = 1, invalid = 0 */
-+      int err2 = 1;
-+      dentry_t *hidden_dentry;
-+      dentry_t *hidden_sto_dentry;
-+
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      hidden_dentry  = dtohd(dentry);
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      if(hidden_dentry &&
-+         hidden_dentry->d_op &&
-+         hidden_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd);
-+#else
-+              err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags);
-+#endif
-+      }
-+      if(hidden_sto_dentry &&
-+         hidden_sto_dentry->d_op &&
-+         hidden_sto_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry, 
-+                                                           nd);
-+#else
-+              err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry, 
-+                                                           flags);
-+#endif
-+      }
-+
-+      /* mk: if one of the lower level dentries are valid,
-+       * the mini_fo dentry is too.
-+       */
-+      return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_d_hash(dentry_t *dentry, qstr_t *name)
-+{
-+      int err = 0;
-+      dentry_t *hidden_dentry;
-+      dentry_t *hidden_sto_dentry;
-+
-+      /* hidden_dentry = mini_fo_hidden_dentry(dentry);
-+       * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */
-+
-+      /* state 1, 3, 4, 5: build the hash for the storage dentry */
-+      if((dtopd(dentry)->state == MODIFIED) ||
-+         (dtopd(dentry)->state == CREATED) ||
-+         (dtopd(dentry)->state == DEL_REWRITTEN) ||
-+         (dtopd(dentry)->state == DELETED)) {
-+              hidden_sto_dentry = dtohd2(dentry);
-+              if(hidden_sto_dentry &&
-+                 hidden_sto_dentry->d_op &&
-+                 hidden_sto_dentry->d_op->d_hash) {
-+                      err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+              }
-+              goto out;
-+      }
-+      /* state 2: build the hash for the base dentry */
-+      if(dtopd(dentry)->state == UNMODIFIED) {
-+              hidden_dentry = dtohd(dentry);
-+              if(hidden_dentry &&
-+                 hidden_dentry->d_op &&
-+                 hidden_dentry->d_op->d_hash) {
-+                      err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+              }
-+              goto out;
-+      }
-+      /* state 6: build hash for the dentry that exists */
-+      if(dtopd(dentry)->state == NON_EXISTANT) {
-+              hidden_sto_dentry = dtohd2(dentry);
-+              if(hidden_sto_dentry &&
-+                 hidden_sto_dentry->d_op &&
-+                 hidden_sto_dentry->d_op->d_hash) {
-+                      err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+                      goto out;
-+              }
-+              hidden_dentry = dtohd(dentry);
-+              if(hidden_dentry &&
-+                 hidden_dentry->d_op &&
-+                 hidden_dentry->d_op->d_hash) {
-+                      err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+                      goto out;
-+              }
-+      }
-+
-+      printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n");
-+
-+ out:
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b)
-+{
-+      int err;
-+      dentry_t *hidden_dentry=NULL;
-+
-+      /* hidden_dentry = mini_fo_hidden_dentry(dentry); */
-+      if(dtohd2(dentry))
-+              hidden_dentry = dtohd2(dentry);
-+      else if(dtohd(dentry))
-+              hidden_dentry = dtohd(dentry);
-+
-+      if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) {
-+              err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b);
-+      } else {
-+              err = ((a->len != b->len) || memcmp(a->name, b->name, b->len));
-+      }
-+
-+      return err;
-+}
-+
-+
-+int
-+mini_fo_d_delete(dentry_t *dentry)
-+{
-+      dentry_t *hidden_dentry;
-+      dentry_t *hidden_sto_dentry;
-+      int err = 0;
-+
-+      /* this could be a negative dentry, so check first */
-+      if (!dtopd(dentry)) {
-+              printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n");
-+              goto out;
-+      }
-+      hidden_dentry = dtohd(dentry);
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      if(hidden_dentry) {
-+              if(hidden_dentry->d_op &&
-+                 hidden_dentry->d_op->d_delete) {
-+                      err = hidden_dentry->d_op->d_delete(hidden_dentry);
-+              }
-+      }
-+      if(hidden_sto_dentry) {
-+              if(hidden_sto_dentry->d_op &&
-+                 hidden_sto_dentry->d_op->d_delete) {
-+                      err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry);
-+              }
-+      }
-+
-+ out:
-+      return err;
-+}
-+
-+
-+void
-+mini_fo_d_release(dentry_t *dentry)
-+{
-+      dentry_t *hidden_dentry;
-+      dentry_t *hidden_sto_dentry;
-+
-+
-+      /* this could be a negative dentry, so check first */
-+      if (!dtopd(dentry)) {
-+              printk(KERN_CRIT "mini_fo_d_release: no private data.\n");
-+              goto out;
-+      }
-+      hidden_dentry = dtohd(dentry);
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      if(hidden_dentry) {
-+              /* decrement hidden dentry's counter and free its inode */
-+              dput(hidden_dentry);
-+      }
-+      if(hidden_sto_dentry) {
-+                /* decrement hidden dentry's counter and free its inode */
-+              dput(hidden_sto_dentry);
-+      }
-+
-+      /* free private data (mini_fo_dentry_info) here */
-+      kfree(dtopd(dentry));
-+      __dtopd(dentry) = NULL; /* just to be safe */
-+ out:
-+      return;
-+}
-+
-+
-+/*
-+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if
-+ * mini_fo_d_iput is not defined. We left this implemented for ease of
-+ * tracing/debugging.
-+ */
-+void
-+mini_fo_d_iput(dentry_t *dentry, inode_t *inode)
-+{
-+      iput(inode);
-+}
-+
-+
-+struct dentry_operations mini_fo_dops = {
-+      d_revalidate:   mini_fo_d_revalidate,
-+      d_hash:         mini_fo_d_hash,
-+      d_compare:              mini_fo_d_compare,
-+      d_release:              mini_fo_d_release,
-+      d_delete:               mini_fo_d_delete,
-+      d_iput:         mini_fo_d_iput,
-+};
---- /dev/null
-+++ b/fs/mini_fo/file.c
-@@ -0,0 +1,713 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-+
-+/*******************
-+ * File Operations *
-+ *******************/
-+
-+STATIC loff_t
-+mini_fo_llseek(file_t *file, loff_t offset, int origin)
-+{
-+      loff_t err;
-+      file_t *hidden_file = NULL;
-+
-+      if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+              /* Check if trying to llseek from a directory */
-+              err = -EISDIR;
-+              goto out;
-+      }
-+      if (ftopd(file) != NULL) {
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+              } else {
-+                      hidden_file = ftohf(file);
-+              }
-+      }
-+
-+      /* always set hidden position to this one */
-+      hidden_file->f_pos = file->f_pos;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      memcpy(&(hidden_file->f_ra), 
-+             &(file->f_ra), 
-+             sizeof(struct file_ra_state));
-+#else
-+      if (file->f_reada) { /* update readahead information if needed */
-+              hidden_file->f_reada = file->f_reada;
-+              hidden_file->f_ramax = file->f_ramax;
-+              hidden_file->f_raend = file->f_raend;
-+              hidden_file->f_ralen = file->f_ralen;
-+              hidden_file->f_rawin = file->f_rawin;
-+      }
-+#endif
-+      if (hidden_file->f_op && hidden_file->f_op->llseek)
-+              err = hidden_file->f_op->llseek(hidden_file, offset, origin);
-+      else
-+              err = generic_file_llseek(hidden_file, offset, origin);
-+
-+      if (err < 0)
-+              goto out;
-+
-+      if (err != file->f_pos) {
-+              file->f_pos = err;
-+              // ION maybe this?
-+              //      file->f_pos = hidden_file->f_pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+              file->f_reada = 0;
-+#endif
-+              file->f_version++;
-+      }
-+
-+ out:
-+      return err;
-+}
-+
-+
-+/* mk: fanout capable */
-+STATIC ssize_t
-+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos)
-+{
-+      int err = -EINVAL;
-+      file_t *hidden_file = NULL;
-+      loff_t pos = *ppos;
-+
-+      if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+              /* Check if trying to read from a directory */
-+              /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */
-+              err = -EISDIR;
-+              goto out;
-+      }
-+
-+      if (ftopd(file) != NULL) {
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+              } else {
-+                      hidden_file = ftohf(file);
-+              }
-+      }
-+
-+      if (!hidden_file->f_op || !hidden_file->f_op->read)
-+              goto out;
-+
-+      err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
-+      *ppos = pos;
-+
-+      if (err >= 0) {
-+              /* atime should also be updated for reads of size zero or more */
-+              fist_copy_attr_atime(file->f_dentry->d_inode,
-+                                   hidden_file->f_dentry->d_inode);
-+      }
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+      /*
-+       * MAJOR HACK
-+       * because pread() does not have any way to tell us that it is
-+       * our caller, then we don't know for sure if we have to update
-+       * the file positions.  This hack relies on read() having passed us
-+       * the "real" pointer of its struct file's f_pos field.
-+       */
-+      if (ppos == &file->f_pos)
-+              hidden_file->f_pos = *ppos = pos;
-+      if (hidden_file->f_reada) { /* update readahead information if needed */
-+              file->f_reada = hidden_file->f_reada;
-+              file->f_ramax = hidden_file->f_ramax;
-+              file->f_raend = hidden_file->f_raend;
-+              file->f_ralen = hidden_file->f_ralen;
-+              file->f_rawin = hidden_file->f_rawin;
-+      }
-+#else
-+      memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state));
-+#endif
-+
-+ out:
-+      return err;
-+}
-+
-+
-+/* this mini_fo_write() does not modify data pages! */
-+STATIC ssize_t
-+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+      int err = -EINVAL;
-+      file_t *hidden_file = NULL;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+      loff_t pos = *ppos;
-+
-+      /* mk: fan out: */
-+      if (ftopd(file) != NULL) {
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+              } else {
-+                      /* This is bad! We have no storage file to write to. This
-+                       * should never happen because if a file is opened for
-+                       * writing, a copy should have been made earlier.
-+                       */
-+                      printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n");
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+      }
-+
-+      inode = file->f_dentry->d_inode;
-+      hidden_inode = itohi2(inode);
-+      if(!hidden_inode) {
-+              printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n");
-+              goto out;
-+      }
-+
-+      if (!hidden_file->f_op || !hidden_file->f_op->write)
-+              goto out;
-+
-+      /* adjust for append -- seek to the end of the file */
-+      if (file->f_flags & O_APPEND)
-+              pos = inode->i_size;
-+
-+      err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
-+
-+      /*
-+       * copy ctime and mtime from lower layer attributes
-+       * atime is unchanged for both layers
-+       */
-+      if (err >= 0)
-+              fist_copy_attr_times(inode, hidden_inode);
-+      
-+      *ppos = pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+      /*
-+       * XXX: MAJOR HACK
-+       *
-+       * because pwrite() does not have any way to tell us that it is
-+       * our caller, then we don't know for sure if we have to update
-+       * the file positions.  This hack relies on write() having passed us
-+       * the "real" pointer of its struct file's f_pos field.
-+       */
-+      if (ppos == &file->f_pos)
-+              hidden_file->f_pos = *ppos = pos;
-+#endif
-+      /* update this inode's size */
-+      if (pos > inode->i_size)
-+              inode->i_size = pos;
-+
-+ out:
-+      return err;
-+}
-+
-+/* Global variable to hold a file_t pointer.
-+ * This serves to allow mini_fo_filldir function to know which file is
-+ * beeing read, which is required for two reasons:
-+ *
-+ *   - be able to call wol functions in order to avoid listing deleted
-+ *     base files.
-+ *   - if we're reading a directory which is in state 1, we need to
-+ *     maintain a list (in mini_fo_filldir) of which files allready 
-+ *     have been copied to userspace,to detect files existing in base
-+ *     and storage and not list them twice.
-+ */
-+filldir_t mini_fo_filldir_orig;
-+file_t *mini_fo_filldir_file;
-+
-+/* mainly copied from fs/readdir.c */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+                u64 ino, unsigned int d_type)
-+#else
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+                ino_t ino, unsigned int d_type)
-+#endif
-+{
-+      struct getdents_callback * buf = (struct getdents_callback *) __buf;
-+      file_t* file = mini_fo_filldir_file;
-+
-+      /* In theses states we filter meta files in storage (WOL) */
-+      if(file && (dtopd(file->f_dentry)->state == MODIFIED ||
-+                  dtopd(file->f_dentry)->state == CREATED ||
-+                  dtopd(file->f_dentry)->state == DEL_REWRITTEN)) {
-+
-+              int tmp = strlen(META_FILENAME);
-+              if(tmp  == namlen) {
-+                      if(!strncmp(name, META_FILENAME, namlen))
-+                              return 0;
-+              }
-+      }
-+
-+      /* check if we are merging the contents of storage and base */
-+      if(file && dtopd(file->f_dentry)->state == MODIFIED) {
-+              /* check if we are still reading storage contents, if
-+               * yes, we just save the name of the file for duplicate
-+               * checking later. */
-+
-+              if(!ftopd(file)->rd.sto_done) {
-+                      /* put file into ndl list */
-+                      if(ndl_add_entry(&ftopd(file)->rd, name, namlen))
-+                              printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n");
-+              } else {
-+                      /* check if file has been deleted */
-+                      if(meta_check_d_entry(file->f_dentry, name, namlen))
-+                              return 0;
-+                      
-+                      /* do duplicate checking */
-+                      if(ndl_check_entry(&ftopd(file)->rd, name, namlen))
-+                              return 0;
-+              }
-+      }
-+
-+      return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type);
-+}
-+
-+
-+STATIC int
-+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir)
-+{
-+      int err = 0;/* mk: ??? -ENOTDIR; */
-+      file_t *hidden_file = NULL;
-+      file_t *hidden_sto_file = NULL;
-+      inode_t *inode;
-+      struct getdents_callback *buf;
-+      int oldcount;
-+
-+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA)
-+      struct mini_fo_getdents_callback buf;
-+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */
-+
-+      buf = (struct getdents_callback *) dirent;
-+      oldcount = buf->count;
-+      inode = file->f_dentry->d_inode;
-+      mini_fo_filldir_file = file;
-+      mini_fo_filldir_orig = filldir;
-+
-+      ftopd(file)->rd.sto_done = 0;
-+      do {
-+              if (ftopd(file) != NULL) {
-+                      if(ftohf2(file)) { 
-+                              hidden_sto_file = ftohf2(file);
-+                              err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent);
-+                              file->f_pos = hidden_sto_file->f_pos;
-+                              if (err > 0)
-+                                      fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode);
-+                              /* not finshed yet, we'll be called again */
-+                              if (buf->count != oldcount)
-+                                      break;
-+                      }
-+
-+                      ftopd(file)->rd.sto_done = 1;
-+
-+                      if(ftohf(file)) { 
-+                              hidden_file = ftohf(file);
-+                              err = vfs_readdir(hidden_file, mini_fo_filldir, dirent);
-+                              file->f_pos = hidden_file->f_pos;
-+                              if (err > 0)
-+                                      fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode);
-+                      }
-+
-+              }
-+      } while (0);
-+
-+      /* mk:
-+       * we need to check if all the directory data has been copied to userspace,
-+       * or if we will be called again by userspace to complete the operation.
-+       */
-+      if(buf->count == oldcount) {
-+              ndl_put_list(&ftopd(file)->rd);
-+      }
-+
-+      /* unset this, safe */
-+      mini_fo_filldir_file = NULL;
-+      return err;
-+}
-+
-+
-+STATIC unsigned int
-+mini_fo_poll(file_t *file, poll_table *wait)
-+{
-+      unsigned int mask = DEFAULT_POLLMASK;
-+      file_t *hidden_file = NULL;
-+
-+      if (ftopd(file) != NULL) {
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+              } else {
-+                      hidden_file = ftohf(file);
-+              }
-+      }
-+
-+      if (!hidden_file->f_op || !hidden_file->f_op->poll)
-+              goto out;
-+
-+      mask = hidden_file->f_op->poll(hidden_file, wait);
-+
-+ out:
-+      return mask;
-+}
-+
-+/* FIST-LITE special version of mmap */
-+STATIC int
-+mini_fo_mmap(file_t *file, vm_area_t *vma)
-+{
-+      int err = 0;
-+      file_t *hidden_file = NULL;
-+
-+      /* fanout capability */
-+      if (ftopd(file) != NULL) {
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+              } else {
-+                      hidden_file = ftohf(file);
-+              }
-+      }
-+
-+      ASSERT(hidden_file != NULL);
-+      ASSERT(hidden_file->f_op != NULL);
-+      ASSERT(hidden_file->f_op->mmap != NULL);
-+
-+      vma->vm_file = hidden_file;
-+      err = hidden_file->f_op->mmap(hidden_file, vma);
-+      get_file(hidden_file); /* make sure it doesn't get freed on us */
-+      fput(file);            /* no need to keep extra ref on ours */
-+
-+      return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_open(inode_t *inode, file_t *file)
-+{
-+      int err = 0;
-+      int hidden_flags; 
-+      file_t *hidden_file = NULL;
-+      dentry_t *hidden_dentry = NULL;
-+
-+      /* fanout stuff */
-+      file_t *hidden_sto_file = NULL;
-+      dentry_t *hidden_sto_dentry = NULL;
-+
-+      __ftopd(file) = 
-+              kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL);
-+      if (!ftopd(file)) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      /* init the readdir_helper structure */
-+      INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list);
-+      ftopd(file)->rd.ndl_size = 0;
-+
-+      /* In certain paths this could stay uninitalized and cause trouble */
-+      ftohf(file) = NULL;
-+      ftohf2(file) = NULL;
-+      hidden_flags = file->f_flags;
-+
-+      /* create storage files? */
-+      if(dtost(file->f_dentry) == UNMODIFIED) {
-+              if(!IS_WRITE_FLAG(file->f_flags)) {
-+                      hidden_dentry = dtohd(file->f_dentry);
-+                      dget(hidden_dentry);
-+                      /* dentry_open will decrement mnt refcnt if err.
-+                       * otherwise fput() will do an mntput() for us upon file close. */
-+                      mntget(stopd(inode->i_sb)->hidden_mnt);
-+                      hidden_file = dentry_open(hidden_dentry,
-+                                                stopd(inode->i_sb)->hidden_mnt,
-+                                                hidden_flags);
-+                      if (IS_ERR(hidden_file)) {
-+                              err = PTR_ERR(hidden_file);
-+                              dput(hidden_dentry);
-+                              goto out;
-+                      }
-+                      ftohf(file) = hidden_file;      /* link two files */
-+                      goto out;
-+              }
-+              else {
-+                      if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+                              err = dir_unmod_to_mod(file->f_dentry);
-+                      } else
-+                              err = nondir_unmod_to_mod(file->f_dentry, 1);
-+
-+                      if (err) {
-+                              printk("mini_fo_open: ERROR creating storage file.\n");
-+                              goto out;
-+                      }
-+              }
-+      }
-+      hidden_sto_dentry = dtohd2(file->f_dentry);
-+      dget(hidden_sto_dentry);
-+
-+      if(dtopd(file->f_dentry)->state == MODIFIED) {
-+              /* Directorys are special, interpose on both lower level files */
-+              if(S_ISDIR(itohi(inode)->i_mode)) {
-+                      /* check for invalid file types of lower level files */
-+                      if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) {
-+                              printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n");
-+                              dput(hidden_sto_dentry);
-+                              err = -EINVAL;
-+                              goto out;
-+                      }
-+
-+                      /* lower level directorys are ok, open the base file */
-+                      hidden_dentry = dtohd(file->f_dentry);
-+                      dget(hidden_dentry);
-+
-+                      mntget(stopd(inode->i_sb)->hidden_mnt);
-+                      hidden_file = dentry_open(hidden_dentry,
-+                                                stopd(inode->i_sb)->hidden_mnt,
-+                                                hidden_flags);
-+                      if (IS_ERR(hidden_file)) {
-+                              err = PTR_ERR(hidden_file);
-+                              dput(hidden_dentry);
-+                              dput(hidden_sto_dentry);
-+                              goto out;
-+                      }
-+                      ftohf(file) = hidden_file; /* link the two files */
-+              }
-+      }
-+
-+      if(!exists_in_storage(file->f_dentry)) {
-+              printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n");
-+              err = -EINVAL;
-+              dput(hidden_sto_dentry);
-+
-+              /* If the base file has been opened, we need to close it here */
-+              if(ftohf(file)) {
-+                      if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+                              hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+                              hidden_file->f_op->flush(hidden_file);
-+#endif
-+                      dput(hidden_dentry);
-+              }
-+              goto out;
-+      }
-+
-+      /* ok, now we can safely open the storage file */
-+      mntget(stopd(inode->i_sb)->hidden_mnt2);
-+      hidden_sto_file = dentry_open(hidden_sto_dentry,
-+                                    stopd(inode->i_sb)->hidden_mnt2,
-+                                    hidden_flags);
-+
-+      /* dentry_open dputs the dentry if it fails */
-+      if (IS_ERR(hidden_sto_file)) {
-+              err = PTR_ERR(hidden_sto_file);
-+              /* close base file if open */
-+              if(ftohf(file)) {
-+                      if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+                              hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+                              hidden_file->f_op->flush(hidden_file);
-+#endif
-+                      dput(hidden_dentry);
-+              }
-+              goto out;
-+      }
-+      ftohf2(file) = hidden_sto_file; /* link storage file */
-+      
-+ out:
-+      if (err < 0 && ftopd(file)) {
-+              kfree(ftopd(file));
-+      }
-+      return err;
-+}
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_flush(file_t *file, fl_owner_t id)
-+#else
-+mini_fo_flush(file_t *file)
-+#endif
-+{
-+      int err1 = 0;           /* assume ok (see open.c:close_fp) */
-+      int err2 = 0;
-+      file_t *hidden_file = NULL;
-+      
-+      check_mini_fo_file(file);
-+
-+      /* mk: we don't do any state checking here, as its not worth the time.
-+       * Just flush the lower level files if they exist.
-+       */
-+      if(ftopd(file) != NULL) {
-+              if(ftohf(file) != NULL) {
-+                      hidden_file = ftohf(file);
-+                      if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+                              err1 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+                              err1 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+              }
-+              if(ftohf2(file) != NULL) {
-+                      hidden_file = ftohf2(file);
-+                      if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+                              err2 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+                              err2 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+              }
-+      }
-+      return (err1 | err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_release(inode_t *inode, file_t *file)
-+{
-+      int err = 0;
-+      file_t *hidden_file = NULL;
-+
-+      if (ftopd(file) != NULL) {
-+              if(ftohf(file)) {
-+                      hidden_file = ftohf(file);
-+                      fput(hidden_file);
-+              }
-+              if(ftohf2(file)) {
-+                      hidden_file = ftohf2(file);
-+                      fput(hidden_file);
-+              }
-+              kfree(ftopd(file));
-+      }
-+      return err;
-+}
-+
-+STATIC int
-+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
-+{
-+      int err1 = 0;
-+      int err2 = 0;
-+      file_t *hidden_file = NULL;
-+      dentry_t *hidden_dentry;
-+
-+      check_mini_fo_file(file);
-+
-+      if ((hidden_file = ftohf(file)) != NULL) {
-+              hidden_dentry = dtohd(dentry);
-+              if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+                      mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+                      down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+                      err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+                      mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+                      up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              }
-+      }
-+
-+      if ((hidden_file = ftohf2(file)) != NULL) {
-+              hidden_dentry = dtohd2(dentry);
-+              if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+                      mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+                      down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+                      err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+                      mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+                      up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              }
-+      }
-+      else
-+              goto err;
-+
-+err:
-+      return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_fasync(int fd, file_t *file, int flag)
-+{
-+      int err1 = 0;
-+      int err2 = 0;
-+
-+      file_t *hidden_file = NULL;
-+
-+      check_mini_fo_file(file);
-+
-+      if((hidden_file = ftohf(file)) != NULL) {
-+              err1 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+      }
-+      if((hidden_file = ftohf2(file)) != NULL) {
-+              err2 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+      }
-+      
-+      return (err1 || err2);
-+}
-+
-+
-+
-+struct file_operations mini_fo_dir_fops =
-+      {
-+              read:   generic_read_dir,
-+              write:  mini_fo_write,
-+              readdir: mini_fo_readdir,
-+              poll:   mini_fo_poll,
-+              /* ioctl:       mini_fo_ioctl, */
-+              mmap:   mini_fo_mmap,
-+              open:   mini_fo_open,
-+              flush:  mini_fo_flush,
-+              release: mini_fo_release,
-+              fsync:  mini_fo_fsync,
-+              fasync: mini_fo_fasync,
-+              /* not needed lock:     mini_fo_lock, */
-+              /* not needed: readv */
-+              /* not needed: writev */
-+              /* not implemented: sendpage */
-+              /* not implemented: get_unmapped_area */
-+      };
-+
-+struct file_operations mini_fo_main_fops =
-+      {
-+              llseek: mini_fo_llseek,
-+              read:   mini_fo_read,
-+              write:  mini_fo_write,
-+              readdir: mini_fo_readdir,
-+              poll:   mini_fo_poll,
-+              /* ioctl:       mini_fo_ioctl, */
-+              mmap:   mini_fo_mmap,
-+              open:   mini_fo_open,
-+              flush:  mini_fo_flush,
-+              release: mini_fo_release,
-+              fsync:  mini_fo_fsync,
-+              fasync: mini_fo_fasync,
-+              /* not needed: lock:    mini_fo_lock, */
-+              /* not needed: readv */
-+              /* not needed: writev */
-+              /* not implemented: sendpage */
-+              /* not implemented: get_unmapped_area */
-+      };
---- /dev/null
-+++ b/fs/mini_fo/fist.h
-@@ -0,0 +1,252 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifndef __FIST_H_
-+#define __FIST_H_
-+
-+/*
-+ * KERNEL ONLY CODE:
-+ */
-+#ifdef __KERNEL__
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+#include <linux/autoconf.h>
-+#else
-+#include <linux/config.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#ifdef CONFIG_MODVERSIONS
-+# define MODVERSIONS
-+# include <linux/modversions.h>
-+#endif /* CONFIG_MODVERSIONS */
-+#endif /* KERNEL_VERSION < 2.6.0 */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/stat.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/limits.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#include <linux/locks.h>
-+#else
-+#include <linux/buffer_head.h>
-+#include <linux/pagemap.h>
-+#include <linux/namei.h>
-+#include <linux/module.h>
-+#include <linux/mount.h>
-+#include <linux/page-flags.h>
-+#include <linux/writeback.h>
-+#include <linux/statfs.h>
-+#endif
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/file.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/poll.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
-+#include <linux/xattr.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#include <linux/security.h>
-+#endif
-+
-+#include <linux/swap.h>
-+
-+#include <asm/system.h>
-+/* #include <asm/segment.h> */
-+#include <asm/mman.h>
-+#include <linux/seq_file.h>
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* those mapped to ATTR_* were copied from linux/fs.h */
-+#define FA_MODE               ATTR_MODE
-+#define FA_UID                ATTR_UID
-+#define FA_GID                ATTR_GID
-+#define FA_SIZE               ATTR_SIZE
-+#define FA_ATIME      ATTR_ATIME
-+#define FA_MTIME      ATTR_MTIME
-+#define FA_CTIME      ATTR_CTIME
-+#define FA_ATIME_SET  ATTR_ATIME_SET
-+#define FA_MTIME_SET  ATTR_MTIME_SET
-+#define FA_FORCE      ATTR_FORCE
-+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG
-+
-+/* must be greater than all other ATTR_* flags! */
-+#define FA_NLINK      2048
-+#define FA_BLKSIZE    4096
-+#define FA_BLOCKS     8192
-+#define FA_TIMES      (FA_ATIME|FA_MTIME|FA_CTIME)
-+#define FA_ALL                0
-+
-+/* macros to manage changes between kernels */
-+#define INODE_DATA(i) (&(i)->i_data)
-+
-+#define MIN(x,y) ((x < y) ? (x) : (y))
-+#define MAX(x,y) ((x > y) ? (x) : (y))
-+#define MAXPATHLEN PATH_MAX
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
-+# define lookup_one_len(a,b,c) lookup_one(a,b)
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8)
-+# define generic_file_llseek default_llseek
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */
-+
-+#ifndef SEEK_SET
-+# define SEEK_SET 0
-+#endif /* not SEEK_SET */
-+
-+#ifndef SEEK_CUR
-+# define SEEK_CUR 1
-+#endif /* not SEEK_CUR */
-+
-+#ifndef SEEK_END
-+# define SEEK_END 2
-+#endif /* not SEEK_END */
-+
-+#ifndef DEFAULT_POLLMASK
-+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
-+#endif /* not DEFAULT_POLLMASK */
-+
-+/* XXX: fix this so fistgen generates kfree() code directly */
-+#define kfree_s(a,b) kfree(a)
-+
-+/*
-+ * TYPEDEFS:
-+ */
-+typedef struct dentry dentry_t;
-+typedef struct file file_t;
-+typedef struct inode inode_t;
-+typedef inode_t vnode_t;
-+typedef struct page page_t;
-+typedef struct qstr qstr_t;
-+typedef struct super_block super_block_t;
-+typedef super_block_t vfs_t;
-+typedef struct vm_area_struct vm_area_t;
-+
-+
-+/*
-+ * EXTERNALS:
-+ */
-+
-+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \
-+              str, \
-+              (int) page, \
-+              (int) page->index, \
-+              (PageLocked(page) ? 1 : 0), \
-+              (PageError(page) ? 1 : 0), \
-+              (PageReferenced(page) ? 1 : 0), \
-+              (Page_Uptodate(page) ? 1 : 0), \
-+              (PageDecrAfter(page) ? 1 : 0), \
-+              (PageSlab(page) ? 1 : 0), \
-+              (PageSwapCache(page) ? 1 : 0), \
-+              (PageReserved(page) ? 1 : 0) \
-+              )
-+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__)
-+#if 0
-+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__)
-+#else
-+# define EZKDBG1
-+#endif
-+
-+extern int fist_get_debug_value(void);
-+extern int fist_set_debug_value(int val);
-+#if 0 /* mini_fo doesn't need these */
-+extern void fist_dprint_internal(int level, char *str,...);
-+extern void fist_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_print_inode(char *str, const inode_t *inode);
-+extern void fist_print_file(char *str, const file_t *file);
-+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer);
-+extern void fist_print_page_flags(char *str, page_t *page);
-+extern void fist_print_page_bytes(char *str, page_t *page);
-+extern void fist_print_pte_flags(char *str, const page_t *page);
-+extern void fist_checkinode(inode_t *inode, char *msg);
-+extern void fist_print_sb(char *str, const super_block_t *sb);
-+
-+/* Â§$% by mk: special debug functions */
-+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_mk_print_inode(char *str, const inode_t *inode);
-+
-+extern char *add_indent(void);
-+extern char *del_indent(void);
-+#endif/* mini_fo doesn't need these */
-+
-+
-+#define STATIC
-+#define ASSERT(EX)    \
-+do {  \
-+    if (!(EX)) {      \
-+      printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX,   \
-+             __FILE__, __LINE__, __FUNCTION__);       \
-+      (*((char *)0))=0;       \
-+    } \
-+} while (0)
-+/* same ASSERT, but tell me who was the caller of the function */
-+#define ASSERT2(EX)   \
-+do {  \
-+    if (!(EX)) {      \
-+      printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX,  \
-+             file, line, func);       \
-+      (*((char *)0))=0;       \
-+    } \
-+} while (0)
-+
-+#if 0 /* mini_fo doesn't need these */
-+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args)
-+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args)
-+#define print_entry_location() fist_dprint(4, "%sIN:  %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status)
-+#define print_exit_pointer(status) \
-+do { \
-+  if (IS_ERR(status)) \
-+    fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+  else \
-+    fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+} while (0)
-+#endif/* mini_fo doesn't need these */
-+
-+#endif /* __KERNEL__ */
-+
-+
-+/*
-+ * DEFINITIONS FOR USER AND KERNEL CODE:
-+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest
-+ *  are auto-generated automatically based on the user's .fist file.)
-+ */
-+# define FIST_IOCTL_GET_DEBUG_VALUE   _IOR(0x15, 1, int)
-+# define FIST_IOCTL_SET_DEBUG_VALUE   _IOW(0x15, 2, int)
-+
-+#endif /* not __FIST_H_ */
---- /dev/null
-+++ b/fs/mini_fo/inode.c
-@@ -0,0 +1,1564 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif 
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode)
-+#endif
-+{
-+      int err = 0;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      err = create_sto_reg_file(dentry, mode, nd);
-+#else
-+      err = create_sto_reg_file(dentry, mode);
-+#endif
-+      check_mini_fo_dentry(dentry);
-+      return err;
-+}
-+
-+
-+STATIC dentry_t *
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd)
-+#else
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry)
-+#endif
-+{
-+      int err = 0;
-+      dentry_t *hidden_dir_dentry;
-+      dentry_t *hidden_dentry = NULL;
-+
-+      dentry_t *hidden_sto_dir_dentry;
-+      dentry_t *hidden_sto_dentry = NULL;
-+
-+      /* whiteout flag */
-+      int del_flag = 0; 
-+      char *bpath = NULL;
-+
-+      const char *name;
-+      unsigned int namelen;
-+
-+      /* Don't allow lookups of META-files */
-+      namelen = strlen(META_FILENAME);
-+      if(namelen == dentry->d_name.len) {
-+              if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) {
-+                      err = -ENOENT;
-+                      goto out;
-+              }
-+      }
-+
-+      hidden_dir_dentry = dtohd(dentry->d_parent);
-+      hidden_sto_dir_dentry = dtohd2(dentry->d_parent);
-+
-+      name = dentry->d_name.name;
-+      namelen = dentry->d_name.len;
-+
-+      /* must initialize dentry operations */
-+      dentry->d_op = &mini_fo_dops;
-+
-+      /* setup the del_flag */
-+      del_flag = __meta_check_d_entry(dir, name, namelen);
-+      bpath = __meta_check_r_entry(dir, name, namelen);
-+
-+      /* perform the lookups of base and storage files:
-+       *
-+       * This caused some serious trouble, as a lookup_one_len passing
-+       * a negative dentry oopses. Solution is to only do the lookup
-+       * if the dentry is positive, else we set it to NULL
-+       * More trouble, who said a *_dir_dentry can't be NULL?
-+       */
-+      if(bpath) {
-+              /* Cross-Interposing (C), yeah! */
-+              hidden_dentry = bpath_walk(dir->i_sb, bpath);
-+              if(!hidden_dentry || !hidden_dentry->d_inode) {
-+                      printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n");
-+                      err= -EINVAL;
-+                      goto out;
-+              }
-+              
-+              /* this can be set up safely without fear of spaghetti
-+               * interposing as it is only used for copying times */
-+              hidden_dir_dentry = hidden_dentry->d_parent;
-+              kfree(bpath);
-+      }
-+      else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+              hidden_dentry = 
-+                      lookup_one_len(name, hidden_dir_dentry, namelen);
-+      else
-+              hidden_dentry = NULL;
-+
-+      if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+              hidden_sto_dentry = 
-+                      lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-+      else
-+              hidden_sto_dentry =  NULL;
-+
-+      /* catch error in lookup */
-+      if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-+              /* mk: we need to call dput on the dentry, whose 
-+               * lookup_one_len operation failed, in order to avoid
-+               * unmount trouble.
-+               */
-+              if(IS_ERR(hidden_dentry)) {
-+                      printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n");
-+                      err = PTR_ERR(hidden_dentry);
-+              } else {
-+                      dput(hidden_dentry);
-+              }
-+              if(IS_ERR(hidden_sto_dentry)) {
-+                      printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n");
-+                      err = PTR_ERR(hidden_sto_dentry);
-+              } else {
-+                      dput(hidden_sto_dentry);
-+              }
-+              goto out;
-+      }
-+
-+      /* allocate dentry private data */
-+      __dtopd(dentry) = (struct mini_fo_dentry_info *)
-+              kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+      
-+      if (!dtopd(dentry)) {
-+              err = -ENOMEM;
-+              goto out_dput;
-+      }
-+
-+      /* check for different states of the mini_fo file to be looked up. */
-+      
-+      /* state 1, file has been modified */
-+      if(hidden_dentry && hidden_sto_dentry &&
-+         hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+              /* update parent directory's atime */
-+              fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+
-+              dtopd(dentry)->state = MODIFIED;
-+              dtohd(dentry) = hidden_dentry;
-+              dtohd2(dentry) = hidden_sto_dentry;
-+
-+              err = mini_fo_tri_interpose(hidden_dentry,
-+                                          hidden_sto_dentry,
-+                                          dentry, dir->i_sb, 1);
-+              if (err) {
-+                      printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n");
-+                      goto out_free;
-+              }
-+              goto out;
-+      }
-+      /* state 2, file is unmodified */
-+      if(hidden_dentry && hidden_dentry->d_inode && !del_flag) {
-+
-+              fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+              dtopd(dentry)->state = UNMODIFIED;
-+              dtohd(dentry) = hidden_dentry;
-+              dtohd2(dentry) = hidden_sto_dentry; /* could be negative */
-+
-+              err = mini_fo_tri_interpose(hidden_dentry,
-+                                          hidden_sto_dentry,
-+                                          dentry, dir->i_sb, 1);
-+              if (err) {
-+                      printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n");
-+                      goto out_free;
-+              }
-+              goto out;
-+      }
-+      /* state 3, file has been newly created */
-+      if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+              fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+              dtopd(dentry)->state = CREATED;
-+              dtohd(dentry) = hidden_dentry; /* could be negative */
-+              dtohd2(dentry) = hidden_sto_dentry;
-+
-+              err = mini_fo_tri_interpose(hidden_dentry,
-+                                          hidden_sto_dentry,
-+                                          dentry, dir->i_sb, 1);
-+              if (err) {
-+                      printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n");
-+                      goto out_free;
-+              }
-+              goto out;
-+      }
-+
-+      /* state 4, file has deleted and created again. */
-+      if(hidden_dentry && hidden_sto_dentry &&
-+         hidden_dentry->d_inode && 
-+         hidden_sto_dentry->d_inode && del_flag) {
-+
-+              fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+              dtopd(dentry)->state = DEL_REWRITTEN;
-+              dtohd(dentry) = NULL;
-+              dtohd2(dentry) = hidden_sto_dentry;
-+
-+              err = mini_fo_tri_interpose(NULL,
-+                                          hidden_sto_dentry,
-+                                          dentry, dir->i_sb, 1);
-+              if (err) {
-+                      printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n");
-+                      goto out_free;
-+              }
-+              /* We will never need this dentry again, as the file has been
-+               * deleted from base */
-+              dput(hidden_dentry);
-+              goto out;
-+      }
-+      /* state 5, file has been deleted in base */
-+      if(hidden_dentry && hidden_sto_dentry &&
-+         hidden_dentry->d_inode && 
-+         !hidden_sto_dentry->d_inode && del_flag) {
-+
-+              /* check which parents atime we need for updating */
-+              if(hidden_sto_dir_dentry->d_inode)
-+                      fist_copy_attr_atime(dir, 
-+                                           hidden_sto_dir_dentry->d_inode);
-+              else
-+                      fist_copy_attr_atime(dir, 
-+                                           hidden_dir_dentry->d_inode);
-+
-+              dtopd(dentry)->state = DELETED;
-+              dtohd(dentry) = NULL;
-+              dtohd2(dentry) = hidden_sto_dentry;
-+
-+              /* add negative dentry to dcache to speed up lookups */
-+              d_add(dentry, NULL);
-+              dput(hidden_dentry);
-+              goto out;
-+      }
-+      /* state 6, file does not exist */
-+      if(((hidden_dentry && !hidden_dentry->d_inode) ||
-+          (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag)
-+              {
-+                      /* check which parents atime we need for updating */
-+                      if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+                              fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+                      else
-+                              fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+                      dtopd(dentry)->state = NON_EXISTANT;
-+                      dtohd(dentry) = hidden_dentry;
-+                      dtohd2(dentry) = hidden_sto_dentry;
-+                      d_add(dentry, NULL);
-+                      goto out;
-+              }
-+
-+      /* if we get to here, were in an invalid state. bad. */
-+      printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n");
-+
-+      /* end state checking */
-+ out_free:
-+      d_drop(dentry);         /* so that our bad dentry will get destroyed */
-+      kfree(dtopd(dentry));
-+      __dtopd(dentry) = NULL; /* be safe */
-+
-+ out_dput:
-+      if(hidden_dentry)
-+              dput(hidden_dentry);
-+      if(hidden_sto_dentry)
-+              dput(hidden_sto_dentry); /* drops usage count and marks for release */
-+
-+ out:
-+      /* initalize wol if file exists and is directory */
-+      if(dentry->d_inode) {
-+              if(S_ISDIR(dentry->d_inode->i_mode)) {
-+                      itopd(dentry->d_inode)->deleted_list_size = -1;
-+                      itopd(dentry->d_inode)->renamed_list_size = -1;
-+                      meta_build_lists(dentry);
-+              }
-+      }
-+      return ERR_PTR(err);
-+}
-+
-+
-+STATIC int
-+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry)
-+{
-+      int err;
-+      dentry_t *hidden_old_dentry;
-+      dentry_t *hidden_new_dentry;
-+      dentry_t *hidden_dir_dentry;
-+
-+
-+      check_mini_fo_dentry(old_dentry);
-+      check_mini_fo_dentry(new_dentry);
-+      check_mini_fo_inode(dir);
-+
-+      /* no links to directorys and existing targets target allowed */
-+      if(S_ISDIR(old_dentry->d_inode->i_mode) ||
-+         is_mini_fo_existant(new_dentry)) {
-+              err = -EPERM;
-+              goto out;
-+      }
-+
-+      /* bring it directly from unmod to del_rew */
-+      if(dtost(old_dentry) == UNMODIFIED) {
-+              err = nondir_unmod_to_mod(old_dentry, 1);
-+              if(err) {
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+              err = meta_add_d_entry(old_dentry->d_parent,
-+                                     old_dentry->d_name.name,
-+                                     old_dentry->d_name.len);
-+              if(err) {
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+              dput(dtohd(old_dentry));
-+              dtohd(old_dentry) = NULL;
-+              dtost(old_dentry) = DEL_REWRITTEN;
-+      }
-+      
-+      err = get_neg_sto_dentry(new_dentry);
-+      if(err) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      hidden_old_dentry = dtohd2(old_dentry);
-+      hidden_new_dentry = dtohd2(new_dentry);
-+
-+      dget(hidden_old_dentry);
-+      dget(hidden_new_dentry);
-+
-+      /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */
-+      hidden_dir_dentry = dget(hidden_new_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+      err = vfs_link(hidden_old_dentry,
-+                     hidden_dir_dentry->d_inode,
-+                     hidden_new_dentry);
-+      if (err || !hidden_new_dentry->d_inode)
-+              goto out_lock;
-+
-+      dtost(new_dentry) = CREATED;
-+      err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0);
-+      if (err)
-+              goto out_lock;
-+
-+      fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode);
-+      /* propagate number of hard-links */
-+      old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink;
-+
-+ out_lock:
-+      /* was: unlock_dir(hidden_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_dir_dentry);
-+
-+      dput(hidden_new_dentry);
-+      dput(hidden_old_dentry);
-+      if (!new_dentry->d_inode)
-+              d_drop(new_dentry);
-+
-+ out:
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_unlink(inode_t *dir, dentry_t *dentry)
-+{
-+      int err = 0;
-+
-+      dget(dentry);
-+      if(dtopd(dentry)->state == MODIFIED) {
-+              err = nondir_mod_to_del(dentry);
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == UNMODIFIED) {
-+              err = nondir_unmod_to_del(dentry);
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == CREATED) {
-+              err = nondir_creat_to_del(dentry);
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+              err = nondir_del_rew_to_del(dentry);
-+              goto out;
-+      }
-+
-+      printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n");
-+
-+ out:
-+      fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+
-+      if(!err) {
-+              /* is this causing my pain? d_delete(dentry); */
-+              d_drop(dentry);
-+      }
-+
-+      dput(dentry);
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
-+{
-+      int err=0;
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+        umode_t mode;
-+#endif
-+
-+      /* Fail if the symlink file exists */
-+      if(!(dtost(dentry) == DELETED || 
-+           dtost(dentry) == NON_EXISTANT)) {
-+              err = -EEXIST;
-+              goto out;
-+      }
-+
-+      err = get_neg_sto_dentry(dentry);
-+      if(err) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      dget(hidden_sto_dentry);
-+      /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      mode = S_IALLUGO;
-+      err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+                        hidden_sto_dentry, symname, mode);
-+#else
-+      err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+                        hidden_sto_dentry,
-+                        symname);
-+#endif
-+      if (err || !hidden_sto_dentry->d_inode)
-+                goto out_lock;
-+
-+        if(dtost(dentry) == DELETED) {
-+                dtost(dentry) = DEL_REWRITTEN;
-+                err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+                if(err)
-+                        goto out_lock;
-+        } else if(dtost(dentry) == NON_EXISTANT) {
-+                dtost(dentry) = CREATED;
-+                err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+                if(err)
-+                        goto out_lock;
-+        }
-+      fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+      
-+ out_lock:
-+        /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+
-+        dput(hidden_sto_dentry);
-+        if (!dentry->d_inode)
-+                d_drop(dentry);
-+ out:
-+        return err;
-+}
-+
-+STATIC int
-+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode)
-+{
-+      int err;
-+
-+      err = create_sto_dir(dentry, mode);
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rmdir(inode_t *dir, dentry_t *dentry)
-+{
-+      int err = 0;
-+      
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+      dentry_t *meta_dentry;
-+      inode_t *hidden_sto_dir = NULL;
-+
-+      check_mini_fo_dentry(dentry);
-+      check_mini_fo_inode(dir);
-+
-+      dget(dentry);
-+      if(dtopd(dentry)->state == MODIFIED) {
-+              /* XXX: disabled, because it does not bother to check files on
-+               * the original filesystem - just a hack, but better than simply
-+               * removing it without testing */
-+              err = -EINVAL;
-+              goto out;
-+
-+              hidden_sto_dir = itohi2(dir);
-+              hidden_sto_dentry = dtohd2(dentry);
-+
-+              /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+              hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+              /* Delete an old WOL file contained in the storage dir */
-+              meta_dentry = lookup_one_len(META_FILENAME, 
-+                                           hidden_sto_dentry, 
-+                                           strlen(META_FILENAME));
-+              if(meta_dentry->d_inode) {
-+                      err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
-+                      dput(meta_dentry);
-+                      if(!err)
-+                              d_delete(meta_dentry);
-+              }
-+
-+              err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+              dput(hidden_sto_dentry);
-+              if(!err)
-+                      d_delete(hidden_sto_dentry);
-+
-+              /* propagate number of hard-links */
-+              dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+              dput(dtohd(dentry));
-+              
-+              dtohd(dentry) = NULL;
-+              dtopd(dentry)->state = DELETED;
-+
-+              /* carefull with R files */
-+              if( __meta_is_r_entry(dir, 
-+                                    dentry->d_name.name, 
-+                                    dentry->d_name.len) == 1) {
-+                      err = meta_remove_r_entry(dentry->d_parent, 
-+                                                dentry->d_name.name,
-+                                                dentry->d_name.len);
-+                      if(err) {
-+                              printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n");
-+                              goto out;
-+                      }
-+              }
-+              else {
-+                      /* ok, add deleted file to META */              
-+                      meta_add_d_entry(dentry->d_parent, 
-+                                       dentry->d_name.name, 
-+                                       dentry->d_name.len);
-+              }
-+              /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+              dput(hidden_sto_dir_dentry);
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == UNMODIFIED) {
-+              /* XXX: simply adding it to the delete list here is fscking dangerous!
-+               * as a temporary hack, i will disable rmdir on unmodified directories 
-+               * for now.
-+               */
-+              err = -EINVAL;
-+              goto out;
-+
-+              err = get_neg_sto_dentry(dentry);
-+              if(err) {
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+              
-+              /* dput base dentry, this will relase the inode and free the
-+               * dentry, as we will never need it again. */
-+              dput(dtohd(dentry));
-+              dtohd(dentry) = NULL;
-+              dtopd(dentry)->state = DELETED;
-+
-+              /* add deleted file to META-file */
-+              meta_add_d_entry(dentry->d_parent, 
-+                               dentry->d_name.name, 
-+                               dentry->d_name.len);
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == CREATED) {
-+              hidden_sto_dir = itohi2(dir);
-+              hidden_sto_dentry = dtohd2(dentry);
-+
-+              /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+              hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+              /* Delete an old WOL file contained in the storage dir */
-+              meta_dentry = lookup_one_len(META_FILENAME, 
-+                                           hidden_sto_dentry, 
-+                                           strlen(META_FILENAME));
-+              if(meta_dentry->d_inode) {
-+                      /* is this necessary? dget(meta_dentry); */
-+                      err = vfs_unlink(hidden_sto_dentry->d_inode, 
-+                                       meta_dentry);
-+                      dput(meta_dentry);
-+                      if(!err)
-+                              d_delete(meta_dentry);
-+              }
-+
-+              err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+              dput(hidden_sto_dentry);
-+              if(!err)
-+                      d_delete(hidden_sto_dentry);
-+
-+              /* propagate number of hard-links */
-+              dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+              dtopd(dentry)->state = NON_EXISTANT;
-+
-+              /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+              dput(hidden_sto_dir_dentry);
-+
-+              goto out;
-+      }
-+      else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+              hidden_sto_dir = itohi2(dir);
-+              hidden_sto_dentry = dtohd2(dentry);
-+
-+              /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+              hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+              /* Delete an old WOL file contained in the storage dir */
-+              meta_dentry = lookup_one_len(META_FILENAME, 
-+                                           hidden_sto_dentry, 
-+                                           strlen(META_FILENAME));
-+              if(meta_dentry->d_inode) {
-+                      /* is this necessary? dget(meta_dentry); */
-+                      err = vfs_unlink(hidden_sto_dentry->d_inode,
-+                                       meta_dentry);
-+                      dput(meta_dentry);
-+                      if(!err)
-+                              d_delete(meta_dentry);
-+              }
-+
-+              err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+              dput(hidden_sto_dentry);
-+              if(!err)
-+                      d_delete(hidden_sto_dentry);
-+
-+              /* propagate number of hard-links */
-+              dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+              dtopd(dentry)->state = DELETED;
-+              /* was: unlock_dir(hidden_sto_dir_dentry); */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+              dput(hidden_sto_dir_dentry);
-+              goto out;
-+      }
-+
-+      printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n");
-+
-+ out:
-+      if(!err) {
-+              d_drop(dentry);
-+      }
-+              
-+      fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+      dput(dentry);
-+
-+      return err;
-+}
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev)
-+#else
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+      int err = 0;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      err = create_sto_nod(dentry, mode, dev);
-+      if(err) {
-+              printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n");
-+              err = -EINVAL;
-+      }
-+      
-+      check_mini_fo_dentry(dentry);
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry,
-+             inode_t *new_dir, dentry_t *new_dentry)
-+{
-+      /* dispatch */
-+      if(S_ISDIR(old_dentry->d_inode->i_mode))
-+              return rename_directory(old_dir, old_dentry, new_dir, new_dentry);
-+      return rename_nondir(old_dir, old_dentry, new_dir, new_dentry);
-+      
-+}
-+
-+int rename_directory(inode_t *old_dir, dentry_t *old_dentry,
-+                   inode_t *new_dir, dentry_t *new_dentry)
-+{
-+      int err, bpath_len;
-+      char *bpath;
-+
-+      dentry_t *hidden_old_dentry;
-+      dentry_t *hidden_new_dentry;
-+      dentry_t *hidden_old_dir_dentry;
-+      dentry_t *hidden_new_dir_dentry;
-+
-+      err = 0;
-+      bpath = NULL;
-+      bpath_len = 0;
-+
-+      /* this is a test, chuck out if it works */
-+      if(!(dtopd(new_dentry)->state == DELETED ||
-+           dtopd(new_dentry)->state == NON_EXISTANT)) {
-+              printk(KERN_CRIT "mini_fo: rename_directory: \
-+                                  uh, ah, new_dentry not negative.\n");
-+              /* return -1; */
-+      }
-+      
-+      /* state = UNMODIFIED */
-+      if(dtopd(old_dentry)->state == UNMODIFIED) {
-+              err = dir_unmod_to_mod(old_dentry);
-+              if (err) 
-+                      goto out;
-+      }
-+
-+      /* state = MODIFIED */
-+      if(dtopd(old_dentry)->state == MODIFIED) {
-+              bpath = meta_check_r_entry(old_dentry->d_parent, 
-+                                         old_dentry->d_name.name,
-+                                         old_dentry->d_name.len);
-+              if(bpath) {
-+                      err = meta_remove_r_entry(old_dentry->d_parent,
-+                                                old_dentry->d_name.name,
-+                                                old_dentry->d_name.len);
-+                      if(err) {
-+                              printk(KERN_CRIT "mini_fo: rename_directory:\
-+                                                   meta_remove_r_entry \
-+                                                  failed.\n");
-+                              goto out;
-+                      }
-+                      err = meta_add_r_entry(new_dentry->d_parent,
-+                                             bpath,
-+                                             strlen(bpath),
-+                                             new_dentry->d_name.name,
-+                                             new_dentry->d_name.len);
-+                      kfree(bpath);
-+              }
-+              else {/* wol it */
-+                      err = meta_add_d_entry(old_dentry->d_parent, 
-+                                             old_dentry->d_name.name,
-+                                             old_dentry->d_name.len);
-+                      if (err) 
-+                              goto out;
-+                      /* put it on rename list */
-+                      err = get_mini_fo_bpath(old_dentry,
-+                                              &bpath, 
-+                                              &bpath_len);
-+                      if (err) 
-+                              goto out;
-+                      err = meta_add_r_entry(new_dentry->d_parent,
-+                                             bpath, bpath_len,
-+                                             new_dentry->d_name.name,
-+                                             new_dentry->d_name.len);
-+                      if (err) 
-+                              goto out;
-+              }
-+              /* no state change, MODIFIED stays MODIFIED */
-+      }
-+      /* state = CREATED */
-+      if(dtopd(old_dentry)->state == CREATED ||
-+         dtopd(old_dentry)->state == DEL_REWRITTEN) {
-+              if(dtohd(old_dentry))
-+                      dput(dtohd(old_dentry));
-+              
-+              if(dtopd(new_dentry)->state == DELETED) {
-+                      dtopd(old_dentry)->state = DEL_REWRITTEN;
-+                      dtohd(old_dentry) = NULL;
-+              } 
-+              else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+                      dtopd(old_dentry)->state = CREATED;
-+                      /* steal new dentry's neg. base dentry */
-+                      dtohd(old_dentry) = dtohd(new_dentry);
-+                      dtohd(new_dentry) = NULL;
-+              }
-+      }               
-+      if(dtopd(new_dentry)->state == UNMODIFIED ||
-+         dtopd(new_dentry)->state == NON_EXISTANT) {
-+              err = get_neg_sto_dentry(new_dentry);
-+              if(err)
-+                      goto out;
-+      }
-+                      
-+      /* now move sto file */
-+      hidden_old_dentry = dtohd2(old_dentry);
-+      hidden_new_dentry = dtohd2(new_dentry);
-+      
-+      dget(hidden_old_dentry);
-+      dget(hidden_new_dentry);
-+      
-+      hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+      hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+      double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+      
-+      err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry,
-+                       hidden_new_dir_dentry->d_inode, hidden_new_dentry);
-+      if(err)
-+              goto out_lock;
-+      
-+      fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+      if (new_dir != old_dir)
-+              fist_copy_attr_all(old_dir, 
-+                                 hidden_old_dir_dentry->d_inode);
-+      
-+ out_lock:
-+      /* double_unlock will dput the new/old parent dentries
-+       * whose refcnts were incremented via get_parent above. */
-+      double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+      dput(hidden_new_dentry);
-+      dput(hidden_old_dentry);
-+      
-+ out:
-+      return err;
-+}
-+
-+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry,
-+                inode_t *new_dir, dentry_t *new_dentry)
-+{
-+      int err=0;
-+
-+      check_mini_fo_dentry(old_dentry);
-+      check_mini_fo_dentry(new_dentry);
-+      check_mini_fo_inode(old_dir);
-+      check_mini_fo_inode(new_dir);
-+
-+      /* state: UNMODIFIED */
-+      if(dtost(old_dentry) == UNMODIFIED) {
-+              err = nondir_unmod_to_mod(old_dentry, 1);
-+              if(err) {
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+      }
-+
-+      /* the easy states */
-+      if(exists_in_storage(old_dentry)) {
-+              
-+              dentry_t *hidden_old_dentry;
-+              dentry_t *hidden_new_dentry;
-+              dentry_t *hidden_old_dir_dentry;
-+              dentry_t *hidden_new_dir_dentry;
-+
-+              /* if old file is MODIFIED, add it to the deleted_list */
-+              if(dtopd(old_dentry)->state == MODIFIED) {
-+                      meta_add_d_entry(old_dentry->d_parent,
-+                                       old_dentry->d_name.name,
-+                                       old_dentry->d_name.len);
-+
-+                      dput(dtohd(old_dentry));
-+              }
-+              /* if old file is CREATED, we only release the base dentry */
-+              if(dtopd(old_dentry)->state == CREATED) {
-+                      if(dtohd(old_dentry))
-+                              dput(dtohd(old_dentry));
-+              }
-+
-+              /* now setup the new states (depends on new_dentry state) */
-+              /* new dentry state =  MODIFIED */
-+              if(dtopd(new_dentry)->state == MODIFIED) {
-+                      meta_add_d_entry(new_dentry->d_parent,
-+                                       new_dentry->d_name.name,
-+                                       new_dentry->d_name.len);
-+
-+                      /* new dentry will be d_put'ed later by the vfs
-+                       * so don't do it here
-+                       * dput(dtohd(new_dentry));
-+                       */
-+                      dtohd(old_dentry) = NULL;
-+                      dtopd(old_dentry)->state = DEL_REWRITTEN;
-+              }
-+              /* new dentry state =  UNMODIFIED */
-+              else if(dtopd(new_dentry)->state == UNMODIFIED) {
-+                      if(get_neg_sto_dentry(new_dentry))
-+                              return -EINVAL;
-+
-+                      meta_add_d_entry(new_dentry->d_parent,
-+                                       new_dentry->d_name.name,
-+                                       new_dentry->d_name.len);
-+
-+                      /* is this right??? */
-+                      /*dput(dtohd(new_dentry));*/
-+                      dtohd(old_dentry) = NULL;
-+                      dtopd(old_dentry)->state = DEL_REWRITTEN;
-+              }
-+              /* new dentry state =  CREATED */
-+              else if(dtopd(new_dentry)->state == CREATED) {
-+                      /* we keep the neg. base dentry (if exists) */
-+                      dtohd(old_dentry) = dtohd(new_dentry);
-+                      /* ...and set it to Null, or we'll get
-+                       * dcache.c:345 if it gets dput twice... */
-+                      dtohd(new_dentry) = NULL;
-+                      dtopd(old_dentry)->state = CREATED;
-+              }
-+              /* new dentry state =  NON_EXISTANT */
-+              else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+                      if(get_neg_sto_dentry(new_dentry))
-+                              return -EINVAL;
-+
-+                      /* we keep the neg. base dentry (if exists) */
-+                      dtohd(old_dentry) = dtohd(new_dentry);
-+                      /* ...and set it to Null, or we'll get 
-+                       * Dr. dcache.c:345 if it gets dput twice... */
-+                      dtohd(new_dentry) = NULL;
-+                      dtopd(old_dentry)->state = CREATED;
-+              }
-+              /* new dentry state =  DEL_REWRITTEN or DELETED */
-+              else if(dtopd(new_dentry)->state == DEL_REWRITTEN ||
-+                      dtopd(new_dentry)->state == DELETED) {
-+                      dtohd(old_dentry) = NULL;
-+                      dtopd(old_dentry)->state = DEL_REWRITTEN;
-+              }
-+              else { /* not possible, uhh, ahh */
-+                      printk(KERN_CRIT 
-+                             "mini_fo: rename_reg_file: invalid state detected [1].\n");
-+                      return -1;
-+              }
-+              
-+              /* now we definitely have a sto file */
-+              hidden_old_dentry = dtohd2(old_dentry);
-+              hidden_new_dentry = dtohd2(new_dentry);
-+
-+              dget(hidden_old_dentry);
-+              dget(hidden_new_dentry);
-+              
-+              hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+              hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+              double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+              err = vfs_rename(hidden_old_dir_dentry->d_inode, 
-+                               hidden_old_dentry,
-+                               hidden_new_dir_dentry->d_inode, 
-+                               hidden_new_dentry);
-+              if(err) 
-+                      goto out_lock;
-+
-+              fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+              if (new_dir != old_dir)
-+                      fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode);
-+              
-+      out_lock:
-+              /* double_unlock will dput the new/old parent dentries 
-+               * whose refcnts were incremented via get_parent above.
-+               */
-+              double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+              dput(hidden_new_dentry);
-+              dput(hidden_old_dentry);
-+      out:            
-+              return err;
-+      }
-+      else { /* invalid state */
-+              printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n");
-+              return -1;
-+      }
-+}
-+
-+
-+STATIC int
-+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz)
-+{
-+      int err=0;
-+      dentry_t *hidden_dentry = NULL;
-+
-+      if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+              hidden_dentry = dtohd2(dentry);
-+      } else if(dtohd(dentry) && dtohd(dentry)->d_inode) {
-+              hidden_dentry = dtohd(dentry);
-+      } else {
-+              goto out;
-+      }
-+
-+      if (!hidden_dentry->d_inode->i_op ||
-+          !hidden_dentry->d_inode->i_op->readlink) {
-+              err = -EINVAL;          goto out;
-+      }
-+
-+      err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry,
-+                                                   buf,
-+                                                   bufsiz);
-+      if (err > 0)
-+              fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ out:
-+      return err;
-+}
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#else
-+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#endif
-+{
-+      char *buf;
-+      int len = PAGE_SIZE, err;
-+      mm_segment_t old_fs;
-+
-+      /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */
-+      buf = kmalloc(len, GFP_KERNEL);
-+      if (!buf) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      /* read the symlink, and then we will follow it */
-+      old_fs = get_fs();
-+      set_fs(KERNEL_DS);
-+      err = dentry->d_inode->i_op->readlink(dentry, buf, len);
-+      set_fs(old_fs);
-+      if (err < 0) {
-+              kfree(buf);
-+              buf = NULL;
-+              goto out;
-+      }
-+      buf[err] = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+        nd_set_link(nd, buf);
-+        err = 0;
-+#else
-+      err = vfs_follow_link(nd, buf);
-+#endif
-+
-+ out:
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+      kfree(buf);
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+        return err;
-+#else
-+        return ERR_PTR(err);
-+#endif
-+}
-+
-+STATIC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd)
-+#else
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
-+#endif
-+{
-+        char *link;
-+        link = nd_get_link(nd);
-+        kfree(link);
-+}
-+#endif
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
-+#else
-+mini_fo_permission(inode_t *inode, int mask)
-+#endif
-+{
-+      inode_t *hidden_inode;
-+      int mode;
-+      int err;
-+
-+      if(itohi2(inode)) {
-+              hidden_inode = itohi2(inode);
-+      } else {
-+              hidden_inode = itohi(inode);
-+      }
-+      mode = inode->i_mode;
-+
-+      /* not really needed, as permission handles everything:
-+       *      err = vfs_permission(inode, mask);
-+       *      if (err)
-+       *              goto out;
-+       */
-+      
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      err = permission(hidden_inode, mask, nd);
-+#else
-+      err = permission(hidden_inode, mask);
-+#endif
-+      
-+      /*  out: */
-+      return err;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_inode_revalidate(dentry_t *dentry)
-+{
-+      int err = 0;
-+      dentry_t *hidden_dentry;
-+      inode_t *hidden_inode;
-+
-+      ASSERT(dentry->d_inode);
-+      ASSERT(itopd(dentry->d_inode));
-+
-+      if(itohi2(dentry->d_inode)) {
-+                hidden_dentry = dtohd2(dentry);
-+              hidden_inode = hidden_dentry->d_inode;
-+      } else if(itohi(dentry->d_inode)) {
-+                hidden_dentry = dtohd(dentry);
-+              hidden_inode = hidden_dentry->d_inode;
-+      } else {
-+                printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n");
-+                err = -ENOENT;
-+                goto out;
-+        }
-+      if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){
-+              err = hidden_inode->i_op->revalidate(hidden_dentry);
-+              if (err)
-+                      goto out;
-+      }
-+      fist_copy_attr_all(dentry->d_inode, hidden_inode);
-+ out:
-+      return err;
-+}
-+#endif
-+
-+STATIC int
-+mini_fo_setattr(dentry_t *dentry, struct iattr *ia)
-+{
-+      int err = 0;
-+
-+      check_mini_fo_dentry(dentry);
-+      
-+      if(!is_mini_fo_existant(dentry)) {
-+              printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n");
-+              goto out;
-+      }
-+
-+      if(dtost(dentry) == UNMODIFIED) {
-+              if(!IS_COPY_FLAG(ia->ia_valid))
-+                      goto out; /* we ignore these changes to base */
-+
-+              if(S_ISDIR(dentry->d_inode->i_mode)) {
-+                      err = dir_unmod_to_mod(dentry);
-+              } else {
-+                      /* we copy contents if file is not beeing truncated */
-+                      if(S_ISREG(dentry->d_inode->i_mode) && 
-+                         !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) {
-+                              err = nondir_unmod_to_mod(dentry, 1);
-+                      } else
-+                              err = nondir_unmod_to_mod(dentry, 0);
-+              }
-+              if(err) {
-+                      err = -EINVAL;
-+                      printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n");
-+                      goto out;
-+              }
-+      }
-+      if(!exists_in_storage(dentry)) {
-+              printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      ASSERT(dentry->d_inode);
-+      ASSERT(dtohd2(dentry));
-+      ASSERT(itopd(dentry->d_inode));
-+      ASSERT(itohi2(dentry->d_inode));
-+      
-+      err = notify_change(dtohd2(dentry), ia);
-+      fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ out:
-+      return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+{
-+      int err = 0;
-+        dentry_t *hidden_dentry;
-+
-+      ASSERT(dentry->d_inode);
-+      ASSERT(itopd(dentry->d_inode));
-+
-+      if(itohi2(dentry->d_inode)) {
-+                hidden_dentry = dtohd2(dentry);
-+      } else if(itohi(dentry->d_inode)) {
-+                hidden_dentry = dtohd(dentry);
-+      } else {
-+                printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n");
-+                err = -ENOENT;
-+                goto out;
-+        }
-+      fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode);
-+
-+      ASSERT(hidden_dentry);
-+      ASSERT(hidden_dentry->d_inode);
-+      ASSERT(hidden_dentry->d_inode->i_op);
-+
-+      generic_fillattr(dentry->d_inode, stat);
-+      if (!stat->blksize) {
-+              struct super_block *s = hidden_dentry->d_inode->i_sb;
-+              unsigned blocks;
-+              blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+              stat->blocks = (s->s_blocksize / 512) * blocks;
-+              stat->blksize = s->s_blocksize;
-+      }
-+ out:
-+        return err;
-+}
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+#if 0 /* no xattr_alloc() and xattr_free() */
-+/* This is lifted from fs/xattr.c */
-+static void *
-+xattr_alloc(size_t size, size_t limit)
-+{
-+      void *ptr;
-+
-+      if (size > limit)
-+              return ERR_PTR(-E2BIG);
-+
-+      if (!size)      /* size request, no buffer is needed */
-+              return NULL;
-+      else if (size <= PAGE_SIZE)
-+              ptr = kmalloc((unsigned long) size, GFP_KERNEL);
-+      else
-+              ptr = vmalloc((unsigned long) size);
-+      if (!ptr)
-+              return ERR_PTR(-ENOMEM);
-+      return ptr;
-+}
-+
-+static void
-+xattr_free(void *ptr, size_t size)
-+{
-+      if (!size)      /* size request, no buffer was needed */
-+              return;
-+      else if (size <= PAGE_SIZE)
-+              kfree(ptr);
-+      else
-+              vfree(ptr);
-+}
-+#endif /* no xattr_alloc() and xattr_free() */
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) {
-+      struct dentry *hidden_dentry = NULL;
-+      int err = -EOPNOTSUPP;
-+      /* Define these anyway so we don't need as much ifdef'ed code. */
-+      char *encoded_name = NULL;
-+      char *encoded_value = NULL;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(exists_in_storage(dentry))
-+              hidden_dentry = dtohd2(dentry);
-+      else
-+              hidden_dentry = dtohd(dentry);
-+         
-+      ASSERT(hidden_dentry);
-+      ASSERT(hidden_dentry->d_inode);
-+      ASSERT(hidden_dentry->d_inode->i_op);
-+
-+      if (hidden_dentry->d_inode->i_op->getxattr) {
-+              encoded_name = (char *)name;
-+              encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              /* lock_kernel() already done by caller. */
-+              err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size);
-+              /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+      }
-+      return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \
-+     && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \
-+     || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
-+mini_fo_setxattr(struct dentry *dentry, const char *name, 
-+               const void *value, size_t size, int flags)
-+#else
-+mini_fo_setxattr(struct dentry *dentry, const char *name, 
-+               void *value, size_t size, int flags)
-+#endif
-+
-+{
-+      struct dentry *hidden_dentry = NULL;
-+      int err = -EOPNOTSUPP;
-+
-+      /* Define these anyway, so we don't have as much ifdef'ed code. */
-+      char *encoded_value = NULL;
-+      char *encoded_name = NULL;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(exists_in_storage(dentry))
-+              hidden_dentry = dtohd2(dentry);
-+      else
-+              hidden_dentry = dtohd(dentry);
-+      
-+      ASSERT(hidden_dentry);
-+      ASSERT(hidden_dentry->d_inode);
-+      ASSERT(hidden_dentry->d_inode->i_op);
-+
-+      if (hidden_dentry->d_inode->i_op->setxattr) {
-+              encoded_name = (char *)name;
-+              encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              /* lock_kernel() already done by caller. */
-+              err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags);
-+              /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+      }
-+      return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_removexattr(struct dentry *dentry, const char *name) {
-+      struct dentry *hidden_dentry = NULL;
-+      int err = -EOPNOTSUPP;
-+      char *encoded_name;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(exists_in_storage(dentry))
-+              hidden_dentry = dtohd2(dentry);
-+      else
-+              hidden_dentry = dtohd(dentry);
-+      
-+      ASSERT(hidden_dentry);
-+      ASSERT(hidden_dentry->d_inode);
-+      ASSERT(hidden_dentry->d_inode->i_op);
-+
-+      if (hidden_dentry->d_inode->i_op->removexattr) {
-+              encoded_name = (char *)name;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              /* lock_kernel() already done by caller. */
-+              err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name);
-+              /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+      }
-+      return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) {
-+      struct dentry *hidden_dentry = NULL;
-+      int err = -EOPNOTSUPP;
-+      char *encoded_list = NULL;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(exists_in_storage(dentry))
-+              hidden_dentry = dtohd2(dentry);
-+      else
-+              hidden_dentry = dtohd(dentry);
-+
-+      ASSERT(hidden_dentry);
-+      ASSERT(hidden_dentry->d_inode);
-+      ASSERT(hidden_dentry->d_inode->i_op);
-+
-+      if (hidden_dentry->d_inode->i_op->listxattr) {
-+              encoded_list = list;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+              /* lock_kernel() already done by caller. */
-+              err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size);
-+              /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+      }
-+      return err;
-+}
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+
-+struct inode_operations mini_fo_symlink_iops =
-+      {
-+              readlink:       mini_fo_readlink,
-+              follow_link: mini_fo_follow_link,
-+              /* mk: permission:      mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+              revalidate:     mini_fo_inode_revalidate,
-+#endif
-+              setattr:        mini_fo_setattr,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              getattr:        mini_fo_getattr,
-+              put_link:       mini_fo_put_link,
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+              setxattr:       mini_fo_setxattr,
-+              getxattr:       mini_fo_getxattr,
-+              listxattr:      mini_fo_listxattr,
-+              removexattr: mini_fo_removexattr
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+      };
-+
-+struct inode_operations mini_fo_dir_iops =
-+      {
-+              create: mini_fo_create,
-+              lookup: mini_fo_lookup,
-+              link:   mini_fo_link,
-+              unlink: mini_fo_unlink,
-+              symlink:        mini_fo_symlink,
-+              mkdir:  mini_fo_mkdir,
-+              rmdir:  mini_fo_rmdir,
-+              mknod:  mini_fo_mknod,
-+              rename: mini_fo_rename,
-+              /* no readlink/follow_link for non-symlinks */
-+              // off because we have setattr
-+              //    truncate: mini_fo_truncate,
-+              /* mk:permission:       mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+              revalidate:     mini_fo_inode_revalidate,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              getattr:        mini_fo_getattr,
-+#endif
-+              setattr:        mini_fo_setattr,
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+              setxattr:       mini_fo_setxattr,
-+              getxattr:       mini_fo_getxattr,
-+              listxattr:      mini_fo_listxattr,
-+              removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+      };
-+
-+struct inode_operations mini_fo_main_iops =
-+      {
-+              /* permission:  mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+              revalidate:     mini_fo_inode_revalidate,
-+#endif
-+              setattr:        mini_fo_setattr,
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              getattr:        mini_fo_getattr,
-+#endif
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+              setxattr:       mini_fo_setxattr,
-+              getxattr:       mini_fo_getxattr,
-+              listxattr:      mini_fo_listxattr,
-+              removexattr:    mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+      };
---- /dev/null
-+++ b/fs/mini_fo/main.c
-@@ -0,0 +1,423 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#include <linux/module.h>
-+
-+/* This definition must only appear after we include <linux/module.h> */
-+#ifndef MODULE_LICENSE
-+# define MODULE_LICENSE(bison)
-+#endif /* not MODULE_LICENSE */
-+
-+/*
-+ * This is the mini_fo tri interpose function, which extends the
-+ * functionality of the regular interpose by interposing a higher
-+ * level inode on top of two lower level ones: the base filesystem
-+ * inode and the storage filesystem inode.
-+ *
-+ *  sb we pass is mini_fo's super_block
-+ */
-+int
-+mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+                    dentry_t *hidden_sto_dentry,
-+                    dentry_t *dentry, super_block_t *sb, int flag)
-+{
-+      inode_t *hidden_inode = NULL;
-+      inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */
-+      int err = 0;
-+      inode_t *inode;
-+
-+      /* Pointer to hidden_sto_inode if exists, else to hidden_inode.
-+       * This is used to copy the attributes of the correct inode. */
-+      inode_t *master_inode;
-+
-+      if(hidden_dentry)
-+              hidden_inode = hidden_dentry->d_inode;
-+      if(hidden_sto_dentry)
-+              hidden_sto_inode = hidden_sto_dentry->d_inode;
-+
-+      ASSERT(dentry->d_inode == NULL);
-+
-+      /* mk: One of the inodes associated with the dentrys is likely to
-+       * be NULL, so carefull:
-+       */
-+      ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL));
-+
-+      if(hidden_sto_inode)
-+              master_inode = hidden_sto_inode;
-+      else
-+              master_inode = hidden_inode;
-+
-+      /*
-+       * We allocate our new inode below, by calling iget.
-+       * iget will call our read_inode which will initialize some
-+       * of the new inode's fields
-+       */
-+
-+      /*
-+       * original: inode = iget(sb, hidden_inode->i_ino);
-+       */
-+      inode = iget(sb, iunique(sb, 25));
-+      if (!inode) {
-+              err = -EACCES;          /* should be impossible??? */
-+              goto out;
-+      }
-+
-+      /*
-+       * interpose the inode if not already interposed
-+       *   this is possible if the inode is being reused
-+       * XXX: what happens if we get_empty_inode() but there's another already?
-+       * for now, ASSERT() that this can't happen; fix later.
-+       */
-+      if (itohi(inode) != NULL) {
-+              printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n");
-+      }
-+      if (itohi2(inode) != NULL) {
-+              printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n");
-+      }
-+
-+      /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so
-+       * we need to check here:
-+       */
-+      if(hidden_inode)
-+              itohi(inode) = igrab(hidden_inode);
-+      else
-+              itohi(inode) = NULL;
-+
-+      if(hidden_sto_inode)
-+              itohi2(inode) = igrab(hidden_sto_inode);
-+      else
-+              itohi2(inode) = NULL;
-+
-+
-+      /* Use different set of inode ops for symlinks & directories*/
-+      if (S_ISLNK(master_inode->i_mode))
-+              inode->i_op = &mini_fo_symlink_iops;
-+      else if (S_ISDIR(master_inode->i_mode))
-+              inode->i_op = &mini_fo_dir_iops;
-+
-+      /* Use different set of file ops for directories */
-+      if (S_ISDIR(master_inode->i_mode))
-+              inode->i_fop = &mini_fo_dir_fops;
-+
-+      /* properly initialize special inodes */
-+      if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) ||
-+          S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) {
-+              init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev);
-+      }
-+
-+      /* Fix our inode's address operations to that of the lower inode */
-+      if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) {
-+              inode->i_mapping->a_ops = master_inode->i_mapping->a_ops;
-+      }
-+
-+      /* only (our) lookup wants to do a d_add */
-+      if (flag)
-+              d_add(dentry, inode);
-+      else
-+              d_instantiate(dentry, inode);
-+
-+      ASSERT(dtopd(dentry) != NULL);
-+
-+      /* all well, copy inode attributes */
-+      fist_copy_attr_all(inode, master_inode);
-+
-+ out:
-+      return err;
-+}
-+
-+/* parse mount options "base=" and "sto=" */
-+dentry_t *
-+mini_fo_parse_options(super_block_t *sb, char *options)
-+{
-+      dentry_t *hidden_root = ERR_PTR(-EINVAL);
-+      dentry_t *hidden_root2 = ERR_PTR(-EINVAL);
-+      struct nameidata nd, nd2; 
-+      char *name, *tmp, *end;
-+      int err = 0;
-+
-+      /* We don't want to go off the end of our arguments later on. */
-+      for (end = options; *end; end++);
-+
-+      while (options < end) {
-+              tmp = options;
-+              while (*tmp && *tmp != ',')
-+                      tmp++;
-+              *tmp = '\0';
-+              if (!strncmp("base=", options, 5)) {
-+                      name = options + 5;
-+                      printk(KERN_INFO "mini_fo: using base directory: %s\n", name);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+                      if (path_init(name, LOOKUP_FOLLOW, &nd))
-+                              err = path_walk(name, &nd);
-+#else
-+                      err = path_lookup(name, LOOKUP_FOLLOW, &nd);
-+#endif
-+                      if (err) {
-+                              printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name);
-+                              hidden_root = ERR_PTR(err);
-+                              goto out;
-+                      }
-+                      hidden_root = nd.dentry;
-+                      stopd(sb)->base_dir_dentry = nd.dentry;
-+                      stopd(sb)->hidden_mnt = nd.mnt;
-+
-+              } else if(!strncmp("sto=", options, 4)) {
-+                      /* parse the storage dir */
-+                      name = options + 4;
-+                      printk(KERN_INFO "mini_fo: using storage directory: %s\n", name);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+                      if(path_init(name, LOOKUP_FOLLOW, &nd2))
-+                              err = path_walk(name, &nd2);
-+#else
-+                        err = path_lookup(name, LOOKUP_FOLLOW, &nd2);
-+#endif
-+                      if(err) {
-+                              printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name);
-+
-+                              hidden_root2 = ERR_PTR(err);
-+                              goto out;
-+                      }
-+                      hidden_root2 = nd2.dentry;
-+                      stopd(sb)->storage_dir_dentry = nd2.dentry;
-+                      stopd(sb)->hidden_mnt2 = nd2.mnt;
-+                      stohs2(sb) = hidden_root2->d_sb;
-+
-+                      /* validate storage dir, this is done in 
-+                       * mini_fo_read_super for the base directory.
-+                       */
-+                      if (IS_ERR(hidden_root2)) {
-+                              printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2));
-+                              goto out;
-+                      }
-+                      if (!hidden_root2->d_inode) {
-+                              printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n");
-+                              goto out;
-+                      }
-+                      stohs2(sb) = hidden_root2->d_sb;
-+              } else {
-+                      printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options);
-+                      hidden_root = ERR_PTR(-EINVAL);
-+                      goto out;
-+              }
-+              options = tmp + 1;
-+      }
-+
-+ out:
-+      if(IS_ERR(hidden_root2))
-+              return hidden_root2;
-+      return hidden_root;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+static int
-+#else
-+super_block_t *
-+#endif
-+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent)
-+{
-+      dentry_t *hidden_root;
-+      int err = 0;
-+
-+      if (!raw_data) {
-+              printk(KERN_WARNING "mini_fo_read_super: missing argument\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      /*
-+       * Allocate superblock private data
-+       */
-+      __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL);
-+      if (!stopd(sb)) {
-+              printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__);
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+      stohs(sb) = NULL;
-+
-+      hidden_root = mini_fo_parse_options(sb, raw_data);
-+      if (IS_ERR(hidden_root)) {
-+              printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root));
-+              err = PTR_ERR(hidden_root);
-+              goto out_free;
-+      }
-+      if (!hidden_root->d_inode) {
-+              printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n");
-+              goto out_free;
-+      }
-+      stohs(sb) = hidden_root->d_sb;
-+
-+      /*
-+       * Linux 2.4.2-ac3 and beyond has code in
-+       * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes
-+       * to be populated.  If not set, all write()s under that sb will
-+       * return 0.
-+       *
-+       * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS;
-+       * the filesystem should override it only if it supports LFS.
-+       */
-+      /* non-SCA code is good to go with LFS */
-+      sb->s_maxbytes = hidden_root->d_sb->s_maxbytes;
-+
-+      sb->s_op = &mini_fo_sops;
-+      /*
-+       * we can't use d_alloc_root if we want to use
-+       * our own interpose function unchanged,
-+       * so we simply replicate *most* of the code in d_alloc_root here
-+       */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+      sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
-+#else
-+      sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1});
-+#endif
-+      if (IS_ERR(sb->s_root)) {
-+              printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n");
-+              err = -ENOMEM;
-+              goto out_dput;
-+      }
-+
-+      sb->s_root->d_op = &mini_fo_dops;
-+      sb->s_root->d_sb = sb;
-+      sb->s_root->d_parent = sb->s_root;
-+
-+      /* link the upper and lower dentries */
-+      __dtopd(sb->s_root) = (struct mini_fo_dentry_info *) 
-+              kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+      if (!dtopd(sb->s_root)) {
-+              err = -ENOMEM;
-+              goto out_dput2;
-+      }
-+      dtopd(sb->s_root)->state = MODIFIED;
-+      dtohd(sb->s_root) = hidden_root;
-+
-+      /* fanout relevant, interpose on storage root dentry too */
-+      dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry;
-+
-+      /* ...and call tri-interpose to interpose root dir inodes
-+       * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0))
-+       */
-+      if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0))
-+              goto out_dput2;
-+
-+      /* initalize the wol list */
-+      itopd(sb->s_root->d_inode)->deleted_list_size = -1;
-+      itopd(sb->s_root->d_inode)->renamed_list_size = -1;
-+      meta_build_lists(sb->s_root);
-+
-+      goto out;
-+
-+ out_dput2:
-+      dput(sb->s_root);
-+ out_dput:
-+      dput(hidden_root);
-+      dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */
-+ out_free:
-+      kfree(stopd(sb));
-+      __stopd(sb) = NULL;
-+ out:
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+        return err;
-+#else
-+        if (err) {
-+              return ERR_PTR(err);
-+        } else {
-+              return sb;
-+        }
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+static int mini_fo_get_sb(struct file_system_type *fs_type,
-+                                        int flags, const char *dev_name,
-+                                        void *raw_data, struct vfsmount *mnt) 
-+{
-+      return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt);
-+}
-+#else
-+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type,
-+                                        int flags, const char *dev_name,
-+                                        void *raw_data) 
-+{
-+      return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super);
-+}
-+#endif
-+
-+void mini_fo_kill_block_super(struct super_block *sb)
-+{
-+      generic_shutdown_super(sb);
-+      /*
-+       *      XXX: BUG: Halcrow: Things get unstable sometime after this point:
-+       *      lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized
-+       *      fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already
-+       *      locked by fs/fs-writeback.c/402
-+       *
-+       *      Apparently, someone's not releasing a lock on sb_lock...
-+       */
-+}
-+
-+static struct file_system_type mini_fo_fs_type = {
-+      .owner          = THIS_MODULE,
-+      .name           = "mini_fo",
-+      .get_sb         = mini_fo_get_sb,
-+      .kill_sb        = mini_fo_kill_block_super,
-+      .fs_flags       = 0,
-+};
-+
-+
-+#else
-+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0);
-+#endif
-+
-+static int __init init_mini_fo_fs(void)
-+{
-+      printk("Registering mini_fo version $Id$\n");
-+      return register_filesystem(&mini_fo_fs_type);
-+}
-+static void __exit exit_mini_fo_fs(void)
-+{
-+      printk("Unregistering mini_fo version $Id$\n");
-+      unregister_filesystem(&mini_fo_fs_type);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+EXPORT_NO_SYMBOLS;
-+#endif
-+
-+MODULE_AUTHOR("Erez Zadok <ezk@cs.sunysb.edu>");
-+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem");
-+MODULE_LICENSE("GPL");
-+
-+/* MODULE_PARM(fist_debug_var, "i"); */
-+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */
-+
-+module_init(init_mini_fo_fs)
-+module_exit(exit_mini_fo_fs)
---- /dev/null
-+++ b/fs/mini_fo/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Makefile for mini_fo 2.4 and 2.6 Linux kernels
-+#
-+# Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+#
-+
-+obj-$(CONFIG_MINI_FO) := mini_fo.o
-+mini_fo-objs   := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o
-+
-+# dependencies
-+${mini_fo-objs}: mini_fo.h fist.h
-+
---- /dev/null
-+++ b/fs/mini_fo/meta.c
-@@ -0,0 +1,1000 @@
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+int meta_build_lists(dentry_t *dentry) 
-+{
-+      struct mini_fo_inode_info *inode_info;
-+
-+      dentry_t *meta_dentry = 0;
-+      file_t *meta_file = 0;
-+      mm_segment_t old_fs;
-+      void *buf;
-+
-+      int bytes, len;
-+      struct vfsmount *meta_mnt;
-+      char *entry;
-+
-+      inode_info = itopd(dentry->d_inode);
-+      if(!(inode_info->deleted_list_size == -1 &&
-+           inode_info->renamed_list_size == -1)) {
-+              printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+                                  Error, list(s) not virgin.\n");
-+              return -1;
-+      }
-+
-+      /* init our meta lists */
-+      INIT_LIST_HEAD(&inode_info->deleted_list);
-+      inode_info->deleted_list_size = 0;
-+
-+      INIT_LIST_HEAD(&inode_info->renamed_list);
-+      inode_info->renamed_list_size = 0;
-+
-+      /* might there be a META-file? */
-+      if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+              meta_dentry = lookup_one_len(META_FILENAME,
-+                                           dtohd2(dentry), 
-+                                           strlen(META_FILENAME));
-+              if(!meta_dentry->d_inode) {
-+                      dput(meta_dentry);
-+                      goto out_ok;
-+              }
-+              /* $%& err, is this correct? */
-+              meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+              mntget(meta_mnt);
-+              
-+
-+              /* open META-file for reading */
-+              meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+              if(!meta_file || IS_ERR(meta_file)) {
-+                      printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+                                          ERROR opening META file.\n");
-+                      goto out_err;
-+              }
-+
-+              /* check if fs supports reading */
-+              if(!meta_file->f_op->read) {
-+                      printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+                                          ERROR, fs does not support reading.\n");
-+                      goto out_err_close;
-+              }
-+
-+              /* allocate a page for transfering the data */
-+              buf = (void *) __get_free_page(GFP_KERNEL);
-+              if(!buf) {
-+                      printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+                                          ERROR, out of mem.\n");
-+                      goto out_err_close;
-+              }
-+              meta_file->f_pos = 0;
-+              old_fs = get_fs();
-+              set_fs(KERNEL_DS);
-+              do {
-+                      char *c;
-+                      bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos);
-+                      if(bytes == PAGE_SIZE) {
-+                              /* trim a cut off filename and adjust f_pos to get it next time */
-+                              for(c = (char*) buf+PAGE_SIZE;
-+                                  *c != '\n';
-+                                  c--, bytes--, meta_file->f_pos--);
-+                      }
-+                      entry = (char *) buf;
-+                      while(entry < (char *) buf+bytes) {
-+
-+                              char *old_path;
-+                              char *dir_name;
-+                              int old_len, new_len;
-+
-+                              /* len without '\n'*/
-+                              len = (int) (strchr(entry, '\n') - entry);
-+                              switch (*entry) {
-+                              case 'D':
-+                                      /* format: "D filename" */
-+                                      meta_list_add_d_entry(dentry, 
-+                                                            entry+2, 
-+                                                            len-2);
-+                                      break;
-+                              case 'R':
-+                                      /* format: "R path/xy/dir newDir" */
-+                                      old_path = entry+2;
-+                                      dir_name = strchr(old_path, ' ') + 1;
-+                                      old_len =  dir_name - old_path - 1;
-+                                      new_len = ((int) entry) + len - ((int ) dir_name);
-+                                      meta_list_add_r_entry(dentry, 
-+                                                            old_path, 
-+                                                            old_len,
-+                                                            dir_name, 
-+                                                            new_len);
-+                                      break;
-+                              default:
-+                                      /* unknown entry type detected */
-+                                      break;
-+                              }
-+                              entry += len+1;
-+                      }
-+
-+              } while(meta_file->f_pos < meta_dentry->d_inode->i_size);
-+
-+              free_page((unsigned long) buf);
-+              set_fs(old_fs);
-+              fput(meta_file);
-+      }
-+      goto out_ok;
-+
-+ out_err_close:
-+      fput(meta_file);
-+ out_err:
-+      mntput(meta_mnt);
-+      dput(meta_dentry);
-+      return -1;
-+ out_ok:
-+      return 1; /* check this!!! inode_info->wol_size; */ 
-+}
-+
-+/* cleanups up all lists and free's the mem by dentry */
-+int meta_put_lists(dentry_t *dentry) 
-+{
-+      if(!dentry || !dentry->d_inode) {
-+              printk("mini_fo: meta_put_lists: invalid dentry passed.\n");
-+              return -1;
-+      }
-+      return __meta_put_lists(dentry->d_inode);
-+}
-+
-+/* cleanups up all lists and free's the mem by inode */
-+int __meta_put_lists(inode_t *inode) 
-+{
-+      int err = 0;
-+      if(!inode || !itopd(inode)) {
-+              printk("mini_fo: __meta_put_lists: invalid inode passed.\n");
-+              return -1;
-+      }
-+      err = __meta_put_d_list(inode);
-+      err |= __meta_put_r_list(inode);
-+      return err;
-+}
-+
-+int meta_sync_lists(dentry_t *dentry)
-+{
-+      int err = 0;
-+      if(!dentry || !dentry->d_inode) {
-+              printk("mini_fo: meta_sync_lists: \
-+                        invalid dentry passed.\n");
-+              return -1;
-+      }
-+      err = meta_sync_d_list(dentry, 0);
-+      err |= meta_sync_r_list(dentry, 1);
-+      return err;
-+}
-+
-+
-+/* remove all D entries from the renamed list and free the mem */
-+int __meta_put_d_list(inode_t *inode) 
-+{
-+      struct list_head *tmp;
-+        struct deleted_entry *del_entry;
-+        struct mini_fo_inode_info *inode_info;
-+      
-+      if(!inode || !itopd(inode)) {
-+              printk(KERN_CRIT "mini_fo: __meta_put_d_list: \
-+                                  invalid inode passed.\n");
-+              return -1;
-+      }
-+      inode_info = itopd(inode);
-+      
-+        /* nuke the DELETED-list */
-+        if(inode_info->deleted_list_size <= 0)
-+              return 0;
-+
-+      while(!list_empty(&inode_info->deleted_list)) {
-+              tmp = inode_info->deleted_list.next;
-+              list_del(tmp);
-+              del_entry = list_entry(tmp, struct deleted_entry, list);
-+              kfree(del_entry->name);
-+              kfree(del_entry);
-+      }
-+      inode_info->deleted_list_size = 0;
-+      
-+      return 0;
-+}
-+
-+/* remove all R entries from the renamed list and free the mem */
-+int __meta_put_r_list(inode_t *inode) 
-+{
-+      struct list_head *tmp;
-+      struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+      
-+      if(!inode || !itopd(inode)) {
-+              printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n");
-+              return -1;
-+      }
-+      inode_info = itopd(inode);
-+      
-+        /* nuke the RENAMED-list */
-+        if(inode_info->renamed_list_size <= 0) 
-+              return 0;
-+
-+      while(!list_empty(&inode_info->renamed_list)) {
-+              tmp = inode_info->renamed_list.next;
-+              list_del(tmp);
-+              ren_entry = list_entry(tmp, struct renamed_entry, list);
-+              kfree(ren_entry->new_name);
-+              kfree(ren_entry->old_name);
-+              kfree(ren_entry);
-+      }
-+      inode_info->renamed_list_size = 0;
-+      
-+      return 0;
-+}
-+
-+int meta_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+      int err = 0;
-+      err = meta_list_add_d_entry(dentry, name, len);
-+      err |= meta_write_d_entry(dentry,name,len);
-+      return err;     
-+}
-+
-+/* add a D entry to the deleted list */
-+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len) 
-+{
-+        struct deleted_entry *del_entry;
-+        struct mini_fo_inode_info *inode_info;
-+
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+                                  invalid dentry passed.\n");
-+              return -1;
-+      }
-+      inode_info = itopd(dentry->d_inode);
-+
-+        if(inode_info->deleted_list_size < 0)
-+                return -1;
-+
-+        del_entry = (struct deleted_entry *) 
-+              kmalloc(sizeof(struct deleted_entry), GFP_KERNEL);
-+        del_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+        if(!del_entry || !del_entry->name) {
-+                printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+                                  out of mem.\n");
-+              kfree(del_entry->name);
-+              kfree(del_entry);
-+                return -ENOMEM;
-+        }
-+
-+        strncpy(del_entry->name, name, len);
-+        del_entry->len = len;
-+
-+        list_add(&del_entry->list, &inode_info->deleted_list);
-+        inode_info->deleted_list_size++;
-+        return 0;
-+}
-+
-+int meta_add_r_entry(dentry_t *dentry, 
-+                        const char *old_name, int old_len, 
-+                        const char *new_name, int new_len)
-+{
-+      int err = 0;
-+      err = meta_list_add_r_entry(dentry, 
-+                                  old_name, old_len,
-+                                  new_name, new_len);
-+      err |= meta_write_r_entry(dentry,
-+                                old_name, old_len,
-+                                new_name, new_len);
-+      return err;
-+}
-+
-+/* add a R entry to the renamed list */
-+int meta_list_add_r_entry(dentry_t *dentry, 
-+                        const char *old_name, int old_len, 
-+                        const char *new_name, int new_len)
-+{
-+        struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+                                  invalid dentry passed.\n");
-+              return -1;
-+      }
-+      inode_info = itopd(dentry->d_inode);
-+
-+        if(inode_info->renamed_list_size < 0)
-+                return -1;
-+
-+        ren_entry = (struct renamed_entry *) 
-+              kmalloc(sizeof(struct renamed_entry), GFP_KERNEL);
-+        ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL);
-+        ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL);
-+
-+        if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) {
-+                printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+                                  out of mem.\n");
-+              kfree(ren_entry->new_name);
-+              kfree(ren_entry->old_name);
-+              kfree(ren_entry);
-+                return -ENOMEM;
-+        }
-+
-+        strncpy(ren_entry->old_name, old_name, old_len);
-+        ren_entry->old_len = old_len;
-+        strncpy(ren_entry->new_name, new_name, new_len);
-+        ren_entry->new_len = new_len;
-+
-+        list_add(&ren_entry->list, &inode_info->renamed_list);
-+        inode_info->renamed_list_size++;
-+        return 0;
-+}
-+
-+
-+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+      int err = 0;
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT 
-+                     "mini_fo: meta_remove_r_entry: \
-+                        invalid dentry passed.\n");
-+              return -1;
-+      }
-+
-+      err = meta_list_remove_r_entry(dentry, name, len);
-+      err |= meta_sync_lists(dentry);
-+      return err;
-+}
-+
-+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT 
-+                     "mini_fo: meta_list_remove_r_entry: \
-+                        invalid dentry passed.\n");
-+              return -1;
-+      }
-+      return __meta_list_remove_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len)
-+{
-+      struct list_head *tmp;
-+        struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+
-+      if(!inode || !itopd(inode))
-+              printk(KERN_CRIT 
-+                     "mini_fo: __meta_list_remove_r_entry: \
-+                        invalid inode passed.\n");
-+      inode_info = itopd(inode);
-+
-+        if(inode_info->renamed_list_size < 0)
-+                return -1;
-+        if(inode_info->renamed_list_size == 0)
-+                return 1;
-+      
-+      list_for_each(tmp, &inode_info->renamed_list) {
-+              ren_entry = list_entry(tmp, struct renamed_entry, list);
-+              if(ren_entry->new_len != len)
-+                      continue;
-+              
-+              if(!strncmp(ren_entry->new_name, name, len)) {
-+                      list_del(tmp);
-+                      kfree(ren_entry->new_name);
-+                      kfree(ren_entry->old_name);
-+                      kfree(ren_entry);
-+                      inode_info->renamed_list_size--;
-+                      return 0;
-+              }
-+      }
-+      return 1;
-+}
-+
-+
-+/* append a single D entry to the meta file */
-+int meta_write_d_entry(dentry_t *dentry, const char *name, int len) 
-+{
-+      dentry_t *meta_dentry = 0;
-+        file_t *meta_file = 0;
-+        mm_segment_t old_fs;
-+
-+        int bytes, err;
-+        struct vfsmount *meta_mnt = 0;
-+        char *buf;
-+
-+      err = 0;
-+
-+      if(itopd(dentry->d_inode)->deleted_list_size < 0) {
-+              err = -1;
-+              goto out;
-+      }
-+
-+      if(dtopd(dentry)->state == UNMODIFIED) {
-+                err = build_sto_structure(dentry->d_parent, dentry);
-+                if(err) {
-+                        printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+                                          build_sto_structure failed.\n");
-+                      goto out;
-+                }
-+        }
-+      meta_dentry = lookup_one_len(META_FILENAME, 
-+                                   dtohd2(dentry), strlen (META_FILENAME));
-+
-+      /* We need to create a META-file */
-+        if(!meta_dentry->d_inode) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              vfs_create(dtohd2(dentry)->d_inode,
-+                         meta_dentry, 
-+                         S_IRUSR | S_IWUSR,
-+                         NULL);
-+#else
-+                vfs_create(dtohd2(dentry)->d_inode,
-+                         meta_dentry, 
-+                         S_IRUSR | S_IWUSR);
-+#endif
-+      }
-+        /* open META-file for writing */
-+        meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+        if(!meta_file || IS_ERR(meta_file)) {
-+                printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+                                  ERROR opening meta file.\n");
-+                mntput(meta_mnt); /* $%& is this necessary? */
-+                dput(meta_dentry);
-+              err = -1;
-+                goto out;
-+        }
-+
-+        /* check if fs supports writing */
-+        if(!meta_file->f_op->write) {
-+                printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+                                  ERROR, fs does not support writing.\n");
-+                goto out_err_close;
-+        }
-+
-+      meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+        old_fs = get_fs();
-+        set_fs(KERNEL_DS);
-+
-+      /* size: len for name, 1 for \n and 2 for "D " */
-+      buf = (char *) kmalloc(len+3, GFP_KERNEL);
-+      if (!buf) {
-+              printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+                                  out of mem.\n");
-+              return -ENOMEM;
-+      }
-+                    
-+      buf[0] = 'D';
-+      buf[1] = ' ';
-+      strncpy(buf+2, name, len);
-+      buf[len+2] = '\n';
-+      bytes = meta_file->f_op->write(meta_file, buf, len+3, 
-+                                     &meta_file->f_pos);
-+      if(bytes != len+3) {
-+              printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+                                  ERROR writing.\n");
-+              err = -1;
-+      }
-+      kfree(buf);
-+      set_fs(old_fs);
-+
-+ out_err_close:
-+      fput(meta_file);
-+ out:
-+      return err;
-+}
-+
-+/* append a single R entry to the meta file */
-+int meta_write_r_entry(dentry_t *dentry, 
-+                     const char *old_name, int old_len, 
-+                     const char *new_name, int new_len) 
-+{
-+      dentry_t *meta_dentry = 0;
-+        file_t *meta_file = 0;
-+        mm_segment_t old_fs;
-+
-+        int bytes, err, buf_len;
-+      struct vfsmount *meta_mnt = 0;
-+        char *buf;
-+
-+
-+      err = 0;
-+
-+      if(itopd(dentry->d_inode)->renamed_list_size < 0) {
-+              err = -1;
-+              goto out;
-+      }
-+
-+      /* build the storage structure? */
-+      if(dtopd(dentry)->state == UNMODIFIED) {
-+                err = build_sto_structure(dentry->d_parent, dentry);
-+                if(err) {
-+                        printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+                                          build_sto_structure failed.\n");
-+                      goto out;
-+                }
-+        }
-+      meta_dentry = lookup_one_len(META_FILENAME, 
-+                                   dtohd2(dentry), 
-+                                   strlen (META_FILENAME));
-+        if(!meta_dentry->d_inode) {
-+                /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+      }
-+        /* open META-file for writing */
-+        meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+        if(!meta_file || IS_ERR(meta_file)) {
-+                printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+                                  ERROR opening meta file.\n");
-+                mntput(meta_mnt);
-+                dput(meta_dentry);
-+              err = -1;
-+                goto out;
-+        }
-+
-+        /* check if fs supports writing */
-+        if(!meta_file->f_op->write) {
-+                printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+                                  ERROR, fs does not support writing.\n");
-+                goto out_err_close;
-+        }
-+
-+      meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+        old_fs = get_fs();
-+        set_fs(KERNEL_DS);
-+
-+      /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+      buf_len = old_len + new_len + 4;
-+      buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+      if (!buf) {
-+              printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n");
-+              return -ENOMEM;
-+      }
-+                    
-+      buf[0] = 'R';
-+      buf[1] = ' ';
-+      strncpy(buf + 2, old_name, old_len);
-+      buf[old_len + 2] = ' ';
-+      strncpy(buf + old_len + 3, new_name, new_len);
-+      buf[buf_len -1] = '\n';
-+      bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos);
-+      if(bytes != buf_len) {
-+              printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n");
-+              err = -1;
-+      }
-+      
-+      kfree(buf);
-+      set_fs(old_fs);
-+
-+ out_err_close:
-+      fput(meta_file);
-+ out:
-+      return err;
-+}
-+
-+/* sync D list to disk, append data if app_flag is 1 */
-+/* check the meta_mnt, which seems not to be used (properly)  */
-+
-+int meta_sync_d_list(dentry_t *dentry, int app_flag)
-+{
-+      dentry_t *meta_dentry;
-+        file_t *meta_file;
-+        mm_segment_t old_fs;
-+      
-+        int bytes, err;
-+        struct vfsmount *meta_mnt;
-+        char *buf;
-+
-+      struct list_head *tmp;
-+        struct deleted_entry *del_entry;
-+        struct mini_fo_inode_info *inode_info;
-+
-+      err = 0;
-+      meta_file=0;
-+      meta_mnt=0;
-+      
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                  invalid inode passed.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      inode_info = itopd(dentry->d_inode);
-+      
-+        if(inode_info->deleted_list_size < 0) {
-+              err = -1;
-+              goto out;
-+      }
-+      
-+      /* ok, there is something to sync */
-+
-+      /* build the storage structure? */
-+        if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+                err = build_sto_structure(dentry->d_parent, dentry);
-+                if(err) {
-+                        printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                          build_sto_structure failed.\n");
-+                      goto out;
-+                }
-+        }
-+      meta_dentry = lookup_one_len(META_FILENAME, 
-+                                   dtohd2(dentry), 
-+                                   strlen(META_FILENAME));
-+        if(!meta_dentry->d_inode) {
-+                /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+              app_flag = 0;
-+      }
-+      /* need we truncate the meta file? */
-+      if(!app_flag) {
-+              struct iattr newattrs;
-+                newattrs.ia_size = 0;
-+                newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+                down(&meta_dentry->d_inode->i_sem);
-+#endif
-+                err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+                up(&meta_dentry->d_inode->i_sem);
-+#endif
-+
-+                if(err || meta_dentry->d_inode->i_size != 0) {
-+                        printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                          ERROR truncating meta file.\n");
-+                        goto out_err_close;
-+              }
-+      }
-+
-+        /* open META-file for writing */
-+        meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+        if(!meta_file || IS_ERR(meta_file)) {
-+                printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                  ERROR opening meta file.\n");
-+              /* we don't mntget so we dont't mntput (for now)
-+               * mntput(meta_mnt); 
-+               */
-+              dput(meta_dentry);
-+              err = -1;
-+                goto out;
-+        }
-+
-+        /* check if fs supports writing */
-+        if(!meta_file->f_op->write) {
-+                printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                  ERROR, fs does not support writing.\n");
-+                goto out_err_close;
-+        }
-+      
-+      meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+        old_fs = get_fs();
-+        set_fs(KERNEL_DS);
-+
-+      /* here we go... */
-+        list_for_each(tmp, &inode_info->deleted_list) {
-+              del_entry = list_entry(tmp, struct deleted_entry, list);
-+              
-+              /* size: len for name, 1 for \n and 2 for "D " */
-+              buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL);
-+              if (!buf) {
-+                      printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                          out of mem.\n");
-+                      return -ENOMEM;
-+              }
-+                    
-+              buf[0] = 'D';
-+              buf[1] = ' ';
-+              strncpy(buf+2, del_entry->name, del_entry->len);
-+              buf[del_entry->len+2] = '\n';
-+              bytes = meta_file->f_op->write(meta_file, buf, 
-+                                             del_entry->len+3, 
-+                                             &meta_file->f_pos);
-+              if(bytes != del_entry->len+3) {
-+                      printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+                                          ERROR writing.\n");
-+                      err |= -1;
-+              }
-+              kfree(buf);
-+      }
-+      set_fs(old_fs);
-+      
-+ out_err_close:
-+      fput(meta_file);
-+ out:
-+      return err;
-+
-+}
-+
-+int meta_sync_r_list(dentry_t *dentry, int app_flag)
-+{
-+      dentry_t *meta_dentry;
-+        file_t *meta_file;
-+        mm_segment_t old_fs;
-+      
-+        int bytes, err, buf_len;
-+        struct vfsmount *meta_mnt;
-+        char *buf;
-+      
-+      struct list_head *tmp;
-+        struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+      
-+      err = 0;
-+      meta_file=0;
-+      meta_mnt=0;
-+      
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                  invalid dentry passed.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      inode_info = itopd(dentry->d_inode);
-+      
-+        if(inode_info->deleted_list_size < 0) {
-+              err = -1;
-+              goto out;
-+      }
-+      
-+      /* ok, there is something to sync */
-+
-+      /* build the storage structure? */
-+        if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+                err = build_sto_structure(dentry->d_parent, dentry);
-+                if(err) {
-+                        printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                          build_sto_structure failed.\n");
-+                      goto out;
-+                }
-+        }
-+      meta_dentry = lookup_one_len(META_FILENAME, 
-+                                   dtohd2(dentry), 
-+                                   strlen(META_FILENAME));
-+        if(!meta_dentry->d_inode) {
-+                /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+                vfs_create(dtohd2(dentry)->d_inode, 
-+                         meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+              app_flag = 0;
-+      }
-+      /* need we truncate the meta file? */
-+      if(!app_flag) {
-+              struct iattr newattrs;
-+                newattrs.ia_size = 0;
-+                newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+                down(&meta_dentry->d_inode->i_sem);
-+#endif
-+                err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+                up(&meta_dentry->d_inode->i_sem);
-+#endif
-+                if(err || meta_dentry->d_inode->i_size != 0) {
-+                        printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                          ERROR truncating meta file.\n");
-+                        goto out_err_close;
-+              }
-+      }
-+
-+        /* open META-file for writing */
-+        meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+        if(!meta_file || IS_ERR(meta_file)) {
-+                printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                  ERROR opening meta file.\n");
-+              /* we don't mntget so we dont't mntput (for now)
-+               * mntput(meta_mnt); 
-+               */
-+              dput(meta_dentry);
-+              err = -1;
-+                goto out;
-+        }
-+
-+        /* check if fs supports writing */
-+        if(!meta_file->f_op->write) {
-+                printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                  ERROR, fs does not support writing.\n");
-+                goto out_err_close;
-+        }
-+      
-+      meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+        old_fs = get_fs();
-+        set_fs(KERNEL_DS);
-+
-+      /* here we go... */
-+        list_for_each(tmp, &inode_info->renamed_list) {
-+              ren_entry = list_entry(tmp, struct renamed_entry, list);
-+              /* size: 
-+               * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+              buf_len = ren_entry->old_len + ren_entry->new_len + 4;
-+              buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+              if (!buf) {
-+                      printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                          out of mem.\n");
-+                      return -ENOMEM;
-+              }
-+              buf[0] = 'R';
-+              buf[1] = ' ';
-+              strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len);
-+              buf[ren_entry->old_len + 2] = ' ';
-+              strncpy(buf + ren_entry->old_len + 3, 
-+                      ren_entry->new_name, ren_entry->new_len);
-+              buf[buf_len - 1] = '\n';
-+              bytes = meta_file->f_op->write(meta_file, buf, 
-+                                             buf_len, &meta_file->f_pos);
-+              if(bytes != buf_len) {
-+                      printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+                                          ERROR writing.\n");
-+                      err |= -1;
-+              }               
-+              kfree(buf);
-+      }
-+      set_fs(old_fs);
-+      
-+ out_err_close:
-+      fput(meta_file);
-+ out:
-+      return err;
-+}
-+
-+int meta_check_d_entry(dentry_t *dentry, const char *name, int len) 
-+{
-+      if(!dentry || !dentry->d_inode)
-+              printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \
-+                                  invalid dentry passed.\n");
-+      return __meta_check_d_entry(dentry->d_inode, name, len);        
-+}
-+
-+int __meta_check_d_entry(inode_t *inode, const char *name, int len) 
-+{
-+      struct list_head *tmp;
-+        struct deleted_entry *del_entry;
-+        struct mini_fo_inode_info *inode_info;
-+
-+      if(!inode || !itopd(inode))
-+              printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \
-+                                  invalid inode passed.\n");
-+
-+        inode_info = itopd(inode);
-+      
-+        if(inode_info->deleted_list_size <= 0)
-+                return 0;
-+
-+        list_for_each(tmp, &inode_info->deleted_list) {
-+              del_entry = list_entry(tmp, struct deleted_entry, list);
-+              if(del_entry->len != len)
-+                      continue;
-+              
-+              if(!strncmp(del_entry->name, name, len))
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+/* 
-+ * check if file has been renamed and return path to orig. base dir.
-+ * Implements no error return values so far, what of course sucks.
-+ * String is null terminated.'
-+ */
-+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len) 
-+{
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+                                  invalid dentry passed.\n");
-+              return NULL;
-+      }
-+      return __meta_check_r_entry(dentry->d_inode, name, len);        
-+}
-+
-+char* __meta_check_r_entry(inode_t *inode, const char *name, int len)
-+{
-+      struct list_head *tmp;
-+        struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+      char *old_path;
-+      
-+      if(!inode || !itopd(inode)) {
-+              printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+                                  invalid inode passed.\n");
-+              return NULL;
-+      }
-+      inode_info = itopd(inode);
-+      
-+        if(inode_info->renamed_list_size <= 0)
-+                return NULL;
-+      
-+        list_for_each(tmp, &inode_info->renamed_list) {
-+              ren_entry = list_entry(tmp, struct renamed_entry, list);
-+              if(ren_entry->new_len != len)
-+                      continue;
-+              
-+              if(!strncmp(ren_entry->new_name, name, len)) {
-+                      old_path = (char *) 
-+                              kmalloc(ren_entry->old_len+1, GFP_KERNEL);
-+                      strncpy(old_path, 
-+                              ren_entry->old_name, 
-+                              ren_entry->old_len);
-+                      old_path[ren_entry->old_len]='\0';
-+                      return old_path;
-+              }
-+      }
-+      return NULL;
-+}
-+
-+/*
-+ * This version only checks if entry exists and return:
-+ *     1 if exists,
-+ *     0 if not,
-+ *    -1 if error.
-+ */
-+int meta_is_r_entry(dentry_t *dentry, const char *name, int len) 
-+{
-+      if(!dentry || !dentry->d_inode) {
-+              printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+                                  invalid dentry passed.\n");
-+              return -1;
-+      }
-+      return __meta_is_r_entry(dentry->d_inode, name, len);   
-+}
-+
-+int __meta_is_r_entry(inode_t *inode, const char *name, int len)
-+{
-+      struct list_head *tmp;
-+        struct renamed_entry *ren_entry;
-+        struct mini_fo_inode_info *inode_info;
-+      
-+      if(!inode || !itopd(inode)) {
-+              printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+                                  invalid inode passed.\n");
-+              return -1;
-+      }
-+      inode_info = itopd(inode);
-+      
-+        if(inode_info->renamed_list_size <= 0)
-+                return -1;
-+      
-+        list_for_each(tmp, &inode_info->renamed_list) {
-+              ren_entry = list_entry(tmp, struct renamed_entry, list);
-+              if(ren_entry->new_len != len)
-+                      continue;
-+              
-+              if(!strncmp(ren_entry->new_name, name, len)) 
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/mini_fo.h
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifndef __MINI_FO_H_
-+#define __MINI_FO_H_
-+
-+#ifdef __KERNEL__
-+
-+/* META stuff */
-+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr"
-+
-+/* use xattrs? */
-+#define XATTR
-+
-+/* File attributes that when changed, result in a file beeing copied to storage */
-+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE
-+
-+/*
-+ * mini_fo filestates
-+ */
-+#define MODIFIED       1
-+#define UNMODIFIED     2
-+#define CREATED        3
-+#define DEL_REWRITTEN  4
-+#define DELETED        5
-+#define NON_EXISTANT   6
-+
-+/* fist file systems superblock magic */
-+# define MINI_FO_SUPER_MAGIC 0xf15f
-+
-+/*
-+ * STRUCTURES:
-+ */
-+
-+/* mini_fo inode data in memory */
-+struct mini_fo_inode_info {
-+      inode_t *wii_inode;
-+      inode_t *wii_inode2; /* pointer to storage inode */
-+
-+      /* META-data lists */
-+      /* deleted list, ex wol */
-+      struct list_head deleted_list;
-+      int deleted_list_size;
-+
-+      /* renamed list */
-+      struct list_head renamed_list;
-+      int renamed_list_size;
-+
-+      /* add other lists here ... */
-+};
-+
-+/* mini_fo dentry data in memory */
-+struct mini_fo_dentry_info {
-+      dentry_t *wdi_dentry;
-+      dentry_t *wdi_dentry2; /* pointer to  storage dentry */
-+      unsigned int state;  /* state of the mini_fo dentry */
-+};
-+
-+
-+/* mini_fo super-block data in memory */
-+struct mini_fo_sb_info {
-+      super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */
-+      struct vfsmount *hidden_mnt, *hidden_mnt2;
-+      dentry_t *base_dir_dentry;
-+      dentry_t *storage_dir_dentry;
-+      ;
-+};
-+
-+/* readdir_data, readdir helper struct */
-+struct readdir_data {
-+      struct list_head ndl_list; /* linked list head ptr */
-+      int ndl_size; /* list size */
-+      int sto_done; /* flag to show that the storage dir entries have
-+                     * all been read an now follow base entries */
-+};
-+
-+/* file private data. */
-+struct mini_fo_file_info {
-+      struct file *wfi_file;
-+      struct file *wfi_file2; /* pointer to storage file */
-+      struct readdir_data rd;
-+};
-+
-+/* struct ndl_entry */
-+struct ndl_entry {
-+      struct list_head list;
-+      char *name;
-+      int len;
-+};
-+
-+/********************************
-+ *  META-data structures
-+ ********************************/
-+
-+/* deleted entry */
-+struct deleted_entry {
-+      struct list_head list;
-+      char *name;
-+      int len;
-+};
-+
-+/* renamed entry */
-+struct renamed_entry {
-+      struct list_head list;
-+      char *old_name;     /* old directory with full path */
-+      int old_len;        /* length of above string */
-+      char *new_name;     /* new directory name */
-+      int new_len;        /* length of above string */
-+};
-+
-+/* attr_change entry */
-+struct attr_change_entry {
-+      struct list_head list;
-+      char *name;
-+      int len;
-+};
-+
-+/* link entry */
-+struct link_entry {
-+      struct list_head list;
-+      int links_moved;
-+      int inum_base;
-+      int inum_sto;
-+      char *weird_name;
-+      int weird_name_len;
-+};
-+
-+
-+/* Some other stuff required for mini_fo_filldir64, copied from
-+ * fs/readdir.c
-+ */
-+
-+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
-+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-+
-+
-+struct linux_dirent64 {
-+        u64             d_ino;
-+        s64             d_off;
-+        unsigned short  d_reclen;
-+        unsigned char   d_type;
-+        char            d_name[0];
-+};
-+
-+
-+struct getdents_callback64 {
-+        struct linux_dirent64 * current_dir;
-+        struct linux_dirent64 * previous;
-+        int count;
-+        int error;
-+};
-+
-+struct linux_dirent {
-+      unsigned long   d_ino;
-+      unsigned long   d_off;
-+      unsigned short  d_reclen;
-+      char            d_name[1];
-+};
-+
-+struct getdents_callback {
-+      struct linux_dirent * current_dir;
-+      struct linux_dirent * previous;
-+      int count;
-+      int error;
-+};
-+
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* file TO private_data */
-+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data))
-+# define __ftopd(file) ((file)->private_data)
-+/* file TO hidden_file */
-+# define ftohf(file) ((ftopd(file))->wfi_file)
-+# define ftohf2(file) ((ftopd(file))->wfi_file2) 
-+
-+/* inode TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private)
-+# define __itopd(ino) ((ino)->i_private)
-+#else
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip)
-+# define __itopd(ino) ((ino)->u.generic_ip)
-+#endif
-+/* inode TO hidden_inode */
-+# define itohi(ino) (itopd(ino)->wii_inode)
-+# define itohi2(ino) (itopd(ino)->wii_inode2)
-+
-+/* superblock TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info)
-+# define __stopd(super) ((super)->s_fs_info)
-+#else
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp)
-+# define __stopd(super) ((super)->u.generic_sbp)
-+#endif
-+
-+/* unused? # define vfs2priv stopd */
-+/* superblock TO hidden_superblock */
-+
-+# define stohs(super) (stopd(super)->wsi_sb)
-+# define stohs2(super) (stopd(super)->wsi_sb2)
-+
-+/* dentry TO private_data */
-+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata)
-+# define __dtopd(dentry) ((dentry)->d_fsdata)
-+/* dentry TO hidden_dentry */
-+# define dtohd(dent) (dtopd(dent)->wdi_dentry)
-+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2)
-+
-+/* dentry to state */
-+# define dtost(dent) (dtopd(dent)->state)
-+# define sbt(sb) ((sb)->s_type->name)
-+
-+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND))
-+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS))
-+
-+/* macros to simplify non-SCA code */
-+#  define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)
-+#  define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)
-+#  define FREE_PAGE_POINTERS(hidden_pages, num)
-+#  define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)
-+#  define FOR_EACH_PAGE
-+#  define CURRENT_HIDDEN_PAGE hidden_page
-+#  define CURRENT_HIDDEN_PAGEDATA hidden_page_data
-+#  define CURRENT_HIDDEN_PAGEINDEX page->index
-+
-+/*
-+ * EXTERNALS:
-+ */
-+extern struct file_operations mini_fo_main_fops;
-+extern struct file_operations mini_fo_dir_fops;
-+extern struct inode_operations mini_fo_main_iops;
-+extern struct inode_operations mini_fo_dir_iops;
-+extern struct inode_operations mini_fo_symlink_iops;
-+extern struct super_operations mini_fo_sops;
-+extern struct dentry_operations mini_fo_dops;
-+extern struct vm_operations_struct mini_fo_shared_vmops;
-+extern struct vm_operations_struct mini_fo_private_vmops;
-+extern struct address_space_operations mini_fo_aops;
-+
-+#if 0 /* unused by mini_fo */
-+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);
-+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA)
-+extern page_t *mini_fo_get1page(file_t *file, int index);
-+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from);
-+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */
-+
-+
-+#  define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+#  define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+
-+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+
-+extern int mini_fo_read_file(const char *filename, void *buf, int len);
-+extern int mini_fo_write_file(const char *filename, void *buf, int len);
-+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);
-+#endif /* unused by mini_fo */
-+
-+/* state transition functions */
-+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag);
-+extern int nondir_del_rew_to_del(dentry_t *dentry);
-+extern int nondir_creat_to_del(dentry_t *dentry);
-+extern int nondir_mod_to_del(dentry_t *dentry);
-+extern int nondir_unmod_to_del(dentry_t *dentry);
-+
-+extern int dir_unmod_to_mod(dentry_t *dentry);
-+
-+/* rename specials */
-+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+
-+/* misc stuff */
-+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+                               dentry_t *hidden_sto_dentry,
-+                               dentry_t *dentry, 
-+                               super_block_t *sb, int flag);
-+
-+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+                         dentry_t *src_dentry, struct vfsmount *src_mnt);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd);
-+#else
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, int dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode);
-+#endif
-+
-+extern int create_sto_dir(dentry_t *dentry, int mode);
-+
-+extern int exists_in_storage(dentry_t *dentry);
-+extern int is_mini_fo_existant(dentry_t *dentry);
-+extern int get_neg_sto_dentry(dentry_t *dentry);
-+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry);
-+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len);
-+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath);
-+extern int bpath_put(dentry_t *dentry);
-+
-+/* check_mini_fo types functions */
-+extern int check_mini_fo_dentry(dentry_t *dentry);
-+extern int check_mini_fo_file(file_t *file);
-+extern int check_mini_fo_inode(inode_t *inode);
-+
-+/* General meta functions, can be called from outside of meta.c */
-+extern int meta_build_lists(dentry_t *dentry);
-+extern int meta_put_lists(dentry_t *dentry);
-+extern int __meta_put_lists(inode_t *inode);
-+
-+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_add_r_entry(dentry_t *dentry, 
-+                          const char *old_name, int old_len, 
-+                          const char *new_name, int new_len);
-+
-+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len);
-+
-+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len);
-+
-+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len);
-+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len);
-+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len);
-+
-+/* Specific meta functions, should be called only inside meta.c */
-+extern int __meta_put_d_list(inode_t *inode);
-+extern int __meta_put_r_list(inode_t *inode);
-+
-+extern int meta_list_add_d_entry(dentry_t *dentry, 
-+                               const char *name, int len);
-+extern int meta_list_add_r_entry(dentry_t *dentry, 
-+                               const char *old_name, int old_len, 
-+                               const char *new_name, int new_len);
-+
-+extern int meta_list_remove_r_entry(dentry_t *dentry, 
-+                                  const char *name, int len);
-+
-+extern int __meta_list_remove_r_entry(inode_t *inode, 
-+                                    const char *name, int len);
-+
-+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_write_r_entry(dentry_t *dentry, 
-+                            const char *old_name, int old_len, 
-+                            const char *new_name, int new_len);
-+
-+extern int meta_sync_lists(dentry_t *dentry);
-+extern int meta_sync_d_list(dentry_t *dentry, int app_flag);
-+extern int meta_sync_r_list(dentry_t *dentry, int app_flag);
-+
-+/* ndl stuff */
-+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len);
-+extern void ndl_put_list(struct readdir_data *rd);
-+extern int ndl_check_entry(struct readdir_data *rd, 
-+                         const char *name, int len);
-+
-+
-+# define copy_inode_size(dst, src) \
-+    dst->i_size = src->i_size; \
-+    dst->i_blocks = src->i_blocks;
-+
-+static inline void
-+fist_copy_attr_atime(inode_t *dest, const inode_t *src)
-+{
-+      ASSERT(dest != NULL);
-+      ASSERT(src != NULL);
-+      dest->i_atime = src->i_atime;
-+}
-+static inline void
-+fist_copy_attr_times(inode_t *dest, const inode_t *src)
-+{
-+      ASSERT(dest != NULL);
-+      ASSERT(src != NULL);
-+      dest->i_atime = src->i_atime;
-+      dest->i_mtime = src->i_mtime;
-+      dest->i_ctime = src->i_ctime;
-+}
-+static inline void
-+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src)
-+{
-+      ASSERT(dest != NULL);
-+      ASSERT(src != NULL);
-+      dest->i_atime = src->i_atime;
-+      dest->i_mtime = src->i_mtime;
-+      dest->i_ctime = src->i_ctime;
-+      copy_inode_size(dest, src);
-+}
-+static inline void
-+fist_copy_attr_all(inode_t *dest, const inode_t *src)
-+{
-+      ASSERT(dest != NULL);
-+      ASSERT(src != NULL);
-+      dest->i_mode = src->i_mode;
-+      dest->i_nlink = src->i_nlink;
-+      dest->i_uid = src->i_uid;
-+      dest->i_gid = src->i_gid;
-+      dest->i_rdev = src->i_rdev;
-+      dest->i_atime = src->i_atime;
-+      dest->i_mtime = src->i_mtime;
-+      dest->i_ctime = src->i_ctime;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+      dest->i_blksize = src->i_blksize;
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12)
-+      dest->i_blkbits = src->i_blkbits;
-+# endif /* linux 2.4.12 and newer */
-+      copy_inode_size(dest, src);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+      dest->i_attr_flags = src->i_attr_flags;
-+#else
-+      dest->i_flags = src->i_flags;
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+/* copied from linux/fs.h */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+      struct mutex *m1 = &d1->d_inode->i_mutex;
-+      struct mutex *m2 = &d2->d_inode->i_mutex;
-+      if (m1 != m2) {
-+              if ((unsigned long) m1 < (unsigned long) m2) {
-+                      struct mutex *tmp = m2;
-+                      m2 = m1; m1 = tmp;
-+              }
-+              mutex_lock(m1);
-+      }
-+      mutex_lock(m2);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+      struct mutex *m1 = &d1->d_inode->i_mutex;
-+      struct mutex *m2 = &d2->d_inode->i_mutex;
-+      mutex_unlock(m1);
-+      if (m1 != m2)
-+              mutex_unlock(m2);
-+      dput(d1);
-+      dput(d2);
-+}
-+
-+#else
-+static inline void double_down(struct semaphore *s1, struct semaphore *s2)
-+{
-+        if (s1 != s2) {
-+                if ((unsigned long) s1 < (unsigned long) s2) {
-+                        struct semaphore *tmp = s2;
-+                        s2 = s1; s1 = tmp;
-+                }
-+                down(s1);
-+        }
-+        down(s2);
-+}
-+
-+static inline void double_up(struct semaphore *s1, struct semaphore *s2)
-+{
-+        up(s1);
-+        if (s1 != s2)
-+                up(s2);
-+}
-+
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+        double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+        double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem);
-+        dput(d1);
-+        dput(d2);
-+}
-+#endif   /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
-+#endif  /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
-+#endif /* __KERNEL__ */
-+
-+/*
-+ * Definitions for user and kernel code
-+ */
-+
-+/* ioctls */
-+
-+#endif        /* not __MINI_FO_H_ */
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-merge
-@@ -0,0 +1,180 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.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.
-+#
-+
-+BASE=
-+STO=
-+HELP=
-+DRYRUN=
-+VERBOSE=
-+TMP="/tmp/"
-+META_NAME="META_dAfFgHE39ktF3HD2sr"
-+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge"
-+
-+COMMAND=
-+exec_command()
-+{
-+    if [ x$DRYRUN == "xset" ]; then
-+      echo "  would run: $COMMAND"
-+    elif ! [ x$DRYRUN == "xset" ]; then
-+      if [ x$VERBOSE == "xset" ]; then
-+          echo "  running: $COMMAND"
-+      fi
-+      eval $COMMAND
-+    fi
-+}
-+
-+usage()
-+{
-+cat <<EOF
-+
-+USAGE: $0 -b <base dir> -s <storage dir>
-+Version 0.1
-+
-+This script merges the contents of a mini_fo storage file system back
-+to the base file system.
-+
-+!!! Warning: This will modify the base filesystem and can destroy data
-+             if used wrongly.
-+
-+Options:
-+     -b <base dir>
-+          the directory of the base file system.
-+
-+     -s <storage dir>
-+          the directory of the storage file system.
-+
-+     -d   dry run, will not change anything and print the commands that
-+          would be executed.
-+
-+     -t   tmp dir for storing temporary file. default: $TMP
-+
-+     -v   show what operations are performed.
-+
-+     -h   displays this message.
-+
-+EOF
-+}
-+
-+# parse parameters
-+while getopts hdvt:b:s: OPTS
-+  do
-+  case $OPTS in
-+      h)  HELP="set";;
-+      d)  DRYRUN="set";;
-+      v)  VERBOSE="set";;
-+      b)  BASE="$OPTARG";;
-+      s)  STO="$OPTARG";;
-+      t)  TMP="$OPTARG";;
-+      ?)  usage
-+        exit 1;;
-+  esac
-+done
-+
-+if [ "x$HELP" == "xset" ]; then
-+    usage
-+    exit -1
-+fi
-+
-+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then
-+    echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help."
-+    exit -1;
-+fi
-+
-+# get full paths
-+pushd $STO; STO=`pwd`; popd
-+pushd $BASE; BASE=`pwd`; popd
-+TMP=${TMP%/}
-+
-+
-+cat<<EOF
-+###############################################################################
-+# mini_fo-merge
-+#
-+# base dir:       $BASE
-+# storage dir:    $STO
-+# meta filename:  $META_NAME
-+# dry run:        $DRYRUN
-+# verbose:        $VERBOSE     
-+# tmp files:      $TMP
-+###############################################################################
-+
-+EOF
-+
-+rm $TMP/$SKIP_DEL_LIST
-+
-+# first process all renamed dirs
-+echo "Merging renamed directories..."
-+pushd $STO &> /dev/null
-+find . -name $META_NAME -type f -print0  | xargs -0 -e grep  -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do 
-+    echo "entry: $ENTRY"
-+    META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+    OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'`
-+    NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3`
-+    NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'`
-+    echo "META_FILE: $META_FILE"
-+    echo "OLD_B_DIR: $OLD_B_DIR"
-+    echo "NEW_NAME: $NEW_NAME"
-+    echo  "NEW_B_DIR: $NEW_B_DIR"
-+
-+    pushd $BASE &> /dev/null
-+    # remove an existing dir in storage
-+    COMMAND="rm -rf $NEW_B_DIR"; exec_command
-+    COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command
-+    echo ""
-+    popd &> /dev/null
-+
-+    # remember this dir to exclude it from deleting later
-+    echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST
-+done
-+
-+# delete all whiteouted files from base
-+echo -e "\nDeleting whiteout'ed files from base file system..."
-+find . -name $META_NAME -type f -print0  | xargs -0 -e grep  -e '^D ' | sed -e 's/:D//' | while read ENTRY; do 
-+    META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+    DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2`
-+    DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'`
-+    grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null
-+    if [ $? -ne 0 ]; then
-+      pushd $BASE &> /dev/null
-+      COMMAND="rm -rf $DEL_FILE"; exec_command
-+      popd &> /dev/null
-+    else
-+      echo "  excluding: $DEL_FILE as in skip-del-list."
-+    fi
-+done
-+
-+# create all dirs and update permissions
-+echo -e "\nSetting up directory structures in base file system..."
-+find . -type d | sed -e 's/^\.\///' | while read DIR; do
-+    PERMS=`stat -c %a $DIR`
-+    DIR_UID=`stat -c %u $DIR`
-+    DIR_GID=`stat -c %g $DIR`
-+    pushd $BASE &> /dev/null
-+    if ! [ -d $DIR ]; then
-+      COMMAND="mkdir -p $DIR"; exec_command
-+    fi
-+    COMMAND="chmod $PERMS $DIR"; exec_command
-+    COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command
-+    popd &> /dev/null
-+done
-+
-+# merge all non-directory files
-+echo -e "\nMerging all non-directory files...."
-+for i in b c p f l s; do
-+    find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do
-+      pushd $BASE #&> /dev/null
-+      COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command
-+      popd &> /dev/null
-+    done   
-+done
-+popd &> /dev/null
-+
-+#rm $TMP/$SKIP_DEL_LIST 
-+
-+echo "Done!"
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-overlay
-@@ -0,0 +1,130 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.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.
-+#
-+
-+HELP=
-+SUFF=
-+MNTP=
-+MNT_DIR="/mnt"
-+STO=
-+STO_DIR="/tmp"
-+BASE=
-+
-+usage() 
-+{
-+cat <<EOF
-+
-+Usage: $0 [-s suffix] [-d sto_dir_dir] [-m mount point] base_dir
-+Version 0.1
-+
-+This script overlays the given base directory using the mini_fo file
-+system. If only the base directory base_dir is given, $0 
-+will use a storage directory called "sto-<base_dir_name>" in $STO_DIR,
-+and mount point "mini_fo-<base_dir_dir>" in $MNT_DIR.
-+
-+Options:
-+     -s <suffix>
-+          add given suffix to storage directory and the mount
-+          point. This is usefull for overlaying one base directory
-+          several times and avoiding conflicts with storage directory
-+          names and mount points.
-+
-+     -d <sto_dir_dir>
-+          change the directory in which the storage directory will be
-+          created (default is currently "$STO_DIR".
-+
-+     -m <mount point>
-+          use an alternative directory to create the mini_fo
-+          mountpoint (default is currently "$MNT_DIR".
-+
-+     -h   displays this message.
-+
-+EOF
-+exit 1;
-+}
-+
-+while getopts hm:s:d: OPTS
-+  do
-+  case $OPTS in
-+      s)  SUFF="$OPTARG";;
-+      d)  STO_DIR="$OPTARG";;
-+      m)  MNT_DIR="$OPTARG";;
-+      h)  HELP="set";;
-+      ?)  usage
-+        exit 1;;
-+  esac
-+done
-+shift $(($OPTIND - 1))
-+
-+BASE="$1"
-+
-+if [ "x$HELP" == "xset" ]; then
-+    usage
-+    exit -1
-+fi
-+
-+# fix suffix 
-+if [ "x$SUFF" != "x" ]; then
-+    SUFF="-$SUFF"
-+fi
-+
-+# kill trailing slashes
-+MNT_DIR=${MNT_DIR%/}
-+STO_DIR=${STO_DIR%/}
-+BASE=${BASE%/}
-+
-+
-+if ! [ -d "$BASE" ]; then
-+    echo "invalid base dir $BASE, run $0 -h for help."
-+    exit -1
-+fi
-+
-+# check opts
-+if ! [ -d "$MNT_DIR" ]; then
-+    echo "invalid mount dir $MNT_DIR, run $0 -h for help."
-+    exit -1
-+fi
-+
-+if ! [ -d "$STO_DIR" ]; then
-+    echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help."
-+    exit -1
-+fi
-+
-+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF"
-+STO="$STO_DIR/sto-`basename $BASE`$SUFF"
-+
-+# create the mount point if it doesn't exist
-+mkdir -p $MNTP
-+if [ $? -ne 0 ]; then
-+    echo "Error, failed to create mount point $MNTP"
-+fi
-+
-+mkdir -p $STO
-+if [ $? -ne 0 ]; then
-+    echo "Error, failed to create storage dir $STO"
-+fi
-+
-+# check if fs is already mounted
-+mount | grep mini_fo | grep $MNTP &> /dev/null
-+if [ $? -eq 0 ]; then
-+    echo "Error, existing mini_fo mount at $MNTP."
-+    exit -1
-+fi
-+
-+mount | grep mini_fo | grep $STO &> /dev/null
-+if [ $? -eq 0 ]; then
-+    echo "Error, $STO seems to be used already."
-+    exit -1
-+fi
-+
-+# mount 
-+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP
-+
-+if [ $? -ne 0 ]; then
-+    echo "Error, mounting failed, maybe no permisson to mount?"
-+fi
---- /dev/null
-+++ b/fs/mini_fo/mmap.c
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+#ifdef FIST_COUNT_WRITES
-+/* for counting writes in the middle vs. regular writes */
-+unsigned long count_writes = 0, count_writes_middle = 0;
-+#endif /* FIST_COUNT_WRITES */
-+
-+/* forward declaration of commit write and prepare write */
-+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+
-+
-+/*
-+ * Function for handling creation of holes when lseek-ing past the
-+ * end of the file and then writing some data.
-+ */
-+int
-+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from)
-+{
-+      int err = 0;
-+      dentry_t *dentry = file->f_dentry;
-+      inode_t *inode = dentry->d_inode;
-+      page_t *tmp_page;
-+      int index;
-+
-+      print_entry_location();
-+
-+      for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+              tmp_page = mini_fo_get1page(file, index);
-+              if (IS_ERR(tmp_page)) {
-+                      err = PTR_ERR(tmp_page);
-+                      goto out;
-+              }
-+
-+              /*
-+               * zero out rest of the contents of the page between the appropriate
-+               * offsets.
-+               */
-+              memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+              if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+                      err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+
-+              page_cache_release(tmp_page);
-+              if (err < 0)
-+                      goto out;
-+              if (current->need_resched)
-+                      schedule();
-+      }
-+
-+      /* zero out appropriate parts of last page */
-+
-+      /*
-+       * if the encoding type is block, then adjust the 'from' (where the
-+       * zeroing will start) offset appropriately
-+       */
-+      from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+
-+      if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) {
-+
-+              memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK));
-+              if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE)))
-+                      err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE);
-+
-+              if (err < 0)
-+                      goto out;
-+              if (current->need_resched)
-+                      schedule();
-+      }
-+
-+ out:
-+      print_exit_status(err);
-+      return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_writepage(page_t *page)
-+{
-+      int err = -EIO;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+      page_t *hidden_page;
-+      char *kaddr, *hidden_kaddr;
-+
-+      print_entry_location();
-+
-+      inode = page->mapping->host;
-+      hidden_inode = itohi(inode);
-+
-+      /*
-+       * writepage is called when shared mmap'ed files need to write
-+       * their pages, while prepare/commit_write are called from the
-+       * non-paged write() interface.  (However, in 2.3 the two interfaces
-+       * share the same cache, while in 2.2 they didn't.)
-+       *
-+       * So we pretty much have to duplicate much of what commit_write does.
-+       */
-+
-+      /* find lower page (returns a locked page) */
-+      hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+      if (!hidden_page)
-+              goto out;
-+
-+      /* get page address, and encode it */
-+      kaddr = (char *) kmap(page);
-+      hidden_kaddr = (char*) kmap(hidden_page);
-+      mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+      /* if encode_block could fail, then return error */
-+      kunmap(page);
-+      kunmap(hidden_page);
-+
-+      /* call lower writepage (expects locked page) */
-+      err = hidden_inode->i_mapping->a_ops->writepage(hidden_page);
-+
-+      /*
-+       * update mtime and ctime of lower level file system
-+       * mini_fo' mtime and ctime are updated by generic_file_write
-+       */
-+      hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1)
-+      UnlockPage(hidden_page);        /* b/c grab_cache_page locked it */
-+# endif /* kernel older than 2.4.1 */
-+      page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+      if (err)
-+              ClearPageUptodate(page);
-+      else
-+              SetPageUptodate(page);
-+ out:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1)
-+      UnlockPage(page);
-+# endif /* kernel 2.4.1 and newer */
-+      print_exit_status(err);
-+      return err;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * returns unlocked, up-to-date page (if ok), with increased refcnt.
-+ */
-+page_t *
-+mini_fo_get1page(file_t *file, int index)
-+{
-+      page_t *page;
-+      dentry_t *dentry;
-+      inode_t *inode;
-+      struct address_space *mapping;
-+      int err;
-+
-+      print_entry_location();
-+
-+      dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+      inode = dentry->d_inode;
-+      mapping = inode->i_mapping;
-+
-+      fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+      if (index < 0) {
-+              printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+              page = ERR_PTR(-EIO);
-+              goto out;
-+      }
-+      page = read_cache_page(mapping,
-+                             index,
-+                             (filler_t *) mapping->a_ops->readpage,
-+                             (void *) file);
-+      if (IS_ERR(page))
-+              goto out;
-+      wait_on_page(page);
-+      if (!Page_Uptodate(page)) {
-+              lock_page(page);
-+              err = mapping->a_ops->readpage(file, page);
-+              if (err) {
-+                      page = ERR_PTR(err);
-+                      goto out;
-+              }
-+              wait_on_page(page);
-+              if (!Page_Uptodate(page)) {
-+                      page = ERR_PTR(-EIO);
-+                      goto out;
-+              }
-+      }
-+
-+ out:
-+      print_exit_pointer(page);
-+      return page;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * similar to get1page, but doesn't guarantee that it will return
-+ * an unlocked page.
-+ */
-+page_t *
-+mini_fo_get1page_cached(file_t *file, int index)
-+{
-+      page_t *page;
-+      dentry_t *dentry;
-+      inode_t *inode;
-+      struct address_space *mapping;
-+      int err;
-+
-+      print_entry_location();
-+
-+      dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+      inode = dentry->d_inode;
-+      mapping = inode->i_mapping;
-+
-+      fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+      if (index < 0) {
-+              printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+              page = ERR_PTR(-EIO);
-+              goto out;
-+      }
-+      page = read_cache_page(mapping,
-+                             index,
-+                             (filler_t *) mapping->a_ops->readpage,
-+                             (void *) file);
-+      if (IS_ERR(page))
-+              goto out;
-+
-+ out:
-+      print_exit_pointer(page);
-+      return page;
-+}
-+
-+
-+/*
-+ * readpage is called from generic_page_read and the fault handler.
-+ * If your file system uses generic_page_read for the read op, it
-+ * must implement readpage.
-+ *
-+ * Readpage expects a locked page, and must unlock it.
-+ */
-+STATIC int
-+mini_fo_do_readpage(file_t *file, page_t *page)
-+{
-+      int err = -EIO;
-+      dentry_t *dentry;
-+      file_t *hidden_file = NULL;
-+      dentry_t *hidden_dentry;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+      char *page_data;
-+      page_t *hidden_page;
-+      char *hidden_page_data;
-+      int real_size;
-+
-+      print_entry_location();
-+
-+      dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+      if (ftopd(file) != NULL)
-+              hidden_file = ftohf(file);
-+      hidden_dentry = dtohd(dentry);
-+      inode = dentry->d_inode;
-+      hidden_inode = itohi(inode);
-+
-+      fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name);
-+
-+      MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+      MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+      FOR_EACH_PAGE
-+              CURRENT_HIDDEN_PAGE = NULL;
-+
-+      /* find lower page (returns a locked page) */
-+      FOR_EACH_PAGE {
-+              fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX);
-+              CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping,
-+                                                    CURRENT_HIDDEN_PAGEINDEX,
-+                                                    (filler_t *) hidden_inode->i_mapping->a_ops->readpage,
-+                                                    (void *) hidden_file);
-+              if (IS_ERR(CURRENT_HIDDEN_PAGE)) {
-+                      err = PTR_ERR(CURRENT_HIDDEN_PAGE);
-+                      CURRENT_HIDDEN_PAGE = NULL;
-+                      goto out_release;
-+              }
-+      }
-+
-+      /*
-+       * wait for the page data to show up
-+       * (signaled by readpage as unlocking the page)
-+       */
-+      FOR_EACH_PAGE {
-+              wait_on_page(CURRENT_HIDDEN_PAGE);
-+              if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+                      /*
-+                       * call readpage() again if we returned from wait_on_page with a
-+                       * page that's not up-to-date; that can happen when a partial
-+                       * page has a few buffers which are ok, but not the whole
-+                       * page.
-+                       */
-+                      lock_page(CURRENT_HIDDEN_PAGE);
-+                      err = hidden_inode->i_mapping->a_ops->readpage(hidden_file,
-+                                                                     CURRENT_HIDDEN_PAGE);
-+                      if (err) {
-+                              CURRENT_HIDDEN_PAGE = NULL;
-+                              goto out_release;
-+                      }
-+                      wait_on_page(CURRENT_HIDDEN_PAGE);
-+                      if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+                              err = -EIO;
-+                              goto out_release;
-+                      }
-+              }
-+      }
-+
-+      /* map pages, get their addresses */
-+      page_data = (char *) kmap(page);
-+      FOR_EACH_PAGE
-+              CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE);
-+
-+      /* if decode_block could fail, then return error */
-+      err = 0;
-+      real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT);
-+      if (real_size <= 0)
-+              memset(page_data, 0, PAGE_CACHE_SIZE);
-+      else if (real_size < PAGE_CACHE_SIZE) {
-+              mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index);
-+              memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size);
-+      } else
-+              mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+
-+      FOR_EACH_PAGE
-+              kunmap(CURRENT_HIDDEN_PAGE);
-+      kunmap(page);
-+
-+ out_release:
-+      FOR_EACH_PAGE
-+              if (CURRENT_HIDDEN_PAGE)
-+                      page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */
-+
-+      FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+      FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+
-+ out:
-+      if (err == 0)
-+              SetPageUptodate(page);
-+      else
-+              ClearPageUptodate(page);
-+
-+      print_exit_status(err);
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_readpage(file_t *file, page_t *page)
-+{
-+      int err;
-+      print_entry_location();
-+
-+      err = mini_fo_do_readpage(file, page);
-+
-+      /*
-+       * we have to unlock our page, b/c we _might_ have gotten a locked page.
-+       * but we no longer have to wakeup on our page here, b/c UnlockPage does
-+       * it
-+       */
-+      UnlockPage(page);
-+
-+      print_exit_status(err);
-+      return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+      int err = 0;
-+
-+      print_entry_location();
-+
-+      /*
-+       * we call kmap(page) only here, and do the kunmap
-+       * and the actual downcalls, including unlockpage and uncache
-+       * in commit_write.
-+       */
-+      kmap(page);
-+
-+      /* fast path for whole page writes */
-+      if (from == 0 && to == PAGE_CACHE_SIZE)
-+              goto out;
-+      /* read the page to "revalidate" our data */
-+      /* call the helper function which doesn't unlock the page */
-+      if (!Page_Uptodate(page))
-+              err = mini_fo_do_readpage(file, page);
-+
-+ out:
-+      print_exit_status(err);
-+      return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+      int err = -ENOMEM;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+      page_t *hidden_page;
-+      file_t *hidden_file = NULL;
-+      loff_t pos;
-+      unsigned bytes = to - from;
-+      unsigned hidden_from, hidden_to, hidden_bytes;
-+
-+      print_entry_location();
-+
-+      inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+      hidden_inode = itohi(inode);
-+
-+      ASSERT(file != NULL);
-+      /*
-+       * here we have a kmapped page, with data from the user copied
-+       * into it.  we need to encode_block it, and then call the lower
-+       * commit_write.  We also need to simulate same behavior of
-+       * generic_file_write, and call prepare_write on the lower f/s first.
-+       */
-+#ifdef FIST_COUNT_WRITES
-+      count_writes++;
-+# endif /* FIST_COUNT_WRITES */
-+
-+      /* this is append and/or extend -- we can't have holes so fill them in */
-+      if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) {
-+              page_t *tmp_page;
-+              int index;
-+              for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+                      tmp_page = mini_fo_get1page(file, index);
-+                      if (IS_ERR(tmp_page)) {
-+                              err = PTR_ERR(tmp_page);
-+                              goto out;
-+                      }
-+                      /* zero out the contents of the page at the appropriate offsets */
-+                      memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+                      if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+                              err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+                      page_cache_release(tmp_page);
-+                      if (err < 0)
-+                              goto out;
-+                      if (current->need_resched)
-+                              schedule();
-+              }
-+      }
-+
-+      if (ftopd(file) != NULL)
-+              hidden_file = ftohf(file);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_inode->i_mutex);
-+#else
-+      down(&hidden_inode->i_sem);
-+#endif
-+      /* find lower page (returns a locked page) */
-+      hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+      if (!hidden_page)
-+              goto out;
-+
-+#if FIST_ENCODING_BLOCKSIZE > 1
-+#  error encoding_blocksize greater than 1 is not yet supported
-+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */
-+
-+      hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+      hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1)));
-+      if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) {
-+
-+              /*
-+               * if this call to commit_write had introduced holes and the code
-+               * for handling holes was invoked, then the beginning of this page
-+               * must be zeroed out
-+               * zero out bytes from 'size_of_file%pagesize' to 'from'.
-+               */
-+              if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0)
-+                      memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+      }
-+      hidden_bytes = hidden_to - hidden_from;
-+
-+      /* call lower prepare_write */
-+      err = -EINVAL;
-+      if (hidden_inode->i_mapping &&
-+          hidden_inode->i_mapping->a_ops &&
-+          hidden_inode->i_mapping->a_ops->prepare_write)
-+              err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file,
-+                                                                  hidden_page,
-+                                                                  hidden_from,
-+                                                                  hidden_to);
-+      if (err)
-+              /* don't leave locked pages behind, esp. on an ENOSPC */
-+              goto out_unlock;
-+
-+      fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes);
-+      mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index);
-+      /* if encode_block could fail, then goto unlock and return error */
-+
-+      /* call lower commit_write */
-+      err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file,
-+                                                         hidden_page,
-+                                                         hidden_from,
-+                                                         hidden_to);
-+
-+      if (err < 0)
-+              goto out_unlock;
-+
-+      err = bytes;    /* convert error to no. of bytes */
-+
-+      inode->i_blocks = hidden_inode->i_blocks;
-+      /* we may have to update i_size */
-+      pos = (page->index << PAGE_CACHE_SHIFT) + to;
-+      if (pos > inode->i_size)
-+              inode->i_size = pos;
-+
-+      /*
-+       * update mtime and ctime of lower level file system
-+       * mini_fo' mtime and ctime are updated by generic_file_write
-+       */
-+      hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+      mark_inode_dirty_sync(inode);
-+
-+ out_unlock:
-+      UnlockPage(hidden_page);
-+      page_cache_release(hidden_page);
-+      kunmap(page);           /* kmap was done in prepare_write */
-+ out:
-+      /* we must set our page as up-to-date */
-+      if (err < 0)
-+              ClearPageUptodate(page);
-+      else
-+              SetPageUptodate(page);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_inode->i_mutex);
-+#else
-+      up(&hidden_inode->i_sem);
-+#endif
-+      print_exit_status(err);
-+      return err;                     /* assume all is ok */
-+}
-+
-+
-+STATIC int
-+mini_fo_bmap(struct address_space *mapping, long block)
-+{
-+      int err = 0;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+
-+      print_entry_location();
-+
-+      inode = (inode_t *) mapping->host;
-+      hidden_inode = itohi(inode);
-+
-+      if (hidden_inode->i_mapping->a_ops->bmap)
-+              err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block);
-+      print_exit_location();
-+      return err;
-+}
-+
-+
-+/*
-+ * This function is copied verbatim from mm/filemap.c.
-+ * XXX: It should be simply moved to some header file instead -- bug Al about it!
-+ */
-+static inline int sync_page(struct page *page)
-+{
-+      struct address_space *mapping = page->mapping;
-+
-+      if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-+              return mapping->a_ops->sync_page(page);
-+      return 0;
-+}
-+
-+
-+/*
-+ * XXX: we may not need this function if not FIST_FILTER_DATA.
-+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each.
-+ */
-+STATIC int
-+mini_fo_sync_page(page_t *page)
-+{
-+      int err = 0;
-+      inode_t *inode;
-+      inode_t *hidden_inode;
-+      page_t *hidden_page;
-+
-+      print_entry_location();
-+
-+      inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+      hidden_inode = itohi(inode);
-+
-+      /* find lower page (returns a locked page) */
-+      hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+      if (!hidden_page)
-+              goto out;
-+
-+      err = sync_page(hidden_page);
-+
-+      UnlockPage(hidden_page);        /* b/c grab_cache_page locked it */
-+      page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ out:
-+      print_exit_status(err);
-+      return err;
-+}
---- /dev/null
-+++ b/fs/mini_fo/README
-@@ -0,0 +1,163 @@
-+README for the mini_fo overlay file system
-+=========================================
-+
-+
-+WHAT IS MINI_FO?
-+----------------
-+
-+mini_fo is a virtual kernel file system that can make read-only
-+file systems writable. This is done by redirecting modifying operations
-+to a writeable location called "storage directory", and leaving the
-+original data in the "base directory" untouched. When reading, the
-+file system merges the modifed and original data so that only the
-+newest versions will appear. This occurs transparently to the user,
-+who can access the data like on any other read-write file system.
-+
-+Base and storage directories may be located on the same or on
-+different partitions and may be of different file system types. While
-+the storage directory obviously needs to be writable, the base may or
-+may not be writable, what doesn't matter as it will no be modified
-+anyway.
-+
-+
-+WHAT IS GOOD FOR?
-+-----------------
-+
-+The primary purpose of the mini_fo file system is to allow easy
-+software updates to embedded systems, that often store their root
-+file system in a read-only flash file system, but there are many
-+more as for example sandboxing, or for allowing live-cds to
-+permanently store information.
-+
-+
-+BUILDING
-+--------
-+This should be simple. Adjust the Makefile to point to the correct
-+kernel headers you want to build the module for. Then:
-+
-+    # make
-+
-+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6
-+kernel.
-+
-+If you are building the module for you current kernel, you can install
-+the module (as root):
-+
-+    # make install
-+
-+or uninstall with
-+
-+    # make uninstall
-+
-+
-+USING THE FILE SYSTEM
-+--------------------
-+
-+the general mount syntax is:
-+
-+   mount -t mini_fo -o base=<base directory>,sto=<storage directory>\
-+                            <base directory> <mount point>
-+
-+Example:
-+
-+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files
-+on it:
-+
-+load the module (as root)
-+    
-+    # insmod mini_fo.o for a 2.4 kernel or
-+ 
-+    # insmod mini_fo.ko for a 2.6 kernel
-+
-+
-+create a storage dir in tmp and a mountpoint for mini_fo:
-+
-+    # mkdir /tmp/sto
-+    # mkdir /mnt/mini_fo
-+
-+and mount the mini_fo file system:
-+
-+    # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo
-+
-+
-+Now the data stored on the cd can be accessed via the mini_fo
-+mountpoint just like any read-write file system, files can be modified
-+and deleted, new ones can be created and so on. When done unmount the
-+file system:
-+
-+    # unmount /mnt/mini_fo
-+
-+Note that if the file system is mounted again using the same storage
-+file system, of course it will appear in the modified state again. If
-+you remount it using an new empty storage directory, it will be
-+unmodified. Therefore by executing:
-+
-+    # cd /tmp/sto
-+    # rm -rf *
-+
-+you can nuke all the changes you made to the original file system. But
-+ remember NEVER do this while the mini_fo file system is mounted!
-+
-+
-+Alternatively you can use the mini_fo-overlay bash script, that
-+simplifies managing mini_fo mounts. See TOOLS Section.
-+
-+
-+TOOLS
-+-----
-+
-+mini_fo-merge (experimental):
-+
-+This is a bash script that will merge changes contained in the storage
-+directory back to the base directory. This allows mini_fo to function
-+as a cache file system by overlaying a slow (network, ...) file system
-+and using a fast (ramdisk, ...) as storage. When done, changes can be
-+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge
-+-h" for details.
-+
-+It can be usefull for merging changes back after a successfull test
-+(patches, software updates...)
-+
-+
-+mini_fo-overlay:
-+
-+This bash script simplifies managing one or more mini_fo mounts. For
-+overlaying a directory called "basedir1", you can just call:
-+
-+    # mini_fo-overlay basedir1
-+
-+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/"
-+as storage to "/mnt/mini_fo-basedir1/". It has more options though,
-+type "mini_fo-overlay -h" for details.
-+
-+
-+DOCUMENTATION, REPORTING BUGS, GETTING HELP
-+-------------------------------------------
-+
-+Please visit the mini_fo project page at:
-+
-+http://www.denx.de/twiki/bin/view/Know/MiniFOHome
-+
-+
-+WARNINGS
-+--------
-+
-+Never modify the base or the storage directorys while the mini_fo
-+file system is mounted, or you might crash you system. Simply accessing
-+and reading should not cause any trouble.
-+
-+Exporting a mini_fo mount point via NFS has not been tested, and may
-+or may not work.
-+
-+Check the RELEASE_NOTES for details on bugs and features.
-+
-+
-+
-+Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+
-+
---- /dev/null
-+++ b/fs/mini_fo/RELEASE_NOTES
-@@ -0,0 +1,111 @@
-+Release:      mini_fo-0.6.1 (v0-6-1)
-+Date:         21.09.2005
-+
-+
-+Changes:
-+--------
-+v0-6-1:
-+
-+- bugfixes (see ChangeLog)
-+
-+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see
-+  README for details).
-+
-+v0-6-0:
-+
-+- Support for 2.4 and 2.6 (see Makefile)
-+
-+- Partial hard link support (creating works as expected, but already
-+  existing links in the base file system will be treated as if they
-+  were individual files).
-+
-+- Various bugfixes and cleanups.
-+
-+
-+v0-6-0-pre1:
-+
-+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of
-+  many vital mini_fo parts such as the old whiteout list code which
-+  has been replaced by the new META subsystem.
-+
-+- Light weight directory renaming implemented. This means if a
-+  directory is renamed via the mini_fo filesystem this will no longer
-+  result in a complete copy in storage, instead only one empty
-+  directory will be created. All base filed contained in the original
-+  directory stay there until modified.
-+
-+- Special files (creating, renaming, deleting etc.) now working.
-+
-+- Many bugfixes and cleanup, mini_fo is now a lot more stable.
-+
-+
-+v0-5-10:
-+
-+- Final release of the 0-5-* versions. Next will be a complete rewrite
-+  of many features. This release contains several bugfixes related to
-+  directory renaming.
-+
-+
-+v0-5-10-pre6:
-+
-+- Lots of cleanup and several bugfixes related to directory deleting
-+
-+- Directory renaming suddenly works, what is most likely due to the
-+  fact tha that "mv" is smart: if the classic rename doesn't work it
-+  will assume that source and target file are on different fs and will
-+  copy the directory and try to remove the source directory. Until
-+  directory removing wasn't implemented, it would fail to do this and
-+  rollback.
-+  So, directory renaming works for now, but it doesn't yet do what you
-+  would expect from a overlay fs, so use with care.
-+
-+
-+v0-5-10-pre5:
-+
-+- implemented directory deleting 
-+- made parsing of mount options more stable
-+- New format of mount options! (See README)
-+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll
-+  happily assume it never existed!
-+
-+
-+Implemented features:
-+---------------------
-+
-+- creating hard links (see BUGS on already existing hard links)       
-+- lightweight directory renaming
-+- renaming device files, pipes, sockets, etc. 
-+- creating, renaming, deleting of special files 
-+- deleting directorys
-+- general directory reading (simple "ls" )
-+- creating files in existing directorys
-+- creating directorys
-+- renaming files.
-+- reading and writing files (involves opening)
-+- appending to files (creates copy in storage)
-+- deleting files
-+- llseek works too, what allows editors to work
-+- persistency (a deleted file stay deleted over remounts)
-+- use of symbolic links
-+- creating of device files
-+
-+
-+Not (yet) implemented features:
-+-------------------------------
-+
-+- full hard link support.
-+
-+
-+
-+BUGS:
-+-----
-+
-+Hard links in the base file system will be treated as individual
-+files, not as links to one inode.
-+
-+The main problem with hard links isn't allowing to create them, but
-+their pure existence. If you modify a base hard link, the changes made
-+will only show up on this link, the other link will remain in the
-+original state. I hope to fix this someday. Please note that this does
-+not effect the special hard links '.' and '..', that are handled
-+seperately by the lower fs.
---- /dev/null
-+++ b/fs/mini_fo/state.c
-@@ -0,0 +1,620 @@
-+/*
-+ * Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+/* create the storage file, setup new states */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+int create_sto_reg_file(dentry_t *dentry, int mode)
-+#endif
-+{
-+      int err = 0;
-+      inode_t *dir;
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+
-+      if(exists_in_storage(dentry)) {
-+              printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      err = get_neg_sto_dentry(dentry);
-+
-+      if (err) {
-+              printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n");
-+              goto out;
-+      }
-+      
-+      dir = dentry->d_parent->d_inode;
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      /* lock parent */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+        down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+      err = PTR_ERR(hidden_sto_dir_dentry);
-+        if (IS_ERR(hidden_sto_dir_dentry))
-+                goto out;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+                       hidden_sto_dentry,
-+                       mode, nd);
-+#else
-+      err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+                       hidden_sto_dentry,
-+                       mode);
-+#endif
-+        if(err) {
-+              printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n");
-+                goto out_lock;
-+      }
-+
-+      if(!dtohd2(dentry)->d_inode) {
-+              printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n");
-+                err = -EINVAL;
-+                goto out_lock;
-+        }
-+
-+        /* interpose the new inode */
-+        if(dtost(dentry) == DELETED) {
-+                dtost(dentry) = DEL_REWRITTEN;
-+                err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+                if(err)
-+                        goto out_lock;
-+        }
-+        else if(dtost(dentry) == NON_EXISTANT) {
-+                dtost(dentry) = CREATED;
-+                err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+                if(err)
-+                        goto out_lock;
-+        }
-+        else if(dtost(dentry) == UNMODIFIED) {
-+                dtost(dentry) = MODIFIED;
-+                /* interpose on new inode */
-+                if(itohi2(dentry->d_inode) != NULL) {
-+                        printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n");
-+                        err = -EINVAL;
-+                        goto out_lock;
-+                }
-+                itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+      }
-+      fist_copy_attr_timesizes(dentry->d_parent->d_inode, 
-+                               hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+        dput(hidden_sto_dir_dentry);
-+ out:
-+      return err;
-+}
-+
-+/* create the sto dir, setup states */
-+int create_sto_dir(dentry_t *dentry, int mode)
-+{
-+      int err = 0;
-+      inode_t *dir;
-+      dentry_t *hidden_sto_dentry;
-+        dentry_t *hidden_sto_dir_dentry;
-+
-+      /* had to take the "!S_ISDIR(mode))" check out, because it failed */
-+      if(exists_in_storage(dentry)) {
-+                printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\
-+n");
-+                err = -EINVAL;
-+                goto out;
-+        }
-+      
-+      err = get_neg_sto_dentry(dentry);
-+      if(err) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      dir = dentry->d_parent->d_inode;
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+      err = PTR_ERR(hidden_sto_dir_dentry);
-+      if (IS_ERR(hidden_sto_dir_dentry))
-+              goto out;
-+      
-+      err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+                      hidden_sto_dentry,
-+                      mode);
-+      if(err) {
-+              printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n");
-+              goto out_lock;
-+      }
-+
-+      if(!dtohd2(dentry)->d_inode) {
-+              printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n");
-+              err = -EINVAL;
-+              goto out_lock;
-+      }
-+
-+      /* interpose the new inode */
-+      if(dtost(dentry) == DELETED) {
-+              dtost(dentry) = DEL_REWRITTEN;
-+              err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+              if(err)
-+                      goto out_lock;
-+      }
-+      else if(dtopd(dentry)->state == NON_EXISTANT) {
-+              dtopd(dentry)->state = CREATED;
-+              err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+              if(err)
-+                      goto out_lock;
-+      }
-+      else if(dtopd(dentry)->state == UNMODIFIED) {
-+              dtopd(dentry)->state = MODIFIED;
-+              /* interpose on new inode */
-+              if(itohi2(dentry->d_inode) != NULL) {
-+                      printk(KERN_CRIT "mini_fo:  create_sto_dir: ERROR, invalid inode detected.\n");
-+                      err = -EINVAL;
-+                      goto out_lock;
-+              }
-+              itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+      }
-+
-+      fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+      /* initalize the wol list */
-+      itopd(dentry->d_inode)->deleted_list_size = -1;
-+      itopd(dentry->d_inode)->renamed_list_size = -1;
-+      meta_build_lists(dentry);
-+
-+
-+ out_lock:
-+      /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+ out:
-+      return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev) 
-+#else
-+int create_sto_nod(dentry_t *dentry, int mode, int dev) 
-+#endif
-+{
-+      int err = 0;
-+      inode_t *dir;
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+
-+      if(exists_in_storage(dentry)) {
-+              err = -EEXIST;
-+              goto out;
-+      }
-+      err = get_neg_sto_dentry(dentry);
-+
-+      if (err) {
-+                printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n");
-+                goto out;
-+        }     
-+
-+      dir = dentry->d_parent->d_inode;
-+      hidden_sto_dentry = dtohd2(dentry);
-+      
-+      /* lock parent */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      
-+      err = PTR_ERR(hidden_sto_dir_dentry);
-+      if (IS_ERR(hidden_sto_dir_dentry))
-+              goto out;
-+
-+      err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev);
-+      if(err)
-+              goto out_lock;
-+
-+      if(!dtohd2(dentry)->d_inode) {
-+              printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n");
-+              err = -EINVAL; /* return something indicating failure */
-+              goto out_lock;
-+      }
-+
-+      /* interpose the new inode */
-+      if(dtost(dentry) == DELETED) {
-+              dtost(dentry) = DEL_REWRITTEN;
-+              err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+              if(err)
-+                      goto out_lock;
-+      }
-+      else if(dtost(dentry) == NON_EXISTANT) {
-+              dtost(dentry) = CREATED;
-+              err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+              if(err)
-+                      goto out_lock;
-+      }
-+      else if(dtost(dentry) == UNMODIFIED) {
-+              dtost(dentry) = MODIFIED;
-+              /* interpose on new inode */
-+              if(itohi2(dentry->d_inode) != NULL) {
-+                      printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n");
-+                      err = -EINVAL;
-+                      goto out_lock;
-+              }
-+              itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+      }
-+
-+      fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+ out:
-+      return err;
-+}
-+
-+
-+/* unimplemented (and possibly not usefull): 
-+
-+   nondir-del_to_del_rew
-+   nondir-non_exist_to_creat
-+
-+   dir-unmod_to_del
-+   dir-mod_to_del
-+   dir-creat_to_del
-+   dir-del_rew_to_del
-+   dir-del_to_del_rew
-+   dir-non_exist_to_creat
-+*/
-+
-+
-+/* bring a file of any type from state UNMODIFIED to MODIFIED */
-+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag) 
-+{
-+      int err = 0;
-+      struct vfsmount *tgt_mnt;
-+      struct vfsmount *src_mnt;
-+      dentry_t *tgt_dentry;
-+      dentry_t *src_dentry;
-+      dentry_t *hidden_sto_dentry;
-+      dentry_t *hidden_sto_dir_dentry;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if((dtost(dentry) != UNMODIFIED) ||
-+         S_ISDIR(dentry->d_inode->i_mode)) {
-+              printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+                                  wrong type or state.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      err = get_neg_sto_dentry(dentry);
-+
-+      if (err) {
-+              printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+                                  ERROR getting neg. sto dentry.\n");
-+              goto out;
-+      }
-+      
-+      /* create sto file */
-+      hidden_sto_dentry = dtohd2(dentry);
-+
-+      /* lock parent */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+        down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+      err = PTR_ERR(hidden_sto_dir_dentry);
-+        if (IS_ERR(hidden_sto_dir_dentry))
-+                goto out;
-+
-+      /* handle different types of nondirs */
-+      if(S_ISCHR(dentry->d_inode->i_mode) ||
-+         S_ISBLK(dentry->d_inode->i_mode)) {
-+              err = vfs_mknod(hidden_sto_dir_dentry->d_inode,
-+                              hidden_sto_dentry,
-+                              dtohd(dentry)->d_inode->i_mode,
-+                              dtohd(dentry)->d_inode->i_rdev);
-+      }
-+      
-+      else if(S_ISREG(dentry->d_inode->i_mode)) {
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+              err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+                               hidden_sto_dentry,
-+                               dtohd(dentry)->d_inode->i_mode, NULL);
-+#else
-+              err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+                               hidden_sto_dentry,
-+                               dtohd(dentry)->d_inode->i_mode);
-+#endif
-+      }
-+        if(err) {
-+              printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+                                  ERROR creating sto file.\n");
-+                goto out_lock;
-+      }
-+
-+      /* interpose on new inode */
-+      if(itohi2(dentry->d_inode) != NULL) {
-+              printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+                                  ERROR, invalid inode detected.\n");
-+              err = -EINVAL;
-+              goto out_lock;
-+      }
-+
-+      itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+        
-+        fist_copy_attr_timesizes(dentry->d_parent->d_inode, 
-+                               hidden_sto_dir_dentry->d_inode);
-+      dtost(dentry) = MODIFIED;
-+
-+      /* copy contents if regular file and cp_flag = 1 */
-+      if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) {
-+
-+              /* unlock first */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+              mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+              up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+              dput(hidden_sto_dir_dentry);
-+
-+              tgt_dentry = dtohd2(dentry);
-+              tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+              src_dentry = dtohd(dentry);
-+              src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt;
-+              
-+              err = mini_fo_cp_cont(tgt_dentry, tgt_mnt, 
-+                                    src_dentry, src_mnt);
-+              if(err) {
-+                      printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+                                          ERROR copying contents.\n");
-+              }
-+              goto out;       
-+      }
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+        dput(hidden_sto_dir_dentry);
-+ out:
-+      return err;
-+}
-+
-+/* this function is currently identical to nondir_creat_to_del */
-+int nondir_del_rew_to_del(dentry_t *dentry)
-+{
-+      return nondir_creat_to_del(dentry);
-+}
-+
-+int nondir_creat_to_del(dentry_t *dentry) 
-+{
-+      int err = 0;
-+
-+      inode_t *hidden_sto_dir_inode;
-+      dentry_t *hidden_sto_dir_dentry;
-+      dentry_t *hidden_sto_dentry;
-+      
-+      check_mini_fo_dentry(dentry);
-+
-+      /* for now this function serves for both state DEL_REWRITTEN and 
-+       * CREATED */
-+      if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) ||
-+         S_ISDIR(dentry->d_inode->i_mode)) {
-+              printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \
-+                                  wrong type or state.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      
-+      hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+      hidden_sto_dentry = dtohd2(dentry);
-+      
-+      /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      
-+      /* avoid destroying the hidden inode if the file is in use */
-+      dget(hidden_sto_dentry);
-+      err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+      dput(hidden_sto_dentry);
-+      if(!err)
-+              d_delete(hidden_sto_dentry);
-+      
-+      /* propagate number of hard-links */
-+      dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+      
-+      dtost(dentry) = NON_EXISTANT;
-+      
-+      /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+      
-+ out:
-+      return err;
-+}
-+
-+int nondir_mod_to_del(dentry_t *dentry)
-+{
-+      int err;
-+      dentry_t *hidden_sto_dentry;
-+      inode_t *hidden_sto_dir_inode;
-+      dentry_t *hidden_sto_dir_dentry;
-+      
-+      check_mini_fo_dentry(dentry);
-+
-+      if(dtost(dentry) != MODIFIED ||
-+         S_ISDIR(dentry->d_inode->i_mode)) {
-+              printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \
-+                                  wrong type or state.\n");
-+              err = -1;
-+              goto out;
-+      }
-+
-+      hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+      hidden_sto_dentry = dtohd2(dentry);
-+      
-+      /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+      hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      
-+      /* avoid destroying the hidden inode if the file is in use */
-+      dget(hidden_sto_dentry);
-+      err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+      dput(hidden_sto_dentry);
-+      if(!err)
-+              d_delete(hidden_sto_dentry);
-+      
-+      /* propagate number of hard-links */
-+      dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+      
-+      /* dput base dentry, this will relase the inode and free the
-+       * dentry, as we will never need it again. */
-+      dput(dtohd(dentry));
-+      dtohd(dentry) = NULL;
-+      dtost(dentry) = DELETED;
-+
-+      /* add deleted file to META-file */
-+      meta_add_d_entry(dentry->d_parent, 
-+                       dentry->d_name.name, 
-+                       dentry->d_name.len);
-+      
-+      /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+      up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+      dput(hidden_sto_dir_dentry);
-+
-+ out:
-+      return err;
-+}
-+
-+int nondir_unmod_to_del(dentry_t *dentry)
-+{
-+      int err = 0;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(dtost(dentry) != UNMODIFIED ||
-+         S_ISDIR(dentry->d_inode->i_mode)) {
-+              printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \
-+                                  wrong type or state.\n");
-+              err = -1;
-+              goto out;
-+      }
-+      
-+       /* next we have to get a negative dentry for the storage file */
-+      err = get_neg_sto_dentry(dentry);
-+
-+      if(err)
-+              goto out;               
-+
-+      /* add deleted file to META lists */
-+      err = meta_add_d_entry(dentry->d_parent, 
-+                             dentry->d_name.name, 
-+                             dentry->d_name.len);
-+
-+      if(err)
-+              goto out;
-+      
-+      /* dput base dentry, this will relase the inode and free the
-+       * dentry, as we will never need it again. */
-+      dput(dtohd(dentry));
-+      dtohd(dentry) = NULL;
-+      dtost(dentry) = DELETED;
-+      
-+ out:
-+      return err;
-+}
-+
-+/* bring a dir from state UNMODIFIED to MODIFIED */
-+int dir_unmod_to_mod(dentry_t *dentry) 
-+{
-+      int err;
-+
-+      check_mini_fo_dentry(dentry);
-+
-+      if(dtost(dentry) != UNMODIFIED ||
-+         !S_ISDIR(dentry->d_inode->i_mode)) {
-+              printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+                                  wrong type or state.\n");
-+              err = -1;
-+              goto out;
-+      }
-+
-+      /* this creates our dir incl. sto. structure */
-+      err = build_sto_structure(dentry->d_parent, dentry);
-+      if(err) {
-+              printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+                                  build_sto_structure failed.\n");
-+              goto out;
-+      }
-+ out:
-+      return err;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/super.c
-@@ -0,0 +1,281 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.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.
-+ */
-+
-+/*
-+ *  $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif 
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+STATIC void
-+mini_fo_read_inode(inode_t *inode)
-+{
-+      static struct address_space_operations mini_fo_empty_aops;
-+
-+      __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL);
-+      if (!itopd(inode)) {
-+              printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__);
-+              ASSERT(NULL);
-+      }
-+      itohi(inode) = NULL;
-+      itohi2(inode) = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+      inode->i_version++;
-+#else
-+      inode->i_version = ++event;     /* increment inode version */
-+#endif
-+      inode->i_op = &mini_fo_main_iops;
-+      inode->i_fop = &mini_fo_main_fops;
-+#if 0
-+      /*
-+       * XXX: To export a file system via NFS, it has to have the
-+       * FS_REQUIRES_DEV flag, so turn it on.  But should we inherit it from
-+       * the lower file system, or can we allow our file system to be exported
-+       * even if the lower one cannot be natively exported.
-+       */
-+      inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV;
-+      /*
-+       * OK, the above was a hack, which is now turned off because it may
-+       * cause a panic/oops on some systems.  The correct way to export a
-+       * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export
-+       * parameter, which requires 2.4.20 or later.
-+       */
-+#endif
-+      /* I don't think ->a_ops is ever allowed to be NULL */
-+      inode->i_mapping->a_ops = &mini_fo_empty_aops;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * No need to call write_inode() on the lower inode, as it
-+ * will have been marked 'dirty' anyway. But we might need
-+ * to write some of our own stuff to disk.
-+ */
-+STATIC void
-+mini_fo_write_inode(inode_t *inode, int sync)
-+{
-+      print_entry_location();
-+      print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+STATIC void
-+mini_fo_put_inode(inode_t *inode)
-+{
-+      /*
-+       * This is really funky stuff:
-+       * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed.
-+       * It is currently holding a reference to the hidden inode.
-+       * Therefore, it needs to release that reference by calling iput on the hidden inode.
-+       * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0.
-+       * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files.
-+       * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode.
-+       */
-+      if (atomic_read(&inode->i_count) == 1)
-+              inode->i_nlink = 0;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * we now define delete_inode, because there are two VFS paths that may
-+ * destroy an inode: one of them calls clear inode before doing everything
-+ * else that's needed, and the other is fine.  This way we truncate the inode
-+ * size (and its pages) and then clear our own inode, which will do an iput
-+ * on our and the lower inode.
-+ */
-+STATIC void
-+mini_fo_delete_inode(inode_t *inode)
-+{
-+      print_entry_location();
-+
-+      fist_checkinode(inode, "mini_fo_delete_inode IN");
-+      inode->i_size = 0;              /* every f/s seems to do that */
-+      clear_inode(inode);
-+
-+      print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+/* final actions when unmounting a file system */
-+STATIC void
-+mini_fo_put_super(super_block_t *sb)
-+{
-+      if (stopd(sb)) {
-+              mntput(stopd(sb)->hidden_mnt);
-+              mntput(stopd(sb)->hidden_mnt2);
-+
-+              /* mk: no! dput(stopd(sb)->base_dir_dentry); 
-+                 dput(stopd(sb)->storage_dir_dentry); */
-+
-+              kfree(stopd(sb));
-+              __stopd(sb) = NULL;
-+      }
-+}
-+
-+
-+#ifdef NOT_NEEDED
-+/*
-+ * This is called in do_umount before put_super.
-+ * The superblock lock is not held yet.
-+ * We probably do not need to define this or call write_super
-+ * on the hidden_sb, because sync_supers() will get to hidden_sb
-+ * sooner or later.  But it is also called from file_fsync()...
-+ */
-+STATIC void
-+mini_fo_write_super(super_block_t *sb)
-+{
-+      return;
-+}
-+#endif /* NOT_NEEDED */
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_statfs(struct dentry *d, struct kstatfs *buf)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf)
-+#else
-+mini_fo_statfs(super_block_t *sb, struct statfs *buf)
-+#endif
-+{
-+      int err = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+      struct dentry *hidden_d;
-+
-+      hidden_d = dtohd(d);
-+      err = vfs_statfs(hidden_d, buf);
-+#else
-+      super_block_t *hidden_sb;
-+
-+      hidden_sb = stohs(sb);
-+      err = vfs_statfs(hidden_sb, buf);
-+#endif
-+
-+      return err;
-+}
-+
-+
-+/*
-+ * XXX: not implemented.  This is not allowed yet.
-+ * Should we call this on the hidden_sb?  Probably not.
-+ */
-+STATIC int
-+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data)
-+{
-+      //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n");
-+      return -ENOSYS;
-+}
-+
-+
-+/*
-+ * Called by iput() when the inode reference count reached zero
-+ * and the inode is not hashed anywhere.  Used to clear anything
-+ * that needs to be, before the inode is completely destroyed and put
-+ * on the inode free list.
-+ */
-+STATIC void
-+mini_fo_clear_inode(inode_t *inode)
-+{
-+      /*
-+       * Decrement a reference to a hidden_inode, which was incremented
-+       * by our read_inode when it was created initially.
-+       */
-+
-+      /* release the wol_list */
-+      if(S_ISDIR(inode->i_mode)) {
-+              __meta_put_lists(inode);
-+      }
-+
-+      /* mk: fan out fun */
-+      if(itohi(inode))
-+              iput(itohi(inode));
-+      if(itohi2(inode))
-+              iput(itohi2(inode));
-+
-+      // XXX: why this assertion fails?
-+      // because it doesn't like us
-+      // ASSERT((inode->i_state & I_DIRTY) == 0);
-+      kfree(itopd(inode));
-+      __itopd(inode) = NULL;
-+}
-+
-+
-+/*
-+ * Called in do_umount() if the MNT_FORCE flag was used and this
-+ * function is defined.  See comment in linux/fs/super.c:do_umount().
-+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
-+ * code can actually succeed and won't leave tasks that need handling.
-+ *
-+ * PS. I wonder if this is somehow useful to undo damage that was
-+ * left in the kernel after a user level file server (such as amd)
-+ * dies.
-+ */
-+STATIC void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_umount_begin(struct vfsmount *mnt, int flags)
-+{
-+      struct vfsmount *hidden_mnt;
-+
-+      hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt;
-+
-+      if (hidden_mnt->mnt_sb->s_op->umount_begin)
-+              hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags);
-+
-+}
-+#else
-+mini_fo_umount_begin(super_block_t *sb)
-+{
-+      super_block_t *hidden_sb;
-+
-+      hidden_sb = stohs(sb);
-+
-+      if (hidden_sb->s_op->umount_begin)
-+              hidden_sb->s_op->umount_begin(hidden_sb);
-+
-+}
-+#endif
-+
-+
-+struct super_operations mini_fo_sops =
-+{
-+      read_inode:             mini_fo_read_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+      write_inode:    mini_fo_write_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+      put_inode:              mini_fo_put_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+      delete_inode:   mini_fo_delete_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+      put_super:              mini_fo_put_super,
-+      statfs:         mini_fo_statfs,
-+      remount_fs:             mini_fo_remount_fs,
-+      clear_inode:    mini_fo_clear_inode,
-+      umount_begin:   mini_fo_umount_begin,
-+};
diff --git a/target/linux/generic-2.6/patches-2.6.24/213-kobject_uevent.patch b/target/linux/generic-2.6/patches-2.6.24/213-kobject_uevent.patch
deleted file mode 100644 (file)
index 7d4b232..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -27,7 +27,8 @@ u64 uevent_seqnum;
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- static DEFINE_SPINLOCK(sequence_lock);
- #if defined(CONFIG_NET)
--static struct sock *uevent_sock;
-+struct sock *uevent_sock = NULL;
-+EXPORT_SYMBOL_GPL(uevent_sock);
- #endif
- /* the strings here must match the enum in include/linux/kobject.h */
-@@ -40,6 +41,18 @@ static const char *kobject_actions[] = {
-       [KOBJ_OFFLINE] =        "offline",
- };
-+u64 uevent_next_seqnum(void)
-+{
-+      u64 seq;
-+
-+      spin_lock(&sequence_lock);
-+      seq = ++uevent_seqnum;
-+      spin_unlock(&sequence_lock);
-+      
-+      return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
-  * kobject_action_type - translate action string to numeric type
-  *
-@@ -173,9 +186,7 @@ int kobject_uevent_env(struct kobject *k
-       }
-       /* we will send an event, so request a new sequence number */
--      spin_lock(&sequence_lock);
--      seq = ++uevent_seqnum;
--      spin_unlock(&sequence_lock);
-+      seq = uevent_next_seqnum();
-       retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq);
-       if (retval)
-               goto exit;
diff --git a/target/linux/generic-2.6/patches-2.6.24/220-sound_kconfig.patch b/target/linux/generic-2.6/patches-2.6.24/220-sound_kconfig.patch
deleted file mode 100644 (file)
index d215d12..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -9,7 +9,7 @@ config SND_PCM
-       depends on SND
- config SND_HWDEP
--      tristate
-+      tristate "Sound hardware support"
-       depends on SND
- config SND_RAWMIDI
diff --git a/target/linux/generic-2.6/patches-2.6.24/400-ledtrig_morse.patch b/target/linux/generic-2.6/patches-2.6.24/400-ledtrig_morse.patch
deleted file mode 100644 (file)
index 6db1472..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -146,4 +146,8 @@ config LEDS_TRIGGER_HEARTBEAT
-         load average.
-         If unsure, say Y.
-+config LEDS_TRIGGER_MORSE
-+      tristate "LED Morse Trigger"
-+      depends on LEDS_TRIGGERS
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -24,3 +24,4 @@ obj-$(CONFIG_LEDS_CM_X270)              
- obj-$(CONFIG_LEDS_TRIGGER_TIMER)      += ledtrig-timer.o
- obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)   += ledtrig-ide-disk.o
- obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)  += ledtrig-heartbeat.o
-+obj-$(CONFIG_LEDS_TRIGGER_MORSE)      += ledtrig-morse.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/401-led_alix.patch b/target/linux/generic-2.6/patches-2.6.24/401-led_alix.patch
deleted file mode 100644 (file)
index 81afd81..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -81,6 +81,12 @@ config LEDS_WRAP
-       help
-         This option enables support for the PCEngines WRAP programmable LEDs.
-+config LEDS_ALIX
-+      tristate "LED Support for the ALIX 2/3 boards"
-+      depends on LEDS_CLASS
-+      help
-+        This option enables support for the three LEDs on the PCEngines ALIX 2/3 boards.
-+
- config LEDS_H1940
-       tristate "LED Support for iPAQ H1940 device"
-       depends on LEDS_CLASS && ARCH_H1940
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -14,6 +14,7 @@ obj-$(CONFIG_LEDS_S3C24XX)           += leds-s3c2
- obj-$(CONFIG_LEDS_AMS_DELTA)          += leds-ams-delta.o
- obj-$(CONFIG_LEDS_NET48XX)            += leds-net48xx.o
- obj-$(CONFIG_LEDS_WRAP)                       += leds-wrap.o
-+obj-$(CONFIG_LEDS_ALIX)                       += leds-alix.o
- obj-$(CONFIG_LEDS_H1940)              += leds-h1940.o
- obj-$(CONFIG_LEDS_COBALT_QUBE)                += leds-cobalt-qube.o
- obj-$(CONFIG_LEDS_COBALT_RAQ)         += leds-cobalt-raq.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/402-ledtrig_default_on.patch b/target/linux/generic-2.6/patches-2.6.24/402-ledtrig_default_on.patch
deleted file mode 100644 (file)
index 0e1164c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -156,4 +156,11 @@ config LEDS_TRIGGER_MORSE
-       tristate "LED Morse Trigger"
-       depends on LEDS_TRIGGERS
-+config LEDS_TRIGGER_DEFAULT_ON
-+      tristate "LED Default ON Trigger"
-+      depends on LEDS_TRIGGERS
-+      help
-+        This allows LEDs to be initialised in the ON state.
-+        If unsure, say Y.
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -26,3 +26,4 @@ obj-$(CONFIG_LEDS_TRIGGER_TIMER)     += ledt
- obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)   += ledtrig-ide-disk.o
- obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)  += ledtrig-heartbeat.o
- obj-$(CONFIG_LEDS_TRIGGER_MORSE)      += ledtrig-morse.o
-+obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/403-ds1672_detect.patch b/target/linux/generic-2.6/patches-2.6.24/403-ds1672_detect.patch
deleted file mode 100644 (file)
index 9c2a2f9..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
---- a/drivers/rtc/rtc-ds1672.c
-+++ b/drivers/rtc/rtc-ds1672.c
-@@ -13,10 +13,10 @@
- #include <linux/i2c.h>
- #include <linux/rtc.h>
--#define DRV_VERSION "0.3"
-+#define DRV_VERSION "0.4"
--/* Addresses to scan: none. This chip cannot be detected. */
--static unsigned short normal_i2c[] = { I2C_CLIENT_END };
-+/* Addresses to scan: 0x68 */
-+static unsigned short normal_i2c[] = { 0x68, I2C_CLIENT_END };
- /* Insmod parameters */
- I2C_CLIENT_INSMOD;
diff --git a/target/linux/generic-2.6/patches-2.6.24/410-gpio_buttons.patch b/target/linux/generic-2.6/patches-2.6.24/410-gpio_buttons.patch
deleted file mode 100644 (file)
index 31d40c9..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- a/drivers/input/misc/Kconfig
-+++ b/drivers/input/misc/Kconfig
-@@ -183,4 +183,20 @@ config HP_SDC_RTC
-         Say Y here if you want to support the built-in real time clock
-         of the HP SDC controller.
-+config INPUT_GPIO_BUTTONS
-+      tristate "Polled GPIO buttons interface"
-+      depends on GENERIC_GPIO
-+      select INPUT_POLLDEV
-+      help
-+        This driver implements support for buttons connected
-+        to GPIO pins of various CPUs (and some other chips).
-+
-+        Say Y here if your device has buttons connected
-+        directly to such GPIO pins.  Your board-specific
-+        setup logic must also provide a platform device,
-+        with configuration data saying which GPIOs are used.
-+
-+        To compile this driver as a module, choose M here: the
-+        module will be called gpio-buttons.
-+
- endif
---- a/drivers/input/misc/Makefile
-+++ b/drivers/input/misc/Makefile
-@@ -18,3 +18,4 @@ obj-$(CONFIG_INPUT_POWERMATE)                += powerm
- obj-$(CONFIG_INPUT_YEALINK)           += yealink.o
- obj-$(CONFIG_HP_SDC_RTC)              += hp_sdc_rtc.o
- obj-$(CONFIG_INPUT_UINPUT)            += uinput.o
-+obj-$(CONFIG_INPUT_GPIO_BUTTONS)      += gpio_buttons.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch b/target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch
deleted file mode 100644 (file)
index 0b184a0..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -946,6 +946,13 @@ config CS5535_GPIO
-         If compiled as a module, it will be called cs5535_gpio.
-+config GPIO_DEVICE
-+      tristate "GPIO device support"
-+      depends on GENERIC_GPIO
-+      help
-+        Say Y to enable Linux GPIO device support.  This allows control of
-+        GPIO pins using a character device
-+
- config GPIO_VR41XX
-       tristate "NEC VR4100 series General-purpose I/O Unit support"
-       depends on CPU_VR41XX
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -93,6 +93,7 @@ obj-$(CONFIG_SCx200_GPIO)    += scx200_gpio
- obj-$(CONFIG_PC8736x_GPIO)    += pc8736x_gpio.o
- obj-$(CONFIG_NSC_GPIO)                += nsc_gpio.o
- obj-$(CONFIG_CS5535_GPIO)     += cs5535_gpio.o
-+obj-$(CONFIG_GPIO_DEVICE)     += gpio_dev.o
- obj-$(CONFIG_GPIO_VR41XX)     += vr41xx_giu.o
- obj-$(CONFIG_GPIO_TB0219)     += tb0219.o
- obj-$(CONFIG_TELCLOCK)                += tlclk.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/510-yaffs_support.patch b/target/linux/generic-2.6/patches-2.6.24/510-yaffs_support.patch
deleted file mode 100644 (file)
index 4553236..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -420,6 +420,7 @@ config FS_POSIX_ACL
- source "fs/xfs/Kconfig"
- source "fs/gfs2/Kconfig"
-+source "fs/yaffs2/Kconfig"
- config OCFS2_FS
-       tristate "OCFS2 file system support"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -120,3 +120,4 @@ obj-$(CONFIG_HPPFS)                += hppfs/
- obj-$(CONFIG_DEBUG_FS)                += debugfs/
- obj-$(CONFIG_OCFS2_FS)                += ocfs2/
- obj-$(CONFIG_GFS2_FS)           += gfs2/
-+obj-$(CONFIG_YAFFS_FS)                += yaffs2/
diff --git a/target/linux/generic-2.6/patches-2.6.24/600-phy_extension.patch b/target/linux/generic-2.6/patches-2.6.24/600-phy_extension.patch
deleted file mode 100644 (file)
index ed37e1a..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -345,6 +345,50 @@ int phy_ethtool_gset(struct phy_device *
- }
- EXPORT_SYMBOL(phy_ethtool_gset);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
-+{
-+      u32 cmd;
-+      int tmp;
-+      struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-+      struct ethtool_value edata = { ETHTOOL_GLINK };
-+
-+      if (get_user(cmd, (u32 *) useraddr))
-+              return -EFAULT;
-+
-+      switch (cmd) {
-+      case ETHTOOL_GSET:
-+              phy_ethtool_gset(phydev, &ecmd);
-+              if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-+                      return -EFAULT;
-+              return 0;
-+      
-+      case ETHTOOL_SSET:
-+              if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-+                      return -EFAULT;
-+              return phy_ethtool_sset(phydev, &ecmd);
-+
-+      case ETHTOOL_NWAY_RST:
-+              /* if autoneg is off, it's an error */
-+              tmp = phy_read(phydev, MII_BMCR);
-+              if (tmp & BMCR_ANENABLE) {
-+                      tmp |= (BMCR_ANRESTART);
-+                      phy_write(phydev, MII_BMCR, tmp);
-+                      return 0;
-+              }       
-+              return -EINVAL;
-+
-+      case ETHTOOL_GLINK:
-+              edata.data = (phy_read(phydev,
-+                              MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
-+              if (copy_to_user(useraddr, &edata, sizeof(edata)))
-+                      return -EFAULT;
-+              return 0;
-+      }
-+
-+      return -EOPNOTSUPP;
-+}
-+EXPORT_SYMBOL(phy_ethtool_ioctl);
-+
- /**
-  * phy_mii_ioctl - generic PHY MII ioctl interface
-  * @phydev: the phy_device struct
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -398,6 +398,7 @@ void phy_start_machine(struct phy_device
- void phy_stop_machine(struct phy_device *phydev);
- int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
- int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
- int phy_mii_ioctl(struct phy_device *phydev,
-               struct mii_ioctl_data *mii_data, int cmd);
- int phy_start_interrupts(struct phy_device *phydev);
diff --git a/target/linux/generic-2.6/patches-2.6.24/601-br2684-routed-support.patch b/target/linux/generic-2.6/patches-2.6.24/601-br2684-routed-support.patch
deleted file mode 100644 (file)
index 3bc2e26..0000000
+++ /dev/null
@@ -1,728 +0,0 @@
---- a/include/linux/atmbr2684.h
-+++ b/include/linux/atmbr2684.h
-@@ -14,6 +14,9 @@
- #define BR2684_MEDIA_FDDI     (3)
- #define BR2684_MEDIA_802_6    (4)     /* 802.6 */
-+                                      /* used only at device creation:  */
-+#define BR2684_FLAG_ROUTED    (1<<16) /* payload is routed, not bridged */
-+
- /*
-  * Is there FCS inbound on this VC?  This currently isn't supported.
-  */
-@@ -36,15 +39,22 @@
- #define BR2684_ENCAPS_AUTODETECT (2)  /* Unsuported */
- /*
-+ * Is this VC bridged or routed?
-+ */
-+
-+#define BR2684_PAYLOAD_ROUTED   (0)
-+#define BR2684_PAYLOAD_BRIDGED  (1)
-+
-+/*
-  * This is for the ATM_NEWBACKENDIF call - these are like socket families:
-  * the first element of the structure is the backend number and the rest
-  * is per-backend specific
-  */
- struct atm_newif_br2684 {
--      atm_backend_t   backend_num;    /* ATM_BACKEND_BR2684 */
--      int             media;          /* BR2684_MEDIA_* */
--      char            ifname[IFNAMSIZ];
--      int             mtu;
-+      atm_backend_t backend_num;      /* ATM_BACKEND_BR2684 */
-+      int media;              /* BR2684_MEDIA_*, flags in upper bits */
-+      char ifname[IFNAMSIZ];
-+      int mtu;
- };
- /*
-@@ -55,10 +65,10 @@ struct atm_newif_br2684 {
- #define BR2684_FIND_BYNUM     (1)
- #define BR2684_FIND_BYIFNAME  (2)
- struct br2684_if_spec {
--      int method;                     /* BR2684_FIND_* */
-+      int method;             /* BR2684_FIND_* */
-       union {
--              char            ifname[IFNAMSIZ];
--              int             devnum;
-+              char ifname[IFNAMSIZ];
-+              int devnum;
-       } spec;
- };
-@@ -68,16 +78,16 @@ struct br2684_if_spec {
-  * is per-backend specific
-  */
- struct atm_backend_br2684 {
--      atm_backend_t   backend_num;    /* ATM_BACKEND_BR2684 */
-+      atm_backend_t backend_num;      /* ATM_BACKEND_BR2684 */
-       struct br2684_if_spec ifspec;
--      int     fcs_in;         /* BR2684_FCSIN_* */
--      int     fcs_out;        /* BR2684_FCSOUT_* */
--      int     fcs_auto;       /* 1: fcs_{in,out} disabled if no FCS rx'ed */
--      int     encaps;         /* BR2684_ENCAPS_* */
--      int     has_vpiid;      /* 1: use vpn_id - Unsupported */
--      __u8    vpn_id[7];
--      int     send_padding;   /* unsupported */
--      int     min_size;       /* we will pad smaller packets than this */
-+      int fcs_in;             /* BR2684_FCSIN_* */
-+      int fcs_out;            /* BR2684_FCSOUT_* */
-+      int fcs_auto;           /* 1: fcs_{in,out} disabled if no FCS rx'ed */
-+      int encaps;             /* BR2684_ENCAPS_* */
-+      int has_vpiid;          /* 1: use vpn_id - Unsupported */
-+      __u8 vpn_id[7];
-+      int send_padding;       /* unsupported */
-+      int min_size;           /* we will pad smaller packets than this */
- };
- /*
-@@ -86,8 +96,8 @@ struct atm_backend_br2684 {
-  * efficient per-if in/out filters, this support will be removed
-  */
- struct br2684_filter {
--      __be32  prefix;         /* network byte order */
--      __be32  netmask;        /* 0 = disable filter */
-+      __be32 prefix;          /* network byte order */
-+      __be32 netmask;         /* 0 = disable filter */
- };
- struct br2684_filter_set {
-@@ -95,7 +105,13 @@ struct br2684_filter_set {
-       struct br2684_filter filter;
- };
-+enum br2684_payload {
-+      p_routed = BR2684_PAYLOAD_ROUTED,
-+      p_bridged = BR2684_PAYLOAD_BRIDGED,
-+};
-+
- #define BR2684_SETFILT        _IOW( 'a', ATMIOC_BACKEND + 0, \
-                               struct br2684_filter_set)
- #endif /* _LINUX_ATMBR2684_H */
-+
---- a/net/atm/br2684.c
-+++ b/net/atm/br2684.c
-@@ -1,8 +1,10 @@
- /*
--Experimental ethernet netdevice using ATM AAL5 as underlying carrier
--(RFC1483 obsoleted by RFC2684) for Linux 2.4
--Author: Marcell GAL, 2000, XDSL Ltd, Hungary
--*/
-+ * Ethernet netdevice using ATM AAL5 as underlying carrier
-+ * (RFC1483 obsoleted by RFC2684) for Linux
-+ *
-+ * Authors: Marcell GAL, 2000, XDSL Ltd, Hungary
-+ *          Eric Kinzie, 2006-2007, US Naval Research Laboratory
-+ */
- #include <linux/module.h>
- #include <linux/init.h>
-@@ -39,21 +41,35 @@ static void skb_debug(const struct sk_bu
- #define skb_debug(skb)        do {} while (0)
- #endif
-+#define BR2684_ETHERTYPE_LEN  2
-+#define BR2684_PAD_LEN                2
-+
-+#define LLC           0xaa, 0xaa, 0x03
-+#define SNAP_BRIDGED  0x00, 0x80, 0xc2
-+#define SNAP_ROUTED   0x00, 0x00, 0x00
-+#define PID_ETHERNET  0x00, 0x07
-+#define ETHERTYPE_IPV4        0x08, 0x00
-+#define ETHERTYPE_IPV6        0x86, 0xdd
-+#define PAD_BRIDGED   0x00, 0x00
-+
-+static unsigned char ethertype_ipv4[] = { ETHERTYPE_IPV4 };
-+static unsigned char ethertype_ipv6[] = { ETHERTYPE_IPV6 };
- static unsigned char llc_oui_pid_pad[] =
--    { 0xAA, 0xAA, 0x03, 0x00, 0x80, 0xC2, 0x00, 0x07, 0x00, 0x00 };
--#define PADLEN        (2)
-+                      { LLC, SNAP_BRIDGED, PID_ETHERNET, PAD_BRIDGED };
-+static unsigned char llc_oui_ipv4[] = { LLC, SNAP_ROUTED, ETHERTYPE_IPV4 };
-+static unsigned char llc_oui_ipv6[] = { LLC, SNAP_ROUTED, ETHERTYPE_IPV6 };
- enum br2684_encaps {
--      e_vc  = BR2684_ENCAPS_VC,
-+      e_vc = BR2684_ENCAPS_VC,
-       e_llc = BR2684_ENCAPS_LLC,
- };
- struct br2684_vcc {
--      struct atm_vcc  *atmvcc;
-+      struct atm_vcc *atmvcc;
-       struct net_device *device;
--      /* keep old push,pop functions for chaining */
--      void (*old_push)(struct atm_vcc *vcc,struct sk_buff *skb);
--      /* void (*old_pop)(struct atm_vcc *vcc,struct sk_buff *skb); */
-+      /* keep old push, pop functions for chaining */
-+      void (*old_push) (struct atm_vcc * vcc, struct sk_buff * skb);
-+      /* void (*old_pop)(struct atm_vcc *vcc, struct sk_buff *skb); */
-       enum br2684_encaps encaps;
-       struct list_head brvccs;
- #ifdef CONFIG_ATM_BR2684_IPFILTER
-@@ -66,9 +82,10 @@ struct br2684_dev {
-       struct net_device *net_dev;
-       struct list_head br2684_devs;
-       int number;
--      struct list_head brvccs; /* one device <=> one vcc (before xmas) */
-+      struct list_head brvccs;        /* one device <=> one vcc (before xmas) */
-       struct net_device_stats stats;
-       int mac_was_set;
-+      enum br2684_payload payload;
- };
- /*
-@@ -84,7 +101,7 @@ static LIST_HEAD(br2684_devs);
- static inline struct br2684_dev *BRPRIV(const struct net_device *net_dev)
- {
--      return (struct br2684_dev *) net_dev->priv;
-+      return (struct br2684_dev *)net_dev->priv;
- }
- static inline struct net_device *list_entry_brdev(const struct list_head *le)
-@@ -94,7 +111,7 @@ static inline struct net_device *list_en
- static inline struct br2684_vcc *BR2684_VCC(const struct atm_vcc *atmvcc)
- {
--      return (struct br2684_vcc *) (atmvcc->user_back);
-+      return (struct br2684_vcc *)(atmvcc->user_back);
- }
- static inline struct br2684_vcc *list_entry_brvcc(const struct list_head *le)
-@@ -132,10 +149,11 @@ static struct net_device *br2684_find_de
-  * otherwise false
-  */
- static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev,
--      struct br2684_vcc *brvcc)
-+                         struct br2684_vcc *brvcc)
- {
-       struct atm_vcc *atmvcc;
-       int minheadroom = (brvcc->encaps == e_llc) ? 10 : 2;
-+
-       if (skb_headroom(skb) < minheadroom) {
-               struct sk_buff *skb2 = skb_realloc_headroom(skb, minheadroom);
-               brvcc->copies_needed++;
-@@ -146,23 +164,48 @@ static int br2684_xmit_vcc(struct sk_buf
-               }
-               skb = skb2;
-       }
--      skb_push(skb, minheadroom);
--      if (brvcc->encaps == e_llc)
--              skb_copy_to_linear_data(skb, llc_oui_pid_pad, 10);
--      else
--              memset(skb->data, 0, 2);
-+
-+      if (brvcc->encaps == e_llc) {
-+              if (brdev->payload == p_bridged) {
-+                      skb_push(skb, sizeof(llc_oui_pid_pad));
-+                      skb_copy_to_linear_data(skb, llc_oui_pid_pad,
-+                                              sizeof(llc_oui_pid_pad));
-+              } else if (brdev->payload == p_routed) {
-+                      unsigned short prot = ntohs(skb->protocol);
-+
-+                      skb_push(skb, sizeof(llc_oui_ipv4));
-+                      switch (prot) {
-+                      case ETH_P_IP:
-+                              skb_copy_to_linear_data(skb, llc_oui_ipv4,
-+                                                      sizeof(llc_oui_ipv4));
-+                              break;
-+                      case ETH_P_IPV6:
-+                              skb_copy_to_linear_data(skb, llc_oui_ipv6,
-+                                                      sizeof(llc_oui_ipv6));
-+                              break;
-+                      default:
-+                              dev_kfree_skb(skb);
-+                              return 0;
-+                      }
-+              }
-+      } else {
-+              skb_push(skb, 2);
-+              if (brdev->payload == p_bridged)
-+                      memset(skb->data, 0, 2);
-+      }
-       skb_debug(skb);
-       ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc;
-       pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, atmvcc, atmvcc->dev);
-       if (!atm_may_send(atmvcc, skb->truesize)) {
--              /* we free this here for now, because we cannot know in a higher
--                      layer whether the skb point it supplied wasn't freed yet.
--                      now, it always is.
--              */
-+              /*
-+               * We free this here for now, because we cannot know in a higher
-+               * layer whether the skb pointer it supplied wasn't freed yet.
-+               * Now, it always is.
-+               */
-               dev_kfree_skb(skb);
-               return 0;
--              }
-+      }
-       atomic_add(skb->truesize, &sk_atm(atmvcc)->sk_wmem_alloc);
-       ATM_SKB(skb)->atm_options = atmvcc->atm_options;
-       brdev->stats.tx_packets++;
-@@ -172,10 +215,9 @@ static int br2684_xmit_vcc(struct sk_buf
- }
- static inline struct br2684_vcc *pick_outgoing_vcc(struct sk_buff *skb,
--      struct br2684_dev *brdev)
-+                                                 struct br2684_dev *brdev)
- {
--      return list_empty(&brdev->brvccs) ? NULL :
--          list_entry_brvcc(brdev->brvccs.next); /* 1 vcc/dev right now */
-+      return list_empty(&brdev->brvccs) ? NULL : list_entry_brvcc(brdev->brvccs.next);        /* 1 vcc/dev right now */
- }
- static int br2684_start_xmit(struct sk_buff *skb, struct net_device *dev)
-@@ -199,11 +241,10 @@ static int br2684_start_xmit(struct sk_b
-               /*
-                * We should probably use netif_*_queue() here, but that
-                * involves added complication.  We need to walk before
--               * we can run
-+               * we can run.
-+               *
-+               * Don't free here! this pointer might be no longer valid!
-                */
--              /* don't free here! this pointer might be no longer valid!
--              dev_kfree_skb(skb);
--              */
-               brdev->stats.tx_errors++;
-               brdev->stats.tx_fifo_errors++;
-       }
-@@ -217,12 +258,11 @@ static struct net_device_stats *br2684_g
-       return &BRPRIV(dev)->stats;
- }
--
- /*
-  * We remember when the MAC gets set, so we don't override it later with
-  * the ESI of the ATM card of the first VC
-  */
--static int (*my_eth_mac_addr)(struct net_device *, void *);
-+static int (*my_eth_mac_addr) (struct net_device *, void *);
- static int br2684_mac_addr(struct net_device *dev, void *p)
- {
-       int err = my_eth_mac_addr(dev, p);
-@@ -233,7 +273,7 @@ static int br2684_mac_addr(struct net_de
- #ifdef CONFIG_ATM_BR2684_IPFILTER
- /* this IOCTL is experimental. */
--static int br2684_setfilt(struct atm_vcc *atmvcc, void __user *arg)
-+static int br2684_setfilt(struct atm_vcc *atmvcc, void __user * arg)
- {
-       struct br2684_vcc *brvcc;
-       struct br2684_filter_set fs;
-@@ -243,13 +283,12 @@ static int br2684_setfilt(struct atm_vcc
-       if (fs.ifspec.method != BR2684_FIND_BYNOTHING) {
-               /*
-                * This is really a per-vcc thing, but we can also search
--               * by device
-+               * by device.
-                */
-               struct br2684_dev *brdev;
-               read_lock(&devs_lock);
-               brdev = BRPRIV(br2684_find_dev(&fs.ifspec));
--              if (brdev == NULL || list_empty(&brdev->brvccs) ||
--                  brdev->brvccs.next != brdev->brvccs.prev)  /* >1 VCC */
-+              if (brdev == NULL || list_empty(&brdev->brvccs) || brdev->brvccs.next != brdev->brvccs.prev)    /* >1 VCC */
-                       brvcc = NULL;
-               else
-                       brvcc = list_entry_brvcc(brdev->brvccs.next);
-@@ -267,15 +306,16 @@ static inline int
- packet_fails_filter(__be16 type, struct br2684_vcc *brvcc, struct sk_buff *skb)
- {
-       if (brvcc->filter.netmask == 0)
--              return 0;                       /* no filter in place */
-+              return 0;       /* no filter in place */
-       if (type == htons(ETH_P_IP) &&
--          (((struct iphdr *) (skb->data))->daddr & brvcc->filter.
-+          (((struct iphdr *)(skb->data))->daddr & brvcc->filter.
-            netmask) == brvcc->filter.prefix)
-               return 0;
-       if (type == htons(ETH_P_ARP))
-               return 0;
--      /* TODO: we should probably filter ARPs too.. don't want to have
--       *   them returning values that don't make sense, or is that ok?
-+      /*
-+       * TODO: we should probably filter ARPs too.. don't want to have
-+       * them returning values that don't make sense, or is that ok?
-        */
-       return 1;               /* drop */
- }
-@@ -299,7 +339,6 @@ static void br2684_push(struct atm_vcc *
-       struct br2684_vcc *brvcc = BR2684_VCC(atmvcc);
-       struct net_device *net_dev = brvcc->device;
-       struct br2684_dev *brdev = BRPRIV(net_dev);
--      int plen = sizeof(llc_oui_pid_pad) + ETH_HLEN;
-       pr_debug("br2684_push\n");
-@@ -320,35 +359,58 @@ static void br2684_push(struct atm_vcc *
-       atm_return(atmvcc, skb->truesize);
-       pr_debug("skb from brdev %p\n", brdev);
-       if (brvcc->encaps == e_llc) {
--              /* let us waste some time for checking the encapsulation.
--                 Note, that only 7 char is checked so frames with a valid FCS
--                 are also accepted (but FCS is not checked of course) */
--              if (memcmp(skb->data, llc_oui_pid_pad, 7)) {
-+
-+              if (skb->len > 7 && skb->data[7] == 0x01)
-+                      __skb_trim(skb, skb->len - 4);
-+
-+              /* accept packets that have "ipv[46]" in the snap header */
-+              if ((skb->len >= (sizeof(llc_oui_ipv4)))
-+                  &&
-+                  (memcmp
-+                   (skb->data, llc_oui_ipv4,
-+                    sizeof(llc_oui_ipv4) - BR2684_ETHERTYPE_LEN) == 0)) {
-+                      if (memcmp
-+                          (skb->data + 6, ethertype_ipv6,
-+                           sizeof(ethertype_ipv6)) == 0)
-+                              skb->protocol = __constant_htons(ETH_P_IPV6);
-+                      else if (memcmp
-+                               (skb->data + 6, ethertype_ipv4,
-+                                sizeof(ethertype_ipv4)) == 0)
-+                              skb->protocol = __constant_htons(ETH_P_IP);
-+                      else {
-+                              brdev->stats.rx_errors++;
-+                              dev_kfree_skb(skb);
-+                              return;
-+                      }
-+                      skb_pull(skb, sizeof(llc_oui_ipv4));
-+                      skb_reset_network_header(skb);
-+                      skb->pkt_type = PACKET_HOST;
-+                      /*
-+                       * Let us waste some time for checking the encapsulation.
-+                       * Note, that only 7 char is checked so frames with a valid FCS
-+                       * are also accepted (but FCS is not checked of course).
-+                       */
-+              } else if ((skb->len >= sizeof(llc_oui_pid_pad)) &&
-+                         (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) {
-+                      skb_pull(skb, sizeof(llc_oui_pid_pad));
-+                      skb->protocol = eth_type_trans(skb, net_dev);
-+              } else {
-                       brdev->stats.rx_errors++;
-                       dev_kfree_skb(skb);
-                       return;
-               }
--              /* Strip FCS if present */
--              if (skb->len > 7 && skb->data[7] == 0x01)
--                      __skb_trim(skb, skb->len - 4);
-       } else {
--              plen = PADLEN + ETH_HLEN;       /* pad, dstmac,srcmac, ethtype */
-               /* first 2 chars should be 0 */
-               if (*((u16 *) (skb->data)) != 0) {
-                       brdev->stats.rx_errors++;
-                       dev_kfree_skb(skb);
-                       return;
-               }
--      }
--      if (skb->len < plen) {
--              brdev->stats.rx_errors++;
--              dev_kfree_skb(skb);     /* dev_ not needed? */
--              return;
-+              skb_pull(skb, BR2684_PAD_LEN + ETH_HLEN);       /* pad, dstmac, srcmac, ethtype */
-+              skb->protocol = eth_type_trans(skb, net_dev);
-       }
--      skb_pull(skb, plen - ETH_HLEN);
--      skb->protocol = eth_type_trans(skb, net_dev);
- #ifdef CONFIG_ATM_BR2684_IPFILTER
-       if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) {
-               brdev->stats.rx_dropped++;
-@@ -372,11 +434,12 @@ static void br2684_push(struct atm_vcc *
-       netif_rx(skb);
- }
--static int br2684_regvcc(struct atm_vcc *atmvcc, void __user *arg)
-+/*
-+ * Assign a vcc to a dev
-+ * Note: we do not have explicit unassign, but look at _push()
-+ */
-+static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
- {
--/* assign a vcc to a dev
--Note: we do not have explicit unassign, but look at _push()
--*/
-       int err;
-       struct br2684_vcc *brvcc;
-       struct sk_buff *skb;
-@@ -395,7 +458,7 @@ Note: we do not have explicit unassign, 
-       net_dev = br2684_find_dev(&be.ifspec);
-       if (net_dev == NULL) {
-               printk(KERN_ERR
--                  "br2684: tried to attach to non-existant device\n");
-+                     "br2684: tried to attach to non-existant device\n");
-               err = -ENXIO;
-               goto error;
-       }
-@@ -411,13 +474,15 @@ Note: we do not have explicit unassign, 
-       }
-       if (be.fcs_in != BR2684_FCSIN_NO || be.fcs_out != BR2684_FCSOUT_NO ||
-           be.fcs_auto || be.has_vpiid || be.send_padding || (be.encaps !=
--          BR2684_ENCAPS_VC && be.encaps != BR2684_ENCAPS_LLC) ||
--          be.min_size != 0) {
-+                                                             BR2684_ENCAPS_VC
-+                                                             && be.encaps !=
-+                                                             BR2684_ENCAPS_LLC)
-+          || be.min_size != 0) {
-               err = -EINVAL;
-               goto error;
-       }
--      pr_debug("br2684_regvcc vcc=%p, encaps=%d, brvcc=%p\n", atmvcc, be.encaps,
--              brvcc);
-+      pr_debug("br2684_regvcc vcc=%p, encaps=%d, brvcc=%p\n", atmvcc,
-+               be.encaps, brvcc);
-       if (list_empty(&brdev->brvccs) && !brdev->mac_was_set) {
-               unsigned char *esi = atmvcc->dev->esi;
-               if (esi[0] | esi[1] | esi[2] | esi[3] | esi[4] | esi[5])
-@@ -430,7 +495,7 @@ Note: we do not have explicit unassign, 
-       brvcc->device = net_dev;
-       brvcc->atmvcc = atmvcc;
-       atmvcc->user_back = brvcc;
--      brvcc->encaps = (enum br2684_encaps) be.encaps;
-+      brvcc->encaps = (enum br2684_encaps)be.encaps;
-       brvcc->old_push = atmvcc->push;
-       barrier();
-       atmvcc->push = br2684_push;
-@@ -461,7 +526,7 @@ Note: we do not have explicit unassign, 
-       }
-       __module_get(THIS_MODULE);
-       return 0;
--    error:
-+      error:
-       write_unlock_irq(&devs_lock);
-       kfree(brvcc);
-       return err;
-@@ -482,25 +547,52 @@ static void br2684_setup(struct net_devi
-       INIT_LIST_HEAD(&brdev->brvccs);
- }
--static int br2684_create(void __user *arg)
-+static void br2684_setup_routed(struct net_device *netdev)
-+{
-+      struct br2684_dev *brdev = BRPRIV(netdev);
-+      brdev->net_dev = netdev;
-+
-+      netdev->hard_header_len = 0;
-+      my_eth_mac_addr = netdev->set_mac_address;
-+      netdev->set_mac_address = br2684_mac_addr;
-+      netdev->hard_start_xmit = br2684_start_xmit;
-+      netdev->get_stats = br2684_get_stats;
-+      netdev->addr_len = 0;
-+      netdev->mtu = 1500;
-+      netdev->type = ARPHRD_PPP;
-+      netdev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
-+      netdev->tx_queue_len = 100;
-+      INIT_LIST_HEAD(&brdev->brvccs);
-+}
-+
-+static int br2684_create(void __user * arg)
- {
-       int err;
-       struct net_device *netdev;
-       struct br2684_dev *brdev;
-       struct atm_newif_br2684 ni;
-+      enum br2684_payload payload;
-       pr_debug("br2684_create\n");
-       if (copy_from_user(&ni, arg, sizeof ni)) {
-               return -EFAULT;
-       }
-+
-+      if (ni.media & BR2684_FLAG_ROUTED)
-+              payload = p_routed;
-+      else
-+              payload = p_bridged;
-+      ni.media &= 0xffff;     /* strip flags */
-+
-       if (ni.media != BR2684_MEDIA_ETHERNET || ni.mtu != 1500) {
-               return -EINVAL;
-       }
-       netdev = alloc_netdev(sizeof(struct br2684_dev),
-                             ni.ifname[0] ? ni.ifname : "nas%d",
--                            br2684_setup);
-+                            (payload == p_routed) ?
-+                            br2684_setup_routed : br2684_setup);
-       if (!netdev)
-               return -ENOMEM;
-@@ -516,6 +608,7 @@ static int br2684_create(void __user *ar
-       }
-       write_lock_irq(&devs_lock);
-+      brdev->payload = payload;
-       brdev->number = list_empty(&br2684_devs) ? 1 :
-           BRPRIV(list_entry_brdev(br2684_devs.prev))->number + 1;
-       list_add_tail(&brdev->br2684_devs, &br2684_devs);
-@@ -528,16 +621,16 @@ static int br2684_create(void __user *ar
-  * -ENOIOCTLCMD for any unrecognized ioctl
-  */
- static int br2684_ioctl(struct socket *sock, unsigned int cmd,
--      unsigned long arg)
-+                      unsigned long arg)
- {
-       struct atm_vcc *atmvcc = ATM_SD(sock);
-       void __user *argp = (void __user *)arg;
-+      atm_backend_t b;
-       int err;
--      switch(cmd) {
-+      switch (cmd) {
-       case ATM_SETBACKEND:
--      case ATM_NEWBACKENDIF: {
--              atm_backend_t b;
-+      case ATM_NEWBACKENDIF:
-               err = get_user(b, (atm_backend_t __user *) argp);
-               if (err)
-                       return -EFAULT;
-@@ -549,7 +642,6 @@ static int br2684_ioctl(struct socket *s
-                       return br2684_regvcc(atmvcc, argp);
-               else
-                       return br2684_create(argp);
--              }
- #ifdef CONFIG_ATM_BR2684_IPFILTER
-       case BR2684_SETFILT:
-               if (atmvcc->push != br2684_push)
-@@ -557,6 +649,7 @@ static int br2684_ioctl(struct socket *s
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               err = br2684_setfilt(atmvcc, argp);
-+
-               return err;
- #endif /* CONFIG_ATM_BR2684_IPFILTER */
-       }
-@@ -564,24 +657,25 @@ static int br2684_ioctl(struct socket *s
- }
- static struct atm_ioctl br2684_ioctl_ops = {
--      .owner  = THIS_MODULE,
--      .ioctl  = br2684_ioctl,
-+      .owner = THIS_MODULE,
-+      .ioctl = br2684_ioctl,
- };
--
- #ifdef CONFIG_PROC_FS
--static void *br2684_seq_start(struct seq_file *seq, loff_t *pos)
-+static void *br2684_seq_start(struct seq_file *seq, loff_t * pos)
-+      __acquires(devs_lock)
- {
-       read_lock(&devs_lock);
-       return seq_list_start(&br2684_devs, *pos);
- }
--static void *br2684_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-+static void *br2684_seq_next(struct seq_file *seq, void *v, loff_t * pos)
- {
-       return seq_list_next(v, &br2684_devs, pos);
- }
- static void br2684_seq_stop(struct seq_file *seq, void *v)
-+      __releases(devs_lock)
- {
-       read_unlock(&devs_lock);
- }
-@@ -589,7 +683,7 @@ static void br2684_seq_stop(struct seq_f
- static int br2684_seq_show(struct seq_file *seq, void *v)
- {
-       const struct br2684_dev *brdev = list_entry(v, struct br2684_dev,
--                      br2684_devs);
-+                                                  br2684_devs);
-       const struct net_device *net_dev = brdev->net_dev;
-       const struct br2684_vcc *brvcc;
-       DECLARE_MAC_BUF(mac);
-@@ -601,21 +695,19 @@ static int br2684_seq_show(struct seq_fi
-                  brdev->mac_was_set ? "set" : "auto");
-       list_for_each_entry(brvcc, &brdev->brvccs, brvccs) {
--              seq_printf(seq, "  vcc %d.%d.%d: encaps=%s"
--                                  ", failed copies %u/%u"
--                                  "\n", brvcc->atmvcc->dev->number,
--                                  brvcc->atmvcc->vpi, brvcc->atmvcc->vci,
--                                  (brvcc->encaps == e_llc) ? "LLC" : "VC"
--                                  , brvcc->copies_failed
--                                  , brvcc->copies_needed
--                                  );
-+              seq_printf(seq, "  vcc %d.%d.%d: encaps=%s payload=%s"
-+                         ", failed copies %u/%u"
-+                         "\n", brvcc->atmvcc->dev->number,
-+                         brvcc->atmvcc->vpi, brvcc->atmvcc->vci,
-+                         (brvcc->encaps == e_llc) ? "LLC" : "VC",
-+                         (brdev->payload == p_bridged) ? "bridged" : "routed",
-+                         brvcc->copies_failed, brvcc->copies_needed);
- #ifdef CONFIG_ATM_BR2684_IPFILTER
- #define b1(var, byte) ((u8 *) &brvcc->filter.var)[byte]
- #define bs(var)               b1(var, 0), b1(var, 1), b1(var, 2), b1(var, 3)
--                      if (brvcc->filter.netmask != 0)
--                              seq_printf(seq, "    filter=%d.%d.%d.%d/"
--                                              "%d.%d.%d.%d\n",
--                                              bs(prefix), bs(netmask));
-+              if (brvcc->filter.netmask != 0)
-+                      seq_printf(seq, "    filter=%d.%d.%d.%d/"
-+                                 "%d.%d.%d.%d\n", bs(prefix), bs(netmask));
- #undef bs
- #undef b1
- #endif /* CONFIG_ATM_BR2684_IPFILTER */
-@@ -625,9 +717,9 @@ static int br2684_seq_show(struct seq_fi
- static const struct seq_operations br2684_seq_ops = {
-       .start = br2684_seq_start,
--      .next  = br2684_seq_next,
--      .stop  = br2684_seq_stop,
--      .show  = br2684_seq_show,
-+      .next = br2684_seq_next,
-+      .stop = br2684_seq_stop,
-+      .show = br2684_seq_show,
- };
- static int br2684_proc_open(struct inode *inode, struct file *file)
-@@ -636,26 +728,28 @@ static int br2684_proc_open(struct inode
- }
- static const struct file_operations br2684_proc_ops = {
--      .owner   = THIS_MODULE,
--      .open    = br2684_proc_open,
--      .read    = seq_read,
--      .llseek  = seq_lseek,
-+      .owner = THIS_MODULE,
-+      .open = br2684_proc_open,
-+      .read = seq_read,
-+      .llseek = seq_lseek,
-       .release = seq_release,
- };
- extern struct proc_dir_entry *atm_proc_root;  /* from proc.c */
--#endif
-+#endif /* CONFIG_PROC_FS */
- static int __init br2684_init(void)
- {
- #ifdef CONFIG_PROC_FS
-       struct proc_dir_entry *p;
-+
-       if ((p = create_proc_entry("br2684", 0, atm_proc_root)) == NULL)
--              return -ENOMEM;
--      p->proc_fops = &br2684_proc_ops;
-+        return -ENOMEM;
-+        p->proc_fops = &br2684_proc_ops;
- #endif
--      register_atm_ioctl(&br2684_ioctl_ops);
--      return 0;
-+        register_atm_ioctl(&br2684_ioctl_ops);
-+        return 0;
-+                                        
- }
- static void __exit br2684_exit(void)
-@@ -689,3 +783,4 @@ module_exit(br2684_exit);
- MODULE_AUTHOR("Marcell GAL");
- MODULE_DESCRIPTION("RFC2684 bridged protocols over ATM/AAL5");
- MODULE_LICENSE("GPL");
-+
diff --git a/target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch b/target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch
deleted file mode 100644 (file)
index 7524eb3..0000000
+++ /dev/null
@@ -1,71017 +0,0 @@
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -686,6 +686,7 @@ and is between 256 and 4096 characters. 
-                       See Documentation/isdn/README.HiSax.
-       hugepages=      [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
-+      hugepagesz=     [HW,IA-64,PPC] The size of the HugeTLB pages.
-       i8042.direct    [HW] Put keyboard port into non-translated mode
-       i8042.dumbkbd   [HW] Pretend that controller can only read data from
---- a/Documentation/powerpc/00-INDEX
-+++ b/Documentation/powerpc/00-INDEX
-@@ -28,3 +28,6 @@ sound.txt
-       - info on sound support under Linux/PPC
- zImage_layout.txt
-       - info on the kernel images for Linux/PPC
-+qe_firmware.txt
-+      - describes the layout of firmware binaries for the Freescale QUICC
-+        Engine and the code that parses and uploads the microcode therein.
---- a/Documentation/powerpc/booting-without-of.txt
-+++ b/Documentation/powerpc/booting-without-of.txt
-@@ -52,7 +52,11 @@ Table of Contents
-       i) Freescale QUICC Engine module (QE)
-       j) CFI or JEDEC memory-mapped NOR flash
-       k) Global Utilities Block
--      l) Xilinx IP cores
-+      l) Freescale Communications Processor Module
-+      m) Chipselect/Local Bus
-+      n) 4xx/Axon EMAC ethernet nodes
-+      o) Xilinx IP cores
-+      p) Freescale Synchronous Serial Interface
-   VII - Specifying interrupt information for devices
-     1) interrupts property
-@@ -671,10 +675,10 @@ device or bus to be described by the dev
- In general, the format of an address for a device is defined by the
- parent bus type, based on the #address-cells and #size-cells
--property. In the absence of such a property, the parent's parent
--values are used, etc... The kernel requires the root node to have
--those properties defining addresses format for devices directly mapped
--on the processor bus.
-+properties.  Note that the parent's parent definitions of #address-cells
-+and #size-cells are not inhereted so every node with children must specify
-+them.  The kernel requires the root node to have those properties defining
-+addresses format for devices directly mapped on the processor bus.
- Those 2 properties define 'cells' for representing an address and a
- size. A "cell" is a 32-bit number. For example, if both contain 2
-@@ -711,13 +715,14 @@ define a bus type with a more complex ad
- like address space bits, you'll have to add a bus translator to the
- prom_parse.c file of the recent kernels for your bus type.
--The "reg" property only defines addresses and sizes (if #size-cells
--is non-0) within a given bus. In order to translate addresses upward
-+The "reg" property only defines addresses and sizes (if #size-cells is
-+non-0) within a given bus. In order to translate addresses upward
- (that is into parent bus addresses, and possibly into CPU physical
- addresses), all busses must contain a "ranges" property. If the
- "ranges" property is missing at a given level, it's assumed that
--translation isn't possible. The format of the "ranges" property for a
--bus is a list of:
-+translation isn't possible, i.e., the registers are not visible on the
-+parent bus.  The format of the "ranges" property for a bus is a list
-+of:
-       bus address, parent bus address, size
-@@ -735,6 +740,10 @@ fit in a single 32-bit word.   New 32-bi
- 1/1 format, unless the processor supports physical addresses greater
- than 32-bits, in which case a 2/1 format is recommended.
-+Alternatively, the "ranges" property may be empty, indicating that the
-+registers are visible on the parent bus using an identity mapping
-+translation.  In other words, the parent bus address space is the same
-+as the child bus address space.
- 2) Note about "compatible" properties
- -------------------------------------
-@@ -1218,16 +1227,14 @@ platforms are moved over to use the flat
-   Required properties:
-     - reg : Offset and length of the register set for the device
--    - device_type : Should be "mdio"
-     - compatible : Should define the compatible device type for the
--      mdio.  Currently, this is most likely to be "gianfar"
-+      mdio.  Currently, this is most likely to be "fsl,gianfar-mdio"
-   Example:
-       mdio@24520 {
-               reg = <24520 20>;
--              device_type = "mdio"; 
--              compatible = "gianfar";
-+              compatible = "fsl,gianfar-mdio";
-               ethernet-phy@0 {
-                       ......
-@@ -1254,6 +1261,10 @@ platforms are moved over to use the flat
-       services interrupts for this device.
-     - phy-handle : The phandle for the PHY connected to this ethernet
-       controller.
-+    - fixed-link : <a b c d e> where a is emulated phy id - choose any,
-+      but unique to the all specified fixed-links, b is duplex - 0 half,
-+      1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
-+      pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
-   Recommended properties:
-@@ -1408,7 +1419,6 @@ platforms are moved over to use the flat
-    Example multi port host USB controller device node :
-       usb@22000 {
--              device_type = "usb";
-               compatible = "fsl-usb2-mph";
-               reg = <22000 1000>;
-               #address-cells = <1>;
-@@ -1422,7 +1432,6 @@ platforms are moved over to use the flat
-    Example dual role USB controller device node :
-       usb@23000 {
--              device_type = "usb";
-               compatible = "fsl-usb2-dr";
-               reg = <23000 1000>;
-               #address-cells = <1>;
-@@ -1586,7 +1595,6 @@ platforms are moved over to use the flat
-    iii) USB (Universal Serial Bus Controller)
-    Required properties:
--   - device_type : should be "usb".
-    - compatible : could be "qe_udc" or "fhci-hcd".
-    - mode : the could be "host" or "slave".
-    - reg : Offset and length of the register set for the device
-@@ -1600,7 +1608,6 @@ platforms are moved over to use the flat
-    Example(slave):
-       usb@6c0 {
--              device_type = "usb";
-               compatible = "qe_udc";
-               reg = <6c0 40>;
-               interrupts = <8b 0>;
-@@ -1613,7 +1620,7 @@ platforms are moved over to use the flat
-    Required properties:
-    - device_type : should be "network", "hldc", "uart", "transparent"
--    "bisync" or "atm".
-+     "bisync", "atm", or "serial".
-    - compatible : could be "ucc_geth" or "fsl_atm" and so on.
-    - model : should be "UCC".
-    - device-id : the ucc number(1-8), corresponding to UCCx in UM.
-@@ -1626,6 +1633,26 @@ platforms are moved over to use the flat
-    - interrupt-parent : the phandle for the interrupt controller that
-      services interrupts for this device.
-    - pio-handle : The phandle for the Parallel I/O port configuration.
-+   - port-number : for UART drivers, the port number to use, between 0 and 3.
-+     This usually corresponds to the /dev/ttyQE device, e.g. <0> = /dev/ttyQE0.
-+     The port number is added to the minor number of the device.  Unlike the
-+     CPM UART driver, the port-number is required for the QE UART driver.
-+   - soft-uart : for UART drivers, if specified this means the QE UART device
-+     driver should use "Soft-UART" mode, which is needed on some SOCs that have
-+     broken UART hardware.  Soft-UART is provided via a microcode upload.
-+   - rx-clock-name: the UCC receive clock source
-+     "none": clock source is disabled
-+     "brg1" through "brg16": clock source is BRG1-BRG16, respectively
-+     "clk1" through "clk24": clock source is CLK1-CLK24, respectively
-+   - tx-clock-name: the UCC transmit clock source
-+     "none": clock source is disabled
-+     "brg1" through "brg16": clock source is BRG1-BRG16, respectively
-+     "clk1" through "clk24": clock source is CLK1-CLK24, respectively
-+   The following two properties are deprecated.  rx-clock has been replaced
-+   with rx-clock-name, and tx-clock has been replaced with tx-clock-name.
-+   Drivers that currently use the deprecated properties should continue to
-+   do so, in order to support older device trees, but they should be updated
-+   to check for the new properties first.
-    - rx-clock : represents the UCC receive clock source.
-      0x00 : clock source is disabled;
-      0x1~0x10 : clock source is BRG1~BRG16 respectively;
-@@ -1772,6 +1799,32 @@ platforms are moved over to use the flat
-               };
-       };
-+   viii) Uploaded QE firmware
-+
-+       If a new firwmare has been uploaded to the QE (usually by the
-+       boot loader), then a 'firmware' child node should be added to the QE
-+       node.  This node provides information on the uploaded firmware that
-+       device drivers may need.
-+
-+       Required properties:
-+       - id: The string name of the firmware.  This is taken from the 'id'
-+             member of the qe_firmware structure of the uploaded firmware.
-+             Device drivers can search this string to determine if the
-+             firmware they want is already present.
-+       - extended-modes: The Extended Modes bitfield, taken from the
-+                         firmware binary.  It is a 64-bit number represented
-+                         as an array of two 32-bit numbers.
-+       - virtual-traps: The virtual traps, taken from the firmware binary.
-+                        It is an array of 8 32-bit numbers.
-+
-+       Example:
-+
-+              firmware {
-+                      id = "Soft-UART";
-+                      extended-modes = <0 0>;
-+                      virtual-traps = <0 0 0 0 0 0 0 0>;
-+              }
-+
-    j) CFI or JEDEC memory-mapped NOR flash
-     Flash chips (Memory Technology Devices) are often used for solid state
-@@ -2075,8 +2128,7 @@ platforms are moved over to use the flat
-    Example:
-       localbus@f0010100 {
--              compatible = "fsl,mpc8272ads-localbus",
--                           "fsl,mpc8272-localbus",
-+              compatible = "fsl,mpc8272-localbus",
-                            "fsl,pq2-localbus";
-               #address-cells = <2>;
-               #size-cells = <1>;
-@@ -2254,7 +2306,7 @@ platforms are moved over to use the flat
-                          available.
-                          For Axon: 0x0000012a
--   l) Xilinx IP cores
-+   o) Xilinx IP cores
-    The Xilinx EDK toolchain ships with a set of IP cores (devices) for use
-    in Xilinx Spartan and Virtex FPGAs.  The devices cover the whole range
-@@ -2276,7 +2328,7 @@ platforms are moved over to use the flat
-    properties of the device node.  In general, device nodes for IP-cores
-    will take the following form:
--      (name)@(base-address) {
-+      (name): (generic-name)@(base-address) {
-               compatible = "xlnx,(ip-core-name)-(HW_VER)"
-                            [, (list of compatible devices), ...];
-               reg = <(baseaddr) (size)>;
-@@ -2286,6 +2338,9 @@ platforms are moved over to use the flat
-               xlnx,(parameter2) = <(int-value)>;
-       };
-+      (generic-name):   an open firmware-style name that describes the
-+                      generic class of device.  Preferably, this is one word, such
-+                      as 'serial' or 'ethernet'.
-       (ip-core-name): the name of the ip block (given after the BEGIN
-                       directive in system.mhs).  Should be in lowercase
-                       and all underscores '_' converted to dashes '-'.
-@@ -2294,9 +2349,9 @@ platforms are moved over to use the flat
-                       dropped from the parameter name, the name is converted
-                       to lowercase and all underscore '_' characters are
-                       converted to dashes '-'.
--      (baseaddr):     the C_BASEADDR parameter.
-+      (baseaddr):     the baseaddr parameter value (often named C_BASEADDR).
-       (HW_VER):       from the HW_VER parameter.
--      (size):         equals C_HIGHADDR - C_BASEADDR + 1
-+      (size):         the address range size (often C_HIGHADDR - C_BASEADDR + 1).
-    Typically, the compatible list will include the exact IP core version
-    followed by an older IP core version which implements the same
-@@ -2326,11 +2381,11 @@ platforms are moved over to use the flat
-    becomes the following device tree node:
--      opb-uartlite-0@ec100000 {
-+      opb_uartlite_0: serial@ec100000 {
-               device_type = "serial";
-               compatible = "xlnx,opb-uartlite-1.00.b";
-               reg = <ec100000 10000>;
--              interrupt-parent = <&opb-intc>;
-+              interrupt-parent = <&opb_intc_0>;
-               interrupts = <1 0>; // got this from the opb_intc parameters
-               current-speed = <d#115200>;     // standard serial device prop
-               clock-frequency = <d#50000000>; // standard serial device prop
-@@ -2339,16 +2394,19 @@ platforms are moved over to use the flat
-               xlnx,use-parity = <0>;
-       };
--   Some IP cores actually implement 2 or more logical devices.  In this case,
--   the device should still describe the whole IP core with a single node
--   and add a child node for each logical device.  The ranges property can
--   be used to translate from parent IP-core to the registers of each device.
--   (Note: this makes the assumption that both logical devices have the same
--   bus binding.  If this is not true, then separate nodes should be used for
--   each logical device).  The 'cell-index' property can be used to enumerate
--   logical devices within an IP core.  For example, the following is the
--   system.mhs entry for the dual ps2 controller found on the ml403 reference
--   design.
-+   Some IP cores actually implement 2 or more logical devices.  In
-+   this case, the device should still describe the whole IP core with
-+   a single node and add a child node for each logical device.  The
-+   ranges property can be used to translate from parent IP-core to the
-+   registers of each device.  In addition, the parent node should be
-+   compatible with the bus type 'xlnx,compound', and should contain
-+   #address-cells and #size-cells, as with any other bus.  (Note: this
-+   makes the assumption that both logical devices have the same bus
-+   binding.  If this is not true, then separate nodes should be used
-+   for each logical device).  The 'cell-index' property can be used to
-+   enumerate logical devices within an IP core.  For example, the
-+   following is the system.mhs entry for the dual ps2 controller found
-+   on the ml403 reference design.
-       BEGIN opb_ps2_dual_ref
-               PARAMETER INSTANCE = opb_ps2_dual_ref_0
-@@ -2370,21 +2428,24 @@ platforms are moved over to use the flat
-    It would result in the following device tree nodes:
--      opb_ps2_dual_ref_0@a9000000 {
-+      opb_ps2_dual_ref_0: opb-ps2-dual-ref@a9000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              compatible = "xlnx,compound";
-               ranges = <0 a9000000 2000>;
-               // If this device had extra parameters, then they would
-               // go here.
-               ps2@0 {
-                       compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
-                       reg = <0 40>;
--                      interrupt-parent = <&opb-intc>;
-+                      interrupt-parent = <&opb_intc_0>;
-                       interrupts = <3 0>;
-                       cell-index = <0>;
-               };
-               ps2@1000 {
-                       compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
-                       reg = <1000 40>;
--                      interrupt-parent = <&opb-intc>;
-+                      interrupt-parent = <&opb_intc_0>;
-                       interrupts = <3 0>;
-                       cell-index = <0>;
-               };
-@@ -2447,17 +2508,18 @@ platforms are moved over to use the flat
-    Gives this device tree (some properties removed for clarity):
--      plb-v34-0 {
-+      plb@0 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-+              compatible = "xlnx,plb-v34-1.02.a";
-               device_type = "ibm,plb";
-               ranges; // 1:1 translation
--              plb-bram-if-cntrl-0@ffff0000 {
-+              plb_bram_if_cntrl_0: bram@ffff0000 {
-                       reg = <ffff0000 10000>;
-               }
--              opb-v20-0 {
-+              opb@20000000 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <20000000 20000000 20000000
-@@ -2465,11 +2527,11 @@ platforms are moved over to use the flat
-                                 80000000 80000000 40000000
-                                 c0000000 c0000000 20000000>;
--                      opb-uart16550-0@a0000000 {
-+                      opb_uart16550_0: serial@a0000000 {
-                               reg = <a00000000 2000>;
-                       };
--                      opb-intc-0@d1000fc0 {
-+                      opb_intc_0: interrupt-controller@d1000fc0 {
-                               reg = <d1000fc0 20>;
-                       };
-               };
-@@ -2514,6 +2576,46 @@ platforms are moved over to use the flat
-       Requred properties:
-        - current-speed : Baud rate of uartlite
-+    p) Freescale Synchronous Serial Interface
-+
-+       The SSI is a serial device that communicates with audio codecs.  It can
-+       be programmed in AC97, I2S, left-justified, or right-justified modes.
-+
-+       Required properties:
-+       - compatible     : compatible list, containing "fsl,ssi"
-+       - cell-index     : the SSI, <0> = SSI1, <1> = SSI2, and so on
-+       - reg            : offset and length of the register set for the device
-+       - interrupts     : <a b> where a is the interrupt number and b is a
-+                            field that represents an encoding of the sense and
-+                          level information for the interrupt.  This should be
-+                          encoded based on the information in section 2)
-+                          depending on the type of interrupt controller you
-+                          have.
-+       - interrupt-parent : the phandle for the interrupt controller that
-+                            services interrupts for this device.
-+       - fsl,mode       : the operating mode for the SSI interface
-+                          "i2s-slave" - I2S mode, SSI is clock slave
-+                          "i2s-master" - I2S mode, SSI is clock master
-+                          "lj-slave" - left-justified mode, SSI is clock slave
-+                          "lj-master" - l.j. mode, SSI is clock master
-+                          "rj-slave" - right-justified mode, SSI is clock slave
-+                          "rj-master" - r.j., SSI is clock master
-+                          "ac97-slave" - AC97 mode, SSI is clock slave
-+                          "ac97-master" - AC97 mode, SSI is clock master
-+
-+       Optional properties:
-+       - codec-handle   : phandle to a 'codec' node that defines an audio
-+                          codec connected to this SSI.  This node is typically
-+                          a child of an I2C or other control node.
-+
-+       Child 'codec' node required properties:
-+       - compatible     : compatible list, contains the name of the codec
-+
-+       Child 'codec' node optional properties:
-+       - clock-frequency  : The frequency of the input clock, which typically
-+                            comes from an on-board dedicated oscillator.
-+
-+
-    More devices will be defined as this spec matures.
- VII - Specifying interrupt information for devices
---- /dev/null
-+++ b/Documentation/powerpc/qe_firmware.txt
-@@ -0,0 +1,295 @@
-+         Freescale QUICC Engine Firmware Uploading
-+         -----------------------------------------
-+
-+(c) 2007 Timur Tabi <timur at freescale.com>,
-+    Freescale Semiconductor
-+
-+Table of Contents
-+=================
-+
-+  I - Software License for Firmware
-+
-+  II - Microcode Availability
-+
-+  III - Description and Terminology
-+
-+  IV - Microcode Programming Details
-+
-+  V - Firmware Structure Layout
-+
-+  VI - Sample Code for Creating Firmware Files
-+
-+Revision Information
-+====================
-+
-+November 30, 2007: Rev 1.0 - Initial version
-+
-+I - Software License for Firmware
-+=================================
-+
-+Each firmware file comes with its own software license.  For information on
-+the particular license, please see the license text that is distributed with
-+the firmware.
-+
-+II - Microcode Availability
-+===========================
-+
-+Firmware files are distributed through various channels.  Some are available on
-+http://opensource.freescale.com.  For other firmware files, please contact
-+your Freescale representative or your operating system vendor.
-+
-+III - Description and Terminology
-+================================
-+
-+In this document, the term 'microcode' refers to the sequence of 32-bit
-+integers that compose the actual QE microcode.
-+
-+The term 'firmware' refers to a binary blob that contains the microcode as
-+well as other data that
-+
-+      1) describes the microcode's purpose
-+      2) describes how and where to upload the microcode
-+      3) specifies the values of various registers
-+      4) includes additional data for use by specific device drivers
-+
-+Firmware files are binary files that contain only a firmware.
-+
-+IV - Microcode Programming Details
-+===================================
-+
-+The QE architecture allows for only one microcode present in I-RAM for each
-+RISC processor.  To replace any current microcode, a full QE reset (which
-+disables the microcode) must be performed first.
-+
-+QE microcode is uploaded using the following procedure:
-+
-+1) The microcode is placed into I-RAM at a specific location, using the
-+   IRAM.IADD and IRAM.IDATA registers.
-+
-+2) The CERCR.CIR bit is set to 0 or 1, depending on whether the firmware
-+   needs split I-RAM.  Split I-RAM is only meaningful for SOCs that have
-+   QEs with multiple RISC processors, such as the 8360.  Splitting the I-RAM
-+   allows each processor to run a different microcode, effectively creating an
-+   asymmetric multiprocessing (AMP) system.
-+
-+3) The TIBCR trap registers are loaded with the addresses of the trap handlers
-+   in the microcode.
-+
-+4) The RSP.ECCR register is programmed with the value provided.
-+
-+5) If necessary, device drivers that need the virtual traps and extended mode
-+   data will use them.
-+
-+Virtual Microcode Traps
-+
-+These virtual traps are conditional branches in the microcode.  These are
-+"soft" provisional introduced in the ROMcode in order to enable higher
-+flexibility and save h/w traps If new features are activated or an issue is
-+being fixed in the RAM package utilizing they should be activated.  This data
-+structure signals the microcode which of these virtual traps is active.
-+
-+This structure contains 6 words that the application should copy to some
-+specific been defined.  This table describes the structure.
-+
-+      ---------------------------------------------------------------
-+      | Offset in |                  | Destination Offset | Size of |
-+      |   array   |     Protocol     |   within PRAM      | Operand |
-+      --------------------------------------------------------------|
-+      |     0     | Ethernet         |      0xF8          | 4 bytes |
-+      |           | interworking     |                    |         |
-+      ---------------------------------------------------------------
-+      |     4     | ATM              |      0xF8          | 4 bytes |
-+      |           | interworking     |                    |         |
-+      ---------------------------------------------------------------
-+      |     8     | PPP              |      0xF8          | 4 bytes |
-+      |           | interworking     |                    |         |
-+      ---------------------------------------------------------------
-+      |     12    | Ethernet RX      |      0x22          | 1 byte  |
-+      |           | Distributor Page |                    |         |
-+      ---------------------------------------------------------------
-+      |     16    | ATM Globtal      |      0x28          | 1 byte  |
-+      |           | Params Table     |                    |         |
-+      ---------------------------------------------------------------
-+      |     20    | Insert Frame     |      0xF8          | 4 bytes |
-+      ---------------------------------------------------------------
-+
-+
-+Extended Modes
-+
-+This is a double word bit array (64 bits) that defines special functionality
-+which has an impact on the softwarew drivers.  Each bit has its own impact
-+and has special instructions for the s/w associated with it.  This structure is
-+described in this table:
-+
-+      -----------------------------------------------------------------------
-+      | Bit #  |     Name     |   Description                               |
-+      -----------------------------------------------------------------------
-+      |   0    | General      | Indicates that prior to each host command   |
-+      |        | push command | given by the application, the software must |
-+      |        |              | assert a special host command (push command)|
-+      |        |              | CECDR = 0x00800000.                         |
-+      |        |              | CECR = 0x01c1000f.                          |
-+      -----------------------------------------------------------------------
-+      |   1    | UCC ATM      | Indicates that after issuing ATM RX INIT    |
-+      |        | RX INIT      | command, the host must issue another special|
-+      |        | push command | command (push command) and immediately      |
-+      |        |              | following that re-issue the ATM RX INIT     |
-+      |        |              | command. (This makes the sequence of        |
-+      |        |              | initializing the ATM receiver a sequence of |
-+      |        |              | three host commands)                        |
-+      |        |              | CECDR = 0x00800000.                         |
-+      |        |              | CECR = 0x01c1000f.                          |
-+      -----------------------------------------------------------------------
-+      |   2    | Add/remove   | Indicates that following the specific host  |
-+      |        | command      | command: "Add/Remove entry in Hash Lookup   |
-+      |        | validation   | Table" used in Interworking setup, the user |
-+      |        |              | must issue another command.                 |
-+      |        |              | CECDR = 0xce000003.                         |
-+      |        |              | CECR = 0x01c10f58.                          |
-+      -----------------------------------------------------------------------
-+      |   3    | General push | Indicates that the s/w has to initialize    |
-+      |        | command      | some pointers in the Ethernet thread pages  |
-+      |        |              | which are used when Header Compression is   |
-+      |        |              | activated.  The full details of these       |
-+      |        |              | pointers is located in the software drivers.|
-+      -----------------------------------------------------------------------
-+      |   4    | General push | Indicates that after issuing Ethernet TX    |
-+      |        | command      | INIT command, user must issue this command  |
-+      |        |              | for each SNUM of Ethernet TX thread.        |
-+      |        |              | CECDR = 0x00800003.                         |
-+      |        |              | CECR = 0x7'b{0}, 8'b{Enet TX thread SNUM},  |
-+      |        |              |        1'b{1}, 12'b{0}, 4'b{1}              |
-+      -----------------------------------------------------------------------
-+      | 5 - 31 |     N/A      | Reserved, set to zero.                      |
-+      -----------------------------------------------------------------------
-+
-+V - Firmware Structure Layout
-+==============================
-+
-+QE microcode from Freescale is typically provided as a header file.  This
-+header file contains macros that define the microcode binary itself as well as
-+some other data used in uploading that microcode.  The format of these files
-+do not lend themselves to simple inclusion into other code.  Hence,
-+the need for a more portable format.  This section defines that format.
-+
-+Instead of distributing a header file, the microcode and related data are
-+embedded into a binary blob.  This blob is passed to the qe_upload_firmware()
-+function, which parses the blob and performs everything necessary to upload
-+the microcode.
-+
-+All integers are big-endian.  See the comments for function
-+qe_upload_firmware() for up-to-date implementation information.
-+
-+This structure supports versioning, where the version of the structure is
-+embedded into the structure itself.  To ensure forward and backwards
-+compatibility, all versions of the structure must use the same 'qe_header'
-+structure at the beginning.
-+
-+'header' (type: struct qe_header):
-+      The 'length' field is the size, in bytes, of the entire structure,
-+      including all the microcode embedded in it, as well as the CRC (if
-+      present).
-+
-+      The 'magic' field is an array of three bytes that contains the letters
-+      'Q', 'E', and 'F'.  This is an identifier that indicates that this
-+      structure is a QE Firmware structure.
-+
-+      The 'version' field is a single byte that indicates the version of this
-+      structure.  If the layout of the structure should ever need to be
-+      changed to add support for additional types of microcode, then the
-+      version number should also be changed.
-+
-+The 'id' field is a null-terminated string(suitable for printing) that
-+identifies the firmware.
-+
-+The 'count' field indicates the number of 'microcode' structures.  There
-+must be one and only one 'microcode' structure for each RISC processor.
-+Therefore, this field also represents the number of RISC processors for this
-+SOC.
-+
-+The 'soc' structure contains the SOC numbers and revisions used to match
-+the microcode to the SOC itself.  Normally, the microcode loader should
-+check the data in this structure with the SOC number and revisions, and
-+only upload the microcode if there's a match.  However, this check is not
-+made on all platforms.
-+
-+Although it is not recommended, you can specify '0' in the soc.model
-+field to skip matching SOCs altogether.
-+
-+The 'model' field is a 16-bit number that matches the actual SOC. The
-+'major' and 'minor' fields are the major and minor revision numbrs,
-+respectively, of the SOC.
-+
-+For example, to match the 8323, revision 1.0:
-+     soc.model = 8323
-+     soc.major = 1
-+     soc.minor = 0
-+
-+'padding' is neccessary for structure alignment.  This field ensures that the
-+'extended_modes' field is aligned on a 64-bit boundary.
-+
-+'extended_modes' is a bitfield that defines special functionality which has an
-+impact on the device drivers.  Each bit has its own impact and has special
-+instructions for the driver associated with it.  This field is stored in
-+the QE library and available to any driver that calles qe_get_firmware_info().
-+
-+'vtraps' is an array of 8 words that contain virtual trap values for each
-+virtual traps.  As with 'extended_modes', this field is stored in the QE
-+library and available to any driver that calles qe_get_firmware_info().
-+
-+'microcode' (type: struct qe_microcode):
-+      For each RISC processor there is one 'microcode' structure.  The first
-+      'microcode' structure is for the first RISC, and so on.
-+
-+      The 'id' field is a null-terminated string suitable for printing that
-+      identifies this particular microcode.
-+
-+      'traps' is an array of 16 words that contain hardware trap values
-+      for each of the 16 traps.  If trap[i] is 0, then this particular
-+      trap is to be ignored (i.e. not written to TIBCR[i]).  The entire value
-+      is written as-is to the TIBCR[i] register, so be sure to set the EN
-+      and T_IBP bits if necessary.
-+
-+      'eccr' is the value to program into the ECCR register.
-+
-+      'iram_offset' is the offset into IRAM to start writing the
-+      microcode.
-+
-+      'count' is the number of 32-bit words in the microcode.
-+
-+      'code_offset' is the offset, in bytes, from the beginning of this
-+      structure where the microcode itself can be found.  The first
-+      microcode binary should be located immediately after the 'microcode'
-+      array.
-+
-+      'major', 'minor', and 'revision' are the major, minor, and revision
-+      version numbers, respectively, of the microcode.  If all values are 0,
-+      then these fields are ignored.
-+
-+      'reserved' is necessary for structure alignment.  Since 'microcode'
-+      is an array, the 64-bit 'extended_modes' field needs to be aligned
-+      on a 64-bit boundary, and this can only happen if the size of
-+      'microcode' is a multiple of 8 bytes.  To ensure that, we add
-+      'reserved'.
-+
-+After the last microcode is a 32-bit CRC.  It can be calculated using
-+this algorithm:
-+
-+u32 crc32(const u8 *p, unsigned int len)
-+{
-+      unsigned int i;
-+      u32 crc = 0;
-+
-+      while (len--) {
-+         crc ^= *p++;
-+         for (i = 0; i < 8; i++)
-+                 crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
-+      }
-+      return crc;
-+}
-+
-+VI - Sample Code for Creating Firmware Files
-+============================================
-+
-+A Python program that creates firmware binaries from the header files normally
-+distributed by Freescale can be found on http://opensource.freescale.com.
---- a/arch/powerpc/Kconfig
-+++ b/arch/powerpc/Kconfig
-@@ -140,6 +140,9 @@ config DEFAULT_UIMAGE
-         Used to allow a board to specify it wants a uImage built by default
-       default n
-+config REDBOOT
-+      bool
-+
- config PPC64_SWSUSP
-       bool
-       depends on PPC64 && (BROKEN || (PPC_PMAC64 && EXPERIMENTAL))
-@@ -160,11 +163,13 @@ config PPC_DCR
- config PPC_OF_PLATFORM_PCI
-       bool
-+      depends on PCI
-       depends on PPC64 # not supported on 32 bits yet
-       default n
- source "init/Kconfig"
-+source "arch/powerpc/sysdev/Kconfig"
- source "arch/powerpc/platforms/Kconfig"
- menu "Kernel options"
-@@ -417,7 +422,7 @@ endmenu
- config ISA_DMA_API
-       bool
--      default y
-+      default !PPC_ISERIES || PCI
- menu "Bus options"
-@@ -467,7 +472,7 @@ config MCA
- config PCI
-       bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
-               || PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
--              || PPC_PS3
-+              || PPC_PS3 || 44x
-       default y if !40x && !CPM2 && !8xx && !PPC_83xx \
-               && !PPC_85xx && !PPC_86xx
-       default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
---- a/arch/powerpc/Kconfig.debug
-+++ b/arch/powerpc/Kconfig.debug
-@@ -151,6 +151,13 @@ config BOOTX_TEXT
- config PPC_EARLY_DEBUG
-       bool "Early debugging (dangerous)"
-+      help
-+        Say Y to enable some early debugging facilities that may be available
-+        for your processor/board combination. Those facilities are hacks
-+        intended to debug problems early during boot, this should not be
-+        enabled in a production kernel.
-+        Note that enabling this will also cause the kernel default log level
-+        to be pushed to max automatically very early during boot
- choice
-       prompt "Early debugging console"
-@@ -218,7 +225,16 @@ config PPC_EARLY_DEBUG_44x
-       depends on 44x
-       help
-         Select this to enable early debugging for IBM 44x chips via the
--        inbuilt serial port.
-+        inbuilt serial port.  If you enable this, ensure you set
-+          PPC_EARLY_DEBUG_44x_PHYSLOW below to suit your target board.
-+
-+config PPC_EARLY_DEBUG_40x
-+      bool "Early serial debugging for IBM/AMCC 40x CPUs"
-+      depends on 40x
-+      help
-+        Select this to enable early debugging for IBM 40x chips via the
-+        inbuilt serial port. This works on chips with a 16550 compatible
-+        UART. Xilinx chips with uartlite cannot use this option.
- config PPC_EARLY_DEBUG_CPM
-       bool "Early serial debugging for Freescale CPM-based serial ports"
-@@ -235,12 +251,20 @@ config PPC_EARLY_DEBUG_44x_PHYSLOW
-       hex "Low 32 bits of early debug UART physical address"
-       depends on PPC_EARLY_DEBUG_44x
-       default "0x40000200"
-+      help
-+        You probably want 0x40000200 for ebony boards and
-+          0x40000300 for taishan
- config PPC_EARLY_DEBUG_44x_PHYSHIGH
-       hex "EPRN of early debug UART physical address"
-       depends on PPC_EARLY_DEBUG_44x
-       default "0x1"
-+config PPC_EARLY_DEBUG_40x_PHYSADDR
-+      hex "Early debug UART physical address"
-+      depends on PPC_EARLY_DEBUG_40x
-+      default "0xef600300"
-+
- config PPC_EARLY_DEBUG_CPM_ADDR
-       hex "CPM UART early debug transmit descriptor address"
-       depends on PPC_EARLY_DEBUG_CPM
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -167,6 +167,9 @@ boot := arch/$(ARCH)/boot
- $(BOOT_TARGETS): vmlinux
-       $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-+bootwrapper_install:
-+      $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-+
- define archhelp
-   @echo '* zImage          - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
-   @echo '  install         - Install kernel using'
---- a/arch/powerpc/boot/4xx.c
-+++ b/arch/powerpc/boot/4xx.c
-@@ -22,16 +22,14 @@
- #include "dcr.h"
- /* Read the 4xx SDRAM controller to get size of system memory. */
--void ibm4xx_fixup_memsize(void)
-+void ibm4xx_sdram_fixup_memsize(void)
- {
-       int i;
-       unsigned long memsize, bank_config;
-       memsize = 0;
-       for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
--              mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
--              bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
--
-+              bank_config = SDRAM0_READ(sdram_bxcr[i]);
-               if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
-                       memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
-       }
-@@ -39,6 +37,69 @@ void ibm4xx_fixup_memsize(void)
-       dt_fixup_memory(0, memsize);
- }
-+/* Read the 440SPe MQ controller to get size of system memory. */
-+#define DCRN_MQ0_B0BAS                0x40
-+#define DCRN_MQ0_B1BAS                0x41
-+#define DCRN_MQ0_B2BAS                0x42
-+#define DCRN_MQ0_B3BAS                0x43
-+
-+static u64 ibm440spe_decode_bas(u32 bas)
-+{
-+      u64 base = ((u64)(bas & 0xFFE00000u)) << 2;
-+
-+      /* open coded because I'm paranoid about invalid values */
-+      switch ((bas >> 4) & 0xFFF) {
-+      case 0:
-+              return 0;
-+      case 0xffc:
-+              return base + 0x000800000ull;
-+      case 0xff8:
-+              return base + 0x001000000ull;
-+      case 0xff0:
-+              return base + 0x002000000ull;
-+      case 0xfe0:
-+              return base + 0x004000000ull;
-+      case 0xfc0:
-+              return base + 0x008000000ull;
-+      case 0xf80:
-+              return base + 0x010000000ull;
-+      case 0xf00:
-+              return base + 0x020000000ull;
-+      case 0xe00:
-+              return base + 0x040000000ull;
-+      case 0xc00:
-+              return base + 0x080000000ull;
-+      case 0x800:
-+              return base + 0x100000000ull;
-+      }
-+      printf("Memory BAS value 0x%08x unsupported !\n", bas);
-+      return 0;
-+}
-+
-+void ibm440spe_fixup_memsize(void)
-+{
-+      u64 banktop, memsize = 0;
-+
-+      /* Ultimately, we should directly construct the memory node
-+       * so we are able to handle holes in the memory address space
-+       */
-+      banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B0BAS));
-+      if (banktop > memsize)
-+              memsize = banktop;
-+      banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B1BAS));
-+      if (banktop > memsize)
-+              memsize = banktop;
-+      banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B2BAS));
-+      if (banktop > memsize)
-+              memsize = banktop;
-+      banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B3BAS));
-+      if (banktop > memsize)
-+              memsize = banktop;
-+
-+      dt_fixup_memory(0, memsize);
-+}
-+
-+
- /* 4xx DDR1/2 Denali memory controller support */
- /* DDR0 registers */
- #define DDR0_02                       2
-@@ -77,19 +138,13 @@ void ibm4xx_fixup_memsize(void)
- #define DDR_GET_VAL(val, mask, shift) (((val) >> (shift)) & (mask))
--static inline u32 mfdcr_sdram0(u32 reg)
--{
--        mtdcr(DCRN_SDRAM0_CFGADDR, reg);
--        return mfdcr(DCRN_SDRAM0_CFGDATA);
--}
--
- void ibm4xx_denali_fixup_memsize(void)
- {
-       u32 val, max_cs, max_col, max_row;
-       u32 cs, col, row, bank, dpath;
-       unsigned long memsize;
--      val = mfdcr_sdram0(DDR0_02);
-+      val = SDRAM0_READ(DDR0_02);
-       if (!DDR_GET_VAL(val, DDR_START, DDR_START_SHIFT))
-               fatal("DDR controller is not initialized\n");
-@@ -99,12 +154,12 @@ void ibm4xx_denali_fixup_memsize(void)
-       max_row = DDR_GET_VAL(val, DDR_MAX_ROW_REG, DDR_MAX_ROW_REG_SHIFT);
-       /* get CS value */
--      val = mfdcr_sdram0(DDR0_10);
-+      val = SDRAM0_READ(DDR0_10);
-       val = DDR_GET_VAL(val, DDR_CS_MAP, DDR_CS_MAP_SHIFT);
-       cs = 0;
-       while (val) {
--              if (val && 0x1)
-+              if (val & 0x1)
-                       cs++;
-               val = val >> 1;
-       }
-@@ -115,15 +170,15 @@ void ibm4xx_denali_fixup_memsize(void)
-               fatal("DDR wrong CS configuration\n");
-       /* get data path bytes */
--      val = mfdcr_sdram0(DDR0_14);
-+      val = SDRAM0_READ(DDR0_14);
-       if (DDR_GET_VAL(val, DDR_REDUC, DDR_REDUC_SHIFT))
-               dpath = 8; /* 64 bits */
-       else
-               dpath = 4; /* 32 bits */
--      /* get adress pins (rows) */
--      val = mfdcr_sdram0(DDR0_42);
-+      /* get address pins (rows) */
-+      val = SDRAM0_READ(DDR0_42);
-       row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT);
-       if (row > max_row)
-@@ -131,7 +186,7 @@ void ibm4xx_denali_fixup_memsize(void)
-       row = max_row - row;
-       /* get collomn size and banks */
--      val = mfdcr_sdram0(DDR0_43);
-+      val = SDRAM0_READ(DDR0_43);
-       col = DDR_GET_VAL(val, DDR_COL_SZ, DDR_COL_SZ_SHIFT);
-       if (col > max_col)
-@@ -179,13 +234,17 @@ void ibm40x_dbcr_reset(void)
- #define EMAC_RESET 0x20000000
- void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1)
- {
--      /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't do this for us */
-+      /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't
-+       * do this for us
-+       */
-       if (emac0)
-               *emac0 = EMAC_RESET;
-       if (emac1)
-               *emac1 = EMAC_RESET;
-       mtdcr(DCRN_MAL0_CFG, MAL_RESET);
-+      while (mfdcr(DCRN_MAL0_CFG) & MAL_RESET)
-+              ; /* loop until reset takes effect */
- }
- /* Read 4xx EBC bus bridge registers to get mappings of the peripheral
-@@ -217,84 +276,335 @@ void ibm4xx_fixup_ebc_ranges(const char 
-       setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
- }
--#define SPRN_CCR1 0x378
--void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
-+/* Calculate 440GP clocks */
-+void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
- {
--      u32 cpu, plb, opb, ebc, tb, uart0, m, vco;
--      u32 reg;
--      u32 fwdva, fwdvb, fbdv, lfbdv, opbdv0, perdv0, spcid0, prbdv0, tmp;
--
--      mtdcr(DCRN_CPR0_ADDR, CPR0_PLLD0);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x000F0000) >> 16;
--      fwdva = tmp ? tmp : 16;
--      tmp = (reg & 0x00000700) >> 8;
--      fwdvb = tmp ? tmp : 8;
--      tmp = (reg & 0x1F000000) >> 24;
--      fbdv = tmp ? tmp : 32;
--      lfbdv = (reg & 0x0000007F);
--
--      mtdcr(DCRN_CPR0_ADDR, CPR0_OPBD0);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x03000000) >> 24;
--      opbdv0 = tmp ? tmp : 4;
--
--      mtdcr(DCRN_CPR0_ADDR, CPR0_PERD0);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x07000000) >> 24;
--      perdv0 = tmp ? tmp : 8;
--
--      mtdcr(DCRN_CPR0_ADDR, CPR0_PRIMBD0);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x07000000) >> 24;
--      prbdv0 = tmp ? tmp : 8;
--
--      mtdcr(DCRN_CPR0_ADDR, CPR0_SCPID);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x03000000) >> 24;
--      spcid0 = tmp ? tmp : 4;
--
--      /* Calculate M */
--      mtdcr(DCRN_CPR0_ADDR, CPR0_PLLC0);
--      reg = mfdcr(DCRN_CPR0_DATA);
--      tmp = (reg & 0x03000000) >> 24;
--      if (tmp == 0) { /* PLL output */
--              tmp = (reg & 0x20000000) >> 29;
--              if (!tmp) /* PLLOUTA */
--                      m = fbdv * lfbdv * fwdva;
-+      u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
-+      u32 cr0 = mfdcr(DCRN_CPC0_CR0);
-+      u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-+      u32 opdv = CPC0_SYS0_OPDV(sys0);
-+      u32 epdv = CPC0_SYS0_EPDV(sys0);
-+
-+      if (sys0 & CPC0_SYS0_BYPASS) {
-+              /* Bypass system PLL */
-+              cpu = plb = sys_clk;
-+      } else {
-+              if (sys0 & CPC0_SYS0_EXTSL)
-+                      /* PerClk */
-+                      m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
-               else
--                      m = fbdv * lfbdv * fwdvb;
-+                      /* CPU clock */
-+                      m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
-+              cpu = sys_clk * m / CPC0_SYS0_FWDVA(sys0);
-+              plb = sys_clk * m / CPC0_SYS0_FWDVB(sys0);
-       }
--      else if (tmp == 1) /* CPU output */
--              m = fbdv * fwdva;
-+
-+      opb = plb / opdv;
-+      ebc = opb / epdv;
-+
-+      /* FIXME: Check if this is for all 440GP, or just Ebony */
-+      if ((mfpvr() & 0xf0000fff) == 0x40000440)
-+              /* Rev. B 440GP, use external system clock */
-+              tb = sys_clk;
-       else
--              m = perdv0 * opbdv0 * fwdvb;
-+              /* Rev. C 440GP, errata force us to use internal clock */
-+              tb = cpu;
--      vco = (m * sysclk) + (m >> 1);
--      cpu = vco / fwdva;
--      plb = vco / fwdvb / prbdv0;
--      opb = plb / opbdv0;
--      ebc = plb / perdv0;
-+      if (cr0 & CPC0_CR0_U0EC)
-+              /* External UART clock */
-+              uart0 = ser_clk;
-+      else
-+              /* Internal UART clock */
-+              uart0 = plb / CPC0_CR0_UDIV(cr0);
--      /* FIXME */
--      uart0 = ser_clk;
-+      if (cr0 & CPC0_CR0_U1EC)
-+              /* External UART clock */
-+              uart1 = ser_clk;
-+      else
-+              /* Internal UART clock */
-+              uart1 = plb / CPC0_CR0_UDIV(cr0);
-+
-+      printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
-+             (sys_clk + 500000) / 1000000, sys_clk);
-+
-+      dt_fixup_cpu_clocks(cpu, tb, 0);
-+
-+      dt_fixup_clock("/plb", plb);
-+      dt_fixup_clock("/plb/opb", opb);
-+      dt_fixup_clock("/plb/opb/ebc", ebc);
-+      dt_fixup_clock("/plb/opb/serial@40000200", uart0);
-+      dt_fixup_clock("/plb/opb/serial@40000300", uart1);
-+}
-+
-+#define SPRN_CCR1 0x378
-+
-+static inline u32 __fix_zero(u32 v, u32 def)
-+{
-+      return v ? v : def;
-+}
-+
-+static unsigned int __ibm440eplike_fixup_clocks(unsigned int sys_clk,
-+                                              unsigned int tmr_clk,
-+                                              int per_clk_from_opb)
-+{
-+      /* PLL config */
-+      u32 pllc  = CPR0_READ(DCRN_CPR0_PLLC);
-+      u32 plld  = CPR0_READ(DCRN_CPR0_PLLD);
-+
-+      /* Dividers */
-+      u32 fbdv   = __fix_zero((plld >> 24) & 0x1f, 32);
-+      u32 fwdva  = __fix_zero((plld >> 16) & 0xf, 16);
-+      u32 fwdvb  = __fix_zero((plld >> 8) & 7, 8);
-+      u32 lfbdv  = __fix_zero(plld & 0x3f, 64);
-+      u32 pradv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMAD) >> 24) & 7, 8);
-+      u32 prbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMBD) >> 24) & 7, 8);
-+      u32 opbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_OPBD) >> 24) & 3, 4);
-+      u32 perdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PERD) >> 24) & 3, 4);
-+
-+      /* Input clocks for primary dividers */
-+      u32 clk_a, clk_b;
-+
-+      /* Resulting clocks */
-+      u32 cpu, plb, opb, ebc, vco;
-+
-+      /* Timebase */
-+      u32 ccr1, tb = tmr_clk;
-+
-+      if (pllc & 0x40000000) {
-+              u32 m;
-+
-+              /* Feedback path */
-+              switch ((pllc >> 24) & 7) {
-+              case 0:
-+                      /* PLLOUTx */
-+                      m = ((pllc & 0x20000000) ? fwdvb : fwdva) * lfbdv;
-+                      break;
-+              case 1:
-+                      /* CPU */
-+                      m = fwdva * pradv0;
-+                      break;
-+              case 5:
-+                      /* PERClk */
-+                      m = fwdvb * prbdv0 * opbdv0 * perdv0;
-+                      break;
-+              default:
-+                      printf("WARNING ! Invalid PLL feedback source !\n");
-+                      goto bypass;
-+              }
-+              m *= fbdv;
-+              vco = sys_clk * m;
-+              clk_a = vco / fwdva;
-+              clk_b = vco / fwdvb;
-+      } else {
-+bypass:
-+              /* Bypass system PLL */
-+              vco = 0;
-+              clk_a = clk_b = sys_clk;
-+      }
-+
-+      cpu = clk_a / pradv0;
-+      plb = clk_b / prbdv0;
-+      opb = plb / opbdv0;
-+      ebc = (per_clk_from_opb ? opb : plb) / perdv0;
-       /* Figure out timebase.  Either CPU or default TmrClk */
--      asm volatile (
--                      "mfspr  %0,%1\n"
--                      :
--                      "=&r"(reg) : "i"(SPRN_CCR1));
--      if (reg & 0x0080)
--              tb = 25000000; /* TmrClk is 25MHz */
--      else
-+      ccr1 = mfspr(SPRN_CCR1);
-+
-+      /* If passed a 0 tmr_clk, force CPU clock */
-+      if (tb == 0) {
-+              ccr1 &= ~0x80u;
-+              mtspr(SPRN_CCR1, ccr1);
-+      }
-+      if ((ccr1 & 0x0080) == 0)
-               tb = cpu;
-       dt_fixup_cpu_clocks(cpu, tb, 0);
-       dt_fixup_clock("/plb", plb);
-       dt_fixup_clock("/plb/opb", opb);
-       dt_fixup_clock("/plb/opb/ebc", ebc);
-+
-+      return plb;
-+}
-+
-+static void eplike_fixup_uart_clk(int index, const char *path,
-+                                unsigned int ser_clk,
-+                                unsigned int plb_clk)
-+{
-+      unsigned int sdr;
-+      unsigned int clock;
-+
-+      switch (index) {
-+      case 0:
-+              sdr = SDR0_READ(DCRN_SDR0_UART0);
-+              break;
-+      case 1:
-+              sdr = SDR0_READ(DCRN_SDR0_UART1);
-+              break;
-+      case 2:
-+              sdr = SDR0_READ(DCRN_SDR0_UART2);
-+              break;
-+      case 3:
-+              sdr = SDR0_READ(DCRN_SDR0_UART3);
-+              break;
-+      default:
-+              return;
-+      }
-+
-+      if (sdr & 0x00800000u)
-+              clock = ser_clk;
-+      else
-+              clock = plb_clk / __fix_zero(sdr & 0xff, 256);
-+
-+      dt_fixup_clock(path, clock);
-+}
-+
-+void ibm440ep_fixup_clocks(unsigned int sys_clk,
-+                         unsigned int ser_clk,
-+                         unsigned int tmr_clk)
-+{
-+      unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 0);
-+
-+      /* serial clocks beed fixup based on int/ext */
-+      eplike_fixup_uart_clk(0, "/plb/opb/serial@ef600300", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(1, "/plb/opb/serial@ef600400", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(2, "/plb/opb/serial@ef600500", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(3, "/plb/opb/serial@ef600600", ser_clk, plb_clk);
-+}
-+
-+void ibm440gx_fixup_clocks(unsigned int sys_clk,
-+                         unsigned int ser_clk,
-+                         unsigned int tmr_clk)
-+{
-+      unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
-+
-+      /* serial clocks beed fixup based on int/ext */
-+      eplike_fixup_uart_clk(0, "/plb/opb/serial@40000200", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(1, "/plb/opb/serial@40000300", ser_clk, plb_clk);
-+}
-+
-+void ibm440spe_fixup_clocks(unsigned int sys_clk,
-+                          unsigned int ser_clk,
-+                          unsigned int tmr_clk)
-+{
-+      unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
-+
-+      /* serial clocks beed fixup based on int/ext */
-+      eplike_fixup_uart_clk(0, "/plb/opb/serial@10000200", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(1, "/plb/opb/serial@10000300", ser_clk, plb_clk);
-+      eplike_fixup_uart_clk(2, "/plb/opb/serial@10000600", ser_clk, plb_clk);
-+}
-+
-+void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
-+{
-+      u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
-+      u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
-+      u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
-+      u32 psr = mfdcr(DCRN_405_CPC0_PSR);
-+      u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-+      u32 fwdv, fwdvb, fbdv, cbdv, opdv, epdv, ppdv, udiv;
-+
-+      fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
-+      fbdv = (pllmr & 0x1e000000) >> 25;
-+      if (fbdv == 0)
-+              fbdv = 16;
-+      cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */
-+      opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */
-+      ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */
-+      epdv = ((pllmr & 0x00001800) >> 11) + 2; /* PLB:EBC */
-+      udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
-+
-+      /* check for 405GPr */
-+      if ((mfpvr() & 0xfffffff0) == (0x50910951 & 0xfffffff0)) {
-+              fwdvb = 8 - (pllmr & 0x00000007);
-+              if (!(psr & 0x00001000)) /* PCI async mode enable == 0 */
-+                      if (psr & 0x00000020) /* New mode enable */
-+                              m = fwdvb * 2 * ppdv;
-+                      else
-+                              m = fwdvb * cbdv * ppdv;
-+              else if (psr & 0x00000020) /* New mode enable */
-+                      if (psr & 0x00000800) /* PerClk synch mode */
-+                              m = fwdvb * 2 * epdv;
-+                      else
-+                              m = fbdv * fwdv;
-+              else if (epdv == fbdv)
-+                      m = fbdv * cbdv * epdv;
-+              else
-+                      m = fbdv * fwdvb * cbdv;
-+
-+              cpu = sys_clk * m / fwdv;
-+              plb = sys_clk * m / (fwdvb * cbdv);
-+      } else {
-+              m = fwdv * fbdv * cbdv;
-+              cpu = sys_clk * m / fwdv;
-+              plb = cpu / cbdv;
-+      }
-+      opb = plb / opdv;
-+      ebc = plb / epdv;
-+
-+      if (cpc0_cr0 & 0x80)
-+              /* uart0 uses the external clock */
-+              uart0 = ser_clk;
-+      else
-+              uart0 = cpu / udiv;
-+
-+      if (cpc0_cr0 & 0x40)
-+              /* uart1 uses the external clock */
-+              uart1 = ser_clk;
-+      else
-+              uart1 = cpu / udiv;
-+
-+      /* setup the timebase clock to tick at the cpu frequency */
-+      cpc0_cr1 = cpc0_cr1 & ~0x00800000;
-+      mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
-+      tb = cpu;
-+
-+      dt_fixup_cpu_clocks(cpu, tb, 0);
-+      dt_fixup_clock("/plb", plb);
-+      dt_fixup_clock("/plb/opb", opb);
-+      dt_fixup_clock("/plb/ebc", ebc);
-+      dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
-+      dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
-+}
-+
-+
-+void ibm405ep_fixup_clocks(unsigned int sys_clk)
-+{
-+      u32 pllmr0 = mfdcr(DCRN_CPC0_PLLMR0);
-+      u32 pllmr1 = mfdcr(DCRN_CPC0_PLLMR1);
-+      u32 cpc0_ucr = mfdcr(DCRN_CPC0_UCR);
-+      u32 cpu, plb, opb, ebc, uart0, uart1;
-+      u32 fwdva, fwdvb, fbdv, cbdv, opdv, epdv;
-+      u32 pllmr0_ccdv, tb, m;
-+
-+      fwdva = 8 - ((pllmr1 & 0x00070000) >> 16);
-+      fwdvb = 8 - ((pllmr1 & 0x00007000) >> 12);
-+      fbdv = (pllmr1 & 0x00f00000) >> 20;
-+      if (fbdv == 0)
-+              fbdv = 16;
-+
-+      cbdv = ((pllmr0 & 0x00030000) >> 16) + 1; /* CPU:PLB */
-+      epdv = ((pllmr0 & 0x00000300) >> 8) + 2;  /* PLB:EBC */
-+      opdv = ((pllmr0 & 0x00003000) >> 12) + 1; /* PLB:OPB */
-+
-+      m = fbdv * fwdvb;
-+
-+      pllmr0_ccdv = ((pllmr0 & 0x00300000) >> 20) + 1;
-+      if (pllmr1 & 0x80000000)
-+              cpu = sys_clk * m / (fwdva * pllmr0_ccdv);
-+      else
-+              cpu = sys_clk / pllmr0_ccdv;
-+
-+      plb = cpu / cbdv;
-+      opb = plb / opdv;
-+      ebc = plb / epdv;
-+      tb = cpu;
-+      uart0 = cpu / (cpc0_ucr & 0x0000007f);
-+      uart1 = cpu / ((cpc0_ucr & 0x00007f00) >> 8);
-+
-+      dt_fixup_cpu_clocks(cpu, tb, 0);
-+      dt_fixup_clock("/plb", plb);
-+      dt_fixup_clock("/plb/opb", opb);
-+      dt_fixup_clock("/plb/ebc", ebc);
-       dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
--      dt_fixup_clock("/plb/opb/serial@ef600400", uart0);
--      dt_fixup_clock("/plb/opb/serial@ef600500", uart0);
--      dt_fixup_clock("/plb/opb/serial@ef600600", uart0);
-+      dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
- }
---- a/arch/powerpc/boot/4xx.h
-+++ b/arch/powerpc/boot/4xx.h
-@@ -11,12 +11,22 @@
- #ifndef _POWERPC_BOOT_4XX_H_
- #define _POWERPC_BOOT_4XX_H_
--void ibm4xx_fixup_memsize(void);
-+void ibm4xx_sdram_fixup_memsize(void);
-+void ibm440spe_fixup_memsize(void);
- void ibm4xx_denali_fixup_memsize(void);
- void ibm44x_dbcr_reset(void);
- void ibm40x_dbcr_reset(void);
- void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1);
- void ibm4xx_fixup_ebc_ranges(const char *ebc);
--void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk);
-+
-+void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
-+void ibm405ep_fixup_clocks(unsigned int sys_clk);
-+void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
-+void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+                         unsigned int tmr_clk);
-+void ibm440gx_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+                         unsigned int tmr_clk);
-+void ibm440spe_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+                          unsigned int tmr_clk);
- #endif /* _POWERPC_BOOT_4XX_H_ */
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -33,12 +33,15 @@ ifeq ($(call cc-option-yn, -fstack-prote
- BOOTCFLAGS    += -fno-stack-protector
- endif
--BOOTCFLAGS    += -I$(obj) -I$(srctree)/$(obj)
-+BOOTCFLAGS    += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt
- $(obj)/4xx.o: BOOTCFLAGS += -mcpu=440
- $(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
-+
- zlib       := inffast.c inflate.c inftrees.c
- zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
- zliblinuxheader := zlib.h zconf.h zutil.h
-@@ -46,17 +49,21 @@ zliblinuxheader := zlib.h zconf.h zutil.
- $(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \
-       $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
--src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
-+src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
-+src-wlib := string.S crt0.S stdio.c main.c \
-+              $(addprefix libfdt/,$(src-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 \
-               cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
-               fsl-soc.c mpc8xx.c pq2.c
--src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \
-+src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c \
-               cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
-               ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
-               cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c cuboot-bamboo.c \
--              fixed-head.S ep88xc.c cuboot-hpc2.c
-+              fixed-head.S ep88xc.c cuboot-hpc2.c ep405.c cuboot-taishan.c \
-+              cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
-+              cuboot-warp.c
- src-boot := $(src-wlib) $(src-plat) empty.c
- src-boot := $(addprefix $(obj)/, $(src-boot))
-@@ -101,24 +108,61 @@ quiet_cmd_bootar = BOOTAR  $@
-       cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
- $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE
-+      $(Q)mkdir -p $(dir $@)
-       $(call if_changed_dep,bootcc)
- $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE
-+      $(Q)mkdir -p $(dir $@)
-       $(call if_changed_dep,bootas)
- $(obj)/wrapper.a: $(obj-wlib) FORCE
-       $(call if_changed,bootar)
--hostprogs-y   := addnote addRamDisk hack-coff mktree
-+hostprogs-y   := addnote addRamDisk hack-coff mktree dtc
- targets               += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a)
- extra-y               := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
-                  $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds
- wrapper               :=$(srctree)/$(src)/wrapper
--wrapperbits   := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \
-+wrapperbits   := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree dtc) \
-                       $(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
-+
-+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),)
-@@ -150,15 +194,26 @@ image-$(CONFIG_DEFAULT_UIMAGE)           += uImag
- ifneq ($(CONFIG_DEVICE_TREE),"")
- image-$(CONFIG_PPC_8xx)                       += cuImage.8xx
- image-$(CONFIG_PPC_EP88XC)            += zImage.ep88xc
-+image-$(CONFIG_EP405)                 += zImage.ep405
- image-$(CONFIG_8260)                  += cuImage.pq2
-+image-$(CONFIG_EP8248E)                       += zImage.ep8248e
- image-$(CONFIG_PPC_MPC52xx)           += cuImage.52xx
-+image-$(CONFIG_STORCENTER)            += cuImage.824x
- image-$(CONFIG_PPC_83xx)              += cuImage.83xx
- image-$(CONFIG_PPC_85xx)              += cuImage.85xx
- image-$(CONFIG_MPC7448HPC2)           += cuImage.hpc2
- image-$(CONFIG_EBONY)                 += treeImage.ebony cuImage.ebony
- image-$(CONFIG_BAMBOO)                        += treeImage.bamboo cuImage.bamboo
- image-$(CONFIG_SEQUOIA)                       += cuImage.sequoia
-+image-$(CONFIG_RAINIER)                       += cuImage.rainier
- image-$(CONFIG_WALNUT)                        += treeImage.walnut
-+image-$(CONFIG_TAISHAN)                       += cuImage.taishan
-+image-$(CONFIG_KATMAI)                        += cuImage.katmai
-+image-$(CONFIG_WARP)                  += cuImage.warp
-+endif
-+
-+ifneq ($(CONFIG_REDBOOT),"")
-+image-$(CONFIG_PPC_8xx)                       += zImage.redboot-8xx
- endif
- # For 32-bit powermacs, build the COFF and miboot images
-@@ -243,3 +298,51 @@ clean-kernel := vmlinux.strip vmlinux.bi
- clean-kernel += $(addsuffix .gz,$(clean-kernel))
- # If not absolute clean-files are relative to $(obj).
- clean-files += $(addprefix $(objtree)/, $(clean-kernel))
-+
-+WRAPPER_OBJDIR := /usr/lib/kernel-wrapper
-+WRAPPER_DTSDIR := /usr/lib/kernel-wrapper/dts
-+WRAPPER_BINDIR := /usr/sbin
-+INSTALL := install
-+
-+extra-installed               := $(patsubst $(obj)/%, $(DESTDIR)$(WRAPPER_OBJDIR)/%, $(extra-y))
-+hostprogs-installed   := $(patsubst %, $(DESTDIR)$(WRAPPER_BINDIR)/%, $(hostprogs-y))
-+wrapper-installed     := $(DESTDIR)$(WRAPPER_BINDIR)/wrapper
-+dts-installed         := $(patsubst $(obj)/dts/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(obj)/dts/*.dts))
-+
-+all-installed         := $(extra-installed) $(hostprogs-installed) $(wrapper-installed) $(dts-installed)
-+
-+quiet_cmd_mkdir           = MKDIR   $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
-+      cmd_mkdir           = mkdir -p $@
-+
-+quiet_cmd_install       = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,%,$@)
-+      cmd_install       = $(INSTALL)  -m0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@
-+
-+quiet_cmd_install_dts   = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,dts/%,$@)
-+      cmd_install_dts   = $(INSTALL)  -m0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@
-+
-+quiet_cmd_install_exe   = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
-+      cmd_install_exe   = $(INSTALL)  -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@
-+
-+quiet_cmd_install_wrapper = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
-+      cmd_install_wrapper = $(INSTALL)  -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\
-+                              sed -i $@ -e 's%^object=.*%object=$(WRAPPER_OBJDIR)%' \
-+                                        -e 's%^objbin=.*%objbin=$(WRAPPER_BINDIR)%' \
-+
-+
-+$(DESTDIR)$(WRAPPER_OBJDIR) $(DESTDIR)$(WRAPPER_DTSDIR) $(DESTDIR)$(WRAPPER_BINDIR):
-+      $(call cmd,mkdir)
-+
-+$(extra-installed)    : $(DESTDIR)$(WRAPPER_OBJDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_OBJDIR)
-+      $(call cmd,install)
-+
-+$(hostprogs-installed)  : $(DESTDIR)$(WRAPPER_BINDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_BINDIR)
-+      $(call cmd,install_exe)
-+
-+$(dts-installed)      : $(DESTDIR)$(WRAPPER_DTSDIR)/% : $(srctree)/$(obj)/dts/% | $(DESTDIR)$(WRAPPER_DTSDIR)
-+      $(call cmd,install_dts)
-+
-+$(wrapper-installed): $(DESTDIR)$(WRAPPER_BINDIR) $(srctree)/$(obj)/wrapper | $(DESTDIR)$(WRAPPER_BINDIR)
-+      $(call cmd,install_wrapper)
-+
-+$(obj)/bootwrapper_install: $(all-installed)
-+
---- a/arch/powerpc/boot/bamboo.c
-+++ b/arch/powerpc/boot/bamboo.c
-@@ -30,8 +30,8 @@ static void bamboo_fixups(void)
- {
-       unsigned long sysclk = 33333333;
--      ibm440ep_fixup_clocks(sysclk, 11059200);
--      ibm4xx_fixup_memsize();
-+      ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
-+      ibm4xx_sdram_fixup_memsize();
-       ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
-       dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
- }
-@@ -42,6 +42,6 @@ void bamboo_init(void *mac0, void *mac1)
-       platform_ops.exit = ibm44x_dbcr_reset;
-       bamboo_mac0 = mac0;
-       bamboo_mac1 = mac1;
--      ft_init(_dtb_start, 0, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
- }
---- a/arch/powerpc/boot/cuboot-52xx.c
-+++ b/arch/powerpc/boot/cuboot-52xx.c
-@@ -53,7 +53,7 @@ void platform_init(unsigned long r3, uns
-                    unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-824x.c
-@@ -0,0 +1,53 @@
-+/*
-+ * Old U-boot compatibility for 824x
-+ *
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "cuboot.h"
-+
-+#define TARGET_824x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+
-+static void platform_fixups(void)
-+{
-+      void *soc;
-+
-+      dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-+      dt_fixup_mac_addresses(bd.bi_enetaddr);
-+      dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
-+
-+      soc = find_node_by_devtype(NULL, "soc");
-+      if (soc) {
-+              void *serial = NULL;
-+
-+              setprop(soc, "bus-frequency", &bd.bi_busfreq,
-+                      sizeof(bd.bi_busfreq));
-+
-+              while ((serial = find_node_by_devtype(serial, "serial"))) {
-+                      if (get_parent(serial) != soc)
-+                              continue;
-+
-+                      setprop(serial, "clock-frequency", &bd.bi_busfreq,
-+                              sizeof(bd.bi_busfreq));
-+              }
-+      }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                   unsigned long r6, unsigned long r7)
-+{
-+      CUBOOT_INIT();
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+      platform_ops.fixups = platform_fixups;
-+}
---- a/arch/powerpc/boot/cuboot-83xx.c
-+++ b/arch/powerpc/boot/cuboot-83xx.c
-@@ -24,7 +24,8 @@ static void platform_fixups(void)
-       void *soc;
-       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
--      dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
-+      dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+      dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
-       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
-       /* Unfortunately, the specific model number is encoded in the
-@@ -52,7 +53,7 @@ void platform_init(unsigned long r3, uns
-                    unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-85xx.c
-+++ b/arch/powerpc/boot/cuboot-85xx.c
-@@ -24,8 +24,9 @@ static void platform_fixups(void)
-       void *soc;
-       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
--      dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr,
--                             bd.bi_enet2addr);
-+      dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+      dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
-+      dt_fixup_mac_address_by_alias("ethernet2", bd.bi_enet2addr);
-       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq);
-       /* Unfortunately, the specific model number is encoded in the
-@@ -53,7 +54,7 @@ void platform_init(unsigned long r3, uns
-                    unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-8xx.c
-+++ b/arch/powerpc/boot/cuboot-8xx.c
-@@ -41,7 +41,7 @@ void platform_init(unsigned long r3, uns
-                    unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-hpc2.c
-+++ b/arch/powerpc/boot/cuboot-hpc2.c
-@@ -42,7 +42,7 @@ void platform_init(unsigned long r3, uns
-               unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-katmai.c
-@@ -0,0 +1,56 @@
-+/*
-+ * Old U-boot compatibility for Katmai
-+ *
-+ * Author: Hugh Blemings <hugh@au.ibm.com>
-+ *
-+ * Copyright 2007 Hugh Blemings, IBM Corporation.
-+ *   Based on cuboot-ebony.c which is:
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ *   Based on cuboot-83xx.c, which is:
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "reg.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "44x.h"
-+#include "cuboot.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+BSS_STACK(4096);
-+
-+static void katmai_fixups(void)
-+{
-+      unsigned long sysclk = 33333000;
-+
-+      /* 440SP Clock logic is all but identical to 440GX
-+       * so we just use that code for now at least
-+       */
-+      ibm440spe_fixup_clocks(sysclk, 6 * 1843200, 0);
-+
-+      ibm440spe_fixup_memsize();
-+
-+      dt_fixup_mac_address(0, bd.bi_enetaddr);
-+
-+      ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                 unsigned long r6, unsigned long r7)
-+{
-+      CUBOOT_INIT();
-+
-+      platform_ops.fixups = katmai_fixups;
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+}
---- a/arch/powerpc/boot/cuboot-pq2.c
-+++ b/arch/powerpc/boot/cuboot-pq2.c
-@@ -255,7 +255,7 @@ void platform_init(unsigned long r3, uns
-                    unsigned long r6, unsigned long r7)
- {
-       CUBOOT_INIT();
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
-       platform_ops.fixups = pq2_platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-rainier.c
-@@ -0,0 +1,56 @@
-+/*
-+ * Old U-boot compatibility for Rainier
-+ *
-+ * Valentine Barshak <vbarshak@ru.mvista.com>
-+ * Copyright 2007 MontaVista Software, Inc
-+ *
-+ * Based on Ebony code by David Gibson <david@gibson.dropbear.id.au>
-+ * Copyright IBM Corporation, 2007
-+ *
-+ * Based on Bamboo code by Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 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; version 2 of the License
-+ */
-+
-+#include <stdarg.h>
-+#include <stddef.h>
-+#include "types.h"
-+#include "elf.h"
-+#include "string.h"
-+#include "stdio.h"
-+#include "page.h"
-+#include "ops.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "44x.h"
-+#include "cuboot.h"
-+
-+#define TARGET_4xx
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+
-+static void rainier_fixups(void)
-+{
-+      unsigned long sysclk = 33333333;
-+
-+      ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-+      ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+      ibm4xx_denali_fixup_memsize();
-+      dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                   unsigned long r6, unsigned long r7)
-+{
-+      CUBOOT_INIT();
-+      platform_ops.fixups = rainier_fixups;
-+      platform_ops.exit = ibm44x_dbcr_reset;
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+}
---- a/arch/powerpc/boot/cuboot-sequoia.c
-+++ b/arch/powerpc/boot/cuboot-sequoia.c
-@@ -39,7 +39,7 @@ static void sequoia_fixups(void)
- {
-       unsigned long sysclk = 33333333;
--      ibm440ep_fixup_clocks(sysclk, 11059200);
-+      ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-       ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-       ibm4xx_denali_fixup_memsize();
-       dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-@@ -51,6 +51,6 @@ void platform_init(unsigned long r3, uns
-       CUBOOT_INIT();
-       platform_ops.fixups = sequoia_fixups;
-       platform_ops.exit = ibm44x_dbcr_reset;
--      ft_init(_dtb_start, 0, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-taishan.c
-@@ -0,0 +1,54 @@
-+/*
-+ * Old U-boot compatibility for Taishan
-+ *
-+ * Author: Hugh Blemings <hugh@au.ibm.com>
-+ *
-+ * Copyright 2007 Hugh Blemings, IBM Corporation.
-+ *   Based on cuboot-ebony.c which is:
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ *   Based on cuboot-83xx.c, which is:
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "cuboot.h"
-+#include "reg.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+BSS_STACK(4096);
-+
-+static void taishan_fixups(void)
-+{
-+      /* FIXME: sysclk should be derived by reading the FPGA
-+         registers */
-+      unsigned long sysclk = 33000000;
-+
-+      ibm440gx_fixup_clocks(sysclk, 6 * 1843200, 25000000);
-+
-+      ibm4xx_sdram_fixup_memsize();
-+
-+      dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
-+
-+      ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                 unsigned long r6, unsigned long r7)
-+{
-+      CUBOOT_INIT();
-+
-+      platform_ops.fixups = taishan_fixups;
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-warp.c
-@@ -0,0 +1,39 @@
-+/*
-+ * Copyright (c) 2008 PIKA Technologies
-+ *   Sean MacLennan <smaclennan@pikatech.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 "ops.h"
-+#include "4xx.h"
-+#include "cuboot.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+static void warp_fixups(void)
-+{
-+      unsigned long sysclk = 66000000;
-+
-+      ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-+      ibm4xx_sdram_fixup_memsize();
-+      ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+      dt_fixup_mac_addresses(&bd.bi_enetaddr);
-+}
-+
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                 unsigned long r6, unsigned long r7)
-+{
-+      CUBOOT_INIT();
-+
-+      platform_ops.fixups = warp_fixups;
-+      platform_ops.exit = ibm44x_dbcr_reset;
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+}
---- a/arch/powerpc/boot/dcr.h
-+++ b/arch/powerpc/boot/dcr.h
-@@ -14,12 +14,20 @@
- #define DCRN_SDRAM0_CFGADDR                           0x010
- #define DCRN_SDRAM0_CFGDATA                           0x011
-+#define SDRAM0_READ(offset) ({\
-+      mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
-+      mfdcr(DCRN_SDRAM0_CFGDATA); })
-+#define SDRAM0_WRITE(offset, data) ({\
-+      mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
-+      mtdcr(DCRN_SDRAM0_CFGDATA, data); })
-+
- #define       SDRAM0_B0CR                             0x40
- #define       SDRAM0_B1CR                             0x44
- #define       SDRAM0_B2CR                             0x48
- #define       SDRAM0_B3CR                             0x4c
--static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, SDRAM0_B2CR, SDRAM0_B3CR };
-+static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR,
-+                                          SDRAM0_B2CR, SDRAM0_B3CR };
- #define                       SDRAM_CONFIG_BANK_ENABLE        0x00000001
- #define                       SDRAM_CONFIG_SIZE_MASK          0x000e0000
-@@ -138,5 +146,54 @@ static const unsigned long sdram_bxcr[] 
- #define DCRN_CPC0_PLLMR 0xb0
- #define DCRN_405_CPC0_CR0 0xb1
- #define DCRN_405_CPC0_CR1 0xb2
-+#define DCRN_405_CPC0_PSR 0xb4
-+
-+/* 405EP Clocking/Power Management/Chip Control regs */
-+#define DCRN_CPC0_PLLMR0  0xf0
-+#define DCRN_CPC0_PLLMR1  0xf4
-+#define DCRN_CPC0_UCR     0xf5
-+
-+/* 440GX Clock control etc */
-+
-+
-+#define DCRN_CPR0_CLKUPD                              0x020
-+#define DCRN_CPR0_PLLC                                        0x040
-+#define DCRN_CPR0_PLLD                                        0x060
-+#define DCRN_CPR0_PRIMAD                              0x080
-+#define DCRN_CPR0_PRIMBD                              0x0a0
-+#define DCRN_CPR0_OPBD                                        0x0c0
-+#define DCRN_CPR0_PERD                                        0x0e0
-+#define DCRN_CPR0_MALD                                        0x100
-+
-+#define DCRN_SDR0_CONFIG_ADDR         0xe
-+#define DCRN_SDR0_CONFIG_DATA 0xf
-+
-+/* SDR read/write helper macros */
-+#define SDR0_READ(offset) ({\
-+      mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
-+      mfdcr(DCRN_SDR0_CONFIG_DATA); })
-+#define SDR0_WRITE(offset, data) ({\
-+      mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
-+      mtdcr(DCRN_SDR0_CONFIG_DATA, data); })
-+
-+#define DCRN_SDR0_UART0               0x0120
-+#define DCRN_SDR0_UART1               0x0121
-+#define DCRN_SDR0_UART2               0x0122
-+#define DCRN_SDR0_UART3               0x0123
-+
-+
-+/* CPRs read/write helper macros - based off include/asm-ppc/ibm44x.h */
-+
-+#define DCRN_CPR0_CFGADDR                             0xc
-+#define DCRN_CPR0_CFGDATA                             0xd
-+
-+#define CPR0_READ(offset) ({\
-+      mtdcr(DCRN_CPR0_CFGADDR, offset); \
-+      mfdcr(DCRN_CPR0_CFGDATA); })
-+#define CPR0_WRITE(offset, data) ({\
-+      mtdcr(DCRN_CPR0_CFGADDR, offset); \
-+      mtdcr(DCRN_CPR0_CFGDATA, data); })
-+
-+
- #endif        /* _PPC_BOOT_DCR_H_ */
---- a/arch/powerpc/boot/devtree.c
-+++ b/arch/powerpc/boot/devtree.c
-@@ -88,6 +88,20 @@ void dt_fixup_clock(const char *path, u3
-       }
- }
-+void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr)
-+{
-+      void *devp = find_node_by_alias(alias);
-+
-+      if (devp) {
-+              printf("%s: local-mac-address <-"
-+                     " %02x:%02x:%02x:%02x:%02x:%02x\n\r", alias,
-+                     addr[0], addr[1], addr[2],
-+                     addr[3], addr[4], addr[5]);
-+
-+              setprop(devp, "local-mac-address", addr, 6);
-+      }
-+}
-+
- void dt_fixup_mac_address(u32 index, const u8 *addr)
- {
-       void *devp = find_node_by_prop_value(NULL, "linux,network-index",
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/Makefile.dtc
-@@ -0,0 +1,25 @@
-+# 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_EXTRA = dtc.h srcpos.h
-+DTC_LEXFILES = dtc-lexer.l
-+DTC_BISONFILES = dtc-parser.y
-+
-+DTC_LEX_SRCS = $(DTC_LEXFILES:%.l=%.lex.c)
-+DTC_BISON_SRCS = $(DTC_BISONFILES:%.y=%.tab.c)
-+DTC_BISON_INCLUDES = $(DTC_BISONFILES:%.y=%.tab.h)
-+
-+DTC_GEN_SRCS = $(DTC_LEX_SRCS) $(DTC_BISON_SRCS)
-+DTC_GEN_ALL = $(DTC_GEN_SRCS) $(DTC_BISON_INCLUDES)
-+DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
-+
-+DTC_CLEANFILES = $(DTC_GEN_ALL)
-+
-+# We assume the containing Makefile system can do auto-dependencies for most
-+# things, but we supply the dependencies on generated header files explicitly
-+
-+$(addprefix $(DTC_objdir)/,$(DTC_GEN_SRCS:%.c=%.o)): $(addprefix $(DTC_objdir)/,$(DTC_BISON_INCLUDES))
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/checks.c
-@@ -0,0 +1,750 @@
-+/*
-+ * (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);
-+
-+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 *prop;
-+
-+      prop = get_property(node, "name");
-+      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);
-+}
-+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_be32(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,
-+      &name_is_string, &name_properties,
-+      &explicit_phandles,
-+      &phandle_references, &path_references,
-+
-+      &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
-+      &device_type_is_string, &model_is_string, &status_is_string,
-+
-+      &addr_size_cells, &reg_format, &ranges_format,
-+
-+      &avoid_default_addr_size,
-+      &obsolete_chosen_interrupt_controller,
-+};
-+
-+int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys);
-+
-+void process_checks(int force, struct boot_info *bi,
-+                  int checkflag, int outversion, int boot_cpuid_phys)
-+{
-+      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");
-+              }
-+      }
-+
-+      if (checkflag) {
-+              if (error) {
-+                      fprintf(stderr, "Warning: Skipping semantic checks due to structural errors\n");
-+              } else {
-+                      if (!check_semantics(bi->dt, outversion,
-+                                           boot_cpuid_phys))
-+                              fprintf(stderr, "Warning: Input tree has semantic errors\n");
-+              }
-+      }
-+}
-+
-+/*
-+ * Semantic check functions
-+ */
-+
-+#define ERRMSG(...) if (quiet < 2) fprintf(stderr, "ERROR: " __VA_ARGS__)
-+#define WARNMSG(...) if (quiet < 1) fprintf(stderr, "Warning: " __VA_ARGS__)
-+
-+#define DO_ERR(...) do {ERRMSG(__VA_ARGS__); ok = 0; } while (0)
-+
-+#define CHECK_HAVE(node, propname) \
-+      do { \
-+              if (! (prop = get_property((node), (propname)))) \
-+                      DO_ERR("Missing \"%s\" property in %s\n", (propname), \
-+                              (node)->fullpath); \
-+      } while (0);
-+
-+#define CHECK_HAVE_WARN(node, propname) \
-+      do { \
-+              if (! (prop  = get_property((node), (propname)))) \
-+                      WARNMSG("%s has no \"%s\" property\n", \
-+                              (node)->fullpath, (propname)); \
-+      } while (0)
-+
-+#define CHECK_HAVE_STRING(node, propname) \
-+      do { \
-+              CHECK_HAVE((node), (propname)); \
-+              if (prop && !data_is_one_string(prop->val)) \
-+                      DO_ERR("\"%s\" property in %s is not a string\n", \
-+                              (propname), (node)->fullpath); \
-+      } while (0)
-+
-+#define CHECK_HAVE_STREQ(node, propname, value) \
-+      do { \
-+              CHECK_HAVE_STRING((node), (propname)); \
-+              if (prop && !streq(prop->val.val, (value))) \
-+                      DO_ERR("%s has wrong %s, %s (should be %s\n", \
-+                              (node)->fullpath, (propname), \
-+                              prop->val.val, (value)); \
-+      } while (0)
-+
-+#define CHECK_HAVE_ONECELL(node, propname) \
-+      do { \
-+              CHECK_HAVE((node), (propname)); \
-+              if (prop && (prop->val.len != sizeof(cell_t))) \
-+                      DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
-+      } while (0)
-+
-+#define CHECK_HAVE_WARN_ONECELL(node, propname) \
-+      do { \
-+              CHECK_HAVE_WARN((node), (propname)); \
-+              if (prop && (prop->val.len != sizeof(cell_t))) \
-+                      DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
-+      } while (0)
-+
-+#define CHECK_HAVE_WARN_PHANDLE(xnode, propname, root) \
-+      do { \
-+              struct node *ref; \
-+              CHECK_HAVE_WARN_ONECELL((xnode), (propname)); \
-+              if (prop) {\
-+                      cell_t phandle = propval_cell(prop); \
-+                      if ((phandle == 0) || (phandle == -1)) { \
-+                              DO_ERR("\"%s\" property in %s contains an invalid phandle %x\n", (propname), (xnode)->fullpath, phandle); \
-+                      } else { \
-+                              ref = get_node_by_phandle((root), propval_cell(prop)); \
-+                              if (! ref) \
-+                                      DO_ERR("\"%s\" property in %s refers to non-existant phandle %x\n", (propname), (xnode)->fullpath, propval_cell(prop)); \
-+                      } \
-+              } \
-+      } while (0)
-+
-+#define CHECK_HAVE_WARN_STRING(node, propname) \
-+      do { \
-+              CHECK_HAVE_WARN((node), (propname)); \
-+              if (prop && !data_is_one_string(prop->val)) \
-+                      DO_ERR("\"%s\" property in %s is not a string\n", \
-+                              (propname), (node)->fullpath); \
-+      } while (0)
-+
-+static int check_root(struct node *root)
-+{
-+      struct property *prop;
-+      int ok = 1;
-+
-+      CHECK_HAVE_STRING(root, "model");
-+      CHECK_HAVE_WARN(root, "compatible");
-+
-+      return ok;
-+}
-+
-+static int check_cpus(struct node *root, int outversion, int boot_cpuid_phys)
-+{
-+      struct node *cpus, *cpu;
-+      struct property *prop;
-+      struct node *bootcpu = NULL;
-+      int ok = 1;
-+
-+      cpus = get_subnode(root, "cpus");
-+      if (! cpus) {
-+              ERRMSG("Missing /cpus node\n");
-+              return 0;
-+      }
-+
-+      if (cpus->addr_cells != 1)
-+              DO_ERR("%s has bad #address-cells value %d (should be 1)\n",
-+                     cpus->fullpath, cpus->addr_cells);
-+      if (cpus->size_cells != 0)
-+              DO_ERR("%s has bad #size-cells value %d (should be 0)\n",
-+                     cpus->fullpath, cpus->size_cells);
-+
-+      for_each_child(cpus, cpu) {
-+              CHECK_HAVE_STREQ(cpu, "device_type", "cpu");
-+
-+              CHECK_HAVE_ONECELL(cpu, "reg");
-+              if (prop) {
-+                      cell_t unitnum;
-+                      char *eptr;
-+
-+                      unitnum = strtol(get_unitname(cpu), &eptr, 16);
-+                      if (*eptr) {
-+                              WARNMSG("%s has bad format unit name %s (should be CPU number\n",
-+                                      cpu->fullpath, get_unitname(cpu));
-+                      } else if (unitnum != propval_cell(prop)) {
-+                              WARNMSG("%s unit name \"%s\" does not match \"reg\" property <%x>\n",
-+                                     cpu->fullpath, get_unitname(cpu),
-+                                     propval_cell(prop));
-+                      }
-+              }
-+
-+/*            CHECK_HAVE_ONECELL(cpu, "d-cache-line-size"); */
-+/*            CHECK_HAVE_ONECELL(cpu, "i-cache-line-size"); */
-+              CHECK_HAVE_ONECELL(cpu, "d-cache-size");
-+              CHECK_HAVE_ONECELL(cpu, "i-cache-size");
-+
-+              CHECK_HAVE_WARN_ONECELL(cpu, "clock-frequency");
-+              CHECK_HAVE_WARN_ONECELL(cpu, "timebase-frequency");
-+
-+              prop = get_property(cpu, "linux,boot-cpu");
-+              if (prop) {
-+                      if (prop->val.len)
-+                              WARNMSG("\"linux,boot-cpu\" property in %s is non-empty\n",
-+                                      cpu->fullpath);
-+                      if (bootcpu)
-+                              DO_ERR("Multiple boot cpus (%s and %s)\n",
-+                                     bootcpu->fullpath, cpu->fullpath);
-+                      else
-+                              bootcpu = cpu;
-+              }
-+      }
-+
-+      if (outversion < 2) {
-+              if (! bootcpu)
-+                      WARNMSG("No cpu has \"linux,boot-cpu\" property\n");
-+      } else {
-+              if (bootcpu)
-+                      WARNMSG("\"linux,boot-cpu\" property is deprecated in blob version 2 or higher\n");
-+              if (boot_cpuid_phys == 0xfeedbeef)
-+                      WARNMSG("physical boot CPU not set.  Use -b option to set\n");
-+      }
-+
-+      return ok;
-+}
-+
-+static int check_memory(struct node *root)
-+{
-+      struct node *mem;
-+      struct property *prop;
-+      int nnodes = 0;
-+      int ok = 1;
-+
-+      for_each_child(root, mem) {
-+              if (! strneq(mem->name, "memory", mem->basenamelen))
-+                      continue;
-+
-+              nnodes++;
-+
-+              CHECK_HAVE_STREQ(mem, "device_type", "memory");
-+              CHECK_HAVE(mem, "reg");
-+      }
-+
-+      if (nnodes == 0) {
-+              ERRMSG("No memory nodes\n");
-+              return 0;
-+      }
-+
-+      return ok;
-+}
-+
-+int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys)
-+{
-+      int ok = 1;
-+
-+      ok = ok && check_root(dt);
-+      ok = ok && check_cpus(dt, outversion, boot_cpuid_phys);
-+      ok = ok && check_memory(dt);
-+      if (! ok)
-+              return 0;
-+
-+      return 1;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/data.c
-@@ -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;
-+      }
-+
-+      assert(!d.val || d.asize);
-+
-+      if (d.val)
-+              free(d.val);
-+}
-+
-+struct data data_grow_for(struct data d, int xlen)
-+{
-+      struct data nd;
-+      int newsize;
-+
-+      /* we must start with an allocated datum */
-+      assert(!d.val || d.asize);
-+
-+      if (xlen == 0)
-+              return d;
-+
-+      nd = d;
-+
-+      newsize = xlen;
-+
-+      while ((d.len + xlen) > newsize)
-+              newsize *= 2;
-+
-+      nd.asize = newsize;
-+      nd.val = xrealloc(d.val, newsize);
-+
-+      assert(nd.asize >= (d.len + xlen));
-+
-+      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';
-+      x[0] = s[(*i)];
-+      if (x[0]) {
-+              x[1] = s[(*i)+1];
-+              if (x[1])
-+                      x[2] = s[(*i)+2];
-+      }
-+
-+      val = strtol(x, &endx, 8);
-+      if ((endx - x) == 0)
-+              fprintf(stderr, "Empty \\nnn escape\n");
-+
-+      (*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';
-+      x[0] = s[(*i)];
-+      if (x[0])
-+              x[1] = s[(*i)+1];
-+
-+      val = strtol(x, &endx, 16);
-+      if ((endx - x) == 0)
-+              fprintf(stderr, "Empty \\x escape\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 len)
-+{
-+      struct data d;
-+
-+      d = data_grow_for(empty_data, len);
-+
-+      d.len = len;
-+      fread(d.val, len, 1, f);
-+
-+      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_be32(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_be64(re->address);
-+      bere.size = cpu_to_be64(re->size);
-+
-+      return data_append_data(d, &bere, sizeof(bere));
-+}
-+
-+struct data data_append_addr(struct data d, u64 addr)
-+{
-+      u64 beaddr = cpu_to_be64(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;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-lexer.l
-@@ -0,0 +1,328 @@
-+/*
-+ * (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_]*
-+
-+%{
-+#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); \
-+                      }
-+%}
-+
-+%%
-+<*>"/include/"                BEGIN(INCLUDE);
-+
-+<INCLUDE>\"[^"\n]*\"  {
-+                      yytext[strlen(yytext) - 1] = 0;
-+                      if (!push_input_file(yytext + 1)) {
-+                              /* Some unrecoverable error.*/
-+                              exit(1);
-+                      }
-+                      BEGIN_DEFAULT();
-+              }
-+
-+
-+<*><<EOF>>            {
-+                      if (!pop_input_file()) {
-+                              yyterminate();
-+                      }
-+              }
-+
-+<*>\"([^\\"]|\\.)*\"  {
-+                      yylloc.filenum = srcpos_filenum;
-+                      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.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Keyword: /dts-v1/\n");
-+                      dts_version = 1;
-+                      BEGIN_DEFAULT();
-+                      return DT_V1;
-+              }
-+
-+<*>"/memreserve/"     {
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Keyword: /memreserve/\n");
-+                      BEGIN_DEFAULT();
-+                      return DT_MEMRESERVE;
-+              }
-+
-+<*>{LABEL}:   {
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Label: %s\n", yytext);
-+                      yylval.labelref = strdup(yytext);
-+                      yylval.labelref[yyleng-1] = '\0';
-+                      return DT_LABEL;
-+              }
-+
-+<INITIAL>[bodh]# {
-+                      yylloc.filenum = srcpos_filenum;
-+                      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.filenum = srcpos_filenum;
-+                      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.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      yylval.literal = strdup(yytext);
-+                      DPRINT("Literal: '%s'\n", yylval.literal);
-+                      return DT_LITERAL;
-+              }
-+
-+\&{LABEL}     {       /* label reference */
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Ref: %s\n", yytext+1);
-+                      yylval.labelref = strdup(yytext+1);
-+                      return DT_REF;
-+              }
-+
-+"&{/"{PATHCHAR}+\}    {       /* new-style path reference */
-+                      yylloc.filenum = srcpos_filenum;
-+                      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.filenum = srcpos_filenum;
-+                      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.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      yylval.byte = strtol(yytext, NULL, 16);
-+                      DPRINT("Byte: %02x\n", (int)yylval.byte);
-+                      return DT_BYTE;
-+              }
-+
-+<BYTESTRING>"]"       {
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("/BYTESTRING\n");
-+                      BEGIN_DEFAULT();
-+                      return ']';
-+              }
-+
-+<PROPNODENAME>{PROPNODECHAR}+ {
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("PropNodeName: %s\n", yytext);
-+                      yylval.propnodename = strdup(yytext);
-+                      BEGIN_DEFAULT();
-+                      return DT_PROPNODENAME;
-+              }
-+
-+
-+<*>[[:space:]]+       /* eat whitespace */
-+
-+<*>"/*"([^*]|\*+[^*/])*\*+"/" {
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Comment: %s\n", yytext);
-+                      /* eat comments */
-+              }
-+
-+<*>"//".*\n   /* eat line comments */
-+
-+<*>.          {
-+                      yylloc.filenum = srcpos_filenum;
-+                      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 {
-+      int filenum;
-+      FILE *file;
-+      YY_BUFFER_STATE yy_prev_buf;
-+      int yy_prev_lineno;
-+      struct incl_file *prev;
-+};
-+
-+struct incl_file *incl_file_stack;
-+
-+
-+/*
-+ * Detect infinite include recursion.
-+ */
-+#define MAX_INCLUDE_DEPTH     (100)
-+
-+static int incl_depth = 0;
-+
-+
-+int push_input_file(const char *filename)
-+{
-+      FILE *f;
-+      struct incl_file *incl_file;
-+
-+      if (!filename) {
-+              yyerror("No include file name given.");
-+              return 0;
-+      }
-+
-+      if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
-+              yyerror("Includes nested too deeply");
-+              return 0;
-+      }
-+
-+      f = dtc_open_file(filename);
-+
-+      incl_file = malloc(sizeof(struct incl_file));
-+      if (!incl_file) {
-+              yyerror("Can not allocate include file space.");
-+              return 0;
-+      }
-+
-+      /*
-+       * Save current context.
-+       */
-+      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
-+      incl_file->yy_prev_lineno = yylineno;
-+      incl_file->filenum = srcpos_filenum;
-+      incl_file->file = yyin;
-+      incl_file->prev = incl_file_stack;
-+
-+      incl_file_stack = incl_file;
-+
-+      /*
-+       * Establish new context.
-+       */
-+      srcpos_filenum = lookup_file_name(filename, 0);
-+      yylineno = 1;
-+      yyin = f;
-+      yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-+
-+      return 1;
-+}
-+
-+
-+int pop_input_file(void)
-+{
-+      struct incl_file *incl_file;
-+
-+      if (incl_file_stack == 0)
-+              return 0;
-+
-+      fclose(yyin);
-+
-+      /*
-+       * 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_filenum = incl_file->filenum;
-+      yyin = incl_file->file;
-+
-+      /*
-+       * Free old state.
-+       */
-+      free(incl_file);
-+
-+      if (YY_CURRENT_BUFFER == 0)
-+              return 0;
-+
-+      return 1;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped
-@@ -0,0 +1,2174 @@
-+#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 33
-+#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 __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 */
-+
-+#if __STDC__
-+
-+#define YY_USE_CONST
-+
-+#endif        /* __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).
-+ */
-+
-+#ifndef YY_TYPEDEF_YY_SIZE_T
-+#define YY_TYPEDEF_YY_SIZE_T
-+typedef unsigned int 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() 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[94] =
-+    {   0,
-+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-+       21,   19,   16,   16,   19,   19,   19,    8,    8,   19,
-+        8,   19,   19,   19,   19,   14,   15,   15,   19,    9,
-+        9,   16,    0,    3,    0,    0,   10,    0,    0,    0,
-+        0,    0,    0,    8,    8,    6,    0,    7,    0,    2,
-+        0,   13,   13,   15,   15,    9,    0,   12,   10,    0,
-+        0,    0,    0,   18,    0,    0,    0,    2,    9,    0,
-+       17,    0,    0,    0,   11,    0,    0,    0,    0,    0,
-+        0,    0,    0,    0,    4,    0,    0,    1,    0,    0,
-+        0,    5,    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[107] =
-+    {   0,
-+        0,    0,   32,    0,   53,    0,   76,    0,  108,  111,
-+      280,  288,   37,   39,   33,   36,  106,    0,  123,  146,
-+      255,  251,   45,    0,  159,  288,    0,   53,  108,  172,
-+      114,  127,  158,  288,  245,    0,    0,  234,  235,  236,
-+      197,  195,  199,    0,    0,  288,    0,  288,  160,  288,
-+      183,  288,    0,    0,  183,  182,    0,    0,    0,    0,
-+      204,  189,  207,  288,  179,  187,  180,  194,    0,  171,
-+      288,  196,  178,  174,  288,  169,  169,  177,  165,  153,
-+      143,  155,  137,  118,  288,  122,   42,  288,   36,   36,
-+       40,  288,  288,  212,  218,  223,  229,  234,  239,  245,
-+
-+      251,  255,  262,  270,  275,  280
-+    } ;
-+
-+static yyconst flex_int16_t yy_def[107] =
-+    {   0,
-+       93,    1,    1,    3,    3,    5,   93,    7,    3,    3,
-+       93,   93,   93,   93,   94,   95,   93,   96,   93,   19,
-+       19,   20,   97,   98,   20,   93,   99,  100,   95,   93,
-+       93,   93,   94,   93,   94,  101,  102,   93,  103,  104,
-+       93,   93,   93,   96,   19,   93,   20,   93,   97,   93,
-+       97,   93,   20,   99,  100,   93,  105,  101,  102,  106,
-+      103,  103,  104,   93,   93,   93,   93,   94,  105,  106,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,    0,   93,   93,   93,   93,   93,   93,   93,
-+
-+       93,   93,   93,   93,   93,   93
-+    } ;
-+
-+static yyconst flex_int16_t yy_nxt[324] =
-+    {   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,   23,   34,   12,   32,   32,
-+       32,   32,   12,   12,   12,   36,   20,   33,   50,   92,
-+       35,   20,   20,   20,   20,   20,   15,   54,   91,   54,
-+       54,   54,   51,   24,   24,   24,   46,   25,   90,   38,
-+       89,   26,   25,   25,   25,   25,   12,   13,   14,   15,
-+       27,   12,   27,   27,   27,   17,   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,   15,   39,   29,   15,   40,   29,   93,   30,   31,
-+       31,   30,   31,   31,   56,   56,   56,   41,   32,   32,
-+       42,   88,   43,   45,   45,   45,   46,   45,   47,   47,
-+       87,   38,   45,   45,   45,   45,   47,   47,   47,   47,
-+       47,   47,   47,   47,   47,   47,   47,   47,   47,   86,
-+       47,   34,   33,   50,   85,   47,   47,   47,   47,   53,
-+       53,   53,   84,   53,   83,   35,   82,   51,   53,   53,
-+       53,   53,   56,   56,   56,   93,   68,   54,   57,   54,
-+       54,   54,   56,   56,   56,   62,   46,   34,   71,   81,
-+
-+       80,   79,   78,   77,   76,   75,   74,   73,   72,   64,
-+       62,   35,   33,   33,   33,   33,   33,   33,   33,   33,
-+       37,   67,   66,   37,   37,   37,   44,   65,   44,   49,
-+       49,   49,   49,   49,   49,   49,   49,   52,   64,   52,
-+       54,   62,   54,   60,   54,   54,   55,   93,   55,   55,
-+       55,   55,   58,   58,   58,   48,   58,   58,   59,   48,
-+       59,   59,   61,   61,   61,   61,   61,   61,   61,   61,
-+       63,   63,   63,   63,   63,   63,   63,   63,   69,   93,
-+       69,   70,   70,   70,   93,   70,   70,   11,   93,   93,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,   93
-+    } ;
-+
-+static yyconst flex_int16_t yy_chk[324] =
-+    {   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,   15,    3,   13,   13,
-+       14,   14,    3,    3,    3,   16,    3,   23,   23,   91,
-+       15,    3,    3,    3,    3,    3,    5,   28,   90,   28,
-+       28,   28,   23,    5,    5,    5,   28,    5,   89,   16,
-+       87,    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,   17,    9,   10,   17,   10,   29,    9,    9,
-+        9,   10,   10,   10,   31,   31,   31,   17,   32,   32,
-+       17,   86,   17,   19,   19,   19,   19,   19,   19,   19,
-+       84,   29,   19,   19,   19,   19,   19,   19,   19,   19,
-+       19,   19,   19,   19,   19,   19,   20,   20,   20,   83,
-+       20,   33,   49,   49,   82,   20,   20,   20,   20,   25,
-+       25,   25,   81,   25,   80,   33,   79,   49,   25,   25,
-+       25,   25,   30,   30,   30,   51,   51,   55,   30,   55,
-+       55,   55,   56,   56,   56,   62,   55,   68,   62,   78,
-+
-+       77,   76,   74,   73,   72,   70,   67,   66,   65,   63,
-+       61,   68,   94,   94,   94,   94,   94,   94,   94,   94,
-+       95,   43,   42,   95,   95,   95,   96,   41,   96,   97,
-+       97,   97,   97,   97,   97,   97,   97,   98,   40,   98,
-+       99,   39,   99,   38,   99,   99,  100,   35,  100,  100,
-+      100,  100,  101,  101,  101,   22,  101,  101,  102,   21,
-+      102,  102,  103,  103,  103,  103,  103,  103,  103,  103,
-+      104,  104,  104,  104,  104,  104,  104,  104,  105,   11,
-+      105,  106,  106,  106,    0,  106,  106,   93,   93,   93,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-+       93,   93,   93
-+    } ;
-+
-+/* Table of booleans, true if rule could match eol. */
-+static yyconst flex_int32_t yy_rule_can_match_eol[21] =
-+    {   0,
-+0, 0, 1, 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 33 "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); \
-+                      }
-+#line 627 "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 (void) 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 = '*'; \
-+              size_t 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 57 "dtc-lexer.l"
-+
-+#line 784 "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 >= 94 )
-+                                      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] != 288 );
-+
-+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:
-+YY_RULE_SETUP
-+#line 58 "dtc-lexer.l"
-+BEGIN(INCLUDE);
-+      YY_BREAK
-+case 2:
-+YY_RULE_SETUP
-+#line 60 "dtc-lexer.l"
-+{
-+                      yytext[strlen(yytext) - 1] = 0;
-+                      if (!push_input_file(yytext + 1)) {
-+                              /* Some unrecoverable error.*/
-+                              exit(1);
-+                      }
-+                      BEGIN_DEFAULT();
-+              }
-+      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 70 "dtc-lexer.l"
-+{
-+                      if (!pop_input_file()) {
-+                              yyterminate();
-+                      }
-+              }
-+      YY_BREAK
-+case 3:
-+/* rule 3 can match eol */
-+YY_RULE_SETUP
-+#line 76 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      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 4:
-+YY_RULE_SETUP
-+#line 86 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Keyword: /dts-v1/\n");
-+                      dts_version = 1;
-+                      BEGIN_DEFAULT();
-+                      return DT_V1;
-+              }
-+      YY_BREAK
-+case 5:
-+YY_RULE_SETUP
-+#line 95 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Keyword: /memreserve/\n");
-+                      BEGIN_DEFAULT();
-+                      return DT_MEMRESERVE;
-+              }
-+      YY_BREAK
-+case 6:
-+YY_RULE_SETUP
-+#line 103 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Label: %s\n", yytext);
-+                      yylval.labelref = strdup(yytext);
-+                      yylval.labelref[yyleng-1] = '\0';
-+                      return DT_LABEL;
-+              }
-+      YY_BREAK
-+case 7:
-+YY_RULE_SETUP
-+#line 112 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      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 8:
-+YY_RULE_SETUP
-+#line 127 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      yylval.literal = strdup(yytext);
-+                      DPRINT("Literal: '%s'\n", yylval.literal);
-+                      return DT_LEGACYLITERAL;
-+              }
-+      YY_BREAK
-+case 9:
-+YY_RULE_SETUP
-+#line 135 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      yylval.literal = strdup(yytext);
-+                      DPRINT("Literal: '%s'\n", yylval.literal);
-+                      return DT_LITERAL;
-+              }
-+      YY_BREAK
-+case 10:
-+YY_RULE_SETUP
-+#line 143 "dtc-lexer.l"
-+{     /* label reference */
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Ref: %s\n", yytext+1);
-+                      yylval.labelref = strdup(yytext+1);
-+                      return DT_REF;
-+              }
-+      YY_BREAK
-+case 11:
-+YY_RULE_SETUP
-+#line 151 "dtc-lexer.l"
-+{     /* new-style path reference */
-+                      yylloc.filenum = srcpos_filenum;
-+                      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 12:
-+YY_RULE_SETUP
-+#line 160 "dtc-lexer.l"
-+{     /* old-style path reference */
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Ref: %s\n", yytext+1);
-+                      yylval.labelref = strdup(yytext+1);
-+                      return DT_REF;
-+              }
-+      YY_BREAK
-+case 13:
-+YY_RULE_SETUP
-+#line 168 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      yylval.byte = strtol(yytext, NULL, 16);
-+                      DPRINT("Byte: %02x\n", (int)yylval.byte);
-+                      return DT_BYTE;
-+              }
-+      YY_BREAK
-+case 14:
-+YY_RULE_SETUP
-+#line 176 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("/BYTESTRING\n");
-+                      BEGIN_DEFAULT();
-+                      return ']';
-+              }
-+      YY_BREAK
-+case 15:
-+YY_RULE_SETUP
-+#line 184 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("PropNodeName: %s\n", yytext);
-+                      yylval.propnodename = strdup(yytext);
-+                      BEGIN_DEFAULT();
-+                      return DT_PROPNODENAME;
-+              }
-+      YY_BREAK
-+case 16:
-+/* rule 16 can match eol */
-+YY_RULE_SETUP
-+#line 194 "dtc-lexer.l"
-+/* eat whitespace */
-+      YY_BREAK
-+case 17:
-+/* rule 17 can match eol */
-+YY_RULE_SETUP
-+#line 196 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      yylloc.first_line = yylineno;
-+                      DPRINT("Comment: %s\n", yytext);
-+                      /* eat comments */
-+              }
-+      YY_BREAK
-+case 18:
-+/* rule 18 can match eol */
-+YY_RULE_SETUP
-+#line 203 "dtc-lexer.l"
-+/* eat line comments */
-+      YY_BREAK
-+case 19:
-+YY_RULE_SETUP
-+#line 205 "dtc-lexer.l"
-+{
-+                      yylloc.filenum = srcpos_filenum;
-+                      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 1111 "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;
-+
-+      (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 >= 94 )
-+                              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 >= 94 )
-+                      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 == 93);
-+
-+      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*)
-+                                                              );
-+              
-+              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*)
-+                                                              );
-+
-+              /* 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 {
-+      int filenum;
-+      FILE *file;
-+      YY_BUFFER_STATE yy_prev_buf;
-+      int yy_prev_lineno;
-+      struct incl_file *prev;
-+};
-+
-+struct incl_file *incl_file_stack;
-+
-+
-+/*
-+ * Detect infinite include recursion.
-+ */
-+#define MAX_INCLUDE_DEPTH     (100)
-+
-+static int incl_depth = 0;
-+
-+
-+int push_input_file(const char *filename)
-+{
-+      FILE *f;
-+      struct incl_file *incl_file;
-+
-+      if (!filename) {
-+              yyerror("No include file name given.");
-+              return 0;
-+      }
-+
-+      if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
-+              yyerror("Includes nested too deeply");
-+              return 0;
-+      }
-+
-+      f = dtc_open_file(filename);
-+
-+      incl_file = malloc(sizeof(struct incl_file));
-+      if (!incl_file) {
-+              yyerror("Can not allocate include file space.");
-+              return 0;
-+      }
-+
-+      /*
-+       * Save current context.
-+       */
-+      incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
-+      incl_file->yy_prev_lineno = yylineno;
-+      incl_file->filenum = srcpos_filenum;
-+      incl_file->file = yyin;
-+      incl_file->prev = incl_file_stack;
-+
-+      incl_file_stack = incl_file;
-+
-+      /*
-+       * Establish new context.
-+       */
-+      srcpos_filenum = lookup_file_name(filename, 0);
-+      yylineno = 1;
-+      yyin = f;
-+      yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
-+
-+      return 1;
-+}
-+
-+
-+int pop_input_file(void)
-+{
-+      struct incl_file *incl_file;
-+
-+      if (incl_file_stack == 0)
-+              return 0;
-+
-+      fclose(yyin);
-+
-+      /*
-+       * 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_filenum = incl_file->filenum;
-+      yyin = incl_file->file;
-+
-+      /*
-+       * Free old state.
-+       */
-+      free(incl_file);
-+
-+      if (YY_CURRENT_BUFFER == 0)
-+              return 0;
-+
-+      return 1;
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped
-@@ -0,0 +1,1983 @@
-+/* 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
-+   };
-+#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
-+
-+
-+
-+
-+/* Copy the first part of user declarations.  */
-+#line 23 "dtc-parser.y"
-+
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+int yylex(void);
-+unsigned long long eval_literal(const char *s, int base, int bits);
-+
-+extern struct boot_info *the_boot_info;
-+
-+
-+
-+/* 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 34 "dtc-parser.y"
-+{
-+      char *propnodename;
-+      char *literal;
-+      char *labelref;
-+      unsigned int cbase;
-+      u8 byte;
-+      struct data data;
-+
-+      u64 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 148 "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 173 "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   60
-+
-+/* YYNTOKENS -- Number of terminals.  */
-+#define YYNTOKENS  24
-+/* YYNNTS -- Number of nonterminals.  */
-+#define YYNNTS  20
-+/* YYNRULES -- Number of rules.  */
-+#define YYNRULES  43
-+/* YYNRULES -- Number of states.  */
-+#define YYNSTATES  67
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-+#define YYUNDEFTOK  2
-+#define YYMAXUTOK   267
-+
-+#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,
-+       2,     2,     2,     2,    23,    14,     2,    15,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,    13,
-+      19,    18,    20,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,    21,     2,    22,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,    16,     2,    17,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-+       2,     2,     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
-+};
-+
-+#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,    80,    81,    84,    87,    88,    91,
-+      94,    97,    98,   100,   102,   105,   106,   109,   112,   113,
-+     116,   119,   123,   124
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-+static const yytype_int8 yyrhs[] =
-+{
-+      25,     0,    -1,     3,    13,    26,    31,    -1,    28,    31,
-+      -1,    -1,    27,    26,    -1,    43,     4,    30,    30,    13,
-+      -1,    -1,    29,    28,    -1,    27,    -1,    43,     4,    30,
-+      14,    30,    13,    -1,     6,    -1,     7,    -1,    15,    32,
-+      -1,    16,    33,    41,    17,    13,    -1,    -1,    33,    34,
-+      -1,    43,     5,    18,    35,    13,    -1,    43,     5,    13,
-+      -1,    36,    10,    -1,    36,    19,    37,    20,    -1,    36,
-+      21,    40,    22,    -1,    36,    12,    -1,    35,    11,    -1,
-+      -1,    35,    23,    -1,    36,    11,    -1,    -1,    37,    39,
-+      -1,    37,    12,    -1,    37,    11,    -1,    -1,     8,    -1,
-+       6,    -1,    38,     7,    -1,    -1,    40,     9,    -1,    40,
-+      11,    -1,    -1,    42,    41,    -1,    42,    34,    -1,    43,
-+       5,    32,    -1,    -1,    11,    -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-+static const yytype_uint16 yyrline[] =
-+{
-+       0,    85,    85,    89,    97,   100,   107,   115,   118,   125,
-+     129,   136,   140,   147,   154,   162,   165,   172,   176,   183,
-+     187,   191,   195,   199,   207,   210,   214,   222,   225,   229,
-+     234,   242,   245,   249,   253,   261,   264,   268,   276,   279,
-+     283,   291,   299,   302
-+};
-+#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", "';'", "'-'", "'/'", "'{'",
-+  "'}'", "'='", "'<'", "'>'", "'['", "']'", "','", "$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,    59,    45,    47,   123,   125,    61,    60,
-+      62,    91,    93,    44
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-+static const yytype_uint8 yyr1[] =
-+{
-+       0,    24,    25,    25,    26,    26,    27,    28,    28,    29,
-+      29,    30,    30,    31,    32,    33,    33,    34,    34,    35,
-+      35,    35,    35,    35,    36,    36,    36,    37,    37,    37,
-+      37,    38,    38,    39,    39,    40,    40,    40,    41,    41,
-+      41,    42,    43,    43
-+};
-+
-+/* 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,     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,    43,     0,     9,     0,     7,     0,     4,     1,
-+       0,     3,     8,     0,     0,     4,     0,    15,    13,    11,
-+      12,     0,     2,     5,     0,    38,     0,     0,     0,    16,
-+       0,    38,     0,     0,     6,     0,    40,    39,     0,    10,
-+      14,    18,    24,    41,     0,     0,    23,    17,    25,    19,
-+      26,    22,    27,    35,    31,     0,    33,    32,    30,    29,
-+      20,     0,    28,    36,    37,    21,    34
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM].  */
-+static const yytype_int8 yydefgoto[] =
-+{
-+      -1,     3,    14,     4,     5,     6,    27,    11,    18,    25,
-+      29,    44,    45,    54,    61,    62,    55,    30,    31,     7
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+   STATE-NUM.  */
-+#define YYPACT_NINF -13
-+static const yytype_int8 yypact[] =
-+{
-+      23,    11,   -13,    37,   -13,    -4,    18,    39,    18,   -13,
-+      28,   -13,   -13,    34,    -4,    18,    41,   -13,   -13,   -13,
-+     -13,    25,   -13,   -13,    34,    -3,    34,    33,    34,   -13,
-+      30,    -3,    43,    36,   -13,    38,   -13,   -13,    20,   -13,
-+     -13,   -13,   -13,   -13,     2,     9,   -13,   -13,   -13,   -13,
-+     -13,   -13,   -13,   -13,    -2,    -6,   -13,   -13,   -13,   -13,
-+     -13,    45,   -13,   -13,   -13,   -13,   -13
-+};
-+
-+/* YYPGOTO[NTERM-NUM].  */
-+static const yytype_int8 yypgoto[] =
-+{
-+     -13,   -13,    35,    27,    47,   -13,   -12,    40,    17,   -13,
-+      26,   -13,   -13,   -13,   -13,   -13,   -13,    29,   -13,    -8
-+};
-+
-+/* 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 -43
-+static const yytype_int8 yytable[] =
-+{
-+      16,    21,   -42,    63,    56,    64,    57,    16,     2,    58,
-+      59,    10,    28,    46,    33,    47,    65,    32,    60,    49,
-+      50,    51,   -42,    32,     8,    48,     1,   -42,    52,     2,
-+      53,    19,    20,    41,     2,    15,    17,     9,    42,    26,
-+      19,    20,    15,    13,    17,    24,    34,    35,    38,    39,
-+      23,    40,    66,    12,    22,    43,     0,    36,     0,     0,
-+      37
-+};
-+
-+static const yytype_int8 yycheck[] =
-+{
-+       8,    13,     5,     9,     6,    11,     8,    15,    11,    11,
-+      12,    15,    24,    11,    26,    13,    22,    25,    20,    10,
-+      11,    12,     4,    31,    13,    23,     3,     4,    19,    11,
-+      21,     6,     7,    13,    11,     8,    16,     0,    18,    14,
-+       6,     7,    15,     4,    16,     4,    13,    17,     5,    13,
-+      15,    13,     7,     6,    14,    38,    -1,    31,    -1,    -1,
-+      31
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+   symbol of state STATE-NUM.  */
-+static const yytype_uint8 yystos[] =
-+{
-+       0,     3,    11,    25,    27,    28,    29,    43,    13,     0,
-+      15,    31,    28,     4,    26,    27,    43,    16,    32,     6,
-+       7,    30,    31,    26,     4,    33,    14,    30,    30,    34,
-+      41,    42,    43,    30,    13,    17,    34,    41,     5,    13,
-+      13,    13,    18,    32,    35,    36,    11,    13,    23,    10,
-+      11,    12,    19,    21,    37,    40,     6,     8,    11,    12,
-+      20,    38,    39,     9,    11,    22,     7
-+};
-+
-+#define yyerrok               (yyerrstatus = 0)
-+#define yyclearin     (yychar = YYEMPTY)
-+#define YYEMPTY               (-2)
-+#define YYEOF         0
-+
-+#define YYACCEPT      goto yyacceptlab
-+#define YYABORT               goto yyabortlab
-+#define YYERROR               goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror.  This remains here temporarily
-+   to ease the transition to the new meaning of YYERROR, for GCC.
-+   Once GCC version 2 has supplanted version 1, this can go.  */
-+
-+#define YYFAIL                goto yyerrlab
-+
-+#define YYRECOVERING()  (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value)                                        \
-+do                                                            \
-+  if (yychar == YYEMPTY && yylen == 1)                                \
-+    {                                                         \
-+      yychar = (Token);                                               \
-+      yylval = (Value);                                               \
-+      yytoken = YYTRANSLATE (yychar);                         \
-+      YYPOPSTACK (1);                                         \
-+      goto yybackup;                                          \
-+    }                                                         \
-+  else                                                                \
-+    {                                                         \
-+      yyerror (YY_("syntax error: cannot back up")); \
-+      YYERROR;                                                        \
-+    }                                                         \
-+while (YYID (0))
-+
-+
-+#define YYTERROR      1
-+#define YYERRCODE     256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+   If N is 0, then set CURRENT to the empty location which ends
-+   the previous symbol: RHS[0] (always defined).  */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N)                              \
-+    do                                                                        \
-+      if (YYID (N))                                                    \
-+      {                                                               \
-+        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
-+        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
-+        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
-+        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
-+      }                                                               \
-+      else                                                            \
-+      {                                                               \
-+        (Current).first_line   = (Current).last_line   =              \
-+          YYRHSLOC (Rhs, 0).last_line;                                \
-+        (Current).first_column = (Current).last_column =              \
-+          YYRHSLOC (Rhs, 0).last_column;                              \
-+      }                                                               \
-+    while (YYID (0))
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+   This macro was not mandated originally: define only if we know
-+   we won't break user code: when these are the locations we know.  */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+#  define YY_LOCATION_PRINT(File, Loc)                        \
-+     fprintf (File, "%d.%d-%d.%d",                    \
-+            (Loc).first_line, (Loc).first_column,     \
-+            (Loc).last_line,  (Loc).last_column)
-+# else
-+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments.  */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (YYLEX_PARAM)
-+#else
-+# define YYLEX yylex ()
-+#endif
-+
-+/* Enable debugging if requested.  */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-+#  define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args)                      \
-+do {                                          \
-+  if (yydebug)                                        \
-+    YYFPRINTF Args;                           \
-+} while (YYID (0))
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
-+do {                                                                    \
-+  if (yydebug)                                                                  \
-+    {                                                                   \
-+      YYFPRINTF (stderr, "%s ", Title);                                         \
-+      yy_symbol_print (stderr,                                                  \
-+                Type, Value, Location); \
-+      YYFPRINTF (stderr, "\n");                                                 \
-+    }                                                                   \
-+} while (YYID (0))
-+
-+
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT.  |
-+`--------------------------------*/
-+
-+/*ARGSUSED*/
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-+#else
-+static void
-+yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
-+    FILE *yyoutput;
-+    int yytype;
-+    YYSTYPE const * const yyvaluep;
-+    YYLTYPE const * const yylocationp;
-+#endif
-+{
-+  if (!yyvaluep)
-+    return;
-+  YYUSE (yylocationp);
-+# ifdef YYPRINT
-+  if (yytype < YYNTOKENS)
-+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# else
-+  YYUSE (yyoutput);
-+# endif
-+  switch (yytype)
-+    {
-+      default:
-+      break;
-+    }
-+}
-+
-+
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT.  |
-+`--------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-+#else
-+static void
-+yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
-+    FILE *yyoutput;
-+    int yytype;
-+    YYSTYPE const * const yyvaluep;
-+    YYLTYPE const * const yylocationp;
-+#endif
-+{
-+  if (yytype < YYNTOKENS)
-+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+  else
-+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+  YY_LOCATION_PRINT (yyoutput, *yylocationp);
-+  YYFPRINTF (yyoutput, ": ");
-+  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
-+  YYFPRINTF (yyoutput, ")");
-+}
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included).                                                   |
-+`------------------------------------------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+    yytype_int16 *bottom;
-+    yytype_int16 *top;
-+#endif
-+{
-+  YYFPRINTF (stderr, "Stack now");
-+  for (; bottom <= top; ++bottom)
-+    YYFPRINTF (stderr, " %d", *bottom);
-+  YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top)                          \
-+do {                                                          \
-+  if (yydebug)                                                        \
-+    yy_stack_print ((Bottom), (Top));                         \
-+} while (YYID (0))
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced.  |
-+`------------------------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyvsp, yylsp, yyrule)
-+    YYSTYPE *yyvsp;
-+    YYLTYPE *yylsp;
-+    int yyrule;
-+#endif
-+{
-+  int yynrhs = yyr2[yyrule];
-+  int yyi;
-+  unsigned long int yylno = yyrline[yyrule];
-+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-+           yyrule - 1, yylno);
-+  /* The symbols being reduced.  */
-+  for (yyi = 0; yyi < yynrhs; yyi++)
-+    {
-+      fprintf (stderr, "   $%d = ", yyi + 1);
-+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-+                     &(yyvsp[(yyi + 1) - (yynrhs)])
-+                     , &(yylsp[(yyi + 1) - (yynrhs)])                );
-+      fprintf (stderr, "\n");
-+    }
-+}
-+
-+# define YY_REDUCE_PRINT(Rule)                \
-+do {                                  \
-+  if (yydebug)                                \
-+    yy_reduce_print (yyvsp, yylsp, Rule); \
-+} while (YYID (0))
-+
-+/* Nonzero means print parse trace.  It is left uninitialized so that
-+   multiple parsers can coexist.  */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks.  */
-+#ifndef       YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+   if the built-in stack extension method is used).
-+
-+   Do not make this value too large; the results are undefined if
-+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+   evaluated with infinite-precision integer arithmetic.  */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+\f
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+#  if defined __GLIBC__ && defined _STRING_H
-+#   define yystrlen strlen
-+#  else
-+/* Return the length of YYSTR.  */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static YYSIZE_T
-+yystrlen (const char *yystr)
-+#else
-+static YYSIZE_T
-+yystrlen (yystr)
-+    const char *yystr;
-+#endif
-+{
-+  YYSIZE_T yylen;
-+  for (yylen = 0; yystr[yylen]; yylen++)
-+    continue;
-+  return yylen;
-+}
-+#  endif
-+# endif
-+
-+# ifndef yystpcpy
-+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-+#   define yystpcpy stpcpy
-+#  else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+   YYDEST.  */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static char *
-+yystpcpy (char *yydest, const char *yysrc)
-+#else
-+static char *
-+yystpcpy (yydest, yysrc)
-+    char *yydest;
-+    const char *yysrc;
-+#endif
-+{
-+  char *yyd = yydest;
-+  const char *yys = yysrc;
-+
-+  while ((*yyd++ = *yys++) != '\0')
-+    continue;
-+
-+  return yyd - 1;
-+}
-+#  endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+   quotes and backslashes, so that it's suitable for yyerror.  The
-+   heuristic is that double-quoting is unnecessary unless the string
-+   contains an apostrophe, a comma, or backslash (other than
-+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-+   null, do not copy; instead, return the length of what the result
-+   would have been.  */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+  if (*yystr == '"')
-+    {
-+      YYSIZE_T yyn = 0;
-+      char const *yyp = yystr;
-+
-+      for (;;)
-+      switch (*++yyp)
-+        {
-+        case '\'':
-+        case ',':
-+          goto do_not_strip_quotes;
-+
-+        case '\\':
-+          if (*++yyp != '\\')
-+            goto do_not_strip_quotes;
-+          /* Fall through.  */
-+        default:
-+          if (yyres)
-+            yyres[yyn] = *yyp;
-+          yyn++;
-+          break;
-+
-+        case '"':
-+          if (yyres)
-+            yyres[yyn] = '\0';
-+          return yyn;
-+        }
-+    do_not_strip_quotes: ;
-+    }
-+
-+  if (! yyres)
-+    return yystrlen (yystr);
-+
-+  return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+/* Copy into YYRESULT an error message about the unexpected token
-+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
-+   including the terminating null byte.  If YYRESULT is null, do not
-+   copy anything; just return the number of bytes that would be
-+   copied.  As a special case, return 0 if an ordinary "syntax error"
-+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
-+   size calculation.  */
-+static YYSIZE_T
-+yysyntax_error (char *yyresult, int yystate, int yychar)
-+{
-+  int yyn = yypact[yystate];
-+
-+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
-+    return 0;
-+  else
-+    {
-+      int yytype = YYTRANSLATE (yychar);
-+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+      YYSIZE_T yysize = yysize0;
-+      YYSIZE_T yysize1;
-+      int yysize_overflow = 0;
-+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+      int yyx;
-+
-+# if 0
-+      /* This is so xgettext sees the translatable formats that are
-+       constructed on the fly.  */
-+      YY_("syntax error, unexpected %s");
-+      YY_("syntax error, unexpected %s, expecting %s");
-+      YY_("syntax error, unexpected %s, expecting %s or %s");
-+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+# endif
-+      char *yyfmt;
-+      char const *yyf;
-+      static char const yyunexpected[] = "syntax error, unexpected %s";
-+      static char const yyexpecting[] = ", expecting %s";
-+      static char const yyor[] = " or %s";
-+      char yyformat[sizeof yyunexpected
-+                  + sizeof yyexpecting - 1
-+                  + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+                     * (sizeof yyor - 1))];
-+      char const *yyprefix = yyexpecting;
-+
-+      /* Start YYX at -YYN if negative to avoid negative indexes in
-+       YYCHECK.  */
-+      int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+      /* Stay within bounds of both yycheck and yytname.  */
-+      int yychecklim = YYLAST - yyn + 1;
-+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+      int yycount = 1;
-+
-+      yyarg[0] = yytname[yytype];
-+      yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+      if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+        {
-+          if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+            {
-+              yycount = 1;
-+              yysize = yysize0;
-+              yyformat[sizeof yyunexpected - 1] = '\0';
-+              break;
-+            }
-+          yyarg[yycount++] = yytname[yyx];
-+          yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+          yysize_overflow |= (yysize1 < yysize);
-+          yysize = yysize1;
-+          yyfmt = yystpcpy (yyfmt, yyprefix);
-+          yyprefix = yyor;
-+        }
-+
-+      yyf = YY_(yyformat);
-+      yysize1 = yysize + yystrlen (yyf);
-+      yysize_overflow |= (yysize1 < yysize);
-+      yysize = yysize1;
-+
-+      if (yysize_overflow)
-+      return YYSIZE_MAXIMUM;
-+
-+      if (yyresult)
-+      {
-+        /* Avoid sprintf, as that infringes on the user's name space.
-+           Don't have undefined behavior even if the translation
-+           produced a string with the wrong number of "%s"s.  */
-+        char *yyp = yyresult;
-+        int yyi = 0;
-+        while ((*yyp = *yyf) != '\0')
-+          {
-+            if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+              {
-+                yyp += yytnamerr (yyp, yyarg[yyi++]);
-+                yyf += 2;
-+              }
-+            else
-+              {
-+                yyp++;
-+                yyf++;
-+              }
-+          }
-+      }
-+      return yysize;
-+    }
-+}
-+#endif /* YYERROR_VERBOSE */
-+\f
-+
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol.  |
-+`-----------------------------------------------*/
-+
-+/*ARGSUSED*/
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep, yylocationp)
-+    const char *yymsg;
-+    int yytype;
-+    YYSTYPE *yyvaluep;
-+    YYLTYPE *yylocationp;
-+#endif
-+{
-+  YYUSE (yyvaluep);
-+  YYUSE (yylocationp);
-+
-+  if (!yymsg)
-+    yymsg = "Deleting";
-+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+  switch (yytype)
-+    {
-+
-+      default:
-+      break;
-+    }
-+}
-+\f
-+
-+/* Prevent warnings from -Wmissing-prototypes.  */
-+
-+#ifdef YYPARSE_PARAM
-+#if defined __STDC__ || defined __cplusplus
-+int yyparse (void *YYPARSE_PARAM);
-+#else
-+int yyparse ();
-+#endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined __STDC__ || defined __cplusplus
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+/* The look-ahead symbol.  */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol.  */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far.  */
-+int yynerrs;
-+/* Location data for the look-ahead symbol.  */
-+YYLTYPE yylloc;
-+
-+
-+
-+/*----------.
-+| yyparse.  |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+int
-+yyparse (void *YYPARSE_PARAM)
-+#else
-+int
-+yyparse (YYPARSE_PARAM)
-+    void *YYPARSE_PARAM;
-+#endif
-+#else /* ! YYPARSE_PARAM */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+     || defined __cplusplus || defined _MSC_VER)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+
-+#endif
-+#endif
-+{
-+  
-+  int yystate;
-+  int yyn;
-+  int yyresult;
-+  /* Number of tokens to shift before error messages enabled.  */
-+  int yyerrstatus;
-+  /* Look-ahead token as an internal (translated) token number.  */
-+  int yytoken = 0;
-+#if YYERROR_VERBOSE
-+  /* Buffer for error messages, and its allocated size.  */
-+  char yymsgbuf[128];
-+  char *yymsg = yymsgbuf;
-+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-+#endif
-+
-+  /* Three stacks and their tools:
-+     `yyss': related to states,
-+     `yyvs': related to semantic values,
-+     `yyls': related to locations.
-+
-+     Refer to the stacks thru separate pointers, to allow yyoverflow
-+     to reallocate them elsewhere.  */
-+
-+  /* The state stack.  */
-+  yytype_int16 yyssa[YYINITDEPTH];
-+  yytype_int16 *yyss = yyssa;
-+  yytype_int16 *yyssp;
-+
-+  /* The semantic value stack.  */
-+  YYSTYPE yyvsa[YYINITDEPTH];
-+  YYSTYPE *yyvs = yyvsa;
-+  YYSTYPE *yyvsp;
-+
-+  /* The location stack.  */
-+  YYLTYPE yylsa[YYINITDEPTH];
-+  YYLTYPE *yyls = yylsa;
-+  YYLTYPE *yylsp;
-+  /* The locations where the error started and ended.  */
-+  YYLTYPE yyerror_range[2];
-+
-+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
-+
-+  YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+  /* The variables used to return semantic value and location from the
-+     action routines.  */
-+  YYSTYPE yyval;
-+  YYLTYPE yyloc;
-+
-+  /* The number of symbols on the RHS of the reduced rule.
-+     Keep to zero when no symbol should be popped.  */
-+  int yylen = 0;
-+
-+  YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+  yystate = 0;
-+  yyerrstatus = 0;
-+  yynerrs = 0;
-+  yychar = YYEMPTY;           /* Cause a token to be read.  */
-+
-+  /* Initialize stack pointers.
-+     Waste one element of value and location stack
-+     so that they stay on the same level as the state stack.
-+     The wasted elements are never initialized.  */
-+
-+  yyssp = yyss;
-+  yyvsp = yyvs;
-+  yylsp = yyls;
-+#if YYLTYPE_IS_TRIVIAL
-+  /* Initialize the default location before parsing starts.  */
-+  yylloc.first_line   = yylloc.last_line   = 1;
-+  yylloc.first_column = yylloc.last_column = 0;
-+#endif
-+
-+  goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate.  |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+  /* In all cases, when you get here, the value and location stacks
-+     have just been pushed.  So pushing a state here evens the stacks.  */
-+  yyssp++;
-+
-+ yysetstate:
-+  *yyssp = yystate;
-+
-+  if (yyss + yystacksize - 1 <= yyssp)
-+    {
-+      /* Get the current used size of the three stacks, in elements.  */
-+      YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+      {
-+      /* Give user a chance to reallocate the stack.  Use copies of
-+         these so that the &'s don't force the real ones into
-+         memory.  */
-+      YYSTYPE *yyvs1 = yyvs;
-+      yytype_int16 *yyss1 = yyss;
-+      YYLTYPE *yyls1 = yyls;
-+
-+      /* Each stack pointer address is followed by the size of the
-+         data in use in that stack, in bytes.  This used to be a
-+         conditional around just the two extra args, but that might
-+         be undefined if yyoverflow is a macro.  */
-+      yyoverflow (YY_("memory exhausted"),
-+                  &yyss1, yysize * sizeof (*yyssp),
-+                  &yyvs1, yysize * sizeof (*yyvsp),
-+                  &yyls1, yysize * sizeof (*yylsp),
-+                  &yystacksize);
-+      yyls = yyls1;
-+      yyss = yyss1;
-+      yyvs = yyvs1;
-+      }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+      goto yyexhaustedlab;
-+# else
-+      /* Extend the stack our own way.  */
-+      if (YYMAXDEPTH <= yystacksize)
-+      goto yyexhaustedlab;
-+      yystacksize *= 2;
-+      if (YYMAXDEPTH < yystacksize)
-+      yystacksize = YYMAXDEPTH;
-+
-+      {
-+      yytype_int16 *yyss1 = yyss;
-+      union yyalloc *yyptr =
-+        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+      if (! yyptr)
-+        goto yyexhaustedlab;
-+      YYSTACK_RELOCATE (yyss);
-+      YYSTACK_RELOCATE (yyvs);
-+      YYSTACK_RELOCATE (yyls);
-+#  undef YYSTACK_RELOCATE
-+      if (yyss1 != yyssa)
-+        YYSTACK_FREE (yyss1);
-+      }
-+# endif
-+#endif /* no yyoverflow */
-+
-+      yyssp = yyss + yysize - 1;
-+      yyvsp = yyvs + yysize - 1;
-+      yylsp = yyls + yysize - 1;
-+
-+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+                (unsigned long int) yystacksize));
-+
-+      if (yyss + yystacksize - 1 <= yyssp)
-+      YYABORT;
-+    }
-+
-+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+  goto yybackup;
-+
-+/*-----------.
-+| yybackup.  |
-+`-----------*/
-+yybackup:
-+
-+  /* Do appropriate processing given the current state.  Read a
-+     look-ahead token if we need one and don't already have one.  */
-+
-+  /* First try to decide what to do without reference to look-ahead token.  */
-+  yyn = yypact[yystate];
-+  if (yyn == YYPACT_NINF)
-+    goto yydefault;
-+
-+  /* Not known => get a look-ahead token if don't already have one.  */
-+
-+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
-+  if (yychar == YYEMPTY)
-+    {
-+      YYDPRINTF ((stderr, "Reading a token: "));
-+      yychar = YYLEX;
-+    }
-+
-+  if (yychar <= YYEOF)
-+    {
-+      yychar = yytoken = YYEOF;
-+      YYDPRINTF ((stderr, "Now at end of input.\n"));
-+    }
-+  else
-+    {
-+      yytoken = YYTRANSLATE (yychar);
-+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+    }
-+
-+  /* If the proper action on seeing token YYTOKEN is to reduce or to
-+     detect an error, take that action.  */
-+  yyn += yytoken;
-+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+    goto yydefault;
-+  yyn = yytable[yyn];
-+  if (yyn <= 0)
-+    {
-+      if (yyn == 0 || yyn == YYTABLE_NINF)
-+      goto yyerrlab;
-+      yyn = -yyn;
-+      goto yyreduce;
-+    }
-+
-+  if (yyn == YYFINAL)
-+    YYACCEPT;
-+
-+  /* Count tokens shifted since error; after three, turn off error
-+     status.  */
-+  if (yyerrstatus)
-+    yyerrstatus--;
-+
-+  /* Shift the look-ahead token.  */
-+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+  /* Discard the shifted token unless it is eof.  */
-+  if (yychar != YYEOF)
-+    yychar = YYEMPTY;
-+
-+  yystate = yyn;
-+  *++yyvsp = yylval;
-+  *++yylsp = yylloc;
-+  goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state.  |
-+`-----------------------------------------------------------*/
-+yydefault:
-+  yyn = yydefact[yystate];
-+  if (yyn == 0)
-+    goto yyerrlab;
-+  goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction.  |
-+`-----------------------------*/
-+yyreduce:
-+  /* yyn is the number of a rule to reduce with.  */
-+  yylen = yyr2[yyn];
-+
-+  /* If YYLEN is nonzero, implement the default value of the action:
-+     `$$ = $1'.
-+
-+     Otherwise, the following line sets YYVAL to garbage.
-+     This behavior is undocumented and Bison
-+     users should not rely upon it.  Assigning to YYVAL
-+     unconditionally makes the parser a bit smaller, and it avoids a
-+     GCC warning that YYVAL may be used uninitialized.  */
-+  yyval = yyvsp[1-yylen];
-+
-+  /* Default location.  */
-+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-+  YY_REDUCE_PRINT (yyn);
-+  switch (yyn)
-+    {
-+        case 2:
-+#line 86 "dtc-parser.y"
-+    {
-+                      the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node));
-+              ;}
-+    break;
-+
-+  case 3:
-+#line 90 "dtc-parser.y"
-+    {
-+                      the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node));
-+              ;}
-+    break;
-+
-+  case 4:
-+#line 97 "dtc-parser.y"
-+    {
-+                      (yyval.re) = NULL;
-+              ;}
-+    break;
-+
-+  case 5:
-+#line 101 "dtc-parser.y"
-+    {
-+                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
-+              ;}
-+    break;
-+
-+  case 6:
-+#line 108 "dtc-parser.y"
-+    {
-+                      (yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref));
-+              ;}
-+    break;
-+
-+  case 7:
-+#line 115 "dtc-parser.y"
-+    {
-+                      (yyval.re) = NULL;
-+              ;}
-+    break;
-+
-+  case 8:
-+#line 119 "dtc-parser.y"
-+    {
-+                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
-+              ;}
-+    break;
-+
-+  case 9:
-+#line 126 "dtc-parser.y"
-+    {
-+                      (yyval.re) = (yyvsp[(1) - (1)].re);
-+              ;}
-+    break;
-+
-+  case 10:
-+#line 130 "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 137 "dtc-parser.y"
-+    {
-+                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
-+              ;}
-+    break;
-+
-+  case 12:
-+#line 141 "dtc-parser.y"
-+    {
-+                      (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64);
-+              ;}
-+    break;
-+
-+  case 13:
-+#line 148 "dtc-parser.y"
-+    {
-+                      (yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL);
-+              ;}
-+    break;
-+
-+  case 14:
-+#line 155 "dtc-parser.y"
-+    {
-+                      (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
-+              ;}
-+    break;
-+
-+  case 15:
-+#line 162 "dtc-parser.y"
-+    {
-+                      (yyval.proplist) = NULL;
-+              ;}
-+    break;
-+
-+  case 16:
-+#line 166 "dtc-parser.y"
-+    {
-+                      (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
-+              ;}
-+    break;
-+
-+  case 17:
-+#line 173 "dtc-parser.y"
-+    {
-+                      (yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref));
-+              ;}
-+    break;
-+
-+  case 18:
-+#line 177 "dtc-parser.y"
-+    {
-+                      (yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref));
-+              ;}
-+    break;
-+
-+  case 19:
-+#line 184 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
-+              ;}
-+    break;
-+
-+  case 20:
-+#line 188 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
-+              ;}
-+    break;
-+
-+  case 21:
-+#line 192 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
-+              ;}
-+    break;
-+
-+  case 22:
-+#line 196 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
-+              ;}
-+    break;
-+
-+  case 23:
-+#line 200 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+              ;}
-+    break;
-+
-+  case 24:
-+#line 207 "dtc-parser.y"
-+    {
-+                      (yyval.data) = empty_data;
-+              ;}
-+    break;
-+
-+  case 25:
-+#line 211 "dtc-parser.y"
-+    {
-+                      (yyval.data) = (yyvsp[(1) - (2)].data);
-+              ;}
-+    break;
-+
-+  case 26:
-+#line 215 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+              ;}
-+    break;
-+
-+  case 27:
-+#line 222 "dtc-parser.y"
-+    {
-+                      (yyval.data) = empty_data;
-+              ;}
-+    break;
-+
-+  case 28:
-+#line 226 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));
-+              ;}
-+    break;
-+
-+  case 29:
-+#line 230 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,
-+                                                            (yyvsp[(2) - (2)].labelref)), -1);
-+              ;}
-+    break;
-+
-+  case 30:
-+#line 235 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+              ;}
-+    break;
-+
-+  case 31:
-+#line 242 "dtc-parser.y"
-+    {
-+                      (yyval.cbase) = 16;
-+              ;}
-+    break;
-+
-+  case 33:
-+#line 250 "dtc-parser.y"
-+    {
-+                      (yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);
-+              ;}
-+    break;
-+
-+  case 34:
-+#line 254 "dtc-parser.y"
-+    {
-+                      (yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32);
-+              ;}
-+    break;
-+
-+  case 35:
-+#line 261 "dtc-parser.y"
-+    {
-+                      (yyval.data) = empty_data;
-+              ;}
-+    break;
-+
-+  case 36:
-+#line 265 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
-+              ;}
-+    break;
-+
-+  case 37:
-+#line 269 "dtc-parser.y"
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+              ;}
-+    break;
-+
-+  case 38:
-+#line 276 "dtc-parser.y"
-+    {
-+                      (yyval.nodelist) = NULL;
-+              ;}
-+    break;
-+
-+  case 39:
-+#line 280 "dtc-parser.y"
-+    {
-+                      (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
-+              ;}
-+    break;
-+
-+  case 40:
-+#line 284 "dtc-parser.y"
-+    {
-+                      yyerror("syntax error: properties must precede subnodes\n");
-+                      YYERROR;
-+              ;}
-+    break;
-+
-+  case 41:
-+#line 292 "dtc-parser.y"
-+    {
-+                      (yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref));
-+              ;}
-+    break;
-+
-+  case 42:
-+#line 299 "dtc-parser.y"
-+    {
-+                      (yyval.labelref) = NULL;
-+              ;}
-+    break;
-+
-+  case 43:
-+#line 303 "dtc-parser.y"
-+    {
-+                      (yyval.labelref) = (yyvsp[(1) - (1)].labelref);
-+              ;}
-+    break;
-+
-+
-+/* Line 1267 of yacc.c.  */
-+#line 1734 "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 308 "dtc-parser.y"
-+
-+
-+void yyerror (char const *s)
-+{
-+      const char *fname = srcpos_filename_for_num(yylloc.filenum);
-+
-+      if (strcmp(fname, "-") == 0)
-+              fname = "stdin";
-+
-+      fprintf(stderr, "%s:%d %s\n",
-+              fname, yylloc.first_line, s);
-+}
-+
-+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;
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped
-@@ -0,0 +1,111 @@
-+/* 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
-+   };
-+#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
-+
-+
-+
-+
-+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-+typedef union YYSTYPE
-+#line 34 "dtc-parser.y"
-+{
-+      char *propnodename;
-+      char *literal;
-+      char *labelref;
-+      unsigned int cbase;
-+      u8 byte;
-+      struct data data;
-+
-+      u64 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 90 "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;
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.y
-@@ -0,0 +1,336 @@
-+/*
-+ * (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 "dtc.h"
-+#include "srcpos.h"
-+
-+int yylex(void);
-+unsigned long long eval_literal(const char *s, int base, int bits);
-+
-+extern struct boot_info *the_boot_info;
-+
-+%}
-+
-+%union {
-+      char *propnodename;
-+      char *literal;
-+      char *labelref;
-+      unsigned int cbase;
-+      u8 byte;
-+      struct data data;
-+
-+      u64 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
-+
-+%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);
-+              }
-+      | v0_memreserves devicetree
-+              {
-+                      the_boot_info = build_boot_info($1, $2);
-+              }
-+      ;
-+
-+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);
-+              }
-+      | 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\n");
-+                      YYERROR;
-+              }
-+      ;
-+
-+subnode:
-+        label DT_PROPNODENAME nodedef
-+              {
-+                      $$ = name_node($3, $2, $1);
-+              }
-+      ;
-+
-+label:
-+        /* empty */
-+              {
-+                      $$ = NULL;
-+              }
-+      | DT_LABEL
-+              {
-+                      $$ = $1;
-+              }
-+      ;
-+
-+%%
-+
-+void yyerror (char const *s)
-+{
-+      const char *fname = srcpos_filename_for_num(yylloc.filenum);
-+
-+      if (strcmp(fname, "-") == 0)
-+              fname = "stdin";
-+
-+      fprintf(stderr, "%s:%d %s\n",
-+              fname, yylloc.first_line, s);
-+}
-+
-+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;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc.c
-@@ -0,0 +1,231 @@
-+/*
-+ * (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;
-+}
-+
-+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(2);
-+}
-+
-+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 *inf = NULL;
-+      FILE *outf = NULL;
-+      int outversion = DEFAULT_FDT_VERSION;
-+      int boot_cpuid_phys = 0xfeedbeef;
-+
-+      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':
-+                      boot_cpuid_phys = strtol(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")) {
-+              inf = dtc_open_file(arg);
-+              bi = dt_from_blob(inf);
-+      } else {
-+              die("Unknown input format \"%s\"\n", inform);
-+      }
-+
-+      if (inf && (inf != stdin))
-+              fclose(inf);
-+
-+      if (! bi || ! bi->dt)
-+              die("Couldn't read input tree\n");
-+
-+      process_checks(force, bi, check, outversion, boot_cpuid_phys);
-+
-+      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, boot_cpuid_phys);
-+      } else if (streq(outform, "asm")) {
-+              dt_to_asm(outf, bi, outversion, boot_cpuid_phys);
-+      } else if (streq(outform, "null")) {
-+              /* do nothing */
-+      } else {
-+              die("Unknown output format \"%s\"\n", outform);
-+      }
-+
-+      exit(0);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc.h
-@@ -0,0 +1,269 @@
-+#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 <netinet/in.h>
-+#include <endian.h>
-+#include <byteswap.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 uint8_t u8;
-+typedef uint16_t u16;
-+typedef uint32_t u32;
-+typedef uint64_t u64;
-+typedef u32 cell_t;
-+
-+#define cpu_to_be16(x)        htons(x)
-+#define be16_to_cpu(x)        ntohs(x)
-+
-+#define cpu_to_be32(x)        htonl(x)
-+#define be32_to_cpu(x)        ntohl(x)
-+
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+#define cpu_to_be64(x)        (x)
-+#define be64_to_cpu(x)        (x)
-+#else
-+#define cpu_to_be64(x)        bswap_64(x)
-+#define be64_to_cpu(x)        bswap_64(x)
-+#endif
-+
-+#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;
-+      int asize;
-+      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, u64 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(u64 start, u64 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 */
-+};
-+
-+struct boot_info *build_boot_info(struct reserve_info *reservelist,
-+                                struct node *tree);
-+
-+/* Checks */
-+
-+void process_checks(int force, struct boot_info *bi,
-+                  int checkflag, int outversion, int boot_cpuid_phys);
-+
-+/* Flattened trees */
-+
-+void dt_to_blob(FILE *f, struct boot_info *bi, int version,
-+              int boot_cpuid_phys);
-+void dt_to_asm(FILE *f, struct boot_info *bi, int version,
-+             int boot_cpuid_phys);
-+
-+struct boot_info *dt_from_blob(FILE *f);
-+
-+/* 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);
-+void fill_fullpaths(struct node *tree, const char *prefix);
-+
-+#endif /* _DTC_H */
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/flattree.c
-@@ -0,0 +1,968 @@
-+/*
-+ * (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"
-+
-+#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;
-+
-+      m = d.markers;
-+      while (m) {
-+              if (m->type == LABEL)
-+                      emit_offset_label(f, m->ref, m->offset);
-+              m = m->next;
-+      }
-+
-+      while ((d.len - off) >= sizeof(u32)) {
-+              fprintf(f, "\t.long\t0x%x\n",
-+                      be32_to_cpu(*((u32 *)(d.val+off))));
-+              off += sizeof(u32);
-+      }
-+
-+      if ((d.len - off) >= sizeof(u16)) {
-+              fprintf(f, "\t.short\t0x%hx\n",
-+                      be16_to_cpu(*((u16 *)(d.val+off))));
-+              off += sizeof(u16);
-+      }
-+
-+      if ((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_be32(FDT_MAGIC);
-+      fdt->version = cpu_to_be32(vi->version);
-+      fdt->last_comp_version = cpu_to_be32(vi->last_comp_version);
-+
-+      /* Reserve map should be doubleword aligned */
-+      reserve_off = ALIGN(vi->hdr_size, 8);
-+
-+      fdt->off_mem_rsvmap = cpu_to_be32(reserve_off);
-+      fdt->off_dt_struct = cpu_to_be32(reserve_off + reservesize);
-+      fdt->off_dt_strings = cpu_to_be32(reserve_off + reservesize
-+                                        + dtsize);
-+      fdt->totalsize = cpu_to_be32(reserve_off + reservesize + dtsize + strsize);
-+
-+      if (vi->flags & FTF_BOOTCPUID)
-+              fdt->boot_cpuid_phys = cpu_to_be32(boot_cpuid_phys);
-+      if (vi->flags & FTF_STRTABSIZE)
-+              fdt->size_dt_strings = cpu_to_be32(strsize);
-+      if (vi->flags & FTF_STRUCTSIZE)
-+              fdt->size_dt_struct = cpu_to_be32(dtsize);
-+}
-+
-+void dt_to_blob(FILE *f, struct boot_info *bi, int version,
-+              int boot_cpuid_phys)
-+{
-+      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,
-+                      boot_cpuid_phys);
-+
-+      /*
-+       * If the user asked for more space than is used, adjust the totalsize.
-+       */
-+      if (minsize > 0) {
-+              padlen = minsize - be32_to_cpu(fdt.totalsize);
-+              if ((padlen < 0) && (quiet < 1))
-+                      fprintf(stderr,
-+                              "Warning: blob size %d >= minimum size %d\n",
-+                              be32_to_cpu(fdt.totalsize), minsize);
-+      }
-+
-+      if (padsize > 0)
-+              padlen = padsize;
-+
-+      if (padlen > 0) {
-+              int tsize = be32_to_cpu(fdt.totalsize);
-+              tsize += padlen;
-+              fdt.totalsize = cpu_to_be32(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, sizeof(fdt));
-+      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, int boot_cpuid_phys)
-+{
-+      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",
-+                      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 u32 flat_read_word(struct inbuf *inb)
-+{
-+      u32 val;
-+
-+      assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
-+
-+      flat_read_chunk(inb, &val, sizeof(val));
-+
-+      return be32_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(u32));
-+
-+      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(u32));
-+
-+      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)
-+{
-+      u32 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  = be64_to_cpu(re.address);
-+              re.size = be64_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)
-+{
-+      const char *lslash;
-+      int plen;
-+
-+      lslash = strrchr(cpath, '/');
-+      if (! lslash)
-+              return NULL;
-+
-+      plen = lslash - cpath;
-+
-+      if (streq(cpath, "/") && streq(ppath, ""))
-+              return "";
-+
-+      if ((plen == 0) && streq(ppath, "/"))
-+              return strdup(lslash+1);
-+
-+      if (! strneq(ppath, cpath, plen))
-+              return NULL;
-+
-+      return strdup(lslash+1);
-+}
-+
-+static const char PROPCHAR[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,._+*#?-";
-+static const char UNITCHAR[] = "0123456789abcdef,";
-+
-+static int check_node_name(const char *name)
-+{
-+      const char *atpos;
-+      int basenamelen;
-+
-+      atpos = strrchr(name, '@');
-+
-+      if (atpos)
-+              basenamelen = atpos - name;
-+      else
-+              basenamelen = strlen(name);
-+
-+      if (strspn(name, PROPCHAR) < basenamelen)
-+              return -1;
-+
-+      if (atpos
-+          && ((basenamelen + 1 + strspn(atpos+1, UNITCHAR)) < strlen(name)))
-+              return -1;
-+
-+      return basenamelen;
-+}
-+
-+static struct node *unflatten_tree(struct inbuf *dtbuf,
-+                                 struct inbuf *strbuf,
-+                                 const char *parent_path, int flags)
-+{
-+      struct node *node;
-+      u32 val;
-+
-+      node = build_node(NULL, NULL);
-+
-+      if (flags & FTF_FULLPATH) {
-+              node->fullpath = flat_read_string(dtbuf);
-+              node->name = nodename_from_path(parent_path, node->fullpath);
-+
-+              if (! node->name)
-+                      die("Path \"%s\" is not valid as a child of \"%s\"\n",
-+                          node->fullpath, parent_path);
-+      } else {
-+              node->name = flat_read_string(dtbuf);
-+              node->fullpath = join_path(parent_path, node->name);
-+      }
-+
-+      node->basenamelen = check_node_name(node->name);
-+      if (node->basenamelen < 0) {
-+              fprintf(stderr, "Warning \"%s\" has incorrect format\n", node->name);
-+      }
-+
-+      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, node->fullpath,
-+                                             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(FILE *f)
-+{
-+      u32 magic, totalsize, version, size_str, size_dt;
-+      u32 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;
-+      u32 val;
-+      int flags = 0;
-+
-+      rc = fread(&magic, sizeof(magic), 1, f);
-+      if (ferror(f))
-+              die("Error reading DT blob magic number: %s\n",
-+                  strerror(errno));
-+      if (rc < 1) {
-+              if (feof(f))
-+                      die("EOF reading DT blob magic number\n");
-+              else
-+                      die("Mysterious short read reading magic number\n");
-+      }
-+
-+      magic = be32_to_cpu(magic);
-+      if (magic != FDT_MAGIC)
-+              die("Blob has incorrect magic number\n");
-+
-+      rc = fread(&totalsize, sizeof(totalsize), 1, f);
-+      if (ferror(f))
-+              die("Error reading DT blob size: %s\n", strerror(errno));
-+      if (rc < 1) {
-+              if (feof(f))
-+                      die("EOF reading DT blob size\n");
-+              else
-+                      die("Mysterious short read reading blob size\n");
-+      }
-+
-+      totalsize = be32_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_be32(magic);
-+      fdt->totalsize = cpu_to_be32(totalsize);
-+
-+      sizeleft = totalsize - sizeof(magic) - sizeof(totalsize);
-+      p = blob + sizeof(magic)  + sizeof(totalsize);
-+
-+      while (sizeleft) {
-+              if (feof(f))
-+                      die("EOF before reading %d bytes of DT blob\n",
-+                          totalsize);
-+
-+              rc = fread(p, 1, sizeleft, f);
-+              if (ferror(f))
-+                      die("Error reading DT blob: %s\n",
-+                          strerror(errno));
-+
-+              sizeleft -= rc;
-+              p += rc;
-+      }
-+
-+      off_dt = be32_to_cpu(fdt->off_dt_struct);
-+      off_str = be32_to_cpu(fdt->off_dt_strings);
-+      off_mem_rsvmap = be32_to_cpu(fdt->off_mem_rsvmap);
-+      version = be32_to_cpu(fdt->version);
-+
-+      fprintf(stderr, "\tmagic:\t\t\t0x%x\n", magic);
-+      fprintf(stderr, "\ttotalsize:\t\t%d\n", totalsize);
-+      fprintf(stderr, "\toff_dt_struct:\t\t0x%x\n", off_dt);
-+      fprintf(stderr, "\toff_dt_strings:\t\t0x%x\n", off_str);
-+      fprintf(stderr, "\toff_mem_rsvmap:\t\t0x%x\n", off_mem_rsvmap);
-+      fprintf(stderr, "\tversion:\t\t0x%x\n", version );
-+      fprintf(stderr, "\tlast_comp_version:\t0x%x\n",
-+              be32_to_cpu(fdt->last_comp_version));
-+
-+      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 >= 2)
-+              fprintf(stderr, "\tboot_cpuid_phys:\t0x%x\n",
-+                      be32_to_cpu(fdt->boot_cpuid_phys));
-+
-+      size_str = -1;
-+      if (version >= 3) {
-+              size_str = be32_to_cpu(fdt->size_dt_strings);
-+              fprintf(stderr, "\tsize_dt_strings:\t%d\n", size_str);
-+              if (off_str+size_str > totalsize)
-+                      die("String table extends past total size\n");
-+      }
-+
-+      if (version >= 17) {
-+              size_dt = be32_to_cpu(fdt->size_dt_struct);
-+              fprintf(stderr, "\tsize_dt_struct:\t\t%d\n", size_dt);
-+              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);
-+      if (size_str >= 0)
-+              inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
-+      else
-+              inbuf_init(&strbuf, blob + off_str, 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);
-+
-+      return build_boot_info(reservelist, tree);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/fstree.c
-@@ -0,0 +1,94 @@
-+/*
-+ * (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("opendir(): %s\n", 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);
-+
-+      fill_fullpaths(tree, "");
-+
-+      return build_boot_info(NULL, tree);
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/livetree.c
-@@ -0,0 +1,305 @@
-+/*
-+ * (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;
-+
-+      p = &parent->children;
-+      while (*p)
-+              p = &((*p)->next_sibling);
-+
-+      *p = child;
-+}
-+
-+struct reserve_info *build_reserve_entry(u64 address, u64 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)
-+{
-+      struct boot_info *bi;
-+
-+      bi = xmalloc(sizeof(*bi));
-+      bi->reservelist = reservelist;
-+      bi->dt = tree;
-+
-+      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 be32_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;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/srcpos.c
-@@ -0,0 +1,105 @@
-+/*
-+ * 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"
-+
-+
-+/*
-+ * Record the complete unique set of opened file names.
-+ * Primarily used to cache source position file names.
-+ */
-+#define MAX_N_FILE_NAMES      (100)
-+
-+const char *file_names[MAX_N_FILE_NAMES];
-+static int n_file_names = 0;
-+
-+/*
-+ * Like yylineno, this is the current open file pos.
-+ */
-+
-+int srcpos_filenum = -1;
-+
-+
-+
-+FILE *dtc_open_file(const char *fname)
-+{
-+      FILE *f;
-+
-+      if (lookup_file_name(fname, 1) < 0)
-+              die("Too many files opened\n");
-+
-+      if (streq(fname, "-"))
-+              f = stdin;
-+      else
-+              f = fopen(fname, "r");
-+
-+      if (! f)
-+              die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
-+
-+      return f;
-+}
-+
-+
-+
-+/*
-+ * Locate and optionally add filename fname in the file_names[] array.
-+ *
-+ * If the filename is currently not in the array and the boolean
-+ * add_it is non-zero, an attempt to add the filename will be made.
-+ *
-+ * Returns;
-+ *    Index [0..MAX_N_FILE_NAMES) where the filename is kept
-+ *    -1 if the name can not be recorded
-+ */
-+
-+int lookup_file_name(const char *fname, int add_it)
-+{
-+      int i;
-+
-+      for (i = 0; i < n_file_names; i++) {
-+              if (strcmp(file_names[i], fname) == 0)
-+                      return i;
-+      }
-+
-+      if (add_it) {
-+              if (n_file_names < MAX_N_FILE_NAMES) {
-+                      file_names[n_file_names] = strdup(fname);
-+                      return n_file_names++;
-+              }
-+      }
-+
-+      return -1;
-+}
-+
-+
-+const char *srcpos_filename_for_num(int filenum)
-+{
-+      if (0 <= filenum && filenum < n_file_names) {
-+              return file_names[filenum];
-+      }
-+
-+      return 0;
-+}
-+
-+
-+const char *srcpos_get_filename(void)
-+{
-+      return srcpos_filename_for_num(srcpos_filenum);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/srcpos.h
-@@ -0,0 +1,75 @@
-+/*
-+ * 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.
-+ */
-+
-+#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
-+typedef struct YYLTYPE {
-+    int first_line;
-+    int first_column;
-+    int last_line;
-+    int last_column;
-+    int filenum;
-+} 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).filenum      = YYRHSLOC (Rhs, N).filenum;           \
-+      }                                                               \
-+      else                                                            \
-+      {                                                               \
-+        (Current).first_line   = (Current).last_line   =              \
-+          YYRHSLOC (Rhs, 0).last_line;                                \
-+        (Current).first_column = (Current).last_column =              \
-+          YYRHSLOC (Rhs, 0).last_column;                              \
-+        (Current).filenum      = YYRHSLOC (Rhs, 0).filenum;           \
-+      }                                                               \
-+    while (YYID (0))
-+
-+
-+
-+extern void yyerror(char const *);
-+
-+extern int srcpos_filenum;
-+
-+extern int push_input_file(const char *filename);
-+extern int pop_input_file(void);
-+
-+extern FILE *dtc_open_file(const char *fname);
-+extern int lookup_file_name(const char *fname, int add_it);
-+extern const char *srcpos_filename_for_num(int filenum);
-+const char *srcpos_get_filename(void);
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/treesource.c
-@@ -0,0 +1,275 @@
-+/*
-+ * (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);
-+extern void yyerror(char const *);
-+
-+struct boot_info *the_boot_info;
-+
-+struct boot_info *dt_from_source(const char *fname)
-+{
-+      the_boot_info = NULL;
-+
-+      push_input_file(fname);
-+
-+      if (yyparse() != 0)
-+              return NULL;
-+
-+      fill_fullpaths(the_boot_info->dt, "");
-+
-+      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", be32_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 ((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);
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/version_gen.h
-@@ -0,0 +1 @@
-+#define DTC_VERSION "DTC 1.0.0-gd6f9b62f"
---- /dev/null
-+++ b/arch/powerpc/boot/dts/adder875-redboot.dts
-@@ -0,0 +1,184 @@
-+/*
-+ * Device Tree Source for MPC885 ADS running RedBoot
-+ *
-+ * Copyright 2006 MontaVista Software, Inc.
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+/ {
-+      model = "Analogue & Micro Adder MPC875";
-+      compatible = "analogue-and-micro,adder875";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              console = &console;
-+              ethernet0 = &eth0;
-+              ethernet1 = &eth1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,875@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <16>;
-+                      i-cache-line-size = <16>;
-+                      d-cache-size = <8192>;
-+                      i-cache-size = <8192>;
-+                      timebase-frequency = <0>;
-+                      bus-frequency = <0>;
-+                      clock-frequency = <0>;
-+                      interrupts = <15 2>;    // decrementer interrupt
-+                      interrupt-parent = <&PIC>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0x01000000>;
-+      };
-+
-+      localbus@fa200100 {
-+              compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
-+                           "simple-bus";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              reg = <0xfa200100 0x40>;
-+
-+              ranges = <
-+                      0 0 0xfe000000 0x00800000
-+                      2 0 0xfa100000 0x00008000
-+              >;
-+
-+              flash@0,0 {
-+                      compatible = "cfi-flash";
-+                      reg = <0 0 0x800000>;
-+                      bank-width = <2>;
-+                      device-width = <2>;
-+              };
-+      };
-+
-+      soc@fa200000 {
-+              compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              ranges = <0 0xfa200000 0x00004000>;
-+
-+              // Temporary until code stops depending on it.
-+              device_type = "soc";
-+
-+              // Temporary until get_immrbase() is fixed.
-+              reg = <0xfa200000 0x4000>;
-+
-+              mdio@e00 {
-+                      compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
-+                      reg = <0xe00 0x188>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      PHY0: ethernet-phy@0 {
-+                              reg = <0>;
-+                              device_type = "ethernet-phy";
-+                      };
-+
-+                      PHY1: ethernet-phy@1 {
-+                              reg = <1>;
-+                              device_type = "ethernet-phy";
-+                      };
-+              };
-+
-+              eth0: ethernet@e00 {
-+                      device_type = "network";
-+                      compatible = "fsl,mpc875-fec-enet",
-+                                   "fsl,pq1-fec-enet";
-+                      reg = <0xe00 0x188>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <3 1>;
-+                      interrupt-parent = <&PIC>;
-+                      phy-handle = <&PHY0>;
-+                      linux,network-index = <0>;
-+              };
-+
-+              eth1: ethernet@1e00 {
-+                      device_type = "network";
-+                      compatible = "fsl,mpc875-fec-enet",
-+                                   "fsl,pq1-fec-enet";
-+                      reg = <0x1e00 0x188>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <7 1>;
-+                      interrupt-parent = <&PIC>;
-+                      phy-handle = <&PHY1>;
-+                      linux,network-index = <1>;
-+              };
-+
-+              PIC: interrupt-controller@0 {
-+                      interrupt-controller;
-+                      #interrupt-cells = <2>;
-+                      reg = <0 0x24>;
-+                      compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
-+              };
-+
-+              cpm@9c0 {
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
-+                      interrupts = <0>;       // cpm error interrupt
-+                      interrupt-parent = <&CPM_PIC>;
-+                      reg = <0x9c0 0x40>;
-+                      ranges;
-+
-+                      muram {
-+                              #address-cells = <1>;
-+                              #size-cells = <1>;
-+                              ranges = <0 0x2000 0x2000>;
-+
-+                              data@0 {
-+                                      compatible = "fsl,cpm-muram-data";
-+                                      reg = <0 0x1c00>;
-+                              };
-+                      };
-+
-+                      brg@9f0 {
-+                              compatible = "fsl,mpc875-brg",
-+                                           "fsl,cpm1-brg",
-+                                           "fsl,cpm-brg";
-+                              reg = <0x9f0 0x10>;
-+                      };
-+
-+                      CPM_PIC: interrupt-controller@930 {
-+                              interrupt-controller;
-+                              #interrupt-cells = <1>;
-+                              interrupts = <5 2 0 2>;
-+                              interrupt-parent = <&PIC>;
-+                              reg = <0x930 0x20>;
-+                              compatible = "fsl,mpc875-cpm-pic",
-+                                           "fsl,cpm1-pic";
-+                      };
-+
-+                      console: serial@a80 {
-+                              device_type = "serial";
-+                              compatible = "fsl,mpc875-smc-uart",
-+                                           "fsl,cpm1-smc-uart";
-+                              reg = <0xa80 0x10 0x3e80 0x40>;
-+                              interrupts = <4>;
-+                              interrupt-parent = <&CPM_PIC>;
-+                              fsl,cpm-brg = <1>;
-+                              fsl,cpm-command = <0x0090>;
-+                              current-speed = <115200>;
-+                      };
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = &console;
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/adder875-uboot.dts
-@@ -0,0 +1,183 @@
-+/*
-+ * Device Tree Source for MPC885 ADS running U-Boot
-+ *
-+ * Copyright 2006 MontaVista Software, Inc.
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+/ {
-+      model = "Analogue & Micro Adder MPC875";
-+      compatible = "analogue-and-micro,adder875";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              console = &console;
-+              ethernet0 = &eth0;
-+              ethernet1 = &eth1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,875@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <16>;
-+                      i-cache-line-size = <16>;
-+                      d-cache-size = <8192>;
-+                      i-cache-size = <8192>;
-+                      timebase-frequency = <0>;
-+                      bus-frequency = <0>;
-+                      clock-frequency = <0>;
-+                      interrupts = <15 2>;    // decrementer interrupt
-+                      interrupt-parent = <&PIC>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0x01000000>;
-+      };
-+
-+      localbus@ff000100 {
-+              compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
-+                           "simple-bus";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              reg = <0xff000100 0x40>;
-+
-+              ranges = <
-+                      0 0 0xfe000000 0x01000000
-+              >;
-+
-+              flash@0,0 {
-+                      compatible = "cfi-flash";
-+                      reg = <0 0 0x800000>;
-+                      bank-width = <2>;
-+                      device-width = <2>;
-+              };
-+      };
-+
-+      soc@ff000000 {
-+              compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              ranges = <0 0xff000000 0x00004000>;
-+
-+              // Temporary until code stops depending on it.
-+              device_type = "soc";
-+
-+              // Temporary until get_immrbase() is fixed.
-+              reg = <0xff000000 0x4000>;
-+
-+              mdio@e00 {
-+                      compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
-+                      reg = <0xe00 0x188>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      PHY0: ethernet-phy@0 {
-+                              reg = <0>;
-+                              device_type = "ethernet-phy";
-+                      };
-+
-+                      PHY1: ethernet-phy@1 {
-+                              reg = <1>;
-+                              device_type = "ethernet-phy";
-+                      };
-+              };
-+
-+              eth0: ethernet@e00 {
-+                      device_type = "network";
-+                      compatible = "fsl,mpc875-fec-enet",
-+                                   "fsl,pq1-fec-enet";
-+                      reg = <0xe00 0x188>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <3 1>;
-+                      interrupt-parent = <&PIC>;
-+                      phy-handle = <&PHY0>;
-+                      linux,network-index = <0>;
-+              };
-+
-+              eth1: ethernet@1e00 {
-+                      device_type = "network";
-+                      compatible = "fsl,mpc875-fec-enet",
-+                                   "fsl,pq1-fec-enet";
-+                      reg = <0x1e00 0x188>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <7 1>;
-+                      interrupt-parent = <&PIC>;
-+                      phy-handle = <&PHY1>;
-+                      linux,network-index = <1>;
-+              };
-+
-+              PIC: interrupt-controller@0 {
-+                      interrupt-controller;
-+                      #interrupt-cells = <2>;
-+                      reg = <0 0x24>;
-+                      compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
-+              };
-+
-+              cpm@9c0 {
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
-+                      interrupts = <0>;       // cpm error interrupt
-+                      interrupt-parent = <&CPM_PIC>;
-+                      reg = <0x9c0 0x40>;
-+                      ranges;
-+
-+                      muram {
-+                              #address-cells = <1>;
-+                              #size-cells = <1>;
-+                              ranges = <0 0x2000 0x2000>;
-+
-+                              data@0 {
-+                                      compatible = "fsl,cpm-muram-data";
-+                                      reg = <0 0x1c00>;
-+                              };
-+                      };
-+
-+                      brg@9f0 {
-+                              compatible = "fsl,mpc875-brg",
-+                                           "fsl,cpm1-brg",
-+                                           "fsl,cpm-brg";
-+                              reg = <0x9f0 0x10>;
-+                      };
-+
-+                      CPM_PIC: interrupt-controller@930 {
-+                              interrupt-controller;
-+                              #interrupt-cells = <1>;
-+                              interrupts = <5 2 0 2>;
-+                              interrupt-parent = <&PIC>;
-+                              reg = <0x930 0x20>;
-+                              compatible = "fsl,mpc875-cpm-pic",
-+                                           "fsl,cpm1-pic";
-+                      };
-+
-+                      console: serial@a80 {
-+                              device_type = "serial";
-+                              compatible = "fsl,mpc875-smc-uart",
-+                                           "fsl,cpm1-smc-uart";
-+                              reg = <0xa80 0x10 0x3e80 0x40>;
-+                              interrupts = <4>;
-+                              interrupt-parent = <&CPM_PIC>;
-+                              fsl,cpm-brg = <1>;
-+                              fsl,cpm-command = <0x0090>;
-+                              current-speed = <115200>;
-+                      };
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = &console;
-+      };
-+};
---- a/arch/powerpc/boot/dts/bamboo.dts
-+++ b/arch/powerpc/boot/dts/bamboo.dts
-@@ -16,14 +16,24 @@
-       #size-cells = <1>;
-       model = "amcc,bamboo";
-       compatible = "amcc,bamboo";
--      dcr-parent = <&/cpus/PowerPC,440EP@0>;
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+              serial2 = &UART2;
-+              serial3 = &UART3;
-+      };
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
--              PowerPC,440EP@0 {
-+              cpu@0 {
-                       device_type = "cpu";
-+                      model = "PowerPC,440EP";
-                       reg = <0>;
-                       clock-frequency = <0>; /* Filled in by zImage */
-                       timebase-frequency = <0>; /* Filled in by zImage */
-@@ -126,7 +136,6 @@
-                               #address-cells = <2>;
-                               #size-cells = <1>;
-                               clock-frequency = <0>; /* Filled in by zImage */
--                              ranges;
-                               interrupts = <5 1>;
-                               interrupt-parent = <&UIC1>;
-                       };
-@@ -238,11 +247,56 @@
-                               zmii-device = <&ZMII0>;
-                               zmii-channel = <1>;
-                       };
-+
-+                      usb@ef601000 {
-+                              compatible = "ohci-be";
-+                              reg = <ef601000 80>;
-+                              interrupts = <8 1 9 1>;
-+                              interrupt-parent = < &UIC1 >;
-+                      };
-+              };
-+
-+              PCI0: pci@ec000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb440ep-pci", "ibm,plb-pci";
-+                      primary;
-+                      reg = <0 eec00000 8     /* Config space access */
-+                             0 eed00000 4     /* IACK */
-+                             0 eed00000 4     /* Special cycle */
-+                             0 ef400000 40>;  /* Internal registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed. Chip supports a second
-+                       * IO range but we don't use it for now
-+                       */
-+                      ranges = <02000000 0 a0000000 0 a0000000 0 20000000
-+                                01000000 0 00000000 0 e8000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* Bamboo has all 4 IRQ pins tied together per slot */
-+                      interrupt-map-mask = <f800 0 0 0>;
-+                      interrupt-map = <
-+                              /* IDSEL 1 */
-+                              0800 0 0 0 &UIC0 1c 8
-+
-+                              /* IDSEL 2 */
-+                              1000 0 0 0 &UIC0 1b 8
-+
-+                              /* IDSEL 3 */
-+                              1800 0 0 0 &UIC0 1a 8
-+
-+                              /* IDSEL 4 */
-+                              2000 0 0 0 &UIC0 19 8
-+                      >;
-               };
-       };
-       chosen {
-               linux,stdout-path = "/plb/opb/serial@ef600300";
--              bootargs = "console=ttyS0,115200";
-       };
- };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/cm5200.dts
-@@ -0,0 +1,236 @@
-+/*
-+ * CM5200 board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.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.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+      model = "schindler,cm5200";
-+      compatible = "schindler,cm5200";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,5200@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-line-size = <20>;
-+                      d-cache-size = <4000>;          // L1, 16K
-+                      i-cache-size = <4000>;          // L1, 16K
-+                      timebase-frequency = <0>;       // from bootloader
-+                      bus-frequency = <0>;            // from bootloader
-+                      clock-frequency = <0>;          // from bootloader
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <00000000 04000000>;      // 64MB
-+      };
-+
-+      soc5200@f0000000 {
-+              model = "fsl,mpc5200b";
-+              compatible = "fsl,mpc5200b";
-+              revision = "";                  // from bootloader
-+              device_type = "soc";
-+              ranges = <0 f0000000 0000c000>;
-+              reg = <f0000000 00000100>;
-+              bus-frequency = <0>;            // from bootloader
-+              system-frequency = <0>;         // from bootloader
-+
-+              cdm@200 {
-+                      compatible = "mpc5200b-cdm","mpc5200-cdm";
-+                      reg = <200 38>;
-+              };
-+
-+              mpc5200_pic: pic@500 {
-+                      // 5200 interrupts are encoded into two levels;
-+                      interrupt-controller;
-+                      #interrupt-cells = <3>;
-+                      compatible = "mpc5200b-pic","mpc5200-pic";
-+                      reg = <500 80>;
-+              };
-+
-+              gpt@600 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <600 10>;
-+                      interrupts = <1 9 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl,has-wdt;
-+              };
-+
-+              gpt@610 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <610 10>;
-+                      interrupts = <1 a 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@620 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <620 10>;
-+                      interrupts = <1 b 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@630 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <630 10>;
-+                      interrupts = <1 c 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@640 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <640 10>;
-+                      interrupts = <1 d 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@650 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <650 10>;
-+                      interrupts = <1 e 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@660 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <660 10>;
-+                      interrupts = <1 f 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@670 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <670 10>;
-+                      interrupts = <1 10 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              rtc@800 {       // Real time clock
-+                      compatible = "mpc5200b-rtc","mpc5200-rtc";
-+                      reg = <800 100>;
-+                      interrupts = <1 5 0 1 6 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpio@b00 {
-+                      compatible = "mpc5200b-gpio","mpc5200-gpio";
-+                      reg = <b00 40>;
-+                      interrupts = <1 7 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpio-wkup@c00 {
-+                      compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
-+                      reg = <c00 40>;
-+                      interrupts = <1 8 0 0 3 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              spi@f00 {
-+                      compatible = "mpc5200b-spi","mpc5200-spi";
-+                      reg = <f00 20>;
-+                      interrupts = <2 d 0 2 e 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              usb@1000 {
-+                      device_type = "usb-ohci-be";
-+                      compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
-+                      reg = <1000 ff>;
-+                      interrupts = <2 6 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              dma-controller@1200 {
-+                      compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
-+                      reg = <1200 80>;
-+                      interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
-+                                    3 4 0  3 5 0  3 6 0  3 7 0
-+                                    3 8 0  3 9 0  3 a 0  3 b 0
-+                                    3 c 0  3 d 0  3 e 0  3 f 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              xlb@1f00 {
-+                      compatible = "mpc5200b-xlb","mpc5200-xlb";
-+                      reg = <1f00 100>;
-+              };
-+
-+              serial@2000 {           // PSC1
-+                      device_type = "serial";
-+                      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+                      port-number = <0>;  // Logical port assignment
-+                      reg = <2000 100>;
-+                      interrupts = <2 1 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              serial@2200 {           // PSC2
-+                      device_type = "serial";
-+                      compatible = "mpc5200-psc-uart";
-+                      port-number = <1>;  // Logical port assignment
-+                      reg = <2200 100>;
-+                      interrupts = <2 2 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              serial@2400 {           // PSC3
-+                      device_type = "serial";
-+                      compatible = "mpc5200-psc-uart";
-+                      port-number = <2>;  // Logical port assignment
-+                      reg = <2400 100>;
-+                      interrupts = <2 3 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              serial@2c00 {           // PSC6
-+                      device_type = "serial";
-+                      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+                      port-number = <5>;  // Logical port assignment
-+                      reg = <2c00 100>;
-+                      interrupts = <2 4 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              ethernet@3000 {
-+                      device_type = "network";
-+                      compatible = "mpc5200b-fec","mpc5200-fec";
-+                      reg = <3000 800>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+                      interrupts = <2 5 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              i2c@3d40 {
-+                      compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-+                      reg = <3d40 40>;
-+                      interrupts = <2 10 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl5200-clocking;
-+              };
-+
-+              sram@8000 {
-+                      compatible = "mpc5200b-sram","mpc5200-sram";
-+                      reg = <8000 4000>;
-+              };
-+      };
-+};
---- a/arch/powerpc/boot/dts/ebony.dts
-+++ b/arch/powerpc/boot/dts/ebony.dts
-@@ -16,14 +16,22 @@
-       #size-cells = <1>;
-       model = "ibm,ebony";
-       compatible = "ibm,ebony";
--      dcr-parent = <&/cpus/PowerPC,440GP@0>;
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
--              PowerPC,440GP@0 {
-+              cpu@0 {
-                       device_type = "cpu";
-+                      model = "PowerPC,440GP";
-                       reg = <0>;
-                       clock-frequency = <0>; // Filled in by zImage
-                       timebase-frequency = <0>; // Filled in by zImage
-@@ -150,9 +158,10 @@
-                                       };
-                               };
--                              ds1743@1,0 {
-+                              nvram@1,0 {
-                                       /* NVRAM & RTC */
--                                      compatible = "ds1743";
-+                                      compatible = "ds1743-nvram";
-+                                      #bytes = <2000>;
-                                       reg = <1 0 2000>;
-                               };
-@@ -284,12 +293,43 @@
-               };
--              PCIX0: pci@1234 {
-+              PCIX0: pci@20ec00000 {
-                       device_type = "pci";
--                      /* FIXME */
--                      reg = <2 0ec00000 8
--                             2 0ec80000 f0
--                             2 0ec80100 fc>;
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
-+                      primary;
-+                      reg = <2 0ec00000 8     /* Config space access */
-+                             0 0 0            /* no IACK cycles */
-+                             2 0ed00000 4     /* Special cycles */
-+                             2 0ec80000 f0    /* Internal registers */
-+                             2 0ec80100 fc>;  /* Internal messaging registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 00000003 80000000 0 80000000
-+                                01000000 0 00000000 00000002 08000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* Ebony has all 4 IRQ pins tied together per slot */
-+                      interrupt-map-mask = <f800 0 0 0>;
-+                      interrupt-map = <
-+                              /* IDSEL 1 */
-+                              0800 0 0 0 &UIC0 17 8
-+
-+                              /* IDSEL 2 */
-+                              1000 0 0 0 &UIC0 18 8
-+
-+                              /* IDSEL 3 */
-+                              1800 0 0 0 &UIC0 19 8
-+
-+                              /* IDSEL 4 */
-+                              2000 0 0 0 &UIC0 1a 8
-+                      >;
-               };
-       };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/ep405.dts
-@@ -0,0 +1,228 @@
-+/*
-+ * Device Tree Source for EP405
-+ *
-+ * Copyright 2007 IBM Corp.
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      model = "ep405";
-+      compatible = "ep405";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,405GP";
-+                      reg = <0>;
-+                      clock-frequency = <bebc200>; /* Filled in by zImage */
-+                      timebase-frequency = <0>; /* Filled in by zImage */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <4000>;
-+                      d-cache-size = <4000>;
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0>; /* Filled in by zImage */
-+      };
-+
-+      UIC0: interrupt-controller {
-+              compatible = "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 9>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb3";
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by zImage */
-+
-+              SDRAM0: memory-controller {
-+                      compatible = "ibm,sdram-405gp";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              MAL: mcmal {
-+                      compatible = "ibm,mcmal-405gp", "ibm,mcmal";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <1>;
-+                      num-rx-chans = <1>;
-+                      interrupt-parent = <&UIC0>;
-+                      interrupts = <
-+                              b 4 /* TXEOB */
-+                              c 4 /* RXEOB */
-+                              a 4 /* SERR */
-+                              d 4 /* TXDE */
-+                              e 4 /* RXDE */>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-405gp", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <ef600000 ef600000 a00000>;
-+                      dcr-reg = <0a0 5>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+
-+                      UART0: serial@ef600300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600300 8>;
-+                              virtual-reg = <ef600300>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              current-speed = <2580>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <0 4>;
-+                      };
-+
-+                      UART1: serial@ef600400 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600400 8>;
-+                              virtual-reg = <ef600400>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              current-speed = <2580>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+                      IIC: i2c@ef600500 {
-+                              compatible = "ibm,iic-405gp", "ibm,iic";
-+                              reg = <ef600500 11>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      GPIO: gpio@ef600700 {
-+                              compatible = "ibm,gpio-405gp";
-+                              reg = <ef600700 20>;
-+                      };
-+
-+                      EMAC: ethernet@ef600800 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-405gp", "ibm,emac";
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <
-+                                      f 4 /* Ethernet */
-+                                      9 4 /* Ethernet Wake Up */>;
-+                              local-mac-address = [000000000000]; /* Filled in by zImage */
-+                              reg = <ef600800 70>;
-+                              mal-device = <&MAL>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rmii";
-+                              phy-map = <00000000>;
-+                      };
-+
-+              };
-+
-+              EBC0: ebc {
-+                      compatible = "ibm,ebc-405gp", "ibm,ebc";
-+                      dcr-reg = <012 2>;
-+                      #address-cells = <2>;
-+                      #size-cells = <1>;
-+
-+
-+                      /* The ranges property is supplied by the bootwrapper
-+                       * and is based on the firmware's configuration of the
-+                       * EBC bridge
-+                       */
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+
-+                      /* NVRAM and RTC */
-+                      nvrtc@4,200000 {
-+                              compatible = "ds1742";
-+                              reg = <4 200000 0>; /* size fixed up by zImage */
-+                      };
-+
-+                      /* "BCSR" CPLD contains a PCI irq controller */
-+                      bcsr@4,0 {
-+                              compatible = "ep405-bcsr";
-+                              reg = <4 0 10>;
-+                              interrupt-controller;
-+                              /* Routing table */
-+                              irq-routing = [ 00      /* SYSERR */
-+                                              01      /* STTM */
-+                                              01      /* RTC */
-+                                              01      /* FENET */
-+                                              02      /* NB PCIIRQ mux ? */
-+                                              03      /* SB Winbond 8259 ? */
-+                                              04      /* Serial Ring */
-+                                              05      /* USB (ep405pc) */
-+                                              06      /* XIRQ 0 */
-+                                              06      /* XIRQ 1 */
-+                                              06      /* XIRQ 2 */
-+                                              06      /* XIRQ 3 */
-+                                              06      /* XIRQ 4 */
-+                                              06      /* XIRQ 5 */
-+                                              06      /* XIRQ 6 */
-+                                              07];    /* Reserved */
-+                      };
-+              };
-+
-+              PCI0: pci@ec000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
-+                      primary;
-+                      reg = <eec00000 8       /* Config space access */
-+                             eed80000 4       /* IACK */
-+                             eed80000 4       /* Special cycle */
-+                             ef480000 40>;    /* Internal registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed. Chip supports a second
-+                       * IO range but we don't use it for now
-+                       */
-+                      ranges = <02000000 0 80000000 80000000 0 20000000
-+                                01000000 0 00000000 e8000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* That's all I know about IRQs on that thing ... */
-+                      interrupt-map-mask = <f800 0 0 0>;
-+                      interrupt-map = <
-+                              /* USB */
-+                              7000 0 0 0 &UIC0 1e 8 /* IRQ5 */
-+                      >;
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/plb/opb/serial@ef600300";
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/ep8248e.dts
-@@ -0,0 +1,207 @@
-+/*
-+ * Device Tree for the Embedded Planet EP8248E board running PlanetCore.
-+ *
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+/ {
-+      model = "EP8248E";
-+      compatible = "fsl,ep8248e";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              planetcore-SMC1 = &smc1;
-+              planetcore-SCC1 = &scc1;
-+              ethernet0 = &eth0;
-+              ethernet1 = &eth1;
-+              serial0 = &smc1;
-+              serial1 = &scc1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,8248@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <32>;
-+                      i-cache-line-size = <32>;
-+                      d-cache-size = <16384>;
-+                      i-cache-size = <16384>;
-+                      timebase-frequency = <0>;
-+                      clock-frequency = <0>;
-+              };
-+      };
-+
-+      localbus@f0010100 {
-+              compatible = "fsl,mpc8248-localbus",
-+                           "fsl,pq2-localbus",
-+                           "simple-bus";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              reg = <0xf0010100 0x40>;
-+
-+              ranges = <0 0 0xfc000000 0x04000000
-+                        1 0 0xfa000000 0x00008000>;
-+
-+              flash@0,3800000 {
-+                      compatible = "cfi-flash";
-+                      reg = <0 0x3800000 0x800000>;
-+                      bank-width = <4>;
-+                      device-width = <2>;
-+              };
-+
-+              bcsr@1,0 {
-+                      #address-cells = <2>;
-+                      #size-cells = <1>;
-+                      reg = <1 0 0x10>;
-+                      compatible = "fsl,ep8248e-bcsr";
-+                      ranges;
-+
-+                      mdio {
-+                              device_type = "mdio";
-+                              compatible = "fsl,ep8248e-mdio-bitbang";
-+                              #address-cells = <1>;
-+                              #size-cells = <0>;
-+                              reg = <1 8 1>;
-+
-+                              PHY0: ethernet-phy@0 {
-+                                      interrupt-parent = <&PIC>;
-+                                      reg = <0>;
-+                                      device_type = "ethernet-phy";
-+                              };
-+
-+                              PHY1: ethernet-phy@1 {
-+                                      interrupt-parent = <&PIC>;
-+                                      reg = <1>;
-+                                      device_type = "ethernet-phy";
-+                              };
-+                      };
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0>;
-+      };
-+
-+      soc@f0000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              compatible = "fsl,mpc8248-immr", "fsl,pq2-soc", "simple-bus";
-+              ranges = <0x00000000 0xf0000000 0x00053000>;
-+
-+              // Temporary until code stops depending on it.
-+              device_type = "soc";
-+
-+              // Temporary -- will go away once kernel uses ranges for get_immrbase().
-+              reg = <0xf0000000 0x00053000>;
-+
-+              cpm@119c0 {
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      #interrupt-cells = <2>;
-+                      compatible = "fsl,mpc8248-cpm", "fsl,cpm2",
-+                                   "simple-bus";
-+                      reg = <0x119c0 0x30>;
-+                      ranges;
-+
-+                      muram {
-+                              #address-cells = <1>;
-+                              #size-cells = <1>;
-+                              ranges = <0 0 0x10000>;
-+
-+                              data@0 {
-+                                      compatible = "fsl,cpm-muram-data";
-+                                      reg = <0 0x1100 0x1140
-+                                             0xec0 0x9800 0x800>;
-+                              };
-+                      };
-+
-+                      brg@119f0 {
-+                              compatible = "fsl,mpc8248-brg",
-+                                           "fsl,cpm2-brg",
-+                                           "fsl,cpm-brg";
-+                              reg = <0x119f0 0x10 0x115f0 0x10>;
-+                      };
-+
-+                      /* Monitor port/SMC1 */
-+                      smc1: serial@11a80 {
-+                              device_type = "serial";
-+                              compatible = "fsl,mpc8248-smc-uart",
-+                                           "fsl,cpm2-smc-uart";
-+                              reg = <0x11a80 0x20 0x1100 0x40>;
-+                              interrupts = <4 8>;
-+                              interrupt-parent = <&PIC>;
-+                              fsl,cpm-brg = <7>;
-+                              fsl,cpm-command = <0x1d000000>;
-+                              linux,planetcore-label = "SMC1";
-+                      };
-+
-+                      /* "Serial" port/SCC1 */
-+                      scc1: serial@11a00 {
-+                              device_type = "serial";
-+                              compatible = "fsl,mpc8248-scc-uart",
-+                                           "fsl,cpm2-scc-uart";
-+                              reg = <0x11a00 0x20 0x8000 0x100>;
-+                              interrupts = <40 8>;
-+                              interrupt-parent = <&PIC>;
-+                              fsl,cpm-brg = <1>;
-+                              fsl,cpm-command = <0x00800000>;
-+                              linux,planetcore-label = "SCC1";
-+                      };
-+
-+                      eth0: ethernet@11300 {
-+                              device_type = "network";
-+                              compatible = "fsl,mpc8248-fcc-enet",
-+                                           "fsl,cpm2-fcc-enet";
-+                              reg = <0x11300 0x20 0x8400 0x100 0x11390 1>;
-+                              local-mac-address = [ 00 00 00 00 00 00 ];
-+                              interrupts = <32 8>;
-+                              interrupt-parent = <&PIC>;
-+                              phy-handle = <&PHY0>;
-+                              linux,network-index = <0>;
-+                              fsl,cpm-command = <0x12000300>;
-+                      };
-+
-+                      eth1: ethernet@11320 {
-+                              device_type = "network";
-+                              compatible = "fsl,mpc8248-fcc-enet",
-+                                           "fsl,cpm2-fcc-enet";
-+                              reg = <0x11320 0x20 0x8500 0x100 0x113b0 1>;
-+                              local-mac-address = [ 00 00 00 00 00 00 ];
-+                              interrupts = <33 8>;
-+                              interrupt-parent = <&PIC>;
-+                              phy-handle = <&PHY1>;
-+                              linux,network-index = <1>;
-+                              fsl,cpm-command = <0x16200300>;
-+                      };
-+
-+                      usb@11b60 {
-+                              #address-cells = <1>;
-+                              #size-cells = <0>;
-+                              compatible = "fsl,mpc8248-usb",
-+                                           "fsl,cpm2-usb";
-+                              reg = <0x11b60 0x18 0x8b00 0x100>;
-+                              interrupt-parent = <&PIC>;
-+                              interrupts = <11 8>;
-+                              fsl,cpm-command = <0x2e600000>;
-+                      };
-+              };
-+
-+              PIC: interrupt-controller@10c00 {
-+                      #interrupt-cells = <2>;
-+                      interrupt-controller;
-+                      reg = <0x10c00 0x80>;
-+                      compatible = "fsl,mpc8248-pic", "fsl,pq2-pic";
-+              };
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/haleakala.dts
-@@ -0,0 +1,274 @@
-+/*
-+ * Device Tree Source for AMCC Haleakala (405EXr)
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      model = "amcc,haleakala";
-+      compatible = "amcc,kilauea";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,405EXr";
-+                      reg = <0>;
-+                      clock-frequency = <0>; /* Filled in by U-Boot */
-+                      timebase-frequency = <0>; /* Filled in by U-Boot */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <4000>; /* 16 kB */
-+                      d-cache-size = <4000>; /* 16 kB */
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0>; /* Filled in by U-Boot */
-+      };
-+
-+      UIC0: interrupt-controller {
-+              compatible = "ibm,uic-405exr", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-405exr","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1e 4 1f 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      UIC2: interrupt-controller2 {
-+              compatible = "ibm,uic-405exr","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <2>;
-+              dcr-reg = <0e0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1c 4 1d 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-405exr", "ibm,plb4";
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+              SDRAM0: memory-controller {
-+                      compatible = "ibm,sdram-405exr";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-405exr", "ibm,mcmal2";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <2>;
-+                      num-rx-chans = <2>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+                                      /*RXEOB*/ 1 &UIC0 b 4
-+                                      /*SERR*/  2 &UIC1 0 4
-+                                      /*TXDE*/  3 &UIC1 1 4
-+                                      /*RXDE*/  4 &UIC1 2 4>;
-+                      interrupt-map-mask = <ffffffff>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-405exr", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <80000000 80000000 10000000
-+                                ef600000 ef600000 a00000
-+                                f0000000 f0000000 10000000>;
-+                      dcr-reg = <0a0 5>;
-+                      clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-405exr", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              /* ranges property is supplied by U-Boot */
-+                              interrupts = <5 1>;
-+                              interrupt-parent = <&UIC1>;
-+
-+                              nor_flash@0,0 {
-+                                      compatible = "amd,s29gl512n", "cfi-flash";
-+                                      bank-width = <2>;
-+                                      reg = <0 000000 4000000>;
-+                                      #address-cells = <1>;
-+                                      #size-cells = <1>;
-+                                      partition@0 {
-+                                              label = "kernel";
-+                                              reg = <0 200000>;
-+                                      };
-+                                      partition@200000 {
-+                                              label = "root";
-+                                              reg = <200000 200000>;
-+                                      };
-+                                      partition@400000 {
-+                                              label = "user";
-+                                              reg = <400000 3b60000>;
-+                                      };
-+                                      partition@3f60000 {
-+                                              label = "env";
-+                                              reg = <3f60000 40000>;
-+                                      };
-+                                      partition@3fa0000 {
-+                                              label = "u-boot";
-+                                              reg = <3fa0000 60000>;
-+                                      };
-+                              };
-+                      };
-+
-+                      UART0: serial@ef600200 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600200 8>;
-+                              virtual-reg = <ef600200>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1a 4>;
-+                      };
-+
-+                      UART1: serial@ef600300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600300 8>;
-+                              virtual-reg = <ef600300>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+                      IIC0: i2c@ef600400 {
-+                              compatible = "ibm,iic-405exr", "ibm,iic";
-+                              reg = <ef600400 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      IIC1: i2c@ef600500 {
-+                              compatible = "ibm,iic-405exr", "ibm,iic";
-+                              reg = <ef600500 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <7 4>;
-+                      };
-+
-+
-+                      RGMII0: emac-rgmii@ef600b00 {
-+                              compatible = "ibm,rgmii-405exr", "ibm,rgmii";
-+                              reg = <ef600b00 104>;
-+                              has-mdio;
-+                      };
-+
-+                      EMAC0: ethernet@ef600900 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-405exr", "ibm,emac4";
-+                              interrupt-parent = <&EMAC0>;
-+                              interrupts = <0 1>;
-+                              #interrupt-cells = <1>;
-+                              #address-cells = <0>;
-+                              #size-cells = <0>;
-+                              interrupt-map = </*Status*/ 0 &UIC0 18 4
-+                                              /*Wake*/  1 &UIC1 1d 4>;
-+                              reg = <ef600900 70>;
-+                              local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000000>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <0>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+              };
-+
-+              PCIE0: pciex@0a0000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-405exr", "ibm,plb-pciex";
-+                      primary;
-+                      port = <0>; /* port number */
-+                      reg = <a0000000 20000000        /* Config space access */
-+                             ef000000 00001000>;      /* Registers */
-+                      dcr-reg = <040 020>;
-+                      sdr-base = <400>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 90000000 0 08000000
-+                                01000000 0 00000000 e0000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0x00 to 0x3f */
-+                      bus-range = <00 3f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+              };
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/katmai.dts
-@@ -0,0 +1,400 @@
-+/*
-+ * Device Tree Source for AMCC Katmai eval board
-+ *
-+ * Copyright (c) 2006, 2007 IBM Corp.
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * Copyright (c) 2006, 2007 IBM Corp.
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <2>;
-+      #size-cells = <1>;
-+      model = "amcc,katmai";
-+      compatible = "amcc,katmai";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+              serial2 = &UART2;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,440SPe";
-+                      reg = <0>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+                      timebase-frequency = <0>; /* Filled in by zImage */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <20000>;
-+                      d-cache-size = <20000>;
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0 0>; /* Filled in by zImage */
-+      };
-+
-+      UIC0: interrupt-controller0 {
-+              compatible = "ibm,uic-440spe","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-440spe","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1e 4 1f 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      UIC2: interrupt-controller2 {
-+              compatible = "ibm,uic-440spe","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <2>;
-+              dcr-reg = <0e0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <a 4 b 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      UIC3: interrupt-controller3 {
-+              compatible = "ibm,uic-440spe","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <3>;
-+              dcr-reg = <0f0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <10 4 11 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      SDR0: sdr {
-+              compatible = "ibm,sdr-440spe";
-+              dcr-reg = <00e 002>;
-+      };
-+
-+      CPR0: cpr {
-+              compatible = "ibm,cpr-440spe";
-+              dcr-reg = <00c 002>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-440spe", "ibm,plb-440gp", "ibm,plb4";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by zImage */
-+
-+              SDRAM0: sdram {
-+                      compatible = "ibm,sdram-440spe", "ibm,sdram-405gp";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-440spe", "ibm,mcmal2";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <2>;
-+                      num-rx-chans = <1>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC1 6 4
-+                                       /*RXEOB*/ 1 &UIC1 7 4
-+                                       /*SERR*/  2 &UIC1 1 4
-+                                       /*TXDE*/  3 &UIC1 2 4
-+                                       /*RXDE*/  4 &UIC1 3 4>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <00000000 4 e0000000 20000000>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              interrupts = <5 1>;
-+                              interrupt-parent = <&UIC1>;
-+                      };
-+
-+                      UART0: serial@10000200 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <10000200 8>;
-+                              virtual-reg = <a0000200>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              current-speed = <1c200>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <0 4>;
-+                      };
-+
-+                      UART1: serial@10000300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <10000300 8>;
-+                              virtual-reg = <a0000300>;
-+                              clock-frequency = <0>;
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+
-+                      UART2: serial@10000600 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <10000600 8>;
-+                              virtual-reg = <a0000600>;
-+                              clock-frequency = <0>;
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <5 4>;
-+                      };
-+
-+                      IIC0: i2c@10000400 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
-+                              reg = <10000400 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      IIC1: i2c@10000500 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
-+                              reg = <10000500 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <3 4>;
-+                      };
-+
-+                      EMAC0: ethernet@10000800 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440spe", "ibm,emac4";
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <1c 4 1d 4>;
-+                              reg = <10000800 70>;
-+                              local-mac-address = [000000000000];
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "gmii";
-+                              phy-map = <00000000>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+              };
-+
-+              PCIX0: pci@c0ec00000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pcix-440spe", "ibm,plb-pcix";
-+                      primary;
-+                      large-inbound-windows;
-+                      enable-msi-hole;
-+                      reg = <c 0ec00000   8   /* Config space access */
-+                             0 0 0            /* no IACK cycles */
-+                             c 0ed00000   4   /* Special cycles */
-+                             c 0ec80000 100   /* Internal registers */
-+                             c 0ec80100  fc>; /* Internal messaging registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 0000000d 80000000 0 80000000
-+                                01000000 0 00000000 0000000c 08000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0 to 0xf */
-+                      bus-range = <0 f>;
-+
-+                      /*
-+                       * On Katmai, the following PCI-X interrupts signals
-+                       * have to be enabled via jumpers (only INTA is
-+                       * enabled per default):
-+                       *
-+                       * INTB: J3: 1-2
-+                       * INTC: J2: 1-2
-+                       * INTD: J1: 1-2
-+                       */
-+                      interrupt-map-mask = <f800 0 0 7>;
-+                      interrupt-map = <
-+                              /* IDSEL 1 */
-+                              0800 0 0 1 &UIC1 14 8
-+                              0800 0 0 2 &UIC1 13 8
-+                              0800 0 0 3 &UIC1 12 8
-+                              0800 0 0 4 &UIC1 11 8
-+                      >;
-+              };
-+
-+              PCIE0: pciex@d00000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+                      primary;
-+                      port = <0>; /* port number */
-+                      reg = <d 00000000 20000000      /* Config space access */
-+                             c 10000000 00001000>;    /* Registers */
-+                      dcr-reg = <100 020>;
-+                      sdr-base = <300>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 0000000e 00000000 0 80000000
-+                                01000000 0 00000000 0000000f 80000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 10 to 0x1f */
-+                      bus-range = <10 1f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC3 0 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC3 1 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC3 2 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC3 3 4 /* swizzled int D */>;
-+              };
-+
-+              PCIE1: pciex@d20000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+                      primary;
-+                      port = <1>; /* port number */
-+                      reg = <d 20000000 20000000      /* Config space access */
-+                             c 10001000 00001000>;    /* Registers */
-+                      dcr-reg = <120 020>;
-+                      sdr-base = <340>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 0000000e 80000000 0 80000000
-+                                01000000 0 00000000 0000000f 80010000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 10 to 0x1f */
-+                      bus-range = <20 2f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC3 4 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC3 5 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC3 6 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC3 7 4 /* swizzled int D */>;
-+              };
-+
-+              PCIE2: pciex@d40000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+                      primary;
-+                      port = <2>; /* port number */
-+                      reg = <d 40000000 20000000      /* Config space access */
-+                             c 10002000 00001000>;    /* Registers */
-+                      dcr-reg = <140 020>;
-+                      sdr-base = <370>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 0000000f 00000000 0 80000000
-+                                01000000 0 00000000 0000000f 80020000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 10 to 0x1f */
-+                      bus-range = <30 3f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC3 8 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC3 9 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC3 a 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC3 b 4 /* swizzled int D */>;
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/plb/opb/serial@10000200";
-+      };
-+};
---- a/arch/powerpc/boot/dts/kilauea.dts
-+++ b/arch/powerpc/boot/dts/kilauea.dts
-@@ -13,14 +13,22 @@
-       #size-cells = <1>;
-       model = "amcc,kilauea";
-       compatible = "amcc,kilauea";
--      dcr-parent = <&/cpus/PowerPC,405EX@0>;
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
--              PowerPC,405EX@0 {
-+              cpu@0 {
-                       device_type = "cpu";
-+                      model = "PowerPC,405EX";
-                       reg = <0>;
-                       clock-frequency = <0>; /* Filled in by U-Boot */
-                       timebase-frequency = <0>; /* Filled in by U-Boot */
-@@ -194,6 +202,7 @@
-                               device_type = "rgmii-interface";
-                               compatible = "ibm,rgmii-405ex", "ibm,rgmii";
-                               reg = <ef600b00 104>;
-+                              has-mdio;
-                       };
-                       EMAC0: ethernet@ef600900 {
-@@ -220,6 +229,8 @@
-                               phy-map = <00000000>;
-                               rgmii-device = <&RGMII0>;
-                               rgmii-channel = <0>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-                       };
-                       EMAC1: ethernet@ef600a00 {
-@@ -246,7 +257,91 @@
-                               phy-map = <00000000>;
-                               rgmii-device = <&RGMII0>;
-                               rgmii-channel = <1>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-                       };
-               };
-+
-+              PCIE0: pciex@0a0000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+                      primary;
-+                      port = <0>; /* port number */
-+                      reg = <a0000000 20000000        /* Config space access */
-+                             ef000000 00001000>;      /* Registers */
-+                      dcr-reg = <040 020>;
-+                      sdr-base = <400>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 90000000 0 08000000
-+                                01000000 0 00000000 e0000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0x00 to 0x3f */
-+                      bus-range = <00 3f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+              };
-+
-+              PCIE1: pciex@0c0000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+                      primary;
-+                      port = <1>; /* port number */
-+                      reg = <c0000000 20000000        /* Config space access */
-+                             ef001000 00001000>;      /* Registers */
-+                      dcr-reg = <060 020>;
-+                      sdr-base = <440>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 98000000 0 08000000
-+                                01000000 0 00000000 e0010000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0x40 to 0x7f */
-+                      bus-range = <40 7f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC2 b 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC2 c 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC2 d 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
-+              };
-       };
- };
---- a/arch/powerpc/boot/dts/kuroboxHD.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHD.dts
-@@ -23,6 +23,12 @@ XXXX add flash parts, rtc, ??
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -60,7 +66,7 @@ XXXX add flash parts, rtc, ??
-               i2c@80003000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <80003000 1000>;
-                       interrupts = <5 2>;
-@@ -73,7 +79,8 @@ XXXX add flash parts, rtc, ??
-                       };
-               };
--              serial@80004500 {
-+              serial0: serial@80004500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <80004500 8>;
-@@ -83,7 +90,8 @@ XXXX add flash parts, rtc, ??
-                       interrupt-parent = <&mpic>;
-               };
--              serial@80004600 {
-+              serial1: serial@80004600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <80004600 8>;
-@@ -102,7 +110,7 @@ XXXX add flash parts, rtc, ??
-                       reg = <80040000 40000>;
-               };
--              pci@fec00000 {
-+              pci0: pci@fec00000 {
-                       #address-cells = <3>;
-                       #size-cells = <2>;
-                       #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/kuroboxHG.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHG.dts
-@@ -23,6 +23,12 @@ XXXX add flash parts, rtc, ??
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -60,7 +66,7 @@ XXXX add flash parts, rtc, ??
-               i2c@80003000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <80003000 1000>;
-                       interrupts = <5 2>;
-@@ -73,7 +79,8 @@ XXXX add flash parts, rtc, ??
-                       };
-               };
--              serial@80004500 {
-+              serial0: serial@80004500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <80004500 8>;
-@@ -83,7 +90,8 @@ XXXX add flash parts, rtc, ??
-                       interrupt-parent = <&mpic>;
-               };
--              serial@80004600 {
-+              serial1: serial@80004600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <80004600 8>;
-@@ -102,7 +110,7 @@ XXXX add flash parts, rtc, ??
-                       reg = <80040000 40000>;
-               };
--              pci@fec00000 {
-+              pci0: pci@fec00000 {
-                       #address-cells = <3>;
-                       #size-cells = <2>;
-                       #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/lite5200.dts
-+++ b/arch/powerpc/boot/dts/lite5200.dts
-@@ -19,7 +19,7 @@
- / {
-       model = "fsl,lite5200";
-       // revision = "1.0";
--      compatible = "fsl,lite5200","generic-mpc5200";
-+      compatible = "fsl,lite5200";
-       #address-cells = <1>;
-       #size-cells = <1>;
-@@ -284,7 +284,8 @@
-               };
-               i2c@3d00 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-                       compatible = "mpc5200-i2c","fsl-i2c";
-                       cell-index = <0>;
-                       reg = <3d00 40>;
-@@ -294,7 +295,8 @@
-               };
-               i2c@3d40 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-                       compatible = "mpc5200-i2c","fsl-i2c";
-                       cell-index = <1>;
-                       reg = <3d40 40>;
---- a/arch/powerpc/boot/dts/lite5200b.dts
-+++ b/arch/powerpc/boot/dts/lite5200b.dts
-@@ -19,7 +19,7 @@
- / {
-       model = "fsl,lite5200b";
-       // revision = "1.0";
--      compatible = "fsl,lite5200b","generic-mpc5200";
-+      compatible = "fsl,lite5200b";
-       #address-cells = <1>;
-       #size-cells = <1>;
-@@ -300,7 +300,8 @@
-               };
-               i2c@3d00 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-                       compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-                       cell-index = <0>;
-                       reg = <3d00 40>;
-@@ -310,7 +311,8 @@
-               };
-               i2c@3d40 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-                       compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-                       cell-index = <1>;
-                       reg = <3d40 40>;
---- /dev/null
-+++ b/arch/powerpc/boot/dts/makalu.dts
-@@ -0,0 +1,347 @@
-+/*
-+ * Device Tree Source for AMCC Makalu (405EX)
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      model = "amcc,makalu";
-+      compatible = "amcc,makalu";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,405EX";
-+                      reg = <0>;
-+                      clock-frequency = <0>; /* Filled in by U-Boot */
-+                      timebase-frequency = <0>; /* Filled in by U-Boot */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <4000>; /* 16 kB */
-+                      d-cache-size = <4000>; /* 16 kB */
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0>; /* Filled in by U-Boot */
-+      };
-+
-+      UIC0: interrupt-controller {
-+              compatible = "ibm,uic-405ex", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-405ex","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1e 4 1f 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      UIC2: interrupt-controller2 {
-+              compatible = "ibm,uic-405ex","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <2>;
-+              dcr-reg = <0e0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1c 4 1d 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-405ex", "ibm,plb4";
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+              SDRAM0: memory-controller {
-+                      compatible = "ibm,sdram-405ex";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-405ex", "ibm,mcmal2";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <2>;
-+                      num-rx-chans = <2>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+                                      /*RXEOB*/ 1 &UIC0 b 4
-+                                      /*SERR*/  2 &UIC1 0 4
-+                                      /*TXDE*/  3 &UIC1 1 4
-+                                      /*RXDE*/  4 &UIC1 2 4>;
-+                      interrupt-map-mask = <ffffffff>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-405ex", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <80000000 80000000 10000000
-+                                ef600000 ef600000 a00000
-+                                f0000000 f0000000 10000000>;
-+                      dcr-reg = <0a0 5>;
-+                      clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-405ex", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              /* ranges property is supplied by U-Boot */
-+                              interrupts = <5 1>;
-+                              interrupt-parent = <&UIC1>;
-+
-+                              nor_flash@0,0 {
-+                                      compatible = "amd,s29gl512n", "cfi-flash";
-+                                      bank-width = <2>;
-+                                      reg = <0 000000 4000000>;
-+                                      #address-cells = <1>;
-+                                      #size-cells = <1>;
-+                                      partition@0 {
-+                                              label = "kernel";
-+                                              reg = <0 200000>;
-+                                      };
-+                                      partition@200000 {
-+                                              label = "root";
-+                                              reg = <200000 200000>;
-+                                      };
-+                                      partition@400000 {
-+                                              label = "user";
-+                                              reg = <400000 3b60000>;
-+                                      };
-+                                      partition@3f60000 {
-+                                              label = "env";
-+                                              reg = <3f60000 40000>;
-+                                      };
-+                                      partition@3fa0000 {
-+                                              label = "u-boot";
-+                                              reg = <3fa0000 60000>;
-+                                      };
-+                              };
-+                      };
-+
-+                      UART0: serial@ef600200 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600200 8>;
-+                              virtual-reg = <ef600200>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1a 4>;
-+                      };
-+
-+                      UART1: serial@ef600300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600300 8>;
-+                              virtual-reg = <ef600300>;
-+                              clock-frequency = <0>; /* Filled in by U-Boot */
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+                      IIC0: i2c@ef600400 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-405ex", "ibm,iic";
-+                              reg = <ef600400 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      IIC1: i2c@ef600500 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-405ex", "ibm,iic";
-+                              reg = <ef600500 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <7 4>;
-+                      };
-+
-+
-+                      RGMII0: emac-rgmii@ef600b00 {
-+                              device_type = "rgmii-interface";
-+                              compatible = "ibm,rgmii-405ex", "ibm,rgmii";
-+                              reg = <ef600b00 104>;
-+                              has-mdio;
-+                      };
-+
-+                      EMAC0: ethernet@ef600900 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-405ex", "ibm,emac4";
-+                              interrupt-parent = <&EMAC0>;
-+                              interrupts = <0 1>;
-+                              #interrupt-cells = <1>;
-+                              #address-cells = <0>;
-+                              #size-cells = <0>;
-+                              interrupt-map = </*Status*/ 0 &UIC0 18 4
-+                                              /*Wake*/  1 &UIC1 1d 4>;
-+                              reg = <ef600900 70>;
-+                              local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <0000003f>;   /* Start at 6 */
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <0>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+
-+                      EMAC1: ethernet@ef600a00 {
-+                              linux,network-index = <1>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-405ex", "ibm,emac4";
-+                              interrupt-parent = <&EMAC1>;
-+                              interrupts = <0 1>;
-+                              #interrupt-cells = <1>;
-+                              #address-cells = <0>;
-+                              #size-cells = <0>;
-+                              interrupt-map = </*Status*/ 0 &UIC0 19 4
-+                                              /*Wake*/  1 &UIC1 1f 4>;
-+                              reg = <ef600a00 70>;
-+                              local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <1>;
-+                              mal-rx-channel = <1>;
-+                              cell-index = <1>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000000>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <1>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+              };
-+
-+              PCIE0: pciex@0a0000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+                      primary;
-+                      port = <0>; /* port number */
-+                      reg = <a0000000 20000000        /* Config space access */
-+                             ef000000 00001000>;      /* Registers */
-+                      dcr-reg = <040 020>;
-+                      sdr-base = <400>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 90000000 0 08000000
-+                                01000000 0 00000000 e0000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0x00 to 0x3f */
-+                      bus-range = <00 3f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+              };
-+
-+              PCIE1: pciex@0c0000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+                      primary;
-+                      port = <1>; /* port number */
-+                      reg = <c0000000 20000000        /* Config space access */
-+                             ef001000 00001000>;      /* Registers */
-+                      dcr-reg = <060 020>;
-+                      sdr-base = <440>;
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 98000000 0 08000000
-+                                01000000 0 00000000 e0010000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* This drives busses 0x40 to 0x7f */
-+                      bus-range = <40 7f>;
-+
-+                      /* Legacy interrupts (note the weird polarity, the bridge seems
-+                       * to invert PCIe legacy interrupts).
-+                       * We are de-swizzling here because the numbers are actually for
-+                       * port of the root complex virtual P2P bridge. But I want
-+                       * to avoid putting a node for it in the tree, so the numbers
-+                       * below are basically de-swizzled numbers.
-+                       * The real slot is on idsel 0, so the swizzling is 1:1
-+                       */
-+                      interrupt-map-mask = <0000 0 0 7>;
-+                      interrupt-map = <
-+                              0000 0 0 1 &UIC2 b 4 /* swizzled int A */
-+                              0000 0 0 2 &UIC2 c 4 /* swizzled int B */
-+                              0000 0 0 3 &UIC2 d 4 /* swizzled int C */
-+                              0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
-+              };
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/motionpro.dts
-@@ -0,0 +1,309 @@
-+/*
-+ * Motion-PRO board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.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.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+      model = "promess,motionpro";
-+      compatible = "promess,motionpro";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,5200@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-line-size = <20>;
-+                      d-cache-size = <4000>;          // L1, 16K
-+                      i-cache-size = <4000>;          // L1, 16K
-+                      timebase-frequency = <0>;       // from bootloader
-+                      bus-frequency = <0>;            // from bootloader
-+                      clock-frequency = <0>;          // from bootloader
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <00000000 04000000>;      // 64MB
-+      };
-+
-+      soc5200@f0000000 {
-+              model = "fsl,mpc5200b";
-+              compatible = "fsl,mpc5200b";
-+              revision = "";                  // from bootloader
-+              device_type = "soc";
-+              ranges = <0 f0000000 0000c000>;
-+              reg = <f0000000 00000100>;
-+              bus-frequency = <0>;            // from bootloader
-+              system-frequency = <0>;         // from bootloader
-+
-+              cdm@200 {
-+                      compatible = "mpc5200b-cdm","mpc5200-cdm";
-+                      reg = <200 38>;
-+              };
-+
-+              mpc5200_pic: pic@500 {
-+                      // 5200 interrupts are encoded into two levels;
-+                      interrupt-controller;
-+                      #interrupt-cells = <3>;
-+                      compatible = "mpc5200b-pic","mpc5200-pic";
-+                      reg = <500 80>;
-+              };
-+
-+              gpt@600 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <600 10>;
-+                      interrupts = <1 9 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl,has-wdt;
-+              };
-+
-+              gpt@610 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <610 10>;
-+                      interrupts = <1 a 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@620 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <620 10>;
-+                      interrupts = <1 b 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@630 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <630 10>;
-+                      interrupts = <1 c 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@640 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <640 10>;
-+                      interrupts = <1 d 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpt@650 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+                      reg = <650 10>;
-+                      interrupts = <1 e 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              motionpro-led@660 {     // Motion-PRO status LED
-+                      compatible = "promess,motionpro-led";
-+                      label = "motionpro-statusled";
-+                      reg = <660 10>;
-+                      interrupts = <1 f 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      blink-delay = <64>; // 100 msec
-+              };
-+
-+              motionpro-led@670 {     // Motion-PRO ready LED
-+                      compatible = "promess,motionpro-led";
-+                      label = "motionpro-readyled";
-+                      reg = <670 10>;
-+                      interrupts = <1 10 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              rtc@800 {       // Real time clock
-+                      compatible = "mpc5200b-rtc","mpc5200-rtc";
-+                      reg = <800 100>;
-+                      interrupts = <1 5 0 1 6 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              mscan@980 {
-+                      compatible = "mpc5200b-mscan","mpc5200-mscan";
-+                      interrupts = <2 12 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      reg = <980 80>;
-+              };
-+
-+              gpio@b00 {
-+                      compatible = "mpc5200b-gpio","mpc5200-gpio";
-+                      reg = <b00 40>;
-+                      interrupts = <1 7 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              gpio-wkup@c00 {
-+                      compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
-+                      reg = <c00 40>;
-+                      interrupts = <1 8 0 0 3 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+
-+              spi@f00 {
-+                      compatible = "mpc5200b-spi","mpc5200-spi";
-+                      reg = <f00 20>;
-+                      interrupts = <2 d 0 2 e 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              usb@1000 {
-+                      compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
-+                      reg = <1000 ff>;
-+                      interrupts = <2 6 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              dma-controller@1200 {
-+                      compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
-+                      reg = <1200 80>;
-+                      interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
-+                                    3 4 0  3 5 0  3 6 0  3 7 0
-+                                    3 8 0  3 9 0  3 a 0  3 b 0
-+                                    3 c 0  3 d 0  3 e 0  3 f 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              xlb@1f00 {
-+                      compatible = "mpc5200b-xlb","mpc5200-xlb";
-+                      reg = <1f00 100>;
-+              };
-+
-+              serial@2000 {           // PSC1
-+                      device_type = "serial";
-+                      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+                      port-number = <0>;  // Logical port assignment
-+                      reg = <2000 100>;
-+                      interrupts = <2 1 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              // PSC2 in spi master mode 
-+              spi@2200 {              // PSC2
-+                      compatible = "mpc5200b-psc-spi","mpc5200-psc-spi";
-+                      cell-index = <1>;
-+                      reg = <2200 100>;
-+                      interrupts = <2 2 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              // PSC5 in uart mode
-+              serial@2800 {           // PSC5
-+                      device_type = "serial";
-+                      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+                      port-number = <4>;  // Logical port assignment
-+                      reg = <2800 100>;
-+                      interrupts = <2 c 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              ethernet@3000 {
-+                      device_type = "network";
-+                      compatible = "mpc5200b-fec","mpc5200-fec";
-+                      reg = <3000 800>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+                      interrupts = <2 5 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              ata@3a00 {
-+                      compatible = "mpc5200b-ata","mpc5200-ata";
-+                      reg = <3a00 100>;
-+                      interrupts = <2 7 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              i2c@3d40 {
-+                      compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-+                      reg = <3d40 40>;
-+                      interrupts = <2 10 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl5200-clocking;
-+              };
-+
-+              sram@8000 {
-+                      compatible = "mpc5200b-sram","mpc5200-sram";
-+                      reg = <8000 4000>;
-+              };
-+      };
-+
-+      lpb {
-+              model = "fsl,lpb";
-+              compatible = "fsl,lpb";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              ranges = <1 0 50000000 00010000
-+                        2 0 50010000 00010000
-+                        3 0 50020000 00010000>;
-+
-+              // 8-bit DualPort SRAM on LocalPlus Bus CS1
-+              kollmorgen@1,0 {
-+                      compatible = "promess,motionpro-kollmorgen";
-+                      reg = <1 0 10000>;
-+                      interrupts = <1 1 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              // 8-bit board CPLD on LocalPlus Bus CS2
-+              cpld@2,0 {
-+                      compatible = "promess,motionpro-cpld";
-+                      reg = <2 0 10000>;
-+              };
-+
-+              // 8-bit custom Anybus Module on LocalPlus Bus CS3
-+              anybus@3,0 {
-+                      compatible = "promess,motionpro-anybus";
-+                      reg = <3 0 10000>;
-+              };
-+              pro_module_general@3,0 {
-+                      compatible = "promess,pro_module_general";
-+                      reg = <3 0 3>;
-+              };
-+              pro_module_dio@3,800 {
-+                      compatible = "promess,pro_module_dio";
-+                      reg = <3 800 2>;
-+              };
-+      };
-+
-+      pci@f0000d00 {
-+              #interrupt-cells = <1>;
-+              #size-cells = <2>;
-+              #address-cells = <3>;
-+              device_type = "pci";
-+              compatible = "mpc5200b-pci","mpc5200-pci";
-+              reg = <f0000d00 100>;
-+              interrupt-map-mask = <f800 0 0 7>;
-+              interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot
-+                               c000 0 0 2 &mpc5200_pic 1 1 3
-+                               c000 0 0 3 &mpc5200_pic 1 2 3
-+                               c000 0 0 4 &mpc5200_pic 1 3 3
-+
-+                               c800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot
-+                               c800 0 0 2 &mpc5200_pic 1 2 3
-+                               c800 0 0 3 &mpc5200_pic 1 3 3
-+                               c800 0 0 4 &mpc5200_pic 0 0 3>;
-+              clock-frequency = <0>; // From boot loader
-+              interrupts = <2 8 0 2 9 0 2 a 0>;
-+              interrupt-parent = <&mpc5200_pic>;
-+              bus-range = <0 0>;
-+              ranges = <42000000 0 80000000 80000000 0 20000000
-+                        02000000 0 a0000000 a0000000 0 10000000
-+                        01000000 0 00000000 b0000000 0 01000000>;
-+      };
-+};
---- a/arch/powerpc/boot/dts/mpc8313erdb.dts
-+++ b/arch/powerpc/boot/dts/mpc8313erdb.dts
-@@ -15,6 +15,14 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -37,10 +45,58 @@
-               reg = <00000000 08000000>;      // 128MB at 0
-       };
-+      localbus@e0005000 {
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              compatible = "fsl,mpc8313-elbc", "fsl,elbc", "simple-bus";
-+              reg = <e0005000 1000>;
-+              interrupts = <d#77 8>;
-+              interrupt-parent = <&ipic>;
-+
-+              // CS0 and CS1 are swapped when
-+              // booting from nand, but the
-+              // addresses are the same.
-+              ranges = <0 0 fe000000 00800000
-+                        1 0 e2800000 00008000
-+                        2 0 f0000000 00020000
-+                        3 0 fa000000 00008000>;
-+
-+              flash@0,0 {
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      compatible = "cfi-flash";
-+                      reg = <0 0 800000>;
-+                      bank-width = <2>;
-+                      device-width = <1>;
-+              };
-+
-+              nand@1,0 {
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      compatible = "fsl,mpc8313-fcm-nand",
-+                                   "fsl,elbc-fcm-nand";
-+                      reg = <1 0 2000>;
-+
-+                      u-boot@0 {
-+                              reg = <0 100000>;
-+                              read-only;
-+                      };
-+
-+                      kernel@100000 {
-+                              reg = <100000 300000>;
-+                      };
-+
-+                      fs@400000 {
-+                              reg = <400000 1c00000>;
-+                      };
-+              };
-+      };
-+
-       soc8313@e0000000 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               device_type = "soc";
-+              compatible = "simple-bus";
-               ranges = <0 e0000000 00100000>;
-               reg = <e0000000 00000200>;
-               bus-frequency = <0>;
-@@ -52,7 +108,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -61,7 +119,9 @@
-               };
-               i2c@3100 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <f 8>;
-@@ -80,7 +140,6 @@
-               /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-               usb@23000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-dr";
-                       reg = <23000 1000>;
-                       #address-cells = <1>;
-@@ -91,11 +150,10 @@
-               };
-               mdio@24520 {
--                      device_type = "mdio";
--                      compatible = "gianfar";
--                      reg = <24520 20>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <24520 20>;
-                       phy1: ethernet-phy@1 {
-                               interrupt-parent = < &ipic >;
-                               interrupts = <13 8>;
-@@ -110,7 +168,8 @@
-                       };
-               };
--              ethernet@24000 {
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -121,7 +180,8 @@
-                       phy-handle = < &phy1 >;
-               };
--              ethernet@25000 {
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -132,7 +192,8 @@
-                       phy-handle = < &phy4 >;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -141,7 +202,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -179,7 +241,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc832x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_mds.dts
-@@ -7,6 +7,18 @@
-  * under  the terms of  the GNU General  Public License as published by the
-  * Free Software Foundation;  either version 2 of the  License, or (at your
-  * option) any later version.
-+
-+ * To enable external serial I/O on a Freescale MPC 8323 SYS/MDS board, do
-+ * this:
-+ *
-+ * 1) On chip U61, lift (disconnect) pins 21 (TXD) and 22 (RXD) from the board.
-+ * 2) Solder a wire from U61-21 to P19A-23.  P19 is a grid of pins on the board
-+ *    next to the serial ports.
-+ * 3) Solder a wire from U61-22 to P19K-22.
-+ *
-+ * Note that there's a typo in the schematic.  The board labels the last column
-+ * of pins "P19K", but in the schematic, that column is called "P19J".  So if
-+ * you're going by the schematic, the pin is called "P19J-K22".
-  */
- / {
-@@ -15,6 +27,14 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -59,7 +79,7 @@
-               i2c@3000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -72,7 +92,8 @@
-                       };
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -81,7 +102,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -159,6 +181,23 @@
-                                       1 1e  1  0  1  0        /* TX_EN */
-                                       1 1f  2  0  1  0>;/* CRS */
-                       };
-+                      pio5: ucc_pin@05 {
-+                              pio-map = <
-+                              /*
-+                               *                    open       has
-+                               *   port  pin  dir  drain  sel  irq
-+                               */
-+                                      2    0    1      0    2    0  /* TxD5 */
-+                                      2    8    2      0    2    0  /* RxD5 */
-+
-+                                      2   1d    2      0    0    0  /* CTS5 */
-+                                      2   1f    1      0    2    0  /* RTS5 */
-+
-+                                      2   18    2      0    0    0  /* CD */
-+
-+                              >;
-+                      };
-+
-               };
-       };
-@@ -166,6 +205,7 @@
-               #address-cells = <1>;
-               #size-cells = <1>;
-               device_type = "qe";
-+              compatible = "fsl,qe";
-               model = "QE";
-               ranges = <0 e0100000 00100000>;
-               reg = <e0100000 480>;
-@@ -200,7 +240,6 @@
-               };
-               usb@6c0 {
--                      device_type = "usb";
-                       compatible = "qe_udc";
-                       reg = <6c0 40 8B00 100>;
-                       interrupts = <b>;
-@@ -208,48 +247,58 @@
-                       mode = "slave";
-               };
--              ucc@2200 {
-+              enet0: ucc@2200 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <3>;
-                       device-id = <3>;
-                       reg = <2200 200>;
-                       interrupts = <22>;
-                       interrupt-parent = < &qeic >;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <19>;
--                      tx-clock = <1a>;
-+                      rx-clock-name = "clk9";
-+                      tx-clock-name = "clk10";
-                       phy-handle = < &phy3 >;
-                       pio-handle = < &pio3 >;
-               };
--              ucc@3200 {
-+              enet1: ucc@3200 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <4>;
-                       device-id = <4>;
-                       reg = <3200 200>;
-                       interrupts = <23>;
-                       interrupt-parent = < &qeic >;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <17>;
--                      tx-clock = <18>;
-+                      rx-clock-name = "clk7";
-+                      tx-clock-name = "clk8";
-                       phy-handle = < &phy4 >;
-                       pio-handle = < &pio4 >;
-               };
-+              ucc@2400 {
-+                      device_type = "serial";
-+                      compatible = "ucc_uart";
-+                      model = "UCC";
-+                      device-id = <5>;        /* The UCC number, 1-7*/
-+                      port-number = <0>;      /* Which ttyQEx device */
-+                      soft-uart;              /* We need Soft-UART */
-+                      reg = <2400 200>;
-+                      interrupts = <28>;      /* From Table 18-12 */
-+                      interrupt-parent = < &qeic >;
-+                      /*
-+                       * For Soft-UART, we need to set TX to 1X, which
-+                       * means specifying separate clock sources.
-+                       */
-+                      rx-clock-name = "brg5";
-+                      tx-clock-name = "brg6";
-+                      pio-handle = < &pio5 >;
-+              };
-+
-+
-               mdio@2320 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-@@ -283,7 +332,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                               /* IDSEL 0x11 AD17 */
---- a/arch/powerpc/boot/dts/mpc832x_rdb.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts
-@@ -15,6 +15,14 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -52,7 +60,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -60,7 +70,8 @@
-                       dfsrr;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -69,7 +80,8 @@
-                       interrupt-parent = <&pic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -187,44 +199,34 @@
-                       mode = "cpu";
-               };
--              ucc@3000 {
-+              enet0: ucc@3000 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <2>;
-                       device-id = <2>;
-                       reg = <3000 200>;
-                       interrupts = <21>;
-                       interrupt-parent = <&qeic>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <20>;
--                      tx-clock = <13>;
-+                      rx-clock-name = "clk16";
-+                      tx-clock-name = "clk3";
-                       phy-handle = <&phy00>;
-                       pio-handle = <&ucc2pio>;
-               };
--              ucc@2200 {
-+              enet1: ucc@2200 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <3>;
-                       device-id = <3>;
-                       reg = <2200 200>;
-                       interrupts = <22>;
-                       interrupt-parent = <&qeic>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <19>;
--                      tx-clock = <1a>;
-+                      rx-clock-name = "clk9";
-+                      tx-clock-name = "clk10";
-                       phy-handle = <&phy04>;
-                       pio-handle = <&ucc3pio>;
-               };
-@@ -262,7 +264,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                               /* IDSEL 0x10 AD16 (USB) */
---- a/arch/powerpc/boot/dts/mpc8349emitx.dts
-+++ b/arch/powerpc/boot/dts/mpc8349emitx.dts
-@@ -14,6 +14,15 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -51,7 +60,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -60,7 +71,9 @@
-               };
-               i2c@3100 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <f 8>;
-@@ -78,7 +91,6 @@
-               };
-               usb@22000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-mph";
-                       reg = <22000 1000>;
-                       #address-cells = <1>;
-@@ -90,7 +102,6 @@
-               };
-               usb@23000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-dr";
-                       reg = <23000 1000>;
-                       #address-cells = <1>;
-@@ -102,11 +113,10 @@
-               };
-               mdio@24520 {
--                      device_type = "mdio";
--                      compatible = "gianfar";
--                      reg = <24520 20>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <24520 20>;
-                       /* Vitesse 8201 */
-                       phy1c: ethernet-phy@1c {
-@@ -115,27 +125,14 @@
-                               reg = <1c>;
-                               device_type = "ethernet-phy";
-                       };
--
--                      /* Vitesse 7385 */
--                      phy1f: ethernet-phy@1f {
--                              interrupt-parent = < &ipic >;
--                              interrupts = <12 8>;
--                              reg = <1f>;
--                              device_type = "ethernet-phy";
--                      };
-               };
--              ethernet@24000 {
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <20 8 21 8 22 8>;
-                       interrupt-parent = < &ipic >;
-@@ -143,27 +140,22 @@
-                       linux,network-index = <0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 8 24 8 25 8>;
-                       interrupt-parent = < &ipic >;
--                      phy-handle = < &phy1f >;
-+                      /* Vitesse 7385 isn't on the MDIO bus */
-+                      fixed-link = <1 1 d#1000 0 0>;
-                       linux,network-index = <1>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -172,7 +164,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -203,7 +196,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                               /* IDSEL 0x10 - SATA */
-@@ -224,7 +218,8 @@
-               device_type = "pci";
-       };
--      pci@e0008600 {
-+      pci1: pci@e0008600 {
-+              cell-index = <2>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                               /* IDSEL 0x0E - MiniPCI Slot */
-@@ -249,6 +244,21 @@
-               device_type = "pci";
-       };
--
--
-+      localbus@e0005000 {
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              compatible = "fsl,mpc8349e-localbus",
-+                           "fsl,pq2pro-localbus";
-+              reg = <e0005000 d8>;
-+              ranges = <3 0 f0000000 210>;
-+
-+              pata@3,0 {
-+                      compatible = "fsl,mpc8349emitx-pata", "ata-generic";
-+                      reg = <3 0 10 3 20c 4>;
-+                      reg-shift = <1>;
-+                      pio-mode = <6>;
-+                      interrupts = <17 8>;
-+                      interrupt-parent = <&ipic>;
-+              };
-+      };
- };
---- a/arch/powerpc/boot/dts/mpc8349emitxgp.dts
-+++ b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
-@@ -14,6 +14,13 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -51,7 +58,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -60,7 +69,9 @@
-               };
-               i2c@3100 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <f 8>;
-@@ -78,7 +89,6 @@
-               };
-               usb@23000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-dr";
-                       reg = <23000 1000>;
-                       #address-cells = <1>;
-@@ -90,11 +100,10 @@
-               };
-               mdio@24520 {
--                      device_type = "mdio";
--                      compatible = "gianfar";
--                      reg = <24520 20>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <24520 20>;
-                       /* Vitesse 8201 */
-                       phy1c: ethernet-phy@1c {
-@@ -105,7 +114,8 @@
-                       };
-               };
--              ethernet@24000 {
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -117,7 +127,8 @@
-                       linux,network-index = <0>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -126,7 +137,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -157,7 +169,8 @@
-               };
-       };
--      pci@e0008600 {
-+      pci0: pci@e0008600 {
-+              cell-index = <2>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                               /* IDSEL 0x0F - PCI Slot */
---- a/arch/powerpc/boot/dts/mpc834x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc834x_mds.dts
-@@ -15,6 +15,15 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -59,7 +68,7 @@
-               i2c@3000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -75,7 +84,7 @@
-               i2c@3100 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <f 8>;
-@@ -95,7 +104,6 @@
-               /* phy type (ULPI or SERIAL) are only types supportted for MPH */
-               /* port = 0 or 1 */
-               usb@22000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-mph";
-                       reg = <22000 1000>;
-                       #address-cells = <1>;
-@@ -107,7 +115,6 @@
-               };
-               /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-               usb@23000 {
--                      device_type = "usb";
-                       compatible = "fsl-usb2-dr";
-                       reg = <23000 1000>;
-                       #address-cells = <1>;
-@@ -119,11 +126,11 @@
-               };
-               mdio@24520 {
--                      device_type = "mdio";
--                      compatible = "gianfar";
--                      reg = <24520 20>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = < &ipic >;
-                               interrupts = <11 8>;
-@@ -138,17 +145,12 @@
-                       };
-               };
--              ethernet@24000 {
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <20 8 21 8 22 8>;
-                       interrupt-parent = < &ipic >;
-@@ -156,19 +158,12 @@
-                       linux,network-index = <0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 8 24 8 25 8>;
-                       interrupt-parent = < &ipic >;
-@@ -176,7 +171,8 @@
-                       linux,network-index = <1>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -185,7 +181,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -225,7 +222,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-@@ -285,7 +283,8 @@
-               device_type = "pci";
-       };
--      pci@e0008600 {
-+      pci1: pci@e0008600 {
-+              cell-index = <2>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc836x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc836x_mds.dts
-@@ -20,6 +20,14 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -64,7 +72,7 @@
-               i2c@3000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <e 8>;
-@@ -80,7 +88,7 @@
-               i2c@3100 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <f 8>;
-@@ -88,7 +96,8 @@
-                       dfsrr;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -97,7 +106,8 @@
-                       interrupt-parent = < &ipic >;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -231,7 +241,6 @@
-               };
-               usb@6c0 {
--                      device_type = "usb";
-                       compatible = "qe_udc";
-                       reg = <6c0 40 8B00 100>;
-                       interrupts = <b>;
-@@ -239,45 +248,35 @@
-                       mode = "slave";
-               };
--              ucc@2000 {
-+              enet0: ucc@2000 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <1>;
-                       device-id = <1>;
-                       reg = <2000 200>;
-                       interrupts = <20>;
-                       interrupt-parent = < &qeic >;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <0>;
--                      tx-clock = <19>;
-+                      rx-clock-name = "none";
-+                      tx-clock-name = "clk9";
-                       phy-handle = < &phy0 >;
-                       phy-connection-type = "rgmii-id";
-                       pio-handle = < &pio1 >;
-               };
--              ucc@3000 {
-+              enet1: ucc@3000 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <2>;
-                       device-id = <2>;
-                       reg = <3000 200>;
-                       interrupts = <21>;
-                       interrupt-parent = < &qeic >;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <0>;
--                      tx-clock = <14>;
-+                      rx-clock-name = "none";
-+                      tx-clock-name = "clk4";
-                       phy-handle = < &phy1 >;
-                       phy-connection-type = "rgmii-id";
-                       pio-handle = < &pio2 >;
-@@ -316,7 +315,8 @@
-               };
-       };
--      pci@e0008500 {
-+      pci0: pci@e0008500 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8377_mds.dts
-@@ -0,0 +1,279 @@
-+/*
-+ * MPC8377E MDS Device Tree Source
-+ *
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+      model = "fsl,mpc8377emds";
-+      compatible = "fsl,mpc8377emds","fsl,mpc837xmds";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,8377@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <0x20>;
-+                      i-cache-line-size = <0x20>;
-+                      d-cache-size = <0x8000>;                // L1, 32K
-+                      i-cache-size = <0x8000>;                // L1, 32K
-+                      timebase-frequency = <0>;
-+                      bus-frequency = <0>;
-+                      clock-frequency = <0>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0x00000000 0x20000000>;  // 512MB at 0
-+      };
-+
-+      soc@e0000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              device_type = "soc";
-+              ranges = <0x0 0xe0000000 0x00100000>;
-+              reg = <0xe0000000 0x00000200>;
-+              bus-frequency = <0>;
-+
-+              wdt@200 {
-+                      compatible = "mpc83xx_wdt";
-+                      reg = <0x200 0x100>;
-+              };
-+
-+              i2c@3000 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3000 0x100>;
-+                      interrupts = <0xe 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              i2c@3100 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3100 0x100>;
-+                      interrupts = <0xf 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              spi@7000 {
-+                      compatible = "fsl_spi";
-+                      reg = <0x7000 0x1000>;
-+                      interrupts = <0x10 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      mode = "cpu";
-+              };
-+
-+              /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+              usb@23000 {
-+                      compatible = "fsl-usb2-dr";
-+                      reg = <0x23000 0x1000>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      interrupt-parent = < &ipic >;
-+                      interrupts = <0x26 0x8>;
-+                      phy_type = "utmi_wide";
-+              };
-+
-+              mdio@24520 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <0x24520 0x20>;
-+                      phy2: ethernet-phy@2 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x11 0x8>;
-+                              reg = <2>;
-+                              device_type = "ethernet-phy";
-+                      };
-+                      phy3: ethernet-phy@3 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x12 0x8>;
-+                              reg = <3>;
-+                              device_type = "ethernet-phy";
-+                      };
-+              };
-+
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x24000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy2 >;
-+              };
-+
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x25000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy3 >;
-+              };
-+
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4500 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0x9 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4600 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0xa 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              crypto@30000 {
-+                      model = "SEC3";
-+                      compatible = "talitos";
-+                      reg = <0x30000 0x10000>;
-+                      interrupts = <0xb 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      /* Rev. 3.0 geometry */
-+                      num-channels = <4>;
-+                      channel-fifo-len = <0x18>;
-+                      exec-units-mask = <0x000001fe>;
-+                      descriptor-types-mask = <0x03ab0ebf>;
-+              };
-+
-+              sdhc@2e000 {
-+                      model = "eSDHC";
-+                      compatible = "fsl,esdhc";
-+                      reg = <0x2e000 0x1000>;
-+                      interrupts = <0x2a 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@18000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x18000 0x1000>;
-+                      interrupts = <0x2c 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@19000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x19000 0x1000>;
-+                      interrupts = <0x2d 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              /* IPIC
-+               * interrupts cell = <intr #, sense>
-+               * sense values match linux IORESOURCE_IRQ_* defines:
-+               * sense == 8: Level, low assertion
-+               * sense == 2: Edge, high-to-low change
-+               */
-+              ipic: pic@700 {
-+                      compatible = "fsl,ipic";
-+                      interrupt-controller;
-+                      #address-cells = <0>;
-+                      #interrupt-cells = <2>;
-+                      reg = <0x700 0x100>;
-+              };
-+      };
-+
-+      pci0: pci@e0008500 {
-+              cell-index = <0>;
-+              interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+              interrupt-map = <
-+
-+                              /* IDSEL 0x11 */
-+                               0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x12 */
-+                               0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x13 */
-+                               0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x15 */
-+                               0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x16 */
-+                               0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x17 */
-+                               0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x18 */
-+                               0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+                               0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+                               0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+                               0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+              interrupt-parent = < &ipic >;
-+              interrupts = <0x42 0x8>;
-+              bus-range = <0 0>;
-+              ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+                        0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+                        0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+              clock-frequency = <0>;
-+              #interrupt-cells = <1>;
-+              #size-cells = <2>;
-+              #address-cells = <3>;
-+              reg = <0xe0008500 0x100>;
-+              compatible = "fsl,mpc8349-pci";
-+              device_type = "pci";
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8378_mds.dts
-@@ -0,0 +1,265 @@
-+/*
-+ * MPC8378E MDS Device Tree Source
-+ *
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+      model = "fsl,mpc8378emds";
-+      compatible = "fsl,mpc8378emds","fsl,mpc837xmds";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,8378@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <0x20>;
-+                      i-cache-line-size = <0x20>;
-+                      d-cache-size = <0x8000>;                // L1, 32K
-+                      i-cache-size = <0x8000>;                // L1, 32K
-+                      timebase-frequency = <0>;
-+                      bus-frequency = <0>;
-+                      clock-frequency = <0>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0x00000000 0x20000000>;  // 512MB at 0
-+      };
-+
-+      soc@e0000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              device_type = "soc";
-+              ranges = <0x0 0xe0000000 0x00100000>;
-+              reg = <0xe0000000 0x00000200>;
-+              bus-frequency = <0>;
-+
-+              wdt@200 {
-+                      compatible = "mpc83xx_wdt";
-+                      reg = <0x200 0x100>;
-+              };
-+
-+              i2c@3000 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3000 0x100>;
-+                      interrupts = <0xe 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              i2c@3100 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3100 0x100>;
-+                      interrupts = <0xf 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              spi@7000 {
-+                      compatible = "fsl_spi";
-+                      reg = <0x7000 0x1000>;
-+                      interrupts = <0x10 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      mode = "cpu";
-+              };
-+
-+              /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+              usb@23000 {
-+                      compatible = "fsl-usb2-dr";
-+                      reg = <0x23000 0x1000>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      interrupt-parent = < &ipic >;
-+                      interrupts = <0x26 0x8>;
-+                      phy_type = "utmi_wide";
-+              };
-+
-+              mdio@24520 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <0x24520 0x20>;
-+                      phy2: ethernet-phy@2 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x11 0x8>;
-+                              reg = <2>;
-+                              device_type = "ethernet-phy";
-+                      };
-+                      phy3: ethernet-phy@3 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x12 0x8>;
-+                              reg = <3>;
-+                              device_type = "ethernet-phy";
-+                      };
-+              };
-+
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x24000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy2 >;
-+              };
-+
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x25000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy3 >;
-+              };
-+
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4500 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0x9 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4600 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0xa 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              crypto@30000 {
-+                      model = "SEC3";
-+                      compatible = "talitos";
-+                      reg = <0x30000 0x10000>;
-+                      interrupts = <0xb 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      /* Rev. 3.0 geometry */
-+                      num-channels = <4>;
-+                      channel-fifo-len = <0x18>;
-+                      exec-units-mask = <0x000001fe>;
-+                      descriptor-types-mask = <0x03ab0ebf>;
-+              };
-+
-+              sdhc@2e000 {
-+                      model = "eSDHC";
-+                      compatible = "fsl,esdhc";
-+                      reg = <0x2e000 0x1000>;
-+                      interrupts = <0x2a 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              /* IPIC
-+               * interrupts cell = <intr #, sense>
-+               * sense values match linux IORESOURCE_IRQ_* defines:
-+               * sense == 8: Level, low assertion
-+               * sense == 2: Edge, high-to-low change
-+               */
-+              ipic: pic@700 {
-+                      compatible = "fsl,ipic";
-+                      interrupt-controller;
-+                      #address-cells = <0>;
-+                      #interrupt-cells = <2>;
-+                      reg = <0x700 0x100>;
-+              };
-+      };
-+
-+      pci0: pci@e0008500 {
-+              cell-index = <0>;
-+              interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+              interrupt-map = <
-+
-+                              /* IDSEL 0x11 */
-+                               0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x12 */
-+                               0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x13 */
-+                               0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x15 */
-+                               0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x16 */
-+                               0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x17 */
-+                               0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x18 */
-+                               0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+                               0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+                               0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+                               0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+              interrupt-parent = < &ipic >;
-+              interrupts = <0x42 0x8>;
-+              bus-range = <0 0>;
-+              ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+                        0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+                        0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+              clock-frequency = <0>;
-+              #interrupt-cells = <1>;
-+              #size-cells = <2>;
-+              #address-cells = <3>;
-+              reg = <0xe0008500 0x100>;
-+              compatible = "fsl,mpc8349-pci";
-+              device_type = "pci";
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8379_mds.dts
-@@ -0,0 +1,293 @@
-+/*
-+ * MPC8379E MDS Device Tree Source
-+ *
-+ * Copyright 2007 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.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+      model = "fsl,mpc8379emds";
-+      compatible = "fsl,mpc8379emds","fsl,mpc837xmds";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,8379@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <0x20>;
-+                      i-cache-line-size = <0x20>;
-+                      d-cache-size = <0x8000>;                // L1, 32K
-+                      i-cache-size = <0x8000>;                // L1, 32K
-+                      timebase-frequency = <0>;
-+                      bus-frequency = <0>;
-+                      clock-frequency = <0>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0x00000000 0x20000000>;  // 512MB at 0
-+      };
-+
-+      soc@e0000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              device_type = "soc";
-+              ranges = <0x0 0xe0000000 0x00100000>;
-+              reg = <0xe0000000 0x00000200>;
-+              bus-frequency = <0>;
-+
-+              wdt@200 {
-+                      compatible = "mpc83xx_wdt";
-+                      reg = <0x200 0x100>;
-+              };
-+
-+              i2c@3000 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3000 0x100>;
-+                      interrupts = <0xe 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              i2c@3100 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-+                      reg = <0x3100 0x100>;
-+                      interrupts = <0xf 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      dfsrr;
-+              };
-+
-+              spi@7000 {
-+                      compatible = "fsl_spi";
-+                      reg = <0x7000 0x1000>;
-+                      interrupts = <0x10 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      mode = "cpu";
-+              };
-+
-+              /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+              usb@23000 {
-+                      compatible = "fsl-usb2-dr";
-+                      reg = <0x23000 0x1000>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      interrupt-parent = < &ipic >;
-+                      interrupts = <0x26 0x8>;
-+                      phy_type = "utmi_wide";
-+              };
-+
-+              mdio@24520 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <0x24520 0x20>;
-+                      phy2: ethernet-phy@2 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x11 0x8>;
-+                              reg = <2>;
-+                              device_type = "ethernet-phy";
-+                      };
-+                      phy3: ethernet-phy@3 {
-+                              interrupt-parent = < &ipic >;
-+                              interrupts = <0x12 0x8>;
-+                              reg = <3>;
-+                              device_type = "ethernet-phy";
-+                      };
-+              };
-+
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x24000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy2 >;
-+              };
-+
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-+                      device_type = "network";
-+                      model = "eTSEC";
-+                      compatible = "gianfar";
-+                      reg = <0x25000 0x1000>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-+                      interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+                      phy-connection-type = "mii";
-+                      interrupt-parent = < &ipic >;
-+                      phy-handle = < &phy3 >;
-+              };
-+
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4500 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0x9 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <0x4600 0x100>;
-+                      clock-frequency = <0>;
-+                      interrupts = <0xa 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              crypto@30000 {
-+                      model = "SEC3";
-+                      compatible = "talitos";
-+                      reg = <0x30000 0x10000>;
-+                      interrupts = <0xb 0x8>;
-+                      interrupt-parent = < &ipic >;
-+                      /* Rev. 3.0 geometry */
-+                      num-channels = <4>;
-+                      channel-fifo-len = <0x18>;
-+                      exec-units-mask = <0x000001fe>;
-+                      descriptor-types-mask = <0x03ab0ebf>;
-+              };
-+
-+              sdhc@2e000 {
-+                      model = "eSDHC";
-+                      compatible = "fsl,esdhc";
-+                      reg = <0x2e000 0x1000>;
-+                      interrupts = <0x2a 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@18000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x18000 0x1000>;
-+                      interrupts = <0x2c 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@19000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x19000 0x1000>;
-+                      interrupts = <0x2d 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@1a000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x1a000 0x1000>;
-+                      interrupts = <0x2e 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              sata@1b000 {
-+                      compatible = "fsl,mpc8379-sata";
-+                      reg = <0x1b000 0x1000>;
-+                      interrupts = <0x2f 0x8>;
-+                      interrupt-parent = < &ipic >;
-+              };
-+
-+              /* IPIC
-+               * interrupts cell = <intr #, sense>
-+               * sense values match linux IORESOURCE_IRQ_* defines:
-+               * sense == 8: Level, low assertion
-+               * sense == 2: Edge, high-to-low change
-+               */
-+              ipic: pic@700 {
-+                      compatible = "fsl,ipic";
-+                      interrupt-controller;
-+                      #address-cells = <0>;
-+                      #interrupt-cells = <2>;
-+                      reg = <0x700 0x100>;
-+              };
-+      };
-+
-+      pci0: pci@e0008500 {
-+              cell-index = <0>;
-+              interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+              interrupt-map = <
-+
-+                              /* IDSEL 0x11 */
-+                               0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x12 */
-+                               0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x13 */
-+                               0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x15 */
-+                               0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+                               0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+                               0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+                               0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+                              /* IDSEL 0x16 */
-+                               0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+                               0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+                               0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+                               0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+                              /* IDSEL 0x17 */
-+                               0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+                               0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+                               0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+                               0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+                              /* IDSEL 0x18 */
-+                               0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+                               0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+                               0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+                               0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+              interrupt-parent = < &ipic >;
-+              interrupts = <0x42 0x8>;
-+              bus-range = <0 0>;
-+              ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+                        0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+                        0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+              clock-frequency = <0>;
-+              #interrupt-cells = <1>;
-+              #size-cells = <2>;
-+              #address-cells = <3>;
-+              reg = <0xe0008500 0x100>;
-+              compatible = "fsl,mpc8349-pci";
-+              device_type = "pci";
-+      };
-+};
---- a/arch/powerpc/boot/dts/mpc8540ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8540ads.dts
-@@ -16,6 +16,15 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              ethernet2 = &enet2;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -63,7 +72,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <5 1>;
-@@ -97,64 +108,44 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <1d 2 1e 2 22 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 2 24 2 28 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy1>;
-               };
--              ethernet@26000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet2: ethernet@26000 {
-+                      cell-index = <2>;
-                       device_type = "network";
-                       model = "FEC";
-                       compatible = "gianfar";
-                       reg = <26000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <29 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy3>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;       // reg base, size
-@@ -163,7 +154,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;       // reg base, size
-@@ -183,7 +175,8 @@
-               };
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc8541cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8541cds.dts
-@@ -16,6 +16,15 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -63,7 +72,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <5 1>;
-@@ -91,9 +102,8 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -104,9 +114,8 @@
-                       phy-handle = <&phy0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -117,7 +126,8 @@
-                       phy-handle = <&phy1>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;       // reg base, size
-@@ -126,7 +136,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;       // reg base, size
-@@ -183,7 +194,8 @@
-               };
-       };
--      pci1: pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               interrupt-map-mask = <1f800 0 0 7>;
-               interrupt-map = <
-@@ -250,11 +262,12 @@
-                       #interrupt-cells = <2>;
-                       compatible = "chrp,iic";
-                       interrupts = <1>;
--                      interrupt-parent = <&pci1>;
-+                      interrupt-parent = <&pci0>;
-               };
-       };
--      pci@e0009000 {
-+      pci1: pci@e0009000 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc8544ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8544ds.dts
-@@ -15,6 +15,17 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+              pci2 = &pci2;
-+              pci3 = &pci3;
-+      };
-+
-       cpus {
-               #cpus = <1>;
-               #address-cells = <1>;
-@@ -64,7 +75,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -72,12 +85,23 @@
-                       dfsrr;
-               };
-+              i2c@3100 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-+                      reg = <3100 100>;
-+                      interrupts = <2b 2>;
-+                      interrupt-parent = <&mpic>;
-+                      dfsrr;
-+              };
-+
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <a 1>;
-@@ -92,9 +116,8 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -106,9 +129,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@26000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@26000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -120,7 +142,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -129,7 +152,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -156,7 +180,8 @@
-               };
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               compatible = "fsl,mpc8540-pci";
-               device_type = "pci";
-               interrupt-map-mask = <f800 0 0 7>;
-@@ -187,7 +212,8 @@
-               reg = <e0008000 1000>;
-       };
--      pcie@e0009000 {
-+      pci1: pcie@e0009000 {
-+              cell-index = <1>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -223,7 +249,8 @@
-               };
-       };
--      pcie@e000a000 {
-+      pci2: pcie@e000a000 {
-+              cell-index = <2>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -259,7 +286,8 @@
-               };
-       };
--      pcie@e000b000 {
-+      pci3: pcie@e000b000 {
-+              cell-index = <3>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -276,9 +304,9 @@
-               interrupt-map = <
-                       // IDSEL 0x1c  USB
-                       e000 0 0 1 &i8259 c 2
--                      e100 0 0 1 &i8259 9 2
--                      e200 0 0 1 &i8259 a 2
--                      e300 0 0 1 &i8259 b 2
-+                      e100 0 0 2 &i8259 9 2
-+                      e200 0 0 3 &i8259 a 2
-+                      e300 0 0 4 &i8259 b 2
-                       // IDSEL 0x1d  Audio
-                       e800 0 0 1 &i8259 6 2
-@@ -369,6 +397,5 @@
-                               };
-                       };
-               };
--
-       };
- };
---- a/arch/powerpc/boot/dts/mpc8548cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8548cds.dts
-@@ -16,6 +16,20 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+/*
-+              ethernet2 = &enet2;
-+              ethernet3 = &enet3;
-+*/
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+              pci2 = &pci2;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -63,7 +77,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -71,12 +87,23 @@
-                       dfsrr;
-               };
-+              i2c@3100 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-+                      reg = <3100 100>;
-+                      interrupts = <2b 2>;
-+                      interrupt-parent = <&mpic>;
-+                      dfsrr;
-+              };
-+
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <5 1>;
-@@ -103,9 +130,8 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -116,9 +142,8 @@
-                       phy-handle = <&phy0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -130,9 +155,8 @@
-               };
- /* eTSEC 3/4 are currently broken
--              ethernet@26000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet2: ethernet@26000 {
-+                      cell-index = <2>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -143,9 +167,8 @@
-                       phy-handle = <&phy2>;
-               };
--              ethernet@27000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet3: ethernet@27000 {
-+                      cell-index = <3>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -157,7 +180,8 @@
-               };
-  */
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;       // reg base, size
-@@ -166,7 +190,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;       // reg base, size
-@@ -193,7 +218,8 @@
-               };
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x4 (PCIX Slot 2) */
-@@ -342,7 +368,8 @@
-               };
-       };
--      pci@e0009000 {
-+      pci1: pci@e0009000 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-@@ -366,7 +393,8 @@
-               device_type = "pci";
-       };
--      pcie@e000a000 {
-+      pci2: pcie@e000a000 {
-+              cell-index = <2>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc8555cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8555cds.dts
-@@ -16,6 +16,15 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -63,7 +72,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <5 1>;
-@@ -91,9 +102,8 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -104,9 +114,8 @@
-                       phy-handle = <&phy0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-@@ -117,7 +126,8 @@
-                       phy-handle = <&phy1>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;       // reg base, size
-@@ -126,7 +136,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;       // reg base, size
-@@ -183,7 +194,8 @@
-               };
-       };
--      pci1: pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               interrupt-map-mask = <1f800 0 0 7>;
-               interrupt-map = <
-@@ -250,11 +262,12 @@
-                       #interrupt-cells = <2>;
-                       compatible = "chrp,iic";
-                       interrupts = <1>;
--                      interrupt-parent = <&pci1>;
-+                      interrupt-parent = <&pci0>;
-               };
-       };
--      pci@e0009000 {
-+      pci1: pci@e0009000 {
-+              cell-index = <1>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc8560ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8560ads.dts
-@@ -16,6 +16,16 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              ethernet2 = &enet2;
-+              ethernet3 = &enet3;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -63,11 +73,11 @@
-               };
-               mdio@24520 {
--                      device_type = "mdio";
--                      compatible = "gianfar";
--                      reg = <24520 20>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      compatible = "fsl,gianfar-mdio";
-+                      reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <5 1>;
-@@ -94,36 +104,24 @@
-                       };
-               };
--              ethernet@24000 {
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <1d 2 1e 2 22 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy0>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 2 24 2 28 2>;
-                       interrupt-parent = <&mpic>;
-@@ -174,7 +172,7 @@
-                               compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
-                       };
--                      serial@91a00 {
-+                      serial0: serial@91a00 {
-                               device_type = "serial";
-                               compatible = "fsl,mpc8560-scc-uart",
-                                            "fsl,cpm2-scc-uart";
-@@ -186,7 +184,7 @@
-                               interrupt-parent = <&cpmpic>;
-                       };
--                      serial@91a20 {
-+                      serial1: serial@91a20 {
-                               device_type = "serial";
-                               compatible = "fsl,mpc8560-scc-uart",
-                                            "fsl,cpm2-scc-uart";
-@@ -198,17 +196,11 @@
-                               interrupt-parent = <&cpmpic>;
-                       };
--                      ethernet@91320 {
-+                      enet2: ethernet@91320 {
-                               device_type = "network";
-                               compatible = "fsl,mpc8560-fcc-enet",
-                                            "fsl,cpm2-fcc-enet";
-                               reg = <91320 20 88500 100 913b0 1>;
--                              /*
--                               * mac-address is deprecated and will be removed
--                               * in 2.6.25.  Only recent versions of
--                               * U-Boot support local-mac-address, however.
--                               */
--                              mac-address = [ 00 00 00 00 00 00 ];
-                               local-mac-address = [ 00 00 00 00 00 00 ];
-                               fsl,cpm-command = <16200300>;
-                               interrupts = <21 8>;
-@@ -216,17 +208,11 @@
-                               phy-handle = <&phy2>;
-                       };
--                      ethernet@91340 {
-+                      enet3: ethernet@91340 {
-                               device_type = "network";
-                               compatible = "fsl,mpc8560-fcc-enet",
-                                            "fsl,cpm2-fcc-enet";
-                               reg = <91340 20 88600 100 913d0 1>;
--                              /*
--                               * mac-address is deprecated and will be removed
--                               * in 2.6.25.  Only recent versions of
--                               * U-Boot support local-mac-address, however.
--                               */
--                              mac-address = [ 00 00 00 00 00 00 ];
-                               local-mac-address = [ 00 00 00 00 00 00 ];
-                               fsl,cpm-command = <1a400300>;
-                               interrupts = <22 8>;
-@@ -236,7 +222,8 @@
-               };
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               #interrupt-cells = <1>;
-               #size-cells = <2>;
-               #address-cells = <3>;
---- a/arch/powerpc/boot/dts/mpc8568mds.dts
-+++ b/arch/powerpc/boot/dts/mpc8568mds.dts
-@@ -20,6 +20,17 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              ethernet2 = &enet2;
-+              ethernet3 = &enet3;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -74,7 +85,7 @@
-               i2c@3000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -90,7 +101,7 @@
-               i2c@3100 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "i2c";
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <2b 2>;
-@@ -101,9 +112,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@7 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <1 1>;
-@@ -130,45 +141,32 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <1d 2 1e 2 22 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy2>;
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 2 24 2 28 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy3>;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -183,7 +181,8 @@
-                       fsl,has-rstcr;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -318,45 +317,35 @@
-                       mode = "cpu";
-               };
--              ucc@2000 {
-+              enet2: ucc@2000 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <1>;
-                       device-id = <1>;
-                       reg = <2000 200>;
-                       interrupts = <20>;
-                       interrupt-parent = <&qeic>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <0>;
--                      tx-clock = <20>;
-+                      rx-clock-name = "none";
-+                      tx-clock-name = "clk16";
-                       pio-handle = <&pio1>;
-                       phy-handle = <&phy0>;
-                       phy-connection-type = "rgmii-id";
-               };
--              ucc@3000 {
-+              enet3: ucc@3000 {
-                       device_type = "network";
-                       compatible = "ucc_geth";
-                       model = "UCC";
-+                      cell-index = <2>;
-                       device-id = <2>;
-                       reg = <3000 200>;
-                       interrupts = <21>;
-                       interrupt-parent = <&qeic>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
--                      rx-clock = <0>;
--                      tx-clock = <20>;
-+                      rx-clock-name = "none";
-+                      tx-clock-name = "clk16";
-                       pio-handle = <&pio2>;
-                       phy-handle = <&phy1>;
-                       phy-connection-type = "rgmii-id";
-@@ -366,7 +355,6 @@
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <2120 18>;
--                      device_type = "mdio";
-                       compatible = "ucc_geth_phy";
-                       /* These are the same PHYs as on
-@@ -410,7 +398,8 @@
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x12 AD18 */
-@@ -440,7 +429,8 @@
-       };
-       /* PCI Express */
--      pcie@e000a000 {
-+      pci1: pcie@e000a000 {
-+              cell-index = <2>;
-               interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
---- a/arch/powerpc/boot/dts/mpc8572ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8572ds.dts
-@@ -15,6 +15,18 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              ethernet2 = &enet2;
-+              ethernet3 = &enet3;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+              pci2 = &pci2;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -69,7 +81,9 @@
-               };
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -78,7 +92,9 @@
-               };
-               i2c@3100 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <2b 2>;
-@@ -89,9 +105,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <a 1>;
-@@ -114,9 +130,8 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -128,9 +143,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -142,9 +156,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@26000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet2: ethernet@26000 {
-+                      cell-index = <2>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -156,9 +169,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@27000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet3: ethernet@27000 {
-+                      cell-index = <3>;
-                       device_type = "network";
-                       model = "eTSEC";
-                       compatible = "gianfar";
-@@ -170,7 +182,8 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -179,7 +192,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -206,7 +220,8 @@
-               };
-       };
--      pcie@ffe08000 {
-+      pci0: pcie@ffe08000 {
-+              cell-index = <0>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -319,9 +334,9 @@
-                       // IDSEL 0x1c  USB
-                       e000 0 0 1 &i8259 c 2
--                      e100 0 0 1 &i8259 9 2
--                      e200 0 0 1 &i8259 a 2
--                      e300 0 0 1 &i8259 b 2
-+                      e100 0 0 2 &i8259 9 2
-+                      e200 0 0 3 &i8259 a 2
-+                      e300 0 0 4 &i8259 b 2
-                       // IDSEL 0x1d  Audio
-                       e800 0 0 1 &i8259 6 2
-@@ -415,7 +430,8 @@
-       };
--      pcie@ffe09000 {
-+      pci1: pcie@ffe09000 {
-+              cell-index = <1>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -451,7 +467,8 @@
-               };
-       };
--      pcie@ffe0a000 {
-+      pci2: pcie@ffe0a000 {
-+              cell-index = <2>;
-               compatible = "fsl,mpc8548-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -464,6 +481,7 @@
-               clock-frequency = <1fca055>;
-               interrupt-parent = <&mpic>;
-               interrupts = <1b 2>;
-+              interrupt-map-mask = <f800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x0 */
-                       0000 0 0 1 &mpic 0 1
---- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts
-+++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
-@@ -1,7 +1,7 @@
- /*
-  * MPC8610 HPCD Device Tree Source
-  *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007-2008 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
-@@ -15,6 +15,13 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -42,33 +49,42 @@
-               #size-cells = <1>;
-               #interrupt-cells = <2>;
-               device_type = "soc";
-+              compatible = "fsl,mpc8610-immr", "simple-bus";
-               ranges = <0 e0000000 00100000>;
-               reg = <e0000000 1000>;
-               bus-frequency = <0>;
-               i2c@3000 {
--                      device_type = "i2c";
--                      compatible = "fsl-i2c";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      cell-index = <0>;
-+                      compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
-+
-+                        cs4270:codec@4f {
-+                              compatible = "cirrus,cs4270";
-+                                reg = <4f>;
-+                              /* MCLK source is a stand-alone oscillator */
-+                              clock-frequency = <bb8000>;
-+                        };
-               };
-               i2c@3100 {
--                      device_type = "i2c";
--                      compatible = "fsl-i2c";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      cell-index = <1>;
-+                      compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <2b 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
-               };
--              serial@4500 {
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -77,7 +93,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -86,7 +103,6 @@
-                       interrupt-parent = <&mpic>;
-               };
--
-               mpic: interrupt-controller@40000 {
-                       clock-frequency = <0>;
-                       interrupt-controller;
-@@ -103,9 +119,113 @@
-                       reg = <e0000 1000>;
-                       fsl,has-rstcr;
-               };
-+
-+              i2s@16000 {
-+                      compatible = "fsl,mpc8610-ssi";
-+                      cell-index = <0>;
-+                      reg = <16000 100>;
-+                      interrupt-parent = <&mpic>;
-+                      interrupts = <3e 2>;
-+                      fsl,mode = "i2s-slave";
-+                      codec-handle = <&cs4270>;
-+              };
-+
-+              ssi@16100 {
-+                      compatible = "fsl,mpc8610-ssi";
-+                      cell-index = <1>;
-+                      reg = <16100 100>;
-+                      interrupt-parent = <&mpic>;
-+                      interrupts = <3f 2>;
-+              };
-+
-+                dma@21300 {
-+                        #address-cells = <1>;
-+                        #size-cells = <1>;
-+                        compatible = "fsl,mpc8610-dma", "fsl,eloplus-dma";
-+                        cell-index = <0>;
-+                        reg = <21300 4>; /* DMA general status register */
-+                        ranges = <0 21100 200>;
-+
-+                        dma-channel@0 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,eloplus-dma-channel";
-+                              cell-index = <0>;
-+                              reg = <0 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <14 2>;
-+                        };
-+                        dma-channel@1 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,eloplus-dma-channel";
-+                              cell-index = <1>;
-+                              reg = <80 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <15 2>;
-+                        };
-+                        dma-channel@2 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,eloplus-dma-channel";
-+                              cell-index = <2>;
-+                              reg = <100 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <16 2>;
-+                        };
-+                        dma-channel@3 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,eloplus-dma-channel";
-+                              cell-index = <3>;
-+                              reg = <180 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <17 2>;
-+                        };
-+                };
-+
-+                dma@c300 {
-+                        #address-cells = <1>;
-+                        #size-cells = <1>;
-+                        compatible = "fsl,mpc8610-dma", "fsl,mpc8540-dma";
-+                        cell-index = <1>;
-+                        reg = <c300 4>; /* DMA general status register */
-+                        ranges = <0 c100 200>;
-+
-+                        dma-channel@0 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,mpc8540-dma-channel";
-+                              cell-index = <0>;
-+                              reg = <0 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <3c 2>;
-+                        };
-+                        dma-channel@1 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,mpc8540-dma-channel";
-+                              cell-index = <1>;
-+                              reg = <80 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <3d 2>;
-+                        };
-+                        dma-channel@2 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,mpc8540-dma-channel";
-+                              cell-index = <2>;
-+                              reg = <100 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <3e 2>;
-+                        };
-+                        dma-channel@3 {
-+                              compatible = "fsl,mpc8610-dma-channel",
-+                                      "fsl,mpc8540-dma-channel";
-+                              cell-index = <3>;
-+                              reg = <180 80>;
-+                              interrupt-parent = <&mpic>;
-+                              interrupts = <3f 2>;
-+                        };
-+                };
-+
-       };
--      pci@e0008000 {
-+      pci0: pci@e0008000 {
-+              cell-index = <0>;
-               compatible = "fsl,mpc8610-pci";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -134,7 +254,8 @@
-                       >;
-       };
--      pcie@e000a000 {
-+      pci1: pcie@e000a000 {
-+              cell-index = <1>;
-               compatible = "fsl,mpc8641-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-+++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-@@ -16,6 +16,17 @@
-       #address-cells = <1>;
-       #size-cells = <1>;
-+      aliases {
-+              ethernet0 = &enet0;
-+              ethernet1 = &enet1;
-+              ethernet2 = &enet2;
-+              ethernet3 = &enet3;
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+              pci1 = &pci1;
-+      };
-+
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-@@ -49,16 +60,60 @@
-               reg = <00000000 40000000>;      // 1G at 0x0
-       };
-+      localbus@f8005000 {
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              compatible = "fsl,mpc8641-localbus", "simple-bus";
-+              reg = <f8005000 1000>;
-+              interrupts = <13 2>;
-+              interrupt-parent = <&mpic>;
-+
-+              ranges = <0 0 ff800000 00800000
-+                        1 0 fe000000 01000000
-+                        2 0 f8200000 00100000
-+                        3 0 f8100000 00100000>;
-+
-+              flash@0,0 {
-+                      compatible = "cfi-flash";
-+                      reg = <0 0 00800000>;
-+                      bank-width = <2>;
-+                      device-width = <2>;
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      partition@0 {
-+                              label = "kernel";
-+                              reg = <00000000 00300000>;
-+                      };
-+                      partition@300000 {
-+                              label = "firmware b";
-+                              reg = <00300000 00100000>;
-+                              read-only;
-+                      };
-+                      partition@400000 {
-+                              label = "fs";
-+                              reg = <00400000 00300000>;
-+                      };
-+                      partition@700000 {
-+                              label = "firmware a";
-+                              reg = <00700000 00100000>;
-+                              read-only;
-+                      };
-+              };
-+      };
-+
-       soc8641@f8000000 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               device_type = "soc";
-+              compatible = "simple-bus";
-               ranges = <00000000 f8000000 00100000>;
-               reg = <f8000000 00001000>;      // CCSRBAR
-               bus-frequency = <0>;
-               i2c@3000 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <3000 100>;
-                       interrupts = <2b 2>;
-@@ -67,7 +122,9 @@
-               };
-               i2c@3100 {
--                      device_type = "i2c";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <3100 100>;
-                       interrupts = <2b 2>;
-@@ -78,9 +135,9 @@
-               mdio@24520 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      device_type = "mdio";
--                      compatible = "gianfar";
-+                      compatible = "fsl,gianfar-mdio";
-                       reg = <24520 20>;
-+
-                       phy0: ethernet-phy@0 {
-                               interrupt-parent = <&mpic>;
-                               interrupts = <a 1>;
-@@ -107,19 +164,12 @@
-                       };
-               };
--              ethernet@24000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet0: ethernet@24000 {
-+                      cell-index = <0>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <24000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <1d 2 1e 2 22 2>;
-                       interrupt-parent = <&mpic>;
-@@ -127,19 +177,12 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@25000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet1: ethernet@25000 {
-+                      cell-index = <1>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <25000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <23 2 24 2 28 2>;
-                       interrupt-parent = <&mpic>;
-@@ -147,19 +190,12 @@
-                       phy-connection-type = "rgmii-id";
-               };
-               
--              ethernet@26000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet2: ethernet@26000 {
-+                      cell-index = <2>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <26000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <1F 2 20 2 21 2>;
-                       interrupt-parent = <&mpic>;
-@@ -167,26 +203,21 @@
-                       phy-connection-type = "rgmii-id";
-               };
--              ethernet@27000 {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
-+              enet3: ethernet@27000 {
-+                      cell-index = <3>;
-                       device_type = "network";
-                       model = "TSEC";
-                       compatible = "gianfar";
-                       reg = <27000 1000>;
--                      /*
--                       * mac-address is deprecated and will be removed
--                       * in 2.6.25.  Only recent versions of
--                       * U-Boot support local-mac-address, however.
--                       */
--                      mac-address = [ 00 00 00 00 00 00 ];
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <25 2 26 2 27 2>;
-                       interrupt-parent = <&mpic>;
-                       phy-handle = <&phy3>;
-                       phy-connection-type = "rgmii-id";
-               };
--              serial@4500 {
-+
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4500 100>;
-@@ -195,7 +226,8 @@
-                       interrupt-parent = <&mpic>;
-               };
--              serial@4600 {
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <4600 100>;
-@@ -222,7 +254,8 @@
-               };
-       };
--      pcie@f8008000 {
-+      pci0: pcie@f8008000 {
-+              cell-index = <0>;
-               compatible = "fsl,mpc8641-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-@@ -335,9 +368,9 @@
-                       // IDSEL 0x1c  USB
-                       e000 0 0 1 &i8259 c 2
--                      e100 0 0 1 &i8259 9 2
--                      e200 0 0 1 &i8259 a 2
--                      e300 0 0 1 &i8259 b 2
-+                      e100 0 0 2 &i8259 9 2
-+                      e200 0 0 3 &i8259 a 2
-+                      e300 0 0 4 &i8259 b 2
-                       // IDSEL 0x1d  Audio
-                       e800 0 0 1 &i8259 6 2
-@@ -430,7 +463,8 @@
-       };
--      pcie@f8009000 {
-+      pci1: pcie@f8009000 {
-+              cell-index = <1>;
-               compatible = "fsl,mpc8641-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/mpc866ads.dts
-+++ b/arch/powerpc/boot/dts/mpc866ads.dts
-@@ -12,7 +12,7 @@
- / {
-       model = "MPC866ADS";
--      compatible = "mpc8xx";
-+      compatible = "fsl,mpc866ads";
-       #address-cells = <1>;
-       #size-cells = <1>;
-@@ -23,15 +23,15 @@
-               PowerPC,866@0 {
-                       device_type = "cpu";
-                       reg = <0>;
--                      d-cache-line-size = <20>;       // 32 bytes
--                      i-cache-line-size = <20>;       // 32 bytes
-+                      d-cache-line-size = <10>;       // 16 bytes
-+                      i-cache-line-size = <10>;       // 16 bytes
-                       d-cache-size = <2000>;          // L1, 8K
-                       i-cache-size = <4000>;          // L1, 16K
-                       timebase-frequency = <0>;
-                       bus-frequency = <0>;
-                       clock-frequency = <0>;
-                       interrupts = <f 2>;     // decrementer interrupt
--                      interrupt-parent = <&Mpc8xx_pic>;
-+                      interrupt-parent = <&PIC>;
-               };
-       };
-@@ -40,107 +40,139 @@
-               reg = <00000000 800000>;
-       };
--      soc866@ff000000 {
-+      localbus@ff000100 {
-+              compatible = "fsl,mpc866-localbus", "fsl,pq1-localbus";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              reg = <ff000100 40>;
-+
-+              ranges = <
-+                      1 0 ff080000 00008000
-+                      5 0 ff0a0000 00008000
-+              >;
-+
-+              board-control@1,0 {
-+                      reg = <1 0 20 5 300 4>;
-+                      compatible = "fsl,mpc866ads-bcsr";
-+              };
-+      };
-+
-+      soc@ff000000 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               device_type = "soc";
-               ranges = <0 ff000000 00100000>;
-               reg = <ff000000 00000200>;
-               bus-frequency = <0>;
--              mdio@e80 {
--                      device_type = "mdio";
--                      compatible = "fs_enet";
--                      reg = <e80 8>;
-+
-+              mdio@e00 {
-+                      compatible = "fsl,mpc866-fec-mdio", "fsl,pq1-fec-mdio";
-+                      reg = <e00 188>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
--                      phy: ethernet-phy@f {
-+                      PHY: ethernet-phy@f {
-                               reg = <f>;
-                               device_type = "ethernet-phy";
-                       };
-               };
--              fec@e00 {
-+              ethernet@e00 {
-                       device_type = "network";
--                      compatible = "fs_enet";
--                      model = "FEC";
--                      device-id = <1>;
-+                      compatible = "fsl,mpc866-fec-enet",
-+                                   "fsl,pq1-fec-enet";
-                       reg = <e00 188>;
--                      mac-address = [ 00 00 0C 00 01 FD ];
-+                      local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <3 1>;
--                      interrupt-parent = <&Mpc8xx_pic>;
--                      phy-handle = <&Phy>;
-+                      interrupt-parent = <&PIC>;
-+                      phy-handle = <&PHY>;
-+                      linux,network-index = <0>;
-               };
--              mpc8xx_pic: pic@ff000000 {
-+              PIC: pic@0 {
-                       interrupt-controller;
--                      #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <0 24>;
--                      device_type = "mpc8xx-pic";
--                      compatible = "CPM";
-+                      compatible = "fsl,mpc866-pic", "fsl,pq1-pic";
-               };
--              cpm@ff000000 {
-+              cpm@9c0 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
--                      device_type = "cpm";
--                      model = "CPM";
--                      ranges = <0 0 4000>;
--                      reg = <860 f0>;
--                      command-proc = <9c0>;
-+                      compatible = "fsl,mpc866-cpm", "fsl,cpm1";
-+                      ranges;
-+                      reg = <9c0 40>;
-                       brg-frequency = <0>;
-                       interrupts = <0 2>;     // cpm error interrupt
--                      interrupt-parent = <&Cpm_pic>;
-+                      interrupt-parent = <&CPM_PIC>;
--                      cpm_pic: pic@930 {
-+                      muram@2000 {
-+                              #address-cells = <1>;
-+                              #size-cells = <1>;
-+                              ranges = <0 2000 2000>;
-+
-+                              data@0 {
-+                                      compatible = "fsl,cpm-muram-data";
-+                                      reg = <0 1c00>;
-+                              };
-+                      };
-+
-+                      brg@9f0 {
-+                              compatible = "fsl,mpc866-brg",
-+                                           "fsl,cpm1-brg",
-+                                           "fsl,cpm-brg";
-+                              reg = <9f0 10>;
-+                              clock-frequency = <0>;
-+                      };
-+
-+                      CPM_PIC: pic@930 {
-                               interrupt-controller;
-                               #address-cells = <0>;
--                              #interrupt-cells = <2>;
-+                              #interrupt-cells = <1>;
-                               interrupts = <5 2 0 2>;
--                              interrupt-parent = <&Mpc8xx_pic>;
-+                              interrupt-parent = <&PIC>;
-                               reg = <930 20>;
--                              device_type = "cpm-pic";
--                              compatible = "CPM";
-+                              compatible = "fsl,mpc866-cpm-pic",
-+                                           "fsl,cpm1-pic";
-                       };
--                      smc@a80 {
-+
-+                      serial@a80 {
-                               device_type = "serial";
--                              compatible = "cpm_uart";
--                              model = "SMC";
--                              device-id = <1>;
-+                              compatible = "fsl,mpc866-smc-uart",
-+                                           "fsl,cpm1-smc-uart";
-                               reg = <a80 10 3e80 40>;
--                              clock-setup = <00ffffff 0>;
--                              rx-clock = <1>;
--                              tx-clock = <1>;
--                              current-speed = <0>;
--                              interrupts = <4 3>;
--                              interrupt-parent = <&Cpm_pic>;
-+                              interrupts = <4>;
-+                              interrupt-parent = <&CPM_PIC>;
-+                              fsl,cpm-brg = <1>;
-+                              fsl,cpm-command = <0090>;
-                       };
--                      smc@a90 {
-+                      serial@a90 {
-                               device_type = "serial";
--                              compatible = "cpm_uart";
--                              model = "SMC";
--                              device-id = <2>;
--                              reg = <a90 20 3f80 40>;
--                              clock-setup = <ff00ffff 90000>;
--                              rx-clock = <2>;
--                              tx-clock = <2>;
--                              current-speed = <0>;
--                              interrupts = <3 3>;
--                              interrupt-parent = <&Cpm_pic>;
-+                              compatible = "fsl,mpc866-smc-uart",
-+                                           "fsl,cpm1-smc-uart";
-+                              reg = <a90 10 3f80 40>;
-+                              interrupts = <3>;
-+                              interrupt-parent = <&CPM_PIC>;
-+                              fsl,cpm-brg = <2>;
-+                              fsl,cpm-command = <00d0>;
-                       };
--                      scc@a00 {
-+                      ethernet@a00 {
-                               device_type = "network";
--                              compatible = "fs_enet";
--                              model = "SCC";
--                              device-id = <1>;
--                              reg = <a00 18 3c00 80>;
--                              mac-address = [ 00 00 0C 00 03 FD ];
--                              interrupts = <1e 3>;
--                              interrupt-parent = <&Cpm_pic>;
-+                              compatible = "fsl,mpc866-scc-enet",
-+                                           "fsl,cpm1-scc-enet";
-+                              reg = <a00 18 3c00 100>;
-+                              local-mac-address = [ 00 00 00 00 00 00 ];
-+                              interrupts = <1e>;
-+                              interrupt-parent = <&CPM_PIC>;
-+                              fsl,cpm-command = <0000>;
-+                              linux,network-index = <1>;
-                       };
-               };
-       };
-+
-+      chosen {
-+              linux,stdout-path = "/soc/cpm/serial@a80";
-+      };
- };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/rainier.dts
-@@ -0,0 +1,353 @@
-+/*
-+ * Device Tree Source for AMCC Rainier
-+ *
-+ * Based on Sequoia code
-+ * Copyright (c) 2007 MontaVista Software, Inc.
-+ *
-+ * FIXME: Draft only!
-+ *
-+ * 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.
-+ *
-+ */
-+
-+/ {
-+      #address-cells = <2>;
-+      #size-cells = <1>;
-+      model = "amcc,rainier";
-+      compatible = "amcc,rainier";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+              serial2 = &UART2;
-+              serial3 = &UART3;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,440GRx";
-+                      reg = <0>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+                      timebase-frequency = <0>; /* Filled in by zImage */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <8000>;
-+                      d-cache-size = <8000>;
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0 0>; /* Filled in by zImage */
-+      };
-+
-+      UIC0: interrupt-controller0 {
-+              compatible = "ibm,uic-440grx","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-440grx","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1e 4 1f 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      UIC2: interrupt-controller2 {
-+              compatible = "ibm,uic-440grx","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <2>;
-+              dcr-reg = <0e0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1c 4 1d 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      SDR0: sdr {
-+              compatible = "ibm,sdr-440grx", "ibm,sdr-440ep";
-+              dcr-reg = <00e 002>;
-+      };
-+
-+      CPR0: cpr {
-+              compatible = "ibm,cpr-440grx", "ibm,cpr-440ep";
-+              dcr-reg = <00c 002>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-440grx", "ibm,plb4";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by zImage */
-+
-+              SDRAM0: sdram {
-+                      compatible = "ibm,sdram-440grx", "ibm,sdram-44x-ddr2denali";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              DMA0: dma {
-+                      compatible = "ibm,dma-440grx", "ibm,dma-4xx";
-+                      dcr-reg = <100 027>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-440grx", "ibm,mcmal2";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <2>;
-+                      num-rx-chans = <2>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+                                      /*RXEOB*/ 1 &UIC0 b 4
-+                                      /*SERR*/  2 &UIC1 0 4
-+                                      /*TXDE*/  3 &UIC1 1 4
-+                                      /*RXDE*/  4 &UIC1 2 4>;
-+                      interrupt-map-mask = <ffffffff>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-440grx", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <00000000 1 00000000 80000000
-+                                80000000 1 80000000 80000000>;
-+                      interrupt-parent = <&UIC1>;
-+                      interrupts = <7 4>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-440grx", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              interrupts = <5 1>;
-+                              interrupt-parent = <&UIC1>;
-+
-+                              nor_flash@0,0 {
-+                                      compatible = "amd,s29gl256n", "cfi-flash";
-+                                      bank-width = <2>;
-+                                      reg = <0 000000 4000000>;
-+                                      #address-cells = <1>;
-+                                      #size-cells = <1>;
-+                                      partition@0 {
-+                                              label = "Kernel";
-+                                              reg = <0 180000>;
-+                                      };
-+                                      partition@180000 {
-+                                              label = "ramdisk";
-+                                              reg = <180000 200000>;
-+                                      };
-+                                      partition@380000 {
-+                                              label = "file system";
-+                                              reg = <380000 3aa0000>;
-+                                      };
-+                                      partition@3e20000 {
-+                                              label = "kozio";
-+                                              reg = <3e20000 140000>;
-+                                      };
-+                                      partition@3f60000 {
-+                                              label = "env";
-+                                              reg = <3f60000 40000>;
-+                                      };
-+                                      partition@3fa0000 {
-+                                              label = "u-boot";
-+                                              reg = <3fa0000 60000>;
-+                                      };
-+                              };
-+
-+                      };
-+
-+                      UART0: serial@ef600300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600300 8>;
-+                              virtual-reg = <ef600300>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              current-speed = <1c200>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <0 4>;
-+                      };
-+
-+                      UART1: serial@ef600400 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600400 8>;
-+                              virtual-reg = <ef600400>;
-+                              clock-frequency = <0>;
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+                      UART2: serial@ef600500 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600500 8>;
-+                              virtual-reg = <ef600500>;
-+                              clock-frequency = <0>;
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <3 4>;
-+                      };
-+
-+                      UART3: serial@ef600600 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600600 8>;
-+                              virtual-reg = <ef600600>;
-+                              clock-frequency = <0>;
-+                              current-speed = <0>;
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <4 4>;
-+                      };
-+
-+                      IIC0: i2c@ef600700 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440grx", "ibm,iic";
-+                              reg = <ef600700 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      IIC1: i2c@ef600800 {
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440grx", "ibm,iic";
-+                              reg = <ef600800 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <7 4>;
-+                      };
-+
-+                      ZMII0: emac-zmii@ef600d00 {
-+                              device_type = "zmii-interface";
-+                              compatible = "ibm,zmii-440grx", "ibm,zmii";
-+                              reg = <ef600d00 c>;
-+                      };
-+
-+                      RGMII0: emac-rgmii@ef601000 {
-+                              device_type = "rgmii-interface";
-+                              compatible = "ibm,rgmii-440grx", "ibm,rgmii";
-+                              reg = <ef601000 8>;
-+                              has-mdio;
-+                      };
-+
-+                      EMAC0: ethernet@ef600e00 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
-+                              interrupt-parent = <&EMAC0>;
-+                              interrupts = <0 1>;
-+                              #interrupt-cells = <1>;
-+                              #address-cells = <0>;
-+                              #size-cells = <0>;
-+                              interrupt-map = </*Status*/ 0 &UIC0 18 4
-+                                              /*Wake*/  1 &UIC1 1d 4>;
-+                              reg = <ef600e00 70>;
-+                              local-mac-address = [000000000000];
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000000>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <0>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <0>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+
-+                      EMAC1: ethernet@ef600f00 {
-+                              linux,network-index = <1>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
-+                              interrupt-parent = <&EMAC1>;
-+                              interrupts = <0 1>;
-+                              #interrupt-cells = <1>;
-+                              #address-cells = <0>;
-+                              #size-cells = <0>;
-+                              interrupt-map = </*Status*/ 0 &UIC0 19 4
-+                                              /*Wake*/  1 &UIC1 1f 4>;
-+                              reg = <ef600f00 70>;
-+                              local-mac-address = [000000000000];
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <1>;
-+                              mal-rx-channel = <1>;
-+                              cell-index = <1>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000000>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <1>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <1>;
-+                              has-inverted-stacr-oc;
-+                              has-new-stacr-staopc;
-+                      };
-+              };
-+
-+              PCI0: pci@1ec000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb440grx-pci", "ibm,plb-pci";
-+                      primary;
-+                      reg = <1 eec00000 8     /* Config space access */
-+                             1 eed00000 4     /* IACK */
-+                             1 eed00000 4     /* Special cycle */
-+                             1 ef400000 40>;  /* Internal registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed. Chip supports a second
-+                       * IO range but we don't use it for now
-+                       */
-+                      ranges = <02000000 0 80000000 1 80000000 0 10000000
-+                              01000000 0 00000000 1 e8000000 0 00100000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* All PCI interrupts are routed to IRQ 67 */
-+                      interrupt-map-mask = <0000 0 0 0>;
-+                      interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/plb/opb/serial@ef600300";
-+              bootargs = "console=ttyS0,115200";
-+      };
-+};
---- a/arch/powerpc/boot/dts/sequoia.dts
-+++ b/arch/powerpc/boot/dts/sequoia.dts
-@@ -17,14 +17,24 @@
-       #size-cells = <1>;
-       model = "amcc,sequoia";
-       compatible = "amcc,sequoia";
--      dcr-parent = <&/cpus/PowerPC,440EPx@0>;
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              ethernet1 = &EMAC1;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+              serial2 = &UART2;
-+              serial3 = &UART3;
-+      };
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
--              PowerPC,440EPx@0 {
-+              cpu@0 {
-                       device_type = "cpu";
-+                      model = "PowerPC,440EPx";
-                       reg = <0>;
-                       clock-frequency = <0>; /* Filled in by zImage */
-                       timebase-frequency = <0>; /* Filled in by zImage */
-@@ -94,7 +104,6 @@
-               clock-frequency = <0>; /* Filled in by zImage */
-               SDRAM0: sdram {
--                      device_type = "memory-controller";
-                       compatible = "ibm,sdram-440epx", "ibm,sdram-44x-ddr2denali";
-                       dcr-reg = <010 2>;
-               };
-@@ -122,6 +131,13 @@
-                       interrupt-map-mask = <ffffffff>;
-               };
-+              USB1: usb@e0000400 {
-+                      compatible = "ohci-be";
-+                      reg = <0 e0000400 60>;
-+                      interrupt-parent = <&UIC0>;
-+                      interrupts = <15 8>;
-+              };
-+
-               POB0: opb {
-                       compatible = "ibm,opb-440epx", "ibm,opb";
-                       #address-cells = <1>;
-@@ -308,6 +324,33 @@
-                               has-new-stacr-staopc;
-                       };
-               };
-+
-+              PCI0: pci@1ec000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb440epx-pci", "ibm,plb-pci";
-+                      primary;
-+                      reg = <1 eec00000 8     /* Config space access */
-+                             1 eed00000 4     /* IACK */
-+                             1 eed00000 4     /* Special cycle */
-+                             1 ef400000 40>;  /* Internal registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed. Chip supports a second
-+                       * IO range but we don't use it for now
-+                       */
-+                      ranges = <02000000 0 80000000 1 80000000 0 10000000
-+                              01000000 0 00000000 1 e8000000 0 00100000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      /* All PCI interrupts are routed to IRQ 67 */
-+                      interrupt-map-mask = <0000 0 0 0>;
-+                      interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
-+              };
-       };
-       chosen {
---- /dev/null
-+++ b/arch/powerpc/boot/dts/storcenter.dts
-@@ -0,0 +1,138 @@
-+/*
-+ * Device Tree Source for IOMEGA StorCenter
-+ *
-+ * Copyright 2007 Oyvind Repvik
-+ * Copyright 2007 Jon Loeliger
-+ *
-+ * Based on the Kurobox DTS by G. Liakhovetski <g.liakhovetski@gmx.de>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      model = "StorCenter";
-+      compatible = "storcenter";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      aliases {
-+              serial0 = &serial0;
-+              serial1 = &serial1;
-+              pci0 = &pci0;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,8241@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      clock-frequency = <d# 200000000>;       /* Hz */
-+                      timebase-frequency = <d# 25000000>;     /* Hz */
-+                      bus-frequency = <0>;    /* from bootwrapper */
-+                      i-cache-line-size = <d# 32>;    /* bytes */
-+                      d-cache-line-size = <d# 32>;    /* bytes */
-+                      i-cache-size = <4000>;
-+                      d-cache-size = <4000>;
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <00000000 04000000>;      /* 64MB @ 0x0 */
-+      };
-+
-+      soc@fc000000 {
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+              device_type = "soc";
-+              compatible = "fsl,mpc8241", "mpc10x";
-+              store-gathering = <0>; /* 0 == off, !0 == on */
-+              ranges = <0 fc000000 100000>;
-+              reg = <fc000000 100000>;        /* EUMB */
-+              bus-frequency = <0>;            /* fixed by loader */
-+
-+              i2c@3000 {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      compatible = "fsl-i2c";
-+                      reg = <3000 100>;
-+                      interrupts = <5 2>;
-+                      interrupt-parent = <&mpic>;
-+
-+                      rtc@68 {
-+                              compatible = "dallas,ds1337";
-+                              reg = <68>;
-+                      };
-+              };
-+
-+              serial0: serial@4500 {
-+                      cell-index = <0>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <4500 20>;
-+                      clock-frequency = <d# 97553800>; /* Hz */
-+                      current-speed = <d# 115200>;
-+                      interrupts = <9 2>;
-+                      interrupt-parent = <&mpic>;
-+              };
-+
-+              serial1: serial@4600 {
-+                      cell-index = <1>;
-+                      device_type = "serial";
-+                      compatible = "ns16550";
-+                      reg = <4600 20>;
-+                      clock-frequency = <d# 97553800>; /* Hz */
-+                      current-speed = <d# 9600>;
-+                      interrupts = <a 2>;
-+                      interrupt-parent = <&mpic>;
-+              };
-+
-+              mpic: interrupt-controller@40000 {
-+                      #interrupt-cells = <2>;
-+                      device_type = "open-pic";
-+                      compatible = "chrp,open-pic";
-+                      interrupt-controller;
-+                      reg = <40000 40000>;
-+              };
-+
-+      };
-+
-+      pci0: pci@fe800000 {
-+              #address-cells = <3>;
-+              #size-cells = <2>;
-+              #interrupt-cells = <1>;
-+              device_type = "pci";
-+              compatible = "mpc10x-pci";
-+              reg = <fe800000 1000>;
-+              ranges = <01000000 0        0 fe000000 0 00c00000
-+                        02000000 0 80000000 80000000 0 70000000>;
-+              bus-range = <0 ff>;
-+              clock-frequency = <d# 97553800>; /* Hz */
-+              interrupt-parent = <&mpic>;
-+              interrupt-map-mask = <f800 0 0 7>;
-+              interrupt-map = <
-+                      /* IDSEL 13 - IDE */
-+                      6800 0 0 1 &mpic 0 1
-+                      6800 0 0 2 &mpic 0 1
-+                      6800 0 0 3 &mpic 0 1
-+                      /* IDSEL 14 - USB */
-+                      7000 0 0 1 &mpic 0 1
-+                      7000 0 0 2 &mpic 0 1
-+                      7000 0 0 3 &mpic 0 1
-+                      7000 0 0 4 &mpic 0 1
-+                      /* IDSEL 15 - ETH */
-+                      7800 0 0 1 &mpic 0 1
-+                      7800 0 0 2 &mpic 0 1
-+                      7800 0 0 3 &mpic 0 1
-+                      7800 0 0 4 &mpic 0 1
-+              >;
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/soc/serial@4500";
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/taishan.dts
-@@ -0,0 +1,383 @@
-+/*
-+ * Device Tree Source for IBM/AMCC Taishan
-+ *
-+ * Copyright 2007 IBM Corp.
-+ * Hugh Blemings <hugh@au.ibm.com> based off code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>, David Gibson <dwg@au1.ibm.com>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <2>;
-+      #size-cells = <1>;
-+      model = "amcc,taishan";
-+      compatible = "amcc,taishan";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC2;
-+              ethernet1 = &EMAC3;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,440GX";
-+                      reg = <0>;
-+                      clock-frequency = <2FAF0800>; // 800MHz
-+                      timebase-frequency = <0>; // Filled in by zImage
-+                      i-cache-line-size = <32>;
-+                      d-cache-line-size = <32>;
-+                      i-cache-size = <8000>; /* 32 kB */
-+                      d-cache-size = <8000>; /* 32 kB */
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0 0>; // Filled in by zImage
-+      };
-+
-+
-+      UICB0: interrupt-controller-base {
-+              compatible = "ibm,uic-440gx", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <3>;
-+              dcr-reg = <200 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+
-+      UIC0: interrupt-controller0 {
-+              compatible = "ibm,uic-440gx", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <01 4 00 4>; /* cascade - first non-critical */
-+              interrupt-parent = <&UICB0>;
-+
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-440gx", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <03 4 02 4>; /* cascade */
-+              interrupt-parent = <&UICB0>;
-+      };
-+
-+      UIC2: interrupt-controller2 {
-+              compatible = "ibm,uic-440gx", "ibm,uic";
-+              interrupt-controller;
-+              cell-index = <2>; /* was 1 */
-+              dcr-reg = <210 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <05 4 04 4>; /* cascade */
-+              interrupt-parent = <&UICB0>;
-+      };
-+
-+
-+      CPC0: cpc {
-+              compatible = "ibm,cpc-440gp";
-+              dcr-reg = <0b0 003 0e0 010>;
-+              // FIXME: anything else?
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-440gx", "ibm,plb4";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <9896800>; // 160MHz
-+
-+              SDRAM0: memory-controller {
-+                      compatible = "ibm,sdram-440gp";
-+                      dcr-reg = <010 2>;
-+                      // FIXME: anything else?
-+              };
-+
-+              SRAM0: sram {
-+                      compatible = "ibm,sram-440gp";
-+                      dcr-reg = <020 8 00a 1>;
-+              };
-+
-+              DMA0: dma {
-+                      // FIXME: ???
-+                      compatible = "ibm,dma-440gp";
-+                      dcr-reg = <100 027>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-440gx", "ibm,mcmal2";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <4>;
-+                      num-rx-chans = <4>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+                                       /*RXEOB*/ 1 &UIC0 b 4
-+                                       /*SERR*/  2 &UIC1 0 4
-+                                       /*TXDE*/  3 &UIC1 1 4
-+                                       /*RXDE*/  4 &UIC1 2 4>;
-+                      interrupt-map-mask = <ffffffff>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-440gx", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      /* Wish there was a nicer way of specifying a full 32-bit
-+                         range */
-+                      ranges = <00000000 1 00000000 80000000
-+                                80000000 1 80000000 80000000>;
-+                      dcr-reg = <090 00b>;
-+                      interrupt-parent = <&UIC1>;
-+                      interrupts = <7 4>;
-+                      clock-frequency = <4C4B400>; // 80MHz
-+
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-440gx", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <4C4B400>; // 80MHz
-+
-+                              /* ranges property is supplied by zImage
-+                               * based on firmware's configuration of the
-+                               * EBC bridge */
-+
-+                              interrupts = <5 4>;
-+                              interrupt-parent = <&UIC1>;
-+
-+                              /* TODO: Add other EBC devices */
-+                      };
-+
-+
-+
-+                      UART0: serial@40000200 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <40000200 8>;
-+                              virtual-reg = <e0000200>;
-+                              clock-frequency = <A8C000>;
-+                              current-speed = <1C200>; /* 115200 */
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <0 4>;
-+                      };
-+
-+                      UART1: serial@40000300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <40000300 8>;
-+                              virtual-reg = <e0000300>;
-+                              clock-frequency = <A8C000>;
-+                              current-speed = <1C200>; /* 115200 */
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <1 4>;
-+                      };
-+
-+                      IIC0: i2c@40000400 {
-+                              /* FIXME */
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440gp", "ibm,iic";
-+                              reg = <40000400 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+                      IIC1: i2c@40000500 {
-+                              /* FIXME */
-+                              device_type = "i2c";
-+                              compatible = "ibm,iic-440gp", "ibm,iic";
-+                              reg = <40000500 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <3 4>;
-+                      };
-+
-+                      GPIO0: gpio@40000700 {
-+                              /* FIXME */
-+                              compatible = "ibm,gpio-440gp";
-+                              reg = <40000700 20>;
-+                      };
-+
-+                      ZMII0: emac-zmii@40000780 {
-+                              device_type = "zgmii-interface";
-+                              compatible = "ibm,zmii-440gx", "ibm,zmii";
-+                              reg = <40000780 c>;
-+                      };
-+
-+                      RGMII0: emac-rgmii@40000790 {
-+                              device_type = "rgmii-interface";
-+                              compatible = "ibm,rgmii";
-+                              reg = <40000790 8>;
-+                      };
-+
-+
-+                      EMAC0: ethernet@40000800 {
-+                              unused = <1>;
-+                              linux,network-index = <2>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440gx", "ibm,emac4";
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <1c 4 1d 4>;
-+                              reg = <40000800 70>;
-+                              local-mac-address = [000000000000]; // Filled in by zImage
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rmii";
-+                              phy-map = <00000001>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <0>;
-+                      };
-+                      EMAC1: ethernet@40000900 {
-+                              unused = <1>;
-+                              linux,network-index = <3>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440gx", "ibm,emac4";
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <1e 4 1f 4>;
-+                              reg = <40000900 70>;
-+                              local-mac-address = [000000000000]; // Filled in by zImage
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <1>;
-+                              mal-rx-channel = <1>;
-+                              cell-index = <1>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rmii";
-+                              phy-map = <00000001>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <1>;
-+                      };
-+
-+                      EMAC2: ethernet@40000c00 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440gx", "ibm,emac4";
-+                              interrupt-parent = <&UIC2>;
-+                              interrupts = <0 4 1 4>;
-+                              reg = <40000c00 70>;
-+                              local-mac-address = [000000000000]; // Filled in by zImage
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <2>;
-+                              mal-rx-channel = <2>;
-+                              cell-index = <2>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000001>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <0>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <2>;
-+                      };
-+
-+                      EMAC3: ethernet@40000e00 {
-+                              linux,network-index = <1>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440gx", "ibm,emac4";
-+                              interrupt-parent = <&UIC2>;
-+                              interrupts = <2 4 3 4>;
-+                              reg = <40000e00 70>;
-+                              local-mac-address = [000000000000]; // Filled in by zImage
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <3>;
-+                              mal-rx-channel = <3>;
-+                              cell-index = <3>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rgmii";
-+                              phy-map = <00000003>;
-+                              rgmii-device = <&RGMII0>;
-+                              rgmii-channel = <1>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <3>;
-+                      };
-+
-+
-+                      GPT0: gpt@40000a00 {
-+                              /* FIXME */
-+                              reg = <40000a00 d4>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <12 4 13 4 14 4 15 4 16 4>;
-+                      };
-+
-+              };
-+
-+              PCIX0: pci@20ec00000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
-+                      primary;
-+                      large-inbound-windows;
-+                      enable-msi-hole;
-+                      reg = <2 0ec00000   8   /* Config space access */
-+                             0 0 0            /* no IACK cycles */
-+                             2 0ed00000   4   /* Special cycles */
-+                             2 0ec80000 100   /* Internal registers */
-+                             2 0ec80100  fc>; /* Internal messaging registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed
-+                       */
-+                      ranges = <02000000 0 80000000 00000003 80000000 0 80000000
-+                                01000000 0 00000000 00000002 08000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+                      interrupt-map-mask = <f800 0 0 7>;
-+                      interrupt-map = <
-+                              /* IDSEL 1 */
-+                              0800 0 0 1 &UIC0 17 8
-+                              0800 0 0 2 &UIC0 18 8
-+                              0800 0 0 3 &UIC0 19 8
-+                              0800 0 0 4 &UIC0 1a 8
-+
-+                              /* IDSEL 2 */
-+                              1000 0 0 1 &UIC0 18 8
-+                              1000 0 0 2 &UIC0 19 8
-+                              1000 0 0 3 &UIC0 1a 8
-+                              1000 0 0 4 &UIC0 17 8
-+                      >;
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/plb/opb/serial@40000300";
-+      };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/tqm5200.dts
-@@ -0,0 +1,184 @@
-+/*
-+ * TQM5200 board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.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.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+      model = "tqc,tqm5200";
-+      compatible = "tqc,tqm5200";
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              PowerPC,5200@0 {
-+                      device_type = "cpu";
-+                      reg = <0>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-line-size = <20>;
-+                      d-cache-size = <4000>;          // L1, 16K
-+                      i-cache-size = <4000>;          // L1, 16K
-+                      timebase-frequency = <0>;       // from bootloader
-+                      bus-frequency = <0>;            // from bootloader
-+                      clock-frequency = <0>;          // from bootloader
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <00000000 04000000>;      // 64MB
-+      };
-+
-+      soc5200@f0000000 {
-+              model = "fsl,mpc5200";
-+              compatible = "fsl,mpc5200";
-+              revision = "";                  // from bootloader
-+              device_type = "soc";
-+              ranges = <0 f0000000 0000c000>;
-+              reg = <f0000000 00000100>;
-+              bus-frequency = <0>;            // from bootloader
-+              system-frequency = <0>;         // from bootloader
-+
-+              cdm@200 {
-+                      compatible = "mpc5200-cdm";
-+                      reg = <200 38>;
-+              };
-+
-+              mpc5200_pic: pic@500 {
-+                      // 5200 interrupts are encoded into two levels;
-+                      interrupt-controller;
-+                      #interrupt-cells = <3>;
-+                      compatible = "mpc5200-pic";
-+                      reg = <500 80>;
-+              };
-+
-+              gpt@600 {       // General Purpose Timer
-+                      compatible = "fsl,mpc5200-gpt";
-+                      reg = <600 10>;
-+                      interrupts = <1 9 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl,has-wdt;
-+              };
-+
-+              gpio@b00 {
-+                      compatible = "mpc5200-gpio";
-+                      reg = <b00 40>;
-+                      interrupts = <1 7 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              usb@1000 {
-+                      compatible = "mpc5200-ohci","ohci-be";
-+                      reg = <1000 ff>;
-+                      interrupts = <2 6 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              dma-controller@1200 {
-+                      compatible = "mpc5200-bestcomm";
-+                      reg = <1200 80>;
-+                      interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
-+                                    3 4 0  3 5 0  3 6 0  3 7 0
-+                                    3 8 0  3 9 0  3 a 0  3 b 0
-+                                    3 c 0  3 d 0  3 e 0  3 f 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              xlb@1f00 {
-+                      compatible = "mpc5200-xlb";
-+                      reg = <1f00 100>;
-+              };
-+
-+              serial@2000 {           // PSC1
-+                      device_type = "serial";
-+                      compatible = "mpc5200-psc-uart";
-+                      port-number = <0>;  // Logical port assignment
-+                      reg = <2000 100>;
-+                      interrupts = <2 1 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              serial@2200 {           // PSC2
-+                      device_type = "serial";
-+                      compatible = "mpc5200-psc-uart";
-+                      port-number = <1>;  // Logical port assignment
-+                      reg = <2200 100>;
-+                      interrupts = <2 2 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              serial@2400 {           // PSC3
-+                      device_type = "serial";
-+                      compatible = "mpc5200-psc-uart";
-+                      port-number = <2>;  // Logical port assignment
-+                      reg = <2400 100>;
-+                      interrupts = <2 3 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              ethernet@3000 {
-+                      device_type = "network";
-+                      compatible = "mpc5200-fec";
-+                      reg = <3000 800>;
-+                      local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+                      interrupts = <2 5 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              ata@3a00 {
-+                      compatible = "mpc5200-ata";
-+                      reg = <3a00 100>;
-+                      interrupts = <2 7 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+              };
-+
-+              i2c@3d40 {
-+                      compatible = "mpc5200-i2c","fsl-i2c";
-+                      reg = <3d40 40>;
-+                      interrupts = <2 10 0>;
-+                      interrupt-parent = <&mpc5200_pic>;
-+                      fsl5200-clocking;
-+              };
-+
-+              sram@8000 {
-+                      compatible = "mpc5200-sram";
-+                      reg = <8000 4000>;
-+              };
-+      };
-+
-+      pci@f0000d00 {
-+              #interrupt-cells = <1>;
-+              #size-cells = <2>;
-+              #address-cells = <3>;
-+              device_type = "pci";
-+              compatible = "fsl,mpc5200-pci";
-+              reg = <f0000d00 100>;
-+              interrupt-map-mask = <f800 0 0 7>;
-+              interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3
-+                               c000 0 0 2 &mpc5200_pic 0 0 3
-+                               c000 0 0 3 &mpc5200_pic 0 0 3
-+                               c000 0 0 4 &mpc5200_pic 0 0 3>;
-+              clock-frequency = <0>; // From boot loader
-+              interrupts = <2 8 0 2 9 0 2 a 0>;
-+              interrupt-parent = <&mpc5200_pic>;
-+              bus-range = <0 0>;
-+              ranges = <42000000 0 80000000 80000000 0 10000000
-+                        02000000 0 90000000 90000000 0 10000000
-+                        01000000 0 00000000 a0000000 0 01000000>;
-+      };
-+};
---- a/arch/powerpc/boot/dts/walnut.dts
-+++ b/arch/powerpc/boot/dts/walnut.dts
-@@ -14,14 +14,21 @@
-       #size-cells = <1>;
-       model = "ibm,walnut";
-       compatible = "ibm,walnut";
--      dcr-parent = <&/cpus/PowerPC,405GP@0>;
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC;
-+              serial0 = &UART0;
-+              serial1 = &UART1;
-+      };
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
--              PowerPC,405GP@0 {
-+              cpu@0 {
-                       device_type = "cpu";
-+                      model = "PowerPC,405GP";
-                       reg = <0>;
-                       clock-frequency = <bebc200>; /* Filled in by zImage */
-                       timebase-frequency = <0>; /* Filled in by zImage */
-@@ -168,9 +175,10 @@
-                               };
-                       };
--                      ds1743@1,0 {
-+                      nvram@1,0 {
-                               /* NVRAM and RTC */
--                              compatible = "ds1743";
-+                              compatible = "ds1743-nvram";
-+                              #bytes = <2000>;
-                               reg = <1 0 2000>;
-                       };
-@@ -190,6 +198,45 @@
-                               virtual-reg = <f0300005>;
-                       };
-               };
-+
-+              PCI0: pci@ec000000 {
-+                      device_type = "pci";
-+                      #interrupt-cells = <1>;
-+                      #size-cells = <2>;
-+                      #address-cells = <3>;
-+                      compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
-+                      primary;
-+                      reg = <eec00000 8       /* Config space access */
-+                             eed80000 4       /* IACK */
-+                             eed80000 4       /* Special cycle */
-+                             ef480000 40>;    /* Internal registers */
-+
-+                      /* Outbound ranges, one memory and one IO,
-+                       * later cannot be changed. Chip supports a second
-+                       * IO range but we don't use it for now
-+                       */
-+                      ranges = <02000000 0 80000000 80000000 0 20000000
-+                                01000000 0 00000000 e8000000 0 00010000>;
-+
-+                      /* Inbound 2GB range starting at 0 */
-+                      dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+                      /* Walnut has all 4 IRQ pins tied together per slot */
-+                      interrupt-map-mask = <f800 0 0 0>;
-+                      interrupt-map = <
-+                              /* IDSEL 1 */
-+                              0800 0 0 0 &UIC0 1c 8
-+
-+                              /* IDSEL 2 */
-+                              1000 0 0 0 &UIC0 1d 8
-+
-+                              /* IDSEL 3 */
-+                              1800 0 0 0 &UIC0 1e 8
-+
-+                              /* IDSEL 4 */
-+                              2000 0 0 0 &UIC0 1f 8
-+                      >;
-+              };
-       };
-       chosen {
---- /dev/null
-+++ b/arch/powerpc/boot/dts/warp.dts
-@@ -0,0 +1,239 @@
-+/*
-+ * Device Tree Source for PIKA Warp
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ *   Sean MacLennan <smaclennan@pikatech.com>
-+ *
-+ * 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.
-+ */
-+
-+/ {
-+      #address-cells = <2>;
-+      #size-cells = <1>;
-+      model = "pika,warp";
-+      compatible = "pika,warp";
-+      dcr-parent = <&/cpus/cpu@0>;
-+
-+      aliases {
-+              ethernet0 = &EMAC0;
-+              serial0 = &UART0;
-+      };
-+
-+      cpus {
-+              #address-cells = <1>;
-+              #size-cells = <0>;
-+
-+              cpu@0 {
-+                      device_type = "cpu";
-+                      model = "PowerPC,440EP";
-+                      reg = <0>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+                      timebase-frequency = <0>; /* Filled in by zImage */
-+                      i-cache-line-size = <20>;
-+                      d-cache-line-size = <20>;
-+                      i-cache-size = <8000>;
-+                      d-cache-size = <8000>;
-+                      dcr-controller;
-+                      dcr-access-method = "native";
-+              };
-+      };
-+
-+      memory {
-+              device_type = "memory";
-+              reg = <0 0 0>; /* Filled in by zImage */
-+      };
-+
-+      UIC0: interrupt-controller0 {
-+              compatible = "ibm,uic-440ep","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <0>;
-+              dcr-reg = <0c0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+      };
-+
-+      UIC1: interrupt-controller1 {
-+              compatible = "ibm,uic-440ep","ibm,uic";
-+              interrupt-controller;
-+              cell-index = <1>;
-+              dcr-reg = <0d0 009>;
-+              #address-cells = <0>;
-+              #size-cells = <0>;
-+              #interrupt-cells = <2>;
-+              interrupts = <1e 4 1f 4>; /* cascade */
-+              interrupt-parent = <&UIC0>;
-+      };
-+
-+      SDR0: sdr {
-+              compatible = "ibm,sdr-440ep";
-+              dcr-reg = <00e 002>;
-+      };
-+
-+      CPR0: cpr {
-+              compatible = "ibm,cpr-440ep";
-+              dcr-reg = <00c 002>;
-+      };
-+
-+      plb {
-+              compatible = "ibm,plb-440ep", "ibm,plb-440gp", "ibm,plb4";
-+              #address-cells = <2>;
-+              #size-cells = <1>;
-+              ranges;
-+              clock-frequency = <0>; /* Filled in by zImage */
-+
-+              SDRAM0: sdram {
-+                      compatible = "ibm,sdram-440ep", "ibm,sdram-405gp";
-+                      dcr-reg = <010 2>;
-+              };
-+
-+              DMA0: dma {
-+                      compatible = "ibm,dma-440ep", "ibm,dma-440gp";
-+                      dcr-reg = <100 027>;
-+              };
-+
-+              MAL0: mcmal {
-+                      compatible = "ibm,mcmal-440ep", "ibm,mcmal-440gp", "ibm,mcmal";
-+                      dcr-reg = <180 62>;
-+                      num-tx-chans = <4>;
-+                      num-rx-chans = <2>;
-+                      interrupt-parent = <&MAL0>;
-+                      interrupts = <0 1 2 3 4>;
-+                      #interrupt-cells = <1>;
-+                      #address-cells = <0>;
-+                      #size-cells = <0>;
-+                      interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+                                      /*RXEOB*/ 1 &UIC0 b 4
-+                                      /*SERR*/  2 &UIC1 0 4
-+                                      /*TXDE*/  3 &UIC1 1 4
-+                                      /*RXDE*/  4 &UIC1 2 4>;
-+              };
-+
-+              POB0: opb {
-+                      compatible = "ibm,opb-440ep", "ibm,opb-440gp", "ibm,opb";
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+                      ranges = <00000000 0 00000000 80000000
-+                                80000000 0 80000000 80000000>;
-+                      interrupt-parent = <&UIC1>;
-+                      interrupts = <7 4>;
-+                      clock-frequency = <0>; /* Filled in by zImage */
-+
-+                      EBC0: ebc {
-+                              compatible = "ibm,ebc-440ep", "ibm,ebc-440gp", "ibm,ebc";
-+                              dcr-reg = <012 2>;
-+                              #address-cells = <2>;
-+                              #size-cells = <1>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              interrupts = <5 1>;
-+                              interrupt-parent = <&UIC1>;
-+
-+                              fpga@2,0 {
-+                                      compatible = "pika,fpga";
-+                                      reg = <2 0 2200>;
-+                                      interrupts = <18 8>;
-+                                      interrupt-parent = <&UIC0>;
-+                              };
-+
-+                              nor_flash@0,0 {
-+                                      compatible = "amd,s29gl512n", "cfi-flash";
-+                                      bank-width = <2>;
-+                                      reg = <0 0 4000000>;
-+                                      #address-cells = <1>;
-+                                      #size-cells = <1>;
-+                                      partition@0 {
-+                                              label = "kernel";
-+                                              reg = <0 180000>;
-+                                      };
-+                                      partition@180000 {
-+                                              label = "root";
-+                                              reg = <180000 3480000>;
-+                                      };
-+                                      partition@3600000 {
-+                                              label = "user";
-+                                              reg = <3600000 900000>;
-+                                      };
-+                                      partition@3f00000 {
-+                                              label = "fpga";
-+                                              reg = <3f00000 40000>;
-+                                      };
-+                                      partition@3f40000 {
-+                                              label = "env";
-+                                              reg = <3f40000 40000>;
-+                                      };
-+                                      partition@3f80000 {
-+                                              label = "u-boot";
-+                                              reg = <3f80000 80000>;
-+                                      };
-+                              };
-+                      };
-+
-+                      UART0: serial@ef600300 {
-+                              device_type = "serial";
-+                              compatible = "ns16550";
-+                              reg = <ef600300 8>;
-+                              virtual-reg = <ef600300>;
-+                              clock-frequency = <0>; /* Filled in by zImage */
-+                              current-speed = <1c200>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <0 4>;
-+                      };
-+
-+                      IIC0: i2c@ef600700 {
-+                              compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
-+                              reg = <ef600700 14>;
-+                              interrupt-parent = <&UIC0>;
-+                              interrupts = <2 4>;
-+                      };
-+
-+                      GPIO0: gpio@ef600b00 {
-+                              compatible = "ibm,gpio-440ep";
-+                              reg = <ef600b00 48>;
-+                      };
-+
-+                      GPIO1: gpio@ef600c00 {
-+                              compatible = "ibm,gpio-440ep";
-+                              reg = <ef600c00 48>;
-+                      };
-+
-+                      ZMII0: emac-zmii@ef600d00 {
-+                              compatible = "ibm,zmii-440ep", "ibm,zmii-440gp", "ibm,zmii";
-+                              reg = <ef600d00 c>;
-+                      };
-+
-+                      EMAC0: ethernet@ef600e00 {
-+                              linux,network-index = <0>;
-+                              device_type = "network";
-+                              compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
-+                              interrupt-parent = <&UIC1>;
-+                              interrupts = <1c 4 1d 4>;
-+                              reg = <ef600e00 70>;
-+                              local-mac-address = [000000000000];
-+                              mal-device = <&MAL0>;
-+                              mal-tx-channel = <0 1>;
-+                              mal-rx-channel = <0>;
-+                              cell-index = <0>;
-+                              max-frame-size = <5dc>;
-+                              rx-fifo-size = <1000>;
-+                              tx-fifo-size = <800>;
-+                              phy-mode = "rmii";
-+                              phy-map = <00000000>;
-+                              zmii-device = <&ZMII0>;
-+                              zmii-channel = <0>;
-+                      };
-+
-+                      usb@ef601000 {
-+                              compatible = "ohci-be";
-+                              reg = <ef601000 80>;
-+                              interrupts = <8 1 9 1>;
-+                              interrupt-parent = < &UIC1 >;
-+                      };
-+              };
-+      };
-+
-+      chosen {
-+              linux,stdout-path = "/plb/opb/serial@ef600300";
-+      };
-+};
---- a/arch/powerpc/boot/ebony.c
-+++ b/arch/powerpc/boot/ebony.c
-@@ -31,66 +31,6 @@
- static u8 *ebony_mac0, *ebony_mac1;
--/* Calculate 440GP clocks */
--void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
--{
--      u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
--      u32 cr0 = mfdcr(DCRN_CPC0_CR0);
--      u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
--      u32 opdv = CPC0_SYS0_OPDV(sys0);
--      u32 epdv = CPC0_SYS0_EPDV(sys0);
--
--      if (sys0 & CPC0_SYS0_BYPASS) {
--              /* Bypass system PLL */
--              cpu = plb = sysclk;
--      } else {
--              if (sys0 & CPC0_SYS0_EXTSL)
--                      /* PerClk */
--                      m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
--              else
--                      /* CPU clock */
--                      m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
--              cpu = sysclk * m / CPC0_SYS0_FWDVA(sys0);
--              plb = sysclk * m / CPC0_SYS0_FWDVB(sys0);
--      }
--
--      opb = plb / opdv;
--      ebc = opb / epdv;
--
--      /* FIXME: Check if this is for all 440GP, or just Ebony */
--      if ((mfpvr() & 0xf0000fff) == 0x40000440)
--              /* Rev. B 440GP, use external system clock */
--              tb = sysclk;
--      else
--              /* Rev. C 440GP, errata force us to use internal clock */
--              tb = cpu;
--
--      if (cr0 & CPC0_CR0_U0EC)
--              /* External UART clock */
--              uart0 = ser_clk;
--      else
--              /* Internal UART clock */
--              uart0 = plb / CPC0_CR0_UDIV(cr0);
--
--      if (cr0 & CPC0_CR0_U1EC)
--              /* External UART clock */
--              uart1 = ser_clk;
--      else
--              /* Internal UART clock */
--              uart1 = plb / CPC0_CR0_UDIV(cr0);
--
--      printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
--             (sysclk + 500000) / 1000000, sysclk);
--
--      dt_fixup_cpu_clocks(cpu, tb, 0);
--
--      dt_fixup_clock("/plb", plb);
--      dt_fixup_clock("/plb/opb", opb);
--      dt_fixup_clock("/plb/opb/ebc", ebc);
--      dt_fixup_clock("/plb/opb/serial@40000200", uart0);
--      dt_fixup_clock("/plb/opb/serial@40000300", uart1);
--}
--
- #define EBONY_FPGA_PATH               "/plb/opb/ebc/fpga"
- #define       EBONY_FPGA_FLASH_SEL    0x01
- #define EBONY_SMALL_FLASH_PATH        "/plb/opb/ebc/small-flash"
-@@ -134,7 +74,7 @@ static void ebony_fixups(void)
-       unsigned long sysclk = 33000000;
-       ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
--      ibm4xx_fixup_memsize();
-+      ibm4xx_sdram_fixup_memsize();
-       dt_fixup_mac_addresses(ebony_mac0, ebony_mac1);
-       ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-       ebony_flashsel_fixup();
-@@ -146,6 +86,6 @@ void ebony_init(void *mac0, void *mac1)
-       platform_ops.exit = ibm44x_dbcr_reset;
-       ebony_mac0 = mac0;
-       ebony_mac1 = mac1;
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/ep405.c
-@@ -0,0 +1,74 @@
-+/*
-+ * Embedded Planet EP405 with PlanetCore firmware
-+ *
-+ * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\
-+ *
-+ * Based on ep88xc.c by
-+ *
-+ * Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "planetcore.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "io.h"
-+
-+static char *table;
-+static u64 mem_size;
-+
-+static void platform_fixups(void)
-+{
-+      u64 val;
-+      void *nvrtc;
-+
-+      dt_fixup_memory(0, mem_size);
-+      planetcore_set_mac_addrs(table);
-+
-+      if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
-+              printf("No PlanetCore crystal frequency key.\r\n");
-+              return;
-+      }
-+      ibm405gp_fixup_clocks(val, 0xa8c000);
-+      ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
-+      ibm4xx_fixup_ebc_ranges("/plb/ebc");
-+
-+      if (!planetcore_get_decimal(table, PLANETCORE_KEY_KB_NVRAM, &val)) {
-+              printf("No PlanetCore NVRAM size key.\r\n");
-+              return;
-+      }
-+      nvrtc = finddevice("/plb/ebc/nvrtc@4,200000");
-+      if (nvrtc != NULL) {
-+              u32 reg[3] = { 4, 0x200000, 0};
-+              getprop(nvrtc, "reg", reg, 3);
-+              reg[2] = (val << 10) & 0xffffffff;
-+              setprop(nvrtc, "reg", reg, 3);
-+      }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                 unsigned long r6, unsigned long r7)
-+{
-+      table = (char *)r3;
-+      planetcore_prepare_table(table);
-+
-+      if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
-+              return;
-+
-+      mem_size *= 1024 * 1024;
-+      simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
-+
-+      fdt_init(_dtb_start);
-+
-+      planetcore_set_stdout_path(table);
-+
-+      serial_console_init();
-+      platform_ops.fixups = platform_fixups;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/ep8248e.c
-@@ -0,0 +1,55 @@
-+/*
-+ * Embedded Planet EP8248E with PlanetCore firmware
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "planetcore.h"
-+#include "pq2.h"
-+
-+static char *table;
-+static u64 mem_size;
-+
-+#include <io.h>
-+
-+static void platform_fixups(void)
-+{
-+      u64 val;
-+
-+      dt_fixup_memory(0, mem_size);
-+      planetcore_set_mac_addrs(table);
-+
-+      if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
-+              printf("No PlanetCore crystal frequency key.\r\n");
-+              return;
-+      }
-+
-+      pq2_fixup_clocks(val);
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                   unsigned long r6, unsigned long r7)
-+{
-+      table = (char *)r3;
-+      planetcore_prepare_table(table);
-+
-+      if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
-+              return;
-+
-+      mem_size *= 1024 * 1024;
-+      simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
-+
-+      fdt_init(_dtb_start);
-+
-+      planetcore_set_stdout_path(table);
-+      serial_console_init();
-+      platform_ops.fixups = platform_fixups;
-+}
---- a/arch/powerpc/boot/ep88xc.c
-+++ b/arch/powerpc/boot/ep88xc.c
-@@ -45,7 +45,7 @@ void platform_init(unsigned long r3, uns
-       mem_size *= 1024 * 1024;
-       simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       planetcore_set_stdout_path(table);
---- a/arch/powerpc/boot/flatdevtree.c
-+++ /dev/null
-@@ -1,1036 +0,0 @@
--/*
-- * This 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, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-- *
-- * Copyright Pantelis Antoniou 2006
-- * Copyright (C) IBM Corporation 2006
-- *
-- * Authors: Pantelis Antoniou <pantelis@embeddedalley.com>
-- *        Hollis Blanchard <hollisb@us.ibm.com>
-- *        Mark A. Greer <mgreer@mvista.com>
-- *        Paul Mackerras <paulus@samba.org>
-- */
--
--#include <string.h>
--#include <stddef.h>
--#include "flatdevtree.h"
--#include "flatdevtree_env.h"
--
--#define _ALIGN(x, al) (((x) + (al) - 1) & ~((al) - 1))
--
--static char *ft_root_node(struct ft_cxt *cxt)
--{
--      return cxt->rgn[FT_STRUCT].start;
--}
--
--/* Routines for keeping node ptrs returned by ft_find_device current */
--/* First entry not used b/c it would return 0 and be taken as NULL/error */
--static void *ft_get_phandle(struct ft_cxt *cxt, char *node)
--{
--      unsigned int i;
--
--      if (!node)
--              return NULL;
--
--      for (i = 1; i < cxt->nodes_used; i++)   /* already there? */
--              if (cxt->node_tbl[i] == node)
--                      return (void *)i;
--
--      if (cxt->nodes_used < cxt->node_max) {
--              cxt->node_tbl[cxt->nodes_used] = node;
--              return (void *)cxt->nodes_used++;
--      }
--
--      return NULL;
--}
--
--static char *ft_node_ph2node(struct ft_cxt *cxt, const void *phandle)
--{
--      unsigned int i = (unsigned int)phandle;
--
--      if (i < cxt->nodes_used)
--              return cxt->node_tbl[i];
--      return NULL;
--}
--
--static void ft_node_update_before(struct ft_cxt *cxt, char *addr, int shift)
--{
--      unsigned int i;
--
--      if (shift == 0)
--              return;
--
--      for (i = 1; i < cxt->nodes_used; i++)
--              if (cxt->node_tbl[i] < addr)
--                      cxt->node_tbl[i] += shift;
--}
--
--static void ft_node_update_after(struct ft_cxt *cxt, char *addr, int shift)
--{
--      unsigned int i;
--
--      if (shift == 0)
--              return;
--
--      for (i = 1; i < cxt->nodes_used; i++)
--              if (cxt->node_tbl[i] >= addr)
--                      cxt->node_tbl[i] += shift;
--}
--
--/* Struct used to return info from ft_next() */
--struct ft_atom {
--      u32 tag;
--      const char *name;
--      void *data;
--      u32 size;
--};
--
--/* Set ptrs to current one's info; return addr of next one */
--static char *ft_next(struct ft_cxt *cxt, char *p, struct ft_atom *ret)
--{
--      u32 sz;
--
--      if (p >= cxt->rgn[FT_STRUCT].start + cxt->rgn[FT_STRUCT].size)
--              return NULL;
--
--      ret->tag = be32_to_cpu(*(u32 *) p);
--      p += 4;
--
--      switch (ret->tag) {     /* Tag */
--      case OF_DT_BEGIN_NODE:
--              ret->name = p;
--              ret->data = (void *)(p - 4);    /* start of node */
--              p += _ALIGN(strlen(p) + 1, 4);
--              break;
--      case OF_DT_PROP:
--              ret->size = sz = be32_to_cpu(*(u32 *) p);
--              ret->name = cxt->str_anchor + be32_to_cpu(*(u32 *) (p + 4));
--              ret->data = (void *)(p + 8);
--              p += 8 + _ALIGN(sz, 4);
--              break;
--      case OF_DT_END_NODE:
--      case OF_DT_NOP:
--              break;
--      case OF_DT_END:
--      default:
--              p = NULL;
--              break;
--      }
--
--      return p;
--}
--
--#define HDR_SIZE      _ALIGN(sizeof(struct boot_param_header), 8)
--#define EXPAND_INCR   1024    /* alloc this much extra when expanding */
--
--/* Copy the tree to a newly-allocated region and put things in order */
--static int ft_reorder(struct ft_cxt *cxt, int nextra)
--{
--      unsigned long tot;
--      enum ft_rgn_id r;
--      char *p, *pend;
--      int stroff;
--
--      tot = HDR_SIZE + EXPAND_INCR;
--      for (r = FT_RSVMAP; r <= FT_STRINGS; ++r)
--              tot += cxt->rgn[r].size;
--      if (nextra > 0)
--              tot += nextra;
--      tot = _ALIGN(tot, 8);
--
--      if (!cxt->realloc)
--              return 0;
--      p = cxt->realloc(NULL, tot);
--      if (!p)
--              return 0;
--
--      memcpy(p, cxt->bph, sizeof(struct boot_param_header));
--      /* offsets get fixed up later */
--
--      cxt->bph = (struct boot_param_header *)p;
--      cxt->max_size = tot;
--      pend = p + tot;
--      p += HDR_SIZE;
--
--      memcpy(p, cxt->rgn[FT_RSVMAP].start, cxt->rgn[FT_RSVMAP].size);
--      cxt->rgn[FT_RSVMAP].start = p;
--      p += cxt->rgn[FT_RSVMAP].size;
--
--      memcpy(p, cxt->rgn[FT_STRUCT].start, cxt->rgn[FT_STRUCT].size);
--      ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
--                      p - cxt->rgn[FT_STRUCT].start);
--      cxt->p += p - cxt->rgn[FT_STRUCT].start;
--      cxt->rgn[FT_STRUCT].start = p;
--
--      p = pend - cxt->rgn[FT_STRINGS].size;
--      memcpy(p, cxt->rgn[FT_STRINGS].start, cxt->rgn[FT_STRINGS].size);
--      stroff = cxt->str_anchor - cxt->rgn[FT_STRINGS].start;
--      cxt->rgn[FT_STRINGS].start = p;
--      cxt->str_anchor = p + stroff;
--
--      cxt->isordered = 1;
--      return 1;
--}
--
--static inline char *prev_end(struct ft_cxt *cxt, enum ft_rgn_id r)
--{
--      if (r > FT_RSVMAP)
--              return cxt->rgn[r - 1].start + cxt->rgn[r - 1].size;
--      return (char *)cxt->bph + HDR_SIZE;
--}
--
--static inline char *next_start(struct ft_cxt *cxt, enum ft_rgn_id r)
--{
--      if (r < FT_STRINGS)
--              return cxt->rgn[r + 1].start;
--      return (char *)cxt->bph + cxt->max_size;
--}
--
--/*
-- * See if we can expand region rgn by nextra bytes by using up
-- * free space after or before the region.
-- */
--static int ft_shuffle(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
--              int nextra)
--{
--      char *p = *pp;
--      char *rgn_start, *rgn_end;
--
--      rgn_start = cxt->rgn[rgn].start;
--      rgn_end = rgn_start + cxt->rgn[rgn].size;
--      if (nextra <= 0 || rgn_end + nextra <= next_start(cxt, rgn)) {
--              /* move following stuff */
--              if (p < rgn_end) {
--                      if (nextra < 0)
--                              memmove(p, p - nextra, rgn_end - p + nextra);
--                      else
--                              memmove(p + nextra, p, rgn_end - p);
--                      if (rgn == FT_STRUCT)
--                              ft_node_update_after(cxt, p, nextra);
--              }
--              cxt->rgn[rgn].size += nextra;
--              if (rgn == FT_STRINGS)
--                      /* assumes strings only added at beginning */
--                      cxt->str_anchor += nextra;
--              return 1;
--      }
--      if (prev_end(cxt, rgn) <= rgn_start - nextra) {
--              /* move preceding stuff */
--              if (p > rgn_start) {
--                      memmove(rgn_start - nextra, rgn_start, p - rgn_start);
--                      if (rgn == FT_STRUCT)
--                              ft_node_update_before(cxt, p, -nextra);
--              }
--              *pp -= nextra;
--              cxt->rgn[rgn].start -= nextra;
--              cxt->rgn[rgn].size += nextra;
--              return 1;
--      }
--      return 0;
--}
--
--static int ft_make_space(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
--                       int nextra)
--{
--      unsigned long size, ssize, tot;
--      char *str, *next;
--      enum ft_rgn_id r;
--
--      if (!cxt->isordered) {
--              unsigned long rgn_off = *pp - cxt->rgn[rgn].start;
--
--              if (!ft_reorder(cxt, nextra))
--                      return 0;
--
--              *pp = cxt->rgn[rgn].start + rgn_off;
--      }
--      if (ft_shuffle(cxt, pp, rgn, nextra))
--              return 1;
--
--      /* See if there is space after the strings section */
--      ssize = cxt->rgn[FT_STRINGS].size;
--      if (cxt->rgn[FT_STRINGS].start + ssize
--                      < (char *)cxt->bph + cxt->max_size) {
--              /* move strings up as far as possible */
--              str = (char *)cxt->bph + cxt->max_size - ssize;
--              cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
--              memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
--              cxt->rgn[FT_STRINGS].start = str;
--              /* enough space now? */
--              if (rgn >= FT_STRUCT && ft_shuffle(cxt, pp, rgn, nextra))
--                      return 1;
--      }
--
--      /* how much total free space is there following this region? */
--      tot = 0;
--      for (r = rgn; r < FT_STRINGS; ++r) {
--              char *r_end = cxt->rgn[r].start + cxt->rgn[r].size;
--              tot += next_start(cxt, rgn) - r_end;
--      }
--
--      /* cast is to shut gcc up; we know nextra >= 0 */
--      if (tot < (unsigned int)nextra) {
--              /* have to reallocate */
--              char *newp, *new_start;
--              int shift;
--
--              if (!cxt->realloc)
--                      return 0;
--              size = _ALIGN(cxt->max_size + (nextra - tot) + EXPAND_INCR, 8);
--              newp = cxt->realloc(cxt->bph, size);
--              if (!newp)
--                      return 0;
--              cxt->max_size = size;
--              shift = newp - (char *)cxt->bph;
--
--              if (shift) { /* realloc can return same addr */
--                      cxt->bph = (struct boot_param_header *)newp;
--                      ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
--                                      shift);
--                      for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
--                              new_start = cxt->rgn[r].start + shift;
--                              cxt->rgn[r].start = new_start;
--                      }
--                      *pp += shift;
--                      cxt->str_anchor += shift;
--              }
--
--              /* move strings up to the end */
--              str = newp + size - ssize;
--              cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
--              memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
--              cxt->rgn[FT_STRINGS].start = str;
--
--              if (ft_shuffle(cxt, pp, rgn, nextra))
--                      return 1;
--      }
--
--      /* must be FT_RSVMAP and we need to move FT_STRUCT up */
--      if (rgn == FT_RSVMAP) {
--              next = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
--                      + nextra;
--              ssize = cxt->rgn[FT_STRUCT].size;
--              if (next + ssize >= cxt->rgn[FT_STRINGS].start)
--                      return 0;       /* "can't happen" */
--              memmove(next, cxt->rgn[FT_STRUCT].start, ssize);
--              ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start, nextra);
--              cxt->rgn[FT_STRUCT].start = next;
--
--              if (ft_shuffle(cxt, pp, rgn, nextra))
--                      return 1;
--      }
--
--      return 0;               /* "can't happen" */
--}
--
--static void ft_put_word(struct ft_cxt *cxt, u32 v)
--{
--      *(u32 *) cxt->p = cpu_to_be32(v);
--      cxt->p += 4;
--}
--
--static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
--{
--      unsigned long sza = _ALIGN(sz, 4);
--
--      /* zero out the alignment gap if necessary */
--      if (sz < sza)
--              *(u32 *) (cxt->p + sza - 4) = 0;
--
--      /* copy in the data */
--      memcpy(cxt->p, data, sz);
--
--      cxt->p += sza;
--}
--
--char *ft_begin_node(struct ft_cxt *cxt, const char *name)
--{
--      unsigned long nlen = strlen(name) + 1;
--      unsigned long len = 8 + _ALIGN(nlen, 4);
--      char *ret;
--
--      if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
--              return NULL;
--
--      ret = cxt->p;
--
--      ft_put_word(cxt, OF_DT_BEGIN_NODE);
--      ft_put_bin(cxt, name, strlen(name) + 1);
--
--      return ret;
--}
--
--void ft_end_node(struct ft_cxt *cxt)
--{
--      ft_put_word(cxt, OF_DT_END_NODE);
--}
--
--void ft_nop(struct ft_cxt *cxt)
--{
--      if (ft_make_space(cxt, &cxt->p, FT_STRUCT, 4))
--              ft_put_word(cxt, OF_DT_NOP);
--}
--
--#define NO_STRING     0x7fffffff
--
--static int lookup_string(struct ft_cxt *cxt, const char *name)
--{
--      char *p, *end;
--
--      p = cxt->rgn[FT_STRINGS].start;
--      end = p + cxt->rgn[FT_STRINGS].size;
--      while (p < end) {
--              if (strcmp(p, (char *)name) == 0)
--                      return p - cxt->str_anchor;
--              p += strlen(p) + 1;
--      }
--
--      return NO_STRING;
--}
--
--/* lookup string and insert if not found */
--static int map_string(struct ft_cxt *cxt, const char *name)
--{
--      int off;
--      char *p;
--
--      off = lookup_string(cxt, name);
--      if (off != NO_STRING)
--              return off;
--      p = cxt->rgn[FT_STRINGS].start;
--      if (!ft_make_space(cxt, &p, FT_STRINGS, strlen(name) + 1))
--              return NO_STRING;
--      strcpy(p, name);
--      return p - cxt->str_anchor;
--}
--
--int ft_prop(struct ft_cxt *cxt, const char *name, const void *data,
--              unsigned int sz)
--{
--      int off, len;
--
--      off = map_string(cxt, name);
--      if (off == NO_STRING)
--              return -1;
--
--      len = 12 + _ALIGN(sz, 4);
--      if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
--              return -1;
--
--      ft_put_word(cxt, OF_DT_PROP);
--      ft_put_word(cxt, sz);
--      ft_put_word(cxt, off);
--      ft_put_bin(cxt, data, sz);
--      return 0;
--}
--
--int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
--{
--      return ft_prop(cxt, name, str, strlen(str) + 1);
--}
--
--int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val)
--{
--      u32 v = cpu_to_be32((u32) val);
--
--      return ft_prop(cxt, name, &v, 4);
--}
--
--/* Calculate the size of the reserved map */
--static unsigned long rsvmap_size(struct ft_cxt *cxt)
--{
--      struct ft_reserve *res;
--
--      res = (struct ft_reserve *)cxt->rgn[FT_RSVMAP].start;
--      while (res->start || res->len)
--              ++res;
--      return (char *)(res + 1) - cxt->rgn[FT_RSVMAP].start;
--}
--
--/* Calculate the size of the struct region by stepping through it */
--static unsigned long struct_size(struct ft_cxt *cxt)
--{
--      char *p = cxt->rgn[FT_STRUCT].start;
--      char *next;
--      struct ft_atom atom;
--
--      /* make check in ft_next happy */
--      if (cxt->rgn[FT_STRUCT].size == 0)
--              cxt->rgn[FT_STRUCT].size = 0xfffffffful - (unsigned long)p;
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL)
--              p = next;
--      return p + 4 - cxt->rgn[FT_STRUCT].start;
--}
--
--/* add `adj' on to all string offset values in the struct area */
--static void adjust_string_offsets(struct ft_cxt *cxt, int adj)
--{
--      char *p = cxt->rgn[FT_STRUCT].start;
--      char *next;
--      struct ft_atom atom;
--      int off;
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              if (atom.tag == OF_DT_PROP) {
--                      off = be32_to_cpu(*(u32 *) (p + 8));
--                      *(u32 *) (p + 8) = cpu_to_be32(off + adj);
--              }
--              p = next;
--      }
--}
--
--/* start construction of the flat OF tree from scratch */
--void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
--              void *(*realloc_fn) (void *, unsigned long))
--{
--      struct boot_param_header *bph = blob;
--      char *p;
--      struct ft_reserve *pres;
--
--      /* clear the cxt */
--      memset(cxt, 0, sizeof(*cxt));
--
--      cxt->bph = bph;
--      cxt->max_size = max_size;
--      cxt->realloc = realloc_fn;
--      cxt->isordered = 1;
--
--      /* zero everything in the header area */
--      memset(bph, 0, sizeof(*bph));
--
--      bph->magic = cpu_to_be32(OF_DT_HEADER);
--      bph->version = cpu_to_be32(0x10);
--      bph->last_comp_version = cpu_to_be32(0x10);
--
--      /* start pointers */
--      cxt->rgn[FT_RSVMAP].start = p = blob + HDR_SIZE;
--      cxt->rgn[FT_RSVMAP].size = sizeof(struct ft_reserve);
--      pres = (struct ft_reserve *)p;
--      cxt->rgn[FT_STRUCT].start = p += sizeof(struct ft_reserve);
--      cxt->rgn[FT_STRUCT].size = 4;
--      cxt->rgn[FT_STRINGS].start = blob + max_size;
--      cxt->rgn[FT_STRINGS].size = 0;
--
--      /* init rsvmap and struct */
--      pres->start = 0;
--      pres->len = 0;
--      *(u32 *) p = cpu_to_be32(OF_DT_END);
--
--      cxt->str_anchor = blob;
--}
--
--/* open up an existing blob to be examined or modified */
--int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
--              unsigned int max_find_device,
--              void *(*realloc_fn) (void *, unsigned long))
--{
--      struct boot_param_header *bph = blob;
--
--      /* can't cope with version < 16 */
--      if (be32_to_cpu(bph->version) < 16)
--              return -1;
--
--      /* clear the cxt */
--      memset(cxt, 0, sizeof(*cxt));
--
--      /* alloc node_tbl to track node ptrs returned by ft_find_device */
--      ++max_find_device;
--      cxt->node_tbl = realloc_fn(NULL, max_find_device * sizeof(char *));
--      if (!cxt->node_tbl)
--              return -1;
--      memset(cxt->node_tbl, 0, max_find_device * sizeof(char *));
--      cxt->node_max = max_find_device;
--      cxt->nodes_used = 1;    /* don't use idx 0 b/c looks like NULL */
--
--      cxt->bph = bph;
--      cxt->max_size = max_size;
--      cxt->realloc = realloc_fn;
--
--      cxt->rgn[FT_RSVMAP].start = blob + be32_to_cpu(bph->off_mem_rsvmap);
--      cxt->rgn[FT_RSVMAP].size = rsvmap_size(cxt);
--      cxt->rgn[FT_STRUCT].start = blob + be32_to_cpu(bph->off_dt_struct);
--      cxt->rgn[FT_STRUCT].size = struct_size(cxt);
--      cxt->rgn[FT_STRINGS].start = blob + be32_to_cpu(bph->off_dt_strings);
--      cxt->rgn[FT_STRINGS].size = be32_to_cpu(bph->dt_strings_size);
--
--      cxt->p = cxt->rgn[FT_STRUCT].start;
--      cxt->str_anchor = cxt->rgn[FT_STRINGS].start;
--
--      return 0;
--}
--
--/* add a reserver physical area to the rsvmap */
--int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)
--{
--      char *p;
--      struct ft_reserve *pres;
--
--      p = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
--              - sizeof(struct ft_reserve);
--      if (!ft_make_space(cxt, &p, FT_RSVMAP, sizeof(struct ft_reserve)))
--              return -1;
--
--      pres = (struct ft_reserve *)p;
--      pres->start = cpu_to_be64(physaddr);
--      pres->len = cpu_to_be64(size);
--
--      return 0;
--}
--
--void ft_begin_tree(struct ft_cxt *cxt)
--{
--      cxt->p = ft_root_node(cxt);
--}
--
--void ft_end_tree(struct ft_cxt *cxt)
--{
--      struct boot_param_header *bph = cxt->bph;
--      char *p, *oldstr, *str, *endp;
--      unsigned long ssize;
--      int adj;
--
--      if (!cxt->isordered)
--              return;         /* we haven't touched anything */
--
--      /* adjust string offsets */
--      oldstr = cxt->rgn[FT_STRINGS].start;
--      adj = cxt->str_anchor - oldstr;
--      if (adj)
--              adjust_string_offsets(cxt, adj);
--
--      /* make strings end on 8-byte boundary */
--      ssize = cxt->rgn[FT_STRINGS].size;
--      endp = (char *)_ALIGN((unsigned long)cxt->rgn[FT_STRUCT].start
--                      + cxt->rgn[FT_STRUCT].size + ssize, 8);
--      str = endp - ssize;
--
--      /* move strings down to end of structs */
--      memmove(str, oldstr, ssize);
--      cxt->str_anchor = str;
--      cxt->rgn[FT_STRINGS].start = str;
--
--      /* fill in header fields */
--      p = (char *)bph;
--      bph->totalsize = cpu_to_be32(endp - p);
--      bph->off_mem_rsvmap = cpu_to_be32(cxt->rgn[FT_RSVMAP].start - p);
--      bph->off_dt_struct = cpu_to_be32(cxt->rgn[FT_STRUCT].start - p);
--      bph->off_dt_strings = cpu_to_be32(cxt->rgn[FT_STRINGS].start - p);
--      bph->dt_strings_size = cpu_to_be32(ssize);
--}
--
--void *ft_find_device(struct ft_cxt *cxt, const void *top, const char *srch_path)
--{
--      char *node;
--
--      if (top) {
--              node = ft_node_ph2node(cxt, top);
--              if (node == NULL)
--                      return NULL;
--      } else {
--              node = ft_root_node(cxt);
--      }
--
--      node = ft_find_descendent(cxt, node, srch_path);
--      return ft_get_phandle(cxt, node);
--}
--
--void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path)
--{
--      struct ft_atom atom;
--      char *p;
--      const char *cp, *q;
--      int cl;
--      int depth = -1;
--      int dmatch = 0;
--      const char *path_comp[FT_MAX_DEPTH];
--
--      cp = srch_path;
--      cl = 0;
--      p = top;
--
--      while ((p = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      ++depth;
--                      if (depth != dmatch)
--                              break;
--                      cxt->genealogy[depth] = atom.data;
--                      cxt->genealogy[depth + 1] = NULL;
--                      if (depth && !(strncmp(atom.name, cp, cl) == 0
--                                      && (atom.name[cl] == '/'
--                                              || atom.name[cl] == '\0'
--                                              || atom.name[cl] == '@')))
--                              break;
--                      path_comp[dmatch] = cp;
--                      /* it matches so far, advance to next path component */
--                      cp += cl;
--                      /* skip slashes */
--                      while (*cp == '/')
--                              ++cp;
--                      /* we're done if this is the end of the string */
--                      if (*cp == 0)
--                              return atom.data;
--                      /* look for end of this component */
--                      q = strchr(cp, '/');
--                      if (q)
--                              cl = q - cp;
--                      else
--                              cl = strlen(cp);
--                      ++dmatch;
--                      break;
--              case OF_DT_END_NODE:
--                      if (depth == 0)
--                              return NULL;
--                      if (dmatch > depth) {
--                              --dmatch;
--                              cl = cp - path_comp[dmatch] - 1;
--                              cp = path_comp[dmatch];
--                              while (cl > 0 && cp[cl - 1] == '/')
--                                      --cl;
--                      }
--                      --depth;
--                      break;
--              }
--      }
--      return NULL;
--}
--
--void *__ft_get_parent(struct ft_cxt *cxt, void *node)
--{
--      int d;
--      struct ft_atom atom;
--      char *p;
--
--      for (d = 0; cxt->genealogy[d] != NULL; ++d)
--              if (cxt->genealogy[d] == node)
--                      return d > 0 ? cxt->genealogy[d - 1] : NULL;
--
--      /* have to do it the hard way... */
--      p = ft_root_node(cxt);
--      d = 0;
--      while ((p = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      cxt->genealogy[d] = atom.data;
--                      if (node == atom.data) {
--                              /* found it */
--                              cxt->genealogy[d + 1] = NULL;
--                              return d > 0 ? cxt->genealogy[d - 1] : NULL;
--                      }
--                      ++d;
--                      break;
--              case OF_DT_END_NODE:
--                      --d;
--                      break;
--              }
--      }
--      return NULL;
--}
--
--void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
--{
--      void *node = ft_node_ph2node(cxt, phandle);
--      if (node == NULL)
--              return NULL;
--
--      node = __ft_get_parent(cxt, node);
--      return ft_get_phandle(cxt, node);
--}
--
--static const void *__ft_get_prop(struct ft_cxt *cxt, void *node,
--                                 const char *propname, unsigned int *len)
--{
--      struct ft_atom atom;
--      int depth = 0;
--
--      while ((node = ft_next(cxt, node, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      ++depth;
--                      break;
--
--              case OF_DT_PROP:
--                      if (depth != 1 || strcmp(atom.name, propname))
--                              break;
--
--                      if (len)
--                              *len = atom.size;
--
--                      return atom.data;
--
--              case OF_DT_END_NODE:
--                      if (--depth <= 0)
--                              return NULL;
--              }
--      }
--
--      return NULL;
--}
--
--int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
--              void *buf, const unsigned int buflen)
--{
--      const void *data;
--      unsigned int size;
--
--      void *node = ft_node_ph2node(cxt, phandle);
--      if (!node)
--              return -1;
--
--      data = __ft_get_prop(cxt, node, propname, &size);
--      if (data) {
--              unsigned int clipped_size = min(size, buflen);
--              memcpy(buf, data, clipped_size);
--              return size;
--      }
--
--      return -1;
--}
--
--void *__ft_find_node_by_prop_value(struct ft_cxt *cxt, void *prev,
--                                   const char *propname, const char *propval,
--                                   unsigned int proplen)
--{
--      struct ft_atom atom;
--      char *p = ft_root_node(cxt);
--      char *next;
--      int past_prev = prev ? 0 : 1;
--      int depth = -1;
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              const void *data;
--              unsigned int size;
--
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      depth++;
--
--                      if (prev == p) {
--                              past_prev = 1;
--                              break;
--                      }
--
--                      if (!past_prev || depth < 1)
--                              break;
--
--                      data = __ft_get_prop(cxt, p, propname, &size);
--                      if (!data || size != proplen)
--                              break;
--                      if (memcmp(data, propval, size))
--                              break;
--
--                      return p;
--
--              case OF_DT_END_NODE:
--                      if (depth-- == 0)
--                              return NULL;
--
--                      break;
--              }
--
--              p = next;
--      }
--
--      return NULL;
--}
--
--void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
--                                 const char *propname, const char *propval,
--                                 int proplen)
--{
--      void *node = NULL;
--
--      if (prev) {
--              node = ft_node_ph2node(cxt, prev);
--
--              if (!node)
--                      return NULL;
--      }
--
--      node = __ft_find_node_by_prop_value(cxt, node, propname,
--                                          propval, proplen);
--      return ft_get_phandle(cxt, node);
--}
--
--int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
--              const void *buf, const unsigned int buflen)
--{
--      struct ft_atom atom;
--      void *node;
--      char *p, *next;
--      int nextra;
--
--      node = ft_node_ph2node(cxt, phandle);
--      if (node == NULL)
--              return -1;
--
--      next = ft_next(cxt, node, &atom);
--      if (atom.tag != OF_DT_BEGIN_NODE)
--              /* phandle didn't point to a node */
--              return -1;
--      p = next;
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
--              case OF_DT_END_NODE:
--                      /* haven't found the property, insert here */
--                      cxt->p = p;
--                      return ft_prop(cxt, propname, buf, buflen);
--              case OF_DT_PROP:
--                      if (strcmp(atom.name, propname))
--                              break;
--                      /* found an existing property, overwrite it */
--                      nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
--                      cxt->p = atom.data;
--                      if (nextra && !ft_make_space(cxt, &cxt->p, FT_STRUCT,
--                                              nextra))
--                              return -1;
--                      *(u32 *) (cxt->p - 8) = cpu_to_be32(buflen);
--                      ft_put_bin(cxt, buf, buflen);
--                      return 0;
--              }
--              p = next;
--      }
--      return -1;
--}
--
--int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
--{
--      struct ft_atom atom;
--      void *node;
--      char *p, *next;
--      int size;
--
--      node = ft_node_ph2node(cxt, phandle);
--      if (node == NULL)
--              return -1;
--
--      p = node;
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--              case OF_DT_END_NODE:
--                      return -1;
--              case OF_DT_PROP:
--                      if (strcmp(atom.name, propname))
--                              break;
--                      /* found the property, remove it */
--                      size = 12 + -_ALIGN(atom.size, 4);
--                      cxt->p = p;
--                      if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, -size))
--                              return -1;
--                      return 0;
--              }
--              p = next;
--      }
--      return -1;
--}
--
--void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
--{
--      struct ft_atom atom;
--      char *p, *next, *ret;
--      int depth = 0;
--
--      if (parent) {
--              p = ft_node_ph2node(cxt, parent);
--              if (!p)
--                      return NULL;
--      } else {
--              p = ft_root_node(cxt);
--      }
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      ++depth;
--                      if (depth == 1 && strcmp(atom.name, name) == 0)
--                              /* duplicate node name, return error */
--                              return NULL;
--                      break;
--              case OF_DT_END_NODE:
--                      --depth;
--                      if (depth > 0)
--                              break;
--                      /* end of node, insert here */
--                      cxt->p = p;
--                      ret = ft_begin_node(cxt, name);
--                      ft_end_node(cxt);
--                      return ft_get_phandle(cxt, ret);
--              }
--              p = next;
--      }
--      return NULL;
--}
--
--/* Returns the start of the path within the provided buffer, or NULL on
-- * error.
-- */
--char *ft_get_path(struct ft_cxt *cxt, const void *phandle,
--                  char *buf, int len)
--{
--      const char *path_comp[FT_MAX_DEPTH];
--      struct ft_atom atom;
--      char *p, *next, *pos;
--      int depth = 0, i;
--      void *node;
--
--      node = ft_node_ph2node(cxt, phandle);
--      if (node == NULL)
--              return NULL;
--
--      p = ft_root_node(cxt);
--
--      while ((next = ft_next(cxt, p, &atom)) != NULL) {
--              switch (atom.tag) {
--              case OF_DT_BEGIN_NODE:
--                      path_comp[depth++] = atom.name;
--                      if (p == node)
--                              goto found;
--
--                      break;
--
--              case OF_DT_END_NODE:
--                      if (--depth == 0)
--                              return NULL;
--              }
--
--              p = next;
--      }
--
--found:
--      pos = buf;
--      for (i = 1; i < depth; i++) {
--              int this_len;
--
--              if (len <= 1)
--                      return NULL;
--
--              *pos++ = '/';
--              len--;
--
--              strncpy(pos, path_comp[i], len);
--
--              if (pos[len - 1] != 0)
--                      return NULL;
--
--              this_len = strlen(pos);
--              len -= this_len;
--              pos += this_len;
--      }
--
--      return buf;
--}
---- a/arch/powerpc/boot/flatdevtree.h
-+++ /dev/null
-@@ -1,113 +0,0 @@
--/*
-- * This 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, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-- */
--
--#ifndef FLATDEVTREE_H
--#define FLATDEVTREE_H
--
--#include "flatdevtree_env.h"
--
--/* Definitions used by the flattened device tree */
--#define OF_DT_HEADER            0xd00dfeed      /* marker */
--#define OF_DT_BEGIN_NODE        0x1     /* Start of node, full name */
--#define OF_DT_END_NODE          0x2     /* End node */
--#define OF_DT_PROP              0x3     /* Property: name off, size, content */
--#define OF_DT_NOP               0x4     /* nop */
--#define OF_DT_END               0x9
--
--#define OF_DT_VERSION           0x10
--
--struct boot_param_header {
--      u32 magic;              /* magic word OF_DT_HEADER */
--      u32 totalsize;          /* total size of DT block */
--      u32 off_dt_struct;      /* offset to structure */
--      u32 off_dt_strings;     /* offset to strings */
--      u32 off_mem_rsvmap;     /* offset to memory reserve map */
--      u32 version;            /* format version */
--      u32 last_comp_version;  /* last compatible version */
--      /* version 2 fields below */
--      u32 boot_cpuid_phys;    /* Physical CPU id we're booting on */
--      /* version 3 fields below */
--      u32 dt_strings_size;    /* size of the DT strings block */
--};
--
--struct ft_reserve {
--      u64 start;
--      u64 len;
--};
--
--struct ft_region {
--      char *start;
--      unsigned long size;
--};
--
--enum ft_rgn_id {
--      FT_RSVMAP,
--      FT_STRUCT,
--      FT_STRINGS,
--      FT_N_REGION
--};
--
--#define FT_MAX_DEPTH  50
--
--struct ft_cxt {
--      struct boot_param_header *bph;
--      int max_size;           /* maximum size of tree */
--      int isordered;          /* everything in standard order */
--      void *(*realloc)(void *, unsigned long);
--      char *str_anchor;
--      char *p;                /* current insertion point in structs */
--      struct ft_region rgn[FT_N_REGION];
--      void *genealogy[FT_MAX_DEPTH+1];
--      char **node_tbl;
--      unsigned int node_max;
--      unsigned int nodes_used;
--};
--
--char *ft_begin_node(struct ft_cxt *cxt, const char *name);
--void ft_end_node(struct ft_cxt *cxt);
--
--void ft_begin_tree(struct ft_cxt *cxt);
--void ft_end_tree(struct ft_cxt *cxt);
--
--void ft_nop(struct ft_cxt *cxt);
--int ft_prop(struct ft_cxt *cxt, const char *name,
--          const void *data, unsigned int sz);
--int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
--int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val);
--void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
--            void *(*realloc_fn)(void *, unsigned long));
--int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
--              unsigned int max_find_device,
--              void *(*realloc_fn)(void *, unsigned long));
--int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
--
--void ft_dump_blob(const void *bphp);
--void ft_merge_blob(struct ft_cxt *cxt, void *blob);
--void *ft_find_device(struct ft_cxt *cxt, const void *top,
--                     const char *srch_path);
--void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
--int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
--              void *buf, const unsigned int buflen);
--int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
--              const void *buf, const unsigned int buflen);
--void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
--void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
--                                 const char *propname, const char *propval,
--                                 int proplen);
--void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name);
--char *ft_get_path(struct ft_cxt *cxt, const void *phandle, char *buf, int len);
--
--#endif /* FLATDEVTREE_H */
---- a/arch/powerpc/boot/flatdevtree_misc.c
-+++ /dev/null
-@@ -1,79 +0,0 @@
--/*
-- * This file does the necessary interface mapping between the bootwrapper
-- * device tree operations and the interface provided by shared source
-- * files flatdevicetree.[ch].
-- *
-- * Author: Mark A. Greer <mgreer@mvista.com>
-- *
-- * 2006 (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 <stddef.h>
--#include "flatdevtree.h"
--#include "ops.h"
--
--static struct ft_cxt cxt;
--
--static void *fdtm_finddevice(const char *name)
--{
--      return ft_find_device(&cxt, NULL, name);
--}
--
--static int fdtm_getprop(const void *phandle, const char *propname,
--                        void *buf, const int buflen)
--{
--      return ft_get_prop(&cxt, phandle, propname, buf, buflen);
--}
--
--static int fdtm_setprop(const void *phandle, const char *propname,
--                        const void *buf, const int buflen)
--{
--      return ft_set_prop(&cxt, phandle, propname, buf, buflen);
--}
--
--static void *fdtm_get_parent(const void *phandle)
--{
--      return ft_get_parent(&cxt, phandle);
--}
--
--static void *fdtm_create_node(const void *phandle, const char *name)
--{
--      return ft_create_node(&cxt, phandle, name);
--}
--
--static void *fdtm_find_node_by_prop_value(const void *prev,
--                                          const char *propname,
--                                          const char *propval,
--                                          int proplen)
--{
--      return ft_find_node_by_prop_value(&cxt, prev, propname,
--                                        propval, proplen);
--}
--
--static unsigned long fdtm_finalize(void)
--{
--      ft_end_tree(&cxt);
--      return (unsigned long)cxt.bph;
--}
--
--static char *fdtm_get_path(const void *phandle, char *buf, int len)
--{
--      return ft_get_path(&cxt, phandle, buf, len);
--}
--
--int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
--{
--      dt_ops.finddevice = fdtm_finddevice;
--      dt_ops.getprop = fdtm_getprop;
--      dt_ops.setprop = fdtm_setprop;
--      dt_ops.get_parent = fdtm_get_parent;
--      dt_ops.create_node = fdtm_create_node;
--      dt_ops.find_node_by_prop_value = fdtm_find_node_by_prop_value;
--      dt_ops.finalize = fdtm_finalize;
--      dt_ops.get_path = fdtm_get_path;
--
--      return ft_open(&cxt, dt_blob, max_size, max_find_device,
--                      platform_ops.realloc);
--}
---- a/arch/powerpc/boot/holly.c
-+++ b/arch/powerpc/boot/holly.c
-@@ -28,6 +28,6 @@ void platform_init(unsigned long r3, uns
-       u32 heapsize = 0x8000000 - (u32)_end; /* 128M */
-       simple_alloc_init(_end, heapsize, 32, 64);
--      ft_init(_dtb_start, 0, 4);
-+      fdt_init(_dtb_start);
-       serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/Makefile.libfdt
-@@ -0,0 +1,14 @@
-+# Makefile.libfdt
-+#
-+# This is not a complete Makefile of itself.  Instead, it is designed to
-+# be easily embeddable into other systems of Makefiles.
-+#
-+LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
-+LIBFDT_INCLUDES = fdt.h libfdt.h
-+LIBFDT_EXTRA = libfdt_internal.h
-+LIBFDT_LIB = libfdt/libfdt.a
-+
-+LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
-+
-+$(LIBFDT_objdir)/$(LIBFDT_LIB): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS))
-+
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt.c
-@@ -0,0 +1,156 @@
-+/*
-+ * 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) == 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 void *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 = ALIGN(offset, FDT_TAGSIZE);
-+
-+      return tag;
-+}
-+
-+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 (memeq(p, s, len))
-+                      return p;
-+      return NULL;
-+}
-+
-+int fdt_move(const void *fdt, void *buf, int bufsize)
-+{
-+      int err = fdt_check_header(fdt);
-+
-+      if (err)
-+              return err;
-+
-+      if (fdt_totalsize(fdt) > bufsize)
-+              return -FDT_ERR_NOSPACE;
-+
-+      memmove(buf, fdt, fdt_totalsize(fdt));
-+      return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt.h
-@@ -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 */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_ro.c
-@@ -0,0 +1,583 @@
-+/*
-+ * 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"
-+
-+#define CHECK_HEADER(fdt) \
-+      { \
-+              int err; \
-+              if ((err = fdt_check_header(fdt)) != 0) \
-+                      return err; \
-+      }
-+
-+static int nodename_eq(const void *fdt, int offset,
-+                     const char *s, int len)
-+{
-+      const char *p = fdt_offset_ptr(fdt, offset, 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 (char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
-+}
-+
-+int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
-+{
-+      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 parentoffset,
-+                             const char *name, int namelen)
-+{
-+      int level = 0;
-+      uint32_t tag;
-+      int offset, nextoffset;
-+
-+      CHECK_HEADER(fdt);
-+
-+      tag = fdt_next_tag(fdt, parentoffset, &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 -FDT_ERR_TRUNCATED;
-+
-+              case FDT_BEGIN_NODE:
-+                      level++;
-+                      if (level != 1)
-+                              continue;
-+                      if (nodename_eq(fdt, offset+FDT_TAGSIZE, name, namelen))
-+                              /* Found it! */
-+                              return offset;
-+                      break;
-+
-+              case FDT_END_NODE:
-+                      level--;
-+                      break;
-+
-+              case FDT_PROP:
-+              case FDT_NOP:
-+                      break;
-+
-+              default:
-+                      return -FDT_ERR_BADSTRUCTURE;
-+              }
-+      } while (level >= 0);
-+
-+      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;
-+
-+      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;
-+      int err;
-+
-+      if ((err = fdt_check_header(fdt)) != 0)
-+              goto fail;
-+
-+      err = -FDT_ERR_BADOFFSET;
-+      nh = fdt_offset_ptr(fdt, nodeoffset, sizeof(*nh));
-+      if (!nh || (fdt32_to_cpu(nh->tag) != FDT_BEGIN_NODE))
-+              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)
-+              goto fail;
-+
-+      err = -FDT_ERR_BADOFFSET;
-+      if (nodeoffset % FDT_TAGSIZE)
-+              goto fail;
-+
-+      tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-+      if (tag != FDT_BEGIN_NODE)
-+              goto fail;
-+
-+      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 (streq(fdt_string(fdt, namestroff), name)) {
-+                              /* 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)
-+{
-+      uint32_t tag;
-+      int p = 0, overflow = 0;
-+      int offset, nextoffset, namelen;
-+      const char *name;
-+
-+      CHECK_HEADER(fdt);
-+
-+      tag = fdt_next_tag(fdt, 0, &nextoffset);
-+      if (tag != FDT_BEGIN_NODE)
-+              return -FDT_ERR_BADSTRUCTURE;
-+
-+      if (buflen < 2)
-+              return -FDT_ERR_NOSPACE;
-+      buf[0] = '/';
-+      p = 1;
-+
-+      while (nextoffset <= nodeoffset) {
-+              offset = nextoffset;
-+              tag = fdt_next_tag(fdt, offset, &nextoffset);
-+              switch (tag) {
-+              case FDT_END:
-+                      return -FDT_ERR_BADOFFSET;
-+
-+              case FDT_BEGIN_NODE:
-+                      name = fdt_get_name(fdt, offset, &namelen);
-+                      if (!name)
-+                              return namelen;
-+                      if (overflow || ((p + namelen + 1) > buflen)) {
-+                              overflow++;
-+                              break;
-+                      }
-+                      memcpy(buf + p, name, namelen);
-+                      p += namelen;
-+                      buf[p++] = '/';
-+                      break;
-+
-+              case FDT_END_NODE:
-+                      if (overflow) {
-+                              overflow--;
-+                              break;
-+                      }
-+                      do {
-+                              p--;
-+                      } while  (buf[p-1] != '/');
-+                      break;
-+
-+              case FDT_PROP:
-+              case FDT_NOP:
-+                      break;
-+
-+              default:
-+                      return -FDT_ERR_BADSTRUCTURE;
-+              }
-+      }
-+
-+      if (overflow)
-+              return -FDT_ERR_NOSPACE;
-+
-+      if (p > 1) /* special case so that root path is "/", not "" */
-+              p--;
-+      buf[p] = '\0';
-+      return p;
-+}
-+
-+int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
-+                               int supernodedepth, int *nodedepth)
-+{
-+      int level = -1;
-+      uint32_t tag;
-+      int offset, nextoffset = 0;
-+      int supernodeoffset = -FDT_ERR_INTERNAL;
-+
-+      CHECK_HEADER(fdt);
-+
-+      if (supernodedepth < 0)
-+              return -FDT_ERR_NOTFOUND;
-+
-+      do {
-+              offset = nextoffset;
-+              tag = fdt_next_tag(fdt, offset, &nextoffset);
-+              switch (tag) {
-+              case FDT_END:
-+                      return -FDT_ERR_BADOFFSET;
-+
-+              case FDT_BEGIN_NODE:
-+                      level++;
-+                      if (level == supernodedepth)
-+                              supernodeoffset = offset;
-+                      break;
-+
-+              case FDT_END_NODE:
-+                      level--;
-+                      break;
-+
-+              case FDT_PROP:
-+              case FDT_NOP:
-+                      break;
-+
-+              default:
-+                      return -FDT_ERR_BADSTRUCTURE;
-+              }
-+      } while (offset < nodeoffset);
-+
-+      if (nodedepth)
-+              *nodedepth = level;
-+
-+      if (supernodedepth > level)
-+              return -FDT_ERR_NOTFOUND;
-+      return supernodeoffset;
-+}
-+
-+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)
-+{
-+      uint32_t tag;
-+      int offset, nextoffset;
-+      const void *val;
-+      int len;
-+
-+      CHECK_HEADER(fdt);
-+
-+      if (startoffset >= 0) {
-+              tag = fdt_next_tag(fdt, startoffset, &nextoffset);
-+              if (tag != FDT_BEGIN_NODE)
-+                      return -FDT_ERR_BADOFFSET;
-+      } else {
-+              nextoffset = 0;
-+      }
-+
-+      /* 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. */
-+      do {
-+              offset = nextoffset;
-+              tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+              switch (tag) {
-+              case FDT_BEGIN_NODE:
-+                      val = fdt_getprop(fdt, offset, propname, &len);
-+                      if (val
-+                          && (len == proplen)
-+                          && (memcmp(val, propval, len) == 0))
-+                              return offset;
-+                      break;
-+
-+              case FDT_PROP:
-+              case FDT_END:
-+              case FDT_END_NODE:
-+              case FDT_NOP:
-+                      break;
-+
-+              default:
-+                      return -FDT_ERR_BADSTRUCTURE;
-+              }
-+      } while (tag != FDT_END);
-+
-+      return -FDT_ERR_NOTFOUND;
-+}
-+
-+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 void *strlist, int listlen, const char *str)
-+{
-+      int len = strlen(str);
-+      const void *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)
-+{
-+      uint32_t tag;
-+      int offset, nextoffset;
-+      int err;
-+
-+      CHECK_HEADER(fdt);
-+
-+      if (startoffset >= 0) {
-+              tag = fdt_next_tag(fdt, startoffset, &nextoffset);
-+              if (tag != FDT_BEGIN_NODE)
-+                      return -FDT_ERR_BADOFFSET;
-+      } else {
-+              nextoffset = 0;
-+      }
-+
-+      /* 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. */
-+      do {
-+              offset = nextoffset;
-+              tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+              switch (tag) {
-+              case FDT_BEGIN_NODE:
-+                      err = fdt_node_check_compatible(fdt, offset,
-+                                                      compatible);
-+                      if ((err < 0)
-+                          && (err != -FDT_ERR_NOTFOUND))
-+                              return err;
-+                      else if (err == 0)
-+                              return offset;
-+                      break;
-+
-+              case FDT_PROP:
-+              case FDT_END:
-+              case FDT_END_NODE:
-+              case FDT_NOP:
-+                      break;
-+
-+              default:
-+                      return -FDT_ERR_BADSTRUCTURE;
-+              }
-+      } while (tag != FDT_END);
-+
-+      return -FDT_ERR_NOTFOUND;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_rw.c
-@@ -0,0 +1,447 @@
-+/*
-+ * 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 _blocks_misordered(const void *fdt,
-+                            int mem_rsv_size, int struct_size)
-+{
-+      return (fdt_off_mem_rsvmap(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 rw_check_header(void *fdt)
-+{
-+      int err;
-+
-+      if ((err = fdt_check_header(fdt)))
-+              return err;
-+      if (fdt_version(fdt) < 17)
-+              return -FDT_ERR_BADVERSION;
-+      if (_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 RW_CHECK_HEADER(fdt) \
-+      { \
-+              int err; \
-+              if ((err = rw_check_header(fdt)) != 0) \
-+                      return err; \
-+      }
-+
-+static inline int _blob_data_size(void *fdt)
-+{
-+      return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
-+}
-+
-+static int _blob_splice(void *fdt, void *p, int oldlen, int newlen)
-+{
-+      void *end = fdt + _blob_data_size(fdt);
-+
-+      if (((p + oldlen) < p) || ((p + oldlen) > end))
-+              return -FDT_ERR_BADOFFSET;
-+      if ((end - oldlen + newlen) > (fdt + fdt_totalsize(fdt)))
-+              return -FDT_ERR_NOSPACE;
-+      memmove(p + newlen, p + oldlen, end - p - oldlen);
-+      return 0;
-+}
-+
-+static int _blob_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
-+                              int oldn, int newn)
-+{
-+      int delta = (newn - oldn) * sizeof(*p);
-+      int err;
-+      err = _blob_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 _blob_splice_struct(void *fdt, void *p,
-+                             int oldlen, int newlen)
-+{
-+      int delta = newlen - oldlen;
-+      int err;
-+
-+      if ((err = _blob_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 _blob_splice_string(void *fdt, int newlen)
-+{
-+      void *p = fdt + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
-+      int err;
-+
-+      if ((err = _blob_splice(fdt, p, 0, newlen)))
-+              return err;
-+
-+      fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
-+      return 0;
-+}
-+
-+static int _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 = _blob_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;
-+
-+      if ((err = rw_check_header(fdt)))
-+              return err;
-+
-+      re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
-+      err = _blob_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;
-+
-+      if ((err = rw_check_header(fdt)))
-+              return err;
-+      if (n >= fdt_num_mem_rsv(fdt))
-+              return -FDT_ERR_NOTFOUND;
-+
-+      err = _blob_splice_mem_rsv(fdt, re, 1, 0);
-+      if (err)
-+              return err;
-+      return 0;
-+}
-+
-+static int _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 = _blob_splice_struct(fdt, (*prop)->data,
-+                                     ALIGN(oldlen, FDT_TAGSIZE),
-+                                     ALIGN(len, FDT_TAGSIZE))))
-+              return err;
-+
-+      (*prop)->len = cpu_to_fdt32(len);
-+      return 0;
-+}
-+
-+static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
-+                       struct fdt_property **prop)
-+{
-+      uint32_t tag;
-+      int proplen;
-+      int nextoffset;
-+      int namestroff;
-+      int err;
-+
-+      tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-+      if (tag != FDT_BEGIN_NODE)
-+              return -FDT_ERR_BADOFFSET;
-+
-+      namestroff = _find_add_string(fdt, name);
-+      if (namestroff < 0)
-+              return namestroff;
-+
-+      *prop = _fdt_offset_ptr_w(fdt, nextoffset);
-+      proplen = sizeof(**prop) + ALIGN(len, FDT_TAGSIZE);
-+
-+      err = _blob_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_setprop(void *fdt, int nodeoffset, const char *name,
-+              const void *val, int len)
-+{
-+      struct fdt_property *prop;
-+      int err;
-+
-+      if ((err = rw_check_header(fdt)))
-+              return err;
-+
-+      err = _resize_property(fdt, nodeoffset, name, len, &prop);
-+      if (err == -FDT_ERR_NOTFOUND)
-+              err = _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;
-+
-+      RW_CHECK_HEADER(fdt);
-+
-+      prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
-+      if (! prop)
-+              return len;
-+
-+      proplen = sizeof(*prop) + ALIGN(len, FDT_TAGSIZE);
-+      return _blob_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;
-+
-+      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);
-+
-+      nh = _fdt_offset_ptr_w(fdt, offset);
-+      nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
-+
-+      err = _blob_splice_struct(fdt, nh, 0, nodelen);
-+      if (err)
-+              return err;
-+
-+      nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
-+      memset(nh->name, 0, ALIGN(namelen+1, FDT_TAGSIZE));
-+      memcpy(nh->name, name, namelen);
-+      endtag = (uint32_t *)((void *)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;
-+
-+      RW_CHECK_HEADER(fdt);
-+
-+      endoffset = _fdt_node_end_offset(fdt, nodeoffset);
-+      if (endoffset < 0)
-+              return endoffset;
-+
-+      return _blob_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
-+                                 endoffset - nodeoffset, 0);
-+}
-+
-+static void _packblocks(const void *fdt, void *buf,
-+                     int mem_rsv_size, int struct_size)
-+{
-+      int mem_rsv_off, struct_off, strings_off;
-+
-+      mem_rsv_off = ALIGN(sizeof(struct fdt_header), 8);
-+      struct_off = mem_rsv_off + mem_rsv_size;
-+      strings_off = struct_off + struct_size;
-+
-+      memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size);
-+      fdt_set_off_mem_rsvmap(buf, mem_rsv_off);
-+
-+      memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
-+      fdt_set_off_dt_struct(buf, struct_off);
-+      fdt_set_size_dt_struct(buf, struct_size);
-+
-+      memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
-+              fdt_size_dt_strings(fdt));
-+      fdt_set_off_dt_strings(buf, strings_off);
-+      fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt));
-+}
-+
-+int fdt_open_into(const void *fdt, void *buf, int bufsize)
-+{
-+      int err;
-+      int mem_rsv_size, struct_size;
-+      int newsize;
-+      void *tmp;
-+
-+      err = fdt_check_header(fdt);
-+      if (err)
-+              return err;
-+
-+      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 (!_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 = ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
-+              + struct_size + fdt_size_dt_strings(fdt);
-+
-+      if (bufsize < newsize)
-+              return -FDT_ERR_NOSPACE;
-+
-+      if (((buf + newsize) <= fdt)
-+          || (buf >= (fdt + fdt_totalsize(fdt)))) {
-+              tmp = buf;
-+      } else {
-+              tmp = (void *)fdt + fdt_totalsize(fdt);
-+              if ((tmp + newsize) > (buf + bufsize))
-+                      return -FDT_ERR_NOSPACE;
-+      }
-+
-+      _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;
-+      int err;
-+
-+      err = rw_check_header(fdt);
-+      if (err)
-+              return err;
-+
-+      mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
-+              * sizeof(struct fdt_reserve_entry);
-+      _packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
-+      fdt_set_totalsize(fdt, _blob_data_size(fdt));
-+
-+      return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_strerror.c
-@@ -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 errtabent {
-+      const char *str;
-+};
-+
-+#define ERRTABENT(val) \
-+      [(val)] = { .str = #val, }
-+
-+static struct errtabent errtable[] = {
-+      ERRTABENT(FDT_ERR_NOTFOUND),
-+      ERRTABENT(FDT_ERR_EXISTS),
-+      ERRTABENT(FDT_ERR_NOSPACE),
-+
-+      ERRTABENT(FDT_ERR_BADOFFSET),
-+      ERRTABENT(FDT_ERR_BADPATH),
-+      ERRTABENT(FDT_ERR_BADSTATE),
-+
-+      ERRTABENT(FDT_ERR_TRUNCATED),
-+      ERRTABENT(FDT_ERR_BADMAGIC),
-+      ERRTABENT(FDT_ERR_BADVERSION),
-+      ERRTABENT(FDT_ERR_BADSTRUCTURE),
-+      ERRTABENT(FDT_ERR_BADLAYOUT),
-+};
-+#define ERRTABSIZE    (sizeof(errtable) / sizeof(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 > -ERRTABSIZE) {
-+              const char *s = errtable[-errval].str;
-+
-+              if (s)
-+                      return s;
-+      }
-+
-+      return "<unknown error>";
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_sw.c
-@@ -0,0 +1,258 @@
-+/*
-+ * 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 check_header_sw(void *fdt)
-+{
-+      if (fdt_magic(fdt) != SW_MAGIC)
-+              return -FDT_ERR_BADMAGIC;
-+      return 0;
-+}
-+
-+static void *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, 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, 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 err = check_header_sw(fdt);
-+      int offset;
-+
-+      if (err)
-+              return err;
-+      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 *)(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 err = check_header_sw(fdt);
-+      int namelen = strlen(name) + 1;
-+
-+      if (err)
-+              return err;
-+
-+      nh = grab_space(fdt, sizeof(*nh) + ALIGN(namelen, FDT_TAGSIZE));
-+      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;
-+      int err = check_header_sw(fdt);
-+
-+      if (err)
-+              return err;
-+
-+      en = grab_space(fdt, FDT_TAGSIZE);
-+      if (! en)
-+              return -FDT_ERR_NOSPACE;
-+
-+      *en = cpu_to_fdt32(FDT_END_NODE);
-+      return 0;
-+}
-+
-+static int 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 err = check_header_sw(fdt);
-+      int nameoff;
-+
-+      if (err)
-+              return err;
-+
-+      nameoff = find_add_string(fdt, name);
-+      if (nameoff == 0)
-+              return -FDT_ERR_NOSPACE;
-+
-+      prop = grab_space(fdt, sizeof(*prop) + ALIGN(len, FDT_TAGSIZE));
-+      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)
-+{
-+      int err = check_header_sw(fdt);
-+      char *p = (char *)fdt;
-+      uint32_t *end;
-+      int oldstroffset, newstroffset;
-+      uint32_t tag;
-+      int offset, nextoffset;
-+
-+      if (err)
-+              return err;
-+
-+      /* Add terminator */
-+      end = 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;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_wip.c
-@@ -0,0 +1,144 @@
-+/*
-+ * 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 nop_region(void *start, int len)
-+{
-+      uint32_t *p;
-+
-+      for (p = start; (void *)p < (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;
-+
-+      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;
-+
-+      nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), endoffset - nodeoffset);
-+      return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/libfdt.h
-@@ -0,0 +1,721 @@
-+#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 *)fdt_offset_ptr(fdt, offset, checklen);
-+}
-+
-+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
-+
-+/**********************************************************************/
-+/* 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 - retreive 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 - retreive 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 - retreive 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 - retreive 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 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 *)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 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 *)fdt_getprop(fdt, nodeoffset, name, lenp);
-+}
-+
-+/**
-+ * fdt_get_phandle - retreive 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 succes (!= 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:
-+ *    stucture 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_prop_value() 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                                           */
-+/**********************************************************************/
-+
-+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
-+                      const void *val, int len);
-+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));
-+}
-+
-+int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
-+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);
-+
-+int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
-+int fdt_del_mem_rsv(void *fdt, int n);
-+
-+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
-+              const void *val, int len);
-+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));
-+}
-+#define fdt_setprop_string(fdt, nodeoffset, name, str) \
-+      fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
-+int fdt_delprop(void *fdt, int nodeoffset, const char *name);
-+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
-+                          const char *name, int namelen);
-+int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
-+int fdt_del_node(void *fdt, int nodeoffset);
-+
-+/**********************************************************************/
-+/* Debugging / informational functions                                */
-+/**********************************************************************/
-+
-+const char *fdt_strerror(int errval);
-+
-+#endif /* _LIBFDT_H */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/libfdt_internal.h
-@@ -0,0 +1,89 @@
-+#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 ALIGN(x, a)   (((x) + (a) - 1) & ~((a) - 1))
-+#define PALIGN(p, a)  ((void *)ALIGN((unsigned long)(p), (a)))
-+
-+#define memeq(p, q, n)        (memcmp((p), (q), (n)) == 0)
-+#define streq(p, q)   (strcmp((p), (q)) == 0)
-+
-+uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
-+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 fdt + fdt_off_dt_struct(fdt) + offset;
-+}
-+
-+static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
-+{
-+      return (void *)_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 =
-+              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 *)_fdt_mem_rsv(fdt, n);
-+}
-+
-+#define SW_MAGIC              (~FDT_MAGIC)
-+
-+#endif /* _LIBFDT_INTERNAL_H */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt-wrapper.c
-@@ -0,0 +1,184 @@
-+/*
-+ * This file does the necessary interface mapping between the bootwrapper
-+ * device tree operations and the interface provided by shared source
-+ * files flatdevicetree.[ch].
-+ *
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ *
-+ * 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
-+ */
-+
-+#include <stddef.h>
-+#include <stdio.h>
-+#include <page.h>
-+#include <libfdt.h>
-+#include "ops.h"
-+
-+#define DEBUG 0
-+#define BAD_ERROR(err)        (((err) < 0) \
-+                       && ((err) != -FDT_ERR_NOTFOUND) \
-+                       && ((err) != -FDT_ERR_EXISTS))
-+
-+#define check_err(err) \
-+      ({ \
-+              if (BAD_ERROR(err) || ((err < 0) && DEBUG)) \
-+                      printf("%s():%d  %s\n\r", __FUNCTION__, __LINE__, \
-+                             fdt_strerror(err)); \
-+              if (BAD_ERROR(err)) \
-+                      exit(); \
-+              (err < 0) ? -1 : 0; \
-+      })
-+
-+#define offset_devp(off)      \
-+      ({ \
-+              int _offset = (off); \
-+              check_err(_offset) ? NULL : (void *)(_offset+1); \
-+      })
-+
-+#define devp_offset_find(devp)        (((int)(devp))-1)
-+#define devp_offset(devp)     (devp ? ((int)(devp))-1 : 0)
-+
-+static void *fdt;
-+static void *buf; /* = NULL */
-+
-+#define EXPAND_GRANULARITY    1024
-+
-+static void expand_buf(int minexpand)
-+{
-+      int size = fdt_totalsize(fdt);
-+      int rc;
-+
-+      size = _ALIGN(size + minexpand, EXPAND_GRANULARITY);
-+      buf = platform_ops.realloc(buf, size);
-+      if (!buf)
-+              fatal("Couldn't find %d bytes to expand device tree\n\r", size);
-+      rc = fdt_open_into(fdt, buf, size);
-+      if (rc != 0)
-+              fatal("Couldn't expand fdt into new buffer: %s\n\r",
-+                    fdt_strerror(rc));
-+
-+      fdt = buf;
-+}
-+
-+static void *fdt_wrapper_finddevice(const char *path)
-+{
-+      return offset_devp(fdt_path_offset(fdt, path));
-+}
-+
-+static int fdt_wrapper_getprop(const void *devp, const char *name,
-+                             void *buf, const int buflen)
-+{
-+      const void *p;
-+      int len;
-+
-+      p = fdt_getprop(fdt, devp_offset(devp), name, &len);
-+      if (!p)
-+              return check_err(len);
-+      memcpy(buf, p, min(len, buflen));
-+      return len;
-+}
-+
-+static int fdt_wrapper_setprop(const void *devp, const char *name,
-+                             const void *buf, const int len)
-+{
-+      int rc;
-+
-+      rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
-+      if (rc == -FDT_ERR_NOSPACE) {
-+              expand_buf(len + 16);
-+              rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
-+      }
-+
-+      return check_err(rc);
-+}
-+
-+static void *fdt_wrapper_get_parent(const void *devp)
-+{
-+      return offset_devp(fdt_parent_offset(fdt, devp_offset(devp)));
-+}
-+
-+static void *fdt_wrapper_create_node(const void *devp, const char *name)
-+{
-+      int offset;
-+
-+      offset = fdt_add_subnode(fdt, devp_offset(devp), name);
-+      if (offset == -FDT_ERR_NOSPACE) {
-+              expand_buf(strlen(name) + 16);
-+              offset = fdt_add_subnode(fdt, devp_offset(devp), name);
-+      }
-+
-+      return offset_devp(offset);
-+}
-+
-+static void *fdt_wrapper_find_node_by_prop_value(const void *prev,
-+                                               const char *name,
-+                                               const char *val,
-+                                               int len)
-+{
-+      int offset = fdt_node_offset_by_prop_value(fdt, devp_offset_find(prev),
-+                                                 name, val, len);
-+      return offset_devp(offset);
-+}
-+
-+static char *fdt_wrapper_get_path(const void *devp, char *buf, int len)
-+{
-+      int rc;
-+
-+      rc = fdt_get_path(fdt, devp_offset(devp), buf, len);
-+      if (check_err(rc))
-+              return NULL;
-+      return buf;
-+}
-+
-+static unsigned long fdt_wrapper_finalize(void)
-+{
-+      int rc;
-+
-+      rc = fdt_pack(fdt);
-+      if (rc != 0)
-+              fatal("Couldn't pack flat tree: %s\n\r",
-+                    fdt_strerror(rc));
-+      return (unsigned long)fdt;
-+}
-+
-+void fdt_init(void *blob)
-+{
-+      int err;
-+
-+      dt_ops.finddevice = fdt_wrapper_finddevice;
-+      dt_ops.getprop = fdt_wrapper_getprop;
-+      dt_ops.setprop = fdt_wrapper_setprop;
-+      dt_ops.get_parent = fdt_wrapper_get_parent;
-+      dt_ops.create_node = fdt_wrapper_create_node;
-+      dt_ops.find_node_by_prop_value = fdt_wrapper_find_node_by_prop_value;
-+      dt_ops.get_path = fdt_wrapper_get_path;
-+      dt_ops.finalize = fdt_wrapper_finalize;
-+
-+      /* Make sure the dt blob is the right version and so forth */
-+      fdt = blob;
-+      err = fdt_open_into(fdt, fdt, fdt_totalsize(blob));
-+      if (err == -FDT_ERR_NOSPACE) {
-+              int bufsize = fdt_totalsize(fdt) + 4;
-+              buf = malloc(bufsize);
-+              err = fdt_open_into(fdt, buf, bufsize);
-+      }
-+
-+      if (err != 0)
-+              fatal("fdt_init(): %s\n\r", fdt_strerror(err));
-+
-+      if (buf)
-+              fdt = buf;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt_env.h
-@@ -0,0 +1,17 @@
-+#ifndef _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
-+#define _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
-+
-+#include <types.h>
-+#include <string.h>
-+
-+typedef u32 uint32_t;
-+typedef u64 uint64_t;
-+
-+#define fdt16_to_cpu(x)               (x)
-+#define cpu_to_fdt16(x)               (x)
-+#define fdt32_to_cpu(x)               (x)
-+#define cpu_to_fdt32(x)               (x)
-+#define fdt64_to_cpu(x)               (x)
-+#define cpu_to_fdt64(x)               (x)
-+
-+#endif /* _ARCH_POWERPC_BOOT_LIBFDT_ENV_H */
---- a/arch/powerpc/boot/main.c
-+++ b/arch/powerpc/boot/main.c
-@@ -16,7 +16,6 @@
- #include "stdio.h"
- #include "ops.h"
- #include "gunzip_util.h"
--#include "flatdevtree.h"
- #include "reg.h"
- static struct gunzip_state gzstate;
---- a/arch/powerpc/boot/ops.h
-+++ b/arch/powerpc/boot/ops.h
-@@ -79,7 +79,7 @@ struct loader_info {
- extern struct loader_info loader_info;
- void start(void);
--int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
-+void fdt_init(void *blob);
- int serial_console_init(void);
- int ns16550_console_init(void *devp, struct serial_console_data *scdp);
- int mpsc_console_init(void *devp, struct serial_console_data *scdp);
-@@ -159,9 +159,23 @@ static inline void *find_node_by_devtype
-       return find_node_by_prop_value_str(prev, "device_type", type);
- }
-+static inline void *find_node_by_alias(const char *alias)
-+{
-+      void *devp = finddevice("/aliases");
-+
-+      if (devp) {
-+              char path[MAX_PATH_LEN];
-+              if (getprop(devp, alias, path, MAX_PATH_LEN) > 0)
-+                      return finddevice(path);
-+      }
-+
-+      return NULL;
-+}
-+
- void dt_fixup_memory(u64 start, u64 size);
- void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq);
- void dt_fixup_clock(const char *path, u32 freq);
-+void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr);
- void dt_fixup_mac_address(u32 index, const u8 *addr);
- void __dt_fixup_mac_addresses(u32 startindex, ...);
- #define dt_fixup_mac_addresses(...) \
---- a/arch/powerpc/boot/prpmc2800.c
-+++ b/arch/powerpc/boot/prpmc2800.c
-@@ -547,8 +547,7 @@ void platform_init(unsigned long r3, uns
-       if (!dtb)
-               exit();
-       memmove(dtb, _dtb_start, dt_size);
--      if (ft_init(dtb, dt_size, 16))
--              exit();
-+      fdt_init(dtb);
-       bridge_base = mv64x60_get_bridge_base();
---- a/arch/powerpc/boot/ps3.c
-+++ b/arch/powerpc/boot/ps3.c
-@@ -131,7 +131,7 @@ void platform_init(void)
-       printf("\n-- PS3 bootwrapper --\n");
-       simple_alloc_init(_end, heapsize, 32, 64);
--      ft_init(_dtb_start, 0, 4);
-+      fdt_init(_dtb_start);
-       chosen = finddevice("/chosen");
---- /dev/null
-+++ b/arch/powerpc/boot/redboot-8xx.c
-@@ -0,0 +1,58 @@
-+/*
-+ * RedBoot firmware support
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "redboot.h"
-+#include "fsl-soc.h"
-+#include "io.h"
-+
-+static bd_t bd;
-+BSS_STACK(4096);
-+
-+#define MHZ(x)        ((x + 500000) / 1000000)
-+
-+static void platform_fixups(void)
-+{
-+      void *node;
-+
-+      dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-+      dt_fixup_mac_addresses(bd.bi_enetaddr);
-+      dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 16, bd.bi_busfreq);
-+
-+      node = finddevice("/soc/cpm/brg");
-+      if (node) {
-+              printf("BRG clock-frequency <- 0x%x (%dMHz)\r\n",
-+                     bd.bi_busfreq, MHZ(bd.bi_busfreq));
-+              setprop(node, "clock-frequency",  &bd.bi_busfreq, 4);
-+      }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+                   unsigned long r6, unsigned long r7)
-+{
-+      memcpy(&bd, (char *)r3, sizeof(bd));
-+
-+      if (bd.bi_tag != 0x42444944)
-+              return;
-+
-+      simple_alloc_init(_end,
-+                        bd.bi_memstart + bd.bi_memsize - (unsigned long)_end,
-+                        32, 64);
-+
-+      fdt_init(_dtb_start);
-+      serial_console_init();
-+      platform_ops.fixups = platform_fixups;
-+
-+      loader_info.cmdline = (char *)bd.bi_cmdline;
-+      loader_info.cmdline_len = strlen((char *)bd.bi_cmdline);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/redboot.h
-@@ -0,0 +1,56 @@
-+#ifndef _PPC_REDBOOT_H
-+#define _PPC_REDBOOT_H
-+
-+//=========================================================================
-+// include/asm-ppc/redboot.h
-+//   Copyright (c) 2002, 2003 Gary Thomas (<gary@mlbassoc.com>
-+//   Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
-+
-+//
-+// Board specific details, as provided by RedBoot
-+//
-+
-+/* A Board Information structure that is given to a program when
-+ * RedBoot starts it up.  Note: not all fields make sense for all
-+ * architectures and it's up to the platform specific code to fill
-+ * in the details.
-+ */
-+typedef struct bd_info {
-+    unsigned int   bi_tag;        /* Should be 0x42444944 "BDID" */
-+    unsigned int   bi_size;       /* Size of this structure */
-+    unsigned int   bi_revision;   /* revision of this structure */
-+    unsigned int   bi_bdate;      /* bootstrap date, i.e. 0x19971106 */
-+    unsigned int   bi_memstart;   /* Memory start address */
-+    unsigned int   bi_memsize;    /* Memory (end) size in bytes */
-+    unsigned int   bi_intfreq;    /* Internal Freq, in Hz */
-+    unsigned int   bi_busfreq;    /* Bus Freq, in Hz */
-+    unsigned int   bi_cpmfreq;    /* CPM Freq, in Hz */
-+    unsigned int   bi_brgfreq;    /* BRG Freq, in Hz */
-+    unsigned int   bi_vco;        /* VCO Out from PLL */
-+    unsigned int   bi_pci_freq;   /* PCI Freq, in Hz */
-+    unsigned int   bi_baudrate;   /* Default console baud rate */
-+    unsigned int   bi_immr;       /* IMMR when called from boot rom */
-+    unsigned char  bi_enetaddr[6];
-+    unsigned int   bi_flashbase;  /* Physical address of FLASH memory */
-+    unsigned int   bi_flashsize;  /* Length of FLASH memory */
-+    int            bi_flashwidth; /* Width (8,16,32,64) */
-+    unsigned char *bi_cmdline;    /* Pointer to command line */
-+    unsigned char  bi_esa[3][6];  /* Ethernet station addresses */
-+    unsigned int   bi_ramdisk_begin, bi_ramdisk_end;
-+    struct {                      /* Information about [main] video screen */
-+        short x_res;              /*   Horizontal resolution in pixels */
-+        short y_res;              /*   Vertical resolution in pixels */
-+        short bpp;                /*   Bits/pixel */
-+        short mode;               /*   Type of pixels (packed, indexed) */
-+        unsigned long fb;         /*   Pointer to frame buffer (pixel) memory */
-+    } bi_video;
-+    void         (*bi_cputc)(char);   /* Write a character to the RedBoot console */
-+    char         (*bi_cgetc)(void);   /* Read a character from the RedBoot console */
-+    int          (*bi_ctstc)(void);   /* Test for input on the RedBoot console */
-+} bd_t;
-+
-+#define BI_REV 0x0102    /* Version 1.02 */
-+
-+#define bi_pci_busfreq bi_pci_freq
-+#define bi_immr_base   bi_immr
-+#endif
---- a/arch/powerpc/boot/reg.h
-+++ b/arch/powerpc/boot/reg.h
-@@ -16,6 +16,14 @@ static inline u32 mfpvr(void)
-       return pvr;
- }
-+#define __stringify_1(x)      #x
-+#define __stringify(x)                __stringify_1(x)
-+
-+#define mfspr(rn)     ({unsigned long rval; \
-+                      asm volatile("mfspr %0," __stringify(rn) \
-+                              : "=r" (rval)); rval; })
-+#define mtspr(rn, v)  asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v))
-+
- register void *__stack_pointer asm("r1");
- #define get_sp()      (__stack_pointer)
---- a/arch/powerpc/boot/serial.c
-+++ b/arch/powerpc/boot/serial.c
-@@ -128,7 +128,8 @@ int serial_console_init(void)
-               rc = cpm_console_init(devp, &serial_cd);
-       else if (dt_is_compatible(devp, "mpc5200-psc-uart"))
-               rc = mpc5200_psc_console_init(devp, &serial_cd);
--      else if (dt_is_compatible(devp, "xilinx,uartlite"))
-+      else if (dt_is_compatible(devp, "xlnx,opb-uartlite-1.00.b") ||
-+               dt_is_compatible(devp, "xlnx,xps-uartlite-1.00.a"))
-               rc = uartlite_console_init(devp, &serial_cd);
-       /* Add other serial console driver calls here */
---- a/arch/powerpc/boot/treeboot-walnut.c
-+++ b/arch/powerpc/boot/treeboot-walnut.c
-@@ -20,55 +20,6 @@
- BSS_STACK(4096);
--void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
--{
--      u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
--      u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
--      u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
--      u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
--      u32 fwdv, fbdv, cbdv, opdv, epdv, udiv;
--
--      fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
--      fbdv = (pllmr & 0x1e000000) >> 25;
--      cbdv = ((pllmr & 0x00060000) >> 17) + 1;
--      opdv = ((pllmr & 0x00018000) >> 15) + 1;
--      epdv = ((pllmr & 0x00001800) >> 13) + 2;
--      udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
--
--      m = fwdv * fbdv * cbdv;
--
--      cpu = sysclk * m / fwdv;
--      plb = cpu / cbdv;
--      opb = plb / opdv;
--      ebc = plb / epdv;
--
--      if (cpc0_cr0 & 0x80) {
--              /* uart0 uses the external clock */
--              uart0 = ser_clk;
--      } else {
--              uart0 = cpu / udiv;
--      }
--
--      if (cpc0_cr0 & 0x40) {
--              /* uart1 uses the external clock */
--              uart1 = ser_clk;
--      } else {
--              uart1 = cpu / udiv;
--      }
--
--      /* setup the timebase clock to tick at the cpu frequency */
--      cpc0_cr1 = cpc0_cr1 & ~0x00800000;
--      mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
--      tb = cpu;
--
--      dt_fixup_cpu_clocks(cpu, tb, 0);
--      dt_fixup_clock("/plb", plb);
--      dt_fixup_clock("/plb/opb", opb);
--      dt_fixup_clock("/plb/ebc", ebc);
--      dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
--      dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
--}
--
- static void walnut_flashsel_fixup(void)
- {
-       void *devp, *sram;
-@@ -112,7 +63,7 @@ static void walnut_flashsel_fixup(void)
- #define WALNUT_OPENBIOS_MAC_OFF 0xfffffe0b
- static void walnut_fixups(void)
- {
--      ibm4xx_fixup_memsize();
-+      ibm4xx_sdram_fixup_memsize();
-       ibm405gp_fixup_clocks(33330000, 0xa8c000);
-       ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
-       ibm4xx_fixup_ebc_ranges("/plb/ebc");
-@@ -128,6 +79,6 @@ void platform_init(void)
-       simple_alloc_init(_end, avail_ram, 32, 32);
-       platform_ops.fixups = walnut_fixups;
-       platform_ops.exit = ibm40x_dbcr_reset;
--      ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+      fdt_init(_dtb_start);
-       serial_console_init();
- }
---- a/arch/powerpc/boot/wrapper
-+++ b/arch/powerpc/boot/wrapper
-@@ -45,6 +45,7 @@ CROSS=
- # directory for object and other files used by this script
- object=arch/powerpc/boot
-+objbin=$object
- # directory for working files
- tmpdir=.
-@@ -95,6 +96,7 @@ while [ "$#" -gt 0 ]; do
-       shift
-       [ "$#" -gt 0 ] || usage
-       object="$1"
-+      objbin="$1"
-       ;;
-     -W)
-       shift
-@@ -116,10 +118,13 @@ while [ "$#" -gt 0 ]; do
- done
- if [ -n "$dts" ]; then
-+    if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then
-+      dts="$object/dts/$dts"
-+    fi
-     if [ -z "$dtb" ]; then
-       dtb="$platform.dtb"
-     fi
--    dtc -O dtb -o "$dtb" -b 0 -V 16 "$dts"
-+    $object/dtc -O dtb -o "$dtb" -b 0 "$dts"
- fi
- if [ -z "$kernel" ]; then
-@@ -163,7 +168,7 @@ ps3)
-     ksection=.kernel:vmlinux.bin
-     isection=.kernel:initrd
-     ;;
--ep88xc)
-+ep88xc|ep405|redboot*|ep8248e)
-     platformo="$object/fixed-head.o $object/$platform.o"
-     binary=y
-     ;;
-@@ -246,11 +251,11 @@ fi
- # post-processing needed for some platforms
- case "$platform" in
- pseries|chrp)
--    $object/addnote "$ofile"
-+    $objbin/addnote "$ofile"
-     ;;
- coff)
-     ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
--    $object/hack-coff "$ofile"
-+    $objbin/hack-coff "$ofile"
-     ;;
- cuboot*)
-     gzip -f -9 "$ofile"
-@@ -259,7 +264,7 @@ cuboot*)
-     ;;
- treeboot*)
-     mv "$ofile" "$ofile.elf"
--    $object/mktree "$ofile.elf" "$ofile" "$base" "$entry"
-+    $objbin/mktree "$ofile.elf" "$ofile" "$base" "$entry"
-     if [ -z "$cacheit" ]; then
-       rm -f "$ofile.elf"
-     fi
-@@ -287,8 +292,6 @@ ps3)
-     overlay_dest="256"
-     overlay_size="256"
--    rm -f "$object/otheros.bld"
--
-     ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
-     dd if="$ofile.bin" of="$ofile.bin" conv=notrunc   \
-@@ -299,6 +302,8 @@ ps3)
-         skip=$system_reset_overlay seek=$overlay_dest \
-         count=$overlay_size bs=1
--    gzip --force -9 --stdout "$ofile.bin" > "$object/otheros.bld"
-+    odir="$(dirname "$ofile.bin")"
-+    rm -f "$odir/otheros.bld"
-+    gzip --force -9 --stdout "$ofile.bin" > "$odir/otheros.bld"
-     ;;
- esac
---- /dev/null
-+++ b/arch/powerpc/configs/adder875-redboot_defconfig
-@@ -0,0 +1,798 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:17:38 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+CONFIG_PPC_8xx=y
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_8xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_REDBOOT=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+# CONFIG_BASE_FULL is not set
-+# CONFIG_FUTEX is not set
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=1
-+# CONFIG_MODULES is not set
-+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
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_CPM1=y
-+# CONFIG_MPC8XXFADS is not set
-+# CONFIG_MPC86XADS is not set
-+# CONFIG_MPC885ADS is not set
-+# CONFIG_PPC_EP88XC is not set
-+CONFIG_PPC_ADDER875=y
-+
-+#
-+# MPC8xx CPM Options
-+#
-+
-+#
-+# Generic MPC8xx Options
-+#
-+CONFIG_8xx_COPYBACK=y
-+# CONFIG_8xx_CPU6 is not set
-+CONFIG_8xx_CPU15=y
-+CONFIG_NO_UCODE_PATCH=y
-+# CONFIG_USB_SOF_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_8XX_MINIMAL_FPEMU is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="adder875-redboot.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_PCI_QSPAN is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_CONSISTENT_START=0xfd000000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+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=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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 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=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS 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 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=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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_CFI_FLAGADM 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_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+# CONFIG_BLK_DEV is not set
-+# CONFIG_MISC_DEVICES is not set
-+# 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_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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=y
-+# 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 is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# 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_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FEC=y
-+CONFIG_FS_ENET_MDIO_FEC=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
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE 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=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_LIFEBOOK=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA 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=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+# CONFIG_SERIAL_CPM_SCC1 is not set
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+CONFIG_SERIAL_CPM_SMC1=y
-+CONFIG_SERIAL_CPM_SMC2=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_DNOTIFY 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_KCORE is not set
-+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 is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES 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=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG 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
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/adder875-uboot_defconfig
-@@ -0,0 +1,798 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:17:18 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+CONFIG_PPC_8xx=y
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_8xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_REDBOOT=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+# CONFIG_BASE_FULL is not set
-+# CONFIG_FUTEX is not set
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=1
-+# CONFIG_MODULES is not set
-+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
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_CPM1=y
-+# CONFIG_MPC8XXFADS is not set
-+# CONFIG_MPC86XADS is not set
-+# CONFIG_MPC885ADS is not set
-+# CONFIG_PPC_EP88XC is not set
-+CONFIG_PPC_ADDER875=y
-+
-+#
-+# MPC8xx CPM Options
-+#
-+
-+#
-+# Generic MPC8xx Options
-+#
-+CONFIG_8xx_COPYBACK=y
-+# CONFIG_8xx_CPU6 is not set
-+CONFIG_8xx_CPU15=y
-+CONFIG_NO_UCODE_PATCH=y
-+# CONFIG_USB_SOF_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_8XX_MINIMAL_FPEMU is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="adder875-uboot.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_PCI_QSPAN is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_CONSISTENT_START=0xfd000000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+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=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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 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=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS 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 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=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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_CFI_FLAGADM 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_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+# CONFIG_BLK_DEV is not set
-+# CONFIG_MISC_DEVICES is not set
-+# 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_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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=y
-+# 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 is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# 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_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FEC=y
-+CONFIG_FS_ENET_MDIO_FEC=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
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE 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=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_LIFEBOOK=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA 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=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+# CONFIG_SERIAL_CPM_SCC1 is not set
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+CONFIG_SERIAL_CPM_SMC1=y
-+CONFIG_SERIAL_CPM_SMC2=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_DNOTIFY 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_KCORE is not set
-+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 is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES 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=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG 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
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/bamboo_defconfig
-+++ b/arch/powerpc/configs/bamboo_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:48:04 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 10:49:50 2007
- #
- # CONFIG_PPC64 is not set
-@@ -131,6 +131,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
- #
- # Platform support
-@@ -143,6 +144,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- CONFIG_BAMBOO=y
- # CONFIG_EBONY is not set
- # CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440EP=y
- CONFIG_IBM440EP_ERR42=y
- # CONFIG_MPIC is not set
-@@ -372,9 +376,7 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_FIREWIRE is not set
- # CONFIG_IEEE1394 is not set
- # CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
-@@ -736,19 +738,7 @@ CONFIG_DEBUGGER=y
- # CONFIG_KGDB is not set
- # CONFIG_XMON is not set
- # CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--CONFIG_PPC_EARLY_DEBUG_44x=y
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x0
-+# CONFIG_PPC_EARLY_DEBUG is not set
- #
- # Security options
---- a/arch/powerpc/configs/celleb_defconfig
-+++ b/arch/powerpc/configs/celleb_defconfig
-@@ -50,7 +50,8 @@ CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
- # CONFIG_DEFAULT_UIMAGE is not set
- # CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR_MMIO=y
-+CONFIG_PPC_DCR=y
- CONFIG_PPC_OF_PLATFORM_PCI=y
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-@@ -148,7 +149,7 @@ CONFIG_PPC_MULTIPLATFORM=y
- CONFIG_PPC_CELLEB=y
- # CONFIG_PPC_PS3 is not set
- CONFIG_PPC_CELL=y
--# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_PPC_CELL_NATIVE=y
- # CONFIG_PPC_IBM_CELL_BLADE is not set
- #
-@@ -157,13 +158,19 @@ CONFIG_PPC_CELL=y
- CONFIG_SPU_FS=y
- CONFIG_SPU_FS_64K_LS=y
- CONFIG_SPU_BASE=y
-+CONFIG_CBE_RAS=y
-+# CONFIG_CBE_THERM is not set
- # CONFIG_PQ2ADS is not set
-+CONFIG_PPC_NATIVE=y
-+CONFIG_UDBG_RTAS_CONSOLE=y
- CONFIG_PPC_UDBG_BEAT=y
--# CONFIG_MPIC is not set
-+CONFIG_MPIC=y
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
- # CONFIG_U3_DART is not set
--# CONFIG_PPC_RTAS is not set
-+CONFIG_PPC_RTAS=y
-+# CONFIG_RTAS_ERROR_LOGGING is not set
-+# CONFIG_RTAS_PROC is not set
- # CONFIG_MMIO_NVRAM is not set
- # CONFIG_PPC_MPC106 is not set
- # CONFIG_PPC_970_NAP is not set
-@@ -593,10 +600,11 @@ CONFIG_MII=y
- # CONFIG_NET_VENDOR_3COM is not set
- # CONFIG_NET_TULIP is not set
- # CONFIG_HP100 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 is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
- # CONFIG_NET_PCI is not set
- # CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
-@@ -741,6 +749,7 @@ CONFIG_SERIAL_TXX9_CONSOLE=y
- CONFIG_UNIX98_PTYS=y
- # CONFIG_LEGACY_PTYS is not set
- CONFIG_HVC_DRIVER=y
-+CONFIG_HVC_RTAS=y
- CONFIG_HVC_BEAT=y
- # CONFIG_IPMI_HANDLER is not set
- # CONFIG_HW_RANDOM is not set
-@@ -822,6 +831,7 @@ CONFIG_WATCHDOG=y
- # Watchdog Device Drivers
- #
- # CONFIG_SOFT_WATCHDOG is not set
-+# CONFIG_WATCHDOG_RTAS is not set
- #
- # PCI-based Watchdog Cards
-@@ -1245,17 +1255,7 @@ CONFIG_XMON_DISASSEMBLY=y
- CONFIG_IRQSTACKS=y
- # CONFIG_VIRQ_DEBUG is not set
- # CONFIG_BOOTX_TEXT is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--CONFIG_PPC_EARLY_DEBUG_BEAT=y
--# CONFIG_PPC_EARLY_DEBUG_44x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
- #
- # Security options
---- a/arch/powerpc/configs/ebony_defconfig
-+++ b/arch/powerpc/configs/ebony_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:48:11 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:16:26 2007
- #
- # CONFIG_PPC64 is not set
-@@ -130,6 +130,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
- #
- # Platform support
-@@ -142,6 +143,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_BAMBOO is not set
- CONFIG_EBONY=y
- # CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440GP=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
---- /dev/null
-+++ b/arch/powerpc/configs/ep405_defconfig
-@@ -0,0 +1,952 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:17:13 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=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_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EP405=y
-+# CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405GP=y
-+CONFIG_IBM405_ERR77=y
-+CONFIG_IBM405_ERR51=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="ep405.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+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=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 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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+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=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT 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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 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 is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# 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_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# 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_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# 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_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG 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
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_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_PHIDGET 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 is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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 is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_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_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/ep8248e_defconfig
-@@ -0,0 +1,821 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Fri Jan 11 14:02:06 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+# CONFIG_EXPERIMENTAL is not set
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# 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_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=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_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+CONFIG_PPC_82xx=y
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_MPC8272_ADS is not set
-+# CONFIG_PQ2FADS is not set
-+CONFIG_EP8248E=y
-+# CONFIG_PQ2ADS is not set
-+CONFIG_8260=y
-+CONFIG_8272=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+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_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="ep8248e.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+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_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+CONFIG_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=y
-+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_IP_VS is not set
-+CONFIG_IPV6=y
-+# CONFIG_IPV6_PRIVACY is not set
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_INET6_AH is not set
-+# CONFIG_INET6_ESP is not set
-+# CONFIG_INET6_IPCOMP is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET6_XFRM_MODE_TUNNEL=y
-+CONFIG_INET6_XFRM_MODE_BEET=y
-+CONFIG_IPV6_SIT=y
-+# CONFIG_IPV6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK is not set
-+# CONFIG_NF_CONNTRACK_ENABLED is not set
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_XTABLES is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_ARPTABLES 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_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL 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=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS 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 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+# CONFIG_MTD_CFI_I1 is not set
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# 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_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_MISC_DEVICES is not set
-+# 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_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING 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=y
-+# 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 is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+CONFIG_MDIO_BITBANG=y
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# 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_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FCC=y
-+# CONFIG_FS_ENET_MDIO_FCC is not set
-+CONFIG_NETDEV_1000=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+CONFIG_SERIAL_CPM_SCC4=y
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# 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
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_FS_XATTR is not set
-+CONFIG_JBD=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+CONFIG_AUTOFS4_FS=y
-+# 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_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_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=y
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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 is not set
-+# CONFIG_SCHED_DEBUG is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB 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_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=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_HW is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/katmai_defconfig
-@@ -0,0 +1,790 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:17:43 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+CONFIG_KATMAI=y
-+# CONFIG_RAINIER is not set
-+CONFIG_440SPe=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="katmai.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+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=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 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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# 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_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG 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=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/kilauea_defconfig
-+++ b/arch/powerpc/configs/kilauea_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:48:20 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan  3 14:21:31 2008
- #
- # CONFIG_PPC64 is not set
-@@ -40,7 +40,7 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
- CONFIG_ARCH_MAY_HAVE_PC_FDC=y
- CONFIG_PPC_OF=y
- CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
-+CONFIG_PPC_UDBG_16550=y
- # CONFIG_GENERIC_TBSYNC is not set
- CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
-@@ -125,6 +125,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_PPC4xx_PCI_EXPRESS=y
- #
- # Platform support
-@@ -134,9 +135,12 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
- CONFIG_KILAUEA=y
-+# CONFIG_MAKALU is not set
- # CONFIG_WALNUT is not set
- # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
-@@ -199,11 +203,17 @@ CONFIG_ISA_DMA_API=y
- # Bus options
- #
- CONFIG_ZONE_DMA=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
- #
- # Advanced setup
-@@ -368,11 +378,13 @@ CONFIG_MTD_CFI_UTIL=y
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
- # CONFIG_MTD_PHYSMAP is not set
- CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
- #
- # Self-contained MTD device drivers
- #
-+# CONFIG_MTD_PMC551 is not set
- # CONFIG_MTD_SLRAM is not set
- # CONFIG_MTD_PHRAM is not set
- # CONFIG_MTD_MTDRAM is not set
-@@ -395,9 +407,14 @@ CONFIG_OF_DEVICE=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
- # 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_SX8 is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=35000
-@@ -417,6 +434,14 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_SCSI_NETLINK is not set
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
- # CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
-@@ -426,9 +451,33 @@ CONFIG_NETDEVICES=y
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
- # CONFIG_VETH is not set
--# CONFIG_NET_ETHERNET is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
- # CONFIG_NETDEV_1000 is not set
- # CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
- #
- # Wireless LAN
-@@ -436,6 +485,8 @@ CONFIG_NETDEVICES=y
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
- # CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
- # CONFIG_SHAPER is not set
-@@ -467,6 +518,7 @@ CONFIG_NETDEVICES=y
- #
- CONFIG_SERIAL_8250=y
- CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
- CONFIG_SERIAL_8250_NR_UARTS=4
- CONFIG_SERIAL_8250_RUNTIME_UARTS=4
- CONFIG_SERIAL_8250_EXTENDED=y
-@@ -481,6 +533,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
- # CONFIG_SERIAL_UARTLITE is not set
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
- CONFIG_SERIAL_OF_PLATFORM=y
- CONFIG_UNIX98_PTYS=y
- CONFIG_LEGACY_PTYS=y
-@@ -490,8 +543,10 @@ CONFIG_LEGACY_PTY_COUNT=256
- # CONFIG_NVRAM is not set
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
- # CONFIG_I2C is not set
- #
-@@ -525,6 +580,8 @@ CONFIG_SSB_POSSIBLE=y
- #
- # Graphics support
- #
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
- # CONFIG_VGASTATE is not set
- # CONFIG_VIDEO_OUTPUT_CONTROL is not set
- # CONFIG_FB is not set
-@@ -542,6 +599,7 @@ CONFIG_SSB_POSSIBLE=y
- # CONFIG_USB_SUPPORT is not set
- # CONFIG_MMC is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
---- a/arch/powerpc/configs/lite5200_defconfig
-+++ /dev/null
-@@ -1,847 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:48:24 2007
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_ALTIVEC is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
--# CONFIG_PID_NS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--# CONFIG_FAIR_GROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--# CONFIG_SYSCTL_SYSCALL is not set
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--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
--
--#
--# 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"
--
--#
--# Platform support
--#
--CONFIG_PPC_MULTIPLATFORM=y
--# CONFIG_PPC_82xx is not set
--# CONFIG_PPC_83xx is not set
--# CONFIG_PPC_86xx is not set
--CONFIG_CLASSIC32=y
--# CONFIG_PPC_CHRP is not set
--CONFIG_PPC_MPC52xx=y
--CONFIG_PPC_MPC5200=y
--CONFIG_PPC_MPC5200_BUGFIX=y
--# CONFIG_PPC_EFIKA is not set
--CONFIG_PPC_LITE5200=y
--# CONFIG_PPC_PMAC is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_EMBEDDED6xx is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_TAU is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_PPC_BESTCOMM=y
--CONFIG_PPC_BESTCOMM_ATA=y
--CONFIG_PPC_BESTCOMM_FEC=y
--CONFIG_PPC_BESTCOMM_GEN_BD=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--# CONFIG_KEXEC is not set
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--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_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--CONFIG_PM=y
--# CONFIG_PM_LEGACY is not set
--# CONFIG_PM_DEBUG is not set
--CONFIG_PM_SLEEP=y
--CONFIG_SUSPEND_UP_POSSIBLE=y
--CONFIG_SUSPEND=y
--CONFIG_HIBERNATION_UP_POSSIBLE=y
--# CONFIG_HIBERNATION is not set
--CONFIG_SECCOMP=y
--CONFIG_WANT_DEVICE_TREE=y
--CONFIG_DEVICE_TREE=""
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--# CONFIG_PPC_INDIRECT_PCI is not set
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=m
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_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 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL 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_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 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 is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_SCSI_PROC_FS is not set
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# 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_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_AHCI is not set
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--CONFIG_PATA_MPC52xx=y
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# 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_IP1000 is not set
--# CONFIG_ARCNET is not set
--# CONFIG_NET_ETHERNET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_MV643XX_ETH is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_SHAPER is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--# CONFIG_SERIAL_8250 is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_MPC52xx=y
--CONFIG_SERIAL_MPC52xx_CONSOLE=y
--CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=9600
--# CONFIG_SERIAL_JSM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# 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_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# USB Gadget Support
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_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_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_ROMFS_FS is not set
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--CONFIG_DNOTIFY=y
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_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_KCORE=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_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--# CONFIG_NFS_FS is not set
--# CONFIG_NFSD 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
--# CONFIG_UCC_SLOW is not set
--
--#
--# Library routines
--#
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--# CONFIG_CRC32 is not set
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--# CONFIG_INSTRUMENTATION is not set
--
--#
--# Kernel hacking
--#
--CONFIG_PRINTK_TIME=y
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# 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=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--CONFIG_DEBUG_INFO=y
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--CONFIG_FORCED_INLINING=y
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_BOOTX_TEXT is not set
--# CONFIG_PPC_EARLY_DEBUG 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
--CONFIG_PPC_CLOCK=y
--CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/makalu_defconfig
-@@ -0,0 +1,812 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:18:32 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=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_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
-+# CONFIG_KILAUEA is not set
-+CONFIG_MAKALU=y
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="kilauea.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+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=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 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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+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=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT 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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 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 is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+# CONFIG_MISC_DEVICES is not set
-+# 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_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# 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
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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 is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_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_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/mpc5200_defconfig
-@@ -0,0 +1,1286 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Fri Jan 18 14:19:54 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_ALTIVEC is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+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
-+
-+#
-+# 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"
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+CONFIG_PPC_MPC52xx=y
-+CONFIG_PPC_MPC5200=y
-+CONFIG_PPC_MPC5200_BUGFIX=y
-+CONFIG_PPC_MPC5200_SIMPLE=y
-+CONFIG_PPC_EFIKA=y
-+CONFIG_PPC_LITE5200=y
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EMBEDDED6xx is not set
-+CONFIG_PPC_NATIVE=y
-+# CONFIG_UDBG_RTAS_CONSOLE is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+CONFIG_PPC_RTAS=y
-+# CONFIG_RTAS_ERROR_LOGGING is not set
-+CONFIG_RTAS_PROC=y
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_TAU is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_PPC_BESTCOMM=y
-+CONFIG_PPC_BESTCOMM_ATA=y
-+CONFIG_PPC_BESTCOMM_FEC=y
-+CONFIG_PPC_BESTCOMM_GEN_BD=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+# CONFIG_KEXEC is not set
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+CONFIG_PM=y
-+# CONFIG_PM_LEGACY is not set
-+# CONFIG_PM_DEBUG is not set
-+CONFIG_PM_SLEEP=y
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_SUSPEND=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_HIBERNATION is not set
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE=""
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+# CONFIG_PPC_INDIRECT_PCI is not set
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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 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=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# 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 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=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 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 is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+CONFIG_SCSI_TGT=y
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# 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_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_AHCI is not set
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_PATA_ALI is not set
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+CONFIG_PATA_MPC52xx=y
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+CONFIG_PATA_PLATFORM=y
-+# CONFIG_PATA_OF_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET 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 is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 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_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_FEC_MPC52xx=y
-+CONFIG_FEC_MPC52xx_MDIO=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# 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_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_MPC52xx=y
-+CONFIG_SERIAL_MPC52xx_CONSOLE=y
-+CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_HVC_RTAS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID 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_ADT7470 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S 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_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 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_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 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_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+# CONFIG_MPC5200_WDT is not set
-+# CONFIG_WATCHDOG_RTAS is not set
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_DEVICE_CLASS is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_SUSPEND is not set
-+# CONFIG_USB_PERSIST is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_SOC=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_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_PHIDGET 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 is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=y
-+
-+#
-+# LED drivers
-+#
-+
-+#
-+# LED Triggers
-+#
-+CONFIG_LEDS_TRIGGERS=y
-+CONFIG_LEDS_TRIGGER_TIMER=y
-+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_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_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=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_KCORE=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=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+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 is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_PRINTK_TIME=y
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# 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=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_BOOTX_TEXT is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+CONFIG_PPC_CLOCK=y
-+CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc8313_rdb_defconfig
-+++ b/arch/powerpc/configs/mpc8313_rdb_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:48:31 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:35:55 2008
- #
- # CONFIG_PPC64 is not set
-@@ -144,6 +144,7 @@ CONFIG_MPC8313_RDB=y
- # CONFIG_MPC834x_MDS is not set
- # CONFIG_MPC834x_ITX is not set
- # CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
- CONFIG_PPC_MPC831x=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
-@@ -336,15 +337,16 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
- CONFIG_MTD=y
- # CONFIG_MTD_DEBUG is not set
- # CONFIG_MTD_CONCAT is not set
--# CONFIG_MTD_PARTITIONS is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
- #
- # User Modules And Translation Layers
- #
- CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
- # CONFIG_FTL is not set
- # CONFIG_NFTL is not set
- # CONFIG_INFTL is not set
-@@ -381,11 +383,8 @@ CONFIG_MTD_CFI_UTIL=y
- # Mapping drivers for chip access
- #
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
--CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=0xfe000000
--CONFIG_MTD_PHYSMAP_LEN=0x1000000
--CONFIG_MTD_PHYSMAP_BANKWIDTH=2
--# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
- # CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
-@@ -406,7 +405,16 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
- # 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_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_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_CAFE 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_ONENAND is not set
- #
-@@ -1178,7 +1186,17 @@ CONFIG_TMPFS=y
- # CONFIG_BEFS_FS is not set
- # CONFIG_BFS_FS is not set
- # CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_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_HPFS_FS is not set
-@@ -1242,6 +1260,8 @@ CONFIG_BITREVERSE=y
- 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
---- a/arch/powerpc/configs/mpc834x_itx_defconfig
-+++ b/arch/powerpc/configs/mpc834x_itx_defconfig
-@@ -570,7 +570,8 @@ CONFIG_SATA_SIL=y
- # CONFIG_PATA_SIS is not set
- # CONFIG_PATA_VIA is not set
- # CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
-+CONFIG_PATA_PLATFORM=y
-+CONFIG_PATA_OF_PLATFORM=y
- CONFIG_MD=y
- CONFIG_BLK_DEV_MD=y
- CONFIG_MD_LINEAR=y
---- /dev/null
-+++ b/arch/powerpc/configs/mpc837x_mds_defconfig
-@@ -0,0 +1,878 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.23
-+# Wed Oct 10 16:31:39 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_83xx=y
-+CONFIG_PPC_FPU=y
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=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_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=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_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+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
-+
-+#
-+# 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"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_EMBEDDED6xx is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPC8313_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+CONFIG_MPC837x_MDS=y
-+CONFIG_PPC_MPC837x=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_FSL_SERDES=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE=""
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_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_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 is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+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=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# 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_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_FSL=y
-+# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# 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 is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_NETDEV_1000=y
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE 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_TSDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# 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 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 is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X 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
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_ABITUGURU is not set
-+# CONFIG_SENSORS_ABITUGURU3 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_ASB100 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 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_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 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_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_FB_IBM_GXT4500 is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG 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=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# DMA Engine support
-+#
-+# CONFIG_DMA_ENGINE is not set
-+
-+#
-+# DMA Clients
-+#
-+
-+#
-+# DMA Devices
-+#
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_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_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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_RAMFS=y
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+
-+#
-+# Network File Systems
-+#
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+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
-+
-+#
-+# Native Language Support
-+#
-+# CONFIG_NLS is not set
-+
-+#
-+# Distributed Lock Manager
-+#
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Instrumentation Support
-+#
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_MUST_CHECK=y
-+# 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_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+CONFIG_CRYPTO_HW=y
---- a/arch/powerpc/configs/mpc8610_hpcd_defconfig
-+++ b/arch/powerpc/configs/mpc8610_hpcd_defconfig
-@@ -696,7 +696,7 @@ CONFIG_SERIAL_8250_RSA=y
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
- # CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
- CONFIG_UNIX98_PTYS=y
- # CONFIG_LEGACY_PTYS is not set
- # CONFIG_IPMI_HANDLER is not set
-@@ -708,7 +708,60 @@ CONFIG_UNIX98_PTYS=y
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
- CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 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
- #
- # SPI support
-@@ -763,7 +816,119 @@ CONFIG_DUMMY_CONSOLE=y
- #
- # Sound
- #
--# CONFIG_SOUND is not set
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+# CONFIG_SND_SEQUENCER is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+# CONFIG_SND_PCM_OSS_PLUGINS is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+# CONFIG_SND_SUPPORT_OLD_API is not set
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+
-+#
-+# Generic devices
-+#
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# PCI devices
-+#
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALS4000 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+# CONFIG_SND_CS5530 is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+# CONFIG_SND_INTEL8X0 is not set
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+
-+#
-+# ALSA PowerMac devices
-+#
-+
-+#
-+# ALSA PowerPC devices
-+#
-+
-+#
-+# System on Chip audio support
-+#
-+CONFIG_SND_SOC=y
-+
-+#
-+# SoC Audio support for SuperH
-+#
-+
-+#
-+# ALSA SoC audio for Freescale SOCs
-+#
-+CONFIG_SND_SOC_MPC8610=y
-+CONFIG_SND_SOC_MPC8610_HPCD=y
-+CONFIG_SND_SOC_CS4270=y
-+CONFIG_SND_SOC_CS4270_VD33_ERRATA=y
-+
- CONFIG_HID_SUPPORT=y
- CONFIG_HID=y
- # CONFIG_HID_DEBUG is not set
---- a/arch/powerpc/configs/pasemi_defconfig
-+++ b/arch/powerpc/configs/pasemi_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:49:03 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan 15 10:26:10 2008
- #
- CONFIG_PPC64=y
-@@ -152,7 +152,6 @@ CONFIG_PPC_PASEMI=y
- CONFIG_PPC_PASEMI_IOMMU=y
- # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
- CONFIG_PPC_PASEMI_MDIO=y
--CONFIG_ELECTRA_IDE=y
- # CONFIG_PPC_CELLEB is not set
- # CONFIG_PPC_PS3 is not set
- # CONFIG_PPC_CELL is not set
-@@ -256,7 +255,7 @@ CONFIG_PCI_DOMAINS=y
- CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_MSI=y
- CONFIG_PCI_LEGACY=y
- # CONFIG_PCI_DEBUG is not set
- CONFIG_PCCARD=y
-@@ -663,7 +662,26 @@ CONFIG_PATA_PCMCIA=y
- # CONFIG_PATA_VIA is not set
- # CONFIG_PATA_WINBOND is not set
- CONFIG_PATA_PLATFORM=y
--# CONFIG_MD is not set
-+CONFIG_PATA_OF_PLATFORM=y
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+CONFIG_MD_RAID10=y
-+CONFIG_MD_RAID456=y
-+CONFIG_MD_RAID5_RESHAPE=y
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+CONFIG_BLK_DEV_DM=y
-+# CONFIG_DM_DEBUG is not set
-+CONFIG_DM_CRYPT=y
-+# CONFIG_DM_SNAPSHOT is not set
-+# CONFIG_DM_MIRROR is not set
-+# CONFIG_DM_ZERO is not set
-+# CONFIG_DM_MULTIPATH is not set
-+# CONFIG_DM_DELAY is not set
-+# CONFIG_DM_UEVENT is not set
- # CONFIG_FUSION is not set
- #
-@@ -1686,6 +1704,10 @@ CONFIG_XMON_DISASSEMBLY=y
- # CONFIG_KEYS is not set
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_XOR_BLOCKS=y
-+CONFIG_ASYNC_CORE=y
-+CONFIG_ASYNC_MEMCPY=y
-+CONFIG_ASYNC_XOR=y
- CONFIG_CRYPTO=y
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_BLKCIPHER=y
---- a/arch/powerpc/configs/ppc64_defconfig
-+++ b/arch/powerpc/configs/ppc64_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:49:07 2007
-+# Fri Dec 21 14:47:29 2007
- #
- CONFIG_PPC64=y
-@@ -211,7 +211,7 @@ CONFIG_MMIO_NVRAM=y
- CONFIG_MPIC_U3_HT_IRQS=y
- CONFIG_MPIC_BROKEN_REGREAD=y
- CONFIG_IBMVIO=y
--# CONFIG_IBMEBUS is not set
-+CONFIG_IBMEBUS=y
- # CONFIG_PPC_MPC106 is not set
- CONFIG_PPC_970_NAP=y
- CONFIG_PPC_INDIRECT_IO=y
-@@ -375,7 +375,7 @@ CONFIG_INET_TUNNEL=y
- 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_LRO=m
- CONFIG_INET_DIAG=y
- CONFIG_INET_TCP_DIAG=y
- # CONFIG_TCP_CONG_ADVANCED is not set
-@@ -929,6 +929,7 @@ CONFIG_SPIDER_NET=m
- CONFIG_NETDEV_10000=y
- # CONFIG_CHELSIO_T1 is not set
- # CONFIG_CHELSIO_T3 is not set
-+CONFIG_EHEA=m
- # CONFIG_IXGBE is not set
- CONFIG_IXGB=m
- # CONFIG_IXGB_NAPI is not set
-@@ -1558,6 +1559,7 @@ CONFIG_INFINIBAND_ADDR_TRANS=y
- CONFIG_INFINIBAND_MTHCA=m
- CONFIG_INFINIBAND_MTHCA_DEBUG=y
- # CONFIG_INFINIBAND_IPATH is not set
-+CONFIG_INFINIBAND_EHCA=m
- # CONFIG_INFINIBAND_AMSO1100 is not set
- # CONFIG_MLX4_INFINIBAND is not set
- CONFIG_INFINIBAND_IPOIB=m
---- a/arch/powerpc/configs/ps3_defconfig
-+++ b/arch/powerpc/configs/ps3_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Tue Dec  4 22:49:57 2007
-+# Linux kernel version: 2.6.24-rc8
-+# Wed Jan 16 14:31:21 2008
- #
- CONFIG_PPC64=y
-@@ -103,6 +103,7 @@ CONFIG_VM_EVENT_COUNTERS=y
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
- # CONFIG_SLOB is not set
-+CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
-@@ -154,7 +155,6 @@ CONFIG_PPC_PS3=y
- # CONFIG_PS3_ADVANCED is not set
- CONFIG_PS3_HTAB_SIZE=20
- # CONFIG_PS3_DYNAMIC_DMA is not set
--CONFIG_PS3_USE_LPAR_ADDR=y
- CONFIG_PS3_VUART=y
- CONFIG_PS3_PS3AV=y
- CONFIG_PS3_SYS_MANAGER=y
-@@ -162,6 +162,7 @@ CONFIG_PS3_STORAGE=y
- CONFIG_PS3_DISK=y
- CONFIG_PS3_ROM=y
- CONFIG_PS3_FLASH=y
-+CONFIG_PS3_LPM=m
- CONFIG_PPC_CELL=y
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-@@ -225,7 +226,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y
- # CONFIG_SPARSEMEM_STATIC is not set
- CONFIG_SPARSEMEM_EXTREME=y
- CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
--CONFIG_SPARSEMEM_VMEMMAP=y
-+# CONFIG_SPARSEMEM_VMEMMAP is not set
- CONFIG_MEMORY_HOTPLUG=y
- CONFIG_MEMORY_HOTPLUG_SPARSE=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
-@@ -338,7 +339,26 @@ CONFIG_IPV6_SIT=y
- # CONFIG_NET_PKTGEN is not set
- # CONFIG_HAMRADIO is not set
- # CONFIG_IRDA is not set
--# CONFIG_BT is not set
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=m
-+CONFIG_BT_SCO=m
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+
-+#
-+# Bluetooth device drivers
-+#
-+CONFIG_BT_HCIUSB=m
-+CONFIG_BT_HCIUSB_SCO=y
-+# CONFIG_BT_HCIUART is not set
-+# CONFIG_BT_HCIBCM203X is not set
-+# CONFIG_BT_HCIBPA10X is not set
-+# CONFIG_BT_HCIBFUSB is not set
-+# CONFIG_BT_HCIVHCI is not set
- # CONFIG_AF_RXRPC is not set
- #
-@@ -666,14 +686,14 @@ CONFIG_LOGO_LINUX_CLUT224=y
- #
- # Sound
- #
--CONFIG_SOUND=y
-+CONFIG_SOUND=m
- #
- # Advanced Linux Sound Architecture
- #
--CONFIG_SND=y
--CONFIG_SND_TIMER=y
--CONFIG_SND_PCM=y
-+CONFIG_SND=m
-+CONFIG_SND_TIMER=m
-+CONFIG_SND_PCM=m
- # CONFIG_SND_SEQUENCER is not set
- # CONFIG_SND_MIXER_OSS is not set
- # CONFIG_SND_PCM_OSS is not set
-@@ -702,7 +722,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
- #
- # ALSA PowerPC devices
- #
--CONFIG_SND_PS3=y
-+CONFIG_SND_PS3=m
- CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
- #
-@@ -747,7 +767,7 @@ CONFIG_USB_SUPPORT=y
- CONFIG_USB_ARCH_HAS_HCD=y
- CONFIG_USB_ARCH_HAS_OHCI=y
- CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
-+CONFIG_USB=m
- # CONFIG_USB_DEBUG is not set
- #
-@@ -761,13 +781,13 @@ CONFIG_USB_DEVICEFS=y
- #
- # USB Host Controller Drivers
- #
--CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_HCD=m
- # CONFIG_USB_EHCI_SPLIT_ISO is not set
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
- # CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD=m
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
- CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-@@ -1033,7 +1053,8 @@ CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
- CONFIG_INSTRUMENTATION=y
--# CONFIG_PROFILING is not set
-+CONFIG_PROFILING=y
-+CONFIG_OPROFILE=m
- # CONFIG_KPROBES is not set
- # CONFIG_MARKERS is not set
---- /dev/null
-+++ b/arch/powerpc/configs/rainier_defconfig
-@@ -0,0 +1,873 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:22:40 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+CONFIG_RAINIER=y
-+CONFIG_440GRX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="rainier.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+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=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 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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# 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=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 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 is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# 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_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sequoia_defconfig
-+++ b/arch/powerpc/configs/sequoia_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:49:17 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:22 2007
- #
- # CONFIG_PPC64 is not set
-@@ -129,6 +129,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
- #
- # Platform support
-@@ -141,8 +142,10 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_BAMBOO is not set
- # CONFIG_EBONY is not set
- CONFIG_SEQUOIA=y
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440EPX=y
--CONFIG_440A=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
-@@ -446,9 +449,7 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_FIREWIRE is not set
- # CONFIG_IEEE1394 is not set
- # CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
-@@ -459,10 +460,28 @@ CONFIG_NETDEVICES=y
- # CONFIG_VETH is not set
- # CONFIG_IP1000 is not set
- # CONFIG_ARCNET is not set
--# CONFIG_NET_ETHERNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
- CONFIG_IBM_NEW_EMAC_ZMII=y
- CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
- CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
- # CONFIG_ACENIC is not set
- # CONFIG_DL2K is not set
-@@ -811,6 +830,7 @@ CONFIG_PPC_EARLY_DEBUG=y
- # CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
- # CONFIG_PPC_EARLY_DEBUG_BEAT is not set
- CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
- # CONFIG_PPC_EARLY_DEBUG_CPM is not set
- CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
- CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
---- /dev/null
-+++ b/arch/powerpc/configs/storcenter_defconfig
-@@ -0,0 +1,1174 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan  8 09:33:54 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_ALTIVEC is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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"
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_EFIKA is not set
-+# CONFIG_PPC_LITE5200 is not set
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EMBEDDED6xx=y
-+# CONFIG_LINKSTATION is not set
-+CONFIG_STORCENTER=y
-+# CONFIG_MPC7448HPC2 is not set
-+# CONFIG_PPC_HOLLY is not set
-+# CONFIG_PPC_PRPMC2800 is not set
-+CONFIG_MPC10X_BRIDGE=y
-+CONFIG_MPC10X_OPENPIC=y
-+# CONFIG_MPC10X_STORE_GATHERING is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_TAU is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+CONFIG_HZ_100=y
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=100
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+# CONFIG_KEXEC is not set
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0,115200"
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="storcenter.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=m
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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 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 is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+CONFIG_FTL=y
-+CONFIG_NFTL=y
-+CONFIG_NFTL_RW=y
-+# 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 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=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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0xFF800000
-+CONFIG_MTD_PHYSMAP_LEN=0x00800000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=1
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 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 is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+# CONFIG_BLK_DEV_UB 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_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+CONFIG_IDEDISK_MULTI_MODE=y
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+# CONFIG_IDEPCI_SHARE_IRQ is not set
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_GENERIC is not set
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+# CONFIG_IDE_ARM is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+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=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=y
-+# CONFIG_BLK_DEV_SR_VENDOR 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=y
-+# 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_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+CONFIG_MD_RAID456=y
-+CONFIG_MD_RAID5_RESHAPE=y
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+CONFIG_DUMMY=m
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+CONFIG_R8169=y
-+# CONFIG_R8169_NAPI is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_MV643XX_ETH is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# 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_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=m
-+CONFIG_NVRAM=y
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# 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
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG 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
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+# CONFIG_USB_EHCI_SPLIT_ISO is not set
-+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_MON is not set
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_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_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# 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=y
-+# 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
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_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_XFS_FS=m
-+# CONFIG_XFS_QUOTA is not set
-+# CONFIG_XFS_SECURITY is not set
-+# CONFIG_XFS_POSIX_ACL is not set
-+# CONFIG_XFS_RT is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+# CONFIG_NETWORK_FILESYSTEMS 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="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS 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_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_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_BOOTX_TEXT is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_XOR_BLOCKS=y
-+CONFIG_ASYNC_CORE=y
-+CONFIG_ASYNC_MEMCPY=y
-+CONFIG_ASYNC_XOR=y
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/taishan_defconfig
-@@ -0,0 +1,790 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:39 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=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=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG 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_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+CONFIG_TAISHAN=y
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+CONFIG_440GX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="taishan.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+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=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 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=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 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL 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_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=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# 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_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# 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_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_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_KCORE=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_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 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_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/walnut_defconfig
-+++ b/arch/powerpc/configs/walnut_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec  6 16:49:33 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:58 2007
- #
- # CONFIG_PPC64 is not set
-@@ -40,7 +40,7 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
- CONFIG_ARCH_MAY_HAVE_PC_FDC=y
- CONFIG_PPC_OF=y
- CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
-+CONFIG_PPC_UDBG_16550=y
- # CONFIG_GENERIC_TBSYNC is not set
- CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
-@@ -127,6 +127,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
- #
- # Platform support
-@@ -136,7 +137,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
- # CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
- CONFIG_WALNUT=y
- # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
- CONFIG_405GP=y
-@@ -204,11 +207,17 @@ CONFIG_ISA_DMA_API=y
- # Bus options
- #
- CONFIG_ZONE_DMA=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+# CONFIG_PCI_LEGACY is not set
-+# CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
- #
- # Advanced setup
-@@ -373,11 +382,13 @@ CONFIG_MTD_CFI_UTIL=y
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
- # CONFIG_MTD_PHYSMAP is not set
- CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
- #
- # Self-contained MTD device drivers
- #
-+# CONFIG_MTD_PMC551 is not set
- # CONFIG_MTD_SLRAM is not set
- # CONFIG_MTD_PHRAM is not set
- # CONFIG_MTD_MTDRAM is not set
-@@ -400,9 +411,14 @@ CONFIG_OF_DEVICE=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
- # 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_SX8 is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=35000
-@@ -411,7 +427,10 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_ATA_OVER_ETH is not set
- # CONFIG_XILINX_SYSACE is not set
- CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
- # CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
- # CONFIG_IDE is not set
- #
-@@ -423,6 +442,14 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_SCSI_NETLINK is not set
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
- # CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
-@@ -432,9 +459,17 @@ CONFIG_NETDEVICES=y
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
- # CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
- # CONFIG_PHYLIB is not set
- CONFIG_NET_ETHERNET=y
- # CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
- CONFIG_IBM_NEW_EMAC=y
- CONFIG_IBM_NEW_EMAC_RXB=128
- CONFIG_IBM_NEW_EMAC_TXB=64
-@@ -446,9 +481,38 @@ CONFIG_IBM_NEW_EMAC_ZMII=y
- # 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_NET_PCI is not set
- # CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
- CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
- #
- # Wireless LAN
-@@ -456,6 +520,8 @@ CONFIG_NETDEV_10000=y
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
- # CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
- # CONFIG_SHAPER is not set
-@@ -487,6 +553,7 @@ CONFIG_NETDEV_10000=y
- #
- CONFIG_SERIAL_8250=y
- CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
- CONFIG_SERIAL_8250_NR_UARTS=4
- CONFIG_SERIAL_8250_RUNTIME_UARTS=4
- CONFIG_SERIAL_8250_EXTENDED=y
-@@ -501,6 +568,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
- # CONFIG_SERIAL_UARTLITE is not set
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
- CONFIG_SERIAL_OF_PLATFORM=y
- CONFIG_UNIX98_PTYS=y
- CONFIG_LEGACY_PTYS=y
-@@ -510,8 +578,10 @@ CONFIG_LEGACY_PTY_COUNT=256
- # CONFIG_NVRAM is not set
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
- # CONFIG_I2C is not set
- #
-@@ -545,6 +615,8 @@ CONFIG_SSB_POSSIBLE=y
- #
- # Graphics support
- #
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
- # CONFIG_VGASTATE is not set
- CONFIG_VIDEO_OUTPUT_CONTROL=m
- # CONFIG_FB is not set
-@@ -560,9 +632,10 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m
- #
- # CONFIG_SOUND is not set
- CONFIG_USB_SUPPORT=y
--# CONFIG_USB_ARCH_HAS_HCD is not set
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
- #
- # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-@@ -574,6 +647,7 @@ CONFIG_USB_SUPPORT=y
- # CONFIG_USB_GADGET is not set
- # CONFIG_MMC is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
---- /dev/null
-+++ b/arch/powerpc/configs/warp_defconfig
-@@ -0,0 +1,1057 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan  8 12:23:23 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-pika"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+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_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=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_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# 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
-+
-+#
-+# 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"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+CONFIG_WARP=y
-+CONFIG_440EP=y
-+CONFIG_IBM440EP_ERR42=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+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_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="ip=on"
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="warp.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+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_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=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_IP_VS is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK is not set
-+# CONFIG_NF_CONNTRACK_ENABLED is not set
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_XTABLES is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_ARPTABLES 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=y
-+# 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_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_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# 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 is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_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=m
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT 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
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# 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 is not set
-+CONFIG_MTD_NAND_ECC_SMC=y
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+CONFIG_MTD_NAND_NDFC=y
-+# 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_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+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=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+# CONFIG_SCSI_WAIT_SCAN is not set
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# 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 is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# 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_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# 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
-+
-+#
-+# 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 is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC 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 is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_IBM_IIC=y
-+# CONFIG_I2C_MPC is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 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
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+CONFIG_SENSORS_AD7414=y
-+# 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_ADT7470 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_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_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 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_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_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP 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_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# 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
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_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_PHIDGET 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
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+CONFIG_MMC=m
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-+
-+#
-+# MMC/SD Card Drivers
-+#
-+CONFIG_MMC_BLOCK=m
-+CONFIG_MMC_BLOCK_BOUNCE=y
-+# CONFIG_SDIO_UART is not set
-+
-+#
-+# MMC/SD Host Controller Drivers
-+#
-+# CONFIG_MMC_WBSD is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO 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 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_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=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_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+# CONFIG_TMPFS 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=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+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_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# 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=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=y
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 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
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+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_SCHED_DEBUG is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB 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_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG 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
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/kernel/Makefile
-+++ b/arch/powerpc/kernel/Makefile
-@@ -3,7 +3,7 @@
- #
- ifeq ($(CONFIG_PPC64),y)
--EXTRA_CFLAGS  += -mno-minimal-toc
-+CFLAGS_prom_init.o    += -mno-minimal-toc
- endif
- ifeq ($(CONFIG_PPC32),y)
- CFLAGS_prom_init.o      += -fPIC
-@@ -70,6 +70,7 @@ pci64-$(CONFIG_PPC64)                += pci_dn.o isa-b
- obj-$(CONFIG_PCI)             += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
-                                  pci-common.o
- obj-$(CONFIG_PCI_MSI)         += msi.o
-+obj-$(CONFIG_RAPIDIO)         += rio.o
- obj-$(CONFIG_KEXEC)           += machine_kexec.o crash.o \
-                                  machine_kexec_$(CONFIG_WORD_SIZE).o
- obj-$(CONFIG_AUDIT)           += audit.o
-@@ -91,3 +92,13 @@ obj-$(CONFIG_PPC64)         += $(obj64-y)
- extra-$(CONFIG_PPC_FPU)               += fpu.o
- extra-$(CONFIG_PPC64)         += entry_64.o
-+
-+extra-y                               += systbl_chk.i
-+$(obj)/systbl.o:              systbl_chk
-+
-+quiet_cmd_systbl_chk = CALL    $<
-+      cmd_systbl_chk = $(CONFIG_SHELL) $< $(obj)/systbl_chk.i
-+
-+PHONY += systbl_chk
-+systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i
-+      $(call cmd,systbl_chk)
---- a/arch/powerpc/kernel/btext.c
-+++ b/arch/powerpc/kernel/btext.c
-@@ -236,7 +236,7 @@ int __init btext_find_display(int allow_
-       if (rc == 0 || !allow_nonstdout)
-               return rc;
--      for (np = NULL; (np = of_find_node_by_type(np, "display"));) {
-+      for_each_node_by_type(np, "display") {
-               if (of_get_property(np, "linux,opened", NULL)) {
-                       printk("trying %s ...\n", np->full_name);
-                       rc = btext_initialize(np);
---- a/arch/powerpc/kernel/cpu_setup_44x.S
-+++ b/arch/powerpc/kernel/cpu_setup_44x.S
-@@ -23,11 +23,24 @@ _GLOBAL(__setup_cpu_440epx)
-       mflr    r4
-       bl      __init_fpu_44x
-       bl      __plb_disable_wrp
-+      bl      __fixup_440A_mcheck
-       mtlr    r4
-       blr
- _GLOBAL(__setup_cpu_440grx)
--      b       __plb_disable_wrp
-+      mflr    r4
-+      bl      __plb_disable_wrp
-+      bl      __fixup_440A_mcheck
-+      mtlr    r4
-+      blr
-+_GLOBAL(__setup_cpu_440gx)
-+_GLOBAL(__setup_cpu_440spe)
-+      b       __fixup_440A_mcheck
-+ /* Temporary fixup for arch/ppc until we kill the whole thing */
-+#ifndef CONFIG_PPC_MERGE
-+_GLOBAL(__fixup_440A_mcheck)
-+      blr
-+#endif
- /* enable APU between CPU and FPU */
- _GLOBAL(__init_fpu_44x)
---- a/arch/powerpc/kernel/cputable.c
-+++ b/arch/powerpc/kernel/cputable.c
-@@ -33,7 +33,9 @@ EXPORT_SYMBOL(cur_cpu_spec);
- #ifdef CONFIG_PPC32
- extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
-@@ -85,6 +87,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power3",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power3",
-       },
-       {       /* Power3+ */
-@@ -99,6 +102,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power3",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power3",
-       },
-       {       /* Northstar */
-@@ -113,6 +117,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/rs64",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "rs64",
-       },
-       {       /* Pulsar */
-@@ -127,6 +132,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/rs64",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "rs64",
-       },
-       {       /* I-star */
-@@ -141,6 +147,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/rs64",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "rs64",
-       },
-       {       /* S-star */
-@@ -155,6 +162,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/rs64",
-               .oprofile_type          = PPC_OPROFILE_RS64,
-+              .machine_check          = machine_check_generic,
-               .platform               = "rs64",
-       },
-       {       /* Power4 */
-@@ -169,6 +177,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power4",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power4",
-       },
-       {       /* Power4+ */
-@@ -183,6 +192,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power4",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power4",
-       },
-       {       /* PPC970 */
-@@ -200,6 +210,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_restore            = __restore_cpu_ppc970,
-               .oprofile_cpu_type      = "ppc64/970",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc970",
-       },
-       {       /* PPC970FX */
-@@ -217,6 +228,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_restore            = __restore_cpu_ppc970,
-               .oprofile_cpu_type      = "ppc64/970",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc970",
-       },
-       {       /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
-@@ -234,6 +246,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_restore            = __restore_cpu_ppc970,
-               .oprofile_cpu_type      = "ppc64/970MP",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc970",
-       },
-       {       /* PPC970MP */
-@@ -251,6 +264,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_restore            = __restore_cpu_ppc970,
-               .oprofile_cpu_type      = "ppc64/970MP",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc970",
-       },
-       {       /* PPC970GX */
-@@ -267,6 +281,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_ppc970,
-               .oprofile_cpu_type      = "ppc64/970",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc970",
-       },
-       {       /* Power5 GR */
-@@ -286,6 +301,7 @@ static struct cpu_spec __initdata cpu_sp
-                */
-               .oprofile_mmcra_sihv    = MMCRA_SIHV,
-               .oprofile_mmcra_sipr    = MMCRA_SIPR,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power5",
-       },
-       {       /* Power5++ */
-@@ -301,6 +317,7 @@ static struct cpu_spec __initdata cpu_sp
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-               .oprofile_mmcra_sihv    = MMCRA_SIHV,
-               .oprofile_mmcra_sipr    = MMCRA_SIPR,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power5+",
-       },
-       {       /* Power5 GS */
-@@ -317,6 +334,7 @@ static struct cpu_spec __initdata cpu_sp
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-               .oprofile_mmcra_sihv    = MMCRA_SIHV,
-               .oprofile_mmcra_sipr    = MMCRA_SIPR,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power5+",
-       },
-       {       /* POWER6 in P5+ mode; 2.04-compliant processor */
-@@ -327,6 +345,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_POWER5_PLUS,
-               .icache_bsize           = 128,
-               .dcache_bsize           = 128,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power5+",
-       },
-       {       /* Power6 */
-@@ -346,6 +365,7 @@ static struct cpu_spec __initdata cpu_sp
-               .oprofile_mmcra_sipr    = POWER6_MMCRA_SIPR,
-               .oprofile_mmcra_clear   = POWER6_MMCRA_THRM |
-                       POWER6_MMCRA_OTHER,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power6x",
-       },
-       {       /* 2.05-compliant processor, i.e. Power6 "architected" mode */
-@@ -356,6 +376,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_POWER6,
-               .icache_bsize           = 128,
-               .dcache_bsize           = 128,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power6",
-       },
-       {       /* Cell Broadband Engine */
-@@ -372,6 +393,7 @@ static struct cpu_spec __initdata cpu_sp
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/cell-be",
-               .oprofile_type          = PPC_OPROFILE_CELL,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc-cell-be",
-       },
-       {       /* PA Semi PA6T */
-@@ -388,6 +410,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_restore            = __restore_cpu_pa6t,
-               .oprofile_cpu_type      = "ppc64/pa6t",
-               .oprofile_type          = PPC_OPROFILE_PA6T,
-+              .machine_check          = machine_check_generic,
-               .platform               = "pa6t",
-       },
-       {       /* default match */
-@@ -400,6 +423,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 128,
-               .num_pmcs               = 6,
-               .pmc_type               = PPC_PMC_IBM,
-+              .machine_check          = machine_check_generic,
-               .platform               = "power4",
-       }
- #endif        /* CONFIG_PPC64 */
-@@ -414,6 +438,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc601",
-       },
-       {       /* 603 */
-@@ -425,6 +450,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* 603e */
-@@ -436,6 +462,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* 603ev */
-@@ -447,6 +474,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* 604 */
-@@ -459,6 +487,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 2,
-               .cpu_setup              = __setup_cpu_604,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc604",
-       },
-       {       /* 604e */
-@@ -471,6 +500,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_604,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc604",
-       },
-       {       /* 604r */
-@@ -483,6 +513,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_604,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc604",
-       },
-       {       /* 604ev */
-@@ -495,6 +526,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_604,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc604",
-       },
-       {       /* 740/750 (0x4202, don't support TAU ?) */
-@@ -507,6 +539,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750CX (80100 and 8010x?) */
-@@ -519,6 +552,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750cx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750CX (82201 and 82202) */
-@@ -531,6 +565,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750cx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750CXe (82214) */
-@@ -543,6 +578,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750cx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750CXe "Gekko" (83214) */
-@@ -555,6 +591,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750cx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750CL */
-@@ -567,6 +604,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 745/755 */
-@@ -579,6 +617,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750FX rev 1.x */
-@@ -591,6 +630,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750FX rev 2.0 must disable HID0[DPM] */
-@@ -603,6 +643,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750FX (All revs except 2.0) */
-@@ -615,6 +656,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750fx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 750GX */
-@@ -627,6 +669,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750fx,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 740/750 (L2CR bit need fixup for 740) */
-@@ -639,6 +682,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc750",
-       },
-       {       /* 7400 rev 1.1 ? (no TAU) */
-@@ -652,6 +696,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_7400,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7400",
-       },
-       {       /* 7400 */
-@@ -665,6 +710,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_7400,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7400",
-       },
-       {       /* 7410 */
-@@ -678,6 +724,7 @@ static struct cpu_spec __initdata cpu_sp
-               .dcache_bsize           = 32,
-               .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_7410,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7400",
-       },
-       {       /* 7450 2.0 - no doze/nap */
-@@ -693,6 +740,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7450 2.1 */
-@@ -708,6 +756,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7450 2.3 and newer */
-@@ -723,6 +772,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7455 rev 1.x */
-@@ -738,6 +788,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7455 rev 2.0 */
-@@ -753,6 +804,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7455 others */
-@@ -768,6 +820,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7447/7457 Rev 1.0 */
-@@ -783,6 +836,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7447/7457 Rev 1.1 */
-@@ -798,6 +852,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7447/7457 Rev 1.2 and later */
-@@ -812,6 +867,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7447A */
-@@ -827,6 +883,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 7448 */
-@@ -842,6 +899,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_745x,
-               .oprofile_cpu_type      = "ppc/7450",
-               .oprofile_type          = PPC_OPROFILE_G4,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc7450",
-       },
-       {       /* 82xx (8240, 8245, 8260 are all 603e cores) */
-@@ -853,6 +911,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* All G2_LE (603e core, plus some) have the same pvr */
-@@ -864,6 +923,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* e300c1 (a 603e core, plus some) on 83xx */
-@@ -875,6 +935,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
-       {       /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
-@@ -886,9 +947,10 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
--      {       /* e300c3 on 83xx  */
-+      {       /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
-               .pvr_mask               = 0x7fff0000,
-               .pvr_value              = 0x00850000,
-               .cpu_name               = "e300c3",
-@@ -899,6 +961,18 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_setup              = __setup_cpu_603,
-               .platform               = "ppc603",
-       },
-+      {       /* e300c4 (e300c1, plus one IU) */
-+              .pvr_mask               = 0x7fff0000,
-+              .pvr_value              = 0x00860000,
-+              .cpu_name               = "e300c4",
-+              .cpu_features           = CPU_FTRS_E300,
-+              .cpu_user_features      = COMMON_USER,
-+              .icache_bsize           = 32,
-+              .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_603,
-+              .machine_check          = machine_check_generic,
-+              .platform               = "ppc603",
-+      },
-       {       /* default match, we assume split I/D cache & TB (non-601)... */
-               .pvr_mask               = 0x00000000,
-               .pvr_value              = 0x00000000,
-@@ -907,6 +981,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_generic,
-               .platform               = "ppc603",
-       },
- #endif /* CLASSIC_PPC */
-@@ -933,6 +1008,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
-               .icache_bsize           = 16,
-               .dcache_bsize           = 16,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc403",
-       },
-       {       /* 403GCX */
-@@ -944,6 +1020,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB,
-               .icache_bsize           = 16,
-               .dcache_bsize           = 16,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc403",
-       },
-       {       /* 403G ?? */
-@@ -954,6 +1031,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
-               .icache_bsize           = 16,
-               .dcache_bsize           = 16,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc403",
-       },
-       {       /* 405GP */
-@@ -965,6 +1043,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* STB 03xxx */
-@@ -976,6 +1055,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* STB 04xxx */
-@@ -987,6 +1067,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* NP405L */
-@@ -998,6 +1079,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* NP4GS3 */
-@@ -1009,6 +1091,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {   /* NP405H */
-@@ -1020,6 +1103,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* 405GPr */
-@@ -1031,6 +1115,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {   /* STBx25xx */
-@@ -1042,6 +1127,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* 405LP */
-@@ -1052,6 +1138,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* Xilinx Virtex-II Pro  */
-@@ -1063,6 +1150,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* Xilinx Virtex-4 FX */
-@@ -1074,6 +1162,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* 405EP */
-@@ -1085,17 +1174,31 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-       {       /* 405EX */
--              .pvr_mask               = 0xffff0000,
--              .pvr_value              = 0x12910000,
-+              .pvr_mask               = 0xffff0004,
-+              .pvr_value              = 0x12910004,
-               .cpu_name               = "405EX",
-               .cpu_features           = CPU_FTRS_40X,
-               .cpu_user_features      = PPC_FEATURE_32 |
-                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-+              .platform               = "ppc405",
-+      },
-+      {       /* 405EXr */
-+              .pvr_mask               = 0xffff0004,
-+              .pvr_value              = 0x12910000,
-+              .cpu_name               = "405EXr",
-+              .cpu_features           = CPU_FTRS_40X,
-+              .cpu_user_features      = PPC_FEATURE_32 |
-+                      PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-+              .icache_bsize           = 32,
-+              .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc405",
-       },
-@@ -1109,6 +1212,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440",
-       },
-       { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
-@@ -1120,6 +1224,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_440ep,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440",
-       },
-       {
-@@ -1130,6 +1235,19 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-+              .platform               = "ppc440",
-+      },
-+      { /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */
-+              .pvr_mask               = 0xf0000ff7,
-+              .pvr_value              = 0x400008d4,
-+              .cpu_name               = "440EP Rev. C",
-+              .cpu_features           = CPU_FTRS_44X,
-+              .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
-+              .icache_bsize           = 32,
-+              .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440ep,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440",
-       },
-       { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
-@@ -1141,6 +1259,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_440ep,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440",
-       },
-       { /* 440GRX */
-@@ -1152,6 +1271,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_440grx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */
-@@ -1163,6 +1283,7 @@ static struct cpu_spec __initdata cpu_sp
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_440epx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       {       /* 440GP Rev. B */
-@@ -1173,6 +1294,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440gp",
-       },
-       {       /* 440GP Rev. C */
-@@ -1183,6 +1305,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440gp",
-       },
-       { /* 440GX Rev. A */
-@@ -1193,6 +1316,8 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440gx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* 440GX Rev. B */
-@@ -1203,6 +1328,8 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440gx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* 440GX Rev. C */
-@@ -1213,6 +1340,8 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440gx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* 440GX Rev. F */
-@@ -1223,6 +1352,8 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440gx,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* 440SP Rev. A */
-@@ -1233,6 +1364,7 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_4xx,
-               .platform               = "ppc440",
-       },
-       { /* 440SPe Rev. A */
-@@ -1243,6 +1375,8 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440spe,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
-       { /* 440SPe Rev. B */
-@@ -1253,10 +1387,13 @@ static struct cpu_spec __initdata cpu_sp
-               .cpu_user_features      = COMMON_USER_BOOKE,
-               .icache_bsize           = 32,
-               .dcache_bsize           = 32,
-+              .cpu_setup              = __setup_cpu_440spe,
-+              .machine_check          = machine_check_440A,
-               .platform               = "ppc440",
-       },
- #endif /* CONFIG_44x */
- #ifdef CONFIG_FSL_BOOKE
-+#ifdef CONFIG_E200
-       {       /* e200z5 */
-               .pvr_mask               = 0xfff00000,
-               .pvr_value              = 0x81000000,
-@@ -1267,6 +1404,7 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_EFP_SINGLE |
-                       PPC_FEATURE_UNIFIED_CACHE,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_e200,
-               .platform               = "ppc5554",
-       },
-       {       /* e200z6 */
-@@ -1280,8 +1418,10 @@ static struct cpu_spec __initdata cpu_sp
-                       PPC_FEATURE_HAS_EFP_SINGLE_COMP |
-                       PPC_FEATURE_UNIFIED_CACHE,
-               .dcache_bsize           = 32,
-+              .machine_check          = machine_check_e200,
-               .platform               = "ppc5554",
-       },
-+#elif defined(CONFIG_E500)
-       {       /* e500 */
-               .pvr_mask               = 0xffff0000,
-               .pvr_value              = 0x80200000,
-@@ -1296,6 +1436,7 @@ static struct cpu_spec __initdata cpu_sp
-               .num_pmcs               = 4,
-               .oprofile_cpu_type      = "ppc/e500",
-               .oprofile_type          = PPC_OPROFILE_BOOKE,
-+              .machine_check          = machine_check_e500,
-               .platform               = "ppc8540",
-       },
-       {       /* e500v2 */
-@@ -1313,9 +1454,11 @@ static struct cpu_spec __initdata cpu_sp
-               .num_pmcs               = 4,
-               .oprofile_cpu_type      = "ppc/e500",
-               .oprofile_type          = PPC_OPROFILE_BOOKE,
-+              .machine_check          = machine_check_e500,
-               .platform               = "ppc8548",
-       },
- #endif
-+#endif
- #if !CLASSIC_PPC
-       {       /* default match */
-               .pvr_mask               = 0x00000000,
---- a/arch/powerpc/kernel/crash.c
-+++ b/arch/powerpc/kernel/crash.c
-@@ -32,6 +32,8 @@
- #include <asm/lmb.h>
- #include <asm/firmware.h>
- #include <asm/smp.h>
-+#include <asm/system.h>
-+#include <asm/setjmp.h>
- #ifdef DEBUG
- #include <asm/udbg.h>
-@@ -45,6 +47,11 @@ int crashing_cpu = -1;
- static cpumask_t cpus_in_crash = CPU_MASK_NONE;
- cpumask_t cpus_in_sr = CPU_MASK_NONE;
-+#define CRASH_HANDLER_MAX 1
-+/* NULL terminated list of shutdown handles */
-+static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX+1];
-+static DEFINE_SPINLOCK(crash_handlers_lock);
-+
- #ifdef CONFIG_SMP
- static atomic_t enter_on_soft_reset = ATOMIC_INIT(0);
-@@ -285,9 +292,72 @@ static inline void crash_kexec_stop_spus
- }
- #endif /* CONFIG_SPU_BASE */
-+/*
-+ * Register a function to be called on shutdown.  Only use this if you
-+ * can't reset your device in the second kernel.
-+ */
-+int crash_shutdown_register(crash_shutdown_t handler)
-+{
-+      unsigned int i, rc;
-+
-+      spin_lock(&crash_handlers_lock);
-+      for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
-+              if (!crash_shutdown_handles[i]) {
-+                      /* Insert handle at first empty entry */
-+                      crash_shutdown_handles[i] = handler;
-+                      rc = 0;
-+                      break;
-+              }
-+
-+      if (i == CRASH_HANDLER_MAX) {
-+              printk(KERN_ERR "Crash shutdown handles full, "
-+                     "not registered.\n");
-+              rc = 1;
-+      }
-+
-+      spin_unlock(&crash_handlers_lock);
-+      return rc;
-+}
-+EXPORT_SYMBOL(crash_shutdown_register);
-+
-+int crash_shutdown_unregister(crash_shutdown_t handler)
-+{
-+      unsigned int i, rc;
-+
-+      spin_lock(&crash_handlers_lock);
-+      for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
-+              if (crash_shutdown_handles[i] == handler)
-+                      break;
-+
-+      if (i == CRASH_HANDLER_MAX) {
-+              printk(KERN_ERR "Crash shutdown handle not found\n");
-+              rc = 1;
-+      } else {
-+              /* Shift handles down */
-+              for (; crash_shutdown_handles[i]; i++)
-+                      crash_shutdown_handles[i] =
-+                              crash_shutdown_handles[i+1];
-+              rc = 0;
-+      }
-+
-+      spin_unlock(&crash_handlers_lock);
-+      return rc;
-+}
-+EXPORT_SYMBOL(crash_shutdown_unregister);
-+
-+static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
-+
-+static int handle_fault(struct pt_regs *regs)
-+{
-+      longjmp(crash_shutdown_buf, 1);
-+      return 0;
-+}
-+
- void default_machine_crash_shutdown(struct pt_regs *regs)
- {
--      unsigned int irq;
-+      unsigned int i;
-+      int (*old_handler)(struct pt_regs *regs);
-+
-       /*
-        * This function is only called after the system
-@@ -301,15 +371,36 @@ void default_machine_crash_shutdown(stru
-        */
-       hard_irq_disable();
--      for_each_irq(irq) {
--              struct irq_desc *desc = irq_desc + irq;
-+      for_each_irq(i) {
-+              struct irq_desc *desc = irq_desc + i;
-               if (desc->status & IRQ_INPROGRESS)
--                      desc->chip->eoi(irq);
-+                      desc->chip->eoi(i);
-               if (!(desc->status & IRQ_DISABLED))
--                      desc->chip->disable(irq);
-+                      desc->chip->disable(i);
-+      }
-+
-+      /*
-+       * Call registered shutdown routines savely.  Swap out
-+       * __debugger_fault_handler, and replace on exit.
-+       */
-+      old_handler = __debugger_fault_handler;
-+      __debugger_fault_handler = handle_fault;
-+      for (i = 0; crash_shutdown_handles[i]; i++) {
-+              if (setjmp(crash_shutdown_buf) == 0) {
-+                      /*
-+                       * Insert syncs and delay to ensure
-+                       * instructions in the dangerous region don't
-+                       * leak away from this protected region.
-+                       */
-+                      asm volatile("sync; isync");
-+                      /* dangerous region */
-+                      crash_shutdown_handles[i]();
-+                      asm volatile("sync; isync");
-+              }
-       }
-+      __debugger_fault_handler = old_handler;
-       /*
-        * Make a note of crashing cpu. Will be used in machine_kexec
---- a/arch/powerpc/kernel/dma_64.c
-+++ b/arch/powerpc/kernel/dma_64.c
-@@ -112,10 +112,16 @@ EXPORT_SYMBOL(dma_iommu_ops);
- /*
-  * Generic direct DMA implementation
-  *
-- * This implementation supports a global offset that can be applied if
-- * the address at which memory is visible to devices is not 0.
-+ * This implementation supports a per-device offset that can be applied if
-+ * the address at which memory is visible to devices is not 0. Platform code
-+ * can set archdata.dma_data to an unsigned long holding the offset. By
-+ * default the offset is zero.
-  */
--unsigned long dma_direct_offset;
-+
-+static unsigned long get_dma_direct_offset(struct device *dev)
-+{
-+      return (unsigned long)dev->archdata.dma_data;
-+}
- static void *dma_direct_alloc_coherent(struct device *dev, size_t size,
-                                      dma_addr_t *dma_handle, gfp_t flag)
-@@ -124,13 +130,12 @@ static void *dma_direct_alloc_coherent(s
-       void *ret;
-       int node = dev->archdata.numa_node;
--      /* TODO: Maybe use the numa node here too ? */
-       page = alloc_pages_node(node, flag, get_order(size));
-       if (page == NULL)
-               return NULL;
-       ret = page_address(page);
-       memset(ret, 0, size);
--      *dma_handle = virt_to_abs(ret) | dma_direct_offset;
-+      *dma_handle = virt_to_abs(ret) + get_dma_direct_offset(dev);
-       return ret;
- }
-@@ -145,7 +150,7 @@ static dma_addr_t dma_direct_map_single(
-                                       size_t size,
-                                       enum dma_data_direction direction)
- {
--      return virt_to_abs(ptr) | dma_direct_offset;
-+      return virt_to_abs(ptr) + get_dma_direct_offset(dev);
- }
- static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr,
-@@ -161,7 +166,7 @@ static int dma_direct_map_sg(struct devi
-       int i;
-       for_each_sg(sgl, sg, nents, i) {
--              sg->dma_address = sg_phys(sg) | dma_direct_offset;
-+              sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev);
-               sg->dma_length = sg->length;
-       }
---- a/arch/powerpc/kernel/head_44x.S
-+++ b/arch/powerpc/kernel/head_44x.S
-@@ -289,11 +289,8 @@ interrupt_base:
-       CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
-       /* Machine Check Interrupt */
--#ifdef CONFIG_440A
--      MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
--#else
-       CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
--#endif
-+      MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception)
-       /* Data Storage Interrupt */
-       START_EXCEPTION(DataStorage)
-@@ -674,6 +671,15 @@ finish_tlb_load:
-  */
- /*
-+ * Adjust the machine check IVOR on 440A cores
-+ */
-+_GLOBAL(__fixup_440A_mcheck)
-+      li      r3,MachineCheckA@l
-+      mtspr   SPRN_IVOR1,r3
-+      sync
-+      blr
-+
-+/*
-  * extern void giveup_altivec(struct task_struct *prev)
-  *
-  * The 44x core does not have an AltiVec unit.
---- a/arch/powerpc/kernel/head_booke.h
-+++ b/arch/powerpc/kernel/head_booke.h
-@@ -166,7 +166,7 @@ label:
-       mfspr   r5,SPRN_ESR;                                    \
-       stw     r5,_ESR(r11);                                   \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
--      EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
-+      EXC_XFER_TEMPLATE(hdlr, n+4, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
-                         NOCOPY, mcheck_transfer_to_handler,   \
-                         ret_from_mcheck_exc)
---- a/arch/powerpc/kernel/head_fsl_booke.S
-+++ b/arch/powerpc/kernel/head_fsl_booke.S
-@@ -73,8 +73,8 @@ _ENTRY(_start);
- /* We try to not make any assumptions about how the boot loader
-  * setup or used the TLBs.  We invalidate all mappings from the
-  * boot loader and load a single entry in TLB1[0] to map the
-- * first 16M of kernel memory.  Any boot info passed from the
-- * bootloader needs to live in this first 16M.
-+ * first 64M of kernel memory.  Any boot info passed from the
-+ * bootloader needs to live in this first 64M.
-  *
-  * Requirement on bootloader:
-  *  - The page we're executing in needs to reside in TLB1 and
-@@ -167,7 +167,7 @@ skpinv:    addi    r6,r6,1                         /* Increment */
-       mtspr   SPRN_MAS0,r7
-       tlbre
--      /* Just modify the entry ID and EPN for the temp mapping */
-+      /* Just modify the entry ID, EPN and RPN for the temp mapping */
-       lis     r7,0x1000       /* Set MAS0(TLBSEL) = 1 */
-       rlwimi  r7,r5,16,4,15   /* Setup MAS0 = TLBSEL | ESEL(r5) */
-       mtspr   SPRN_MAS0,r7
-@@ -177,9 +177,12 @@ skpinv:   addi    r6,r6,1                         /* Increment */
-       ori     r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_4K))@l
-       mtspr   SPRN_MAS1,r6
-       mfspr   r6,SPRN_MAS2
--      li      r7,0            /* temp EPN = 0 */
-+      lis     r7,PHYSICAL_START@h
-       rlwimi  r7,r6,0,20,31
-       mtspr   SPRN_MAS2,r7
-+      mfspr   r6,SPRN_MAS3
-+      rlwimi  r7,r6,0,20,31
-+      mtspr   SPRN_MAS3,r7
-       tlbwe
-       xori    r6,r4,1
-@@ -222,11 +225,11 @@ skpinv:  addi    r6,r6,1                         /* Increment */
-       lis     r6,0x1000               /* Set MAS0(TLBSEL) = TLB1(1), ESEL = 0 */
-       mtspr   SPRN_MAS0,r6
-       lis     r6,(MAS1_VALID|MAS1_IPROT)@h
--      ori     r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_16M))@l
-+      ori     r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_64M))@l
-       mtspr   SPRN_MAS1,r6
-       li      r7,0
--      lis     r6,KERNELBASE@h
--      ori     r6,r6,KERNELBASE@l
-+      lis     r6,PAGE_OFFSET@h
-+      ori     r6,r6,PAGE_OFFSET@l
-       rlwimi  r6,r7,0,20,31
-       mtspr   SPRN_MAS2,r6
-       li      r7,(MAS3_SX|MAS3_SW|MAS3_SR)
-@@ -234,6 +237,9 @@ skpinv:    addi    r6,r6,1                         /* Increment */
-       tlbwe
- /* 7. Jump to KERNELBASE mapping */
-+      lis     r6,KERNELBASE@h
-+      ori     r6,r6,KERNELBASE@l
-+      rlwimi  r6,r7,0,20,31
-       lis     r7,MSR_KERNEL@h
-       ori     r7,r7,MSR_KERNEL@l
-       bl      1f                      /* Find our address */
---- a/arch/powerpc/kernel/ibmebus.c
-+++ b/arch/powerpc/kernel/ibmebus.c
-@@ -41,6 +41,7 @@
- #include <linux/kobject.h>
- #include <linux/dma-mapping.h>
- #include <linux/interrupt.h>
-+#include <linux/of.h>
- #include <linux/of_platform.h>
- #include <asm/ibmebus.h>
- #include <asm/abs_addr.h>
-@@ -52,7 +53,7 @@ static struct device ibmebus_bus_device 
- struct bus_type ibmebus_bus_type;
- /* These devices will automatically be added to the bus during init */
--static struct of_device_id builtin_matches[] = {
-+static struct of_device_id __initdata builtin_matches[] = {
-       { .compatible = "IBM,lhca" },
-       { .compatible = "IBM,lhea" },
-       {},
-@@ -171,7 +172,7 @@ static int ibmebus_create_devices(const 
-       root = of_find_node_by_path("/");
--      for (child = NULL; (child = of_get_next_child(root, child)); ) {
-+      for_each_child_of_node(root, child) {
-               if (!of_match_node(matches, child))
-                       continue;
-@@ -197,16 +198,13 @@ int ibmebus_register_driver(struct of_pl
-       /* If the driver uses devices that ibmebus doesn't know, add them */
-       ibmebus_create_devices(drv->match_table);
--      drv->driver.name   = drv->name;
--      drv->driver.bus    = &ibmebus_bus_type;
--
--      return driver_register(&drv->driver);
-+      return of_register_driver(drv, &ibmebus_bus_type);
- }
- EXPORT_SYMBOL(ibmebus_register_driver);
- void ibmebus_unregister_driver(struct of_platform_driver *drv)
- {
--      driver_unregister(&drv->driver);
-+      of_unregister_driver(drv);
- }
- EXPORT_SYMBOL(ibmebus_unregister_driver);
---- a/arch/powerpc/kernel/iommu.c
-+++ b/arch/powerpc/kernel/iommu.c
-@@ -532,16 +532,14 @@ struct iommu_table *iommu_init_table(str
-       return tbl;
- }
--void iommu_free_table(struct device_node *dn)
-+void iommu_free_table(struct iommu_table *tbl, const char *node_name)
- {
--      struct pci_dn *pdn = dn->data;
--      struct iommu_table *tbl = pdn->iommu_table;
-       unsigned long bitmap_sz, i;
-       unsigned int order;
-       if (!tbl || !tbl->it_map) {
-               printk(KERN_ERR "%s: expected TCE map for %s\n", __FUNCTION__,
--                              dn->full_name);
-+                              node_name);
-               return;
-       }
-@@ -550,7 +548,7 @@ void iommu_free_table(struct device_node
-       for (i = 0; i < (tbl->it_size/64); i++) {
-               if (tbl->it_map[i] != 0) {
-                       printk(KERN_WARNING "%s: Unexpected TCEs for %s\n",
--                              __FUNCTION__, dn->full_name);
-+                              __FUNCTION__, node_name);
-                       break;
-               }
-       }
---- a/arch/powerpc/kernel/isa-bridge.c
-+++ b/arch/powerpc/kernel/isa-bridge.c
-@@ -108,7 +108,7 @@ static void __devinit pci_process_ISA_OF
-       if (size > 0x10000)
-               size = 0x10000;
--      printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
-+      printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
-              "mapping 64k\n");
-       __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
-@@ -116,7 +116,7 @@ static void __devinit pci_process_ISA_OF
-       return;
- inval_range:
--      printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
-+      printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
-              "mapping 64k\n");
-       __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
-                    0x10000, _PAGE_NO_CACHE|_PAGE_GUARDED);
-@@ -145,7 +145,7 @@ void __init isa_bridge_find_early(struct
-       for_each_node_by_type(np, "isa") {
-               /* Look for our hose being a parent */
-               for (parent = of_get_parent(np); parent;) {
--                      if (parent == hose->arch_data) {
-+                      if (parent == hose->dn) {
-                               of_node_put(parent);
-                               break;
-                       }
---- a/arch/powerpc/kernel/legacy_serial.c
-+++ b/arch/powerpc/kernel/legacy_serial.c
-@@ -307,7 +307,7 @@ void __init find_legacy_serial_ports(voi
-       }
-       /* First fill our array with SOC ports */
--      for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+      for_each_compatible_node(np, "serial", "ns16550") {
-               struct device_node *soc = of_get_parent(np);
-               if (soc && !strcmp(soc->type, "soc")) {
-                       index = add_legacy_soc_port(np, np);
-@@ -318,7 +318,7 @@ void __init find_legacy_serial_ports(voi
-       }
-       /* First fill our array with ISA ports */
--      for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
-+      for_each_node_by_type(np, "serial") {
-               struct device_node *isa = of_get_parent(np);
-               if (isa && !strcmp(isa->name, "isa")) {
-                       index = add_legacy_isa_port(np, isa);
-@@ -329,7 +329,7 @@ void __init find_legacy_serial_ports(voi
-       }
-       /* First fill our array with tsi-bridge ports */
--      for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+      for_each_compatible_node(np, "serial", "ns16550") {
-               struct device_node *tsi = of_get_parent(np);
-               if (tsi && !strcmp(tsi->type, "tsi-bridge")) {
-                       index = add_legacy_soc_port(np, np);
-@@ -340,7 +340,7 @@ void __init find_legacy_serial_ports(voi
-       }
-       /* First fill our array with opb bus ports */
--      for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+      for_each_compatible_node(np, "serial", "ns16550") {
-               struct device_node *opb = of_get_parent(np);
-               if (opb && (!strcmp(opb->type, "opb") ||
-                           of_device_is_compatible(opb, "ibm,opb"))) {
-@@ -474,7 +474,7 @@ static int __init serial_dev_init(void)
-       /*
-        * Before we register the platfrom serial devices, we need
--       * to fixup their interrutps and their IO ports.
-+       * to fixup their interrupts and their IO ports.
-        */
-       DBG("Fixing serial ports interrupts and IO ports ...\n");
---- a/arch/powerpc/kernel/lparcfg.c
-+++ b/arch/powerpc/kernel/lparcfg.c
-@@ -41,7 +41,6 @@
- /* #define LPARCFG_DEBUG */
- static struct proc_dir_entry *proc_ppc64_lparcfg;
--#define LPARCFG_BUFF_SIZE 4096
- /*
-  * Track sum of all purrs across all processors. This is used to further
-@@ -595,13 +594,6 @@ int __init lparcfg_init(void)
-       ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
-       if (ent) {
-               ent->proc_fops = &lparcfg_fops;
--              ent->data = kmalloc(LPARCFG_BUFF_SIZE, GFP_KERNEL);
--              if (!ent->data) {
--                      printk(KERN_ERR
--                             "Failed to allocate buffer for lparcfg\n");
--                      remove_proc_entry("lparcfg", ent->parent);
--                      return -ENOMEM;
--              }
-       } else {
-               printk(KERN_ERR "Failed to create ppc64/lparcfg\n");
-               return -EIO;
-@@ -613,10 +605,8 @@ int __init lparcfg_init(void)
- void __exit lparcfg_cleanup(void)
- {
--      if (proc_ppc64_lparcfg) {
--              kfree(proc_ppc64_lparcfg->data);
-+      if (proc_ppc64_lparcfg)
-               remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent);
--      }
- }
- module_init(lparcfg_init);
---- a/arch/powerpc/kernel/misc.S
-+++ b/arch/powerpc/kernel/misc.S
-@@ -8,12 +8,17 @@
-  * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
-  * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
-  *
-+ * setjmp/longjmp code by Paul Mackerras.
-+ *
-  * This program is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU General Public License
-  * as published by the Free Software Foundation; either version
-  * 2 of the License, or (at your option) any later version.
-  */
- #include <asm/ppc_asm.h>
-+#include <asm/unistd.h>
-+#include <asm/asm-compat.h>
-+#include <asm/asm-offsets.h>
-       .text
-@@ -43,3 +48,71 @@ _GLOBAL(add_reloc_offset)
-       add     r3,r3,r5
-       mtlr    r0
-       blr
-+
-+_GLOBAL(kernel_execve)
-+      li      r0,__NR_execve
-+      sc
-+      bnslr
-+      neg     r3,r3
-+      blr
-+
-+_GLOBAL(setjmp)
-+      mflr    r0
-+      PPC_STL r0,0(r3)
-+      PPC_STL r1,SZL(r3)
-+      PPC_STL r2,2*SZL(r3)
-+      mfcr    r0
-+      PPC_STL r0,3*SZL(r3)
-+      PPC_STL r13,4*SZL(r3)
-+      PPC_STL r14,5*SZL(r3)
-+      PPC_STL r15,6*SZL(r3)
-+      PPC_STL r16,7*SZL(r3)
-+      PPC_STL r17,8*SZL(r3)
-+      PPC_STL r18,9*SZL(r3)
-+      PPC_STL r19,10*SZL(r3)
-+      PPC_STL r20,11*SZL(r3)
-+      PPC_STL r21,12*SZL(r3)
-+      PPC_STL r22,13*SZL(r3)
-+      PPC_STL r23,14*SZL(r3)
-+      PPC_STL r24,15*SZL(r3)
-+      PPC_STL r25,16*SZL(r3)
-+      PPC_STL r26,17*SZL(r3)
-+      PPC_STL r27,18*SZL(r3)
-+      PPC_STL r28,19*SZL(r3)
-+      PPC_STL r29,20*SZL(r3)
-+      PPC_STL r30,21*SZL(r3)
-+      PPC_STL r31,22*SZL(r3)
-+      li      r3,0
-+      blr
-+
-+_GLOBAL(longjmp)
-+      PPC_LCMPI r4,0
-+      bne     1f
-+      li      r4,1
-+1:    PPC_LL  r13,4*SZL(r3)
-+      PPC_LL  r14,5*SZL(r3)
-+      PPC_LL  r15,6*SZL(r3)
-+      PPC_LL  r16,7*SZL(r3)
-+      PPC_LL  r17,8*SZL(r3)
-+      PPC_LL  r18,9*SZL(r3)
-+      PPC_LL  r19,10*SZL(r3)
-+      PPC_LL  r20,11*SZL(r3)
-+      PPC_LL  r21,12*SZL(r3)
-+      PPC_LL  r22,13*SZL(r3)
-+      PPC_LL  r23,14*SZL(r3)
-+      PPC_LL  r24,15*SZL(r3)
-+      PPC_LL  r25,16*SZL(r3)
-+      PPC_LL  r26,17*SZL(r3)
-+      PPC_LL  r27,18*SZL(r3)
-+      PPC_LL  r28,19*SZL(r3)
-+      PPC_LL  r29,20*SZL(r3)
-+      PPC_LL  r30,21*SZL(r3)
-+      PPC_LL  r31,22*SZL(r3)
-+      PPC_LL  r0,3*SZL(r3)
-+      mtcrf   0x38,r0
-+      PPC_LL  r0,0(r3)
-+      PPC_LL  r1,SZL(r3)
-+      PPC_LL  r2,2*SZL(r3)
-+      mtlr    r0
-+      mr      r3,r4
-+      blr
---- a/arch/powerpc/kernel/misc_32.S
-+++ b/arch/powerpc/kernel/misc_32.S
-@@ -206,6 +206,45 @@ _GLOBAL(_nmask_and_or_msr)
-       isync
-       blr                     /* Done */
-+#ifdef CONFIG_40x
-+
-+/*
-+ * Do an IO access in real mode
-+ */
-+_GLOBAL(real_readb)
-+      mfmsr   r7
-+      ori     r0,r7,MSR_DR
-+      xori    r0,r0,MSR_DR
-+      sync
-+      mtmsr   r0
-+      sync
-+      isync
-+      lbz     r3,0(r3)
-+      sync
-+      mtmsr   r7
-+      sync
-+      isync
-+      blr
-+
-+      /*
-+ * Do an IO access in real mode
-+ */
-+_GLOBAL(real_writeb)
-+      mfmsr   r7
-+      ori     r0,r7,MSR_DR
-+      xori    r0,r0,MSR_DR
-+      sync
-+      mtmsr   r0
-+      sync
-+      isync
-+      stb     r3,0(r4)
-+      sync
-+      mtmsr   r7
-+      sync
-+      isync
-+      blr
-+
-+#endif /* CONFIG_40x */
- /*
-  * Flush MMU TLB
-@@ -793,13 +832,6 @@ _GLOBAL(kernel_thread)
-       addi    r1,r1,16
-       blr
--_GLOBAL(kernel_execve)
--      li      r0,__NR_execve
--      sc
--      bnslr
--      neg     r3,r3
--      blr
--
- /*
-  * This routine is just here to keep GCC happy - sigh...
-  */
---- a/arch/powerpc/kernel/misc_64.S
-+++ b/arch/powerpc/kernel/misc_64.S
-@@ -518,13 +518,6 @@ _GLOBAL(giveup_altivec)
- #endif /* CONFIG_ALTIVEC */
--_GLOBAL(kernel_execve)
--      li      r0,__NR_execve
--      sc
--      bnslr
--      neg     r3,r3
--      blr
--
- /* kexec_wait(phys_cpu)
-  *
-  * wait for the flag to change, indicating this kernel is going away but
---- a/arch/powerpc/kernel/module_32.c
-+++ b/arch/powerpc/kernel/module_32.c
-@@ -24,6 +24,7 @@
- #include <linux/kernel.h>
- #include <linux/cache.h>
- #include <linux/bug.h>
-+#include <linux/sort.h>
- #include "setup.h"
-@@ -54,22 +55,60 @@ void module_free(struct module *mod, voi
-    addend) */
- static unsigned int count_relocs(const Elf32_Rela *rela, unsigned int num)
- {
--      unsigned int i, j, ret = 0;
-+      unsigned int i, r_info, r_addend, _count_relocs;
--      /* Sure, this is order(n^2), but it's usually short, and not
--           time critical */
--      for (i = 0; i < num; i++) {
--              for (j = 0; j < i; j++) {
--                      /* If this addend appeared before, it's
--                           already been counted */
--                      if (ELF32_R_SYM(rela[i].r_info)
--                          == ELF32_R_SYM(rela[j].r_info)
--                          && rela[i].r_addend == rela[j].r_addend)
--                              break;
-+      _count_relocs = 0;
-+      r_info = 0;
-+      r_addend = 0;
-+      for (i = 0; i < num; i++)
-+              /* Only count 24-bit relocs, others don't need stubs */
-+              if (ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
-+                  (r_info != ELF32_R_SYM(rela[i].r_info) ||
-+                   r_addend != rela[i].r_addend)) {
-+                      _count_relocs++;
-+                      r_info = ELF32_R_SYM(rela[i].r_info);
-+                      r_addend = rela[i].r_addend;
-               }
--              if (j == i) ret++;
-+
-+      return _count_relocs;
-+}
-+
-+static int relacmp(const void *_x, const void *_y)
-+{
-+      const Elf32_Rela *x, *y;
-+
-+      y = (Elf32_Rela *)_x;
-+      x = (Elf32_Rela *)_y;
-+
-+      /* Compare the entire r_info (as opposed to ELF32_R_SYM(r_info) only) to
-+       * make the comparison cheaper/faster. It won't affect the sorting or
-+       * the counting algorithms' performance
-+       */
-+      if (x->r_info < y->r_info)
-+              return -1;
-+      else if (x->r_info > y->r_info)
-+              return 1;
-+      else if (x->r_addend < y->r_addend)
-+              return -1;
-+      else if (x->r_addend > y->r_addend)
-+              return 1;
-+      else
-+              return 0;
-+}
-+
-+static void relaswap(void *_x, void *_y, int size)
-+{
-+      uint32_t *x, *y, tmp;
-+      int i;
-+
-+      y = (uint32_t *)_x;
-+      x = (uint32_t *)_y;
-+
-+      for (i = 0; i < sizeof(Elf32_Rela) / sizeof(uint32_t); i++) {
-+              tmp = x[i];
-+              x[i] = y[i];
-+              y[i] = tmp;
-       }
--      return ret;
- }
- /* Get the potential trampolines size required of the init and
-@@ -100,6 +139,16 @@ static unsigned long get_plt_size(const 
-                       DEBUGP("Ptr: %p.  Number: %u\n",
-                              (void *)hdr + sechdrs[i].sh_offset,
-                              sechdrs[i].sh_size / sizeof(Elf32_Rela));
-+
-+                      /* Sort the relocation information based on a symbol and
-+                       * addend key. This is a stable O(n*log n) complexity
-+                       * alogrithm but it will reduce the complexity of
-+                       * count_relocs() to linear complexity O(n)
-+                       */
-+                      sort((void *)hdr + sechdrs[i].sh_offset,
-+                           sechdrs[i].sh_size / sizeof(Elf32_Rela),
-+                           sizeof(Elf32_Rela), relacmp, relaswap);
-+
-                       ret += count_relocs((void *)hdr
-                                            + sechdrs[i].sh_offset,
-                                            sechdrs[i].sh_size
---- a/arch/powerpc/kernel/module_64.c
-+++ b/arch/powerpc/kernel/module_64.c
-@@ -24,6 +24,7 @@
- #include <asm/module.h>
- #include <asm/uaccess.h>
- #include <asm/firmware.h>
-+#include <linux/sort.h>
- #include "setup.h"
-@@ -81,25 +82,23 @@ static struct ppc64_stub_entry ppc64_stu
-    different addend) */
- static unsigned int count_relocs(const Elf64_Rela *rela, unsigned int num)
- {
--      unsigned int i, j, ret = 0;
-+      unsigned int i, r_info, r_addend, _count_relocs;
-       /* FIXME: Only count external ones --RR */
--      /* Sure, this is order(n^2), but it's usually short, and not
--           time critical */
--      for (i = 0; i < num; i++) {
-+      _count_relocs = 0;
-+      r_info = 0;
-+      r_addend = 0;
-+      for (i = 0; i < num; i++)
-               /* Only count 24-bit relocs, others don't need stubs */
--              if (ELF64_R_TYPE(rela[i].r_info) != R_PPC_REL24)
--                      continue;
--              for (j = 0; j < i; j++) {
--                      /* If this addend appeared before, it's
--                           already been counted */
--                      if (rela[i].r_info == rela[j].r_info
--                          && rela[i].r_addend == rela[j].r_addend)
--                              break;
-+              if (ELF64_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
-+                  (r_info != ELF64_R_SYM(rela[i].r_info) ||
-+                   r_addend != rela[i].r_addend)) {
-+                      _count_relocs++;
-+                      r_info = ELF64_R_SYM(rela[i].r_info);
-+                      r_addend = rela[i].r_addend;
-               }
--              if (j == i) ret++;
--      }
--      return ret;
-+
-+      return _count_relocs;
- }
- void *module_alloc(unsigned long size)
-@@ -118,6 +117,44 @@ void module_free(struct module *mod, voi
-            table entries. */
- }
-+static int relacmp(const void *_x, const void *_y)
-+{
-+      const Elf64_Rela *x, *y;
-+
-+      y = (Elf64_Rela *)_x;
-+      x = (Elf64_Rela *)_y;
-+
-+      /* Compare the entire r_info (as opposed to ELF64_R_SYM(r_info) only) to
-+       * make the comparison cheaper/faster. It won't affect the sorting or
-+       * the counting algorithms' performance
-+       */
-+      if (x->r_info < y->r_info)
-+              return -1;
-+      else if (x->r_info > y->r_info)
-+              return 1;
-+      else if (x->r_addend < y->r_addend)
-+              return -1;
-+      else if (x->r_addend > y->r_addend)
-+              return 1;
-+      else
-+              return 0;
-+}
-+
-+static void relaswap(void *_x, void *_y, int size)
-+{
-+      uint64_t *x, *y, tmp;
-+      int i;
-+
-+      y = (uint64_t *)_x;
-+      x = (uint64_t *)_y;
-+
-+      for (i = 0; i < sizeof(Elf64_Rela) / sizeof(uint64_t); i++) {
-+              tmp = x[i];
-+              x[i] = y[i];
-+              y[i] = tmp;
-+      }
-+}
-+
- /* Get size of potential trampolines required. */
- static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
-                                   const Elf64_Shdr *sechdrs)
-@@ -133,6 +170,16 @@ static unsigned long get_stubs_size(cons
-                       DEBUGP("Ptr: %p.  Number: %lu\n",
-                              (void *)sechdrs[i].sh_addr,
-                              sechdrs[i].sh_size / sizeof(Elf64_Rela));
-+
-+                      /* Sort the relocation information based on a symbol and
-+                       * addend key. This is a stable O(n*log n) complexity
-+                       * alogrithm but it will reduce the complexity of
-+                       * count_relocs() to linear complexity O(n)
-+                       */
-+                      sort((void *)sechdrs[i].sh_addr,
-+                           sechdrs[i].sh_size / sizeof(Elf64_Rela),
-+                           sizeof(Elf64_Rela), relacmp, relaswap);
-+
-                       relocs += count_relocs((void *)sechdrs[i].sh_addr,
-                                              sechdrs[i].sh_size
-                                              / sizeof(Elf64_Rela));
-@@ -343,7 +390,7 @@ int apply_relocate_add(Elf64_Shdr *sechd
-                       /* Simply set it */
-                       *(u32 *)location = value;
-                       break;
--                      
-+
-               case R_PPC64_ADDR64:
-                       /* Simply set it */
-                       *(unsigned long *)location = value;
-@@ -399,7 +446,7 @@ int apply_relocate_add(Elf64_Shdr *sechd
-                       }
-                       /* Only replace bits 2 through 26 */
--                      *(uint32_t *)location 
-+                      *(uint32_t *)location
-                               = (*(uint32_t *)location & ~0x03fffffc)
-                               | (value & 0x03fffffc);
-                       break;
---- a/arch/powerpc/kernel/of_device.c
-+++ b/arch/powerpc/kernel/of_device.c
-@@ -5,10 +5,10 @@
- #include <linux/module.h>
- #include <linux/mod_devicetable.h>
- #include <linux/slab.h>
-+#include <linux/of_device.h>
- #include <asm/errno.h>
- #include <asm/dcr.h>
--#include <asm/of_device.h>
- static void of_device_make_bus_id(struct of_device *dev)
- {
---- a/arch/powerpc/kernel/of_platform.c
-+++ b/arch/powerpc/kernel/of_platform.c
-@@ -19,6 +19,7 @@
- #include <linux/mod_devicetable.h>
- #include <linux/slab.h>
- #include <linux/pci.h>
-+#include <linux/of.h>
- #include <linux/of_device.h>
- #include <linux/of_platform.h>
-@@ -40,7 +41,7 @@
-  * a bus type in the list
-  */
--static struct of_device_id of_default_bus_ids[] = {
-+static const struct of_device_id of_default_bus_ids[] = {
-       { .type = "soc", },
-       { .compatible = "soc", },
-       { .type = "spider", },
-@@ -64,26 +65,6 @@ static int __init of_bus_driver_init(voi
- postcore_initcall(of_bus_driver_init);
--int of_register_platform_driver(struct of_platform_driver *drv)
--{
--      /* initialize common driver fields */
--      if (!drv->driver.name)
--              drv->driver.name = drv->name;
--      if (!drv->driver.owner)
--              drv->driver.owner = drv->owner;
--      drv->driver.bus = &of_platform_bus_type;
--
--      /* register with core */
--      return driver_register(&drv->driver);
--}
--EXPORT_SYMBOL(of_register_platform_driver);
--
--void of_unregister_platform_driver(struct of_platform_driver *drv)
--{
--      driver_unregister(&drv->driver);
--}
--EXPORT_SYMBOL(of_unregister_platform_driver);
--
- struct of_device* of_platform_device_create(struct device_node *np,
-                                           const char *bus_id,
-                                           struct device *parent)
-@@ -120,15 +101,15 @@ EXPORT_SYMBOL(of_platform_device_create)
-  * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
-  * disallow recursive creation of child busses
-  */
--static int of_platform_bus_create(struct device_node *bus,
--                                struct of_device_id *matches,
-+static int of_platform_bus_create(const struct device_node *bus,
-+                                const struct of_device_id *matches,
-                                 struct device *parent)
- {
-       struct device_node *child;
-       struct of_device *dev;
-       int rc = 0;
--      for (child = NULL; (child = of_get_next_child(bus, child)); ) {
-+      for_each_child_of_node(bus, child) {
-               pr_debug("   create child: %s\n", child->full_name);
-               dev = of_platform_device_create(child, NULL, parent);
-               if (dev == NULL)
-@@ -157,7 +138,7 @@ static int of_platform_bus_create(struct
-  */
- int of_platform_bus_probe(struct device_node *root,
--                        struct of_device_id *matches,
-+                        const struct of_device_id *matches,
-                         struct device *parent)
- {
-       struct device_node *child;
-@@ -190,7 +171,7 @@ int of_platform_bus_probe(struct device_
-               rc = of_platform_bus_create(root, matches, &dev->dev);
-               goto bail;
-       }
--      for (child = NULL; (child = of_get_next_child(root, child)); ) {
-+      for_each_child_of_node(root, child) {
-               if (!of_match_node(matches, child))
-                       continue;
---- a/arch/powerpc/kernel/pci-common.c
-+++ b/arch/powerpc/kernel/pci-common.c
-@@ -48,32 +48,26 @@
- static DEFINE_SPINLOCK(hose_spinlock);
- /* XXX kill that some day ... */
--int global_phb_number;                /* Global phb counter */
-+static int global_phb_number;         /* Global phb counter */
--extern struct list_head hose_list;
-+/* ISA Memory physical address */
-+resource_size_t isa_mem_base;
--/*
-- * pci_controller(phb) initialized common variables.
-- */
--static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
--{
--      memset(hose, 0, sizeof(struct pci_controller));
--
--      spin_lock(&hose_spinlock);
--      hose->global_number = global_phb_number++;
--      list_add_tail(&hose->list_node, &hose_list);
--      spin_unlock(&hose_spinlock);
--}
-+/* Default PCI flags is 0 */
-+unsigned int ppc_pci_flags;
--struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
-+struct pci_controller *pcibios_alloc_controller(struct device_node *dev)
- {
-       struct pci_controller *phb;
--      phb = alloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
-+      phb = zalloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
-       if (phb == NULL)
-               return NULL;
--      pci_setup_pci_controller(phb);
--      phb->arch_data = dev;
-+      spin_lock(&hose_spinlock);
-+      phb->global_number = global_phb_number++;
-+      list_add_tail(&phb->list_node, &hose_list);
-+      spin_unlock(&hose_spinlock);
-+      phb->dn = dev;
-       phb->is_dynamic = mem_init_done;
- #ifdef CONFIG_PPC64
-       if (dev) {
-@@ -126,15 +120,10 @@ int pcibios_vaddr_is_ioport(void __iomem
-  */
- int pci_domain_nr(struct pci_bus *bus)
- {
--      if (firmware_has_feature(FW_FEATURE_ISERIES))
--              return 0;
--      else {
--              struct pci_controller *hose = pci_bus_to_host(bus);
-+      struct pci_controller *hose = pci_bus_to_host(bus);
--              return hose->global_number;
--      }
-+      return hose->global_number;
- }
--
- EXPORT_SYMBOL(pci_domain_nr);
- #ifdef CONFIG_PPC_OF
-@@ -153,7 +142,7 @@ struct pci_controller* pci_find_hose_for
-       while(node) {
-               struct pci_controller *hose, *tmp;
-               list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
--                      if (hose->arch_data == node)
-+                      if (hose->dn == node)
-                               return hose;
-               node = node->parent;
-       }
-@@ -201,6 +190,20 @@ int pci_read_irq_line(struct pci_dev *pc
-       struct of_irq oirq;
-       unsigned int virq;
-+      /* The current device-tree that iSeries generates from the HV
-+       * PCI informations doesn't contain proper interrupt routing,
-+       * and all the fallback would do is print out crap, so we
-+       * don't attempt to resolve the interrupts here at all, some
-+       * iSeries specific fixup does it.
-+       *
-+       * In the long run, we will hopefully fix the generated device-tree
-+       * instead.
-+       */
-+#ifdef CONFIG_PPC_ISERIES
-+      if (firmware_has_feature(FW_FEATURE_ISERIES))
-+              return -1;
-+#endif
-+
-       DBG("Try to map irq for %s...\n", pci_name(pci_dev));
- #ifdef DEBUG
-@@ -222,10 +225,11 @@ int pci_read_irq_line(struct pci_dev *pc
-               if (pin == 0)
-                       return -1;
-               if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) ||
--                  line == 0xff) {
-+                  line == 0xff || line == 0) {
-                       return -1;
-               }
--              DBG(" -> no map ! Using irq line %d from PCI config\n", line);
-+              DBG(" -> no map ! Using line %d (pin %d) from PCI config\n",
-+                  line, pin);
-               virq = irq_create_mapping(NULL, line);
-               if (virq != NO_IRQ)
-@@ -475,3 +479,717 @@ void pci_resource_to_user(const struct p
-       *start = rsrc->start - offset;
-       *end = rsrc->end - offset;
- }
-+
-+/**
-+ * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
-+ * @hose: newly allocated pci_controller to be setup
-+ * @dev: device node of the host bridge
-+ * @primary: set if primary bus (32 bits only, soon to be deprecated)
-+ *
-+ * This function will parse the "ranges" property of a PCI host bridge device
-+ * node and setup the resource mapping of a pci controller based on its
-+ * content.
-+ *
-+ * Life would be boring if it wasn't for a few issues that we have to deal
-+ * with here:
-+ *
-+ *   - We can only cope with one IO space range and up to 3 Memory space
-+ *     ranges. However, some machines (thanks Apple !) tend to split their
-+ *     space into lots of small contiguous ranges. So we have to coalesce.
-+ *
-+ *   - We can only cope with all memory ranges having the same offset
-+ *     between CPU addresses and PCI addresses. Unfortunately, some bridges
-+ *     are setup for a large 1:1 mapping along with a small "window" which
-+ *     maps PCI address 0 to some arbitrary high address of the CPU space in
-+ *     order to give access to the ISA memory hole.
-+ *     The way out of here that I've chosen for now is to always set the
-+ *     offset based on the first resource found, then override it if we
-+ *     have a different offset and the previous was set by an ISA hole.
-+ *
-+ *   - Some busses have IO space not starting at 0, which causes trouble with
-+ *     the way we do our IO resource renumbering. The code somewhat deals with
-+ *     it for 64 bits but I would expect problems on 32 bits.
-+ *
-+ *   - Some 32 bits platforms such as 4xx can have physical space larger than
-+ *     32 bits so we need to use 64 bits values for the parsing
-+ */
-+void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
-+                                          struct device_node *dev,
-+                                          int primary)
-+{
-+      const u32 *ranges;
-+      int rlen;
-+      int pna = of_n_addr_cells(dev);
-+      int np = pna + 5;
-+      int memno = 0, isa_hole = -1;
-+      u32 pci_space;
-+      unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size;
-+      unsigned long long isa_mb = 0;
-+      struct resource *res;
-+
-+      printk(KERN_INFO "PCI host bridge %s %s ranges:\n",
-+             dev->full_name, primary ? "(primary)" : "");
-+
-+      /* Get ranges property */
-+      ranges = of_get_property(dev, "ranges", &rlen);
-+      if (ranges == NULL)
-+              return;
-+
-+      /* Parse it */
-+      while ((rlen -= np * 4) >= 0) {
-+              /* Read next ranges element */
-+              pci_space = ranges[0];
-+              pci_addr = of_read_number(ranges + 1, 2);
-+              cpu_addr = of_translate_address(dev, ranges + 3);
-+              size = of_read_number(ranges + pna + 3, 2);
-+              ranges += np;
-+              if (cpu_addr == OF_BAD_ADDR || size == 0)
-+                      continue;
-+
-+              /* Now consume following elements while they are contiguous */
-+              for (; rlen >= np * sizeof(u32);
-+                   ranges += np, rlen -= np * 4) {
-+                      if (ranges[0] != pci_space)
-+                              break;
-+                      pci_next = of_read_number(ranges + 1, 2);
-+                      cpu_next = of_translate_address(dev, ranges + 3);
-+                      if (pci_next != pci_addr + size ||
-+                          cpu_next != cpu_addr + size)
-+                              break;
-+                      size += of_read_number(ranges + pna + 3, 2);
-+              }
-+
-+              /* Act based on address space type */
-+              res = NULL;
-+              switch ((pci_space >> 24) & 0x3) {
-+              case 1:         /* PCI IO space */
-+                      printk(KERN_INFO
-+                             "  IO 0x%016llx..0x%016llx -> 0x%016llx\n",
-+                             cpu_addr, cpu_addr + size - 1, pci_addr);
-+
-+                      /* We support only one IO range */
-+                      if (hose->pci_io_size) {
-+                              printk(KERN_INFO
-+                                     " \\--> Skipped (too many) !\n");
-+                              continue;
-+                      }
-+#ifdef CONFIG_PPC32
-+                      /* On 32 bits, limit I/O space to 16MB */
-+                      if (size > 0x01000000)
-+                              size = 0x01000000;
-+
-+                      /* 32 bits needs to map IOs here */
-+                      hose->io_base_virt = ioremap(cpu_addr, size);
-+
-+                      /* Expect trouble if pci_addr is not 0 */
-+                      if (primary)
-+                              isa_io_base =
-+                                      (unsigned long)hose->io_base_virt;
-+#endif /* CONFIG_PPC32 */
-+                      /* pci_io_size and io_base_phys always represent IO
-+                       * space starting at 0 so we factor in pci_addr
-+                       */
-+                      hose->pci_io_size = pci_addr + size;
-+                      hose->io_base_phys = cpu_addr - pci_addr;
-+
-+                      /* Build resource */
-+                      res = &hose->io_resource;
-+                      res->flags = IORESOURCE_IO;
-+                      res->start = pci_addr;
-+                      break;
-+              case 2:         /* PCI Memory space */
-+                      printk(KERN_INFO
-+                             " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
-+                             cpu_addr, cpu_addr + size - 1, pci_addr,
-+                             (pci_space & 0x40000000) ? "Prefetch" : "");
-+
-+                      /* We support only 3 memory ranges */
-+                      if (memno >= 3) {
-+                              printk(KERN_INFO
-+                                     " \\--> Skipped (too many) !\n");
-+                              continue;
-+                      }
-+                      /* Handles ISA memory hole space here */
-+                      if (pci_addr == 0) {
-+                              isa_mb = cpu_addr;
-+                              isa_hole = memno;
-+                              if (primary || isa_mem_base == 0)
-+                                      isa_mem_base = cpu_addr;
-+                      }
-+
-+                      /* We get the PCI/Mem offset from the first range or
-+                       * the, current one if the offset came from an ISA
-+                       * hole. If they don't match, bugger.
-+                       */
-+                      if (memno == 0 ||
-+                          (isa_hole >= 0 && pci_addr != 0 &&
-+                           hose->pci_mem_offset == isa_mb))
-+                              hose->pci_mem_offset = cpu_addr - pci_addr;
-+                      else if (pci_addr != 0 &&
-+                               hose->pci_mem_offset != cpu_addr - pci_addr) {
-+                              printk(KERN_INFO
-+                                     " \\--> Skipped (offset mismatch) !\n");
-+                              continue;
-+                      }
-+
-+                      /* Build resource */
-+                      res = &hose->mem_resources[memno++];
-+                      res->flags = IORESOURCE_MEM;
-+                      if (pci_space & 0x40000000)
-+                              res->flags |= IORESOURCE_PREFETCH;
-+                      res->start = cpu_addr;
-+                      break;
-+              }
-+              if (res != NULL) {
-+                      res->name = dev->full_name;
-+                      res->end = res->start + size - 1;
-+                      res->parent = NULL;
-+                      res->sibling = NULL;
-+                      res->child = NULL;
-+              }
-+      }
-+
-+      /* Out of paranoia, let's put the ISA hole last if any */
-+      if (isa_hole >= 0 && memno > 0 && isa_hole != (memno-1)) {
-+              struct resource tmp = hose->mem_resources[isa_hole];
-+              hose->mem_resources[isa_hole] = hose->mem_resources[memno-1];
-+              hose->mem_resources[memno-1] = tmp;
-+      }
-+}
-+
-+/* Decide whether to display the domain number in /proc */
-+int pci_proc_domain(struct pci_bus *bus)
-+{
-+      struct pci_controller *hose = pci_bus_to_host(bus);
-+#ifdef CONFIG_PPC64
-+      return hose->buid != 0;
-+#else
-+      if (!(ppc_pci_flags & PPC_PCI_ENABLE_PROC_DOMAINS))
-+              return 0;
-+      if (ppc_pci_flags & PPC_PCI_COMPAT_DOMAIN_0)
-+              return hose->global_number != 0;
-+      return 1;
-+#endif
-+}
-+
-+void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-+                           struct resource *res)
-+{
-+      resource_size_t offset = 0, mask = (resource_size_t)-1;
-+      struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+
-+      if (!hose)
-+              return;
-+      if (res->flags & IORESOURCE_IO) {
-+              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+              mask = 0xffffffffu;
-+      } else if (res->flags & IORESOURCE_MEM)
-+              offset = hose->pci_mem_offset;
-+
-+      region->start = (res->start - offset) & mask;
-+      region->end = (res->end - offset) & mask;
-+}
-+EXPORT_SYMBOL(pcibios_resource_to_bus);
-+
-+void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-+                           struct pci_bus_region *region)
-+{
-+      resource_size_t offset = 0, mask = (resource_size_t)-1;
-+      struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+
-+      if (!hose)
-+              return;
-+      if (res->flags & IORESOURCE_IO) {
-+              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+              mask = 0xffffffffu;
-+      } else if (res->flags & IORESOURCE_MEM)
-+              offset = hose->pci_mem_offset;
-+      res->start = (region->start + offset) & mask;
-+      res->end = (region->end + offset) & mask;
-+}
-+EXPORT_SYMBOL(pcibios_bus_to_resource);
-+
-+/* Fixup a bus resource into a linux resource */
-+static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
-+{
-+      struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+      resource_size_t offset = 0, mask = (resource_size_t)-1;
-+
-+      if (res->flags & IORESOURCE_IO) {
-+              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+              mask = 0xffffffffu;
-+      } else if (res->flags & IORESOURCE_MEM)
-+              offset = hose->pci_mem_offset;
-+
-+      res->start = (res->start + offset) & mask;
-+      res->end = (res->end + offset) & mask;
-+
-+      pr_debug("PCI:%s            %016llx-%016llx\n",
-+               pci_name(dev),
-+               (unsigned long long)res->start,
-+               (unsigned long long)res->end);
-+}
-+
-+
-+/* This header fixup will do the resource fixup for all devices as they are
-+ * probed, but not for bridge ranges
-+ */
-+static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
-+{
-+      struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+      int i;
-+
-+      if (!hose) {
-+              printk(KERN_ERR "No host bridge for PCI dev %s !\n",
-+                     pci_name(dev));
-+              return;
-+      }
-+      for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-+              struct resource *res = dev->resource + i;
-+              if (!res->flags)
-+                      continue;
-+              if (res->end == 0xffffffff) {
-+                      pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n",
-+                               pci_name(dev), i,
-+                               (unsigned long long)res->start,
-+                               (unsigned long long)res->end,
-+                               (unsigned int)res->flags);
-+                      res->end -= res->start;
-+                      res->start = 0;
-+                      res->flags |= IORESOURCE_UNSET;
-+                      continue;
-+              }
-+
-+              pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n",
-+                       pci_name(dev), i,
-+                       (unsigned long long)res->start,\
-+                       (unsigned long long)res->end,
-+                       (unsigned int)res->flags);
-+
-+              fixup_resource(res, dev);
-+      }
-+
-+      /* Call machine specific resource fixup */
-+      if (ppc_md.pcibios_fixup_resources)
-+              ppc_md.pcibios_fixup_resources(dev);
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
-+
-+static void __devinit __pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+      struct pci_controller *hose = pci_bus_to_host(bus);
-+      struct pci_dev *dev = bus->self;
-+
-+      pr_debug("PCI: Fixup bus %d (%s)\n", bus->number, dev ? pci_name(dev) : "PHB");
-+
-+      /* Fixup PCI<->PCI bridges. Host bridges are handled separately, for
-+       * now differently between 32 and 64 bits.
-+       */
-+      if (dev != NULL) {
-+              struct resource *res;
-+              int i;
-+
-+              for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
-+                      if ((res = bus->resource[i]) == NULL)
-+                              continue;
-+                      if (!res->flags)
-+                              continue;
-+                      if (i >= 3 && bus->self->transparent)
-+                              continue;
-+                      /* On PowerMac, Apple leaves bridge windows open over
-+                       * an inaccessible region of memory space (0...fffff)
-+                       * which is somewhat bogus, but that's what they think
-+                       * means disabled...
-+                       *
-+                       * We clear those to force them to be reallocated later
-+                       *
-+                       * We detect such regions by the fact that the base is
-+                       * equal to the pci_mem_offset of the host bridge and
-+                       * their size is smaller than 1M.
-+                       */
-+                      if (res->flags & IORESOURCE_MEM &&
-+                          res->start == hose->pci_mem_offset &&
-+                          res->end < 0x100000) {
-+                              printk(KERN_INFO
-+                                     "PCI: Closing bogus Apple Firmware"
-+                                     " region %d on bus 0x%02x\n",
-+                                     i, bus->number);
-+                              res->flags = 0;
-+                              continue;
-+                      }
-+
-+                      pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n",
-+                               pci_name(dev), i,
-+                               (unsigned long long)res->start,\
-+                               (unsigned long long)res->end,
-+                               (unsigned int)res->flags);
-+
-+                      fixup_resource(res, dev);
-+              }
-+      }
-+
-+      /* Additional setup that is different between 32 and 64 bits for now */
-+      pcibios_do_bus_setup(bus);
-+
-+      /* Platform specific bus fixups */
-+      if (ppc_md.pcibios_fixup_bus)
-+              ppc_md.pcibios_fixup_bus(bus);
-+
-+      /* Read default IRQs and fixup if necessary */
-+      list_for_each_entry(dev, &bus->devices, bus_list) {
-+              pci_read_irq_line(dev);
-+              if (ppc_md.pci_irq_fixup)
-+                      ppc_md.pci_irq_fixup(dev);
-+      }
-+}
-+
-+void __devinit pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+      /* When called from the generic PCI probe, read PCI<->PCI bridge
-+       * bases before proceeding
-+       */
-+      if (bus->self != NULL)
-+              pci_read_bridge_bases(bus);
-+      __pcibios_fixup_bus(bus);
-+}
-+EXPORT_SYMBOL(pcibios_fixup_bus);
-+
-+/* When building a bus from the OF tree rather than probing, we need a
-+ * slightly different version of the fixup which doesn't read the
-+ * bridge bases using config space accesses
-+ */
-+void __devinit pcibios_fixup_of_probed_bus(struct pci_bus *bus)
-+{
-+      __pcibios_fixup_bus(bus);
-+}
-+
-+static int skip_isa_ioresource_align(struct pci_dev *dev)
-+{
-+      if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
-+          !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
-+              return 1;
-+      return 0;
-+}
-+
-+/*
-+ * We need to avoid collisions with `mirrored' VGA ports
-+ * and other strange ISA hardware, so we always want the
-+ * addresses to be allocated in the 0x000-0x0ff region
-+ * modulo 0x400.
-+ *
-+ * Why? Because some silly external IO cards only decode
-+ * the low 10 bits of the IO address. The 0x00-0xff region
-+ * is reserved for motherboard devices that decode all 16
-+ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-+ * but we want to try to avoid allocating at 0x2900-0x2bff
-+ * which might have be mirrored at 0x0100-0x03ff..
-+ */
-+void pcibios_align_resource(void *data, struct resource *res,
-+                              resource_size_t size, resource_size_t align)
-+{
-+      struct pci_dev *dev = data;
-+
-+      if (res->flags & IORESOURCE_IO) {
-+              resource_size_t start = res->start;
-+
-+              if (skip_isa_ioresource_align(dev))
-+                      return;
-+              if (start & 0x300) {
-+                      start = (start + 0x3ff) & ~0x3ff;
-+                      res->start = start;
-+              }
-+      }
-+}
-+EXPORT_SYMBOL(pcibios_align_resource);
-+
-+/*
-+ * Reparent resource children of pr that conflict with res
-+ * under res, and make res replace those children.
-+ */
-+static int __init reparent_resources(struct resource *parent,
-+                                   struct resource *res)
-+{
-+      struct resource *p, **pp;
-+      struct resource **firstpp = NULL;
-+
-+      for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
-+              if (p->end < res->start)
-+                      continue;
-+              if (res->end < p->start)
-+                      break;
-+              if (p->start < res->start || p->end > res->end)
-+                      return -1;      /* not completely contained */
-+              if (firstpp == NULL)
-+                      firstpp = pp;
-+      }
-+      if (firstpp == NULL)
-+              return -1;      /* didn't find any conflicting entries? */
-+      res->parent = parent;
-+      res->child = *firstpp;
-+      res->sibling = *pp;
-+      *firstpp = res;
-+      *pp = NULL;
-+      for (p = res->child; p != NULL; p = p->sibling) {
-+              p->parent = res;
-+              DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
-+                  p->name,
-+                  (unsigned long long)p->start,
-+                  (unsigned long long)p->end, res->name);
-+      }
-+      return 0;
-+}
-+
-+/*
-+ *  Handle resources of PCI devices.  If the world were perfect, we could
-+ *  just allocate all the resource regions and do nothing more.  It isn't.
-+ *  On the other hand, we cannot just re-allocate all devices, as it would
-+ *  require us to know lots of host bridge internals.  So we attempt to
-+ *  keep as much of the original configuration as possible, but tweak it
-+ *  when it's found to be wrong.
-+ *
-+ *  Known BIOS problems we have to work around:
-+ *    - I/O or memory regions not configured
-+ *    - regions configured, but not enabled in the command register
-+ *    - bogus I/O addresses above 64K used
-+ *    - expansion ROMs left enabled (this may sound harmless, but given
-+ *      the fact the PCI specs explicitly allow address decoders to be
-+ *      shared between expansion ROMs and other resource regions, it's
-+ *      at least dangerous)
-+ *
-+ *  Our solution:
-+ *    (1) Allocate resources for all buses behind PCI-to-PCI bridges.
-+ *        This gives us fixed barriers on where we can allocate.
-+ *    (2) Allocate resources for all enabled devices.  If there is
-+ *        a collision, just mark the resource as unallocated. Also
-+ *        disable expansion ROMs during this step.
-+ *    (3) Try to allocate resources for disabled devices.  If the
-+ *        resources were assigned correctly, everything goes well,
-+ *        if they weren't, they won't disturb allocation of other
-+ *        resources.
-+ *    (4) Assign new addresses to resources which were either
-+ *        not configured at all or misconfigured.  If explicitly
-+ *        requested by the user, configure expansion ROM address
-+ *        as well.
-+ */
-+
-+static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
-+{
-+      struct pci_bus *bus;
-+      int i;
-+      struct resource *res, *pr;
-+
-+      /* Depth-First Search on bus tree */
-+      list_for_each_entry(bus, bus_list, node) {
-+              for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
-+                      if ((res = bus->resource[i]) == NULL || !res->flags
-+                          || res->start > res->end)
-+                              continue;
-+                      if (bus->parent == NULL)
-+                              pr = (res->flags & IORESOURCE_IO) ?
-+                                      &ioport_resource : &iomem_resource;
-+                      else {
-+                              /* Don't bother with non-root busses when
-+                               * re-assigning all resources. We clear the
-+                               * resource flags as if they were colliding
-+                               * and as such ensure proper re-allocation
-+                               * later.
-+                               */
-+                              if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
-+                                      goto clear_resource;
-+                              pr = pci_find_parent_resource(bus->self, res);
-+                              if (pr == res) {
-+                                      /* this happens when the generic PCI
-+                                       * code (wrongly) decides that this
-+                                       * bridge is transparent  -- paulus
-+                                       */
-+                                      continue;
-+                              }
-+                      }
-+
-+                      DBG("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx "
-+                          "[0x%x], parent %p (%s)\n",
-+                          bus->self ? pci_name(bus->self) : "PHB",
-+                          bus->number, i,
-+                          (unsigned long long)res->start,
-+                          (unsigned long long)res->end,
-+                          (unsigned int)res->flags,
-+                          pr, (pr && pr->name) ? pr->name : "nil");
-+
-+                      if (pr && !(pr->flags & IORESOURCE_UNSET)) {
-+                              if (request_resource(pr, res) == 0)
-+                                      continue;
-+                              /*
-+                               * Must be a conflict with an existing entry.
-+                               * Move that entry (or entries) under the
-+                               * bridge resource and try again.
-+                               */
-+                              if (reparent_resources(pr, res) == 0)
-+                                      continue;
-+                      }
-+                      printk(KERN_WARNING
-+                             "PCI: Cannot allocate resource region "
-+                             "%d of PCI bridge %d, will remap\n",
-+                             i, bus->number);
-+clear_resource:
-+                      res->flags = 0;
-+              }
-+              pcibios_allocate_bus_resources(&bus->children);
-+      }
-+}
-+
-+static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
-+{
-+      struct resource *pr, *r = &dev->resource[idx];
-+
-+      DBG("PCI: Allocating %s: Resource %d: %016llx..%016llx [%x]\n",
-+          pci_name(dev), idx,
-+          (unsigned long long)r->start,
-+          (unsigned long long)r->end,
-+          (unsigned int)r->flags);
-+
-+      pr = pci_find_parent_resource(dev, r);
-+      if (!pr || (pr->flags & IORESOURCE_UNSET) ||
-+          request_resource(pr, r) < 0) {
-+              printk(KERN_WARNING "PCI: Cannot allocate resource region %d"
-+                     " of device %s, will remap\n", idx, pci_name(dev));
-+              if (pr)
-+                      DBG("PCI:  parent is %p: %016llx-%016llx [%x]\n", pr,
-+                          (unsigned long long)pr->start,
-+                          (unsigned long long)pr->end,
-+                          (unsigned int)pr->flags);
-+              /* We'll assign a new address later */
-+              r->flags |= IORESOURCE_UNSET;
-+              r->end -= r->start;
-+              r->start = 0;
-+      }
-+}
-+
-+static void __init pcibios_allocate_resources(int pass)
-+{
-+      struct pci_dev *dev = NULL;
-+      int idx, disabled;
-+      u16 command;
-+      struct resource *r;
-+
-+      for_each_pci_dev(dev) {
-+              pci_read_config_word(dev, PCI_COMMAND, &command);
-+              for (idx = 0; idx < 6; idx++) {
-+                      r = &dev->resource[idx];
-+                      if (r->parent)          /* Already allocated */
-+                              continue;
-+                      if (!r->flags || (r->flags & IORESOURCE_UNSET))
-+                              continue;       /* Not assigned at all */
-+                      if (r->flags & IORESOURCE_IO)
-+                              disabled = !(command & PCI_COMMAND_IO);
-+                      else
-+                              disabled = !(command & PCI_COMMAND_MEMORY);
-+                      if (pass == disabled)
-+                              alloc_resource(dev, idx);
-+              }
-+              if (pass)
-+                      continue;
-+              r = &dev->resource[PCI_ROM_RESOURCE];
-+              if (r->flags & IORESOURCE_ROM_ENABLE) {
-+                      /* Turn the ROM off, leave the resource region,
-+                       * but keep it unregistered.
-+                       */
-+                      u32 reg;
-+                      DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
-+                      r->flags &= ~IORESOURCE_ROM_ENABLE;
-+                      pci_read_config_dword(dev, dev->rom_base_reg, &reg);
-+                      pci_write_config_dword(dev, dev->rom_base_reg,
-+                                             reg & ~PCI_ROM_ADDRESS_ENABLE);
-+              }
-+      }
-+}
-+
-+void __init pcibios_resource_survey(void)
-+{
-+      /* Allocate and assign resources. If we re-assign everything, then
-+       * we skip the allocate phase
-+       */
-+      pcibios_allocate_bus_resources(&pci_root_buses);
-+
-+      if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
-+              pcibios_allocate_resources(0);
-+              pcibios_allocate_resources(1);
-+      }
-+
-+      if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
-+              DBG("PCI: Assigning unassigned resouces...\n");
-+              pci_assign_unassigned_resources();
-+      }
-+
-+      /* Call machine dependent fixup */
-+      if (ppc_md.pcibios_fixup)
-+              ppc_md.pcibios_fixup();
-+}
-+
-+#ifdef CONFIG_HOTPLUG
-+/* This is used by the pSeries hotplug driver to allocate resource
-+ * of newly plugged busses. We can try to consolidate with the
-+ * rest of the code later, for now, keep it as-is
-+ */
-+void __devinit pcibios_claim_one_bus(struct pci_bus *bus)
-+{
-+      struct pci_dev *dev;
-+      struct pci_bus *child_bus;
-+
-+      list_for_each_entry(dev, &bus->devices, bus_list) {
-+              int i;
-+
-+              for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-+                      struct resource *r = &dev->resource[i];
-+
-+                      if (r->parent || !r->start || !r->flags)
-+                              continue;
-+                      pci_claim_resource(dev, i);
-+              }
-+      }
-+
-+      list_for_each_entry(child_bus, &bus->children, node)
-+              pcibios_claim_one_bus(child_bus);
-+}
-+EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
-+#endif /* CONFIG_HOTPLUG */
-+
-+int pcibios_enable_device(struct pci_dev *dev, int mask)
-+{
-+      u16 cmd, old_cmd;
-+      int idx;
-+      struct resource *r;
-+
-+      if (ppc_md.pcibios_enable_device_hook)
-+              if (ppc_md.pcibios_enable_device_hook(dev))
-+                      return -EINVAL;
-+
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+      old_cmd = cmd;
-+      for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
-+              /* Only set up the requested stuff */
-+              if (!(mask & (1 << idx)))
-+                      continue;
-+              r = &dev->resource[idx];
-+              if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
-+                      continue;
-+              if ((idx == PCI_ROM_RESOURCE) &&
-+                              (!(r->flags & IORESOURCE_ROM_ENABLE)))
-+                      continue;
-+              if (r->parent == NULL) {
-+                      printk(KERN_ERR "PCI: Device %s not available because"
-+                             " of resource collisions\n", pci_name(dev));
-+                      return -EINVAL;
-+              }
-+              if (r->flags & IORESOURCE_IO)
-+                      cmd |= PCI_COMMAND_IO;
-+              if (r->flags & IORESOURCE_MEM)
-+                      cmd |= PCI_COMMAND_MEMORY;
-+      }
-+      if (cmd != old_cmd) {
-+              printk("PCI: Enabling device %s (%04x -> %04x)\n",
-+                     pci_name(dev), old_cmd, cmd);
-+              pci_write_config_word(dev, PCI_COMMAND, cmd);
-+      }
-+      return 0;
-+}
-+
---- a/arch/powerpc/kernel/pci_32.c
-+++ b/arch/powerpc/kernel/pci_32.c
-@@ -13,6 +13,7 @@
- #include <linux/bootmem.h>
- #include <linux/irq.h>
- #include <linux/list.h>
-+#include <linux/of.h>
- #include <asm/processor.h>
- #include <asm/io.h>
-@@ -32,19 +33,12 @@
- #endif
- unsigned long isa_io_base     = 0;
--unsigned long isa_mem_base    = 0;
- unsigned long pci_dram_offset = 0;
- int pcibios_assign_bus_offset = 1;
- void pcibios_make_OF_bus_map(void);
--static int pci_relocate_bridge_resource(struct pci_bus *bus, int i);
--static int probe_resource(struct pci_bus *parent, struct resource *pr,
--                        struct resource *res, struct resource **conflict);
--static void update_bridge_base(struct pci_bus *bus, int i);
--static void pcibios_fixup_resources(struct pci_dev* dev);
- static void fixup_broken_pcnet32(struct pci_dev* dev);
--static int reparent_resources(struct resource *parent, struct resource *res);
- static void fixup_cpc710_pci64(struct pci_dev* dev);
- #ifdef CONFIG_PPC_OF
- static u8* pci_to_OF_bus_map;
-@@ -53,7 +47,7 @@ static u8* pci_to_OF_bus_map;
- /* By default, we don't re-assign bus numbers. We do this only on
-  * some pmacs
-  */
--int pci_assign_all_buses;
-+static int pci_assign_all_buses;
- LIST_HEAD(hose_list);
-@@ -100,505 +94,6 @@ fixup_cpc710_pci64(struct pci_dev* dev)
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM,   PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64);
--static void
--pcibios_fixup_resources(struct pci_dev *dev)
--{
--      struct pci_controller* hose = (struct pci_controller *)dev->sysdata;
--      int i;
--      unsigned long offset;
--
--      if (!hose) {
--              printk(KERN_ERR "No hose for PCI dev %s!\n", pci_name(dev));
--              return;
--      }
--      for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
--              struct resource *res = dev->resource + i;
--              if (!res->flags)
--                      continue;
--              if (res->end == 0xffffffff) {
--                      DBG("PCI:%s Resource %d [%016llx-%016llx] is unassigned\n",
--                          pci_name(dev), i, (u64)res->start, (u64)res->end);
--                      res->end -= res->start;
--                      res->start = 0;
--                      res->flags |= IORESOURCE_UNSET;
--                      continue;
--              }
--              offset = 0;
--              if (res->flags & IORESOURCE_MEM) {
--                      offset = hose->pci_mem_offset;
--              } else if (res->flags & IORESOURCE_IO) {
--                      offset = (unsigned long) hose->io_base_virt
--                              - isa_io_base;
--              }
--              if (offset != 0) {
--                      res->start += offset;
--                      res->end += offset;
--                      DBG("Fixup res %d (%lx) of dev %s: %llx -> %llx\n",
--                          i, res->flags, pci_name(dev),
--                          (u64)res->start - offset, (u64)res->start);
--              }
--      }
--
--      /* Call machine specific resource fixup */
--      if (ppc_md.pcibios_fixup_resources)
--              ppc_md.pcibios_fixup_resources(dev);
--}
--DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID,          PCI_ANY_ID,                     pcibios_fixup_resources);
--
--void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
--                      struct resource *res)
--{
--      unsigned long offset = 0;
--      struct pci_controller *hose = dev->sysdata;
--
--      if (hose && res->flags & IORESOURCE_IO)
--              offset = (unsigned long)hose->io_base_virt - isa_io_base;
--      else if (hose && res->flags & IORESOURCE_MEM)
--              offset = hose->pci_mem_offset;
--      region->start = res->start - offset;
--      region->end = res->end - offset;
--}
--EXPORT_SYMBOL(pcibios_resource_to_bus);
--
--void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
--                           struct pci_bus_region *region)
--{
--      unsigned long offset = 0;
--      struct pci_controller *hose = dev->sysdata;
--
--      if (hose && res->flags & IORESOURCE_IO)
--              offset = (unsigned long)hose->io_base_virt - isa_io_base;
--      else if (hose && res->flags & IORESOURCE_MEM)
--              offset = hose->pci_mem_offset;
--      res->start = region->start + offset;
--      res->end = region->end + offset;
--}
--EXPORT_SYMBOL(pcibios_bus_to_resource);
--
--/*
-- * We need to avoid collisions with `mirrored' VGA ports
-- * and other strange ISA hardware, so we always want the
-- * addresses to be allocated in the 0x000-0x0ff region
-- * modulo 0x400.
-- *
-- * Why? Because some silly external IO cards only decode
-- * the low 10 bits of the IO address. The 0x00-0xff region
-- * is reserved for motherboard devices that decode all 16
-- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-- * but we want to try to avoid allocating at 0x2900-0x2bff
-- * which might have be mirrored at 0x0100-0x03ff..
-- */
--void pcibios_align_resource(void *data, struct resource *res,
--                              resource_size_t size, resource_size_t align)
--{
--      struct pci_dev *dev = data;
--
--      if (res->flags & IORESOURCE_IO) {
--              resource_size_t start = res->start;
--
--              if (size > 0x100) {
--                      printk(KERN_ERR "PCI: I/O Region %s/%d too large"
--                             " (%lld bytes)\n", pci_name(dev),
--                             dev->resource - res, (unsigned long long)size);
--              }
--
--              if (start & 0x300) {
--                      start = (start + 0x3ff) & ~0x3ff;
--                      res->start = start;
--              }
--      }
--}
--EXPORT_SYMBOL(pcibios_align_resource);
--
--/*
-- *  Handle resources of PCI devices.  If the world were perfect, we could
-- *  just allocate all the resource regions and do nothing more.  It isn't.
-- *  On the other hand, we cannot just re-allocate all devices, as it would
-- *  require us to know lots of host bridge internals.  So we attempt to
-- *  keep as much of the original configuration as possible, but tweak it
-- *  when it's found to be wrong.
-- *
-- *  Known BIOS problems we have to work around:
-- *    - I/O or memory regions not configured
-- *    - regions configured, but not enabled in the command register
-- *    - bogus I/O addresses above 64K used
-- *    - expansion ROMs left enabled (this may sound harmless, but given
-- *      the fact the PCI specs explicitly allow address decoders to be
-- *      shared between expansion ROMs and other resource regions, it's
-- *      at least dangerous)
-- *
-- *  Our solution:
-- *    (1) Allocate resources for all buses behind PCI-to-PCI bridges.
-- *        This gives us fixed barriers on where we can allocate.
-- *    (2) Allocate resources for all enabled devices.  If there is
-- *        a collision, just mark the resource as unallocated. Also
-- *        disable expansion ROMs during this step.
-- *    (3) Try to allocate resources for disabled devices.  If the
-- *        resources were assigned correctly, everything goes well,
-- *        if they weren't, they won't disturb allocation of other
-- *        resources.
-- *    (4) Assign new addresses to resources which were either
-- *        not configured at all or misconfigured.  If explicitly
-- *        requested by the user, configure expansion ROM address
-- *        as well.
-- */
--
--static void __init
--pcibios_allocate_bus_resources(struct list_head *bus_list)
--{
--      struct pci_bus *bus;
--      int i;
--      struct resource *res, *pr;
--
--      /* Depth-First Search on bus tree */
--      list_for_each_entry(bus, bus_list, node) {
--              for (i = 0; i < 4; ++i) {
--                      if ((res = bus->resource[i]) == NULL || !res->flags
--                          || res->start > res->end)
--                              continue;
--                      if (bus->parent == NULL)
--                              pr = (res->flags & IORESOURCE_IO)?
--                                      &ioport_resource: &iomem_resource;
--                      else {
--                              pr = pci_find_parent_resource(bus->self, res);
--                              if (pr == res) {
--                                      /* this happens when the generic PCI
--                                       * code (wrongly) decides that this
--                                       * bridge is transparent  -- paulus
--                                       */
--                                      continue;
--                              }
--                      }
--
--                      DBG("PCI: bridge rsrc %llx..%llx (%lx), parent %p\n",
--                          (u64)res->start, (u64)res->end, res->flags, pr);
--                      if (pr) {
--                              if (request_resource(pr, res) == 0)
--                                      continue;
--                              /*
--                               * Must be a conflict with an existing entry.
--                               * Move that entry (or entries) under the
--                               * bridge resource and try again.
--                               */
--                              if (reparent_resources(pr, res) == 0)
--                                      continue;
--                      }
--                      printk(KERN_ERR "PCI: Cannot allocate resource region "
--                             "%d of PCI bridge %d\n", i, bus->number);
--                      if (pci_relocate_bridge_resource(bus, i))
--                              bus->resource[i] = NULL;
--              }
--              pcibios_allocate_bus_resources(&bus->children);
--      }
--}
--
--/*
-- * Reparent resource children of pr that conflict with res
-- * under res, and make res replace those children.
-- */
--static int __init
--reparent_resources(struct resource *parent, struct resource *res)
--{
--      struct resource *p, **pp;
--      struct resource **firstpp = NULL;
--
--      for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
--              if (p->end < res->start)
--                      continue;
--              if (res->end < p->start)
--                      break;
--              if (p->start < res->start || p->end > res->end)
--                      return -1;      /* not completely contained */
--              if (firstpp == NULL)
--                      firstpp = pp;
--      }
--      if (firstpp == NULL)
--              return -1;      /* didn't find any conflicting entries? */
--      res->parent = parent;
--      res->child = *firstpp;
--      res->sibling = *pp;
--      *firstpp = res;
--      *pp = NULL;
--      for (p = res->child; p != NULL; p = p->sibling) {
--              p->parent = res;
--              DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
--                  p->name, (u64)p->start, (u64)p->end, res->name);
--      }
--      return 0;
--}
--
--/*
-- * A bridge has been allocated a range which is outside the range
-- * of its parent bridge, so it needs to be moved.
-- */
--static int __init
--pci_relocate_bridge_resource(struct pci_bus *bus, int i)
--{
--      struct resource *res, *pr, *conflict;
--      unsigned long try, size;
--      int j;
--      struct pci_bus *parent = bus->parent;
--
--      if (parent == NULL) {
--              /* shouldn't ever happen */
--              printk(KERN_ERR "PCI: can't move host bridge resource\n");
--              return -1;
--      }
--      res = bus->resource[i];
--      if (res == NULL)
--              return -1;
--      pr = NULL;
--      for (j = 0; j < 4; j++) {
--              struct resource *r = parent->resource[j];
--              if (!r)
--                      continue;
--              if ((res->flags ^ r->flags) & (IORESOURCE_IO | IORESOURCE_MEM))
--                      continue;
--              if (!((res->flags ^ r->flags) & IORESOURCE_PREFETCH)) {
--                      pr = r;
--                      break;
--              }
--              if (res->flags & IORESOURCE_PREFETCH)
--                      pr = r;
--      }
--      if (pr == NULL)
--              return -1;
--      size = res->end - res->start;
--      if (pr->start > pr->end || size > pr->end - pr->start)
--              return -1;
--      try = pr->end;
--      for (;;) {
--              res->start = try - size;
--              res->end = try;
--              if (probe_resource(bus->parent, pr, res, &conflict) == 0)
--                      break;
--              if (conflict->start <= pr->start + size)
--                      return -1;
--              try = conflict->start - 1;
--      }
--      if (request_resource(pr, res)) {
--              DBG(KERN_ERR "PCI: huh? couldn't move to %llx..%llx\n",
--                  (u64)res->start, (u64)res->end);
--              return -1;              /* "can't happen" */
--      }
--      update_bridge_base(bus, i);
--      printk(KERN_INFO "PCI: bridge %d resource %d moved to %llx..%llx\n",
--             bus->number, i, (unsigned long long)res->start,
--             (unsigned long long)res->end);
--      return 0;
--}
--
--static int __init
--probe_resource(struct pci_bus *parent, struct resource *pr,
--             struct resource *res, struct resource **conflict)
--{
--      struct pci_bus *bus;
--      struct pci_dev *dev;
--      struct resource *r;
--      int i;
--
--      for (r = pr->child; r != NULL; r = r->sibling) {
--              if (r->end >= res->start && res->end >= r->start) {
--                      *conflict = r;
--                      return 1;
--              }
--      }
--      list_for_each_entry(bus, &parent->children, node) {
--              for (i = 0; i < 4; ++i) {
--                      if ((r = bus->resource[i]) == NULL)
--                              continue;
--                      if (!r->flags || r->start > r->end || r == res)
--                              continue;
--                      if (pci_find_parent_resource(bus->self, r) != pr)
--                              continue;
--                      if (r->end >= res->start && res->end >= r->start) {
--                              *conflict = r;
--                              return 1;
--                      }
--              }
--      }
--      list_for_each_entry(dev, &parent->devices, bus_list) {
--              for (i = 0; i < 6; ++i) {
--                      r = &dev->resource[i];
--                      if (!r->flags || (r->flags & IORESOURCE_UNSET))
--                              continue;
--                      if (pci_find_parent_resource(dev, r) != pr)
--                              continue;
--                      if (r->end >= res->start && res->end >= r->start) {
--                              *conflict = r;
--                              return 1;
--                      }
--              }
--      }
--      return 0;
--}
--
--void __init
--update_bridge_resource(struct pci_dev *dev, struct resource *res)
--{
--      u8 io_base_lo, io_limit_lo;
--      u16 mem_base, mem_limit;
--      u16 cmd;
--      unsigned long start, end, off;
--      struct pci_controller *hose = dev->sysdata;
--
--      if (!hose) {
--              printk("update_bridge_base: no hose?\n");
--              return;
--      }
--      pci_read_config_word(dev, PCI_COMMAND, &cmd);
--      pci_write_config_word(dev, PCI_COMMAND,
--                            cmd & ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY));
--      if (res->flags & IORESOURCE_IO) {
--              off = (unsigned long) hose->io_base_virt - isa_io_base;
--              start = res->start - off;
--              end = res->end - off;
--              io_base_lo = (start >> 8) & PCI_IO_RANGE_MASK;
--              io_limit_lo = (end >> 8) & PCI_IO_RANGE_MASK;
--              if (end > 0xffff)
--                      io_base_lo |= PCI_IO_RANGE_TYPE_32;
--              else
--                      io_base_lo |= PCI_IO_RANGE_TYPE_16;
--              pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
--                              start >> 16);
--              pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
--                              end >> 16);
--              pci_write_config_byte(dev, PCI_IO_BASE, io_base_lo);
--              pci_write_config_byte(dev, PCI_IO_LIMIT, io_limit_lo);
--
--      } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
--                 == IORESOURCE_MEM) {
--              off = hose->pci_mem_offset;
--              mem_base = ((res->start - off) >> 16) & PCI_MEMORY_RANGE_MASK;
--              mem_limit = ((res->end - off) >> 16) & PCI_MEMORY_RANGE_MASK;
--              pci_write_config_word(dev, PCI_MEMORY_BASE, mem_base);
--              pci_write_config_word(dev, PCI_MEMORY_LIMIT, mem_limit);
--
--      } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
--                 == (IORESOURCE_MEM | IORESOURCE_PREFETCH)) {
--              off = hose->pci_mem_offset;
--              mem_base = ((res->start - off) >> 16) & PCI_PREF_RANGE_MASK;
--              mem_limit = ((res->end - off) >> 16) & PCI_PREF_RANGE_MASK;
--              pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, mem_base);
--              pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, mem_limit);
--
--      } else {
--              DBG(KERN_ERR "PCI: ugh, bridge %s res has flags=%lx\n",
--                  pci_name(dev), res->flags);
--      }
--      pci_write_config_word(dev, PCI_COMMAND, cmd);
--}
--
--static void __init
--update_bridge_base(struct pci_bus *bus, int i)
--{
--      struct resource *res = bus->resource[i];
--      struct pci_dev *dev = bus->self;
--      update_bridge_resource(dev, res);
--}
--
--static inline void alloc_resource(struct pci_dev *dev, int idx)
--{
--      struct resource *pr, *r = &dev->resource[idx];
--
--      DBG("PCI:%s: Resource %d: %016llx-%016llx (f=%lx)\n",
--          pci_name(dev), idx, (u64)r->start, (u64)r->end, r->flags);
--      pr = pci_find_parent_resource(dev, r);
--      if (!pr || request_resource(pr, r) < 0) {
--              printk(KERN_ERR "PCI: Cannot allocate resource region %d"
--                     " of device %s\n", idx, pci_name(dev));
--              if (pr)
--                      DBG("PCI:  parent is %p: %016llx-%016llx (f=%lx)\n",
--                          pr, (u64)pr->start, (u64)pr->end, pr->flags);
--              /* We'll assign a new address later */
--              r->flags |= IORESOURCE_UNSET;
--              r->end -= r->start;
--              r->start = 0;
--      }
--}
--
--static void __init
--pcibios_allocate_resources(int pass)
--{
--      struct pci_dev *dev = NULL;
--      int idx, disabled;
--      u16 command;
--      struct resource *r;
--
--      for_each_pci_dev(dev) {
--              pci_read_config_word(dev, PCI_COMMAND, &command);
--              for (idx = 0; idx < 6; idx++) {
--                      r = &dev->resource[idx];
--                      if (r->parent)          /* Already allocated */
--                              continue;
--                      if (!r->flags || (r->flags & IORESOURCE_UNSET))
--                              continue;       /* Not assigned at all */
--                      if (r->flags & IORESOURCE_IO)
--                              disabled = !(command & PCI_COMMAND_IO);
--                      else
--                              disabled = !(command & PCI_COMMAND_MEMORY);
--                      if (pass == disabled)
--                              alloc_resource(dev, idx);
--              }
--              if (pass)
--                      continue;
--              r = &dev->resource[PCI_ROM_RESOURCE];
--              if (r->flags & IORESOURCE_ROM_ENABLE) {
--                      /* Turn the ROM off, leave the resource region, but keep it unregistered. */
--                      u32 reg;
--                      DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
--                      r->flags &= ~IORESOURCE_ROM_ENABLE;
--                      pci_read_config_dword(dev, dev->rom_base_reg, &reg);
--                      pci_write_config_dword(dev, dev->rom_base_reg,
--                                             reg & ~PCI_ROM_ADDRESS_ENABLE);
--              }
--      }
--}
--
--static void __init
--pcibios_assign_resources(void)
--{
--      struct pci_dev *dev = NULL;
--      int idx;
--      struct resource *r;
--
--      for_each_pci_dev(dev) {
--              int class = dev->class >> 8;
--
--              /* Don't touch classless devices and host bridges */
--              if (!class || class == PCI_CLASS_BRIDGE_HOST)
--                      continue;
--
--              for (idx = 0; idx < 6; idx++) {
--                      r = &dev->resource[idx];
--
--                      /*
--                       * We shall assign a new address to this resource,
--                       * either because the BIOS (sic) forgot to do so
--                       * or because we have decided the old address was
--                       * unusable for some reason.
--                       */
--                      if ((r->flags & IORESOURCE_UNSET) && r->end &&
--                          (!ppc_md.pcibios_enable_device_hook ||
--                           !ppc_md.pcibios_enable_device_hook(dev, 1))) {
--                              int rc;
--
--                              r->flags &= ~IORESOURCE_UNSET;
--                              rc = pci_assign_resource(dev, idx);
--                              BUG_ON(rc);
--                      }
--              }
--
--#if 0 /* don't assign ROMs */
--              r = &dev->resource[PCI_ROM_RESOURCE];
--              r->end -= r->start;
--              r->start = 0;
--              if (r->end)
--                      pci_assign_resource(dev, PCI_ROM_RESOURCE);
--#endif
--      }
--}
--
- #ifdef CONFIG_PPC_OF
- /*
-  * Functions below are used on OpenFirmware machines.
-@@ -619,7 +114,7 @@ make_one_node_map(struct device_node* no
-       } else
-               pci_to_OF_bus_map[pci_bus] = bus_range[0];
--      for (node=node->child; node != 0;node = node->sibling) {
-+      for_each_child_of_node(node, node) {
-               struct pci_dev* dev;
-               const unsigned int *class_code, *reg;
-       
-@@ -662,8 +157,8 @@ pcibios_make_OF_bus_map(void)
-       /* For each hose, we begin searching bridges */
-       list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
--              struct device_node* node;       
--              node = (struct device_node *)hose->arch_data;
-+              struct device_node* node = hose->dn;
-+
-               if (!node)
-                       continue;
-               make_one_node_map(node, hose->first_busno);
-@@ -688,15 +183,18 @@ pcibios_make_OF_bus_map(void)
- typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
- static struct device_node*
--scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
-+scan_OF_pci_childs(struct device_node *parent, pci_OF_scan_iterator filter, void* data)
- {
-+      struct device_node *node;
-       struct device_node* sub_node;
--      for (; node != 0;node = node->sibling) {
-+      for_each_child_of_node(parent, node) {
-               const unsigned int *class_code;
-       
--              if (filter(node, data))
-+              if (filter(node, data)) {
-+                      of_node_put(node);
-                       return node;
-+              }
-               /* For PCI<->PCI bridges or CardBus bridges, we go down
-                * Note: some OFs create a parent node "multifunc-device" as
-@@ -708,9 +206,11 @@ scan_OF_pci_childs(struct device_node* n
-                       (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
-                       strcmp(node->name, "multifunc-device"))
-                       continue;
--              sub_node = scan_OF_pci_childs(node->child, filter, data);
--              if (sub_node)
-+              sub_node = scan_OF_pci_childs(node, filter, data);
-+              if (sub_node) {
-+                      of_node_put(node);
-                       return sub_node;
-+              }
-       }
-       return NULL;
- }
-@@ -718,11 +218,11 @@ scan_OF_pci_childs(struct device_node* n
- static struct device_node *scan_OF_for_pci_dev(struct device_node *parent,
-                                              unsigned int devfn)
- {
--      struct device_node *np = NULL;
-+      struct device_node *np;
-       const u32 *reg;
-       unsigned int psize;
--      while ((np = of_get_next_child(parent, np)) != NULL) {
-+      for_each_child_of_node(parent, np) {
-               reg = of_get_property(np, "reg", &psize);
-               if (reg == NULL || psize < 4)
-                       continue;
-@@ -742,7 +242,7 @@ static struct device_node *scan_OF_for_p
-               struct pci_controller *hose = pci_bus_to_host(bus);
-               if (hose == NULL)
-                       return NULL;
--              return of_node_get(hose->arch_data);
-+              return of_node_get(hose->dn);
-       }
-       /* not a root bus, we need to get our parent */
-@@ -812,9 +312,9 @@ pci_device_from_OF_node(struct device_no
-               return -ENODEV;
-       /* Make sure it's really a PCI device */
-       hose = pci_find_hose_for_OF_device(node);
--      if (!hose || !hose->arch_data)
-+      if (!hose || !hose->dn)
-               return -ENODEV;
--      if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
-+      if (!scan_OF_pci_childs(hose->dn,
-                       find_OF_pci_device_filter, (void *)node))
-               return -ENODEV;
-       reg = of_get_property(node, "reg", NULL);
-@@ -843,120 +343,6 @@ pci_device_from_OF_node(struct device_no
- }
- EXPORT_SYMBOL(pci_device_from_OF_node);
--void __init
--pci_process_bridge_OF_ranges(struct pci_controller *hose,
--                         struct device_node *dev, int primary)
--{
--      static unsigned int static_lc_ranges[256] __initdata;
--      const unsigned int *dt_ranges;
--      unsigned int *lc_ranges, *ranges, *prev, size;
--      int rlen = 0, orig_rlen;
--      int memno = 0;
--      struct resource *res;
--      int np, na = of_n_addr_cells(dev);
--      np = na + 5;
--
--      /* First we try to merge ranges to fix a problem with some pmacs
--       * that can have more than 3 ranges, fortunately using contiguous
--       * addresses -- BenH
--       */
--      dt_ranges = of_get_property(dev, "ranges", &rlen);
--      if (!dt_ranges)
--              return;
--      /* Sanity check, though hopefully that never happens */
--      if (rlen > sizeof(static_lc_ranges)) {
--              printk(KERN_WARNING "OF ranges property too large !\n");
--              rlen = sizeof(static_lc_ranges);
--      }
--      lc_ranges = static_lc_ranges;
--      memcpy(lc_ranges, dt_ranges, rlen);
--      orig_rlen = rlen;
--
--      /* Let's work on a copy of the "ranges" property instead of damaging
--       * the device-tree image in memory
--       */
--      ranges = lc_ranges;
--      prev = NULL;
--      while ((rlen -= np * sizeof(unsigned int)) >= 0) {
--              if (prev) {
--                      if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
--                              (prev[2] + prev[na+4]) == ranges[2] &&
--                              (prev[na+2] + prev[na+4]) == ranges[na+2]) {
--                              prev[na+4] += ranges[na+4];
--                              ranges[0] = 0;
--                              ranges += np;
--                              continue;
--                      }
--              }
--              prev = ranges;
--              ranges += np;
--      }
--
--      /*
--       * The ranges property is laid out as an array of elements,
--       * each of which comprises:
--       *   cells 0 - 2:       a PCI address
--       *   cells 3 or 3+4:    a CPU physical address
--       *                      (size depending on dev->n_addr_cells)
--       *   cells 4+5 or 5+6:  the size of the range
--       */
--      ranges = lc_ranges;
--      rlen = orig_rlen;
--      while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) {
--              res = NULL;
--              size = ranges[na+4];
--              switch ((ranges[0] >> 24) & 0x3) {
--              case 1:         /* I/O space */
--                      if (ranges[2] != 0)
--                              break;
--                      hose->io_base_phys = ranges[na+2];
--                      /* limit I/O space to 16MB */
--                      if (size > 0x01000000)
--                              size = 0x01000000;
--                      hose->io_base_virt = ioremap(ranges[na+2], size);
--                      if (primary)
--                              isa_io_base = (unsigned long) hose->io_base_virt;
--                      res = &hose->io_resource;
--                      res->flags = IORESOURCE_IO;
--                      res->start = ranges[2];
--                      DBG("PCI: IO 0x%llx -> 0x%llx\n",
--                          (u64)res->start, (u64)res->start + size - 1);
--                      break;
--              case 2:         /* memory space */
--                      memno = 0;
--                      if (ranges[1] == 0 && ranges[2] == 0
--                          && ranges[na+4] <= (16 << 20)) {
--                              /* 1st 16MB, i.e. ISA memory area */
--                              if (primary)
--                                      isa_mem_base = ranges[na+2];
--                              memno = 1;
--                      }
--                      while (memno < 3 && hose->mem_resources[memno].flags)
--                              ++memno;
--                      if (memno == 0)
--                              hose->pci_mem_offset = ranges[na+2] - ranges[2];
--                      if (memno < 3) {
--                              res = &hose->mem_resources[memno];
--                              res->flags = IORESOURCE_MEM;
--                              if(ranges[0] & 0x40000000)
--                                      res->flags |= IORESOURCE_PREFETCH;
--                              res->start = ranges[na+2];
--                              DBG("PCI: MEM[%d] 0x%llx -> 0x%llx\n", memno,
--                                  (u64)res->start, (u64)res->start + size - 1);
--                      }
--                      break;
--              }
--              if (res != NULL) {
--                      res->name = dev->full_name;
--                      res->end = res->start + size - 1;
--                      res->parent = NULL;
--                      res->sibling = NULL;
--                      res->child = NULL;
--              }
--              ranges += np;
--      }
--}
--
- /* We create the "pci-OF-bus-map" property now so it appears in the
-  * /proc device tree
-  */
-@@ -986,219 +372,7 @@ void pcibios_make_OF_bus_map(void)
- }
- #endif /* CONFIG_PPC_OF */
--#ifdef CONFIG_PPC_PMAC
--/*
-- * This set of routines checks for PCI<->PCI bridges that have closed
-- * IO resources and have child devices. It tries to re-open an IO
-- * window on them.
-- *
-- * This is a _temporary_ fix to workaround a problem with Apple's OF
-- * closing IO windows on P2P bridges when the OF drivers of cards
-- * below this bridge don't claim any IO range (typically ATI or
-- * Adaptec).
-- *
-- * A more complete fix would be to use drivers/pci/setup-bus.c, which
-- * involves a working pcibios_fixup_pbus_ranges(), some more care about
-- * ordering when creating the host bus resources, and maybe a few more
-- * minor tweaks
-- */
--
--/* Initialize bridges with base/limit values we have collected */
--static void __init
--do_update_p2p_io_resource(struct pci_bus *bus, int enable_vga)
--{
--      struct pci_dev *bridge = bus->self;
--      struct pci_controller* hose = (struct pci_controller *)bridge->sysdata;
--      u32 l;
--      u16 w;
--      struct resource res;
--
--      if (bus->resource[0] == NULL)
--              return;
--      res = *(bus->resource[0]);
--
--      DBG("Remapping Bus %d, bridge: %s\n", bus->number, pci_name(bridge));
--      res.start -= ((unsigned long) hose->io_base_virt - isa_io_base);
--      res.end -= ((unsigned long) hose->io_base_virt - isa_io_base);
--      DBG("  IO window: %016llx-%016llx\n", res.start, res.end);
--
--      /* Set up the top and bottom of the PCI I/O segment for this bus. */
--      pci_read_config_dword(bridge, PCI_IO_BASE, &l);
--      l &= 0xffff000f;
--      l |= (res.start >> 8) & 0x00f0;
--      l |= res.end & 0xf000;
--      pci_write_config_dword(bridge, PCI_IO_BASE, l);
--
--      if ((l & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
--              l = (res.start >> 16) | (res.end & 0xffff0000);
--              pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, l);
--      }
--
--      pci_read_config_word(bridge, PCI_COMMAND, &w);
--      w |= PCI_COMMAND_IO;
--      pci_write_config_word(bridge, PCI_COMMAND, w);
--
--#if 0 /* Enabling this causes XFree 4.2.0 to hang during PCI probe */
--      if (enable_vga) {
--              pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &w);
--              w |= PCI_BRIDGE_CTL_VGA;
--              pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, w);
--      }
--#endif
--}
--
--/* This function is pretty basic and actually quite broken for the
-- * general case, it's enough for us right now though. It's supposed
-- * to tell us if we need to open an IO range at all or not and what
-- * size.
-- */
--static int __init
--check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga)
--{
--      struct pci_dev *dev;
--      int     i;
--      int     rc = 0;
--
--#define push_end(res, mask) do {              \
--      BUG_ON((mask+1) & mask);                \
--      res->end = (res->end + mask) | mask;    \
--} while (0)
--
--      list_for_each_entry(dev, &bus->devices, bus_list) {
--              u16 class = dev->class >> 8;
--
--              if (class == PCI_CLASS_DISPLAY_VGA ||
--                  class == PCI_CLASS_NOT_DEFINED_VGA)
--                      *found_vga = 1;
--              if (class >> 8 == PCI_BASE_CLASS_BRIDGE && dev->subordinate)
--                      rc |= check_for_io_childs(dev->subordinate, res, found_vga);
--              if (class == PCI_CLASS_BRIDGE_CARDBUS)
--                      push_end(res, 0xfff);
--
--              for (i=0; i<PCI_NUM_RESOURCES; i++) {
--                      struct resource *r;
--                      unsigned long r_size;
--
--                      if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI
--                          && i >= PCI_BRIDGE_RESOURCES)
--                              continue;
--                      r = &dev->resource[i];
--                      r_size = r->end - r->start;
--                      if (r_size < 0xfff)
--                              r_size = 0xfff;
--                      if (r->flags & IORESOURCE_IO && (r_size) != 0) {
--                              rc = 1;
--                              push_end(res, r_size);
--                      }
--              }
--      }
--
--      return rc;
--}
--
--/* Here we scan all P2P bridges of a given level that have a closed
-- * IO window. Note that the test for the presence of a VGA card should
-- * be improved to take into account already configured P2P bridges,
-- * currently, we don't see them and might end up configuring 2 bridges
-- * with VGA pass through enabled
-- */
--static void __init
--do_fixup_p2p_level(struct pci_bus *bus)
--{
--      struct pci_bus *b;
--      int i, parent_io;
--      int has_vga = 0;
--
--      for (parent_io=0; parent_io<4; parent_io++)
--              if (bus->resource[parent_io]
--                  && bus->resource[parent_io]->flags & IORESOURCE_IO)
--                      break;
--      if (parent_io >= 4)
--              return;
--
--      list_for_each_entry(b, &bus->children, node) {
--              struct pci_dev *d = b->self;
--              struct pci_controller* hose = (struct pci_controller *)d->sysdata;
--              struct resource *res = b->resource[0];
--              struct resource tmp_res;
--              unsigned long max;
--              int found_vga = 0;
--
--              memset(&tmp_res, 0, sizeof(tmp_res));
--              tmp_res.start = bus->resource[parent_io]->start;
--
--              /* We don't let low addresses go through that closed P2P bridge, well,
--               * that may not be necessary but I feel safer that way
--               */
--              if (tmp_res.start == 0)
--                      tmp_res.start = 0x1000;
--      
--              if (!list_empty(&b->devices) && res && res->flags == 0 &&
--                  res != bus->resource[parent_io] &&
--                  (d->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
--                  check_for_io_childs(b, &tmp_res, &found_vga)) {
--                      u8 io_base_lo;
--
--                      printk(KERN_INFO "Fixing up IO bus %s\n", b->name);
--
--                      if (found_vga) {
--                              if (has_vga) {
--                                      printk(KERN_WARNING "Skipping VGA, already active"
--                                          " on bus segment\n");
--                                      found_vga = 0;
--                              } else
--                                      has_vga = 1;
--                      }
--                      pci_read_config_byte(d, PCI_IO_BASE, &io_base_lo);
--
--                      if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32)
--                              max = ((unsigned long) hose->io_base_virt
--                                      - isa_io_base) + 0xffffffff;
--                      else
--                              max = ((unsigned long) hose->io_base_virt
--                                      - isa_io_base) + 0xffff;
--
--                      *res = tmp_res;
--                      res->flags = IORESOURCE_IO;
--                      res->name = b->name;
--              
--                      /* Find a resource in the parent where we can allocate */
--                      for (i = 0 ; i < 4; i++) {
--                              struct resource *r = bus->resource[i];
--                              if (!r)
--                                      continue;
--                              if ((r->flags & IORESOURCE_IO) == 0)
--                                      continue;
--                              DBG("Trying to allocate from %016llx, size %016llx from parent"
--                                  " res %d: %016llx -> %016llx\n",
--                                      res->start, res->end, i, r->start, r->end);
--                      
--                              if (allocate_resource(r, res, res->end + 1, res->start, max,
--                                  res->end + 1, NULL, NULL) < 0) {
--                                      DBG("Failed !\n");
--                                      continue;
--                              }
--                              do_update_p2p_io_resource(b, found_vga);
--                              break;
--                      }
--              }
--              do_fixup_p2p_level(b);
--      }
--}
--
--static void
--pcibios_fixup_p2p_bridges(void)
--{
--      struct pci_bus *b;
--
--      list_for_each_entry(b, &pci_root_buses, node)
--              do_fixup_p2p_level(b);
--}
--
--#endif /* CONFIG_PPC_PMAC */
--
--static int __init
--pcibios_init(void)
-+static int __init pcibios_init(void)
- {
-       struct pci_controller *hose, *tmp;
-       struct pci_bus *bus;
-@@ -1206,6 +380,9 @@ pcibios_init(void)
-       printk(KERN_INFO "PCI: Probing PCI hardware\n");
-+      if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
-+              pci_assign_all_buses = 1;
-+
-       /* Scan all of the recorded PCI controllers.  */
-       list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
-               if (pci_assign_all_buses)
-@@ -1213,9 +390,10 @@ pcibios_init(void)
-               hose->last_busno = 0xff;
-               bus = pci_scan_bus_parented(hose->parent, hose->first_busno,
-                                           hose->ops, hose);
--              if (bus)
-+              if (bus) {
-                       pci_bus_add_devices(bus);
--              hose->last_busno = bus->subordinate;
-+                      hose->last_busno = bus->subordinate;
-+              }
-               if (pci_assign_all_buses || next_busno <= hose->last_busno)
-                       next_busno = hose->last_busno + pcibios_assign_bus_offset;
-       }
-@@ -1228,18 +406,8 @@ pcibios_init(void)
-       if (pci_assign_all_buses && have_of)
-               pcibios_make_OF_bus_map();
--      /* Call machine dependent fixup */
--      if (ppc_md.pcibios_fixup)
--              ppc_md.pcibios_fixup();
--
--      /* Allocate and assign resources */
--      pcibios_allocate_bus_resources(&pci_root_buses);
--      pcibios_allocate_resources(0);
--      pcibios_allocate_resources(1);
--#ifdef CONFIG_PPC_PMAC
--      pcibios_fixup_p2p_bridges();
--#endif /* CONFIG_PPC_PMAC */
--      pcibios_assign_resources();
-+      /* Call common code to handle resource allocation */
-+      pcibios_resource_survey();
-       /* Call machine dependent post-init code */
-       if (ppc_md.pcibios_after_init)
-@@ -1250,14 +418,14 @@ pcibios_init(void)
- subsys_initcall(pcibios_init);
--void pcibios_fixup_bus(struct pci_bus *bus)
-+void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
- {
-       struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-       unsigned long io_offset;
-       struct resource *res;
--      struct pci_dev *dev;
-       int i;
-+      /* Hookup PHB resources */
-       io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
-       if (bus->parent == NULL) {
-               /* This is a host bridge - fill in its resources */
-@@ -1272,8 +440,8 @@ void pcibios_fixup_bus(struct pci_bus *b
-                       res->end = IO_SPACE_LIMIT;
-                       res->flags = IORESOURCE_IO;
-               }
--              res->start += io_offset;
--              res->end += io_offset;
-+              res->start = (res->start + io_offset) & 0xffffffffu;
-+              res->end = (res->end + io_offset) & 0xffffffffu;
-               for (i = 0; i < 3; ++i) {
-                       res = &hose->mem_resources[i];
-@@ -1288,35 +456,6 @@ void pcibios_fixup_bus(struct pci_bus *b
-                       }
-                       bus->resource[i+1] = res;
-               }
--      } else {
--              /* This is a subordinate bridge */
--              pci_read_bridge_bases(bus);
--
--              for (i = 0; i < 4; ++i) {
--                      if ((res = bus->resource[i]) == NULL)
--                              continue;
--                      if (!res->flags || bus->self->transparent)
--                              continue;
--                      if (io_offset && (res->flags & IORESOURCE_IO)) {
--                              res->start += io_offset;
--                              res->end += io_offset;
--                      } else if (hose->pci_mem_offset
--                                 && (res->flags & IORESOURCE_MEM)) {
--                              res->start += hose->pci_mem_offset;
--                              res->end += hose->pci_mem_offset;
--                      }
--              }
--      }
--
--      /* Platform specific bus fixups */
--      if (ppc_md.pcibios_fixup_bus)
--              ppc_md.pcibios_fixup_bus(bus);
--
--      /* Read default IRQs and fixup if necessary */
--      list_for_each_entry(dev, &bus->devices, bus_list) {
--              pci_read_irq_line(dev);
--              if (ppc_md.pci_irq_fixup)
--                      ppc_md.pci_irq_fixup(dev);
-       }
- }
-@@ -1328,37 +467,6 @@ pcibios_update_irq(struct pci_dev *dev, 
-       /* XXX FIXME - update OF device tree node interrupt property */
- }
--int pcibios_enable_device(struct pci_dev *dev, int mask)
--{
--      u16 cmd, old_cmd;
--      int idx;
--      struct resource *r;
--
--      if (ppc_md.pcibios_enable_device_hook)
--              if (ppc_md.pcibios_enable_device_hook(dev, 0))
--                      return -EINVAL;
--              
--      pci_read_config_word(dev, PCI_COMMAND, &cmd);
--      old_cmd = cmd;
--      for (idx=0; idx<6; idx++) {
--              r = &dev->resource[idx];
--              if (r->flags & IORESOURCE_UNSET) {
--                      printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
--                      return -EINVAL;
--              }
--              if (r->flags & IORESOURCE_IO)
--                      cmd |= PCI_COMMAND_IO;
--              if (r->flags & IORESOURCE_MEM)
--                      cmd |= PCI_COMMAND_MEMORY;
--      }
--      if (cmd != old_cmd) {
--              printk("PCI: Enabling device %s (%04x -> %04x)\n",
--                     pci_name(dev), old_cmd, cmd);
--              pci_write_config_word(dev, PCI_COMMAND, cmd);
--      }
--      return 0;
--}
--
- static struct pci_controller*
- pci_bus_to_hose(int bus)
- {
-@@ -1381,17 +489,6 @@ long sys_pciconfig_iobase(long which, un
-       struct pci_controller* hose;
-       long result = -EOPNOTSUPP;
--      /* Argh ! Please forgive me for that hack, but that's the
--       * simplest way to get existing XFree to not lockup on some
--       * G5 machines... So when something asks for bus 0 io base
--       * (bus 0 is HT root), we return the AGP one instead.
--       */
--#ifdef CONFIG_PPC_PMAC
--      if (machine_is(powermac) && machine_is_compatible("MacRISC4"))
--              if (bus == 0)
--                      bus = 0xf0;
--#endif /* CONFIG_PPC_PMAC */
--
-       hose = pci_bus_to_hose(bus);
-       if (!hose)
-               return -ENODEV;
---- a/arch/powerpc/kernel/pci_64.c
-+++ b/arch/powerpc/kernel/pci_64.c
-@@ -31,7 +31,6 @@
- #include <asm/byteorder.h>
- #include <asm/machdep.h>
- #include <asm/ppc-pci.h>
--#include <asm/firmware.h>
- #ifdef DEBUG
- #include <asm/udbg.h>
-@@ -41,10 +40,6 @@
- #endif
- unsigned long pci_probe_only = 1;
--int pci_assign_all_buses = 0;
--
--static void fixup_resource(struct resource *res, struct pci_dev *dev);
--static void do_bus_setup(struct pci_bus *bus);
- /* pci_io_base -- the base address from which io bars are offsets.
-  * This is the lowest I/O base address (so bar values are always positive),
-@@ -70,139 +65,31 @@ struct dma_mapping_ops *get_pci_dma_ops(
- }
- EXPORT_SYMBOL(get_pci_dma_ops);
--static void fixup_broken_pcnet32(struct pci_dev* dev)
--{
--      if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
--              dev->vendor = PCI_VENDOR_ID_AMD;
--              pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
--      }
--}
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
--
--void  pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
--                            struct resource *res)
--{
--      unsigned long offset = 0;
--      struct pci_controller *hose = pci_bus_to_host(dev->bus);
--
--      if (!hose)
--              return;
--
--      if (res->flags & IORESOURCE_IO)
--              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
--
--      if (res->flags & IORESOURCE_MEM)
--              offset = hose->pci_mem_offset;
--
--      region->start = res->start - offset;
--      region->end = res->end - offset;
--}
--void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
--                            struct pci_bus_region *region)
-+int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
- {
--      unsigned long offset = 0;
--      struct pci_controller *hose = pci_bus_to_host(dev->bus);
--
--      if (!hose)
--              return;
--
--      if (res->flags & IORESOURCE_IO)
--              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
--
--      if (res->flags & IORESOURCE_MEM)
--              offset = hose->pci_mem_offset;
--
--      res->start = region->start + offset;
--      res->end = region->end + offset;
-+      return dma_set_mask(&dev->dev, mask);
- }
--#ifdef CONFIG_HOTPLUG
--EXPORT_SYMBOL(pcibios_resource_to_bus);
--EXPORT_SYMBOL(pcibios_bus_to_resource);
--#endif
--
--/*
-- * We need to avoid collisions with `mirrored' VGA ports
-- * and other strange ISA hardware, so we always want the
-- * addresses to be allocated in the 0x000-0x0ff region
-- * modulo 0x400.
-- *
-- * Why? Because some silly external IO cards only decode
-- * the low 10 bits of the IO address. The 0x00-0xff region
-- * is reserved for motherboard devices that decode all 16
-- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-- * but we want to try to avoid allocating at 0x2900-0x2bff
-- * which might have be mirrored at 0x0100-0x03ff..
-- */
--void pcibios_align_resource(void *data, struct resource *res,
--                          resource_size_t size, resource_size_t align)
-+int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
- {
--      struct pci_dev *dev = data;
--      struct pci_controller *hose = pci_bus_to_host(dev->bus);
--      resource_size_t start = res->start;
--      unsigned long alignto;
--
--      if (res->flags & IORESOURCE_IO) {
--              unsigned long offset = (unsigned long)hose->io_base_virt -
--                                      _IO_BASE;
--              /* Make sure we start at our min on all hoses */
--              if (start - offset < PCIBIOS_MIN_IO)
--                      start = PCIBIOS_MIN_IO + offset;
--
--              /*
--               * Put everything into 0x00-0xff region modulo 0x400
--               */
--              if (start & 0x300)
--                      start = (start + 0x3ff) & ~0x3ff;
-+      int rc;
--      } else if (res->flags & IORESOURCE_MEM) {
--              /* Make sure we start at our min on all hoses */
--              if (start - hose->pci_mem_offset < PCIBIOS_MIN_MEM)
--                      start = PCIBIOS_MIN_MEM + hose->pci_mem_offset;
-+      rc = dma_set_mask(&dev->dev, mask);
-+      dev->dev.coherent_dma_mask = dev->dma_mask;
--              /* Align to multiple of size of minimum base.  */
--              alignto = max(0x1000UL, align);
--              start = ALIGN(start, alignto);
--      }
--
--      res->start = start;
-+      return rc;
- }
--void __devinit pcibios_claim_one_bus(struct pci_bus *b)
-+static void fixup_broken_pcnet32(struct pci_dev* dev)
- {
--      struct pci_dev *dev;
--      struct pci_bus *child_bus;
--
--      list_for_each_entry(dev, &b->devices, bus_list) {
--              int i;
--
--              for (i = 0; i < PCI_NUM_RESOURCES; i++) {
--                      struct resource *r = &dev->resource[i];
--
--                      if (r->parent || !r->start || !r->flags)
--                              continue;
--                      pci_claim_resource(dev, i);
--              }
-+      if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
-+              dev->vendor = PCI_VENDOR_ID_AMD;
-+              pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
-       }
--
--      list_for_each_entry(child_bus, &b->children, node)
--              pcibios_claim_one_bus(child_bus);
- }
--#ifdef CONFIG_HOTPLUG
--EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
--#endif
--
--static void __init pcibios_claim_of_setup(void)
--{
--      struct pci_bus *b;
--
--      if (firmware_has_feature(FW_FEATURE_ISERIES))
--              return;
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
--      list_for_each_entry(b, &pci_root_buses, node)
--              pcibios_claim_one_bus(b);
--}
- static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
- {
-@@ -270,7 +157,6 @@ static void pci_parse_of_addrs(struct de
-               res->end = base + size - 1;
-               res->flags = flags;
-               res->name = pci_name(dev);
--              fixup_resource(res, dev);
-       }
- }
-@@ -339,16 +225,17 @@ struct pci_dev *of_create_pci_dev(struct
- EXPORT_SYMBOL(of_create_pci_dev);
- void __devinit of_scan_bus(struct device_node *node,
--                                struct pci_bus *bus)
-+                         struct pci_bus *bus)
- {
--      struct device_node *child = NULL;
-+      struct device_node *child;
-       const u32 *reg;
-       int reglen, devfn;
-       struct pci_dev *dev;
-       DBG("of_scan_bus(%s) bus no %d... \n", node->full_name, bus->number);
--      while ((child = of_get_next_child(node, child)) != NULL) {
-+      /* Scan direct children */
-+      for_each_child_of_node(node, child) {
-               DBG("  * %s\n", child->full_name);
-               reg = of_get_property(child, "reg", &reglen);
-               if (reg == NULL || reglen < 20)
-@@ -359,19 +246,26 @@ void __devinit of_scan_bus(struct device
-               dev = of_create_pci_dev(child, bus, devfn);
-               if (!dev)
-                       continue;
--              DBG("dev header type: %x\n", dev->hdr_type);
-+              DBG("    dev header type: %x\n", dev->hdr_type);
-+      }
-+      /* Ally all fixups */
-+      pcibios_fixup_of_probed_bus(bus);
-+
-+      /* Now scan child busses */
-+      list_for_each_entry(dev, &bus->devices, bus_list) {
-               if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
--                  dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
--                      of_scan_pci_bridge(child, dev);
-+                  dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
-+                      struct device_node *child = pci_device_to_OF_node(dev);
-+                      if (dev)
-+                              of_scan_pci_bridge(child, dev);
-+              }
-       }
--
--      do_bus_setup(bus);
- }
- EXPORT_SYMBOL(of_scan_bus);
- void __devinit of_scan_pci_bridge(struct device_node *node,
--                              struct pci_dev *dev)
-+                                struct pci_dev *dev)
- {
-       struct pci_bus *bus;
-       const u32 *busrange, *ranges;
-@@ -441,7 +335,6 @@ void __devinit of_scan_pci_bridge(struct
-               res->start = of_read_number(&ranges[1], 2);
-               res->end = res->start + size - 1;
-               res->flags = flags;
--              fixup_resource(res, dev);
-       }
-       sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),
-               bus->number);
-@@ -462,12 +355,12 @@ EXPORT_SYMBOL(of_scan_pci_bridge);
- void __devinit scan_phb(struct pci_controller *hose)
- {
-       struct pci_bus *bus;
--      struct device_node *node = hose->arch_data;
-+      struct device_node *node = hose->dn;
-       int i, mode;
--      struct resource *res;
--      DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
-+      DBG("PCI: Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
-+      /* Create an empty bus for the toplevel */
-       bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
-       if (bus == NULL) {
-               printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
-@@ -477,27 +370,27 @@ void __devinit scan_phb(struct pci_contr
-       bus->secondary = hose->first_busno;
-       hose->bus = bus;
--      if (!firmware_has_feature(FW_FEATURE_ISERIES))
--              pcibios_map_io_space(bus);
--
--      bus->resource[0] = res = &hose->io_resource;
--      if (res->flags && request_resource(&ioport_resource, res)) {
--              printk(KERN_ERR "Failed to request PCI IO region "
--                     "on PCI domain %04x\n", hose->global_number);
--              DBG("res->start = 0x%016lx, res->end = 0x%016lx\n",
--                  res->start, res->end);
--      }
-+      /* Get some IO space for the new PHB */
-+      pcibios_map_io_space(bus);
-+      /* Wire up PHB bus resources */
-+      DBG("PCI: PHB IO resource    = %016lx-%016lx [%lx]\n",
-+          hose->io_resource.start, hose->io_resource.end,
-+          hose->io_resource.flags);
-+      bus->resource[0] = &hose->io_resource;
-       for (i = 0; i < 3; ++i) {
--              res = &hose->mem_resources[i];
--              bus->resource[i+1] = res;
--              if (res->flags && request_resource(&iomem_resource, res))
--                      printk(KERN_ERR "Failed to request PCI memory region "
--                             "on PCI domain %04x\n", hose->global_number);
--      }
-+              DBG("PCI: PHB MEM resource %d = %016lx-%016lx [%lx]\n", i,
-+                  hose->mem_resources[i].start,
-+                  hose->mem_resources[i].end,
-+                  hose->mem_resources[i].flags);
-+              bus->resource[i+1] = &hose->mem_resources[i];
-+      }
-+      DBG("PCI: PHB MEM offset     = %016lx\n", hose->pci_mem_offset);
-+      DBG("PCI: PHB IO  offset     = %08lx\n",
-+          (unsigned long)hose->io_base_virt - _IO_BASE);
-+      /* Get probe mode and perform scan */
-       mode = PCI_PROBE_NORMAL;
--
-       if (node && ppc_md.pci_probe_mode)
-               mode = ppc_md.pci_probe_mode(bus);
-       DBG("    probe mode: %d\n", mode);
-@@ -514,15 +407,15 @@ static int __init pcibios_init(void)
- {
-       struct pci_controller *hose, *tmp;
-+      printk(KERN_INFO "PCI: Probing PCI hardware\n");
-+
-       /* For now, override phys_mem_access_prot. If we need it,
-        * later, we may move that initialization to each ppc_md
-        */
-       ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
--      if (firmware_has_feature(FW_FEATURE_ISERIES))
--              iSeries_pcibios_init();
--
--      printk(KERN_DEBUG "PCI: Probing PCI hardware\n");
-+      if (pci_probe_only)
-+              ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
-       /* Scan all of the recorded PCI controllers.  */
-       list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
-@@ -530,19 +423,8 @@ static int __init pcibios_init(void)
-               pci_bus_add_devices(hose->bus);
-       }
--      if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
--              if (pci_probe_only)
--                      pcibios_claim_of_setup();
--              else
--                      /* FIXME: `else' will be removed when
--                         pci_assign_unassigned_resources() is able to work
--                         correctly with [partially] allocated PCI tree. */
--                      pci_assign_unassigned_resources();
--      }
--
--      /* Call machine dependent final fixup */
--      if (ppc_md.pcibios_fixup)
--              ppc_md.pcibios_fixup();
-+      /* Call common code to handle resource allocation */
-+      pcibios_resource_survey();
-       printk(KERN_DEBUG "PCI: Probing PCI hardware done\n");
-@@ -551,141 +433,6 @@ static int __init pcibios_init(void)
- subsys_initcall(pcibios_init);
--int pcibios_enable_device(struct pci_dev *dev, int mask)
--{
--      u16 cmd, oldcmd;
--      int i;
--
--      pci_read_config_word(dev, PCI_COMMAND, &cmd);
--      oldcmd = cmd;
--
--      for (i = 0; i < PCI_NUM_RESOURCES; i++) {
--              struct resource *res = &dev->resource[i];
--
--              /* Only set up the requested stuff */
--              if (!(mask & (1<<i)))
--                      continue;
--
--              if (res->flags & IORESOURCE_IO)
--                      cmd |= PCI_COMMAND_IO;
--              if (res->flags & IORESOURCE_MEM)
--                      cmd |= PCI_COMMAND_MEMORY;
--      }
--
--      if (cmd != oldcmd) {
--              printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",
--                     pci_name(dev), cmd);
--                /* Enable the appropriate bits in the PCI command register.  */
--              pci_write_config_word(dev, PCI_COMMAND, cmd);
--      }
--      return 0;
--}
--
--/* Decide whether to display the domain number in /proc */
--int pci_proc_domain(struct pci_bus *bus)
--{
--      if (firmware_has_feature(FW_FEATURE_ISERIES))
--              return 0;
--      else {
--              struct pci_controller *hose = pci_bus_to_host(bus);
--              return hose->buid != 0;
--      }
--}
--
--void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
--                                          struct device_node *dev, int prim)
--{
--      const unsigned int *ranges;
--      unsigned int pci_space;
--      unsigned long size;
--      int rlen = 0;
--      int memno = 0;
--      struct resource *res;
--      int np, na = of_n_addr_cells(dev);
--      unsigned long pci_addr, cpu_phys_addr;
--
--      np = na + 5;
--
--      /* From "PCI Binding to 1275"
--       * The ranges property is laid out as an array of elements,
--       * each of which comprises:
--       *   cells 0 - 2:       a PCI address
--       *   cells 3 or 3+4:    a CPU physical address
--       *                      (size depending on dev->n_addr_cells)
--       *   cells 4+5 or 5+6:  the size of the range
--       */
--      ranges = of_get_property(dev, "ranges", &rlen);
--      if (ranges == NULL)
--              return;
--      hose->io_base_phys = 0;
--      while ((rlen -= np * sizeof(unsigned int)) >= 0) {
--              res = NULL;
--              pci_space = ranges[0];
--              pci_addr = ((unsigned long)ranges[1] << 32) | ranges[2];
--              cpu_phys_addr = of_translate_address(dev, &ranges[3]);
--              size = ((unsigned long)ranges[na+3] << 32) | ranges[na+4];
--              ranges += np;
--              if (size == 0)
--                      continue;
--
--              /* Now consume following elements while they are contiguous */
--              while (rlen >= np * sizeof(unsigned int)) {
--                      unsigned long addr, phys;
--
--                      if (ranges[0] != pci_space)
--                              break;
--                      addr = ((unsigned long)ranges[1] << 32) | ranges[2];
--                      phys = ranges[3];
--                      if (na >= 2)
--                              phys = (phys << 32) | ranges[4];
--                      if (addr != pci_addr + size ||
--                          phys != cpu_phys_addr + size)
--                              break;
--
--                      size += ((unsigned long)ranges[na+3] << 32)
--                              | ranges[na+4];
--                      ranges += np;
--                      rlen -= np * sizeof(unsigned int);
--              }
--
--              switch ((pci_space >> 24) & 0x3) {
--              case 1:         /* I/O space */
--                      hose->io_base_phys = cpu_phys_addr - pci_addr;
--                      /* handle from 0 to top of I/O window */
--                      hose->pci_io_size = pci_addr + size;
--
--                      res = &hose->io_resource;
--                      res->flags = IORESOURCE_IO;
--                      res->start = pci_addr;
--                      DBG("phb%d: IO 0x%lx -> 0x%lx\n", hose->global_number,
--                                  res->start, res->start + size - 1);
--                      break;
--              case 2:         /* memory space */
--                      memno = 0;
--                      while (memno < 3 && hose->mem_resources[memno].flags)
--                              ++memno;
--
--                      if (memno == 0)
--                              hose->pci_mem_offset = cpu_phys_addr - pci_addr;
--                      if (memno < 3) {
--                              res = &hose->mem_resources[memno];
--                              res->flags = IORESOURCE_MEM;
--                              res->start = cpu_phys_addr;
--                              DBG("phb%d: MEM 0x%lx -> 0x%lx\n", hose->global_number,
--                                          res->start, res->start + size - 1);
--                      }
--                      break;
--              }
--              if (res != NULL) {
--                      res->name = dev->full_name;
--                      res->end = res->start + size - 1;
--                      res->parent = NULL;
--                      res->sibling = NULL;
--                      res->child = NULL;
--              }
--      }
--}
--
- #ifdef CONFIG_HOTPLUG
- int pcibios_unmap_io_space(struct pci_bus *bus)
-@@ -719,8 +466,7 @@ int pcibios_unmap_io_space(struct pci_bu
-       if (hose->io_base_alloc == 0)
-               return 0;
--      DBG("IO unmapping for PHB %s\n",
--          ((struct device_node *)hose->arch_data)->full_name);
-+      DBG("IO unmapping for PHB %s\n", hose->dn->full_name);
-       DBG("  alloc=0x%p\n", hose->io_base_alloc);
-       /* This is a PHB, we fully unmap the IO area */
-@@ -779,8 +525,7 @@ int __devinit pcibios_map_io_space(struc
-       hose->io_base_virt = (void __iomem *)(area->addr +
-                                             hose->io_base_phys - phys_page);
--      DBG("IO mapping for PHB %s\n",
--          ((struct device_node *)hose->arch_data)->full_name);
-+      DBG("IO mapping for PHB %s\n", hose->dn->full_name);
-       DBG("  phys=0x%016lx, virt=0x%p (alloc=0x%p)\n",
-           hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc);
-       DBG("  size=0x%016lx (alloc=0x%016lx)\n",
-@@ -803,51 +548,13 @@ int __devinit pcibios_map_io_space(struc
- }
- EXPORT_SYMBOL_GPL(pcibios_map_io_space);
--static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
--{
--      struct pci_controller *hose = pci_bus_to_host(dev->bus);
--      unsigned long offset;
--
--      if (res->flags & IORESOURCE_IO) {
--              offset = (unsigned long)hose->io_base_virt - _IO_BASE;
--              res->start += offset;
--              res->end += offset;
--      } else if (res->flags & IORESOURCE_MEM) {
--              res->start += hose->pci_mem_offset;
--              res->end += hose->pci_mem_offset;
--      }
--}
--
--void __devinit pcibios_fixup_device_resources(struct pci_dev *dev,
--                                            struct pci_bus *bus)
--{
--      /* Update device resources.  */
--      int i;
--
--      DBG("%s: Fixup resources:\n", pci_name(dev));
--      for (i = 0; i < PCI_NUM_RESOURCES; i++) {
--              struct resource *res = &dev->resource[i];
--              if (!res->flags)
--                      continue;
--
--              DBG("  0x%02x < %08lx:0x%016lx...0x%016lx\n",
--                  i, res->flags, res->start, res->end);
--
--              fixup_resource(res, dev);
--
--              DBG("       > %08lx:0x%016lx...0x%016lx\n",
--                  res->flags, res->start, res->end);
--      }
--}
--EXPORT_SYMBOL(pcibios_fixup_device_resources);
--
- void __devinit pcibios_setup_new_device(struct pci_dev *dev)
- {
-       struct dev_archdata *sd = &dev->dev.archdata;
-       sd->of_node = pci_device_to_OF_node(dev);
--      DBG("PCI device %s OF node: %s\n", pci_name(dev),
-+      DBG("PCI: device %s OF node: %s\n", pci_name(dev),
-           sd->of_node ? sd->of_node->full_name : "<none>");
-       sd->dma_ops = pci_dma_ops;
-@@ -861,7 +568,7 @@ void __devinit pcibios_setup_new_device(
- }
- EXPORT_SYMBOL(pcibios_setup_new_device);
--static void __devinit do_bus_setup(struct pci_bus *bus)
-+void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
- {
-       struct pci_dev *dev;
-@@ -870,42 +577,7 @@ static void __devinit do_bus_setup(struc
-       list_for_each_entry(dev, &bus->devices, bus_list)
-               pcibios_setup_new_device(dev);
--
--      /* Read default IRQs and fixup if necessary */
--      list_for_each_entry(dev, &bus->devices, bus_list) {
--              pci_read_irq_line(dev);
--              if (ppc_md.pci_irq_fixup)
--                      ppc_md.pci_irq_fixup(dev);
--      }
--}
--
--void __devinit pcibios_fixup_bus(struct pci_bus *bus)
--{
--      struct pci_dev *dev = bus->self;
--      struct device_node *np;
--
--      np = pci_bus_to_OF_node(bus);
--
--      DBG("pcibios_fixup_bus(%s)\n", np ? np->full_name : "<???>");
--
--      if (dev && pci_probe_only &&
--          (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
--              /* This is a subordinate bridge */
--
--              pci_read_bridge_bases(bus);
--              pcibios_fixup_device_resources(dev, bus);
--      }
--
--      do_bus_setup(bus);
--
--      if (!pci_probe_only)
--              return;
--
--      list_for_each_entry(dev, &bus->devices, bus_list)
--              if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
--                      pcibios_fixup_device_resources(dev, bus);
- }
--EXPORT_SYMBOL(pcibios_fixup_bus);
- unsigned long pci_address_to_pio(phys_addr_t address)
- {
---- a/arch/powerpc/kernel/pci_dn.c
-+++ b/arch/powerpc/kernel/pci_dn.c
-@@ -56,11 +56,6 @@ static void * __devinit update_dn_pci_in
-               pdn->busno = (regs[0] >> 16) & 0xff;
-               pdn->devfn = (regs[0] >> 8) & 0xff;
-       }
--      if (firmware_has_feature(FW_FEATURE_ISERIES)) {
--              const u32 *busp = of_get_property(dn, "linux,subbus", NULL);
--              if (busp)
--                      pdn->bussubno = *busp;
--      }
-       pdn->pci_ext_config_space = (type && *type == 1);
-       return NULL;
-@@ -133,7 +128,7 @@ void *traverse_pci_devices(struct device
-  */
- void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
- {
--      struct device_node * dn = (struct device_node *) phb->arch_data;
-+      struct device_node *dn = phb->dn;
-       struct pci_dn *pdn;
-       /* PHB nodes themselves must not match */
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -59,6 +59,7 @@ extern void single_step_exception(struct
- extern int sys_sigreturn(struct pt_regs *regs);
- EXPORT_SYMBOL(clear_pages);
-+EXPORT_SYMBOL(copy_page);
- EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
- EXPORT_SYMBOL(DMA_MODE_READ);
- EXPORT_SYMBOL(DMA_MODE_WRITE);
---- a/arch/powerpc/kernel/prom.c
-+++ b/arch/powerpc/kernel/prom.c
-@@ -583,6 +583,20 @@ static void __init check_cpu_pa_features
-                     ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
- }
-+#ifdef CONFIG_PPC64
-+static void __init check_cpu_slb_size(unsigned long node)
-+{
-+      u32 *slb_size_ptr;
-+
-+      slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
-+      if (slb_size_ptr != NULL) {
-+              mmu_slb_size = *slb_size_ptr;
-+      }
-+}
-+#else
-+#define check_cpu_slb_size(node) do { } while(0)
-+#endif
-+
- static struct feature_property {
-       const char *name;
-       u32 min_value;
-@@ -600,6 +614,29 @@ static struct feature_property {
- #endif /* CONFIG_PPC64 */
- };
-+#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
-+static inline void identical_pvr_fixup(unsigned long node)
-+{
-+      unsigned int pvr;
-+      char *model = of_get_flat_dt_prop(node, "model", NULL);
-+
-+      /*
-+       * Since 440GR(x)/440EP(x) processors have the same pvr,
-+       * we check the node path and set bit 28 in the cur_cpu_spec
-+       * pvr for EP(x) processor version. This bit is always 0 in
-+       * the "real" pvr. Then we call identify_cpu again with
-+       * the new logical pvr to enable FPU support.
-+       */
-+      if (model && strstr(model, "440EP")) {
-+              pvr = cur_cpu_spec->pvr_value | 0x8;
-+              identify_cpu(0, pvr);
-+              DBG("Using logical pvr %x for %s\n", pvr, model);
-+      }
-+}
-+#else
-+#define identical_pvr_fixup(node) do { } while(0)
-+#endif
-+
- static void __init check_cpu_feature_properties(unsigned long node)
- {
-       unsigned long i;
-@@ -697,22 +734,13 @@ static int __init early_init_dt_scan_cpu
-               prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
-               if (prop && (*prop & 0xff000000) == 0x0f000000)
-                       identify_cpu(0, *prop);
--#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
--              /*
--               * Since 440GR(x)/440EP(x) processors have the same pvr,
--               * we check the node path and set bit 28 in the cur_cpu_spec
--               * pvr for EP(x) processor version. This bit is always 0 in
--               * the "real" pvr. Then we call identify_cpu again with
--               * the new logical pvr to enable FPU support.
--               */
--              if (strstr(uname, "440EP")) {
--                      identify_cpu(0, cur_cpu_spec->pvr_value | 0x8);
--              }
--#endif
-+
-+              identical_pvr_fixup(node);
-       }
-       check_cpu_feature_properties(node);
-       check_cpu_pa_features(node);
-+      check_cpu_slb_size(node);
- #ifdef CONFIG_PPC_PSERIES
-       if (nthreads > 1)
---- a/arch/powerpc/kernel/prom_parse.c
-+++ b/arch/powerpc/kernel/prom_parse.c
-@@ -273,7 +273,7 @@ int of_irq_map_pci(struct pci_dev *pdev,
- #else
-                       struct pci_controller *host;
-                       host = pci_bus_to_host(pdev->bus);
--                      ppnode = host ? host->arch_data : NULL;
-+                      ppnode = host ? host->dn : NULL;
- #endif
-                       /* No node for host bridge ? give up */
-                       if (ppnode == NULL)
-@@ -419,7 +419,7 @@ static struct of_bus *of_match_bus(struc
- static int of_translate_one(struct device_node *parent, struct of_bus *bus,
-                           struct of_bus *pbus, u32 *addr,
--                          int na, int ns, int pna)
-+                          int na, int ns, int pna, const char *rprop)
- {
-       const u32 *ranges;
-       unsigned int rlen;
-@@ -438,7 +438,7 @@ static int of_translate_one(struct devic
-        * to translate addresses that aren't supposed to be translated in
-        * the first place. --BenH.
-        */
--      ranges = of_get_property(parent, "ranges", &rlen);
-+      ranges = of_get_property(parent, rprop, &rlen);
-       if (ranges == NULL || rlen == 0) {
-               offset = of_read_number(addr, na);
-               memset(addr, 0, pna * 4);
-@@ -481,7 +481,8 @@ static int of_translate_one(struct devic
-  * that can be mapped to a cpu physical address). This is not really specified
-  * that way, but this is traditionally the way IBM at least do things
-  */
--u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-+u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,
-+                         const char *rprop)
- {
-       struct device_node *parent = NULL;
-       struct of_bus *bus, *pbus;
-@@ -540,7 +541,7 @@ u64 of_translate_address(struct device_n
-                   pbus->name, pna, pns, parent->full_name);
-               /* Apply bus translation */
--              if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
-+              if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
-                       break;
-               /* Complete the move up one level */
-@@ -556,8 +557,19 @@ u64 of_translate_address(struct device_n
-       return result;
- }
-+
-+u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-+{
-+      return __of_translate_address(dev, in_addr, "ranges");
-+}
- EXPORT_SYMBOL(of_translate_address);
-+u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr)
-+{
-+      return __of_translate_address(dev, in_addr, "dma-ranges");
-+}
-+EXPORT_SYMBOL(of_translate_dma_address);
-+
- const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
-                   unsigned int *flags)
- {
---- /dev/null
-+++ b/arch/powerpc/kernel/rio.c
-@@ -0,0 +1,52 @@
-+/*
-+ * RapidIO PPC32 support
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/rio.h>
-+
-+#include <asm/rio.h>
-+
-+/**
-+ * platform_rio_init - Do platform specific RIO init
-+ *
-+ * Any platform specific initialization of RapdIO
-+ * hardware is done here as well as registration
-+ * of any active master ports in the system.
-+ */
-+void __attribute__ ((weak))
-+    platform_rio_init(void)
-+{
-+      printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
-+}
-+
-+/**
-+ * ppc_rio_init - Do PPC32 RIO init
-+ *
-+ * Calls platform-specific RIO init code and then calls
-+ * rio_init_mports() to initialize any master ports that
-+ * have been registered with the RIO subsystem.
-+ */
-+static int __init ppc_rio_init(void)
-+{
-+      printk(KERN_INFO "RIO: RapidIO init\n");
-+
-+      /* Platform specific initialization */
-+      platform_rio_init();
-+
-+      /* Enumerate all registered ports */
-+      rio_init_mports();
-+
-+      return 0;
-+}
-+
-+subsys_initcall(ppc_rio_init);
---- a/arch/powerpc/kernel/rtas_pci.c
-+++ b/arch/powerpc/kernel/rtas_pci.c
-@@ -260,7 +260,7 @@ static int phb_set_bus_ranges(struct dev
- int __devinit rtas_setup_phb(struct pci_controller *phb)
- {
--      struct device_node *dev = phb->arch_data;
-+      struct device_node *dev = phb->dn;
-       if (is_python(dev))
-               python_countermeasures(dev);
-@@ -280,10 +280,7 @@ void __init find_and_init_phbs(void)
-       struct pci_controller *phb;
-       struct device_node *root = of_find_node_by_path("/");
--      for (node = of_get_next_child(root, NULL);
--           node != NULL;
--           node = of_get_next_child(root, node)) {
--
-+      for_each_child_of_node(root, node) {
-               if (node->type == NULL || (strcmp(node->type, "pci") != 0 &&
-                                          strcmp(node->type, "pciex") != 0))
-                       continue;
-@@ -311,10 +308,12 @@ void __init find_and_init_phbs(void)
-               if (prop)
-                       pci_probe_only = *prop;
-+#ifdef CONFIG_PPC32 /* Will be made generic soon */
-               prop = of_get_property(of_chosen,
-                               "linux,pci-assign-all-buses", NULL);
--              if (prop)
--                      pci_assign_all_buses = *prop;
-+              if (prop && *prop)
-+                      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-+#endif /* CONFIG_PPC32 */
-       }
- }
---- a/arch/powerpc/kernel/setup-common.c
-+++ b/arch/powerpc/kernel/setup-common.c
-@@ -33,6 +33,7 @@
- #include <linux/serial.h>
- #include <linux/serial_8250.h>
- #include <linux/debugfs.h>
-+#include <linux/percpu.h>
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/processor.h>
-@@ -57,6 +58,7 @@
- #include <asm/mmu.h>
- #include <asm/lmb.h>
- #include <asm/xmon.h>
-+#include <asm/cputhreads.h>
- #include "setup.h"
-@@ -327,6 +329,31 @@ void __init check_for_initrd(void)
- #ifdef CONFIG_SMP
-+int threads_per_core, threads_shift;
-+cpumask_t threads_core_mask;
-+
-+static void __init cpu_init_thread_core_maps(int tpc)
-+{
-+      int i;
-+
-+      threads_per_core = tpc;
-+      threads_core_mask = CPU_MASK_NONE;
-+
-+      /* This implementation only supports power of 2 number of threads
-+       * for simplicity and performance
-+       */
-+      threads_shift = ilog2(tpc);
-+      BUG_ON(tpc != (1 << threads_shift));
-+
-+      for (i = 0; i < tpc; i++)
-+              cpu_set(i, threads_core_mask);
-+
-+      printk(KERN_INFO "CPU maps initialized for %d thread%s per core\n",
-+             tpc, tpc > 1 ? "s" : "");
-+      printk(KERN_DEBUG " (thread shift is %d)\n", threads_shift);
-+}
-+
-+
- /**
-  * setup_cpu_maps - initialize the following cpu maps:
-  *                  cpu_possible_map
-@@ -350,22 +377,32 @@ void __init smp_setup_cpu_maps(void)
- {
-       struct device_node *dn = NULL;
-       int cpu = 0;
-+      int nthreads = 1;
-+
-+      DBG("smp_setup_cpu_maps()\n");
-       while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
-               const int *intserv;
--              int j, len = sizeof(u32), nthreads = 1;
-+              int j, len;
-+
-+              DBG("  * %s...\n", dn->full_name);
-               intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s",
-                               &len);
--              if (intserv)
-+              if (intserv) {
-                       nthreads = len / sizeof(int);
--              else {
-+                      DBG("    ibm,ppc-interrupt-server#s -> %d threads\n",
-+                          nthreads);
-+              } else {
-+                      DBG("    no ibm,ppc-interrupt-server#s -> 1 thread\n");
-                       intserv = of_get_property(dn, "reg", NULL);
-                       if (!intserv)
-                               intserv = &cpu; /* assume logical == phys */
-               }
-               for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
-+                      DBG("    thread %d -> cpu %d (hard id %d)\n",
-+                          j, cpu, intserv[j]);
-                       cpu_set(cpu, cpu_present_map);
-                       set_hard_smp_processor_id(cpu, intserv[j]);
-                       cpu_set(cpu, cpu_possible_map);
-@@ -373,6 +410,12 @@ void __init smp_setup_cpu_maps(void)
-               }
-       }
-+      /* If no SMT supported, nthreads is forced to 1 */
-+      if (!cpu_has_feature(CPU_FTR_SMT)) {
-+              DBG("  SMT disabled ! nthreads forced to 1\n");
-+              nthreads = 1;
-+      }
-+
- #ifdef CONFIG_PPC64
-       /*
-        * On pSeries LPAR, we need to know how many cpus
-@@ -395,7 +438,7 @@ void __init smp_setup_cpu_maps(void)
-               /* Double maxcpus for processors which have SMT capability */
-               if (cpu_has_feature(CPU_FTR_SMT))
--                      maxcpus *= 2;
-+                      maxcpus *= nthreads;
-               if (maxcpus > NR_CPUS) {
-                       printk(KERN_WARNING
-@@ -412,9 +455,16 @@ void __init smp_setup_cpu_maps(void)
-       out:
-               of_node_put(dn);
-       }
--
-       vdso_data->processorCount = num_present_cpus();
- #endif /* CONFIG_PPC64 */
-+
-+        /* Initialize CPU <=> thread mapping/
-+       *
-+       * WARNING: We assume that the number of threads is the same for
-+       * every CPU in the system. If that is not the case, then some code
-+       * here will have to be reworked
-+       */
-+      cpu_init_thread_core_maps(nthreads);
- }
- /*
-@@ -424,17 +474,19 @@ void __init smp_setup_cpu_maps(void)
-  */
- void __init smp_setup_cpu_sibling_map(void)
- {
--#if defined(CONFIG_PPC64)
--      int cpu;
-+#ifdef CONFIG_PPC64
-+      int i, cpu, base;
--      /*
--       * Do the sibling map; assume only two threads per processor.
--       */
-       for_each_possible_cpu(cpu) {
--              cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
--              if (cpu_has_feature(CPU_FTR_SMT))
--                      cpu_set(cpu ^ 0x1, per_cpu(cpu_sibling_map, cpu));
-+              DBG("Sibling map for CPU %d:", cpu);
-+              base = cpu_first_thread_in_core(cpu);
-+              for (i = 0; i < threads_per_core; i++) {
-+                      cpu_set(base + i, per_cpu(cpu_sibling_map, cpu));
-+                      DBG(" %d", base + i);
-+              }
-+              DBG("\n");
-       }
-+
- #endif /* CONFIG_PPC64 */
- }
- #endif /* CONFIG_SMP */
---- a/arch/powerpc/kernel/signal_32.c
-+++ b/arch/powerpc/kernel/signal_32.c
-@@ -24,13 +24,12 @@
- #include <linux/signal.h>
- #include <linux/errno.h>
- #include <linux/elf.h>
-+#include <linux/ptrace.h>
- #ifdef CONFIG_PPC64
- #include <linux/syscalls.h>
- #include <linux/compat.h>
--#include <linux/ptrace.h>
- #else
- #include <linux/wait.h>
--#include <linux/ptrace.h>
- #include <linux/unistd.h>
- #include <linux/stddef.h>
- #include <linux/tty.h>
---- a/arch/powerpc/kernel/smp.c
-+++ b/arch/powerpc/kernel/smp.c
-@@ -76,6 +76,8 @@ void smp_call_function_interrupt(void);
- int smt_enabled_at_boot = 1;
-+static int ipi_fail_ok;
-+
- static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
- #ifdef CONFIG_PPC64
-@@ -181,12 +183,13 @@ static struct call_data_struct {
-  * <wait> If true, wait (atomically) until function has completed on other CPUs.
-  * [RETURNS] 0 on success, else a negative status code. Does not return until
-  * remote CPUs are nearly ready to execute <<func>> or are or have executed.
-+ * <map> is a cpu map of the cpus to send IPI to.
-  *
-  * You must not call this function with disabled interrupts or from a
-  * hardware interrupt handler or from a bottom half handler.
-  */
--int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
--                      int wait, cpumask_t map)
-+static int __smp_call_function_map(void (*func) (void *info), void *info,
-+                                 int nonatomic, int wait, cpumask_t map)
- {
-       struct call_data_struct data;
-       int ret = -1, num_cpus;
-@@ -203,8 +206,6 @@ int smp_call_function_map(void (*func) (
-       if (wait)
-               atomic_set(&data.finished, 0);
--      spin_lock(&call_lock);
--
-       /* remove 'self' from the map */
-       if (cpu_isset(smp_processor_id(), map))
-               cpu_clear(smp_processor_id(), map);
-@@ -231,7 +232,8 @@ int smp_call_function_map(void (*func) (
-                       printk("smp_call_function on cpu %d: other cpus not "
-                               "responding (%d)\n", smp_processor_id(),
-                               atomic_read(&data.started));
--                      debugger(NULL);
-+                      if (!ipi_fail_ok)
-+                              debugger(NULL);
-                       goto out;
-               }
-       }
-@@ -258,14 +260,18 @@ int smp_call_function_map(void (*func) (
-  out:
-       call_data = NULL;
-       HMT_medium();
--      spin_unlock(&call_lock);
-       return ret;
- }
- static int __smp_call_function(void (*func)(void *info), void *info,
-                              int nonatomic, int wait)
- {
--      return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
-+      int ret;
-+      spin_lock(&call_lock);
-+      ret =__smp_call_function_map(func, info, nonatomic, wait,
-+                                     cpu_online_map);
-+      spin_unlock(&call_lock);
-+      return ret;
- }
- int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
-@@ -278,8 +284,8 @@ int smp_call_function(void (*func) (void
- }
- EXPORT_SYMBOL(smp_call_function);
--int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int nonatomic,
--                      int wait)
-+int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
-+                           int nonatomic, int wait)
- {
-       cpumask_t map = CPU_MASK_NONE;
-       int ret = 0;
-@@ -291,9 +297,11 @@ int smp_call_function_single(int cpu, vo
-               return -EINVAL;
-       cpu_set(cpu, map);
--      if (cpu != get_cpu())
--              ret = smp_call_function_map(func,info,nonatomic,wait,map);
--      else {
-+      if (cpu != get_cpu()) {
-+              spin_lock(&call_lock);
-+              ret = __smp_call_function_map(func, info, nonatomic, wait, map);
-+              spin_unlock(&call_lock);
-+      } else {
-               local_irq_disable();
-               func(info);
-               local_irq_enable();
-@@ -305,7 +313,22 @@ EXPORT_SYMBOL(smp_call_function_single);
- void smp_send_stop(void)
- {
--      __smp_call_function(stop_this_cpu, NULL, 1, 0);
-+      int nolock;
-+
-+      /* It's OK to fail sending the IPI, since the alternative is to
-+       * be stuck forever waiting on the other CPU to take the interrupt.
-+       *
-+       * It's better to at least continue and go through reboot, since this
-+       * function is usually called at panic or reboot time in the first
-+       * place.
-+       */
-+      ipi_fail_ok = 1;
-+
-+      /* Don't deadlock in case we got called through panic */
-+      nolock = !spin_trylock(&call_lock);
-+      __smp_call_function_map(stop_this_cpu, NULL, 1, 0, cpu_online_map);
-+      if (!nolock)
-+              spin_unlock(&call_lock);
- }
- void smp_call_function_interrupt(void)
---- /dev/null
-+++ b/arch/powerpc/kernel/systbl_chk.c
-@@ -0,0 +1,58 @@
-+/*
-+ * This file, when run through CPP produces a list of syscall numbers
-+ * in the order of systbl.h.  That way we can check for gaps and syscalls
-+ * that are out of order.
-+ *
-+ * Unfortunately, we cannot check for the correct ordering of entries
-+ * using SYSX().
-+ *
-+ * Copyright Â© IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ */
-+#include <asm/unistd.h>
-+
-+#define SYSCALL(func)         __NR_##func
-+#define COMPAT_SYS(func)      __NR_##func
-+#define PPC_SYS(func)         __NR_##func
-+#ifdef CONFIG_PPC64
-+#define OLDSYS(func)          -1
-+#define SYS32ONLY(func)               -1
-+#else
-+#define OLDSYS(func)          __NR_old##func
-+#define SYS32ONLY(func)               __NR_##func
-+#endif
-+#define SYSX(f, f3264, f32)   -1
-+
-+#define SYSCALL_SPU(func)     SYSCALL(func)
-+#define COMPAT_SYS_SPU(func)  COMPAT_SYS(func)
-+#define PPC_SYS_SPU(func)     PPC_SYS(func)
-+#define SYSX_SPU(f, f3264, f32)       SYSX(f, f3264, f32)
-+
-+/* Just insert a marker for ni_syscalls */
-+#define       __NR_ni_syscall         -1
-+
-+/*
-+ * These are the known exceptions.
-+ * Hopefully, there will be no more.
-+ */
-+#define       __NR_llseek             __NR__llseek
-+#undef        __NR_umount
-+#define       __NR_umount             __NR_umount2
-+#define       __NR_old_getrlimit      __NR_getrlimit
-+#define       __NR_newstat            __NR_stat
-+#define       __NR_newlstat           __NR_lstat
-+#define       __NR_newfstat           __NR_fstat
-+#define       __NR_newuname           __NR_uname
-+#define       __NR_sysctl             __NR__sysctl
-+#define __NR_olddebug_setcontext      __NR_sys_debug_setcontext
-+
-+/* We call sys_ugetrlimit for syscall number __NR_getrlimit */
-+#define getrlimit             ugetrlimit
-+
-+START_TABLE
-+#include <asm/systbl.h>
-+END_TABLE __NR_syscalls
---- /dev/null
-+++ b/arch/powerpc/kernel/systbl_chk.sh
-@@ -0,0 +1,33 @@
-+#!/bin/sh
-+#
-+# Just process the CPP output from systbl_chk.c and complain
-+# if anything is out of order.
-+#
-+# Copyright Â© 2008 IBM Corporation
-+#
-+# This 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.
-+
-+awk   'BEGIN { num = -1; }    # Ignore the beginning of the file
-+      /^#/ { next; }
-+      /^[ \t]*$/ { next; }
-+      /^START_TABLE/ { num = 0; next; }
-+      /^END_TABLE/ {
-+              if (num != $2) {
-+                      printf "__NR_syscalls (%s) is not one more than the last syscall (%s)\n",
-+                              $2, num - 1;
-+                      exit(1);
-+              }
-+              num = -1;       # Ignore the rest of the file
-+      }
-+      {
-+              if (num == -1) next;
-+              if (($1 != -1) && ($1 != num)) {
-+                      printf "Syscall %s out of order (expected %s)\n",
-+                              $1, num;
-+                      exit(1);
-+              };
-+              num++;
-+      }' "$1"
---- a/arch/powerpc/kernel/time.c
-+++ b/arch/powerpc/kernel/time.c
-@@ -116,9 +116,12 @@ static struct clock_event_device decreme
-        .features       = CLOCK_EVT_FEAT_ONESHOT,
- };
--static DEFINE_PER_CPU(struct clock_event_device, decrementers);
--void init_decrementer_clockevent(void);
--static DEFINE_PER_CPU(u64, decrementer_next_tb);
-+struct decrementer_clock {
-+      struct clock_event_device event;
-+      u64 next_tb;
-+};
-+
-+static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
- #ifdef CONFIG_PPC_ISERIES
- static unsigned long __initdata iSeries_recal_titan;
-@@ -216,7 +219,11 @@ static u64 read_purr(void)
-  */
- static u64 read_spurr(u64 purr)
- {
--      if (cpu_has_feature(CPU_FTR_SPURR))
-+      /*
-+       * cpus without PURR won't have a SPURR
-+       * We already know the former when we use this, so tell gcc
-+       */
-+      if (cpu_has_feature(CPU_FTR_PURR) && cpu_has_feature(CPU_FTR_SPURR))
-               return mfspr(SPRN_SPURR);
-       return purr;
- }
-@@ -227,29 +234,30 @@ static u64 read_spurr(u64 purr)
-  */
- void account_system_vtime(struct task_struct *tsk)
- {
--      u64 now, nowscaled, delta, deltascaled;
-+      u64 now, nowscaled, delta, deltascaled, sys_time;
-       unsigned long flags;
-       local_irq_save(flags);
-       now = read_purr();
--      delta = now - get_paca()->startpurr;
--      get_paca()->startpurr = now;
-       nowscaled = read_spurr(now);
-+      delta = now - get_paca()->startpurr;
-       deltascaled = nowscaled - get_paca()->startspurr;
-+      get_paca()->startpurr = now;
-       get_paca()->startspurr = nowscaled;
-       if (!in_interrupt()) {
-               /* deltascaled includes both user and system time.
-                * Hence scale it based on the purr ratio to estimate
-                * the system time */
-+              sys_time = get_paca()->system_time;
-               if (get_paca()->user_time)
--                      deltascaled = deltascaled * get_paca()->system_time /
--                           (get_paca()->system_time + get_paca()->user_time);
--              delta += get_paca()->system_time;
-+                      deltascaled = deltascaled * sys_time /
-+                           (sys_time + get_paca()->user_time);
-+              delta += sys_time;
-               get_paca()->system_time = 0;
-       }
-       account_system_time(tsk, 0, delta);
--      get_paca()->purrdelta = delta;
-       account_system_time_scaled(tsk, deltascaled);
-+      get_paca()->purrdelta = delta;
-       get_paca()->spurrdelta = deltascaled;
-       local_irq_restore(flags);
- }
-@@ -326,11 +334,9 @@ void calculate_steal_time(void)
-       s64 stolen;
-       struct cpu_purr_data *pme;
--      if (!cpu_has_feature(CPU_FTR_PURR))
--              return;
--      pme = &per_cpu(cpu_purr_data, smp_processor_id());
-+      pme = &__get_cpu_var(cpu_purr_data);
-       if (!pme->initialized)
--              return;         /* this can happen in early boot */
-+              return;         /* !CPU_FTR_PURR or early in early boot */
-       tb = mftb();
-       purr = mfspr(SPRN_PURR);
-       stolen = (tb - pme->tb) - (purr - pme->purr);
-@@ -353,7 +359,7 @@ static void snapshot_purr(void)
-       if (!cpu_has_feature(CPU_FTR_PURR))
-               return;
-       local_irq_save(flags);
--      pme = &per_cpu(cpu_purr_data, smp_processor_id());
-+      pme = &__get_cpu_var(cpu_purr_data);
-       pme->tb = mftb();
-       pme->purr = mfspr(SPRN_PURR);
-       pme->initialized = 1;
-@@ -556,8 +562,8 @@ void __init iSeries_time_init_early(void
- void timer_interrupt(struct pt_regs * regs)
- {
-       struct pt_regs *old_regs;
--      int cpu = smp_processor_id();
--      struct clock_event_device *evt = &per_cpu(decrementers, cpu);
-+      struct decrementer_clock *decrementer =  &__get_cpu_var(decrementers);
-+      struct clock_event_device *evt = &decrementer->event;
-       u64 now;
-       /* Ensure a positive value is written to the decrementer, or else
-@@ -570,9 +576,9 @@ void timer_interrupt(struct pt_regs * re
- #endif
-       now = get_tb_or_rtc();
--      if (now < per_cpu(decrementer_next_tb, cpu)) {
-+      if (now < decrementer->next_tb) {
-               /* not time for this event yet */
--              now = per_cpu(decrementer_next_tb, cpu) - now;
-+              now = decrementer->next_tb - now;
-               if (now <= DECREMENTER_MAX)
-                       set_dec((int)now);
-               return;
-@@ -623,6 +629,45 @@ void wakeup_decrementer(void)
-       set_dec(ticks);
- }
-+#ifdef CONFIG_SUSPEND
-+void generic_suspend_disable_irqs(void)
-+{
-+      preempt_disable();
-+
-+      /* Disable the decrementer, so that it doesn't interfere
-+       * with suspending.
-+       */
-+
-+      set_dec(0x7fffffff);
-+      local_irq_disable();
-+      set_dec(0x7fffffff);
-+}
-+
-+void generic_suspend_enable_irqs(void)
-+{
-+      wakeup_decrementer();
-+
-+      local_irq_enable();
-+      preempt_enable();
-+}
-+
-+/* Overrides the weak version in kernel/power/main.c */
-+void arch_suspend_disable_irqs(void)
-+{
-+      if (ppc_md.suspend_disable_irqs)
-+              ppc_md.suspend_disable_irqs();
-+      generic_suspend_disable_irqs();
-+}
-+
-+/* Overrides the weak version in kernel/power/main.c */
-+void arch_suspend_enable_irqs(void)
-+{
-+      generic_suspend_enable_irqs();
-+      if (ppc_md.suspend_enable_irqs)
-+              ppc_md.suspend_enable_irqs();
-+}
-+#endif
-+
- #ifdef CONFIG_SMP
- void __init smp_space_timers(unsigned int max_cpus)
- {
-@@ -811,7 +856,7 @@ void __init clocksource_init(void)
- static int decrementer_set_next_event(unsigned long evt,
-                                     struct clock_event_device *dev)
- {
--      __get_cpu_var(decrementer_next_tb) = get_tb_or_rtc() + evt;
-+      __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
-       set_dec(evt);
-       return 0;
- }
-@@ -825,7 +870,7 @@ static void decrementer_set_mode(enum cl
- static void register_decrementer_clockevent(int cpu)
- {
--      struct clock_event_device *dec = &per_cpu(decrementers, cpu);
-+      struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
-       *dec = decrementer_clockevent;
-       dec->cpumask = cpumask_of_cpu(cpu);
-@@ -836,7 +881,7 @@ static void register_decrementer_clockev
-       clockevents_register_device(dec);
- }
--void init_decrementer_clockevent(void)
-+static void __init init_decrementer_clockevent(void)
- {
-       int cpu = smp_processor_id();
---- a/arch/powerpc/kernel/traps.c
-+++ b/arch/powerpc/kernel/traps.c
-@@ -334,18 +334,25 @@ static inline int check_io_access(struct
- #define clear_single_step(regs)       ((regs)->msr &= ~MSR_SE)
- #endif
--static int generic_machine_check_exception(struct pt_regs *regs)
-+#if defined(CONFIG_4xx)
-+int machine_check_4xx(struct pt_regs *regs)
- {
-       unsigned long reason = get_mc_reason(regs);
--#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
-       if (reason & ESR_IMCP) {
-               printk("Instruction");
-               mtspr(SPRN_ESR, reason & ~ESR_IMCP);
-       } else
-               printk("Data");
-       printk(" machine check in kernel mode.\n");
--#elif defined(CONFIG_440A)
-+
-+      return 0;
-+}
-+
-+int machine_check_440A(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       if (reason & ESR_IMCP){
-               printk("Instruction Synchronous Machine Check exception\n");
-@@ -375,7 +382,13 @@ static int generic_machine_check_excepti
-               /* Clear MCSR */
-               mtspr(SPRN_MCSR, mcsr);
-       }
--#elif defined (CONFIG_E500)
-+      return 0;
-+}
-+#elif defined(CONFIG_E500)
-+int machine_check_e500(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from MCSR=%lx): ", reason);
-@@ -403,7 +416,14 @@ static int generic_machine_check_excepti
-               printk("Bus - Instruction Parity Error\n");
-       if (reason & MCSR_BUS_RPERR)
-               printk("Bus - Read Parity Error\n");
--#elif defined (CONFIG_E200)
-+
-+      return 0;
-+}
-+#elif defined(CONFIG_E200)
-+int machine_check_e200(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from MCSR=%lx): ", reason);
-@@ -421,7 +441,14 @@ static int generic_machine_check_excepti
-               printk("Bus - Read Bus Error on data load\n");
-       if (reason & MCSR_BUS_WRERR)
-               printk("Bus - Write Bus Error on buffered store or cache line push\n");
--#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
-+
-+      return 0;
-+}
-+#else
-+int machine_check_generic(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from SRR1=%lx): ", reason);
-       switch (reason & 0x601F0000) {
-@@ -451,22 +478,26 @@ static int generic_machine_check_excepti
-       default:
-               printk("Unknown values in msr\n");
-       }
--#endif /* CONFIG_4xx */
--
-       return 0;
- }
-+#endif /* everything else */
- void machine_check_exception(struct pt_regs *regs)
- {
-       int recover = 0;
--      /* See if any machine dependent calls */
-+      /* See if any machine dependent calls. In theory, we would want
-+       * to call the CPU first, and call the ppc_md. one if the CPU
-+       * one returns a positive number. However there is existing code
-+       * that assumes the board gets a first chance, so let's keep it
-+       * that way for now and fix things later. --BenH.
-+       */
-       if (ppc_md.machine_check_exception)
-               recover = ppc_md.machine_check_exception(regs);
--      else
--              recover = generic_machine_check_exception(regs);
-+      else if (cur_cpu_spec->machine_check)
-+              recover = cur_cpu_spec->machine_check(regs);
--      if (recover)
-+      if (recover > 0)
-               return;
-       if (user_mode(regs)) {
-@@ -476,7 +507,12 @@ void machine_check_exception(struct pt_r
-       }
- #if defined(CONFIG_8xx) && defined(CONFIG_PCI)
--      /* the qspan pci read routines can cause machine checks -- Cort */
-+      /* the qspan pci read routines can cause machine checks -- Cort
-+       *
-+       * yuck !!! that totally needs to go away ! There are better ways
-+       * to deal with that than having a wart in the mcheck handler.
-+       * -- BenH
-+       */
-       bad_page_fault(regs, regs->dar, SIGBUS);
-       return;
- #endif
-@@ -622,6 +658,9 @@ static void parse_fpe(struct pt_regs *re
- #define INST_POPCNTB          0x7c0000f4
- #define INST_POPCNTB_MASK     0xfc0007fe
-+#define INST_ISEL             0x7c00001e
-+#define INST_ISEL_MASK                0xfc00003e
-+
- static int emulate_string_inst(struct pt_regs *regs, u32 instword)
- {
-       u8 rT = (instword >> 21) & 0x1f;
-@@ -707,6 +746,23 @@ static int emulate_popcntb_inst(struct p
-       return 0;
- }
-+static int emulate_isel(struct pt_regs *regs, u32 instword)
-+{
-+      u8 rT = (instword >> 21) & 0x1f;
-+      u8 rA = (instword >> 16) & 0x1f;
-+      u8 rB = (instword >> 11) & 0x1f;
-+      u8 BC = (instword >> 6) & 0x1f;
-+      u8 bit;
-+      unsigned long tmp;
-+
-+      tmp = (rA == 0) ? 0 : regs->gpr[rA];
-+      bit = (regs->ccr >> (31 - BC)) & 0x1;
-+
-+      regs->gpr[rT] = bit ? tmp : regs->gpr[rB];
-+
-+      return 0;
-+}
-+
- static int emulate_instruction(struct pt_regs *regs)
- {
-       u32 instword;
-@@ -749,6 +805,11 @@ static int emulate_instruction(struct pt
-               return emulate_popcntb_inst(regs, instword);
-       }
-+      /* Emulate isel (Integer Select) instruction */
-+      if ((instword & INST_ISEL_MASK) == INST_ISEL) {
-+              return emulate_isel(regs, instword);
-+      }
-+
-       return -EINVAL;
- }
---- a/arch/powerpc/kernel/udbg.c
-+++ b/arch/powerpc/kernel/udbg.c
-@@ -54,9 +54,16 @@ void __init udbg_early_init(void)
- #elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
-       /* PPC44x debug */
-       udbg_init_44x_as1();
-+#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
-+      /* PPC40x debug */
-+      udbg_init_40x_realmode();
- #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
-       udbg_init_cpm();
- #endif
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG
-+      console_loglevel = 10;
-+#endif
- }
- /* udbg library, used by xmon et al */
---- a/arch/powerpc/kernel/udbg_16550.c
-+++ b/arch/powerpc/kernel/udbg_16550.c
-@@ -46,7 +46,7 @@ struct NS16550 {
- #define LCR_DLAB 0x80
--static volatile struct NS16550 __iomem *udbg_comport;
-+static struct NS16550 __iomem *udbg_comport;
- static void udbg_550_putc(char c)
- {
-@@ -117,7 +117,7 @@ unsigned int udbg_probe_uart_speed(void 
- {
-       unsigned int dll, dlm, divisor, prescaler, speed;
-       u8 old_lcr;
--      volatile struct NS16550 __iomem *port = comport;
-+      struct NS16550 __iomem *port = comport;
-       old_lcr = in_8(&port->lcr);
-@@ -162,7 +162,7 @@ void udbg_maple_real_putc(char c)
- void __init udbg_init_maple_realmode(void)
- {
--      udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
-+      udbg_comport = (struct NS16550 __iomem *)0xf40003f8;
-       udbg_putc = udbg_maple_real_putc;
-       udbg_getc = NULL;
-@@ -184,7 +184,7 @@ void udbg_pas_real_putc(char c)
- void udbg_init_pas_realmode(void)
- {
--      udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8UL;
-+      udbg_comport = (struct NS16550 __iomem *)0xfcff03f8UL;
-       udbg_putc = udbg_pas_real_putc;
-       udbg_getc = NULL;
-@@ -219,9 +219,42 @@ static int udbg_44x_as1_getc(void)
- void __init udbg_init_44x_as1(void)
- {
-       udbg_comport =
--              (volatile struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
-+              (struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
-       udbg_putc = udbg_44x_as1_putc;
-       udbg_getc = udbg_44x_as1_getc;
- }
- #endif /* CONFIG_PPC_EARLY_DEBUG_44x */
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG_40x
-+static void udbg_40x_real_putc(char c)
-+{
-+      if (udbg_comport) {
-+              while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
-+                      /* wait for idle */;
-+              real_writeb(c, &udbg_comport->thr); eieio();
-+              if (c == '\n')
-+                      udbg_40x_real_putc('\r');
-+      }
-+}
-+
-+static int udbg_40x_real_getc(void)
-+{
-+      if (udbg_comport) {
-+              while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0)
-+                      ; /* wait for char */
-+              return real_readb(&udbg_comport->rbr);
-+      }
-+      return -1;
-+}
-+
-+void __init udbg_init_40x_realmode(void)
-+{
-+      udbg_comport = (struct NS16550 __iomem *)
-+              CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR;
-+
-+      udbg_putc = udbg_40x_real_putc;
-+      udbg_getc = udbg_40x_real_getc;
-+      udbg_getc_poll = NULL;
-+}
-+#endif /* CONFIG_PPC_EARLY_DEBUG_40x */
---- a/arch/powerpc/math-emu/op-4.h
-+++ b/arch/powerpc/math-emu/op-4.h
-@@ -194,19 +194,39 @@
-   (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
- #ifndef __FP_FRAC_ADD_4
--#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)          \
--  (r0 = x0 + y0,                                                      \
--   r1 = x1 + y1 + (r0 < x0),                                          \
--   r2 = x2 + y2 + (r1 < x1),                                          \
--   r3 = x3 + y3 + (r2 < x2))
-+#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)  \
-+  do {                                                                \
-+    int _c1, _c2, _c3;                                                \
-+    r0 = x0 + y0;                                             \
-+    _c1 = r0 < x0;                                            \
-+    r1 = x1 + y1;                                             \
-+    _c2 = r1 < x1;                                            \
-+    r1 += _c1;                                                        \
-+    _c2 |= r1 < _c1;                                          \
-+    r2 = x2 + y2;                                             \
-+    _c3 = r2 < x2;                                            \
-+    r2 += _c2;                                                        \
-+    _c3 |= r2 < _c2;                                          \
-+    r3 = x3 + y3 + _c3;                                               \
-+  } while (0)
- #endif
- #ifndef __FP_FRAC_SUB_4
--#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)          \
--  (r0 = x0 - y0,                                                        \
--   r1 = x1 - y1 - (r0 > x0),                                            \
--   r2 = x2 - y2 - (r1 > x1),                                            \
--   r3 = x3 - y3 - (r2 > x2))
-+#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)  \
-+  do {                                                                \
-+    int _c1, _c2, _c3;                                                \
-+    r0 = x0 - y0;                                             \
-+    _c1 = r0 > x0;                                            \
-+    r1 = x1 - y1;                                             \
-+    _c2 = r1 > x1;                                            \
-+    r1 -= _c1;                                                        \
-+    _c2 |= r1 > _c1;                                          \
-+    r2 = x2 - y2;                                             \
-+    _c3 = r2 > x2;                                            \
-+    r2 -= _c2;                                                        \
-+    _c3 |= r2 > _c2;                                          \
-+    r3 = x3 - y3 - _c3;                                               \
-+  } while (0)
- #endif
- #ifndef __FP_FRAC_ADDI_4
---- a/arch/powerpc/mm/fault.c
-+++ b/arch/powerpc/mm/fault.c
-@@ -167,10 +167,8 @@ int __kprobes do_page_fault(struct pt_re
-       if (notify_page_fault(regs))
-               return 0;
--      if (trap == 0x300) {
--              if (debugger_fault_handler(regs))
--                      return 0;
--      }
-+      if (unlikely(debugger_fault_handler(regs)))
-+              return 0;
-       /* On a kernel SLB miss we can only check for a valid exception entry */
-       if (!user_mode(regs) && (address >= TASK_SIZE))
-@@ -189,7 +187,7 @@ int __kprobes do_page_fault(struct pt_re
-                       return SIGSEGV;
-               /* in_atomic() in user mode is really bad,
-                  as is current->mm == NULL. */
--              printk(KERN_EMERG "Page fault in user mode with"
-+              printk(KERN_EMERG "Page fault in user mode with "
-                      "in_atomic() = %d mm = %p\n", in_atomic(), mm);
-               printk(KERN_EMERG "NIP = %lx  MSR = %lx\n",
-                      regs->nip, regs->msr);
---- a/arch/powerpc/mm/fsl_booke_mmu.c
-+++ b/arch/powerpc/mm/fsl_booke_mmu.c
-@@ -165,15 +165,15 @@ void invalidate_tlbcam_entry(int index)
- void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
-               unsigned long cam2)
- {
--      settlbcam(0, KERNELBASE, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
-+      settlbcam(0, PAGE_OFFSET, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
-       tlbcam_index++;
-       if (cam1) {
-               tlbcam_index++;
--              settlbcam(1, KERNELBASE+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
-+              settlbcam(1, PAGE_OFFSET+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
-       }
-       if (cam2) {
-               tlbcam_index++;
--              settlbcam(2, KERNELBASE+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
-+              settlbcam(2, PAGE_OFFSET+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
-       }
- }
---- a/arch/powerpc/mm/hash_utils_64.c
-+++ b/arch/powerpc/mm/hash_utils_64.c
-@@ -96,6 +96,7 @@ int mmu_vmalloc_psize = MMU_PAGE_4K;
- int mmu_io_psize = MMU_PAGE_4K;
- int mmu_kernel_ssize = MMU_SEGSIZE_256M;
- int mmu_highuser_ssize = MMU_SEGSIZE_256M;
-+u16 mmu_slb_size = 64;
- #ifdef CONFIG_HUGETLB_PAGE
- int mmu_huge_psize = MMU_PAGE_16M;
- unsigned int HPAGE_SHIFT;
-@@ -368,18 +369,11 @@ static void __init htab_init_page_sizes(
-        * on what is available
-        */
-       if (mmu_psize_defs[MMU_PAGE_16M].shift)
--              mmu_huge_psize = MMU_PAGE_16M;
-+              set_huge_psize(MMU_PAGE_16M);
-       /* With 4k/4level pagetables, we can't (for now) cope with a
-        * huge page size < PMD_SIZE */
-       else if (mmu_psize_defs[MMU_PAGE_1M].shift)
--              mmu_huge_psize = MMU_PAGE_1M;
--
--      /* Calculate HPAGE_SHIFT and sanity check it */
--      if (mmu_psize_defs[mmu_huge_psize].shift > MIN_HUGEPTE_SHIFT &&
--          mmu_psize_defs[mmu_huge_psize].shift < SID_SHIFT)
--              HPAGE_SHIFT = mmu_psize_defs[mmu_huge_psize].shift;
--      else
--              HPAGE_SHIFT = 0; /* No huge pages dude ! */
-+              set_huge_psize(MMU_PAGE_1M);
- #endif /* CONFIG_HUGETLB_PAGE */
- }
---- a/arch/powerpc/mm/hugetlbpage.c
-+++ b/arch/powerpc/mm/hugetlbpage.c
-@@ -24,18 +24,17 @@
- #include <asm/cputable.h>
- #include <asm/spu.h>
-+#define HPAGE_SHIFT_64K       16
-+#define HPAGE_SHIFT_16M       24
-+
- #define NUM_LOW_AREAS (0x100000000UL >> SID_SHIFT)
- #define NUM_HIGH_AREAS        (PGTABLE_RANGE >> HTLB_AREA_SHIFT)
--#ifdef CONFIG_PPC_64K_PAGES
--#define HUGEPTE_INDEX_SIZE    (PMD_SHIFT-HPAGE_SHIFT)
--#else
--#define HUGEPTE_INDEX_SIZE    (PUD_SHIFT-HPAGE_SHIFT)
--#endif
--#define PTRS_PER_HUGEPTE      (1 << HUGEPTE_INDEX_SIZE)
--#define HUGEPTE_TABLE_SIZE    (sizeof(pte_t) << HUGEPTE_INDEX_SIZE)
-+unsigned int hugepte_shift;
-+#define PTRS_PER_HUGEPTE      (1 << hugepte_shift)
-+#define HUGEPTE_TABLE_SIZE    (sizeof(pte_t) << hugepte_shift)
--#define HUGEPD_SHIFT          (HPAGE_SHIFT + HUGEPTE_INDEX_SIZE)
-+#define HUGEPD_SHIFT          (HPAGE_SHIFT + hugepte_shift)
- #define HUGEPD_SIZE           (1UL << HUGEPD_SHIFT)
- #define HUGEPD_MASK           (~(HUGEPD_SIZE-1))
-@@ -82,11 +81,35 @@ static int __hugepte_alloc(struct mm_str
-       return 0;
- }
-+/* Base page size affects how we walk hugetlb page tables */
-+#ifdef CONFIG_PPC_64K_PAGES
-+#define hpmd_offset(pud, addr)                pmd_offset(pud, addr)
-+#define hpmd_alloc(mm, pud, addr)     pmd_alloc(mm, pud, addr)
-+#else
-+static inline
-+pmd_t *hpmd_offset(pud_t *pud, unsigned long addr)
-+{
-+      if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+              return pmd_offset(pud, addr);
-+      else
-+              return (pmd_t *) pud;
-+}
-+static inline
-+pmd_t *hpmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long addr)
-+{
-+      if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+              return pmd_alloc(mm, pud, addr);
-+      else
-+              return (pmd_t *) pud;
-+}
-+#endif
-+
- /* Modelled after find_linux_pte() */
- pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
- {
-       pgd_t *pg;
-       pud_t *pu;
-+      pmd_t *pm;
-       BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
-@@ -96,14 +119,9 @@ pte_t *huge_pte_offset(struct mm_struct 
-       if (!pgd_none(*pg)) {
-               pu = pud_offset(pg, addr);
-               if (!pud_none(*pu)) {
--#ifdef CONFIG_PPC_64K_PAGES
--                      pmd_t *pm;
--                      pm = pmd_offset(pu, addr);
-+                      pm = hpmd_offset(pu, addr);
-                       if (!pmd_none(*pm))
-                               return hugepte_offset((hugepd_t *)pm, addr);
--#else
--                      return hugepte_offset((hugepd_t *)pu, addr);
--#endif
-               }
-       }
-@@ -114,6 +132,7 @@ pte_t *huge_pte_alloc(struct mm_struct *
- {
-       pgd_t *pg;
-       pud_t *pu;
-+      pmd_t *pm;
-       hugepd_t *hpdp = NULL;
-       BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
-@@ -124,14 +143,9 @@ pte_t *huge_pte_alloc(struct mm_struct *
-       pu = pud_alloc(mm, pg, addr);
-       if (pu) {
--#ifdef CONFIG_PPC_64K_PAGES
--              pmd_t *pm;
--              pm = pmd_alloc(mm, pu, addr);
-+              pm = hpmd_alloc(mm, pu, addr);
-               if (pm)
-                       hpdp = (hugepd_t *)pm;
--#else
--              hpdp = (hugepd_t *)pu;
--#endif
-       }
-       if (! hpdp)
-@@ -158,7 +172,6 @@ static void free_hugepte_range(struct mm
-                                                PGF_CACHENUM_MASK));
- }
--#ifdef CONFIG_PPC_64K_PAGES
- static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
-                                  unsigned long addr, unsigned long end,
-                                  unsigned long floor, unsigned long ceiling)
-@@ -191,7 +204,6 @@ static void hugetlb_free_pmd_range(struc
-       pud_clear(pud);
-       pmd_free_tlb(tlb, pmd);
- }
--#endif
- static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
-                                  unsigned long addr, unsigned long end,
-@@ -210,9 +222,15 @@ static void hugetlb_free_pud_range(struc
-                       continue;
-               hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
- #else
--              if (pud_none(*pud))
--                      continue;
--              free_hugepte_range(tlb, (hugepd_t *)pud);
-+              if (HPAGE_SHIFT == HPAGE_SHIFT_64K) {
-+                      if (pud_none_or_clear_bad(pud))
-+                              continue;
-+                      hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
-+              } else {
-+                      if (pud_none(*pud))
-+                              continue;
-+                      free_hugepte_range(tlb, (hugepd_t *)pud);
-+              }
- #endif
-       } while (pud++, addr = next, addr != end);
-@@ -526,6 +544,57 @@ repeat:
-       return err;
- }
-+void set_huge_psize(int psize)
-+{
-+      /* Check that it is a page size supported by the hardware and
-+       * that it fits within pagetable limits. */
-+      if (mmu_psize_defs[psize].shift && mmu_psize_defs[psize].shift < SID_SHIFT &&
-+              (mmu_psize_defs[psize].shift > MIN_HUGEPTE_SHIFT ||
-+                      mmu_psize_defs[psize].shift == HPAGE_SHIFT_64K)) {
-+              HPAGE_SHIFT = mmu_psize_defs[psize].shift;
-+              mmu_huge_psize = psize;
-+#ifdef CONFIG_PPC_64K_PAGES
-+              hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
-+#else
-+              if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+                      hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
-+              else
-+                      hugepte_shift = (PUD_SHIFT-HPAGE_SHIFT);
-+#endif
-+
-+      } else
-+              HPAGE_SHIFT = 0;
-+}
-+
-+static int __init hugepage_setup_sz(char *str)
-+{
-+      unsigned long long size;
-+      int mmu_psize = -1;
-+      int shift;
-+
-+      size = memparse(str, &str);
-+
-+      shift = __ffs(size);
-+      switch (shift) {
-+#ifndef CONFIG_PPC_64K_PAGES
-+      case HPAGE_SHIFT_64K:
-+              mmu_psize = MMU_PAGE_64K;
-+              break;
-+#endif
-+      case HPAGE_SHIFT_16M:
-+              mmu_psize = MMU_PAGE_16M;
-+              break;
-+      }
-+
-+      if (mmu_psize >=0 && mmu_psize_defs[mmu_psize].shift)
-+              set_huge_psize(mmu_psize);
-+      else
-+              printk(KERN_WARNING "Invalid huge page size specified(%llu)\n", size);
-+
-+      return 1;
-+}
-+__setup("hugepagesz=", hugepage_setup_sz);
-+
- static void zero_ctor(struct kmem_cache *cache, void *addr)
- {
-       memset(addr, 0, kmem_cache_size(cache));
---- a/arch/powerpc/mm/lmb.c
-+++ b/arch/powerpc/mm/lmb.c
-@@ -342,3 +342,16 @@ void __init lmb_enforce_memory_limit(uns
-               }
-       }
- }
-+
-+int __init lmb_is_reserved(unsigned long addr)
-+{
-+      int i;
-+
-+      for (i = 0; i < lmb.reserved.cnt; i++) {
-+              unsigned long upper = lmb.reserved.region[i].base +
-+                                    lmb.reserved.region[i].size - 1;
-+              if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
-+                      return 1;
-+      }
-+      return 0;
-+}
---- a/arch/powerpc/mm/mem.c
-+++ b/arch/powerpc/mm/mem.c
-@@ -213,15 +213,30 @@ void __init do_init_bootmem(void)
-        */
- #ifdef CONFIG_HIGHMEM
-       free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
-+
-+      /* reserve the sections we're already using */
-+      for (i = 0; i < lmb.reserved.cnt; i++) {
-+              unsigned long addr = lmb.reserved.region[i].base +
-+                                   lmb_size_bytes(&lmb.reserved, i) - 1;
-+              if (addr < total_lowmem)
-+                      reserve_bootmem(lmb.reserved.region[i].base,
-+                                      lmb_size_bytes(&lmb.reserved, i));
-+              else if (lmb.reserved.region[i].base < total_lowmem) {
-+                      unsigned long adjusted_size = total_lowmem -
-+                                    lmb.reserved.region[i].base;
-+                      reserve_bootmem(lmb.reserved.region[i].base,
-+                                      adjusted_size);
-+              }
-+      }
- #else
-       free_bootmem_with_active_regions(0, max_pfn);
--#endif
-       /* reserve the sections we're already using */
-       for (i = 0; i < lmb.reserved.cnt; i++)
-               reserve_bootmem(lmb.reserved.region[i].base,
-                               lmb_size_bytes(&lmb.reserved, i));
-+#endif
-       /* XXX need to clip this if using highmem? */
-       sparse_memory_present_with_active_regions(0);
-@@ -334,11 +349,13 @@ void __init mem_init(void)
-               highmem_mapnr = total_lowmem >> PAGE_SHIFT;
-               for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
-                       struct page *page = pfn_to_page(pfn);
--
-+                      if (lmb_is_reserved(pfn << PAGE_SHIFT))
-+                              continue;
-                       ClearPageReserved(page);
-                       init_page_count(page);
-                       __free_page(page);
-                       totalhigh_pages++;
-+                      reservedpages--;
-               }
-               totalram_pages += totalhigh_pages;
-               printk(KERN_DEBUG "High memory: %luk\n",
---- a/arch/powerpc/mm/slb.c
-+++ b/arch/powerpc/mm/slb.c
-@@ -256,6 +256,7 @@ void slb_initialize(void)
-       static int slb_encoding_inited;
-       extern unsigned int *slb_miss_kernel_load_linear;
-       extern unsigned int *slb_miss_kernel_load_io;
-+      extern unsigned int *slb_compare_rr_to_size;
-       /* Prepare our SLB miss handler based on our page size */
-       linear_llp = mmu_psize_defs[mmu_linear_psize].sllp;
-@@ -269,6 +270,8 @@ void slb_initialize(void)
-                                  SLB_VSID_KERNEL | linear_llp);
-               patch_slb_encoding(slb_miss_kernel_load_io,
-                                  SLB_VSID_KERNEL | io_llp);
-+              patch_slb_encoding(slb_compare_rr_to_size,
-+                                 mmu_slb_size);
-               DBG("SLB: linear  LLP = %04x\n", linear_llp);
-               DBG("SLB: io      LLP = %04x\n", io_llp);
---- a/arch/powerpc/mm/slb_low.S
-+++ b/arch/powerpc/mm/slb_low.S
-@@ -227,8 +227,9 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISER
- 7:    ld      r10,PACASTABRR(r13)
-       addi    r10,r10,1
--      /* use a cpu feature mask if we ever change our slb size */
--      cmpldi  r10,SLB_NUM_ENTRIES
-+      /* This gets soft patched on boot. */
-+_GLOBAL(slb_compare_rr_to_size)
-+      cmpldi  r10,0
-       blt+    4f
-       li      r10,SLB_NUM_BOLTED
---- a/arch/powerpc/oprofile/op_model_cell.c
-+++ b/arch/powerpc/oprofile/op_model_cell.c
-@@ -61,7 +61,7 @@ static unsigned int spu_cycle_reset;
- #define NUM_THREADS 2         /* number of physical threads in
-                              * physical processor
-                              */
--#define NUM_TRACE_BUS_WORDS 4
-+#define NUM_DEBUG_BUS_WORDS 4
- #define NUM_INPUT_BUS_WORDS 2
- #define MAX_SPU_COUNT 0xFFFFFF        /* maximum 24 bit LFSR value */
-@@ -169,7 +169,6 @@ static DEFINE_SPINLOCK(virt_cntr_lock);
- static u32 ctr_enabled;
--static unsigned char trace_bus[NUM_TRACE_BUS_WORDS];
- static unsigned char input_bus[NUM_INPUT_BUS_WORDS];
- /*
-@@ -298,7 +297,7 @@ static void set_pm_event(u32 ctr, int ev
-       p->signal_group = event / 100;
-       p->bus_word = bus_word;
--      p->sub_unit = (unit_mask & 0x0000f000) >> 12;
-+      p->sub_unit = GET_SUB_UNIT(unit_mask);
-       pm_regs.pm07_cntrl[ctr] = 0;
-       pm_regs.pm07_cntrl[ctr] |= PM07_CTR_COUNT_CYCLES(count_cycles);
-@@ -334,16 +333,16 @@ static void set_pm_event(u32 ctr, int ev
-               p->bit = signal_bit;
-       }
--      for (i = 0; i < NUM_TRACE_BUS_WORDS; i++) {
-+      for (i = 0; i < NUM_DEBUG_BUS_WORDS; i++) {
-               if (bus_word & (1 << i)) {
-                       pm_regs.debug_bus_control |=
--                          (bus_type << (31 - (2 * i) + 1));
-+                          (bus_type << (30 - (2 * i)));
-                       for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) {
-                               if (input_bus[j] == 0xff) {
-                                       input_bus[j] = i;
-                                       pm_regs.group_control |=
--                                          (i << (31 - i));
-+                                          (i << (30 - (2 * j)));
-                                       break;
-                               }
-@@ -450,6 +449,12 @@ static void cell_virtual_cntr(unsigned l
-       hdw_thread = 1 ^ hdw_thread;
-       next_hdw_thread = hdw_thread;
-+      pm_regs.group_control = 0;
-+      pm_regs.debug_bus_control = 0;
-+
-+      for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
-+              input_bus[i] = 0xff;
-+
-       /*
-        * There are some per thread events.  Must do the
-        * set event, for the thread that is being started
-@@ -619,9 +624,6 @@ static int cell_reg_setup(struct op_coun
-               pmc_cntrl[1][i].vcntr = i;
-       }
--      for (i = 0; i < NUM_TRACE_BUS_WORDS; i++)
--              trace_bus[i] = 0xff;
--
-       for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
-               input_bus[i] = 0xff;
---- a/arch/powerpc/platforms/40x/Kconfig
-+++ b/arch/powerpc/platforms/40x/Kconfig
-@@ -14,28 +14,34 @@
- #     help
- #       This option enables support for the CPCI405 board.
--#config EP405
--#     bool "EP405/EP405PC"
--#     depends on 40x
--#     default n
--#     select 405GP
--#     help
--#       This option enables support for the EP405/EP405PC boards.
--
--#config EP405PC
--#     bool "EP405PC Support"
--#     depends on EP405
--#     default y
--#     help
--#       This option enables support for the extra features of the EP405PC board.
-+config EP405
-+      bool "EP405/EP405PC"
-+      depends on 40x
-+      default n
-+      select 405GP
-+      select PCI
-+      help
-+        This option enables support for the EP405/EP405PC boards.
- config KILAUEA
-       bool "Kilauea"
-       depends on 40x
-       default n
-+      select 405EX
-+      select PPC4xx_PCI_EXPRESS
-       help
-         This option enables support for the AMCC PPC405EX evaluation board.
-+config MAKALU
-+      bool "Makalu"
-+      depends on 40x
-+      default n
-+      select 405EX
-+      select PCI
-+      select PPC4xx_PCI_EXPRESS
-+      help
-+        This option enables support for the AMCC PPC405EX board.
-+
- #config REDWOOD_5
- #     bool "Redwood-5"
- #     depends on 40x
-@@ -65,6 +71,7 @@ config WALNUT
-       depends on 40x
-       default y
-       select 405GP
-+      select PCI
-       help
-         This option enables support for the IBM PPC405GP evaluation board.
-@@ -105,6 +112,11 @@ config 405GP
- config 405EP
-       bool
-+config 405EX
-+      bool
-+      select IBM_NEW_EMAC_EMAC4
-+      select IBM_NEW_EMAC_RGMII
-+
- config 405GPR
-       bool
---- a/arch/powerpc/platforms/40x/Makefile
-+++ b/arch/powerpc/platforms/40x/Makefile
-@@ -1,3 +1,5 @@
- obj-$(CONFIG_KILAUEA)                         += kilauea.o
-+obj-$(CONFIG_MAKALU)                          += makalu.o
- obj-$(CONFIG_WALNUT)                          += walnut.o
- obj-$(CONFIG_XILINX_VIRTEX_GENERIC_BOARD)     += virtex.o
-+obj-$(CONFIG_EP405)                           += ep405.o
---- /dev/null
-+++ b/arch/powerpc/platforms/40x/ep405.c
-@@ -0,0 +1,123 @@
-+/*
-+ * Architecture- / platform-specific boot-time initialization code for
-+ * IBM PowerPC 4xx based boards. Adapted from original
-+ * code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek
-+ * <dan@net4x.com>.
-+ *
-+ * Copyright(c) 1999-2000 Grant Erickson <grant@lcse.umn.edu>
-+ *
-+ * Rewritten and ported to the merged powerpc tree:
-+ * Copyright 2007 IBM Corporation
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * Adapted to EP405 by Ben. Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * TODO: Wire up the PCI IRQ mux and the southbridge interrupts
-+ *
-+ * 2002 (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/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+static struct device_node *bcsr_node;
-+static void __iomem *bcsr_regs;
-+
-+/* BCSR registers  */
-+#define BCSR_ID                       0
-+#define BCSR_PCI_CTRL         1
-+#define BCSR_FLASH_NV_POR_CTRL        2
-+#define BCSR_FENET_UART_CTRL  3
-+#define BCSR_PCI_IRQ          4
-+#define BCSR_XIRQ_SELECT      5
-+#define BCSR_XIRQ_ROUTING     6
-+#define BCSR_XIRQ_STATUS      7
-+#define BCSR_XIRQ_STATUS2     8
-+#define BCSR_SW_STAT_LED_CTRL 9
-+#define BCSR_GPIO_IRQ_PAR_CTRL        10
-+/* there's more, can't be bothered typing them tho */
-+
-+
-+static __initdata struct of_device_id ep405_of_bus[] = {
-+      { .compatible = "ibm,plb3", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init ep405_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, ep405_of_bus, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(ep405, ep405_device_probe);
-+
-+static void __init ep405_init_bcsr(void)
-+{
-+      const u8 *irq_routing;
-+      int i;
-+
-+      /* Find the bloody thing & map it */
-+      bcsr_node = of_find_compatible_node(NULL, NULL, "ep405-bcsr");
-+      if (bcsr_node == NULL) {
-+              printk(KERN_ERR "EP405 BCSR not found !\n");
-+              return;
-+      }
-+      bcsr_regs = of_iomap(bcsr_node, 0);
-+      if (bcsr_regs == NULL) {
-+              printk(KERN_ERR "EP405 BCSR failed to map !\n");
-+              return;
-+      }
-+
-+      /* Get the irq-routing property and apply the routing to the CPLD */
-+      irq_routing = of_get_property(bcsr_node, "irq-routing", NULL);
-+      if (irq_routing == NULL)
-+              return;
-+      for (i = 0; i < 16; i++) {
-+              u8 irq = irq_routing[i];
-+              out_8(bcsr_regs + BCSR_XIRQ_SELECT, i);
-+              out_8(bcsr_regs + BCSR_XIRQ_ROUTING, irq);
-+      }
-+      in_8(bcsr_regs + BCSR_XIRQ_SELECT);
-+      mb();
-+      out_8(bcsr_regs + BCSR_GPIO_IRQ_PAR_CTRL, 0xfe);
-+}
-+
-+static void __init ep405_setup_arch(void)
-+{
-+      /* Find & init the BCSR CPLD */
-+      ep405_init_bcsr();
-+
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+}
-+
-+static int __init ep405_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (!of_flat_dt_is_compatible(root, "ep405"))
-+              return 0;
-+
-+      return 1;
-+}
-+
-+define_machine(ep405) {
-+      .name                   = "EP405",
-+      .probe                  = ep405_probe,
-+      .setup_arch             = ep405_setup_arch,
-+      .progress               = udbg_progress,
-+      .init_IRQ               = uic_init_tree,
-+      .get_irq                = uic_get_irq,
-+      .calibrate_decr         = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/40x/kilauea.c
-+++ b/arch/powerpc/platforms/40x/kilauea.c
-@@ -19,8 +19,9 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
--static struct of_device_id kilauea_of_bus[] = {
-+static __initdata struct of_device_id kilauea_of_bus[] = {
-       { .compatible = "ibm,plb4", },
-       { .compatible = "ibm,opb", },
-       { .compatible = "ibm,ebc", },
-@@ -29,14 +30,11 @@ static struct of_device_id kilauea_of_bu
- static int __init kilauea_device_probe(void)
- {
--      if (!machine_is(kilauea))
--              return 0;
--
-       of_platform_bus_probe(NULL, kilauea_of_bus, NULL);
-       return 0;
- }
--device_initcall(kilauea_device_probe);
-+machine_device_initcall(kilauea, kilauea_device_probe);
- static int __init kilauea_probe(void)
- {
-@@ -45,6 +43,8 @@ static int __init kilauea_probe(void)
-       if (!of_flat_dt_is_compatible(root, "amcc,kilauea"))
-               return 0;
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-       return 1;
- }
---- /dev/null
-+++ b/arch/powerpc/platforms/40x/makalu.c
-@@ -0,0 +1,58 @@
-+/*
-+ * Makalu board specific routines
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * Based on the Walnut code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+static __initdata struct of_device_id makalu_of_bus[] = {
-+      { .compatible = "ibm,plb4", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init makalu_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, makalu_of_bus, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(makalu, makalu_device_probe);
-+
-+static int __init makalu_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (!of_flat_dt_is_compatible(root, "amcc,makalu"))
-+              return 0;
-+
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+      return 1;
-+}
-+
-+define_machine(makalu) {
-+      .name                           = "Makalu",
-+      .probe                          = makalu_probe,
-+      .progress                       = udbg_progress,
-+      .init_IRQ                       = uic_init_tree,
-+      .get_irq                        = uic_get_irq,
-+      .calibrate_decr                 = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/40x/virtex.c
-+++ b/arch/powerpc/platforms/40x/virtex.c
-@@ -15,16 +15,23 @@
- #include <asm/time.h>
- #include <asm/xilinx_intc.h>
-+static struct of_device_id xilinx_of_bus_ids[] __initdata = {
-+      { .compatible = "xlnx,plb-v46-1.00.a", },
-+      { .compatible = "xlnx,plb-v34-1.01.a", },
-+      { .compatible = "xlnx,plb-v34-1.02.a", },
-+      { .compatible = "xlnx,opb-v20-1.10.c", },
-+      { .compatible = "xlnx,dcr-v29-1.00.a", },
-+      { .compatible = "xlnx,compound", },
-+      {}
-+};
-+
- static int __init virtex_device_probe(void)
- {
--      if (!machine_is(virtex))
--              return 0;
--
--      of_platform_bus_probe(NULL, NULL, NULL);
-+      of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL);
-       return 0;
- }
--device_initcall(virtex_device_probe);
-+machine_device_initcall(virtex, virtex_device_probe);
- static int __init virtex_probe(void)
- {
---- a/arch/powerpc/platforms/40x/walnut.c
-+++ b/arch/powerpc/platforms/40x/walnut.c
-@@ -24,8 +24,9 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
--static struct of_device_id walnut_of_bus[] = {
-+static __initdata struct of_device_id walnut_of_bus[] = {
-       { .compatible = "ibm,plb3", },
-       { .compatible = "ibm,opb", },
-       { .compatible = "ibm,ebc", },
-@@ -34,15 +35,12 @@ static struct of_device_id walnut_of_bus
- static int __init walnut_device_probe(void)
- {
--      if (!machine_is(walnut))
--              return 0;
--
--      /* FIXME: do bus probe here */
-       of_platform_bus_probe(NULL, walnut_of_bus, NULL);
-+      of_instantiate_rtc();
-       return 0;
- }
--device_initcall(walnut_device_probe);
-+machine_device_initcall(walnut, walnut_device_probe);
- static int __init walnut_probe(void)
- {
-@@ -51,6 +49,8 @@ static int __init walnut_probe(void)
-       if (!of_flat_dt_is_compatible(root, "ibm,walnut"))
-               return 0;
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-       return 1;
- }
---- a/arch/powerpc/platforms/44x/Kconfig
-+++ b/arch/powerpc/platforms/44x/Kconfig
-@@ -3,6 +3,7 @@ config BAMBOO
-       depends on 44x
-       default n
-       select 440EP
-+      select PCI
-       help
-         This option enables support for the IBM PPC440EP evaluation board.
-@@ -11,6 +12,8 @@ config EBONY
-       depends on 44x
-       default y
-       select 440GP
-+      select PCI
-+      select OF_RTC
-       help
-         This option enables support for the IBM PPC440GP evaluation board.
-@@ -22,6 +25,48 @@ config SEQUOIA
-       help
-         This option enables support for the AMCC PPC440EPX evaluation board.
-+config TAISHAN
-+      bool "Taishan"
-+      depends on 44x
-+      default n
-+      select 440GX
-+      select PCI
-+      help
-+        This option enables support for the AMCC PPC440GX "Taishan"
-+        evaluation board.
-+
-+config KATMAI
-+      bool "Katmai"
-+      depends on 44x
-+      default n
-+      select 440SPe
-+      select PCI
-+      select PPC4xx_PCI_EXPRESS
-+      help
-+        This option enables support for the AMCC PPC440SPe evaluation board.
-+
-+config RAINIER
-+      bool "Rainier"
-+      depends on 44x
-+      default n
-+      select 440GRX
-+      select PCI
-+      help
-+        This option enables support for the AMCC PPC440GRX evaluation board.
-+
-+config WARP
-+      bool "PIKA Warp"
-+      depends on 44x
-+      default n
-+      select 440EP
-+      help
-+        This option enables support for the PIKA Warp(tm) Appliance. The Warp
-+          is a small computer replacement with up to 9 ports of FXO/FXS plus VOIP
-+        stations and trunks.
-+
-+        See http://www.pikatechnologies.com/ and follow the "PIKA for Computer
-+        Telephony Developers" link for more information.
-+
- #config LUAN
- #     bool "Luan"
- #     depends on 44x
-@@ -44,6 +89,7 @@ config 440EP
-       select PPC_FPU
-       select IBM440EP_ERR42
-       select IBM_NEW_EMAC_ZMII
-+      select USB_ARCH_HAS_OHCI
- config 440EPX
-       bool
-@@ -52,20 +98,29 @@ config 440EPX
-       select IBM_NEW_EMAC_RGMII
-       select IBM_NEW_EMAC_ZMII
-+config 440GRX
-+      bool
-+      select IBM_NEW_EMAC_EMAC4
-+      select IBM_NEW_EMAC_RGMII
-+      select IBM_NEW_EMAC_ZMII
-+
- config 440GP
-       bool
-       select IBM_NEW_EMAC_ZMII
- config 440GX
-       bool
-+        select IBM_NEW_EMAC_EMAC4
-+      select IBM_NEW_EMAC_RGMII
-+        select IBM_NEW_EMAC_ZMII #test only
-+        select IBM_NEW_EMAC_TAH  #test only
- config 440SP
-       bool
--config 440A
-+config 440SPe
-+        select IBM_NEW_EMAC_EMAC4
-       bool
--      depends on 440GX || 440EPX
--      default y
- # 44x errata/workaround config symbols, selected by the CPU models above
- config IBM440EP_ERR42
---- a/arch/powerpc/platforms/44x/Makefile
-+++ b/arch/powerpc/platforms/44x/Makefile
-@@ -1,4 +1,9 @@
- obj-$(CONFIG_44x)     := misc_44x.o
- obj-$(CONFIG_EBONY)   += ebony.o
--obj-$(CONFIG_BAMBOO) += bamboo.o
-+obj-$(CONFIG_TAISHAN) += taishan.o
-+obj-$(CONFIG_BAMBOO)  += bamboo.o
- obj-$(CONFIG_SEQUOIA) += sequoia.o
-+obj-$(CONFIG_KATMAI)  += katmai.o
-+obj-$(CONFIG_RAINIER) += rainier.o
-+obj-$(CONFIG_WARP)    += warp.o
-+obj-$(CONFIG_WARP)    += warp-nand.o
---- a/arch/powerpc/platforms/44x/bamboo.c
-+++ b/arch/powerpc/platforms/44x/bamboo.c
-@@ -21,9 +21,11 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
- #include "44x.h"
--static struct of_device_id bamboo_of_bus[] = {
-+static __initdata struct of_device_id bamboo_of_bus[] = {
-       { .compatible = "ibm,plb4", },
-       { .compatible = "ibm,opb", },
-       { .compatible = "ibm,ebc", },
-@@ -32,14 +34,11 @@ static struct of_device_id bamboo_of_bus
- static int __init bamboo_device_probe(void)
- {
--      if (!machine_is(bamboo))
--              return 0;
--
-       of_platform_bus_probe(NULL, bamboo_of_bus, NULL);
-       return 0;
- }
--device_initcall(bamboo_device_probe);
-+machine_device_initcall(bamboo, bamboo_device_probe);
- static int __init bamboo_probe(void)
- {
-@@ -48,6 +47,8 @@ static int __init bamboo_probe(void)
-       if (!of_flat_dt_is_compatible(root, "amcc,bamboo"))
-               return 0;
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-       return 1;
- }
---- a/arch/powerpc/platforms/44x/ebony.c
-+++ b/arch/powerpc/platforms/44x/ebony.c
-@@ -18,16 +18,18 @@
- #include <linux/init.h>
- #include <linux/of_platform.h>
-+#include <linux/rtc.h>
- #include <asm/machdep.h>
- #include <asm/prom.h>
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
- #include "44x.h"
--static struct of_device_id ebony_of_bus[] = {
-+static __initdata struct of_device_id ebony_of_bus[] = {
-       { .compatible = "ibm,plb4", },
-       { .compatible = "ibm,opb", },
-       { .compatible = "ibm,ebc", },
-@@ -36,14 +38,12 @@ static struct of_device_id ebony_of_bus[
- static int __init ebony_device_probe(void)
- {
--      if (!machine_is(ebony))
--              return 0;
--
-       of_platform_bus_probe(NULL, ebony_of_bus, NULL);
-+      of_instantiate_rtc();
-       return 0;
- }
--device_initcall(ebony_device_probe);
-+machine_device_initcall(ebony, ebony_device_probe);
- /*
-  * Called very early, MMU is off, device-tree isn't unflattened
-@@ -55,6 +55,8 @@ static int __init ebony_probe(void)
-       if (!of_flat_dt_is_compatible(root, "ibm,ebony"))
-               return 0;
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-       return 1;
- }
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/katmai.c
-@@ -0,0 +1,63 @@
-+/*
-+ * Katmai board specific routines
-+ *
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ * Copyright 2007 IBM Corp.
-+ *
-+ * Based on the Bamboo code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "44x.h"
-+
-+static __initdata struct of_device_id katmai_of_bus[] = {
-+      { .compatible = "ibm,plb4", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init katmai_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, katmai_of_bus, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(katmai, katmai_device_probe);
-+
-+static int __init katmai_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (!of_flat_dt_is_compatible(root, "amcc,katmai"))
-+              return 0;
-+
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+      return 1;
-+}
-+
-+define_machine(katmai) {
-+      .name                           = "Katmai",
-+      .probe                          = katmai_probe,
-+      .progress                       = udbg_progress,
-+      .init_IRQ                       = uic_init_tree,
-+      .get_irq                        = uic_get_irq,
-+      .restart                        = ppc44x_reset_system,
-+      .calibrate_decr                 = generic_calibrate_decr,
-+};
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/rainier.c
-@@ -0,0 +1,62 @@
-+/*
-+ * Rainier board specific routines
-+ *
-+ * Valentine Barshak <vbarshak@ru.mvista.com>
-+ * Copyright 2007 MontaVista Software Inc.
-+ *
-+ * Based on the Bamboo code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+#include "44x.h"
-+
-+static __initdata struct of_device_id rainier_of_bus[] = {
-+      { .compatible = "ibm,plb4", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init rainier_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, rainier_of_bus, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(rainier, rainier_device_probe);
-+
-+static int __init rainier_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (!of_flat_dt_is_compatible(root, "amcc,rainier"))
-+              return 0;
-+
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+      return 1;
-+}
-+
-+define_machine(rainier) {
-+      .name                           = "Rainier",
-+      .probe                          = rainier_probe,
-+      .progress                       = udbg_progress,
-+      .init_IRQ                       = uic_init_tree,
-+      .get_irq                        = uic_get_irq,
-+      .restart                        = ppc44x_reset_system,
-+      .calibrate_decr                 = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/44x/sequoia.c
-+++ b/arch/powerpc/platforms/44x/sequoia.c
-@@ -21,9 +21,11 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
- #include "44x.h"
--static struct of_device_id sequoia_of_bus[] = {
-+static __initdata struct of_device_id sequoia_of_bus[] = {
-       { .compatible = "ibm,plb4", },
-       { .compatible = "ibm,opb", },
-       { .compatible = "ibm,ebc", },
-@@ -32,14 +34,11 @@ static struct of_device_id sequoia_of_bu
- static int __init sequoia_device_probe(void)
- {
--      if (!machine_is(sequoia))
--              return 0;
--
-       of_platform_bus_probe(NULL, sequoia_of_bus, NULL);
-       return 0;
- }
--device_initcall(sequoia_device_probe);
-+machine_device_initcall(sequoia, sequoia_device_probe);
- static int __init sequoia_probe(void)
- {
-@@ -48,6 +47,8 @@ static int __init sequoia_probe(void)
-       if (!of_flat_dt_is_compatible(root, "amcc,sequoia"))
-               return 0;
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-       return 1;
- }
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/taishan.c
-@@ -0,0 +1,73 @@
-+/*
-+ * Taishan board specific routines based off ebony.c code
-+ * original copyrights below
-+ *
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ * Copyright 2002-2005 MontaVista Software Inc.
-+ *
-+ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
-+ * Copyright (c) 2003-2005 Zultys Technologies
-+ *
-+ * Rewritten and ported to the merged powerpc tree:
-+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
-+ *
-+ * Modified from ebony.c for taishan:
-+ * Copyright 2007 Hugh Blemings <hugh@au.ibm.com>, IBM Corporation.
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "44x.h"
-+
-+static __initdata struct of_device_id taishan_of_bus[] = {
-+      { .compatible = "ibm,plb4", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init taishan_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, taishan_of_bus, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(taishan, taishan_device_probe);
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init taishan_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (!of_flat_dt_is_compatible(root, "amcc,taishan"))
-+              return 0;
-+
-+      ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+      return 1;
-+}
-+
-+define_machine(taishan) {
-+      .name                   = "Taishan",
-+      .probe                  = taishan_probe,
-+      .progress               = udbg_progress,
-+      .init_IRQ               = uic_init_tree,
-+      .get_irq                = uic_get_irq,
-+      .restart                = ppc44x_reset_system,
-+      .calibrate_decr         = generic_calibrate_decr,
-+};
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/warp-nand.c
-@@ -0,0 +1,105 @@
-+/*
-+ * PIKA Warp(tm) NAND flash specific routines
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ *   Sean MacLennan <smaclennan@pikatech.com>
-+ */
-+
-+#include <linux/platform_device.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/mtd/ndfc.h>
-+
-+#ifdef CONFIG_MTD_NAND_NDFC
-+
-+#define CS_NAND_0     1       /* use chip select 1 for NAND device 0 */
-+
-+#define WARP_NAND_FLASH_REG_ADDR      0xD0000000UL
-+#define WARP_NAND_FLASH_REG_SIZE      0x2000
-+
-+static struct resource warp_ndfc = {
-+      .start = WARP_NAND_FLASH_REG_ADDR,
-+      .end   = WARP_NAND_FLASH_REG_ADDR + WARP_NAND_FLASH_REG_SIZE,
-+      .flags = IORESOURCE_MEM,
-+};
-+
-+static struct mtd_partition nand_parts[] = {
-+      {
-+              .name   = "kernel",
-+              .offset = 0,
-+              .size   = 0x0200000
-+      },
-+      {
-+              .name   = "root",
-+              .offset = 0x0200000,
-+              .size   = 0x3400000
-+      },
-+      {
-+              .name   = "user",
-+              .offset = 0x3600000,
-+              .size   = 0x0A00000
-+      },
-+};
-+
-+struct ndfc_controller_settings warp_ndfc_settings = {
-+      .ccr_settings = (NDFC_CCR_BS(CS_NAND_0) | NDFC_CCR_ARAC1),
-+      .ndfc_erpn = 0,
-+};
-+
-+static struct ndfc_chip_settings warp_chip0_settings = {
-+      .bank_settings = 0x80002222,
-+};
-+
-+struct platform_nand_ctrl warp_nand_ctrl = {
-+      .priv = &warp_ndfc_settings,
-+};
-+
-+static struct platform_device warp_ndfc_device = {
-+      .name = "ndfc-nand",
-+      .id = 0,
-+      .dev = {
-+              .platform_data = &warp_nand_ctrl,
-+      },
-+      .num_resources = 1,
-+      .resource = &warp_ndfc,
-+};
-+
-+static struct nand_ecclayout nand_oob_16 = {
-+      .eccbytes = 3,
-+      .eccpos = { 0, 1, 2, 3, 6, 7 },
-+      .oobfree = { {.offset = 8, .length = 16} }
-+};
-+
-+static struct platform_nand_chip warp_nand_chip0 = {
-+      .nr_chips = 1,
-+      .chip_offset = CS_NAND_0,
-+      .nr_partitions = ARRAY_SIZE(nand_parts),
-+      .partitions = nand_parts,
-+      .chip_delay = 50,
-+      .ecclayout = &nand_oob_16,
-+      .priv = &warp_chip0_settings,
-+};
-+
-+static struct platform_device warp_nand_device = {
-+      .name = "ndfc-chip",
-+      .id = 0,
-+      .num_resources = 1,
-+      .resource = &warp_ndfc,
-+      .dev = {
-+              .platform_data = &warp_nand_chip0,
-+              .parent = &warp_ndfc_device.dev,
-+      }
-+};
-+
-+static int warp_setup_nand_flash(void)
-+{
-+      platform_device_register(&warp_ndfc_device);
-+      platform_device_register(&warp_nand_device);
-+
-+      return 0;
-+}
-+device_initcall(warp_setup_nand_flash);
-+
-+#endif
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/warp.c
-@@ -0,0 +1,153 @@
-+/*
-+ * PIKA Warp(tm) board specific routines
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ *   Sean MacLennan <smaclennan@pikatech.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.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <linux/kthread.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+
-+#include "44x.h"
-+
-+
-+static __initdata struct of_device_id warp_of_bus[] = {
-+      { .compatible = "ibm,plb4", },
-+      { .compatible = "ibm,opb", },
-+      { .compatible = "ibm,ebc", },
-+      {},
-+};
-+
-+static int __init warp_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, warp_of_bus, NULL);
-+      return 0;
-+}
-+machine_device_initcall(warp, warp_device_probe);
-+
-+static int __init warp_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      return of_flat_dt_is_compatible(root, "pika,warp");
-+}
-+
-+define_machine(warp) {
-+      .name           = "Warp",
-+      .probe          = warp_probe,
-+      .progress       = udbg_progress,
-+      .init_IRQ       = uic_init_tree,
-+      .get_irq        = uic_get_irq,
-+      .restart        = ppc44x_reset_system,
-+      .calibrate_decr = generic_calibrate_decr,
-+};
-+
-+
-+#define LED_GREEN (0x80000000 >> 0)
-+#define LED_RED   (0x80000000 >> 1)
-+
-+
-+/* This is for the power LEDs 1 = on, 0 = off, -1 = leave alone */
-+void warp_set_power_leds(int green, int red)
-+{
-+      static void __iomem *gpio_base = NULL;
-+      unsigned leds;
-+
-+      if (gpio_base == NULL) {
-+              struct device_node *np;
-+
-+              /* Power LEDS are on the second GPIO controller */
-+              np = of_find_compatible_node(NULL, NULL, "ibm,gpio-440EP");
-+              if (np)
-+                      np = of_find_compatible_node(np, NULL, "ibm,gpio-440EP");
-+              if (np == NULL) {
-+                      printk(KERN_ERR __FILE__ ": Unable to find gpio\n");
-+                      return;
-+              }
-+
-+              gpio_base = of_iomap(np, 0);
-+              of_node_put(np);
-+              if (gpio_base == NULL) {
-+                      printk(KERN_ERR __FILE__ ": Unable to map gpio");
-+                      return;
-+              }
-+      }
-+
-+      leds = in_be32(gpio_base);
-+
-+      switch (green) {
-+      case 0: leds &= ~LED_GREEN; break;
-+      case 1: leds |=  LED_GREEN; break;
-+      }
-+      switch (red) {
-+      case 0: leds &= ~LED_RED; break;
-+      case 1: leds |=  LED_RED; break;
-+      }
-+
-+      out_be32(gpio_base, leds);
-+}
-+EXPORT_SYMBOL(warp_set_power_leds);
-+
-+
-+#ifdef CONFIG_SENSORS_AD7414
-+static int pika_dtm_thread(void __iomem *fpga)
-+{
-+      extern int ad7414_get_temp(int index);
-+
-+      while (!kthread_should_stop()) {
-+              int temp = ad7414_get_temp(0);
-+
-+              out_be32(fpga, temp);
-+
-+              set_current_state(TASK_INTERRUPTIBLE);
-+              schedule_timeout(HZ);
-+      }
-+
-+      return 0;
-+}
-+
-+static int __init pika_dtm_start(void)
-+{
-+      struct task_struct *dtm_thread;
-+      struct device_node *np;
-+      struct resource res;
-+      void __iomem *fpga;
-+
-+      np = of_find_compatible_node(NULL, NULL, "pika,fpga");
-+      if (np == NULL)
-+              return -ENOENT;
-+
-+      /* We do not call of_iomap here since it would map in the entire
-+       * fpga space, which is over 8k.
-+       */
-+      if (of_address_to_resource(np, 0, &res)) {
-+              of_node_put(np);
-+              return -ENOENT;
-+      }
-+      of_node_put(np);
-+
-+      fpga = ioremap(res.start + 0x20, 4);
-+      if (fpga == NULL)
-+              return -ENOENT;
-+
-+      dtm_thread = kthread_run(pika_dtm_thread, fpga + 0x20, "pika-dtm");
-+      if (IS_ERR(dtm_thread)) {
-+              iounmap(fpga);
-+              return PTR_ERR(dtm_thread);
-+      }
-+
-+      return 0;
-+}
-+device_initcall(pika_dtm_start);
-+#endif
---- a/arch/powerpc/platforms/52xx/Kconfig
-+++ b/arch/powerpc/platforms/52xx/Kconfig
-@@ -19,6 +19,28 @@ config PPC_MPC5200_BUGFIX
-         It is safe to say 'Y' here
-+config PPC_MPC5200_SIMPLE
-+      bool "Generic support for simple MPC5200 based boards"
-+      depends on PPC_MULTIPLATFORM && PPC32
-+      select PPC_MPC5200
-+      select DEFAULT_UIMAGE
-+      select WANT_DEVICE_TREE
-+      default n
-+      help
-+        This option enables support for a simple MPC52xx based boards which
-+        do not need a custom platform specific setup. Such boards are
-+        supported assuming the following:
-+
-+        - GPIO pins are configured by the firmware,
-+        - CDM configuration (clocking) is setup correctly by firmware,
-+        - if the 'fsl,has-wdt' property is present in one of the
-+          gpt nodes, then it is safe to use such gpt to reset the board,
-+        - PCI is supported if enabled in the kernel configuration
-+          and if there is a PCI bus node defined in the device tree.
-+
-+        Boards that are compatible with this generic platform support
-+        are: 'tqc,tqm5200', 'promess,motionpro', 'schindler,cm5200'.
-+
- config PPC_EFIKA
-       bool "bPlan Efika 5k2. MPC5200B based computer"
-       depends on PPC_MULTIPLATFORM && PPC32
-@@ -31,8 +53,7 @@ config PPC_EFIKA
- config PPC_LITE5200
-       bool "Freescale Lite5200 Eval Board"
-       depends on PPC_MULTIPLATFORM && PPC32
--      select WANT_DEVICE_TREE
-       select PPC_MPC5200
-+      select DEFAULT_UIMAGE
-+      select WANT_DEVICE_TREE
-       default n
--
--
---- a/arch/powerpc/platforms/52xx/Makefile
-+++ b/arch/powerpc/platforms/52xx/Makefile
-@@ -6,6 +6,7 @@ obj-y                          += mpc52xx_pic.o mpc52xx_common
- obj-$(CONFIG_PCI)             += mpc52xx_pci.o
- endif
-+obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o
- obj-$(CONFIG_PPC_EFIKA)               += efika.o
- obj-$(CONFIG_PPC_LITE5200)    += lite5200.o
---- a/arch/powerpc/platforms/52xx/lite5200.c
-+++ b/arch/powerpc/platforms/52xx/lite5200.c
-@@ -42,10 +42,13 @@
- static void __init
- lite5200_fix_clock_config(void)
- {
-+      struct device_node *np;
-       struct mpc52xx_cdm  __iomem *cdm;
-       /* Map zones */
--      cdm = mpc52xx_find_and_map("mpc5200-cdm");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
-+      cdm = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!cdm) {
-               printk(KERN_ERR "%s() failed; expect abnormal behaviour\n",
-                      __FUNCTION__);
-@@ -74,10 +77,13 @@ lite5200_fix_clock_config(void)
- static void __init
- lite5200_fix_port_config(void)
- {
-+      struct device_node *np;
-       struct mpc52xx_gpio __iomem *gpio;
-       u32 port_config;
--      gpio = mpc52xx_find_and_map("mpc5200-gpio");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
-+      gpio = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!gpio) {
-               printk(KERN_ERR "%s() failed. expect abnormal behavior\n",
-                      __FUNCTION__);
-@@ -131,10 +137,6 @@ static void lite5200_resume_finish(void 
- static void __init lite5200_setup_arch(void)
- {
--#ifdef CONFIG_PCI
--      struct device_node *np;
--#endif
--
-       if (ppc_md.progress)
-               ppc_md.progress("lite5200_setup_arch()", 0);
-@@ -154,13 +156,7 @@ static void __init lite5200_setup_arch(v
-       lite5200_pm_init();
- #endif
--#ifdef CONFIG_PCI
--      np = of_find_node_by_type(NULL, "pci");
--      if (np) {
--              mpc52xx_add_bridge(np);
--              of_node_put(np);
--      }
--#endif
-+      mpc52xx_setup_pci();
- }
- /*
---- a/arch/powerpc/platforms/52xx/lite5200_pm.c
-+++ b/arch/powerpc/platforms/52xx/lite5200_pm.c
-@@ -42,6 +42,8 @@ static int lite5200_pm_set_target(suspen
- static int lite5200_pm_prepare(void)
- {
-+      struct device_node *np;
-+
-       /* deep sleep? let mpc52xx code handle that */
-       if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
-               return mpc52xx_pm_prepare();
-@@ -50,7 +52,9 @@ static int lite5200_pm_prepare(void)
-               return -EINVAL;
-       /* map registers */
--      mbar = mpc52xx_find_and_map("mpc5200");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200");
-+      mbar = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!mbar) {
-               printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
-               return -ENOSYS;
---- /dev/null
-+++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
-@@ -0,0 +1,85 @@
-+/*
-+ * Support for 'mpc5200-simple-platform' compatible boards.
-+ *
-+ * Written by Marian Balakowicz <m8@semihalf.com>
-+ * Copyright (C) 2007 Semihalf
-+ *
-+ * This 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.
-+ *
-+ * Description:
-+ * This code implements support for a simple MPC52xx based boards which
-+ * do not need a custom platform specific setup. Such boards are
-+ * supported assuming the following:
-+ *
-+ * - GPIO pins are configured by the firmware,
-+ * - CDM configuration (clocking) is setup correctly by firmware,
-+ * - if the 'fsl,has-wdt' property is present in one of the
-+ *   gpt nodes, then it is safe to use such gpt to reset the board,
-+ * - PCI is supported if enabled in the kernel configuration
-+ *   and if there is a PCI bus node defined in the device tree.
-+ *
-+ * Boards that are compatible with this generic platform support
-+ * are listed in a 'board' table.
-+ */
-+
-+#undef DEBUG
-+#include <asm/time.h>
-+#include <asm/prom.h>
-+#include <asm/machdep.h>
-+#include <asm/mpc52xx.h>
-+
-+/*
-+ * Setup the architecture
-+ */
-+static void __init mpc5200_simple_setup_arch(void)
-+{
-+      if (ppc_md.progress)
-+              ppc_md.progress("mpc5200_simple_setup_arch()", 0);
-+
-+      /* Some mpc5200 & mpc5200b related configuration */
-+      mpc5200_setup_xlb_arbiter();
-+
-+      /* Map wdt for mpc52xx_restart() */
-+      mpc52xx_map_wdt();
-+
-+      mpc52xx_setup_pci();
-+}
-+
-+/* list of the supported boards */
-+static char *board[] __initdata = {
-+      "promess,motionpro",
-+      "schindler,cm5200",
-+      "tqc,tqm5200",
-+      NULL
-+};
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init mpc5200_simple_probe(void)
-+{
-+      unsigned long node = of_get_flat_dt_root();
-+      int i = 0;
-+
-+      while (board[i]) {
-+              if (of_flat_dt_is_compatible(node, board[i]))
-+                      break;
-+              i++;
-+      }
-+      
-+      return (board[i] != NULL);
-+}
-+
-+define_machine(mpc5200_simple_platform) {
-+      .name           = "mpc5200-simple-platform",
-+      .probe          = mpc5200_simple_probe,
-+      .setup_arch     = mpc5200_simple_setup_arch,
-+      .init           = mpc52xx_declare_of_platform_devices,
-+      .init_IRQ       = mpc52xx_init_irq,
-+      .get_irq        = mpc52xx_get_irq,
-+      .restart        = mpc52xx_restart,
-+      .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/52xx/mpc52xx_common.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c
-@@ -26,45 +26,6 @@
-  */
- static volatile struct mpc52xx_gpt *mpc52xx_wdt = NULL;
--static void __iomem *
--mpc52xx_map_node(struct device_node *ofn)
--{
--      const u32 *regaddr_p;
--      u64 regaddr64, size64;
--
--      if (!ofn)
--              return NULL;
--
--      regaddr_p = of_get_address(ofn, 0, &size64, NULL);
--      if (!regaddr_p) {
--              of_node_put(ofn);
--              return NULL;
--      }
--
--      regaddr64 = of_translate_address(ofn, regaddr_p);
--
--      of_node_put(ofn);
--
--      return ioremap((u32)regaddr64, (u32)size64);
--}
--
--void __iomem *
--mpc52xx_find_and_map(const char *compatible)
--{
--      return mpc52xx_map_node(
--              of_find_compatible_node(NULL, NULL, compatible));
--}
--
--EXPORT_SYMBOL(mpc52xx_find_and_map);
--
--void __iomem *
--mpc52xx_find_and_map_path(const char *path)
--{
--      return mpc52xx_map_node(of_find_node_by_path(path));
--}
--
--EXPORT_SYMBOL(mpc52xx_find_and_map_path);
--
- /**
-  *    mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
-  *    @node:  device node
-@@ -101,9 +62,12 @@ EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
- void __init
- mpc5200_setup_xlb_arbiter(void)
- {
-+      struct device_node *np;
-       struct mpc52xx_xlb  __iomem *xlb;
--      xlb = mpc52xx_find_and_map("mpc5200-xlb");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-xlb");
-+      xlb = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!xlb) {
-               printk(KERN_ERR __FILE__ ": "
-                       "Error mapping XLB in mpc52xx_setup_cpu().  "
-@@ -124,11 +88,21 @@ mpc5200_setup_xlb_arbiter(void)
-       iounmap(xlb);
- }
-+static struct of_device_id mpc52xx_bus_ids[] __initdata= {
-+      { .compatible = "fsl,mpc5200-immr", },
-+      { .compatible = "fsl,lpb", },
-+
-+      /* depreciated matches; shouldn't be used in new device trees */
-+      { .type = "builtin", .compatible = "mpc5200", }, /* efika */
-+      { .type = "soc", .compatible = "mpc5200", }, /* lite5200 */
-+      {},
-+};
-+
- void __init
- mpc52xx_declare_of_platform_devices(void)
- {
-       /* Find every child of the SOC node and add it to of_platform */
--      if (of_platform_bus_probe(NULL, NULL, NULL))
-+      if (of_platform_bus_probe(NULL, mpc52xx_bus_ids, NULL))
-               printk(KERN_ERR __FILE__ ": "
-                       "Error while probing of_platform bus\n");
- }
-@@ -146,16 +120,19 @@ mpc52xx_map_wdt(void)
-       for_each_compatible_node(np, NULL, "fsl,mpc5200-gpt") {
-               has_wdt = of_get_property(np, "fsl,has-wdt", NULL);
-               if (has_wdt) {
--                      mpc52xx_wdt = mpc52xx_map_node(np);
-+                      mpc52xx_wdt = of_iomap(np, 0);
-+                      of_node_put(np);
-                       return;
-               }
-       }
-       for_each_compatible_node(np, NULL, "mpc5200-gpt") {
-               has_wdt = of_get_property(np, "has-wdt", NULL);
-               if (has_wdt) {
--                      mpc52xx_wdt = mpc52xx_map_node(np);
-+                      mpc52xx_wdt = of_iomap(np, 0);
-+                      of_node_put(np);
-                       return;
-               }
-+
-       }
- }
---- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
-@@ -363,7 +363,7 @@ mpc52xx_add_bridge(struct device_node *n
-       pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       if (of_address_to_resource(node, 0, &rsrc) != 0) {
-               printk(KERN_ERR "Can't get %s resources\n", node->full_name);
-@@ -406,3 +406,17 @@ mpc52xx_add_bridge(struct device_node *n
-       return 0;
- }
-+
-+void __init mpc52xx_setup_pci(void)
-+{
-+      struct device_node *pci;
-+
-+      pci = of_find_compatible_node(NULL, NULL, "fsl,mpc5200-pci");
-+      if (!pci)
-+              pci = of_find_compatible_node(NULL, NULL, "mpc5200-pci");
-+      if (!pci)
-+              return;
-+
-+      mpc52xx_add_bridge(pci);
-+      of_node_put(pci);
-+}
---- a/arch/powerpc/platforms/52xx/mpc52xx_pic.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
-@@ -364,16 +364,18 @@ void __init mpc52xx_init_irq(void)
- {
-       u32 intr_ctrl;
-       struct device_node *picnode;
-+      struct device_node *np;
-       /* Remap the necessary zones */
-       picnode = of_find_compatible_node(NULL, NULL, "mpc5200-pic");
--
--      intr = mpc52xx_find_and_map("mpc5200-pic");
-+      intr = of_iomap(picnode, 0);
-       if (!intr)
-               panic(__FILE__  ": find_and_map failed on 'mpc5200-pic'. "
-                               "Check node !");
--      sdma = mpc52xx_find_and_map("mpc5200-bestcomm");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-bestcomm");
-+      sdma = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!sdma)
-               panic(__FILE__  ": find_and_map failed on 'mpc5200-bestcomm'. "
-                               "Check node !");
---- a/arch/powerpc/platforms/52xx/mpc52xx_pm.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pm.c
-@@ -59,10 +59,14 @@ int mpc52xx_set_wakeup_gpio(u8 pin, u8 l
- int mpc52xx_pm_prepare(void)
- {
-+      struct device_node *np;
-+
-       /* map the whole register space */
--      mbar = mpc52xx_find_and_map("mpc5200");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200");
-+      mbar = of_iomap(np, 0);
-+      of_node_put(np);
-       if (!mbar) {
--              printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
-+              pr_err("mpc52xx_pm_prepare(): could not map registers\n");
-               return -ENOSYS;
-       }
-       /* these offsets are from mpc5200 users manual */
---- a/arch/powerpc/platforms/82xx/Kconfig
-+++ b/arch/powerpc/platforms/82xx/Kconfig
-@@ -26,6 +26,19 @@ config PQ2FADS
-       help
-         This option enables support for the PQ2FADS board
-+config EP8248E
-+      bool "Embedded Planet EP8248E (a.k.a. CWH-PPC-8248N-VE)"
-+      select 8272
-+      select 8260
-+      select FSL_SOC
-+      select PPC_CPM_NEW_BINDING
-+      select MDIO_BITBANG
-+      help
-+        This enables support for the Embedded Planet EP8248E board.
-+
-+        This board is also resold by Freescale as the QUICCStart
-+        MPC8248 Evaluation System and/or the CWH-PPC-8248N-VE.
-+
- endchoice
- config PQ2ADS
---- a/arch/powerpc/platforms/82xx/Makefile
-+++ b/arch/powerpc/platforms/82xx/Makefile
-@@ -5,3 +5,4 @@ obj-$(CONFIG_MPC8272_ADS) += mpc8272_ads
- obj-$(CONFIG_CPM2) += pq2.o
- obj-$(CONFIG_PQ2_ADS_PCI_PIC) += pq2ads-pci-pic.o
- obj-$(CONFIG_PQ2FADS) += pq2fads.o
-+obj-$(CONFIG_EP8248E) += ep8248e.o
---- /dev/null
-+++ b/arch/powerpc/platforms/82xx/ep8248e.c
-@@ -0,0 +1,324 @@
-+/*
-+ * Embedded Planet EP8248E support
-+ *
-+ * Copyright 2007 Freescale Semiconductor, Inc.
-+ * Author: Scott Wood <scottwood@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.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/mdio-bitbang.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/io.h>
-+#include <asm/cpm2.h>
-+#include <asm/udbg.h>
-+#include <asm/machdep.h>
-+#include <asm/time.h>
-+#include <asm/mpc8260.h>
-+#include <asm/prom.h>
-+
-+#include <sysdev/fsl_soc.h>
-+#include <sysdev/cpm2_pic.h>
-+
-+#include "pq2.h"
-+
-+static u8 __iomem *ep8248e_bcsr;
-+static struct device_node *ep8248e_bcsr_node;
-+
-+#define BCSR7_SCC2_ENABLE 0x10
-+
-+#define BCSR8_PHY1_ENABLE 0x80
-+#define BCSR8_PHY1_POWER  0x40
-+#define BCSR8_PHY2_ENABLE 0x20
-+#define BCSR8_PHY2_POWER  0x10
-+#define BCSR8_MDIO_READ   0x04
-+#define BCSR8_MDIO_CLOCK  0x02
-+#define BCSR8_MDIO_DATA   0x01
-+
-+#define BCSR9_USB_ENABLE  0x80
-+#define BCSR9_USB_POWER   0x40
-+#define BCSR9_USB_HOST    0x20
-+#define BCSR9_USB_FULL_SPEED_TARGET 0x10
-+
-+static void __init ep8248e_pic_init(void)
-+{
-+      struct device_node *np = of_find_compatible_node(NULL, NULL, "fsl,pq2-pic");
-+      if (!np) {
-+              printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
-+              return;
-+      }
-+
-+      cpm2_pic_init(np);
-+      of_node_put(np);
-+}
-+
-+static void ep8248e_set_mdc(struct mdiobb_ctrl *ctrl, int level)
-+{
-+      if (level)
-+              setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
-+      else
-+              clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
-+
-+      /* Read back to flush the write. */
-+      in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static void ep8248e_set_mdio_dir(struct mdiobb_ctrl *ctrl, int output)
-+{
-+      if (output)
-+              clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
-+      else
-+              setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
-+
-+      /* Read back to flush the write. */
-+      in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static void ep8248e_set_mdio_data(struct mdiobb_ctrl *ctrl, int data)
-+{
-+      if (data)
-+              setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
-+      else
-+              clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
-+
-+      /* Read back to flush the write. */
-+      in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static int ep8248e_get_mdio_data(struct mdiobb_ctrl *ctrl)
-+{
-+      return in_8(&ep8248e_bcsr[8]) & BCSR8_MDIO_DATA;
-+}
-+
-+static const struct mdiobb_ops ep8248e_mdio_ops = {
-+      .set_mdc = ep8248e_set_mdc,
-+      .set_mdio_dir = ep8248e_set_mdio_dir,
-+      .set_mdio_data = ep8248e_set_mdio_data,
-+      .get_mdio_data = ep8248e_get_mdio_data,
-+      .owner = THIS_MODULE,
-+};
-+
-+static struct mdiobb_ctrl ep8248e_mdio_ctrl = {
-+      .ops = &ep8248e_mdio_ops,
-+};
-+
-+static int __devinit ep8248e_mdio_probe(struct of_device *ofdev,
-+                                        const struct of_device_id *match)
-+{
-+      struct mii_bus *bus;
-+      struct resource res;
-+      struct device_node *node;
-+      int ret, i;
-+
-+      node = of_get_parent(ofdev->node);
-+      of_node_put(node);
-+      if (node != ep8248e_bcsr_node)
-+              return -ENODEV;
-+
-+      ret = of_address_to_resource(ofdev->node, 0, &res);
-+      if (ret)
-+              return ret;
-+
-+      bus = alloc_mdio_bitbang(&ep8248e_mdio_ctrl);
-+      if (!bus)
-+              return -ENOMEM;
-+
-+      bus->phy_mask = 0;
-+      bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
-+
-+      for (i = 0; i < PHY_MAX_ADDR; i++)
-+              bus->irq[i] = -1;
-+
-+      bus->name = "ep8248e-mdio-bitbang";
-+      bus->dev = &ofdev->dev;
-+      bus->id = res.start;
-+
-+      return mdiobus_register(bus);
-+}
-+
-+static int ep8248e_mdio_remove(struct of_device *ofdev)
-+{
-+      BUG();
-+      return 0;
-+}
-+
-+static const struct of_device_id ep8248e_mdio_match[] = {
-+      {
-+              .compatible = "fsl,ep8248e-mdio-bitbang",
-+      },
-+      {},
-+};
-+
-+static struct of_platform_driver ep8248e_mdio_driver = {
-+      .driver = {
-+              .name = "ep8248e-mdio-bitbang",
-+      },
-+      .match_table = ep8248e_mdio_match,
-+      .probe = ep8248e_mdio_probe,
-+      .remove = ep8248e_mdio_remove,
-+};
-+
-+struct cpm_pin {
-+      int port, pin, flags;
-+};
-+
-+static __initdata struct cpm_pin ep8248e_pins[] = {
-+      /* SMC1 */
-+      {2, 4, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+
-+      /* SCC1 */
-+      {2, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+      /* FCC1 */
-+      {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+      {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+      {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+      {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+      {2, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+      /* FCC2 */
-+      {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+      /* I2C */
-+      {4, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+      {4, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+
-+      /* USB */
-+      {2, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {2, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {2, 24, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+      {3, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {3, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+      {3, 25, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+};
-+
-+static void __init init_ioports(void)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(ep8248e_pins); i++) {
-+              const struct cpm_pin *pin = &ep8248e_pins[i];
-+              cpm2_set_pin(pin->port, pin->pin, pin->flags);
-+      }
-+
-+      cpm2_smc_clk_setup(CPM_CLK_SMC1, CPM_BRG7);
-+      cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
-+      cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
-+      cpm2_clk_setup(CPM_CLK_SCC3, CPM_CLK8, CPM_CLK_TX); /* USB */
-+      cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK11, CPM_CLK_RX);
-+      cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_TX);
-+      cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
-+      cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
-+}
-+
-+static void __init ep8248e_setup_arch(void)
-+{
-+      if (ppc_md.progress)
-+              ppc_md.progress("ep8248e_setup_arch()", 0);
-+
-+      cpm2_reset();
-+
-+      /* When this is set, snooping CPM DMA from RAM causes
-+       * machine checks.  See erratum SIU18.
-+       */
-+      clrbits32(&cpm2_immr->im_siu_conf.siu_82xx.sc_bcr, MPC82XX_BCR_PLDP);
-+
-+      ep8248e_bcsr_node =
-+              of_find_compatible_node(NULL, NULL, "fsl,ep8248e-bcsr");
-+      if (!ep8248e_bcsr_node) {
-+              printk(KERN_ERR "No bcsr in device tree\n");
-+              return;
-+      }
-+
-+      ep8248e_bcsr = of_iomap(ep8248e_bcsr_node, 0);
-+      if (!ep8248e_bcsr) {
-+              printk(KERN_ERR "Cannot map BCSR registers\n");
-+              of_node_put(ep8248e_bcsr_node);
-+              ep8248e_bcsr_node = NULL;
-+              return;
-+      }
-+
-+      setbits8(&ep8248e_bcsr[7], BCSR7_SCC2_ENABLE);
-+      setbits8(&ep8248e_bcsr[8], BCSR8_PHY1_ENABLE | BCSR8_PHY1_POWER |
-+                                 BCSR8_PHY2_ENABLE | BCSR8_PHY2_POWER);
-+
-+      init_ioports();
-+
-+      if (ppc_md.progress)
-+              ppc_md.progress("ep8248e_setup_arch(), finish", 0);
-+}
-+
-+static  __initdata struct of_device_id of_bus_ids[] = {
-+      { .compatible = "simple-bus", },
-+      { .compatible = "fsl,ep8248e-bcsr", },
-+      {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+      of_register_platform_driver(&ep8248e_mdio_driver);
-+
-+      return 0;
-+}
-+machine_device_initcall(ep8248e, declare_of_platform_devices);
-+
-+/*
-+ * Called very early, device-tree isn't unflattened
-+ */
-+static int __init ep8248e_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+      return of_flat_dt_is_compatible(root, "fsl,ep8248e");
-+}
-+
-+define_machine(ep8248e)
-+{
-+      .name = "Embedded Planet EP8248E",
-+      .probe = ep8248e_probe,
-+      .setup_arch = ep8248e_setup_arch,
-+      .init_IRQ = ep8248e_pic_init,
-+      .get_irq = cpm2_get_irq,
-+      .calibrate_decr = generic_calibrate_decr,
-+      .restart = pq2_restart,
-+      .progress = udbg_progress,
-+};
---- a/arch/powerpc/platforms/82xx/pq2.c
-+++ b/arch/powerpc/platforms/82xx/pq2.c
-@@ -53,13 +53,13 @@ static void __init pq2_pci_add_bridge(st
-       if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
-               goto err;
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       hose = pcibios_alloc_controller(np);
-       if (!hose)
-               return;
--      hose->arch_data = np;
-+      hose->dn = np;
-       setup_indirect_pci(hose, r.start + 0x100, r.start + 0x104, 0);
-       pci_process_bridge_OF_ranges(hose, np, 1);
---- a/arch/powerpc/platforms/82xx/pq2fads.c
-+++ b/arch/powerpc/platforms/82xx/pq2fads.c
-@@ -15,12 +15,12 @@
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/fsl_devices.h>
-+#include <linux/of_platform.h>
- #include <asm/io.h>
- #include <asm/cpm2.h>
- #include <asm/udbg.h>
- #include <asm/machdep.h>
--#include <asm/of_platform.h>
- #include <asm/time.h>
- #include <sysdev/fsl_soc.h>
---- a/arch/powerpc/platforms/83xx/Kconfig
-+++ b/arch/powerpc/platforms/83xx/Kconfig
-@@ -50,6 +50,11 @@ config MPC836x_MDS
-       help
-         This option enables support for the MPC836x MDS Processor Board.
-+config MPC837x_MDS
-+      bool "Freescale MPC837x MDS"
-+      select DEFAULT_UIMAGE
-+      help
-+        This option enables support for the MPC837x MDS Processor Board.
- endchoice
- config PPC_MPC831x
-@@ -75,3 +80,9 @@ config PPC_MPC836x
-       select PPC_UDBG_16550
-       select PPC_INDIRECT_PCI
-       default y if MPC836x_MDS
-+
-+config PPC_MPC837x
-+      bool
-+      select PPC_UDBG_16550
-+      select PPC_INDIRECT_PCI
-+      default y if MPC837x_MDS
---- a/arch/powerpc/platforms/83xx/Makefile
-+++ b/arch/powerpc/platforms/83xx/Makefile
-@@ -9,3 +9,4 @@ obj-$(CONFIG_MPC834x_MDS)      += mpc834x_mds
- obj-$(CONFIG_MPC834x_ITX)     += mpc834x_itx.o
- obj-$(CONFIG_MPC836x_MDS)     += mpc836x_mds.o
- obj-$(CONFIG_MPC832x_MDS)     += mpc832x_mds.o
-+obj-$(CONFIG_MPC837x_MDS)     += mpc837x_mds.o
---- a/arch/powerpc/platforms/83xx/mpc8313_rdb.c
-+++ b/arch/powerpc/platforms/83xx/mpc8313_rdb.c
-@@ -14,6 +14,7 @@
-  */
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
- #include <asm/time.h>
- #include <asm/ipic.h>
-@@ -70,11 +71,23 @@ void __init mpc8313_rdb_init_IRQ(void)
-  */
- static int __init mpc8313_rdb_probe(void)
- {
--        unsigned long root = of_get_flat_dt_root();
-+      unsigned long root = of_get_flat_dt_root();
--        return of_flat_dt_is_compatible(root, "MPC8313ERDB");
-+      return of_flat_dt_is_compatible(root, "MPC8313ERDB");
- }
-+static struct of_device_id __initdata of_bus_ids[] = {
-+      { .compatible = "simple-bus" },
-+      {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+      return 0;
-+}
-+machine_device_initcall(mpc8313_rdb, declare_of_platform_devices);
-+
- define_machine(mpc8313_rdb) {
-       .name                   = "MPC8313 RDB",
-       .probe                  = mpc8313_rdb_probe,
---- a/arch/powerpc/platforms/83xx/mpc832x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c
-@@ -23,9 +23,9 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/initrd.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -110,15 +110,12 @@ static struct of_device_id mpc832x_ids[]
- static int __init mpc832x_declare_of_platform_devices(void)
- {
--      if (!machine_is(mpc832x_mds))
--              return 0;
--
-       /* Publish the QE devices */
-       of_platform_bus_probe(NULL, mpc832x_ids, NULL);
-       return 0;
- }
--device_initcall(mpc832x_declare_of_platform_devices);
-+machine_device_initcall(mpc832x_mds, mpc832x_declare_of_platform_devices);
- static void __init mpc832x_sys_init_IRQ(void)
- {
---- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c
-+++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
-@@ -19,8 +19,8 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/mmc_spi.h>
- #include <linux/mmc/host.h>
-+#include <linux/of_platform.h>
--#include <asm/of_platform.h>
- #include <asm/time.h>
- #include <asm/ipic.h>
- #include <asm/udbg.h>
-@@ -63,9 +63,6 @@ static struct spi_board_info mpc832x_spi
- static int __init mpc832x_spi_init(void)
- {
--      if (!machine_is(mpc832x_rdb))
--              return 0;
--
-       par_io_config_pin(3,  0, 3, 0, 1, 0); /* SPI1 MOSI, I/O */
-       par_io_config_pin(3,  1, 3, 0, 1, 0); /* SPI1 MISO, I/O */
-       par_io_config_pin(3,  2, 3, 0, 1, 0); /* SPI1 CLK,  I/O */
-@@ -80,7 +77,7 @@ static int __init mpc832x_spi_init(void)
-                           mpc83xx_spi_deactivate_cs);
- }
--device_initcall(mpc832x_spi_init);
-+machine_device_initcall(mpc832x_rdb, mpc832x_spi_init);
- /* ************************************************************************
-  *
-@@ -123,15 +120,12 @@ static struct of_device_id mpc832x_ids[]
- static int __init mpc832x_declare_of_platform_devices(void)
- {
--      if (!machine_is(mpc832x_rdb))
--              return 0;
--
-       /* Publish the QE devices */
-       of_platform_bus_probe(NULL, mpc832x_ids, NULL);
-       return 0;
- }
--device_initcall(mpc832x_declare_of_platform_devices);
-+machine_device_initcall(mpc832x_rdb, mpc832x_declare_of_platform_devices);
- void __init mpc832x_rdb_init_IRQ(void)
- {
---- a/arch/powerpc/platforms/83xx/mpc834x_itx.c
-+++ b/arch/powerpc/platforms/83xx/mpc834x_itx.c
-@@ -23,6 +23,7 @@
- #include <linux/delay.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
-+#include <linux/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
-@@ -37,6 +38,17 @@
- #include "mpc83xx.h"
-+static struct of_device_id __initdata mpc834x_itx_ids[] = {
-+      { .compatible = "fsl,pq2pro-localbus", },
-+      {},
-+};
-+
-+static int __init mpc834x_itx_declare_of_platform_devices(void)
-+{
-+      return of_platform_bus_probe(NULL, mpc834x_itx_ids, NULL);
-+}
-+machine_device_initcall(mpc834x_itx, mpc834x_itx_declare_of_platform_devices);
-+
- /* ************************************************************************
-  *
-  * Setup the architecture
---- a/arch/powerpc/platforms/83xx/mpc834x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc834x_mds.c
-@@ -23,6 +23,7 @@
- #include <linux/delay.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
-+#include <linux/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
-@@ -106,14 +107,27 @@ static void __init mpc834x_mds_init_IRQ(
-       ipic_set_default_priority();
- }
-+static struct of_device_id mpc834x_ids[] = {
-+      { .type = "soc", },
-+      { .compatible = "soc", },
-+      {},
-+};
-+
-+static int __init mpc834x_declare_of_platform_devices(void)
-+{
-+      of_platform_bus_probe(NULL, mpc834x_ids, NULL);
-+      return 0;
-+}
-+machine_device_initcall(mpc834x_mds, mpc834x_declare_of_platform_devices);
-+
- /*
-  * Called very early, MMU is off, device-tree isn't unflattened
-  */
- static int __init mpc834x_mds_probe(void)
- {
--        unsigned long root = of_get_flat_dt_root();
-+      unsigned long root = of_get_flat_dt_root();
--        return of_flat_dt_is_compatible(root, "MPC834xMDS");
-+      return of_flat_dt_is_compatible(root, "MPC834xMDS");
- }
- define_machine(mpc834x_mds) {
---- a/arch/powerpc/platforms/83xx/mpc836x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c
-@@ -29,9 +29,9 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/initrd.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -141,15 +141,12 @@ static struct of_device_id mpc836x_ids[]
- static int __init mpc836x_declare_of_platform_devices(void)
- {
--      if (!machine_is(mpc836x_mds))
--              return 0;
--
-       /* Publish the QE devices */
-       of_platform_bus_probe(NULL, mpc836x_ids, NULL);
-       return 0;
- }
--device_initcall(mpc836x_declare_of_platform_devices);
-+machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices);
- static void __init mpc836x_mds_init_IRQ(void)
- {
---- /dev/null
-+++ b/arch/powerpc/platforms/83xx/mpc837x_mds.c
-@@ -0,0 +1,147 @@
-+/*
-+ * arch/powerpc/platforms/83xx/mpc837x_mds.c
-+ *
-+ * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
-+ *
-+ * MPC837x MDS board specific routines
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation;  either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/pci.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/time.h>
-+#include <asm/ipic.h>
-+#include <asm/udbg.h>
-+#include <asm/prom.h>
-+
-+#include "mpc83xx.h"
-+
-+#define BCSR12_USB_SER_MASK   0x8a
-+#define BCSR12_USB_SER_PIN    0x80
-+#define BCSR12_USB_SER_DEVICE 0x02
-+extern int mpc837x_usb_cfg(void);
-+
-+static int mpc837xmds_usb_cfg(void)
-+{
-+      struct device_node *np;
-+      const void *phy_type, *mode;
-+      void __iomem *bcsr_regs = NULL;
-+      u8 bcsr12;
-+      int ret;
-+
-+      ret = mpc837x_usb_cfg();
-+      if (ret)
-+              return ret;
-+      /* Map BCSR area */
-+      np = of_find_node_by_name(NULL, "bcsr");
-+      if (np) {
-+              struct resource res;
-+
-+              of_address_to_resource(np, 0, &res);
-+              bcsr_regs = ioremap(res.start, res.end - res.start + 1);
-+              of_node_put(np);
-+      }
-+      if (!bcsr_regs)
-+              return -1;
-+
-+      np = of_find_node_by_name(NULL, "usb");
-+      if (!np)
-+              return -ENODEV;
-+      phy_type = of_get_property(np, "phy_type", NULL);
-+      if (phy_type && !strcmp(phy_type, "ulpi")) {
-+              clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN);
-+      } else if (phy_type && !strcmp(phy_type, "serial")) {
-+              mode = of_get_property(np, "dr_mode", NULL);
-+              bcsr12 = in_8(bcsr_regs + 12) & ~BCSR12_USB_SER_MASK;
-+              bcsr12 |= BCSR12_USB_SER_PIN;
-+              if (mode && !strcmp(mode, "peripheral"))
-+                      bcsr12 |= BCSR12_USB_SER_DEVICE;
-+              out_8(bcsr_regs + 12, bcsr12);
-+      } else {
-+              printk(KERN_ERR "USB DR: unsupported PHY\n");
-+      }
-+
-+      of_node_put(np);
-+      iounmap(bcsr_regs);
-+      return 0;
-+}
-+
-+/* ************************************************************************
-+ *
-+ * Setup the architecture
-+ *
-+ */
-+static void __init mpc837x_mds_setup_arch(void)
-+{
-+#ifdef CONFIG_PCI
-+      struct device_node *np;
-+#endif
-+
-+      if (ppc_md.progress)
-+              ppc_md.progress("mpc837x_mds_setup_arch()", 0);
-+
-+#ifdef CONFIG_PCI
-+      for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
-+              mpc83xx_add_bridge(np);
-+#endif
-+      mpc837xmds_usb_cfg();
-+}
-+
-+static struct of_device_id mpc837x_ids[] = {
-+      { .type = "soc", },
-+      { .compatible = "soc", },
-+      {},
-+};
-+
-+static int __init mpc837x_declare_of_platform_devices(void)
-+{
-+      /* Publish of_device */
-+      of_platform_bus_probe(NULL, mpc837x_ids, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(mpc837x_mds, mpc837x_declare_of_platform_devices);
-+
-+static void __init mpc837x_mds_init_IRQ(void)
-+{
-+      struct device_node *np;
-+
-+      np = of_find_compatible_node(NULL, NULL, "fsl,ipic");
-+      if (!np)
-+              return;
-+
-+      ipic_init(np, 0);
-+
-+      /* Initialize the default interrupt mapping priorities,
-+       * in case the boot rom changed something on us.
-+       */
-+      ipic_set_default_priority();
-+}
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init mpc837x_mds_probe(void)
-+{
-+        unsigned long root = of_get_flat_dt_root();
-+
-+        return of_flat_dt_is_compatible(root, "fsl,mpc837xmds");
-+}
-+
-+define_machine(mpc837x_mds) {
-+      .name                   = "MPC837x MDS",
-+      .probe                  = mpc837x_mds_probe,
-+      .setup_arch             = mpc837x_mds_setup_arch,
-+      .init_IRQ               = mpc837x_mds_init_IRQ,
-+      .get_irq                = ipic_get_irq,
-+      .restart                = mpc83xx_restart,
-+      .time_init              = mpc83xx_time_init,
-+      .calibrate_decr         = generic_calibrate_decr,
-+      .progress               = udbg_progress,
-+};
---- a/arch/powerpc/platforms/83xx/mpc83xx.h
-+++ b/arch/powerpc/platforms/83xx/mpc83xx.h
-@@ -14,6 +14,7 @@
- #define MPC83XX_SCCR_USB_DRCM_11   0x00300000
- #define MPC83XX_SCCR_USB_DRCM_01   0x00100000
- #define MPC83XX_SCCR_USB_DRCM_10   0x00200000
-+#define MPC837X_SCCR_USB_DRCM_11   0x00c00000
- /* system i/o configuration register low */
- #define MPC83XX_SICRL_OFFS         0x114
-@@ -22,6 +23,8 @@
- #define MPC834X_SICRL_USB1         0x20000000
- #define MPC831X_SICRL_USB_MASK     0x00000c00
- #define MPC831X_SICRL_USB_ULPI     0x00000800
-+#define MPC837X_SICRL_USB_MASK     0xf0000000
-+#define MPC837X_SICRL_USB_ULPI     0x50000000
- /* system i/o configuration register high */
- #define MPC83XX_SICRH_OFFS         0x118
---- a/arch/powerpc/platforms/83xx/pci.c
-+++ b/arch/powerpc/platforms/83xx/pci.c
-@@ -54,7 +54,7 @@ int __init mpc83xx_add_bridge(struct dev
-                      " bus 0\n", dev->full_name);
-       }
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       hose = pcibios_alloc_controller(dev);
-       if (!hose)
-               return -ENOMEM;
---- a/arch/powerpc/platforms/83xx/usb.c
-+++ b/arch/powerpc/platforms/83xx/usb.c
-@@ -41,7 +41,7 @@ int mpc834x_usb_cfg(void)
-       sicrl = in_be32(immap + MPC83XX_SICRL_OFFS) & ~MPC834X_SICRL_USB_MASK;
-       sicrh = in_be32(immap + MPC83XX_SICRH_OFFS) & ~MPC834X_SICRH_USB_UTMI;
--      np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
-+      np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-       if (np) {
-               sccr |= MPC83XX_SCCR_USB_DRCM_11;  /* 1:3 */
-@@ -67,7 +67,7 @@ int mpc834x_usb_cfg(void)
-               port0_is_dr = 1;
-               of_node_put(np);
-       }
--      np = of_find_compatible_node(NULL, "usb", "fsl-usb2-mph");
-+      np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
-       if (np) {
-               sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
-@@ -111,7 +111,7 @@ int mpc831x_usb_cfg(void)
-       const void *dr_mode;
- #endif
--      np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
-+      np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-       if (!np)
-               return -ENODEV;
-       prop = of_get_property(np, "phy_type", NULL);
-@@ -179,3 +179,43 @@ int mpc831x_usb_cfg(void)
-       return ret;
- }
- #endif /* CONFIG_PPC_MPC831x */
-+
-+#ifdef CONFIG_PPC_MPC837x
-+int mpc837x_usb_cfg(void)
-+{
-+      void __iomem *immap;
-+      struct device_node *np = NULL;
-+      const void *prop;
-+      int ret = 0;
-+
-+      np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-+      if (!np)
-+              return -ENODEV;
-+      prop = of_get_property(np, "phy_type", NULL);
-+
-+      if (!prop || (strcmp(prop, "ulpi") && strcmp(prop, "serial"))) {
-+              printk(KERN_WARNING "837x USB PHY type not supported\n");
-+              of_node_put(np);
-+              return -EINVAL;
-+      }
-+
-+      /* Map IMMR space for pin and clock settings */
-+      immap = ioremap(get_immrbase(), 0x1000);
-+      if (!immap) {
-+              of_node_put(np);
-+              return -ENOMEM;
-+      }
-+
-+      /* Configure clock */
-+      clrsetbits_be32(immap + MPC83XX_SCCR_OFFS, MPC837X_SCCR_USB_DRCM_11,
-+                      MPC837X_SCCR_USB_DRCM_11);
-+
-+      /* Configure pin mux for ULPI/serial */
-+      clrsetbits_be32(immap + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USB_MASK,
-+                      MPC837X_SICRL_USB_ULPI);
-+
-+      iounmap(immap);
-+      of_node_put(np);
-+      return ret;
-+}
-+#endif /* CONFIG_PPC_MPC837x */
---- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-@@ -52,9 +52,9 @@ static void cpm2_cascade(unsigned int ir
- {
-       int cascade_irq;
--      while ((cascade_irq = cpm2_get_irq()) >= 0) {
-+      while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
--      }
-+
-       desc->chip->eoi(irq);
- }
-@@ -70,13 +70,12 @@ static void __init mpc85xx_ads_pic_init(
- #endif
-       np = of_find_node_by_type(np, "open-pic");
--
--      if (np == NULL) {
-+      if (!np) {
-               printk(KERN_ERR "Could not find open-pic node\n");
-               return;
-       }
--      if(of_address_to_resource(np, 0, &r)) {
-+      if (of_address_to_resource(np, 0, &r)) {
-               printk(KERN_ERR "Could not map mpic register space\n");
-               of_node_put(np);
-               return;
-@@ -100,6 +99,7 @@ static void __init mpc85xx_ads_pic_init(
-       irq = irq_of_parse_and_map(np, 0);
-       cpm2_pic_init(np);
-+      of_node_put(np);
-       set_irq_chained_handler(irq, cpm2_cascade);
- #endif
- }
-@@ -112,7 +112,7 @@ struct cpm_pin {
-       int port, pin, flags;
- };
--static struct cpm_pin mpc8560_ads_pins[] = {
-+static const struct cpm_pin mpc8560_ads_pins[] = {
-       /* SCC1 */
-       {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-       {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-@@ -233,13 +233,11 @@ static struct of_device_id __initdata of
- static int __init declare_of_platform_devices(void)
- {
--      if (!machine_is(mpc85xx_ads))
--              return 0;
--
-       of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
-       return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(mpc85xx_ads, declare_of_platform_devices);
- /*
-  * Called very early, device-tree isn't unflattened
---- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
-@@ -222,9 +222,6 @@ static int mpc85xx_cds_8259_attach(void)
-       struct device_node *cascade_node = NULL;
-       int cascade_irq;
--      if (!machine_is(mpc85xx_cds))
--              return 0;
--
-       /* Initialize the i8259 controller */
-       for_each_node_by_type(np, "interrupt-controller")
-               if (of_device_is_compatible(np, "chrp,iic")) {
-@@ -262,8 +259,7 @@ static int mpc85xx_cds_8259_attach(void)
-       return 0;
- }
--
--device_initcall(mpc85xx_cds_8259_attach);
-+machine_device_initcall(mpc85xx_cds, mpc85xx_cds_8259_attach);
- #endif /* CONFIG_PPC_I8259 */
---- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-@@ -123,7 +123,7 @@ static int mpc85xx_exclude_device(struct
-       struct device_node* node;
-       struct resource rsrc;
--      node = (struct device_node *)hose->arch_data;
-+      node = hose->dn;
-       of_address_to_resource(node, 0, &rsrc);
-       if ((rsrc.start & 0xfffff) == primary_phb_addr) {
---- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
-@@ -30,9 +30,9 @@
- #include <linux/initrd.h>
- #include <linux/module.h>
- #include <linux/fsl_devices.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -144,15 +144,12 @@ static struct of_device_id mpc85xx_ids[]
- static int __init mpc85xx_publish_devices(void)
- {
--      if (!machine_is(mpc85xx_mds))
--              return 0;
--
-       /* Publish the QE devices */
--      of_platform_bus_probe(NULL,mpc85xx_ids,NULL);
-+      of_platform_bus_probe(NULL, mpc85xx_ids, NULL);
-       return 0;
- }
--device_initcall(mpc85xx_publish_devices);
-+machine_device_initcall(mpc85xx_mds, mpc85xx_publish_devices);
- static void __init mpc85xx_mds_pic_init(void)
- {
---- a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-+++ b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-@@ -34,9 +34,24 @@
- #include <asm/mpic.h>
-+#include <linux/of_platform.h>
- #include <sysdev/fsl_pci.h>
- #include <sysdev/fsl_soc.h>
-+static struct of_device_id __initdata mpc8610_ids[] = {
-+      { .compatible = "fsl,mpc8610-immr", },
-+      {}
-+};
-+
-+static int __init mpc8610_declare_of_platform_devices(void)
-+{
-+      /* Without this call, the SSI device driver won't get probed. */
-+      of_platform_bus_probe(NULL, mpc8610_ids, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices);
-+
- void __init
- mpc86xx_hpcd_init_irq(void)
- {
-@@ -124,7 +139,7 @@ static void __devinit quirk_uli5229(stru
- static void __devinit final_uli5288(struct pci_dev *dev)
- {
-       struct pci_controller *hose = pci_bus_to_host(dev->bus);
--      struct device_node *hosenode = hose ? hose->arch_data : NULL;
-+      struct device_node *hosenode = hose ? hose->dn : NULL;
-       struct of_irq oirq;
-       int virq, pin = 2;
-       u32 laddr[3];
---- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-+++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-@@ -18,6 +18,7 @@
- #include <linux/kdev_t.h>
- #include <linux/delay.h>
- #include <linux/seq_file.h>
-+#include <linux/of_platform.h>
- #include <asm/system.h>
- #include <asm/time.h>
-@@ -116,7 +117,7 @@ static int mpc86xx_exclude_device(struct
-       struct device_node* node;       
-       struct resource rsrc;
--      node = (struct device_node *)hose->arch_data;
-+      node = hose->dn;
-       of_address_to_resource(node, 0, &rsrc);
-       if ((rsrc.start & 0xfffff) == 0x8000) {
-@@ -212,6 +213,19 @@ mpc86xx_time_init(void)
-       return 0;
- }
-+static __initdata struct of_device_id of_bus_ids[] = {
-+      { .compatible = "simple-bus", },
-+      {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
-+      return 0;
-+}
-+machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices);
-+
- define_machine(mpc86xx_hpcn) {
-       .name                   = "MPC86xx HPCN",
-       .probe                  = mpc86xx_hpcn_probe,
---- a/arch/powerpc/platforms/8xx/Kconfig
-+++ b/arch/powerpc/platforms/8xx/Kconfig
-@@ -18,6 +18,7 @@ config MPC8XXFADS
- config MPC86XADS
-       bool "MPC86XADS"
-       select CPM1
-+      select PPC_CPM_NEW_BINDING
-       help
-         MPC86x Application Development System by Freescale Semiconductor.
-         The MPC86xADS is meant to serve as a platform for s/w and h/w
-@@ -43,6 +44,15 @@ config PPC_EP88XC
-         This board is also resold by Freescale as the QUICCStart
-         MPC885 Evaluation System and/or the CWH-PPC-885XN-VE.
-+config PPC_ADDER875
-+      bool "Analogue & Micro Adder 875"
-+      select CPM1
-+      select PPC_CPM_NEW_BINDING
-+      select REDBOOT
-+      help
-+        This enables support for the Analogue & Micro Adder 875
-+        board.
-+
- endchoice
- menu "Freescale Ethernet driver platform-specific options"
---- a/arch/powerpc/platforms/8xx/Makefile
-+++ b/arch/powerpc/platforms/8xx/Makefile
-@@ -5,3 +5,4 @@ obj-$(CONFIG_PPC_8xx)    += m8xx_setup.o
- obj-$(CONFIG_MPC885ADS)   += mpc885ads_setup.o
- obj-$(CONFIG_MPC86XADS)   += mpc86xads_setup.o
- obj-$(CONFIG_PPC_EP88XC)  += ep88xc.o
-+obj-$(CONFIG_PPC_ADDER875) += adder875.o
---- /dev/null
-+++ b/arch/powerpc/platforms/8xx/adder875.c
-@@ -0,0 +1,118 @@
-+/* Analogue & Micro Adder MPC875 board support
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 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.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/fs_enet_pd.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/time.h>
-+#include <asm/machdep.h>
-+#include <asm/commproc.h>
-+#include <asm/fs_pd.h>
-+#include <asm/udbg.h>
-+#include <asm/prom.h>
-+
-+#include <sysdev/commproc.h>
-+
-+struct cpm_pin {
-+      int port, pin, flags;
-+};
-+
-+static __initdata struct cpm_pin adder875_pins[] = {
-+      /* SMC1 */
-+      {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
-+      {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+      /* MII1 */
-+      {CPM_PORTA, 0, CPM_PIN_INPUT},
-+      {CPM_PORTA, 1, CPM_PIN_INPUT},
-+      {CPM_PORTA, 2, CPM_PIN_INPUT},
-+      {CPM_PORTA, 3, CPM_PIN_INPUT},
-+      {CPM_PORTA, 4, CPM_PIN_OUTPUT},
-+      {CPM_PORTA, 10, CPM_PIN_OUTPUT},
-+      {CPM_PORTA, 11, CPM_PIN_OUTPUT},
-+      {CPM_PORTB, 19, CPM_PIN_INPUT},
-+      {CPM_PORTB, 31, CPM_PIN_INPUT},
-+      {CPM_PORTC, 12, CPM_PIN_INPUT},
-+      {CPM_PORTC, 13, CPM_PIN_INPUT},
-+      {CPM_PORTE, 30, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 31, CPM_PIN_OUTPUT},
-+
-+      /* MII2 */
-+      {CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 16, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+      {CPM_PORTE, 21, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 22, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 23, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 24, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 25, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 26, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 27, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 28, CPM_PIN_OUTPUT},
-+      {CPM_PORTE, 29, CPM_PIN_OUTPUT},
-+};
-+
-+static void __init init_ioports(void)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(adder875_pins); i++) {
-+              const struct cpm_pin *pin = &adder875_pins[i];
-+              cpm1_set_pin(pin->port, pin->pin, pin->flags);
-+      }
-+
-+      cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
-+
-+      /* Set FEC1 and FEC2 to MII mode */
-+      clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
-+}
-+
-+static void __init adder875_setup(void)
-+{
-+      cpm_reset();
-+      init_ioports();
-+}
-+
-+static int __init adder875_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+      return of_flat_dt_is_compatible(root, "analogue-and-micro,adder875");
-+}
-+
-+static __initdata struct of_device_id of_bus_ids[] = {
-+      { .compatible = "simple-bus", },
-+      {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+      return 0;
-+}
-+machine_device_initcall(adder875, declare_of_platform_devices);
-+
-+define_machine(adder875) {
-+      .name = "Adder MPC875",
-+      .probe = adder875_probe,
-+      .setup_arch = adder875_setup,
-+      .init_IRQ = m8xx_pic_init,
-+      .get_irq = mpc8xx_get_irq,
-+      .restart = mpc8xx_restart,
-+      .calibrate_decr = generic_calibrate_decr,
-+      .set_rtc_time = mpc8xx_set_rtc_time,
-+      .get_rtc_time = mpc8xx_get_rtc_time,
-+      .progress = udbg_progress,
-+};
---- a/arch/powerpc/platforms/8xx/ep88xc.c
-+++ b/arch/powerpc/platforms/8xx/ep88xc.c
-@@ -155,12 +155,11 @@ static struct of_device_id __initdata of
- static int __init declare_of_platform_devices(void)
- {
-       /* Publish the QE devices */
--      if (machine_is(ep88xc))
--              of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-       return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(ep88xc, declare_of_platform_devices);
- define_machine(ep88xc) {
-       .name = "Embedded Planet EP88xC",
---- a/arch/powerpc/platforms/8xx/m8xx_setup.c
-+++ b/arch/powerpc/platforms/8xx/m8xx_setup.c
-@@ -120,7 +120,7 @@ void __init mpc8xx_calibrate_decr(void)
-       ppc_tb_freq /= 16;
-       ppc_proc_freq = 50000000;
-       if (!get_freq("clock-frequency", &ppc_proc_freq))
--              printk(KERN_ERR "WARNING: Estimating processor frequency"
-+              printk(KERN_ERR "WARNING: Estimating processor frequency "
-                               "(not found)\n");
-       printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
---- a/arch/powerpc/platforms/8xx/mpc86xads.h
-+++ b/arch/powerpc/platforms/8xx/mpc86xads.h
-@@ -15,27 +15,6 @@
- #ifndef __ASM_MPC86XADS_H__
- #define __ASM_MPC86XADS_H__
--#include <sysdev/fsl_soc.h>
--
--/* U-Boot maps BCSR to 0xff080000 */
--#define BCSR_ADDR             ((uint)0xff080000)
--#define BCSR_SIZE             ((uint)32)
--#define BCSR0                 ((uint)(BCSR_ADDR + 0x00))
--#define BCSR1                 ((uint)(BCSR_ADDR + 0x04))
--#define BCSR2                 ((uint)(BCSR_ADDR + 0x08))
--#define BCSR3                 ((uint)(BCSR_ADDR + 0x0c))
--#define BCSR4                 ((uint)(BCSR_ADDR + 0x10))
--
--#define CFG_PHYDEV_ADDR               ((uint)0xff0a0000)
--#define BCSR5                 ((uint)(CFG_PHYDEV_ADDR + 0x300))
--
--#define MPC8xx_CPM_OFFSET     (0x9c0)
--#define CPM_MAP_ADDR          (get_immrbase() + MPC8xx_CPM_OFFSET)
--#define CPM_IRQ_OFFSET                16     // for compability with cpm_uart driver
--
--#define PCMCIA_MEM_ADDR               ((uint)0xff020000)
--#define PCMCIA_MEM_SIZE               ((uint)(64 * 1024))
--
- /* Bits of interest in the BCSRs.
-  */
- #define BCSR1_ETHEN           ((uint)0x20000000)
-@@ -64,28 +43,5 @@
- #define BCSR5_MII1_EN         0x02
- #define BCSR5_MII1_RST                0x01
--/* Interrupt level assignments */
--#define PHY_INTERRUPT SIU_IRQ7        /* PHY link change interrupt */
--#define SIU_INT_FEC1  SIU_LEVEL1      /* FEC1 interrupt */
--#define FEC_INTERRUPT SIU_INT_FEC1    /* FEC interrupt */
--
--/* We don't use the 8259 */
--#define NR_8259_INTS  0
--
--/* CPM Ethernet through SCC1 */
--#define PA_ENET_RXD     ((ushort)0x0001)
--#define PA_ENET_TXD     ((ushort)0x0002)
--#define PA_ENET_TCLK    ((ushort)0x0100)
--#define PA_ENET_RCLK    ((ushort)0x0200)
--#define PB_ENET_TENA    ((uint)0x00001000)
--#define PC_ENET_CLSN    ((ushort)0x0010)
--#define PC_ENET_RENA    ((ushort)0x0020)
--
--/* Control bits in the SICR to route TCLK (CLK1) and RCLK (CLK2) to
-- * SCC1.  Also, make sure GR1 (bit 24) and SC1 (bit 25) are zero.
-- */
--#define SICR_ENET_MASK  ((uint)0x000000ff)
--#define SICR_ENET_CLKRT ((uint)0x0000002c)
--
- #endif /* __ASM_MPC86XADS_H__ */
- #endif /* __KERNEL__ */
---- a/arch/powerpc/platforms/8xx/mpc86xads_setup.c
-+++ b/arch/powerpc/platforms/8xx/mpc86xads_setup.c
-@@ -6,264 +6,133 @@
-  *
-  * Copyright 2005 MontaVista Software Inc.
-  *
-+ * Heavily modified by Scott Wood <scottwood@freescale.com>
-+ * Copyright 2007 Freescale Semiconductor, 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/init.h>
--#include <linux/module.h>
--#include <linux/param.h>
--#include <linux/string.h>
--#include <linux/ioport.h>
--#include <linux/device.h>
--#include <linux/delay.h>
--#include <linux/root_dev.h>
--
--#include <linux/fs_enet_pd.h>
--#include <linux/fs_uart_pd.h>
--#include <linux/mii.h>
-+#include <linux/of_platform.h>
--#include <asm/delay.h>
- #include <asm/io.h>
- #include <asm/machdep.h>
--#include <asm/page.h>
--#include <asm/processor.h>
- #include <asm/system.h>
- #include <asm/time.h>
- #include <asm/mpc8xx.h>
- #include <asm/8xx_immap.h>
- #include <asm/commproc.h>
- #include <asm/fs_pd.h>
--#include <asm/prom.h>
-+#include <asm/udbg.h>
- #include <sysdev/commproc.h>
--static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi);
--static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi);
--static void init_scc1_ioports(struct fs_platform_info* ptr);
--
--void __init mpc86xads_board_setup(void)
--{
--      cpm8xx_t *cp;
--      unsigned int *bcsr_io;
--      u8 tmpval8;
--
--      bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
--      cp = (cpm8xx_t *)immr_map(im_cpm);
-+#include "mpc86xads.h"
--      if (bcsr_io == NULL) {
--              printk(KERN_CRIT "Could not remap BCSR\n");
--              return;
--      }
--#ifdef CONFIG_SERIAL_CPM_SMC1
--      clrbits32(bcsr_io, BCSR1_RS232EN_1);
--      clrbits32(&cp->cp_simode, 0xe0000000 >> 17);    /* brg1 */
--      tmpval8 = in_8(&(cp->cp_smc[0].smc_smcm)) | (SMCM_RX | SMCM_TX);
--      out_8(&(cp->cp_smc[0].smc_smcm), tmpval8);
--      clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
--#else
--      setbits32(bcsr_io,BCSR1_RS232EN_1);
--      out_be16(&cp->cp_smc[0].smc_smcmr, 0);
--      out_8(&cp->cp_smc[0].smc_smce, 0);
--#endif
--
--#ifdef CONFIG_SERIAL_CPM_SMC2
--      clrbits32(bcsr_io,BCSR1_RS232EN_2);
--      clrbits32(&cp->cp_simode, 0xe0000000 >> 1);
--      setbits32(&cp->cp_simode, 0x20000000 >> 1);     /* brg2 */
--      tmpval8 = in_8(&(cp->cp_smc[1].smc_smcm)) | (SMCM_RX | SMCM_TX);
--      out_8(&(cp->cp_smc[1].smc_smcm), tmpval8);
--      clrbits16(&cp->cp_smc[1].smc_smcmr, SMCMR_REN | SMCMR_TEN);
--
--      init_smc2_uart_ioports(0);
--#else
--      setbits32(bcsr_io,BCSR1_RS232EN_2);
--      out_be16(&cp->cp_smc[1].smc_smcmr, 0);
--      out_8(&cp->cp_smc[1].smc_smce, 0);
--#endif
--      immr_unmap(cp);
--      iounmap(bcsr_io);
--}
-+struct cpm_pin {
-+      int port, pin, flags;
-+};
-+static struct cpm_pin mpc866ads_pins[] = {
-+      /* SMC1 */
-+      {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
-+      {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+      /* SMC2 */
-+      {CPM_PORTB, 21, CPM_PIN_INPUT}, /* RX */
-+      {CPM_PORTB, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+      /* SCC1 */
-+      {CPM_PORTA, 6, CPM_PIN_INPUT}, /* CLK1 */
-+      {CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */
-+      {CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */
-+      {CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */
-+      {CPM_PORTB, 19, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
-+      {CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
-+      {CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
-+
-+      /* MII */
-+      {CPM_PORTD, 3, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 4, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 5, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 6, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 7, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 8, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 9, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 10, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 11, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 12, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 13, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 14, CPM_PIN_OUTPUT},
-+      {CPM_PORTD, 15, CPM_PIN_OUTPUT},
-+};
--static void init_fec1_ioports(struct fs_platform_info* ptr)
-+static void __init init_ioports(void)
- {
--      iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
-+      int i;
--      /* configure FEC1 pins  */
-+      for (i = 0; i < ARRAY_SIZE(mpc866ads_pins); i++) {
-+              struct cpm_pin *pin = &mpc866ads_pins[i];
-+              cpm1_set_pin(pin->port, pin->pin, pin->flags);
-+      }
--      setbits16(&io_port->iop_pdpar, 0x1fff);
--      setbits16(&io_port->iop_pddir, 0x1fff);
-+      cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
-+      cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
-+      cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK1, CPM_CLK_TX);
-+      cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
--      immr_unmap(io_port);
-+      /* Set FEC1 and FEC2 to MII mode */
-+      clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
- }
--void init_fec_ioports(struct fs_platform_info *fpi)
-+static void __init mpc86xads_setup_arch(void)
- {
--      int fec_no = fs_get_fec_index(fpi->fs_no);
-+      struct device_node *np;
-+      u32 __iomem *bcsr_io;
-+
-+      cpm_reset();
-+      init_ioports();
--      switch (fec_no) {
--      case 0:
--              init_fec1_ioports(fpi);
--              break;
--      default:
--              printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
-+      np = of_find_compatible_node(NULL, NULL, "fsl,mpc866ads-bcsr");
-+      if (!np) {
-+              printk(KERN_CRIT "Could not find fsl,mpc866ads-bcsr node\n");
-               return;
-       }
--}
--static void init_scc1_ioports(struct fs_platform_info* fpi)
--{
--      unsigned *bcsr_io;
--      iop8xx_t *io_port;
--      cpm8xx_t *cp;
--
--      bcsr_io = ioremap(BCSR_ADDR, BCSR_SIZE);
--      io_port = (iop8xx_t *)immr_map(im_ioport);
--      cp = (cpm8xx_t *)immr_map(im_cpm);
-+      bcsr_io = of_iomap(np, 0);
-+      of_node_put(np);
-       if (bcsr_io == NULL) {
-               printk(KERN_CRIT "Could not remap BCSR\n");
-               return;
-       }
--      /* Configure port A pins for Txd and Rxd.
--       */
--      setbits16(&io_port->iop_papar, PA_ENET_RXD | PA_ENET_TXD);
--      clrbits16(&io_port->iop_padir, PA_ENET_RXD | PA_ENET_TXD);
--      clrbits16(&io_port->iop_paodr, PA_ENET_TXD);
--
--      /* Configure port C pins to enable CLSN and RENA.
--       */
--      clrbits16(&io_port->iop_pcpar, PC_ENET_CLSN | PC_ENET_RENA);
--      clrbits16(&io_port->iop_pcdir, PC_ENET_CLSN | PC_ENET_RENA);
--      setbits16(&io_port->iop_pcso, PC_ENET_CLSN | PC_ENET_RENA);
--
--      /* Configure port A for TCLK and RCLK.
--       */
--      setbits16(&io_port->iop_papar, PA_ENET_TCLK | PA_ENET_RCLK);
--        clrbits16(&io_port->iop_padir, PA_ENET_TCLK | PA_ENET_RCLK);
--        clrbits32(&cp->cp_pbpar, PB_ENET_TENA);
--        clrbits32(&cp->cp_pbdir, PB_ENET_TENA);
--
--      /* Configure Serial Interface clock routing.
--       * First, clear all SCC bits to zero, then set the ones we want.
--       */
--      clrbits32(&cp->cp_sicr, SICR_ENET_MASK);
--      setbits32(&cp->cp_sicr, SICR_ENET_CLKRT);
--
--      /* In the original SCC enet driver the following code is placed at
--         the end of the initialization */
--        setbits32(&cp->cp_pbpar, PB_ENET_TENA);
--        setbits32(&cp->cp_pbdir, PB_ENET_TENA);
--
--      clrbits32(bcsr_io+1, BCSR1_ETHEN);
-+      clrbits32(bcsr_io, BCSR1_RS232EN_1 | BCSR1_RS232EN_2 | BCSR1_ETHEN);
-       iounmap(bcsr_io);
--      immr_unmap(cp);
--      immr_unmap(io_port);
--}
--
--void init_scc_ioports(struct fs_platform_info *fpi)
--{
--      int scc_no = fs_get_scc_index(fpi->fs_no);
--
--      switch (scc_no) {
--      case 0:
--              init_scc1_ioports(fpi);
--              break;
--      default:
--              printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
--              return;
--      }
- }
--
--
--static void init_smc1_uart_ioports(struct fs_uart_platform_info* ptr)
-+static int __init mpc86xads_probe(void)
- {
--        unsigned *bcsr_io;
--      cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
--
--      setbits32(&cp->cp_pbpar, 0x000000c0);
--      clrbits32(&cp->cp_pbdir, 0x000000c0);
--      clrbits16(&cp->cp_pbodr, 0x00c0);
--      immr_unmap(cp);
--
--        bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
--
--        if (bcsr_io == NULL) {
--                printk(KERN_CRIT "Could not remap BCSR1\n");
--                return;
--        }
--        clrbits32(bcsr_io,BCSR1_RS232EN_1);
--        iounmap(bcsr_io);
-+      unsigned long root = of_get_flat_dt_root();
-+      return of_flat_dt_is_compatible(root, "fsl,mpc866ads");
- }
--static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi)
--{
--        unsigned *bcsr_io;
--      cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
--
--      setbits32(&cp->cp_pbpar, 0x00000c00);
--      clrbits32(&cp->cp_pbdir, 0x00000c00);
--      clrbits16(&cp->cp_pbodr, 0x0c00);
--      immr_unmap(cp);
--
--        bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
--
--        if (bcsr_io == NULL) {
--                printk(KERN_CRIT "Could not remap BCSR1\n");
--                return;
--        }
--        clrbits32(bcsr_io,BCSR1_RS232EN_2);
--        iounmap(bcsr_io);
--}
-+static struct of_device_id __initdata of_bus_ids[] = {
-+      { .name = "soc", },
-+      { .name = "cpm", },
-+      { .name = "localbus", },
-+      {},
-+};
--void init_smc_ioports(struct fs_uart_platform_info *data)
-+static int __init declare_of_platform_devices(void)
- {
--      int smc_no = fs_uart_id_fsid2smc(data->fs_no);
--
--      switch (smc_no) {
--      case 0:
--              init_smc1_uart_ioports(data);
--              data->brg = data->clk_rx;
--              break;
--      case 1:
--              init_smc2_uart_ioports(data);
--              data->brg = data->clk_rx;
--              break;
--      default:
--              printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
--              return;
--      }
--}
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
--int platform_device_skip(const char *model, int id)
--{
-       return 0;
- }
--
--static void __init mpc86xads_setup_arch(void)
--{
--      cpm_reset();
--
--      mpc86xads_board_setup();
--
--      ROOT_DEV = Root_NFS;
--}
--
--static int __init mpc86xads_probe(void)
--{
--      char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
--                                        "model", NULL);
--      if (model == NULL)
--              return 0;
--      if (strcmp(model, "MPC866ADS"))
--              return 0;
--
--      return 1;
--}
-+machine_device_initcall(mpc86x_ads, declare_of_platform_devices);
- define_machine(mpc86x_ads) {
-       .name                   = "MPC86x ADS",
-@@ -275,4 +144,5 @@ define_machine(mpc86x_ads) {
-       .calibrate_decr         = mpc8xx_calibrate_decr,
-       .set_rtc_time           = mpc8xx_set_rtc_time,
-       .get_rtc_time           = mpc8xx_get_rtc_time,
-+      .progress               = udbg_progress,
- };
---- a/arch/powerpc/platforms/8xx/mpc885ads_setup.c
-+++ b/arch/powerpc/platforms/8xx/mpc885ads_setup.c
-@@ -264,12 +264,11 @@ static struct of_device_id __initdata of
- static int __init declare_of_platform_devices(void)
- {
-       /* Publish the QE devices */
--      if (machine_is(mpc885_ads))
--              of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+      of_platform_bus_probe(NULL, of_bus_ids, NULL);
-       return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(mpc885_ads, declare_of_platform_devices);
- define_machine(mpc885_ads) {
-       .name                   = "Freescale MPC885 ADS",
---- a/arch/powerpc/platforms/Kconfig
-+++ b/arch/powerpc/platforms/Kconfig
-@@ -22,6 +22,7 @@ config PPC_83xx
-       depends on 6xx
-       select FSL_SOC
-       select 83xx
-+      select IPIC
-       select WANT_DEVICE_TREE
- config PPC_86xx
-@@ -80,6 +81,10 @@ config XICS
-       bool
-       default y
-+config IPIC
-+      bool
-+      default n
-+
- config MPIC
-       bool
-       default n
-@@ -265,6 +270,7 @@ config TAU_AVERAGE
- config QUICC_ENGINE
-       bool
-       select PPC_LIB_RHEAP
-+      select CRC32
-       help
-         The QUICC Engine (QE) is a new generation of communications
-         coprocessors on Freescale embedded CPUs (akin to CPM in older chips).
-@@ -315,6 +321,12 @@ config FSL_ULI1575
- config CPM
-       bool
-+config OF_RTC
-+      bool
-+      help
-+        Uses information from the OF or flattened device tree to instatiate
-+        platform devices for direct mapped RTC chips like the DS1742 or DS1743.
-+
- source "arch/powerpc/sysdev/bestcomm/Kconfig"
- endmenu
---- a/arch/powerpc/platforms/Kconfig.cputype
-+++ b/arch/powerpc/platforms/Kconfig.cputype
-@@ -43,6 +43,7 @@ config 40x
-       bool "AMCC 40x"
-       select PPC_DCR_NATIVE
-       select WANT_DEVICE_TREE
-+      select PPC_UDBG_16550
- config 44x
-       bool "AMCC 44x"
---- a/arch/powerpc/platforms/cell/Makefile
-+++ b/arch/powerpc/platforms/cell/Makefile
-@@ -20,7 +20,7 @@ spu-manage-$(CONFIG_PPC_CELL_NATIVE) += 
- obj-$(CONFIG_SPU_BASE)                        += spu_callbacks.o spu_base.o \
-                                          spu_notify.o \
--                                         spu_syscalls.o \
-+                                         spu_syscalls.o spu_fault.o \
-                                          $(spu-priv1-y) \
-                                          $(spu-manage-y) \
-                                          spufs/
---- a/arch/powerpc/platforms/cell/cbe_cpufreq.c
-+++ b/arch/powerpc/platforms/cell/cbe_cpufreq.c
-@@ -21,8 +21,9 @@
-  */
- #include <linux/cpufreq.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/machdep.h>
--#include <asm/of_platform.h>
- #include <asm/prom.h>
- #include <asm/cell-regs.h>
- #include "cbe_cpufreq.h"
---- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
-+++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
-@@ -23,7 +23,8 @@
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/timer.h>
--#include <asm/of_platform.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/processor.h>
- #include <asm/prom.h>
- #include <asm/pmi.h>
---- a/arch/powerpc/platforms/cell/cbe_regs.c
-+++ b/arch/powerpc/platforms/cell/cbe_regs.c
-@@ -9,13 +9,13 @@
- #include <linux/percpu.h>
- #include <linux/types.h>
- #include <linux/module.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
- #include <asm/io.h>
- #include <asm/pgtable.h>
- #include <asm/prom.h>
- #include <asm/ptrace.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/cell-regs.h>
- /*
-@@ -256,6 +256,7 @@ void __init cbe_regs_init(void)
-                       printk(KERN_ERR "cbe_regs: More BE chips than supported"
-                              "!\n");
-                       cbe_regs_map_count--;
-+                      of_node_put(cpu);
-                       return;
-               }
-               map->cpu_node = cpu;
---- a/arch/powerpc/platforms/cell/io-workarounds.c
-+++ b/arch/powerpc/platforms/cell/io-workarounds.c
-@@ -238,7 +238,7 @@ static void __init spider_pci_setup_chip
- static void __init spider_pci_add_one(struct pci_controller *phb)
- {
-       struct spider_pci_bus *bus = &spider_pci_busses[spider_pci_count];
--      struct device_node *np = phb->arch_data;
-+      struct device_node *np = phb->dn;
-       struct resource rsrc;
-       void __iomem *regs;
-@@ -309,15 +309,12 @@ static int __init spider_pci_workaround_
- {
-       struct pci_controller *phb;
--      if (!machine_is(cell))
--              return 0;
--
-       /* Find spider bridges. We assume they have been all probed
-        * in setup_arch(). If that was to change, we would need to
-        * update this code to cope with dynamically added busses
-        */
-       list_for_each_entry(phb, &hose_list, list_node) {
--              struct device_node *np = phb->arch_data;
-+              struct device_node *np = phb->dn;
-               const char *model = of_get_property(np, "model", NULL);
-               /* If no model property or name isn't exactly "pci", skip */
-@@ -343,4 +340,4 @@ static int __init spider_pci_workaround_
-       return 0;
- }
--arch_initcall(spider_pci_workaround_init);
-+machine_arch_initcall(cell, spider_pci_workaround_init);
---- a/arch/powerpc/platforms/cell/iommu.c
-+++ b/arch/powerpc/platforms/cell/iommu.c
-@@ -26,14 +26,15 @@
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/notifier.h>
-+#include <linux/of_platform.h>
- #include <asm/prom.h>
- #include <asm/iommu.h>
- #include <asm/machdep.h>
- #include <asm/pci-bridge.h>
- #include <asm/udbg.h>
--#include <asm/of_platform.h>
- #include <asm/lmb.h>
-+#include <asm/firmware.h>
- #include <asm/cell-regs.h>
- #include "interrupt.h"
-@@ -309,8 +310,8 @@ static void cell_iommu_setup_hardware(st
- {
-       struct page *page;
-       int ret, i;
--      unsigned long reg, segments, pages_per_segment, ptab_size, n_pte_pages;
--      unsigned long xlate_base;
-+      unsigned long reg, segments, pages_per_segment, ptab_size, stab_size,
-+                    n_pte_pages, xlate_base;
-       unsigned int virq;
-       if (cell_iommu_find_ioc(iommu->nid, &xlate_base))
-@@ -327,7 +328,8 @@ static void cell_iommu_setup_hardware(st
-                       __FUNCTION__, iommu->nid, segments, pages_per_segment);
-       /* set up the segment table */
--      page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0);
-+      stab_size = segments * sizeof(unsigned long);
-+      page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size));
-       BUG_ON(!page);
-       iommu->stab = page_address(page);
-       clear_page(iommu->stab);
-@@ -489,15 +491,18 @@ static struct cbe_iommu *cell_iommu_for_
-       return NULL;
- }
-+static unsigned long cell_dma_direct_offset;
-+
- static void cell_dma_dev_setup(struct device *dev)
- {
-       struct iommu_window *window;
-       struct cbe_iommu *iommu;
-       struct dev_archdata *archdata = &dev->archdata;
--      /* If we run without iommu, no need to do anything */
--      if (get_pci_dma_ops() == &dma_direct_ops)
-+      if (get_pci_dma_ops() == &dma_direct_ops) {
-+              archdata->dma_data = (void *)cell_dma_direct_offset;
-               return;
-+      }
-       /* Current implementation uses the first window available in that
-        * node's iommu. We -might- do something smarter later though it may
-@@ -653,7 +658,7 @@ static int __init cell_iommu_init_disabl
-       /* If we have no Axon, we set up the spider DMA magic offset */
-       if (of_find_node_by_name(NULL, "axon") == NULL)
--              dma_direct_offset = SPIDER_DMA_OFFSET;
-+              cell_dma_direct_offset = SPIDER_DMA_OFFSET;
-       /* Now we need to check to see where the memory is mapped
-        * in PCI space. We assume that all busses use the same dma
-@@ -687,10 +692,13 @@ static int __init cell_iommu_init_disabl
-               return -ENODEV;
-       }
--      dma_direct_offset += base;
-+      cell_dma_direct_offset += base;
-+
-+      if (cell_dma_direct_offset != 0)
-+              ppc_md.pci_dma_dev_setup = cell_pci_dma_dev_setup;
-       printk("iommu: disabled, direct DMA offset is 0x%lx\n",
--             dma_direct_offset);
-+             cell_dma_direct_offset);
-       return 0;
- }
-@@ -699,9 +707,6 @@ static int __init cell_iommu_init(void)
- {
-       struct device_node *np;
--      if (!machine_is(cell))
--              return -ENODEV;
--
-       /* If IOMMU is disabled or we have little enough RAM to not need
-        * to enable it, we setup a direct mapping.
-        *
-@@ -744,5 +749,6 @@ static int __init cell_iommu_init(void)
-       return 0;
- }
--arch_initcall(cell_iommu_init);
-+machine_arch_initcall(cell, cell_iommu_init);
-+machine_arch_initcall(celleb_native, cell_iommu_init);
---- a/arch/powerpc/platforms/cell/pmu.c
-+++ b/arch/powerpc/platforms/cell/pmu.c
-@@ -213,7 +213,7 @@ u32 cbe_read_pm(u32 cpu, enum pm_reg_nam
-               break;
-       case pm_interval:
--              READ_SHADOW_REG(val, pm_interval);
-+              READ_MMIO_UPPER32(val, pm_interval);
-               break;
-       case pm_start_stop:
-@@ -381,9 +381,6 @@ static int __init cbe_init_pm_irq(void)
-       unsigned int irq;
-       int rc, node;
--      if (!machine_is(cell))
--              return 0;
--
-       for_each_node(node) {
-               irq = irq_create_mapping(NULL, IIC_IRQ_IOEX_PMI |
-                                              (node << IIC_IRQ_NODE_SHIFT));
-@@ -404,7 +401,7 @@ static int __init cbe_init_pm_irq(void)
-       return 0;
- }
--arch_initcall(cbe_init_pm_irq);
-+machine_arch_initcall(cell, cbe_init_pm_irq);
- void cbe_sync_irq(int node)
- {
---- a/arch/powerpc/platforms/cell/setup.c
-+++ b/arch/powerpc/platforms/cell/setup.c
-@@ -30,6 +30,7 @@
- #include <linux/console.h>
- #include <linux/mutex.h>
- #include <linux/memory_hotplug.h>
-+#include <linux/of_platform.h>
- #include <asm/mmu.h>
- #include <asm/processor.h>
-@@ -51,7 +52,6 @@
- #include <asm/spu_priv1.h>
- #include <asm/udbg.h>
- #include <asm/mpic.h>
--#include <asm/of_platform.h>
- #include <asm/cell-regs.h>
- #include "interrupt.h"
-@@ -85,9 +85,6 @@ static int __init cell_publish_devices(v
- {
-       int node;
--      if (!machine_is(cell))
--              return 0;
--
-       /* Publish OF platform devices for southbridge IOs */
-       of_platform_bus_probe(NULL, NULL, NULL);
-@@ -101,7 +98,7 @@ static int __init cell_publish_devices(v
-       }
-       return 0;
- }
--device_initcall(cell_publish_devices);
-+machine_device_initcall(cell, cell_publish_devices);
- static void cell_mpic_cascade(unsigned int irq, struct irq_desc *desc)
- {
---- a/arch/powerpc/platforms/cell/smp.c
-+++ b/arch/powerpc/platforms/cell/smp.c
-@@ -42,6 +42,7 @@
- #include <asm/firmware.h>
- #include <asm/system.h>
- #include <asm/rtas.h>
-+#include <asm/cputhreads.h>
- #include "interrupt.h"
- #include <asm/udbg.h>
-@@ -182,7 +183,7 @@ static int smp_cell_cpu_bootable(unsigne
-        */
-       if (system_state < SYSTEM_RUNNING &&
-           cpu_has_feature(CPU_FTR_SMT) &&
--          !smt_enabled_at_boot && nr % 2 != 0)
-+          !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
-               return 0;
-       return 1;
---- a/arch/powerpc/platforms/cell/spu_base.c
-+++ b/arch/powerpc/platforms/cell/spu_base.c
-@@ -34,6 +34,7 @@
- #include <linux/linux_logo.h>
- #include <asm/spu.h>
- #include <asm/spu_priv1.h>
-+#include <asm/spu_csa.h>
- #include <asm/xmon.h>
- #include <asm/prom.h>
-@@ -47,6 +48,13 @@ struct cbe_spu_info cbe_spu_info[MAX_NUM
- EXPORT_SYMBOL_GPL(cbe_spu_info);
- /*
-+ * The spufs fault-handling code needs to call force_sig_info to raise signals
-+ * on DMA errors. Export it here to avoid general kernel-wide access to this
-+ * function
-+ */
-+EXPORT_SYMBOL_GPL(force_sig_info);
-+
-+/*
-  * Protects cbe_spu_info and spu->number.
-  */
- static DEFINE_SPINLOCK(spu_lock);
-@@ -66,6 +74,10 @@ static LIST_HEAD(spu_full_list);
- static DEFINE_SPINLOCK(spu_full_list_lock);
- static DEFINE_MUTEX(spu_full_list_mutex);
-+struct spu_slb {
-+      u64 esid, vsid;
-+};
-+
- void spu_invalidate_slbs(struct spu *spu)
- {
-       struct spu_priv2 __iomem *priv2 = spu->priv2;
-@@ -114,40 +126,36 @@ void spu_associate_mm(struct spu *spu, s
- }
- EXPORT_SYMBOL_GPL(spu_associate_mm);
--static int __spu_trap_invalid_dma(struct spu *spu)
-+int spu_64k_pages_available(void)
- {
--      pr_debug("%s\n", __FUNCTION__);
--      spu->dma_callback(spu, SPE_EVENT_INVALID_DMA);
--      return 0;
-+      return mmu_psize_defs[MMU_PAGE_64K].shift != 0;
- }
-+EXPORT_SYMBOL_GPL(spu_64k_pages_available);
--static int __spu_trap_dma_align(struct spu *spu)
-+static void spu_restart_dma(struct spu *spu)
- {
--      pr_debug("%s\n", __FUNCTION__);
--      spu->dma_callback(spu, SPE_EVENT_DMA_ALIGNMENT);
--      return 0;
--}
-+      struct spu_priv2 __iomem *priv2 = spu->priv2;
--static int __spu_trap_error(struct spu *spu)
--{
--      pr_debug("%s\n", __FUNCTION__);
--      spu->dma_callback(spu, SPE_EVENT_SPE_ERROR);
--      return 0;
-+      if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
-+              out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
- }
--static void spu_restart_dma(struct spu *spu)
-+static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb)
- {
-       struct spu_priv2 __iomem *priv2 = spu->priv2;
--      if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
--              out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
-+      pr_debug("%s: adding SLB[%d] 0x%016lx 0x%016lx\n",
-+                      __func__, slbe, slb->vsid, slb->esid);
-+
-+      out_be64(&priv2->slb_index_W, slbe);
-+      out_be64(&priv2->slb_vsid_RW, slb->vsid);
-+      out_be64(&priv2->slb_esid_RW, slb->esid);
- }
- static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
- {
--      struct spu_priv2 __iomem *priv2 = spu->priv2;
-       struct mm_struct *mm = spu->mm;
--      u64 esid, vsid, llp;
-+      struct spu_slb slb;
-       int psize;
-       pr_debug("%s\n", __FUNCTION__);
-@@ -159,7 +167,7 @@ static int __spu_trap_data_seg(struct sp
-               printk("%s: invalid access during switch!\n", __func__);
-               return 1;
-       }
--      esid = (ea & ESID_MASK) | SLB_ESID_V;
-+      slb.esid = (ea & ESID_MASK) | SLB_ESID_V;
-       switch(REGION_ID(ea)) {
-       case USER_REGION_ID:
-@@ -168,21 +176,21 @@ static int __spu_trap_data_seg(struct sp
- #else
-               psize = mm->context.user_psize;
- #endif
--              vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
--                              SLB_VSID_USER;
-+              slb.vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M)
-+                              << SLB_VSID_SHIFT) | SLB_VSID_USER;
-               break;
-       case VMALLOC_REGION_ID:
-               if (ea < VMALLOC_END)
-                       psize = mmu_vmalloc_psize;
-               else
-                       psize = mmu_io_psize;
--              vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
--                      SLB_VSID_KERNEL;
-+              slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
-+                              << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
-               break;
-       case KERNEL_REGION_ID:
-               psize = mmu_linear_psize;
--              vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
--                      SLB_VSID_KERNEL;
-+              slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
-+                              << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
-               break;
-       default:
-               /* Future: support kernel segments so that drivers
-@@ -191,11 +199,9 @@ static int __spu_trap_data_seg(struct sp
-               pr_debug("invalid region access at %016lx\n", ea);
-               return 1;
-       }
--      llp = mmu_psize_defs[psize].sllp;
-+      slb.vsid |= mmu_psize_defs[psize].sllp;
--      out_be64(&priv2->slb_index_W, spu->slb_replace);
--      out_be64(&priv2->slb_vsid_RW, vsid | llp);
--      out_be64(&priv2->slb_esid_RW, esid);
-+      spu_load_slb(spu, spu->slb_replace, &slb);
-       spu->slb_replace++;
-       if (spu->slb_replace >= 8)
-@@ -225,13 +231,83 @@ static int __spu_trap_data_map(struct sp
-               return 1;
-       }
-+      spu->class_0_pending = 0;
-       spu->dar = ea;
-       spu->dsisr = dsisr;
--      mb();
-+
-       spu->stop_callback(spu);
-+
-       return 0;
- }
-+static void __spu_kernel_slb(void *addr, struct spu_slb *slb)
-+{
-+      unsigned long ea = (unsigned long)addr;
-+      u64 llp;
-+
-+      if (REGION_ID(ea) == KERNEL_REGION_ID)
-+              llp = mmu_psize_defs[mmu_linear_psize].sllp;
-+      else
-+              llp = mmu_psize_defs[mmu_virtual_psize].sllp;
-+
-+      slb->vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-+              SLB_VSID_KERNEL | llp;
-+      slb->esid = (ea & ESID_MASK) | SLB_ESID_V;
-+}
-+
-+/**
-+ * Given an array of @nr_slbs SLB entries, @slbs, return non-zero if the
-+ * address @new_addr is present.
-+ */
-+static inline int __slb_present(struct spu_slb *slbs, int nr_slbs,
-+              void *new_addr)
-+{
-+      unsigned long ea = (unsigned long)new_addr;
-+      int i;
-+
-+      for (i = 0; i < nr_slbs; i++)
-+              if (!((slbs[i].esid ^ ea) & ESID_MASK))
-+                      return 1;
-+
-+      return 0;
-+}
-+
-+/**
-+ * Setup the SPU kernel SLBs, in preparation for a context save/restore. We
-+ * need to map both the context save area, and the save/restore code.
-+ *
-+ * Because the lscsa and code may cross segment boundaires, we check to see
-+ * if mappings are required for the start and end of each range. We currently
-+ * assume that the mappings are smaller that one segment - if not, something
-+ * is seriously wrong.
-+ */
-+void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
-+              void *code, int code_size)
-+{
-+      struct spu_slb slbs[4];
-+      int i, nr_slbs = 0;
-+      /* start and end addresses of both mappings */
-+      void *addrs[] = {
-+              lscsa, (void *)lscsa + sizeof(*lscsa) - 1,
-+              code, code + code_size - 1
-+      };
-+
-+      /* check the set of addresses, and create a new entry in the slbs array
-+       * if there isn't already a SLB for that address */
-+      for (i = 0; i < ARRAY_SIZE(addrs); i++) {
-+              if (__slb_present(slbs, nr_slbs, addrs[i]))
-+                      continue;
-+
-+              __spu_kernel_slb(addrs[i], &slbs[nr_slbs]);
-+              nr_slbs++;
-+      }
-+
-+      /* Add the set of SLBs */
-+      for (i = 0; i < nr_slbs; i++)
-+              spu_load_slb(spu, i, &slbs[i]);
-+}
-+EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs);
-+
- static irqreturn_t
- spu_irq_class_0(int irq, void *data)
- {
-@@ -240,12 +316,13 @@ spu_irq_class_0(int irq, void *data)
-       spu = data;
-+      spin_lock(&spu->register_lock);
-       mask = spu_int_mask_get(spu, 0);
--      stat = spu_int_stat_get(spu, 0);
--      stat &= mask;
-+      stat = spu_int_stat_get(spu, 0) & mask;
--      spin_lock(&spu->register_lock);
-       spu->class_0_pending |= stat;
-+      spu->dsisr = spu_mfc_dsisr_get(spu);
-+      spu->dar = spu_mfc_dar_get(spu);
-       spin_unlock(&spu->register_lock);
-       spu->stop_callback(spu);
-@@ -255,31 +332,6 @@ spu_irq_class_0(int irq, void *data)
-       return IRQ_HANDLED;
- }
--int
--spu_irq_class_0_bottom(struct spu *spu)
--{
--      unsigned long flags;
--      unsigned long stat;
--
--      spin_lock_irqsave(&spu->register_lock, flags);
--      stat = spu->class_0_pending;
--      spu->class_0_pending = 0;
--
--      if (stat & 1) /* invalid DMA alignment */
--              __spu_trap_dma_align(spu);
--
--      if (stat & 2) /* invalid MFC DMA */
--              __spu_trap_invalid_dma(spu);
--
--      if (stat & 4) /* error on SPU */
--              __spu_trap_error(spu);
--
--      spin_unlock_irqrestore(&spu->register_lock, flags);
--
--      return (stat & 0x7) ? -EIO : 0;
--}
--EXPORT_SYMBOL_GPL(spu_irq_class_0_bottom);
--
- static irqreturn_t
- spu_irq_class_1(int irq, void *data)
- {
-@@ -294,24 +346,23 @@ spu_irq_class_1(int irq, void *data)
-       stat  = spu_int_stat_get(spu, 1) & mask;
-       dar   = spu_mfc_dar_get(spu);
-       dsisr = spu_mfc_dsisr_get(spu);
--      if (stat & 2) /* mapping fault */
-+      if (stat & CLASS1_STORAGE_FAULT_INTR)
-               spu_mfc_dsisr_set(spu, 0ul);
-       spu_int_stat_clear(spu, 1, stat);
-       spin_unlock(&spu->register_lock);
-       pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
-                       dar, dsisr);
--      if (stat & 1) /* segment fault */
-+      if (stat & CLASS1_SEGMENT_FAULT_INTR)
-               __spu_trap_data_seg(spu, dar);
--      if (stat & 2) { /* mapping fault */
-+      if (stat & CLASS1_STORAGE_FAULT_INTR)
-               __spu_trap_data_map(spu, dar, dsisr);
--      }
--      if (stat & 4) /* ls compare & suspend on get */
-+      if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR)
-               ;
--      if (stat & 8) /* ls compare & suspend on put */
-+      if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR)
-               ;
-       return stat ? IRQ_HANDLED : IRQ_NONE;
-@@ -323,6 +374,8 @@ spu_irq_class_2(int irq, void *data)
-       struct spu *spu;
-       unsigned long stat;
-       unsigned long mask;
-+      const int mailbox_intrs =
-+              CLASS2_MAILBOX_THRESHOLD_INTR | CLASS2_MAILBOX_INTR;
-       spu = data;
-       spin_lock(&spu->register_lock);
-@@ -330,31 +383,30 @@ spu_irq_class_2(int irq, void *data)
-       mask = spu_int_mask_get(spu, 2);
-       /* ignore interrupts we're not waiting for */
-       stat &= mask;
--      /*
--       * mailbox interrupts (0x1 and 0x10) are level triggered.
--       * mask them now before acknowledging.
--       */
--      if (stat & 0x11)
--              spu_int_mask_and(spu, 2, ~(stat & 0x11));
-+
-+      /* mailbox interrupts are level triggered. mask them now before
-+       * acknowledging */
-+      if (stat & mailbox_intrs)
-+              spu_int_mask_and(spu, 2, ~(stat & mailbox_intrs));
-       /* acknowledge all interrupts before the callbacks */
-       spu_int_stat_clear(spu, 2, stat);
-       spin_unlock(&spu->register_lock);
-       pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask);
--      if (stat & 1)  /* PPC core mailbox */
-+      if (stat & CLASS2_MAILBOX_INTR)
-               spu->ibox_callback(spu);
--      if (stat & 2) /* SPU stop-and-signal */
-+      if (stat & CLASS2_SPU_STOP_INTR)
-               spu->stop_callback(spu);
--      if (stat & 4) /* SPU halted */
-+      if (stat & CLASS2_SPU_HALT_INTR)
-               spu->stop_callback(spu);
--      if (stat & 8) /* DMA tag group complete */
-+      if (stat & CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR)
-               spu->mfc_callback(spu);
--      if (stat & 0x10) /* SPU mailbox threshold */
-+      if (stat & CLASS2_MAILBOX_THRESHOLD_INTR)
-               spu->wbox_callback(spu);
-       spu->stats.class2_intr++;
-@@ -479,13 +531,27 @@ EXPORT_SYMBOL_GPL(spu_add_sysdev_attr);
- int spu_add_sysdev_attr_group(struct attribute_group *attrs)
- {
-       struct spu *spu;
-+      int rc = 0;
-       mutex_lock(&spu_full_list_mutex);
--      list_for_each_entry(spu, &spu_full_list, full_list)
--              sysfs_create_group(&spu->sysdev.kobj, attrs);
-+      list_for_each_entry(spu, &spu_full_list, full_list) {
-+              rc = sysfs_create_group(&spu->sysdev.kobj, attrs);
-+
-+              /* we're in trouble here, but try unwinding anyway */
-+              if (rc) {
-+                      printk(KERN_ERR "%s: can't create sysfs group '%s'\n",
-+                                      __func__, attrs->name);
-+
-+                      list_for_each_entry_continue_reverse(spu,
-+                                      &spu_full_list, full_list)
-+                              sysfs_remove_group(&spu->sysdev.kobj, attrs);
-+                      break;
-+              }
-+      }
-+
-       mutex_unlock(&spu_full_list_mutex);
--      return 0;
-+      return rc;
- }
- EXPORT_SYMBOL_GPL(spu_add_sysdev_attr_group);
---- /dev/null
-+++ b/arch/powerpc/platforms/cell/spu_fault.c
-@@ -0,0 +1,98 @@
-+/*
-+ * SPU mm fault handler
-+ *
-+ * (C) Copyright IBM Deutschland Entwicklung GmbH 2007
-+ *
-+ * Author: Arnd Bergmann <arndb@de.ibm.com>
-+ * Author: Jeremy Kerr <jk@ozlabs.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, 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/sched.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+
-+#include <asm/spu.h>
-+#include <asm/spu_csa.h>
-+
-+/*
-+ * This ought to be kept in sync with the powerpc specific do_page_fault
-+ * function. Currently, there are a few corner cases that we haven't had
-+ * to handle fortunately.
-+ */
-+int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
-+              unsigned long dsisr, unsigned *flt)
-+{
-+      struct vm_area_struct *vma;
-+      unsigned long is_write;
-+      int ret;
-+
-+#if 0
-+      if (!IS_VALID_EA(ea)) {
-+              return -EFAULT;
-+      }
-+#endif /* XXX */
-+      if (mm == NULL) {
-+              return -EFAULT;
-+      }
-+      if (mm->pgd == NULL) {
-+              return -EFAULT;
-+      }
-+
-+      down_read(&mm->mmap_sem);
-+      vma = find_vma(mm, ea);
-+      if (!vma)
-+              goto bad_area;
-+      if (vma->vm_start <= ea)
-+              goto good_area;
-+      if (!(vma->vm_flags & VM_GROWSDOWN))
-+              goto bad_area;
-+      if (expand_stack(vma, ea))
-+              goto bad_area;
-+good_area:
-+      is_write = dsisr & MFC_DSISR_ACCESS_PUT;
-+      if (is_write) {
-+              if (!(vma->vm_flags & VM_WRITE))
-+                      goto bad_area;
-+      } else {
-+              if (dsisr & MFC_DSISR_ACCESS_DENIED)
-+                      goto bad_area;
-+              if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-+                      goto bad_area;
-+      }
-+      ret = 0;
-+      *flt = handle_mm_fault(mm, vma, ea, is_write);
-+      if (unlikely(*flt & VM_FAULT_ERROR)) {
-+              if (*flt & VM_FAULT_OOM) {
-+                      ret = -ENOMEM;
-+                      goto bad_area;
-+              } else if (*flt & VM_FAULT_SIGBUS) {
-+                      ret = -EFAULT;
-+                      goto bad_area;
-+              }
-+              BUG();
-+      }
-+      if (*flt & VM_FAULT_MAJOR)
-+              current->maj_flt++;
-+      else
-+              current->min_flt++;
-+      up_read(&mm->mmap_sem);
-+      return ret;
-+
-+bad_area:
-+      up_read(&mm->mmap_sem);
-+      return -EFAULT;
-+}
-+EXPORT_SYMBOL_GPL(spu_handle_mm_fault);
---- a/arch/powerpc/platforms/cell/spu_manage.c
-+++ b/arch/powerpc/platforms/cell/spu_manage.c
-@@ -35,6 +35,7 @@
- #include <asm/firmware.h>
- #include <asm/prom.h>
-+#include "spufs/spufs.h"
- #include "interrupt.h"
- struct device_node *spu_devnode(struct spu *spu)
-@@ -345,7 +346,7 @@ static int __init of_create_spu(struct s
-               }
-               ret = spu_map_interrupts_old(spu, spe);
-               if (ret) {
--                      printk(KERN_ERR "%s: could not map interrupts",
-+                      printk(KERN_ERR "%s: could not map interrupts\n",
-                               spu->name);
-                       goto out_unmap;
-               }
-@@ -369,6 +370,16 @@ static int of_destroy_spu(struct spu *sp
-       return 0;
- }
-+static void enable_spu_by_master_run(struct spu_context *ctx)
-+{
-+      ctx->ops->master_start(ctx);
-+}
-+
-+static void disable_spu_by_master_run(struct spu_context *ctx)
-+{
-+      ctx->ops->master_stop(ctx);
-+}
-+
- /* Hardcoded affinity idxs for qs20 */
- #define QS20_SPES_PER_BE 8
- static int qs20_reg_idxs[QS20_SPES_PER_BE] =   { 0, 2, 4, 6, 7, 5, 3, 1 };
-@@ -411,10 +422,15 @@ static void init_affinity_qs20_harcoded(
- static int of_has_vicinity(void)
- {
--      struct spu* spu;
-+      struct device_node *dn;
--      spu = list_first_entry(&cbe_spu_info[0].spus, struct spu, cbe_list);
--      return of_find_property(spu_devnode(spu), "vicinity", NULL) != NULL;
-+      for_each_node_by_type(dn, "spe") {
-+              if (of_find_property(dn, "vicinity", NULL))  {
-+                      of_node_put(dn);
-+                      return 1;
-+              }
-+      }
-+      return 0;
- }
- static struct spu *devnode_spu(int cbe, struct device_node *dn)
-@@ -525,7 +541,7 @@ static int __init init_affinity(void)
-               if (of_flat_dt_is_compatible(root, "IBM,CPBW-1.0"))
-                       init_affinity_qs20_harcoded();
-               else
--                      printk("No affinity configuration found");
-+                      printk("No affinity configuration found\n");
-       }
-       return 0;
-@@ -535,5 +551,7 @@ const struct spu_management_ops spu_mana
-       .enumerate_spus = of_enumerate_spus,
-       .create_spu = of_create_spu,
-       .destroy_spu = of_destroy_spu,
-+      .enable_spu = enable_spu_by_master_run,
-+      .disable_spu = disable_spu_by_master_run,
-       .init_affinity = init_affinity,
- };
---- a/arch/powerpc/platforms/cell/spufs/Makefile
-+++ b/arch/powerpc/platforms/cell/spufs/Makefile
-@@ -1,8 +1,8 @@
--obj-y += switch.o fault.o lscsa_alloc.o
- obj-$(CONFIG_SPU_FS) += spufs.o
- spufs-y += inode.o file.o context.o syscalls.o coredump.o
- spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o
-+spufs-y += switch.o fault.o lscsa_alloc.o
- # Rules to build switch.o with the help of SPU tool chain
- SPU_CROSS     := spu-
---- a/arch/powerpc/platforms/cell/spufs/backing_ops.c
-+++ b/arch/powerpc/platforms/cell/spufs/backing_ops.c
-@@ -106,16 +106,20 @@ static unsigned int spu_backing_mbox_sta
-               if (stat & 0xff0000)
-                       ret |= POLLIN | POLLRDNORM;
-               else {
--                      ctx->csa.priv1.int_stat_class0_RW &= ~0x1;
--                      ctx->csa.priv1.int_mask_class2_RW |= 0x1;
-+                      ctx->csa.priv1.int_stat_class2_RW &=
-+                              ~CLASS2_MAILBOX_INTR;
-+                      ctx->csa.priv1.int_mask_class2_RW |=
-+                              CLASS2_ENABLE_MAILBOX_INTR;
-               }
-       }
-       if (events & (POLLOUT | POLLWRNORM)) {
-               if (stat & 0x00ff00)
-                       ret = POLLOUT | POLLWRNORM;
-               else {
--                      ctx->csa.priv1.int_stat_class0_RW &= ~0x10;
--                      ctx->csa.priv1.int_mask_class2_RW |= 0x10;
-+                      ctx->csa.priv1.int_stat_class2_RW &=
-+                              ~CLASS2_MAILBOX_THRESHOLD_INTR;
-+                      ctx->csa.priv1.int_mask_class2_RW |=
-+                              CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
-               }
-       }
-       spin_unlock_irq(&ctx->csa.register_lock);
-@@ -139,7 +143,7 @@ static int spu_backing_ibox_read(struct 
-               ret = 4;
-       } else {
-               /* make sure we get woken up by the interrupt */
--              ctx->csa.priv1.int_mask_class2_RW |= 0x1UL;
-+              ctx->csa.priv1.int_mask_class2_RW |= CLASS2_ENABLE_MAILBOX_INTR;
-               ret = 0;
-       }
-       spin_unlock(&ctx->csa.register_lock);
-@@ -169,7 +173,8 @@ static int spu_backing_wbox_write(struct
-       } else {
-               /* make sure we get woken up by the interrupt when space
-                  becomes available */
--              ctx->csa.priv1.int_mask_class2_RW |= 0x10;
-+              ctx->csa.priv1.int_mask_class2_RW |=
-+                      CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
-               ret = 0;
-       }
-       spin_unlock(&ctx->csa.register_lock);
-@@ -268,6 +273,11 @@ static char *spu_backing_get_ls(struct s
-       return ctx->csa.lscsa->ls;
- }
-+static void spu_backing_privcntl_write(struct spu_context *ctx, u64 val)
-+{
-+      ctx->csa.priv2.spu_privcntl_RW = val;
-+}
-+
- static u32 spu_backing_runcntl_read(struct spu_context *ctx)
- {
-       return ctx->csa.prob.spu_runcntl_RW;
-@@ -285,6 +295,11 @@ static void spu_backing_runcntl_write(st
-       spin_unlock(&ctx->csa.register_lock);
- }
-+static void spu_backing_runcntl_stop(struct spu_context *ctx)
-+{
-+      spu_backing_runcntl_write(ctx, SPU_RUNCNTL_STOP);
-+}
-+
- static void spu_backing_master_start(struct spu_context *ctx)
- {
-       struct spu_state *csa = &ctx->csa;
-@@ -358,7 +373,7 @@ static int spu_backing_send_mfc_command(
- static void spu_backing_restart_dma(struct spu_context *ctx)
- {
--      /* nothing to do here */
-+      ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_RESTART_DMA_COMMAND;
- }
- struct spu_context_ops spu_backing_ops = {
-@@ -379,8 +394,10 @@ struct spu_context_ops spu_backing_ops =
-       .npc_write = spu_backing_npc_write,
-       .status_read = spu_backing_status_read,
-       .get_ls = spu_backing_get_ls,
-+      .privcntl_write = spu_backing_privcntl_write,
-       .runcntl_read = spu_backing_runcntl_read,
-       .runcntl_write = spu_backing_runcntl_write,
-+      .runcntl_stop = spu_backing_runcntl_stop,
-       .master_start = spu_backing_master_start,
-       .master_stop = spu_backing_master_stop,
-       .set_mfc_query = spu_backing_set_mfc_query,
---- a/arch/powerpc/platforms/cell/spufs/context.c
-+++ b/arch/powerpc/platforms/cell/spufs/context.c
-@@ -52,6 +52,7 @@ struct spu_context *alloc_spu_context(st
-       init_waitqueue_head(&ctx->wbox_wq);
-       init_waitqueue_head(&ctx->stop_wq);
-       init_waitqueue_head(&ctx->mfc_wq);
-+      init_waitqueue_head(&ctx->run_wq);
-       ctx->state = SPU_STATE_SAVED;
-       ctx->ops = &spu_backing_ops;
-       ctx->owner = get_task_mm(current);
-@@ -105,7 +106,17 @@ int put_spu_context(struct spu_context *
- void spu_forget(struct spu_context *ctx)
- {
-       struct mm_struct *mm;
--      spu_acquire_saved(ctx);
-+
-+      /*
-+       * This is basically an open-coded spu_acquire_saved, except that
-+       * we don't acquire the state mutex interruptible.
-+       */
-+      mutex_lock(&ctx->state_mutex);
-+      if (ctx->state != SPU_STATE_SAVED) {
-+              set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
-+              spu_deactivate(ctx);
-+      }
-+
-       mm = ctx->owner;
-       ctx->owner = NULL;
-       mmput(mm);
-@@ -133,47 +144,23 @@ void spu_unmap_mappings(struct spu_conte
- }
- /**
-- * spu_acquire_runnable - lock spu contex and make sure it is in runnable state
-+ * spu_acquire_saved - lock spu contex and make sure it is in saved state
-  * @ctx:      spu contex to lock
-- *
-- * Note:
-- *    Returns 0 and with the context locked on success
-- *    Returns negative error and with the context _unlocked_ on failure.
-  */
--int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags)
-+int spu_acquire_saved(struct spu_context *ctx)
- {
--      int ret = -EINVAL;
-+      int ret;
--      spu_acquire(ctx);
--      if (ctx->state == SPU_STATE_SAVED) {
--              /*
--               * Context is about to be freed, so we can't acquire it anymore.
--               */
--              if (!ctx->owner)
--                      goto out_unlock;
--              ret = spu_activate(ctx, flags);
--              if (ret)
--                      goto out_unlock;
--      }
--
--      return 0;
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-- out_unlock:
--      spu_release(ctx);
--      return ret;
--}
--
--/**
-- * spu_acquire_saved - lock spu contex and make sure it is in saved state
-- * @ctx:      spu contex to lock
-- */
--void spu_acquire_saved(struct spu_context *ctx)
--{
--      spu_acquire(ctx);
-       if (ctx->state != SPU_STATE_SAVED) {
-               set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
-               spu_deactivate(ctx);
-       }
-+
-+      return 0;
- }
- /**
---- a/arch/powerpc/platforms/cell/spufs/coredump.c
-+++ b/arch/powerpc/platforms/cell/spufs/coredump.c
-@@ -148,7 +148,9 @@ int spufs_coredump_extra_notes_size(void
-       fd = 0;
-       while ((ctx = coredump_next_context(&fd)) != NULL) {
--              spu_acquire_saved(ctx);
-+              rc = spu_acquire_saved(ctx);
-+              if (rc)
-+                      break;
-               rc = spufs_ctx_note_size(ctx, fd);
-               spu_release_saved(ctx);
-               if (rc < 0)
-@@ -224,7 +226,9 @@ int spufs_coredump_extra_notes_write(str
-       fd = 0;
-       while ((ctx = coredump_next_context(&fd)) != NULL) {
--              spu_acquire_saved(ctx);
-+              rc = spu_acquire_saved(ctx);
-+              if (rc)
-+                      return rc;
-               for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
-                       rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
---- a/arch/powerpc/platforms/cell/spufs/fault.c
-+++ b/arch/powerpc/platforms/cell/spufs/fault.c
-@@ -28,117 +28,71 @@
- #include "spufs.h"
--/*
-- * This ought to be kept in sync with the powerpc specific do_page_fault
-- * function. Currently, there are a few corner cases that we haven't had
-- * to handle fortunately.
-+/**
-+ * Handle an SPE event, depending on context SPU_CREATE_EVENTS_ENABLED flag.
-+ *
-+ * If the context was created with events, we just set the return event.
-+ * Otherwise, send an appropriate signal to the process.
-  */
--static int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
--              unsigned long dsisr, unsigned *flt)
--{
--      struct vm_area_struct *vma;
--      unsigned long is_write;
--      int ret;
--
--#if 0
--      if (!IS_VALID_EA(ea)) {
--              return -EFAULT;
--      }
--#endif /* XXX */
--      if (mm == NULL) {
--              return -EFAULT;
--      }
--      if (mm->pgd == NULL) {
--              return -EFAULT;
--      }
--
--      down_read(&mm->mmap_sem);
--      vma = find_vma(mm, ea);
--      if (!vma)
--              goto bad_area;
--      if (vma->vm_start <= ea)
--              goto good_area;
--      if (!(vma->vm_flags & VM_GROWSDOWN))
--              goto bad_area;
--      if (expand_stack(vma, ea))
--              goto bad_area;
--good_area:
--      is_write = dsisr & MFC_DSISR_ACCESS_PUT;
--      if (is_write) {
--              if (!(vma->vm_flags & VM_WRITE))
--                      goto bad_area;
--      } else {
--              if (dsisr & MFC_DSISR_ACCESS_DENIED)
--                      goto bad_area;
--              if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
--                      goto bad_area;
--      }
--      ret = 0;
--      *flt = handle_mm_fault(mm, vma, ea, is_write);
--      if (unlikely(*flt & VM_FAULT_ERROR)) {
--              if (*flt & VM_FAULT_OOM) {
--                      ret = -ENOMEM;
--                      goto bad_area;
--              } else if (*flt & VM_FAULT_SIGBUS) {
--                      ret = -EFAULT;
--                      goto bad_area;
--              }
--              BUG();
--      }
--      if (*flt & VM_FAULT_MAJOR)
--              current->maj_flt++;
--      else
--              current->min_flt++;
--      up_read(&mm->mmap_sem);
--      return ret;
--
--bad_area:
--      up_read(&mm->mmap_sem);
--      return -EFAULT;
--}
--
--static void spufs_handle_dma_error(struct spu_context *ctx,
-+static void spufs_handle_event(struct spu_context *ctx,
-                               unsigned long ea, int type)
- {
-+      siginfo_t info;
-+
-       if (ctx->flags & SPU_CREATE_EVENTS_ENABLED) {
-               ctx->event_return |= type;
-               wake_up_all(&ctx->stop_wq);
--      } else {
--              siginfo_t info;
--              memset(&info, 0, sizeof(info));
--
--              switch (type) {
--              case SPE_EVENT_INVALID_DMA:
--                      info.si_signo = SIGBUS;
--                      info.si_code = BUS_OBJERR;
--                      break;
--              case SPE_EVENT_SPE_DATA_STORAGE:
--                      info.si_signo = SIGBUS;
--                      info.si_addr = (void __user *)ea;
--                      info.si_code = BUS_ADRERR;
--                      break;
--              case SPE_EVENT_DMA_ALIGNMENT:
--                      info.si_signo = SIGBUS;
--                      /* DAR isn't set for an alignment fault :( */
--                      info.si_code = BUS_ADRALN;
--                      break;
--              case SPE_EVENT_SPE_ERROR:
--                      info.si_signo = SIGILL;
--                      info.si_addr = (void __user *)(unsigned long)
--                              ctx->ops->npc_read(ctx) - 4;
--                      info.si_code = ILL_ILLOPC;
--                      break;
--              }
--              if (info.si_signo)
--                      force_sig_info(info.si_signo, &info, current);
-+              return;
-       }
-+
-+      memset(&info, 0, sizeof(info));
-+
-+      switch (type) {
-+      case SPE_EVENT_INVALID_DMA:
-+              info.si_signo = SIGBUS;
-+              info.si_code = BUS_OBJERR;
-+              break;
-+      case SPE_EVENT_SPE_DATA_STORAGE:
-+              info.si_signo = SIGSEGV;
-+              info.si_addr = (void __user *)ea;
-+              info.si_code = SEGV_ACCERR;
-+              ctx->ops->restart_dma(ctx);
-+              break;
-+      case SPE_EVENT_DMA_ALIGNMENT:
-+              info.si_signo = SIGBUS;
-+              /* DAR isn't set for an alignment fault :( */
-+              info.si_code = BUS_ADRALN;
-+              break;
-+      case SPE_EVENT_SPE_ERROR:
-+              info.si_signo = SIGILL;
-+              info.si_addr = (void __user *)(unsigned long)
-+                      ctx->ops->npc_read(ctx) - 4;
-+              info.si_code = ILL_ILLOPC;
-+              break;
-+      }
-+
-+      if (info.si_signo)
-+              force_sig_info(info.si_signo, &info, current);
- }
--void spufs_dma_callback(struct spu *spu, int type)
-+int spufs_handle_class0(struct spu_context *ctx)
- {
--      spufs_handle_dma_error(spu->ctx, spu->dar, type);
-+      unsigned long stat = ctx->csa.class_0_pending & CLASS0_INTR_MASK;
-+
-+      if (likely(!stat))
-+              return 0;
-+
-+      if (stat & CLASS0_DMA_ALIGNMENT_INTR)
-+              spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_DMA_ALIGNMENT);
-+
-+      if (stat & CLASS0_INVALID_DMA_COMMAND_INTR)
-+              spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_INVALID_DMA);
-+
-+      if (stat & CLASS0_SPU_ERROR_INTR)
-+              spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_SPE_ERROR);
-+
-+      return -EIO;
- }
--EXPORT_SYMBOL_GPL(spufs_dma_callback);
- /*
-  * bottom half handler for page faults, we can't do this from
-@@ -154,7 +108,7 @@ int spufs_handle_class1(struct spu_conte
-       u64 ea, dsisr, access;
-       unsigned long flags;
-       unsigned flt = 0;
--      int ret;
-+      int ret, ret2;
-       /*
-        * dar and dsisr get passed from the registers
-@@ -165,16 +119,8 @@ int spufs_handle_class1(struct spu_conte
-        * in time, we can still expect to get the same fault
-        * the immediately after the context restore.
-        */
--      if (ctx->state == SPU_STATE_RUNNABLE) {
--              ea = ctx->spu->dar;
--              dsisr = ctx->spu->dsisr;
--              ctx->spu->dar= ctx->spu->dsisr = 0;
--      } else {
--              ea = ctx->csa.priv1.mfc_dar_RW;
--              dsisr = ctx->csa.priv1.mfc_dsisr_RW;
--              ctx->csa.priv1.mfc_dar_RW = 0;
--              ctx->csa.priv1.mfc_dsisr_RW = 0;
--      }
-+      ea = ctx->csa.dar;
-+      dsisr = ctx->csa.dsisr;
-       if (!(dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED)))
-               return 0;
-@@ -201,7 +147,22 @@ int spufs_handle_class1(struct spu_conte
-       if (ret)
-               ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt);
--      spu_acquire(ctx);
-+      /*
-+       * If spu_acquire fails due to a pending signal we just want to return
-+       * EINTR to userspace even if that means missing the dma restart or
-+       * updating the page fault statistics.
-+       */
-+      ret2 = spu_acquire(ctx);
-+      if (ret2)
-+              goto out;
-+
-+      /*
-+       * Clear dsisr under ctxt lock after handling the fault, so that
-+       * time slicing will not preempt the context while the page fault
-+       * handler is running. Context switch code removes mappings.
-+       */
-+      ctx->csa.dar = ctx->csa.dsisr = 0;
-+
-       /*
-        * If we handled the fault successfully and are in runnable
-        * state, restart the DMA.
-@@ -222,9 +183,9 @@ int spufs_handle_class1(struct spu_conte
-               if (ctx->spu)
-                       ctx->ops->restart_dma(ctx);
-       } else
--              spufs_handle_dma_error(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
-+              spufs_handle_event(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
-+ out:
-       spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
-       return ret;
- }
--EXPORT_SYMBOL_GPL(spufs_handle_class1);
---- a/arch/powerpc/platforms/cell/spufs/file.c
-+++ b/arch/powerpc/platforms/cell/spufs/file.c
-@@ -40,6 +40,120 @@
- #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000)
-+/* Simple attribute files */
-+struct spufs_attr {
-+      int (*get)(void *, u64 *);
-+      int (*set)(void *, u64);
-+      char get_buf[24];       /* enough to store a u64 and "\n\0" */
-+      char set_buf[24];
-+      void *data;
-+      const char *fmt;        /* format for read operation */
-+      struct mutex mutex;     /* protects access to these buffers */
-+};
-+
-+static int spufs_attr_open(struct inode *inode, struct file *file,
-+              int (*get)(void *, u64 *), int (*set)(void *, u64),
-+              const char *fmt)
-+{
-+      struct spufs_attr *attr;
-+
-+      attr = kmalloc(sizeof(*attr), GFP_KERNEL);
-+      if (!attr)
-+              return -ENOMEM;
-+
-+      attr->get = get;
-+      attr->set = set;
-+      attr->data = inode->i_private;
-+      attr->fmt = fmt;
-+      mutex_init(&attr->mutex);
-+      file->private_data = attr;
-+
-+      return nonseekable_open(inode, file);
-+}
-+
-+static int spufs_attr_release(struct inode *inode, struct file *file)
-+{
-+       kfree(file->private_data);
-+      return 0;
-+}
-+
-+static ssize_t spufs_attr_read(struct file *file, char __user *buf,
-+              size_t len, loff_t *ppos)
-+{
-+      struct spufs_attr *attr;
-+      size_t size;
-+      ssize_t ret;
-+
-+      attr = file->private_data;
-+      if (!attr->get)
-+              return -EACCES;
-+
-+      ret = mutex_lock_interruptible(&attr->mutex);
-+      if (ret)
-+              return ret;
-+
-+      if (*ppos) {            /* continued read */
-+              size = strlen(attr->get_buf);
-+      } else {                /* first read */
-+              u64 val;
-+              ret = attr->get(attr->data, &val);
-+              if (ret)
-+                      goto out;
-+
-+              size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
-+                               attr->fmt, (unsigned long long)val);
-+      }
-+
-+      ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
-+out:
-+      mutex_unlock(&attr->mutex);
-+      return ret;
-+}
-+
-+static ssize_t spufs_attr_write(struct file *file, const char __user *buf,
-+              size_t len, loff_t *ppos)
-+{
-+      struct spufs_attr *attr;
-+      u64 val;
-+      size_t size;
-+      ssize_t ret;
-+
-+      attr = file->private_data;
-+      if (!attr->set)
-+              return -EACCES;
-+
-+      ret = mutex_lock_interruptible(&attr->mutex);
-+      if (ret)
-+              return ret;
-+
-+      ret = -EFAULT;
-+      size = min(sizeof(attr->set_buf) - 1, len);
-+      if (copy_from_user(attr->set_buf, buf, size))
-+              goto out;
-+
-+      ret = len; /* claim we got the whole input */
-+      attr->set_buf[size] = '\0';
-+      val = simple_strtol(attr->set_buf, NULL, 0);
-+      attr->set(attr->data, val);
-+out:
-+      mutex_unlock(&attr->mutex);
-+      return ret;
-+}
-+
-+#define DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt)    \
-+static int __fops ## _open(struct inode *inode, struct file *file)    \
-+{                                                                     \
-+      __simple_attr_check_format(__fmt, 0ull);                        \
-+      return spufs_attr_open(inode, file, __get, __set, __fmt);       \
-+}                                                                     \
-+static struct file_operations __fops = {                              \
-+      .owner   = THIS_MODULE,                                         \
-+      .open    = __fops ## _open,                                     \
-+      .release = spufs_attr_release,                                  \
-+      .read    = spufs_attr_read,                                     \
-+      .write   = spufs_attr_write,                                    \
-+};
-+
- static int
- spufs_mem_open(struct inode *inode, struct file *file)
-@@ -84,9 +198,12 @@ spufs_mem_read(struct file *file, char _
-       struct spu_context *ctx = file->private_data;
-       ssize_t ret;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ret = __spufs_mem_read(ctx, buffer, size, pos);
-       spu_release(ctx);
-+
-       return ret;
- }
-@@ -106,7 +223,10 @@ spufs_mem_write(struct file *file, const
-       if (size > LS_SIZE - pos)
-               size = LS_SIZE - pos;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-+
-       local_store = ctx->ops->get_ls(ctx);
-       ret = copy_from_user(local_store + pos, buffer, size);
-       spu_release(ctx);
-@@ -146,7 +266,8 @@ static unsigned long spufs_mem_mmap_nopf
-       pr_debug("spufs_mem_mmap_nopfn address=0x%lx -> 0x%lx, offset=0x%lx\n",
-                addr0, address, offset);
--      spu_acquire(ctx);
-+      if (spu_acquire(ctx))
-+              return NOPFN_REFAULT;
-       if (ctx->state == SPU_STATE_SAVED) {
-               vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
-@@ -236,23 +357,32 @@ static unsigned long spufs_ps_nopfn(stru
- {
-       struct spu_context *ctx = vma->vm_file->private_data;
-       unsigned long area, offset = address - vma->vm_start;
--      int ret;
-       offset += vma->vm_pgoff << PAGE_SHIFT;
-       if (offset >= ps_size)
-               return NOPFN_SIGBUS;
--      /* error here usually means a signal.. we might want to test
--       * the error code more precisely though
-+      /*
-+       * We have to wait for context to be loaded before we have
-+       * pages to hand out to the user, but we don't want to wait
-+       * with the mmap_sem held.
-+       * It is possible to drop the mmap_sem here, but then we need
-+       * to return NOPFN_REFAULT because the mappings may have
-+       * hanged.
-        */
--      ret = spu_acquire_runnable(ctx, 0);
--      if (ret)
-+      if (spu_acquire(ctx))
-               return NOPFN_REFAULT;
--      area = ctx->spu->problem_phys + ps_offs;
--      vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
--      spu_release(ctx);
-+      if (ctx->state == SPU_STATE_SAVED) {
-+              up_read(&current->mm->mmap_sem);
-+              spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
-+              down_read(&current->mm->mmap_sem);
-+      } else {
-+              area = ctx->spu->problem_phys + ps_offs;
-+              vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
-+      }
-+      spu_release(ctx);
-       return NOPFN_REFAULT;
- }
-@@ -286,25 +416,32 @@ static int spufs_cntl_mmap(struct file *
- #define spufs_cntl_mmap NULL
- #endif /* !SPUFS_MMAP_4K */
--static u64 spufs_cntl_get(void *data)
-+static int spufs_cntl_get(void *data, u64 *val)
- {
-       struct spu_context *ctx = data;
--      u64 val;
-+      int ret;
--      spu_acquire(ctx);
--      val = ctx->ops->status_read(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-+      *val = ctx->ops->status_read(ctx);
-       spu_release(ctx);
--      return val;
-+      return 0;
- }
--static void spufs_cntl_set(void *data, u64 val)
-+static int spufs_cntl_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-+      int ret;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->runcntl_write(ctx, val);
-       spu_release(ctx);
-+
-+      return 0;
- }
- static int spufs_cntl_open(struct inode *inode, struct file *file)
-@@ -317,7 +454,7 @@ static int spufs_cntl_open(struct inode 
-       if (!i->i_openers++)
-               ctx->cntl = inode->i_mapping;
-       mutex_unlock(&ctx->mapping_lock);
--      return simple_attr_open(inode, file, spufs_cntl_get,
-+      return spufs_attr_open(inode, file, spufs_cntl_get,
-                                       spufs_cntl_set, "0x%08lx");
- }
-@@ -327,7 +464,7 @@ spufs_cntl_release(struct inode *inode, 
-       struct spufs_inode_info *i = SPUFS_I(inode);
-       struct spu_context *ctx = i->i_ctx;
--      simple_attr_close(inode, file);
-+      spufs_attr_release(inode, file);
-       mutex_lock(&ctx->mapping_lock);
-       if (!--i->i_openers)
-@@ -339,8 +476,8 @@ spufs_cntl_release(struct inode *inode, 
- static const struct file_operations spufs_cntl_fops = {
-       .open = spufs_cntl_open,
-       .release = spufs_cntl_release,
--      .read = simple_attr_read,
--      .write = simple_attr_write,
-+      .read = spufs_attr_read,
-+      .write = spufs_attr_write,
-       .mmap = spufs_cntl_mmap,
- };
-@@ -368,7 +505,9 @@ spufs_regs_read(struct file *file, char 
-       int ret;
-       struct spu_context *ctx = file->private_data;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       ret = __spufs_regs_read(ctx, buffer, size, pos);
-       spu_release_saved(ctx);
-       return ret;
-@@ -387,7 +526,9 @@ spufs_regs_write(struct file *file, cons
-               return -EFBIG;
-       *pos += size;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       ret = copy_from_user(lscsa->gprs + *pos - size,
-                            buffer, size) ? -EFAULT : size;
-@@ -419,7 +560,9 @@ spufs_fpcr_read(struct file *file, char 
-       int ret;
-       struct spu_context *ctx = file->private_data;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       ret = __spufs_fpcr_read(ctx, buffer, size, pos);
-       spu_release_saved(ctx);
-       return ret;
-@@ -436,10 +579,12 @@ spufs_fpcr_write(struct file *file, cons
-       size = min_t(ssize_t, sizeof(lscsa->fpcr) - *pos, size);
-       if (size <= 0)
-               return -EFBIG;
--      *pos += size;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-+      *pos += size;
-       ret = copy_from_user((char *)&lscsa->fpcr + *pos - size,
-                            buffer, size) ? -EFAULT : size;
-@@ -486,7 +631,10 @@ static ssize_t spufs_mbox_read(struct fi
-       udata = (void __user *)buf;
--      spu_acquire(ctx);
-+      count = spu_acquire(ctx);
-+      if (count)
-+              return count;
-+
-       for (count = 0; (count + 4) <= len; count += 4, udata++) {
-               int ret;
-               ret = ctx->ops->mbox_read(ctx, &mbox_data);
-@@ -522,12 +670,15 @@ static ssize_t spufs_mbox_stat_read(stru
-                       size_t len, loff_t *pos)
- {
-       struct spu_context *ctx = file->private_data;
-+      ssize_t ret;
-       u32 mbox_stat;
-       if (len < 4)
-               return -EINVAL;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       mbox_stat = ctx->ops->mbox_stat_read(ctx) & 0xff;
-@@ -562,6 +713,9 @@ void spufs_ibox_callback(struct spu *spu
- {
-       struct spu_context *ctx = spu->ctx;
-+      if (!ctx)
-+              return;
-+
-       wake_up_all(&ctx->ibox_wq);
-       kill_fasync(&ctx->ibox_fasync, SIGIO, POLLIN);
- }
-@@ -593,7 +747,9 @@ static ssize_t spufs_ibox_read(struct fi
-       udata = (void __user *)buf;
--      spu_acquire(ctx);
-+      count = spu_acquire(ctx);
-+      if (count)
-+              return count;
-       /* wait only for the first element */
-       count = 0;
-@@ -639,7 +795,11 @@ static unsigned int spufs_ibox_poll(stru
-       poll_wait(file, &ctx->ibox_wq, wait);
--      spu_acquire(ctx);
-+      /*
-+       * For now keep this uninterruptible and also ignore the rule
-+       * that poll should not sleep.  Will be fixed later.
-+       */
-+      mutex_lock(&ctx->state_mutex);
-       mask = ctx->ops->mbox_stat_poll(ctx, POLLIN | POLLRDNORM);
-       spu_release(ctx);
-@@ -657,12 +817,15 @@ static ssize_t spufs_ibox_stat_read(stru
-                       size_t len, loff_t *pos)
- {
-       struct spu_context *ctx = file->private_data;
-+      ssize_t ret;
-       u32 ibox_stat;
-       if (len < 4)
-               return -EINVAL;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ibox_stat = (ctx->ops->mbox_stat_read(ctx) >> 16) & 0xff;
-       spu_release(ctx);
-@@ -698,6 +861,9 @@ void spufs_wbox_callback(struct spu *spu
- {
-       struct spu_context *ctx = spu->ctx;
-+      if (!ctx)
-+              return;
-+
-       wake_up_all(&ctx->wbox_wq);
-       kill_fasync(&ctx->wbox_fasync, SIGIO, POLLOUT);
- }
-@@ -731,7 +897,9 @@ static ssize_t spufs_wbox_write(struct f
-       if (__get_user(wbox_data, udata))
-               return -EFAULT;
--      spu_acquire(ctx);
-+      count = spu_acquire(ctx);
-+      if (count)
-+              return count;
-       /*
-        * make sure we can at least write one element, by waiting
-@@ -772,7 +940,11 @@ static unsigned int spufs_wbox_poll(stru
-       poll_wait(file, &ctx->wbox_wq, wait);
--      spu_acquire(ctx);
-+      /*
-+       * For now keep this uninterruptible and also ignore the rule
-+       * that poll should not sleep.  Will be fixed later.
-+       */
-+      mutex_lock(&ctx->state_mutex);
-       mask = ctx->ops->mbox_stat_poll(ctx, POLLOUT | POLLWRNORM);
-       spu_release(ctx);
-@@ -790,12 +962,15 @@ static ssize_t spufs_wbox_stat_read(stru
-                       size_t len, loff_t *pos)
- {
-       struct spu_context *ctx = file->private_data;
-+      ssize_t ret;
-       u32 wbox_stat;
-       if (len < 4)
-               return -EINVAL;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       wbox_stat = (ctx->ops->mbox_stat_read(ctx) >> 8) & 0xff;
-       spu_release(ctx);
-@@ -866,7 +1041,9 @@ static ssize_t spufs_signal1_read(struct
-       int ret;
-       struct spu_context *ctx = file->private_data;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       ret = __spufs_signal1_read(ctx, buf, len, pos);
-       spu_release_saved(ctx);
-@@ -877,6 +1054,7 @@ static ssize_t spufs_signal1_write(struc
-                       size_t len, loff_t *pos)
- {
-       struct spu_context *ctx;
-+      ssize_t ret;
-       u32 data;
-       ctx = file->private_data;
-@@ -887,7 +1065,9 @@ static ssize_t spufs_signal1_write(struc
-       if (copy_from_user(&data, buf, 4))
-               return -EFAULT;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->signal1_write(ctx, data);
-       spu_release(ctx);
-@@ -997,7 +1177,9 @@ static ssize_t spufs_signal2_read(struct
-       struct spu_context *ctx = file->private_data;
-       int ret;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       ret = __spufs_signal2_read(ctx, buf, len, pos);
-       spu_release_saved(ctx);
-@@ -1008,6 +1190,7 @@ static ssize_t spufs_signal2_write(struc
-                       size_t len, loff_t *pos)
- {
-       struct spu_context *ctx;
-+      ssize_t ret;
-       u32 data;
-       ctx = file->private_data;
-@@ -1018,7 +1201,9 @@ static ssize_t spufs_signal2_write(struc
-       if (copy_from_user(&data, buf, 4))
-               return -EFAULT;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->signal2_write(ctx, data);
-       spu_release(ctx);
-@@ -1086,33 +1271,42 @@ static const struct file_operations spuf
- #define SPU_ATTR_ACQUIRE_SAVED        2
- #define DEFINE_SPUFS_ATTRIBUTE(__name, __get, __set, __fmt, __acquire)        \
--static u64 __##__get(void *data)                                      \
-+static int __##__get(void *data, u64 *val)                            \
- {                                                                     \
-       struct spu_context *ctx = data;                                 \
--      u64 ret;                                                        \
-+      int ret = 0;                                                    \
-                                                                       \
-       if (__acquire == SPU_ATTR_ACQUIRE) {                            \
--              spu_acquire(ctx);                                       \
--              ret = __get(ctx);                                       \
-+              ret = spu_acquire(ctx);                                 \
-+              if (ret)                                                \
-+                      return ret;                                     \
-+              *val = __get(ctx);                                      \
-               spu_release(ctx);                                       \
-       } else if (__acquire == SPU_ATTR_ACQUIRE_SAVED) {               \
--              spu_acquire_saved(ctx);                                 \
--              ret = __get(ctx);                                       \
-+              ret = spu_acquire_saved(ctx);                           \
-+              if (ret)                                                \
-+                      return ret;                                     \
-+              *val = __get(ctx);                                      \
-               spu_release_saved(ctx);                                 \
-       } else                                                          \
--              ret = __get(ctx);                                       \
-+              *val = __get(ctx);                                      \
-                                                                       \
--      return ret;                                                     \
-+      return 0;                                                       \
- }                                                                     \
--DEFINE_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
-+DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
--static void spufs_signal1_type_set(void *data, u64 val)
-+static int spufs_signal1_type_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-+      int ret;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->signal1_type_set(ctx, val);
-       spu_release(ctx);
-+
-+      return 0;
- }
- static u64 spufs_signal1_type_get(struct spu_context *ctx)
-@@ -1123,13 +1317,18 @@ DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_typ
-                      spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
--static void spufs_signal2_type_set(void *data, u64 val)
-+static int spufs_signal2_type_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-+      int ret;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->signal2_type_set(ctx, val);
-       spu_release(ctx);
-+
-+      return 0;
- }
- static u64 spufs_signal2_type_get(struct spu_context *ctx)
-@@ -1329,6 +1528,9 @@ void spufs_mfc_callback(struct spu *spu)
- {
-       struct spu_context *ctx = spu->ctx;
-+      if (!ctx)
-+              return;
-+
-       wake_up_all(&ctx->mfc_wq);
-       pr_debug("%s %s\n", __FUNCTION__, spu->name);
-@@ -1375,12 +1577,17 @@ static ssize_t spufs_mfc_read(struct fil
-       if (size != 4)
-               goto out;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-+
-+      ret = -EINVAL;
-       if (file->f_flags & O_NONBLOCK) {
-               status = ctx->ops->read_mfc_tagstatus(ctx);
-               if (!(status & ctx->tagwait))
-                       ret = -EAGAIN;
-               else
-+                      /* XXX(hch): shouldn't we clear ret here? */
-                       ctx->tagwait &= ~status;
-       } else {
-               ret = spufs_wait(ctx->mfc_wq,
-@@ -1505,7 +1712,11 @@ static ssize_t spufs_mfc_write(struct fi
-       if (ret)
-               goto out;
--      ret = spu_acquire_runnable(ctx, 0);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              goto out;
-+
-+      ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
-       if (ret)
-               goto out;
-@@ -1539,7 +1750,11 @@ static unsigned int spufs_mfc_poll(struc
-       poll_wait(file, &ctx->mfc_wq, wait);
--      spu_acquire(ctx);
-+      /*
-+       * For now keep this uninterruptible and also ignore the rule
-+       * that poll should not sleep.  Will be fixed later.
-+       */
-+      mutex_lock(&ctx->state_mutex);
-       ctx->ops->set_mfc_query(ctx, ctx->tagwait, 2);
-       free_elements = ctx->ops->get_mfc_free_elements(ctx);
-       tagstatus = ctx->ops->read_mfc_tagstatus(ctx);
-@@ -1562,7 +1777,9 @@ static int spufs_mfc_flush(struct file *
-       struct spu_context *ctx = file->private_data;
-       int ret;
--      spu_acquire(ctx);
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
- #if 0
- /* this currently hangs */
-       ret = spufs_wait(ctx->mfc_wq,
-@@ -1605,12 +1822,18 @@ static const struct file_operations spuf
-       .mmap    = spufs_mfc_mmap,
- };
--static void spufs_npc_set(void *data, u64 val)
-+static int spufs_npc_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
--      spu_acquire(ctx);
-+      int ret;
-+
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
-       ctx->ops->npc_write(ctx, val);
-       spu_release(ctx);
-+
-+      return 0;
- }
- static u64 spufs_npc_get(struct spu_context *ctx)
-@@ -1620,13 +1843,19 @@ static u64 spufs_npc_get(struct spu_cont
- DEFINE_SPUFS_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set,
-                      "0x%llx\n", SPU_ATTR_ACQUIRE);
--static void spufs_decr_set(void *data, u64 val)
-+static int spufs_decr_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-       struct spu_lscsa *lscsa = ctx->csa.lscsa;
--      spu_acquire_saved(ctx);
-+      int ret;
-+
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       lscsa->decr.slot[0] = (u32) val;
-       spu_release_saved(ctx);
-+
-+      return 0;
- }
- static u64 spufs_decr_get(struct spu_context *ctx)
-@@ -1637,15 +1866,21 @@ static u64 spufs_decr_get(struct spu_con
- DEFINE_SPUFS_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set,
-                      "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED);
--static void spufs_decr_status_set(void *data, u64 val)
-+static int spufs_decr_status_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
--      spu_acquire_saved(ctx);
-+      int ret;
-+
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       if (val)
-               ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_DECREMENTER_RUNNING;
-       else
-               ctx->csa.priv2.mfc_control_RW &= ~MFC_CNTL_DECREMENTER_RUNNING;
-       spu_release_saved(ctx);
-+
-+      return 0;
- }
- static u64 spufs_decr_status_get(struct spu_context *ctx)
-@@ -1659,13 +1894,19 @@ DEFINE_SPUFS_ATTRIBUTE(spufs_decr_status
-                      spufs_decr_status_set, "0x%llx\n",
-                      SPU_ATTR_ACQUIRE_SAVED);
--static void spufs_event_mask_set(void *data, u64 val)
-+static int spufs_event_mask_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-       struct spu_lscsa *lscsa = ctx->csa.lscsa;
--      spu_acquire_saved(ctx);
-+      int ret;
-+
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       lscsa->event_mask.slot[0] = (u32) val;
-       spu_release_saved(ctx);
-+
-+      return 0;
- }
- static u64 spufs_event_mask_get(struct spu_context *ctx)
-@@ -1690,13 +1931,19 @@ static u64 spufs_event_status_get(struct
- DEFINE_SPUFS_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get,
-                      NULL, "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED)
--static void spufs_srr0_set(void *data, u64 val)
-+static int spufs_srr0_set(void *data, u64 val)
- {
-       struct spu_context *ctx = data;
-       struct spu_lscsa *lscsa = ctx->csa.lscsa;
--      spu_acquire_saved(ctx);
-+      int ret;
-+
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       lscsa->srr0.slot[0] = (u32) val;
-       spu_release_saved(ctx);
-+
-+      return 0;
- }
- static u64 spufs_srr0_get(struct spu_context *ctx)
-@@ -1727,10 +1974,12 @@ static u64 spufs_object_id_get(struct sp
-       return ctx->object_id;
- }
--static void spufs_object_id_set(void *data, u64 id)
-+static int spufs_object_id_set(void *data, u64 id)
- {
-       struct spu_context *ctx = data;
-       ctx->object_id = id;
-+
-+      return 0;
- }
- DEFINE_SPUFS_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get,
-@@ -1777,13 +2026,13 @@ static const struct file_operations spuf
- static ssize_t __spufs_mbox_info_read(struct spu_context *ctx,
-                       char __user *buf, size_t len, loff_t *pos)
- {
--      u32 mbox_stat;
-       u32 data;
--      mbox_stat = ctx->csa.prob.mb_stat_R;
--      if (mbox_stat & 0x0000ff) {
--              data = ctx->csa.prob.pu_mb_R;
--      }
-+      /* EOF if there's no entry in the mbox */
-+      if (!(ctx->csa.prob.mb_stat_R & 0x0000ff))
-+              return 0;
-+
-+      data = ctx->csa.prob.pu_mb_R;
-       return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
- }
-@@ -1797,7 +2046,9 @@ static ssize_t spufs_mbox_info_read(stru
-       if (!access_ok(VERIFY_WRITE, buf, len))
-               return -EFAULT;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       spin_lock(&ctx->csa.register_lock);
-       ret = __spufs_mbox_info_read(ctx, buf, len, pos);
-       spin_unlock(&ctx->csa.register_lock);
-@@ -1815,13 +2066,13 @@ static const struct file_operations spuf
- static ssize_t __spufs_ibox_info_read(struct spu_context *ctx,
-                               char __user *buf, size_t len, loff_t *pos)
- {
--      u32 ibox_stat;
-       u32 data;
--      ibox_stat = ctx->csa.prob.mb_stat_R;
--      if (ibox_stat & 0xff0000) {
--              data = ctx->csa.priv2.puint_mb_R;
--      }
-+      /* EOF if there's no entry in the ibox */
-+      if (!(ctx->csa.prob.mb_stat_R & 0xff0000))
-+              return 0;
-+
-+      data = ctx->csa.priv2.puint_mb_R;
-       return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
- }
-@@ -1835,7 +2086,9 @@ static ssize_t spufs_ibox_info_read(stru
-       if (!access_ok(VERIFY_WRITE, buf, len))
-               return -EFAULT;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       spin_lock(&ctx->csa.register_lock);
-       ret = __spufs_ibox_info_read(ctx, buf, len, pos);
-       spin_unlock(&ctx->csa.register_lock);
-@@ -1876,7 +2129,9 @@ static ssize_t spufs_wbox_info_read(stru
-       if (!access_ok(VERIFY_WRITE, buf, len))
-               return -EFAULT;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       spin_lock(&ctx->csa.register_lock);
-       ret = __spufs_wbox_info_read(ctx, buf, len, pos);
-       spin_unlock(&ctx->csa.register_lock);
-@@ -1926,7 +2181,9 @@ static ssize_t spufs_dma_info_read(struc
-       if (!access_ok(VERIFY_WRITE, buf, len))
-               return -EFAULT;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       spin_lock(&ctx->csa.register_lock);
-       ret = __spufs_dma_info_read(ctx, buf, len, pos);
-       spin_unlock(&ctx->csa.register_lock);
-@@ -1977,7 +2234,9 @@ static ssize_t spufs_proxydma_info_read(
-       struct spu_context *ctx = file->private_data;
-       int ret;
--      spu_acquire_saved(ctx);
-+      ret = spu_acquire_saved(ctx);
-+      if (ret)
-+              return ret;
-       spin_lock(&ctx->csa.register_lock);
-       ret = __spufs_proxydma_info_read(ctx, buf, len, pos);
-       spin_unlock(&ctx->csa.register_lock);
-@@ -2066,8 +2325,12 @@ static unsigned long long spufs_class2_i
- static int spufs_show_stat(struct seq_file *s, void *private)
- {
-       struct spu_context *ctx = s->private;
-+      int ret;
-+
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              return ret;
--      spu_acquire(ctx);
-       seq_printf(s, "%s %llu %llu %llu %llu "
-                     "%llu %llu %llu %llu %llu %llu %llu %llu\n",
-               ctx_state_names[ctx->stats.util_state],
---- a/arch/powerpc/platforms/cell/spufs/hw_ops.c
-+++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c
-@@ -76,16 +76,18 @@ static unsigned int spu_hw_mbox_stat_pol
-               if (stat & 0xff0000)
-                       ret |= POLLIN | POLLRDNORM;
-               else {
--                      spu_int_stat_clear(spu, 2, 0x1);
--                      spu_int_mask_or(spu, 2, 0x1);
-+                      spu_int_stat_clear(spu, 2, CLASS2_MAILBOX_INTR);
-+                      spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
-               }
-       }
-       if (events & (POLLOUT | POLLWRNORM)) {
-               if (stat & 0x00ff00)
-                       ret = POLLOUT | POLLWRNORM;
-               else {
--                      spu_int_stat_clear(spu, 2, 0x10);
--                      spu_int_mask_or(spu, 2, 0x10);
-+                      spu_int_stat_clear(spu, 2,
-+                                      CLASS2_MAILBOX_THRESHOLD_INTR);
-+                      spu_int_mask_or(spu, 2,
-+                                      CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
-               }
-       }
-       spin_unlock_irq(&spu->register_lock);
-@@ -106,7 +108,7 @@ static int spu_hw_ibox_read(struct spu_c
-               ret = 4;
-       } else {
-               /* make sure we get woken up by the interrupt */
--              spu_int_mask_or(spu, 2, 0x1);
-+              spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
-               ret = 0;
-       }
-       spin_unlock_irq(&spu->register_lock);
-@@ -127,7 +129,7 @@ static int spu_hw_wbox_write(struct spu_
-       } else {
-               /* make sure we get woken up by the interrupt when space
-                  becomes available */
--              spu_int_mask_or(spu, 2, 0x10);
-+              spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
-               ret = 0;
-       }
-       spin_unlock_irq(&spu->register_lock);
-@@ -206,6 +208,11 @@ static char *spu_hw_get_ls(struct spu_co
-       return ctx->spu->local_store;
- }
-+static void spu_hw_privcntl_write(struct spu_context *ctx, u64 val)
-+{
-+      out_be64(&ctx->spu->priv2->spu_privcntl_RW, val);
-+}
-+
- static u32 spu_hw_runcntl_read(struct spu_context *ctx)
- {
-       return in_be32(&ctx->spu->problem->spu_runcntl_RW);
-@@ -215,11 +222,21 @@ static void spu_hw_runcntl_write(struct 
- {
-       spin_lock_irq(&ctx->spu->register_lock);
-       if (val & SPU_RUNCNTL_ISOLATE)
--              out_be64(&ctx->spu->priv2->spu_privcntl_RW, 4LL);
-+              spu_hw_privcntl_write(ctx,
-+                      SPU_PRIVCNT_LOAD_REQUEST_ENABLE_MASK);
-       out_be32(&ctx->spu->problem->spu_runcntl_RW, val);
-       spin_unlock_irq(&ctx->spu->register_lock);
- }
-+static void spu_hw_runcntl_stop(struct spu_context *ctx)
-+{
-+      spin_lock_irq(&ctx->spu->register_lock);
-+      out_be32(&ctx->spu->problem->spu_runcntl_RW, SPU_RUNCNTL_STOP);
-+      while (in_be32(&ctx->spu->problem->spu_status_R) & SPU_STATUS_RUNNING)
-+              cpu_relax();
-+      spin_unlock_irq(&ctx->spu->register_lock);
-+}
-+
- static void spu_hw_master_start(struct spu_context *ctx)
- {
-       struct spu *spu = ctx->spu;
-@@ -319,8 +336,10 @@ struct spu_context_ops spu_hw_ops = {
-       .npc_write = spu_hw_npc_write,
-       .status_read = spu_hw_status_read,
-       .get_ls = spu_hw_get_ls,
-+      .privcntl_write = spu_hw_privcntl_write,
-       .runcntl_read = spu_hw_runcntl_read,
-       .runcntl_write = spu_hw_runcntl_write,
-+      .runcntl_stop = spu_hw_runcntl_stop,
-       .master_start = spu_hw_master_start,
-       .master_stop = spu_hw_master_stop,
-       .set_mfc_query = spu_hw_set_mfc_query,
---- a/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c
-+++ b/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c
-@@ -28,6 +28,8 @@
- #include <asm/spu_csa.h>
- #include <asm/mmu.h>
-+#include "spufs.h"
-+
- static int spu_alloc_lscsa_std(struct spu_state *csa)
- {
-       struct spu_lscsa *lscsa;
-@@ -73,7 +75,7 @@ int spu_alloc_lscsa(struct spu_state *cs
-       int             i, j, n_4k;
-       /* Check availability of 64K pages */
--      if (mmu_psize_defs[MMU_PAGE_64K].shift == 0)
-+      if (!spu_64k_pages_available())
-               goto fail;
-       csa->use_big_pages = 1;
---- a/arch/powerpc/platforms/cell/spufs/run.c
-+++ b/arch/powerpc/platforms/cell/spufs/run.c
-@@ -15,24 +15,55 @@ void spufs_stop_callback(struct spu *spu
- {
-       struct spu_context *ctx = spu->ctx;
--      wake_up_all(&ctx->stop_wq);
-+      /*
-+       * It should be impossible to preempt a context while an exception
-+       * is being processed, since the context switch code is specially
-+       * coded to deal with interrupts ... But, just in case, sanity check
-+       * the context pointer.  It is OK to return doing nothing since
-+       * the exception will be regenerated when the context is resumed.
-+       */
-+      if (ctx) {
-+              /* Copy exception arguments into module specific structure */
-+              ctx->csa.class_0_pending = spu->class_0_pending;
-+              ctx->csa.dsisr = spu->dsisr;
-+              ctx->csa.dar = spu->dar;
-+
-+              /* ensure that the exception status has hit memory before a
-+               * thread waiting on the context's stop queue is woken */
-+              smp_wmb();
-+
-+              wake_up_all(&ctx->stop_wq);
-+      }
-+
-+      /* Clear callback arguments from spu structure */
-+      spu->class_0_pending = 0;
-+      spu->dsisr = 0;
-+      spu->dar = 0;
- }
--static inline int spu_stopped(struct spu_context *ctx, u32 *stat)
-+int spu_stopped(struct spu_context *ctx, u32 *stat)
- {
--      struct spu *spu;
--      u64 pte_fault;
-+      u64 dsisr;
-+      u32 stopped;
-       *stat = ctx->ops->status_read(ctx);
--      spu = ctx->spu;
--      if (ctx->state != SPU_STATE_RUNNABLE ||
--          test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
-+      if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
-+              return 1;
-+
-+      stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
-+              SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
-+      if (*stat & stopped)
-+              return 1;
-+
-+      dsisr = ctx->csa.dsisr;
-+      if (dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED))
-               return 1;
--      pte_fault = spu->dsisr &
--          (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
--      return (!(*stat & SPU_STATUS_RUNNING) || pte_fault || spu->class_0_pending) ?
--              1 : 0;
-+
-+      if (ctx->csa.class_0_pending)
-+              return 1;
-+
-+      return 0;
- }
- static int spu_setup_isolated(struct spu_context *ctx)
-@@ -128,34 +159,66 @@ out:
- static int spu_run_init(struct spu_context *ctx, u32 *npc)
- {
-+      unsigned long runcntl = SPU_RUNCNTL_RUNNABLE;
-+      int ret;
-+
-       spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
--      if (ctx->flags & SPU_CREATE_ISOLATE) {
--              unsigned long runcntl;
-+      /*
-+       * NOSCHED is synchronous scheduling with respect to the caller.
-+       * The caller waits for the context to be loaded.
-+       */
-+      if (ctx->flags & SPU_CREATE_NOSCHED) {
-+              if (ctx->state == SPU_STATE_SAVED) {
-+                      ret = spu_activate(ctx, 0);
-+                      if (ret)
-+                              return ret;
-+              }
-+      }
-+      /*
-+       * Apply special setup as required.
-+       */
-+      if (ctx->flags & SPU_CREATE_ISOLATE) {
-               if (!(ctx->ops->status_read(ctx) & SPU_STATUS_ISOLATED_STATE)) {
--                      int ret = spu_setup_isolated(ctx);
-+                      ret = spu_setup_isolated(ctx);
-                       if (ret)
-                               return ret;
-               }
--              /* if userspace has set the runcntrl register (eg, to issue an
--               * isolated exit), we need to re-set it here */
-+              /*
-+               * If userspace has set the runcntrl register (eg, to
-+               * issue an isolated exit), we need to re-set it here
-+               */
-               runcntl = ctx->ops->runcntl_read(ctx) &
-                       (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
-               if (runcntl == 0)
-                       runcntl = SPU_RUNCNTL_RUNNABLE;
-+      }
-+
-+      if (ctx->flags & SPU_CREATE_NOSCHED) {
-+              spuctx_switch_state(ctx, SPU_UTIL_USER);
-               ctx->ops->runcntl_write(ctx, runcntl);
-       } else {
--              unsigned long mode = SPU_PRIVCNTL_MODE_NORMAL;
--              ctx->ops->npc_write(ctx, *npc);
-+              unsigned long privcntl;
-+
-               if (test_thread_flag(TIF_SINGLESTEP))
--                      mode = SPU_PRIVCNTL_MODE_SINGLE_STEP;
--              out_be64(&ctx->spu->priv2->spu_privcntl_RW, mode);
--              ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
--      }
-+                      privcntl = SPU_PRIVCNTL_MODE_SINGLE_STEP;
-+              else
-+                      privcntl = SPU_PRIVCNTL_MODE_NORMAL;
--      spuctx_switch_state(ctx, SPU_UTIL_USER);
-+              ctx->ops->npc_write(ctx, *npc);
-+              ctx->ops->privcntl_write(ctx, privcntl);
-+              ctx->ops->runcntl_write(ctx, runcntl);
-+
-+              if (ctx->state == SPU_STATE_SAVED) {
-+                      ret = spu_activate(ctx, 0);
-+                      if (ret)
-+                              return ret;
-+              } else {
-+                      spuctx_switch_state(ctx, SPU_UTIL_USER);
-+              }
-+      }
-       return 0;
- }
-@@ -165,6 +228,8 @@ static int spu_run_fini(struct spu_conte
- {
-       int ret = 0;
-+      spu_del_from_rq(ctx);
-+
-       *status = ctx->ops->status_read(ctx);
-       *npc = ctx->ops->npc_read(ctx);
-@@ -177,26 +242,6 @@ static int spu_run_fini(struct spu_conte
-       return ret;
- }
--static int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
--                                       u32 *status)
--{
--      int ret;
--
--      ret = spu_run_fini(ctx, npc, status);
--      if (ret)
--              return ret;
--
--      if (*status & (SPU_STATUS_STOPPED_BY_STOP | SPU_STATUS_STOPPED_BY_HALT))
--              return *status;
--
--      ret = spu_acquire_runnable(ctx, 0);
--      if (ret)
--              return ret;
--
--      spuctx_switch_state(ctx, SPU_UTIL_USER);
--      return 0;
--}
--
- /*
-  * SPU syscall restarting is tricky because we violate the basic
-  * assumption that the signal handler is running on the interrupted
-@@ -247,7 +292,7 @@ static int spu_process_callback(struct s
-       u32 ls_pointer, npc;
-       void __iomem *ls;
-       long spu_ret;
--      int ret;
-+      int ret, ret2;
-       /* get syscall block from local store */
-       npc = ctx->ops->npc_read(ctx) & ~3;
-@@ -269,9 +314,11 @@ static int spu_process_callback(struct s
-               if (spu_ret <= -ERESTARTSYS) {
-                       ret = spu_handle_restartsys(ctx, &spu_ret, &npc);
-               }
--              spu_acquire(ctx);
-+              ret2 = spu_acquire(ctx);
-               if (ret == -ERESTARTSYS)
-                       return ret;
-+              if (ret2)
-+                      return -EINTR;
-       }
-       /* write result, jump over indirect pointer */
-@@ -281,18 +328,6 @@ static int spu_process_callback(struct s
-       return ret;
- }
--static inline int spu_process_events(struct spu_context *ctx)
--{
--      struct spu *spu = ctx->spu;
--      int ret = 0;
--
--      if (spu->class_0_pending)
--              ret = spu_irq_class_0_bottom(spu);
--      if (!ret && signal_pending(current))
--              ret = -ERESTARTSYS;
--      return ret;
--}
--
- long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *event)
- {
-       int ret;
-@@ -302,29 +337,14 @@ long spufs_run_spu(struct spu_context *c
-       if (mutex_lock_interruptible(&ctx->run_mutex))
-               return -ERESTARTSYS;
--      ctx->ops->master_start(ctx);
-+      spu_enable_spu(ctx);
-       ctx->event_return = 0;
--      spu_acquire(ctx);
--      if (ctx->state == SPU_STATE_SAVED) {
--              __spu_update_sched_info(ctx);
--              spu_set_timeslice(ctx);
--
--              ret = spu_activate(ctx, 0);
--              if (ret) {
--                      spu_release(ctx);
--                      goto out;
--              }
--      } else {
--              /*
--               * We have to update the scheduling priority under active_mutex
--               * to protect against find_victim().
--               *
--               * No need to update the timeslice ASAP, it will get updated
--               * once the current one has expired.
--               */
--              spu_update_sched_info(ctx);
--      }
-+      ret = spu_acquire(ctx);
-+      if (ret)
-+              goto out_unlock;
-+
-+      spu_update_sched_info(ctx);
-       ret = spu_run_init(ctx, npc);
-       if (ret) {
-@@ -358,14 +378,12 @@ long spufs_run_spu(struct spu_context *c
-               if (ret)
-                       break;
--              if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
--                      ret = spu_reacquire_runnable(ctx, npc, &status);
--                      if (ret)
--                              goto out2;
--                      continue;
--              }
--              ret = spu_process_events(ctx);
-+              ret = spufs_handle_class0(ctx);
-+              if (ret)
-+                      break;
-+              if (signal_pending(current))
-+                      ret = -ERESTARTSYS;
-       } while (!ret && !(status & (SPU_STATUS_STOPPED_BY_STOP |
-                                     SPU_STATUS_STOPPED_BY_HALT |
-                                      SPU_STATUS_SINGLE_STEP)));
-@@ -376,11 +394,10 @@ long spufs_run_spu(struct spu_context *c
-               ctx->stats.libassist++;
--      ctx->ops->master_stop(ctx);
-+      spu_disable_spu(ctx);
-       ret = spu_run_fini(ctx, npc, &status);
-       spu_yield(ctx);
--out2:
-       if ((ret == 0) ||
-           ((ret == -ERESTARTSYS) &&
-            ((status & SPU_STATUS_STOPPED_BY_HALT) ||
-@@ -401,6 +418,7 @@ out2:
- out:
-       *event = ctx->event_return;
-+out_unlock:
-       mutex_unlock(&ctx->run_mutex);
-       return ret;
- }
---- a/arch/powerpc/platforms/cell/spufs/sched.c
-+++ b/arch/powerpc/platforms/cell/spufs/sched.c
-@@ -58,6 +58,7 @@ static unsigned long spu_avenrun[3];
- static struct spu_prio_array *spu_prio;
- static struct task_struct *spusched_task;
- static struct timer_list spusched_timer;
-+static struct timer_list spuloadavg_timer;
- /*
-  * Priority of a normal, non-rt, non-niced'd process (aka nice level 0).
-@@ -105,15 +106,21 @@ void spu_set_timeslice(struct spu_contex
- void __spu_update_sched_info(struct spu_context *ctx)
- {
-       /*
--       * 32-Bit assignment are atomic on powerpc, and we don't care about
--       * memory ordering here because retriving the controlling thread is
--       * per defintion racy.
-+       * assert that the context is not on the runqueue, so it is safe
-+       * to change its scheduling parameters.
-+       */
-+      BUG_ON(!list_empty(&ctx->rq));
-+
-+      /*
-+       * 32-Bit assignments are atomic on powerpc, and we don't care about
-+       * memory ordering here because retrieving the controlling thread is
-+       * per definition racy.
-        */
-       ctx->tid = current->pid;
-       /*
-        * We do our own priority calculations, so we normally want
--       * ->static_prio to start with. Unfortunately thies field
-+       * ->static_prio to start with. Unfortunately this field
-        * contains junk for threads with a realtime scheduling
-        * policy so we have to look at ->prio in this case.
-        */
-@@ -124,23 +131,32 @@ void __spu_update_sched_info(struct spu_
-       ctx->policy = current->policy;
-       /*
--       * A lot of places that don't hold list_mutex poke into
--       * cpus_allowed, including grab_runnable_context which
--       * already holds the runq_lock.  So abuse runq_lock
--       * to protect this field aswell.
-+       * TO DO: the context may be loaded, so we may need to activate
-+       * it again on a different node. But it shouldn't hurt anything
-+       * to update its parameters, because we know that the scheduler
-+       * is not actively looking at this field, since it is not on the
-+       * runqueue. The context will be rescheduled on the proper node
-+       * if it is timesliced or preempted.
-        */
--      spin_lock(&spu_prio->runq_lock);
-       ctx->cpus_allowed = current->cpus_allowed;
--      spin_unlock(&spu_prio->runq_lock);
- }
- void spu_update_sched_info(struct spu_context *ctx)
- {
--      int node = ctx->spu->node;
-+      int node;
--      mutex_lock(&cbe_spu_info[node].list_mutex);
--      __spu_update_sched_info(ctx);
--      mutex_unlock(&cbe_spu_info[node].list_mutex);
-+      if (ctx->state == SPU_STATE_RUNNABLE) {
-+              node = ctx->spu->node;
-+
-+              /*
-+               * Take list_mutex to sync with find_victim().
-+               */
-+              mutex_lock(&cbe_spu_info[node].list_mutex);
-+              __spu_update_sched_info(ctx);
-+              mutex_unlock(&cbe_spu_info[node].list_mutex);
-+      } else {
-+              __spu_update_sched_info(ctx);
-+      }
- }
- static int __node_allowed(struct spu_context *ctx, int node)
-@@ -174,7 +190,7 @@ void do_notify_spus_active(void)
-        * Wake up the active spu_contexts.
-        *
-        * When the awakened processes see their "notify_active" flag is set,
--       * they will call spu_switch_notify();
-+       * they will call spu_switch_notify().
-        */
-       for_each_online_node(node) {
-               struct spu *spu;
-@@ -221,7 +237,6 @@ static void spu_bind_context(struct spu 
-       spu->wbox_callback = spufs_wbox_callback;
-       spu->stop_callback = spufs_stop_callback;
-       spu->mfc_callback = spufs_mfc_callback;
--      spu->dma_callback = spufs_dma_callback;
-       mb();
-       spu_unmap_mappings(ctx);
-       spu_restore(&ctx->csa, spu);
-@@ -409,7 +424,6 @@ static void spu_unbind_context(struct sp
-       spu->wbox_callback = NULL;
-       spu->stop_callback = NULL;
-       spu->mfc_callback = NULL;
--      spu->dma_callback = NULL;
-       spu_associate_mm(spu, NULL);
-       spu->pid = 0;
-       spu->tgid = 0;
-@@ -454,6 +468,13 @@ static void __spu_add_to_rq(struct spu_c
-       }
- }
-+static void spu_add_to_rq(struct spu_context *ctx)
-+{
-+      spin_lock(&spu_prio->runq_lock);
-+      __spu_add_to_rq(ctx);
-+      spin_unlock(&spu_prio->runq_lock);
-+}
-+
- static void __spu_del_from_rq(struct spu_context *ctx)
- {
-       int prio = ctx->prio;
-@@ -468,10 +489,24 @@ static void __spu_del_from_rq(struct spu
-       }
- }
-+void spu_del_from_rq(struct spu_context *ctx)
-+{
-+      spin_lock(&spu_prio->runq_lock);
-+      __spu_del_from_rq(ctx);
-+      spin_unlock(&spu_prio->runq_lock);
-+}
-+
- static void spu_prio_wait(struct spu_context *ctx)
- {
-       DEFINE_WAIT(wait);
-+      /*
-+       * The caller must explicitly wait for a context to be loaded
-+       * if the nosched flag is set.  If NOSCHED is not set, the caller
-+       * queues the context and waits for an spu event or error.
-+       */
-+      BUG_ON(!(ctx->flags & SPU_CREATE_NOSCHED));
-+
-       spin_lock(&spu_prio->runq_lock);
-       prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE);
-       if (!signal_pending(current)) {
-@@ -555,7 +590,7 @@ static struct spu *find_victim(struct sp
-       /*
-        * Look for a possible preemption candidate on the local node first.
-        * If there is no candidate look at the other nodes.  This isn't
--       * exactly fair, but so far the whole spu schedule tries to keep
-+       * exactly fair, but so far the whole spu scheduler tries to keep
-        * a strong node affinity.  We might want to fine-tune this in
-        * the future.
-        */
-@@ -571,6 +606,7 @@ static struct spu *find_victim(struct sp
-                       struct spu_context *tmp = spu->ctx;
-                       if (tmp && tmp->prio > ctx->prio &&
-+                          !(tmp->flags & SPU_CREATE_NOSCHED) &&
-                           (!victim || tmp->prio > victim->prio))
-                               victim = spu->ctx;
-               }
-@@ -582,6 +618,10 @@ static struct spu *find_victim(struct sp
-                        * higher priority contexts before lower priority
-                        * ones, so this is safe until we introduce
-                        * priority inheritance schemes.
-+                       *
-+                       * XXX if the highest priority context is locked,
-+                       * this can loop a long time.  Might be better to
-+                       * look at another context or give up after X retries.
-                        */
-                       if (!mutex_trylock(&victim->state_mutex)) {
-                               victim = NULL;
-@@ -589,10 +629,10 @@ static struct spu *find_victim(struct sp
-                       }
-                       spu = victim->spu;
--                      if (!spu) {
-+                      if (!spu || victim->prio <= ctx->prio) {
-                               /*
-                                * This race can happen because we've dropped
--                               * the active list mutex.  No a problem, just
-+                               * the active list mutex.  Not a problem, just
-                                * restart the search.
-                                */
-                               mutex_unlock(&victim->state_mutex);
-@@ -607,13 +647,10 @@ static struct spu *find_victim(struct sp
-                       victim->stats.invol_ctx_switch++;
-                       spu->stats.invol_ctx_switch++;
-+                      spu_add_to_rq(victim);
-+
-                       mutex_unlock(&victim->state_mutex);
--                      /*
--                       * We need to break out of the wait loop in spu_run
--                       * manually to ensure this context gets put on the
--                       * runqueue again ASAP.
--                       */
--                      wake_up(&victim->stop_wq);
-+
-                       return spu;
-               }
-       }
-@@ -621,6 +658,50 @@ static struct spu *find_victim(struct sp
-       return NULL;
- }
-+static void __spu_schedule(struct spu *spu, struct spu_context *ctx)
-+{
-+      int node = spu->node;
-+      int success = 0;
-+
-+      spu_set_timeslice(ctx);
-+
-+      mutex_lock(&cbe_spu_info[node].list_mutex);
-+      if (spu->ctx == NULL) {
-+              spu_bind_context(spu, ctx);
-+              cbe_spu_info[node].nr_active++;
-+              spu->alloc_state = SPU_USED;
-+              success = 1;
-+      }
-+      mutex_unlock(&cbe_spu_info[node].list_mutex);
-+
-+      if (success)
-+              wake_up_all(&ctx->run_wq);
-+      else
-+              spu_add_to_rq(ctx);
-+}
-+
-+static void spu_schedule(struct spu *spu, struct spu_context *ctx)
-+{
-+      /* not a candidate for interruptible because it's called either
-+         from the scheduler thread or from spu_deactivate */
-+      mutex_lock(&ctx->state_mutex);
-+      __spu_schedule(spu, ctx);
-+      spu_release(ctx);
-+}
-+
-+static void spu_unschedule(struct spu *spu, struct spu_context *ctx)
-+{
-+      int node = spu->node;
-+
-+      mutex_lock(&cbe_spu_info[node].list_mutex);
-+      cbe_spu_info[node].nr_active--;
-+      spu->alloc_state = SPU_FREE;
-+      spu_unbind_context(spu, ctx);
-+      ctx->stats.invol_ctx_switch++;
-+      spu->stats.invol_ctx_switch++;
-+      mutex_unlock(&cbe_spu_info[node].list_mutex);
-+}
-+
- /**
-  * spu_activate - find a free spu for a context and execute it
-  * @ctx:      spu context to schedule
-@@ -632,39 +713,47 @@ static struct spu *find_victim(struct sp
-  */
- int spu_activate(struct spu_context *ctx, unsigned long flags)
- {
--      do {
--              struct spu *spu;
-+      struct spu *spu;
--              /*
--               * If there are multiple threads waiting for a single context
--               * only one actually binds the context while the others will
--               * only be able to acquire the state_mutex once the context
--               * already is in runnable state.
--               */
--              if (ctx->spu)
--                      return 0;
-+      /*
-+       * If there are multiple threads waiting for a single context
-+       * only one actually binds the context while the others will
-+       * only be able to acquire the state_mutex once the context
-+       * already is in runnable state.
-+       */
-+      if (ctx->spu)
-+              return 0;
--              spu = spu_get_idle(ctx);
--              /*
--               * If this is a realtime thread we try to get it running by
--               * preempting a lower priority thread.
--               */
--              if (!spu && rt_prio(ctx->prio))
--                      spu = find_victim(ctx);
--              if (spu) {
--                      int node = spu->node;
-+spu_activate_top:
-+      if (signal_pending(current))
-+              return -ERESTARTSYS;
--                      mutex_lock(&cbe_spu_info[node].list_mutex);
--                      spu_bind_context(spu, ctx);
--                      cbe_spu_info[node].nr_active++;
--                      mutex_unlock(&cbe_spu_info[node].list_mutex);
--                      return 0;
--              }
-+      spu = spu_get_idle(ctx);
-+      /*
-+       * If this is a realtime thread we try to get it running by
-+       * preempting a lower priority thread.
-+       */
-+      if (!spu && rt_prio(ctx->prio))
-+              spu = find_victim(ctx);
-+      if (spu) {
-+              unsigned long runcntl;
-+              runcntl = ctx->ops->runcntl_read(ctx);
-+              __spu_schedule(spu, ctx);
-+              if (runcntl & SPU_RUNCNTL_RUNNABLE)
-+                      spuctx_switch_state(ctx, SPU_UTIL_USER);
-+
-+              return 0;
-+      }
-+
-+      if (ctx->flags & SPU_CREATE_NOSCHED) {
-               spu_prio_wait(ctx);
--      } while (!signal_pending(current));
-+              goto spu_activate_top;
-+      }
-+
-+      spu_add_to_rq(ctx);
--      return -ERESTARTSYS;
-+      return 0;
- }
- /**
-@@ -706,21 +795,19 @@ static int __spu_deactivate(struct spu_c
-       if (spu) {
-               new = grab_runnable_context(max_prio, spu->node);
-               if (new || force) {
--                      int node = spu->node;
--
--                      mutex_lock(&cbe_spu_info[node].list_mutex);
--                      spu_unbind_context(spu, ctx);
--                      spu->alloc_state = SPU_FREE;
--                      cbe_spu_info[node].nr_active--;
--                      mutex_unlock(&cbe_spu_info[node].list_mutex);
--
--                      ctx->stats.vol_ctx_switch++;
--                      spu->stats.vol_ctx_switch++;
--
--                      if (new)
--                              wake_up(&new->stop_wq);
-+                      spu_unschedule(spu, ctx);
-+                      if (new) {
-+                              if (new->flags & SPU_CREATE_NOSCHED)
-+                                      wake_up(&new->stop_wq);
-+                              else {
-+                                      spu_release(ctx);
-+                                      spu_schedule(spu, new);
-+                                      /* this one can't easily be made
-+                                         interruptible */
-+                                      mutex_lock(&ctx->state_mutex);
-+                              }
-+                      }
-               }
--
-       }
-       return new != NULL;
-@@ -757,43 +844,38 @@ void spu_yield(struct spu_context *ctx)
- static noinline void spusched_tick(struct spu_context *ctx)
- {
-+      struct spu_context *new = NULL;
-+      struct spu *spu = NULL;
-+      u32 status;
-+
-+      if (spu_acquire(ctx))
-+              BUG();  /* a kernel thread never has signals pending */
-+
-+      if (ctx->state != SPU_STATE_RUNNABLE)
-+              goto out;
-+      if (spu_stopped(ctx, &status))
-+              goto out;
-       if (ctx->flags & SPU_CREATE_NOSCHED)
--              return;
-+              goto out;
-       if (ctx->policy == SCHED_FIFO)
--              return;
-+              goto out;
-       if (--ctx->time_slice)
--              return;
--
--      /*
--       * Unfortunately list_mutex ranks outside of state_mutex, so
--       * we have to trylock here.  If we fail give the context another
--       * tick and try again.
--       */
--      if (mutex_trylock(&ctx->state_mutex)) {
--              struct spu *spu = ctx->spu;
--              struct spu_context *new;
-+              goto out;
--              new = grab_runnable_context(ctx->prio + 1, spu->node);
--              if (new) {
--                      spu_unbind_context(spu, ctx);
--                      ctx->stats.invol_ctx_switch++;
--                      spu->stats.invol_ctx_switch++;
--                      spu->alloc_state = SPU_FREE;
--                      cbe_spu_info[spu->node].nr_active--;
--                      wake_up(&new->stop_wq);
--                      /*
--                       * We need to break out of the wait loop in
--                       * spu_run manually to ensure this context
--                       * gets put on the runqueue again ASAP.
--                       */
--                      wake_up(&ctx->stop_wq);
--              }
--              spu_set_timeslice(ctx);
--              mutex_unlock(&ctx->state_mutex);
-+      spu = ctx->spu;
-+      new = grab_runnable_context(ctx->prio + 1, spu->node);
-+      if (new) {
-+              spu_unschedule(spu, ctx);
-+              spu_add_to_rq(ctx);
-       } else {
-               ctx->time_slice++;
-       }
-+out:
-+      spu_release(ctx);
-+
-+      if (new)
-+              spu_schedule(spu, new);
- }
- /**
-@@ -817,35 +899,31 @@ static unsigned long count_active_contex
- }
- /**
-- * spu_calc_load - given tick count, update the avenrun load estimates.
-- * @tick:     tick count
-+ * spu_calc_load - update the avenrun load estimates.
-  *
-  * No locking against reading these values from userspace, as for
-  * the CPU loadavg code.
-  */
--static void spu_calc_load(unsigned long ticks)
-+static void spu_calc_load(void)
- {
-       unsigned long active_tasks; /* fixed-point */
--      static int count = LOAD_FREQ;
--      count -= ticks;
--
--      if (unlikely(count < 0)) {
--              active_tasks = count_active_contexts() * FIXED_1;
--              do {
--                      CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
--                      CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
--                      CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
--                      count += LOAD_FREQ;
--              } while (count < 0);
--      }
-+      active_tasks = count_active_contexts() * FIXED_1;
-+      CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
-+      CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
-+      CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
- }
- static void spusched_wake(unsigned long data)
- {
-       mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK);
-       wake_up_process(spusched_task);
--      spu_calc_load(SPUSCHED_TICK);
-+}
-+
-+static void spuloadavg_wake(unsigned long data)
-+{
-+      mod_timer(&spuloadavg_timer, jiffies + LOAD_FREQ);
-+      spu_calc_load();
- }
- static int spusched_thread(void *unused)
-@@ -857,17 +935,58 @@ static int spusched_thread(void *unused)
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule();
-               for (node = 0; node < MAX_NUMNODES; node++) {
--                      mutex_lock(&cbe_spu_info[node].list_mutex);
--                      list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list)
--                              if (spu->ctx)
--                                      spusched_tick(spu->ctx);
--                      mutex_unlock(&cbe_spu_info[node].list_mutex);
-+                      struct mutex *mtx = &cbe_spu_info[node].list_mutex;
-+
-+                      mutex_lock(mtx);
-+                      list_for_each_entry(spu, &cbe_spu_info[node].spus,
-+                                      cbe_list) {
-+                              struct spu_context *ctx = spu->ctx;
-+
-+                              if (ctx) {
-+                                      mutex_unlock(mtx);
-+                                      spusched_tick(ctx);
-+                                      mutex_lock(mtx);
-+                              }
-+                      }
-+                      mutex_unlock(mtx);
-               }
-       }
-       return 0;
- }
-+void spuctx_switch_state(struct spu_context *ctx,
-+              enum spu_utilization_state new_state)
-+{
-+      unsigned long long curtime;
-+      signed long long delta;
-+      struct timespec ts;
-+      struct spu *spu;
-+      enum spu_utilization_state old_state;
-+
-+      ktime_get_ts(&ts);
-+      curtime = timespec_to_ns(&ts);
-+      delta = curtime - ctx->stats.tstamp;
-+
-+      WARN_ON(!mutex_is_locked(&ctx->state_mutex));
-+      WARN_ON(delta < 0);
-+
-+      spu = ctx->spu;
-+      old_state = ctx->stats.util_state;
-+      ctx->stats.util_state = new_state;
-+      ctx->stats.tstamp = curtime;
-+
-+      /*
-+       * Update the physical SPU utilization statistics.
-+       */
-+      if (spu) {
-+              ctx->stats.times[old_state] += delta;
-+              spu->stats.times[old_state] += delta;
-+              spu->stats.util_state = new_state;
-+              spu->stats.tstamp = curtime;
-+      }
-+}
-+
- #define LOAD_INT(x) ((x) >> FSHIFT)
- #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-@@ -881,7 +1000,7 @@ static int show_spu_loadavg(struct seq_f
-       /*
-        * Note that last_pid doesn't really make much sense for the
--       * SPU loadavg (it even seems very odd on the CPU side..),
-+       * SPU loadavg (it even seems very odd on the CPU side...),
-        * but we include it here to have a 100% compatible interface.
-        */
-       seq_printf(s, "%d.%02d %d.%02d %d.%02d %ld/%d %d\n",
-@@ -922,6 +1041,7 @@ int __init spu_sched_init(void)
-       spin_lock_init(&spu_prio->runq_lock);
-       setup_timer(&spusched_timer, spusched_wake, 0);
-+      setup_timer(&spuloadavg_timer, spuloadavg_wake, 0);
-       spusched_task = kthread_run(spusched_thread, NULL, "spusched");
-       if (IS_ERR(spusched_task)) {
-@@ -929,6 +1049,8 @@ int __init spu_sched_init(void)
-               goto out_free_spu_prio;
-       }
-+      mod_timer(&spuloadavg_timer, 0);
-+
-       entry = create_proc_entry("spu_loadavg", 0, NULL);
-       if (!entry)
-               goto out_stop_kthread;
-@@ -954,6 +1076,7 @@ void spu_sched_exit(void)
-       remove_proc_entry("spu_loadavg", NULL);
-       del_timer_sync(&spusched_timer);
-+      del_timer_sync(&spuloadavg_timer);
-       kthread_stop(spusched_task);
-       for (node = 0; node < MAX_NUMNODES; node++) {
---- a/arch/powerpc/platforms/cell/spufs/spufs.h
-+++ b/arch/powerpc/platforms/cell/spufs/spufs.h
-@@ -71,6 +71,7 @@ struct spu_context {
-       wait_queue_head_t wbox_wq;
-       wait_queue_head_t stop_wq;
-       wait_queue_head_t mfc_wq;
-+      wait_queue_head_t run_wq;
-       struct fasync_struct *ibox_fasync;
-       struct fasync_struct *wbox_fasync;
-       struct fasync_struct *mfc_fasync;
-@@ -168,8 +169,10 @@ struct spu_context_ops {
-       void (*npc_write) (struct spu_context * ctx, u32 data);
-        u32(*status_read) (struct spu_context * ctx);
-       char*(*get_ls) (struct spu_context * ctx);
-+      void (*privcntl_write) (struct spu_context *ctx, u64 data);
-        u32 (*runcntl_read) (struct spu_context * ctx);
-       void (*runcntl_write) (struct spu_context * ctx, u32 data);
-+      void (*runcntl_stop) (struct spu_context * ctx);
-       void (*master_start) (struct spu_context * ctx);
-       void (*master_stop) (struct spu_context * ctx);
-       int (*set_mfc_query)(struct spu_context * ctx, u32 mask, u32 mode);
-@@ -219,15 +222,16 @@ void spu_gang_add_ctx(struct spu_gang *g
- /* fault handling */
- int spufs_handle_class1(struct spu_context *ctx);
-+int spufs_handle_class0(struct spu_context *ctx);
- /* affinity */
- struct spu *affinity_check(struct spu_context *ctx);
- /* context management */
- extern atomic_t nr_spu_contexts;
--static inline void spu_acquire(struct spu_context *ctx)
-+static inline int __must_check spu_acquire(struct spu_context *ctx)
- {
--      mutex_lock(&ctx->state_mutex);
-+      return mutex_lock_interruptible(&ctx->state_mutex);
- }
- static inline void spu_release(struct spu_context *ctx)
-@@ -242,10 +246,11 @@ int put_spu_context(struct spu_context *
- void spu_unmap_mappings(struct spu_context *ctx);
- void spu_forget(struct spu_context *ctx);
--int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
--void spu_acquire_saved(struct spu_context *ctx);
-+int __must_check spu_acquire_saved(struct spu_context *ctx);
- void spu_release_saved(struct spu_context *ctx);
-+int spu_stopped(struct spu_context *ctx, u32 * stat);
-+void spu_del_from_rq(struct spu_context *ctx);
- int spu_activate(struct spu_context *ctx, unsigned long flags);
- void spu_deactivate(struct spu_context *ctx);
- void spu_yield(struct spu_context *ctx);
-@@ -279,7 +284,9 @@ extern char *isolated_loader;
-               }                                                       \
-               spu_release(ctx);                                       \
-               schedule();                                             \
--              spu_acquire(ctx);                                       \
-+              __ret = spu_acquire(ctx);                               \
-+              if (__ret)                                              \
-+                      break;                                          \
-       }                                                               \
-       finish_wait(&(wq), &__wait);                                    \
-       __ret;                                                          \
-@@ -306,41 +313,16 @@ struct spufs_coredump_reader {
- extern struct spufs_coredump_reader spufs_coredump_read[];
- extern int spufs_coredump_num_notes;
--/*
-- * This function is a little bit too large for an inline, but
-- * as fault.c is built into the kernel we can't move it out of
-- * line.
-- */
--static inline void spuctx_switch_state(struct spu_context *ctx,
--              enum spu_utilization_state new_state)
--{
--      unsigned long long curtime;
--      signed long long delta;
--      struct timespec ts;
--      struct spu *spu;
--      enum spu_utilization_state old_state;
--
--      ktime_get_ts(&ts);
--      curtime = timespec_to_ns(&ts);
--      delta = curtime - ctx->stats.tstamp;
--
--      WARN_ON(!mutex_is_locked(&ctx->state_mutex));
--      WARN_ON(delta < 0);
--
--      spu = ctx->spu;
--      old_state = ctx->stats.util_state;
--      ctx->stats.util_state = new_state;
--      ctx->stats.tstamp = curtime;
--
--      /*
--       * Update the physical SPU utilization statistics.
--       */
--      if (spu) {
--              ctx->stats.times[old_state] += delta;
--              spu->stats.times[old_state] += delta;
--              spu->stats.util_state = new_state;
--              spu->stats.tstamp = curtime;
--      }
--}
-+extern int spu_init_csa(struct spu_state *csa);
-+extern void spu_fini_csa(struct spu_state *csa);
-+extern int spu_save(struct spu_state *prev, struct spu *spu);
-+extern int spu_restore(struct spu_state *new, struct spu *spu);
-+extern int spu_switch(struct spu_state *prev, struct spu_state *new,
-+                    struct spu *spu);
-+extern int spu_alloc_lscsa(struct spu_state *csa);
-+extern void spu_free_lscsa(struct spu_state *csa);
-+
-+extern void spuctx_switch_state(struct spu_context *ctx,
-+              enum spu_utilization_state new_state);
- #endif
---- a/arch/powerpc/platforms/cell/spufs/switch.c
-+++ b/arch/powerpc/platforms/cell/spufs/switch.c
-@@ -48,6 +48,8 @@
- #include <asm/spu_csa.h>
- #include <asm/mmu_context.h>
-+#include "spufs.h"
-+
- #include "spu_save_dump.h"
- #include "spu_restore_dump.h"
-@@ -691,35 +693,9 @@ static inline void resume_mfc_queue(stru
-       out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE);
- }
--static inline void get_kernel_slb(u64 ea, u64 slb[2])
-+static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu,
-+              unsigned int *code, int code_size)
- {
--      u64 llp;
--
--      if (REGION_ID(ea) == KERNEL_REGION_ID)
--              llp = mmu_psize_defs[mmu_linear_psize].sllp;
--      else
--              llp = mmu_psize_defs[mmu_virtual_psize].sllp;
--      slb[0] = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
--              SLB_VSID_KERNEL | llp;
--      slb[1] = (ea & ESID_MASK) | SLB_ESID_V;
--}
--
--static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe)
--{
--      struct spu_priv2 __iomem *priv2 = spu->priv2;
--
--      out_be64(&priv2->slb_index_W, slbe);
--      eieio();
--      out_be64(&priv2->slb_vsid_RW, slb[0]);
--      out_be64(&priv2->slb_esid_RW, slb[1]);
--      eieio();
--}
--
--static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu)
--{
--      u64 code_slb[2];
--      u64 lscsa_slb[2];
--
-       /* Save, Step 47:
-        * Restore, Step 30.
-        *     If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All
-@@ -735,11 +711,7 @@ static inline void setup_mfc_slbs(struct
-        *     translation is desired by OS environment).
-        */
-       spu_invalidate_slbs(spu);
--      get_kernel_slb((unsigned long)&spu_save_code[0], code_slb);
--      get_kernel_slb((unsigned long)csa->lscsa, lscsa_slb);
--      load_mfc_slb(spu, code_slb, 0);
--      if ((lscsa_slb[0] != code_slb[0]) || (lscsa_slb[1] != code_slb[1]))
--              load_mfc_slb(spu, lscsa_slb, 1);
-+      spu_setup_kernel_slbs(spu, csa->lscsa, code, code_size);
- }
- static inline void set_switch_active(struct spu_state *csa, struct spu *spu)
-@@ -768,9 +740,9 @@ static inline void enable_interrupts(str
-        *     (translation) interrupts.
-        */
-       spin_lock_irq(&spu->register_lock);
--      spu_int_stat_clear(spu, 0, ~0ul);
--      spu_int_stat_clear(spu, 1, ~0ul);
--      spu_int_stat_clear(spu, 2, ~0ul);
-+      spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+      spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
-+      spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
-       spu_int_mask_set(spu, 0, 0ul);
-       spu_int_mask_set(spu, 1, class1_mask);
-       spu_int_mask_set(spu, 2, 0ul);
-@@ -927,8 +899,8 @@ static inline void wait_tag_complete(str
-       POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask);
-       local_irq_save(flags);
--      spu_int_stat_clear(spu, 0, ~(0ul));
--      spu_int_stat_clear(spu, 2, ~(0ul));
-+      spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+      spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
-       local_irq_restore(flags);
- }
-@@ -946,8 +918,8 @@ static inline void wait_spu_stopped(stru
-       POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING);
-       local_irq_save(flags);
--      spu_int_stat_clear(spu, 0, ~(0ul));
--      spu_int_stat_clear(spu, 2, ~(0ul));
-+      spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+      spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
-       local_irq_restore(flags);
- }
-@@ -1423,9 +1395,9 @@ static inline void clear_interrupts(stru
-       spu_int_mask_set(spu, 0, 0ul);
-       spu_int_mask_set(spu, 1, 0ul);
-       spu_int_mask_set(spu, 2, 0ul);
--      spu_int_stat_clear(spu, 0, ~0ul);
--      spu_int_stat_clear(spu, 1, ~0ul);
--      spu_int_stat_clear(spu, 2, ~0ul);
-+      spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+      spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
-+      spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
-       spin_unlock_irq(&spu->register_lock);
- }
-@@ -1866,7 +1838,8 @@ static void save_lscsa(struct spu_state 
-        */
-       resume_mfc_queue(prev, spu);    /* Step 46. */
--      setup_mfc_slbs(prev, spu);      /* Step 47. */
-+      /* Step 47. */
-+      setup_mfc_slbs(prev, spu, spu_save_code, sizeof(spu_save_code));
-       set_switch_active(prev, spu);   /* Step 48. */
-       enable_interrupts(prev, spu);   /* Step 49. */
-       save_ls_16kb(prev, spu);        /* Step 50. */
-@@ -1971,7 +1944,8 @@ static void restore_lscsa(struct spu_sta
-       setup_spu_status_part1(next, spu);      /* Step 27. */
-       setup_spu_status_part2(next, spu);      /* Step 28. */
-       restore_mfc_rag(next, spu);             /* Step 29. */
--      setup_mfc_slbs(next, spu);              /* Step 30. */
-+      /* Step 30. */
-+      setup_mfc_slbs(next, spu, spu_restore_code, sizeof(spu_restore_code));
-       set_spu_npc(next, spu);                 /* Step 31. */
-       set_signot1(next, spu);                 /* Step 32. */
-       set_signot2(next, spu);                 /* Step 33. */
-@@ -2103,10 +2077,6 @@ int spu_save(struct spu_state *prev, str
-       int rc;
-       acquire_spu_lock(spu);          /* Step 1.     */
--      prev->dar = spu->dar;
--      prev->dsisr = spu->dsisr;
--      spu->dar = 0;
--      spu->dsisr = 0;
-       rc = __do_spu_save(prev, spu);  /* Steps 2-53. */
-       release_spu_lock(spu);
-       if (rc != 0 && rc != 2 && rc != 6) {
-@@ -2133,9 +2103,6 @@ int spu_restore(struct spu_state *new, s
-       acquire_spu_lock(spu);
-       harvest(NULL, spu);
-       spu->slb_replace = 0;
--      new->dar = 0;
--      new->dsisr = 0;
--      spu->class_0_pending = 0;
-       rc = __do_spu_restore(new, spu);
-       release_spu_lock(spu);
-       if (rc) {
-@@ -2215,10 +2182,8 @@ int spu_init_csa(struct spu_state *csa)
-       return 0;
- }
--EXPORT_SYMBOL_GPL(spu_init_csa);
- void spu_fini_csa(struct spu_state *csa)
- {
-       spu_free_lscsa(csa);
- }
--EXPORT_SYMBOL_GPL(spu_fini_csa);
---- a/arch/powerpc/platforms/celleb/Kconfig
-+++ b/arch/powerpc/platforms/celleb/Kconfig
-@@ -2,6 +2,8 @@ config PPC_CELLEB
-       bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
-       depends on PPC_MULTIPLATFORM && PPC64
-       select PPC_CELL
-+      select PPC_CELL_NATIVE
-+      select PPC_RTAS
-       select PPC_INDIRECT_IO
-       select PPC_OF_PLATFORM_PCI
-       select HAS_TXX9_SERIAL
---- a/arch/powerpc/platforms/celleb/io-workarounds.c
-+++ b/arch/powerpc/platforms/celleb/io-workarounds.c
-@@ -22,6 +22,7 @@
- #undef DEBUG
-+#include <linux/of.h>
- #include <linux/of_device.h>
- #include <linux/irq.h>
-@@ -222,7 +223,7 @@ void __init celleb_pci_add_one(struct pc
-                              void (*dummy_read)(struct pci_controller *))
- {
-       struct celleb_pci_bus *bus = &celleb_pci_busses[celleb_pci_count];
--      struct device_node *np = phb->arch_data;
-+      struct device_node *np = phb->dn;
-       if (celleb_pci_count >= MAX_CELLEB_PCI_BUS) {
-               printk(KERN_ERR "Too many pci bridges, workarounds"
-@@ -256,13 +257,13 @@ int __init celleb_pci_workaround_init(vo
-       celleb_dummy_page_va = kmalloc(PAGE_SIZE, GFP_KERNEL);
-       if (!celleb_dummy_page_va) {
--              printk(KERN_ERR "Celleb: dummy read disabled."
-+              printk(KERN_ERR "Celleb: dummy read disabled. "
-                       "Alloc celleb_dummy_page_va failed\n");
-               return 1;
-       }
-       list_for_each_entry(phb, &hose_list, list_node) {
--              node = phb->arch_data;
-+              node = phb->dn;
-               match = of_match_node(celleb_pci_workaround_match, node);
-               if (match) {
---- a/arch/powerpc/platforms/celleb/iommu.c
-+++ b/arch/powerpc/platforms/celleb/iommu.c
-@@ -22,8 +22,9 @@
- #include <linux/init.h>
- #include <linux/dma-mapping.h>
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
--#include <asm/of_platform.h>
-+#include <asm/machdep.h>
- #include "beat_wrapper.h"
-@@ -51,6 +52,8 @@ static int __init find_dma_window(u64 *i
-       return 0;
- }
-+static unsigned long celleb_dma_direct_offset;
-+
- static void __init celleb_init_direct_mapping(void)
- {
-       u64 lpar_addr, io_addr;
-@@ -68,7 +71,18 @@ static void __init celleb_init_direct_ma
-                                    ioid, DMA_FLAGS);
-       }
--      dma_direct_offset = dma_base;
-+      celleb_dma_direct_offset = dma_base;
-+}
-+
-+static void celleb_dma_dev_setup(struct device *dev)
-+{
-+      dev->archdata.dma_ops = get_pci_dma_ops();
-+      dev->archdata.dma_data = (void *)celleb_dma_direct_offset;
-+}
-+
-+static void celleb_pci_dma_dev_setup(struct pci_dev *pdev)
-+{
-+      celleb_dma_dev_setup(&pdev->dev);
- }
- static int celleb_of_bus_notify(struct notifier_block *nb,
-@@ -80,7 +94,7 @@ static int celleb_of_bus_notify(struct n
-       if (action != BUS_NOTIFY_ADD_DEVICE)
-               return 0;
--      dev->archdata.dma_ops = get_pci_dma_ops();
-+      celleb_dma_dev_setup(dev);
-       return 0;
- }
-@@ -91,14 +105,12 @@ static struct notifier_block celleb_of_b
- static int __init celleb_init_iommu(void)
- {
--      if (!machine_is(celleb))
--              return -ENODEV;
--
-       celleb_init_direct_mapping();
-       set_pci_dma_ops(&dma_direct_ops);
-+      ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup;
-       bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
-       return 0;
- }
--arch_initcall(celleb_init_iommu);
-+machine_arch_initcall(celleb_beat, celleb_init_iommu);
---- a/arch/powerpc/platforms/celleb/pci.c
-+++ b/arch/powerpc/platforms/celleb/pci.c
-@@ -31,6 +31,7 @@
- #include <linux/init.h>
- #include <linux/bootmem.h>
- #include <linux/pci_regs.h>
-+#include <linux/of.h>
- #include <linux/of_device.h>
- #include <asm/io.h>
-@@ -138,8 +139,6 @@ static void celleb_config_read_fake(unsi
-               *val = celleb_fake_config_readl(p);
-               break;
-       }
--
--      return;
- }
- static void celleb_config_write_fake(unsigned char *config, int where,
-@@ -158,7 +157,6 @@ static void celleb_config_write_fake(uns
-               celleb_fake_config_writel(val, p);
-               break;
-       }
--      return;
- }
- static int celleb_fake_pci_read_config(struct pci_bus *bus,
-@@ -351,6 +349,10 @@ static int __init celleb_setup_fake_pci_
-       wi1 = of_get_property(node, "vendor-id", NULL);
-       wi2 = of_get_property(node, "class-code", NULL);
-       wi3 = of_get_property(node, "revision-id", NULL);
-+      if (!wi0 || !wi1 || !wi2 || !wi3) {
-+              printk(KERN_ERR "PCI: Missing device tree properties.\n");
-+              goto error;
-+      }
-       celleb_config_write_fake(*config, PCI_DEVICE_ID, 2, wi0[0] & 0xffff);
-       celleb_config_write_fake(*config, PCI_VENDOR_ID, 2, wi1[0] & 0xffff);
-@@ -372,6 +374,10 @@ static int __init celleb_setup_fake_pci_
-       celleb_setup_pci_base_addrs(hose, devno, fn, num_base_addr);
-       li = of_get_property(node, "interrupts", &rlen);
-+      if (!li) {
-+              printk(KERN_ERR "PCI: interrupts not found.\n");
-+              goto error;
-+      }
-       val = li[0];
-       celleb_config_write_fake(*config, PCI_INTERRUPT_PIN, 1, 1);
-       celleb_config_write_fake(*config, PCI_INTERRUPT_LINE, 1, val);
-@@ -475,7 +481,7 @@ static struct of_device_id celleb_phb_ma
- int __init celleb_setup_phb(struct pci_controller *phb)
- {
--      struct device_node *dev = phb->arch_data;
-+      struct device_node *dev = phb->dn;
-       const struct of_device_id *match;
-       int (*setup_func)(struct device_node *, struct pci_controller *);
---- a/arch/powerpc/platforms/celleb/scc_epci.c
-+++ b/arch/powerpc/platforms/celleb/scc_epci.c
-@@ -95,7 +95,7 @@ void __init epci_workaround_init(struct 
-       private->dummy_page_da = dma_map_single(hose->parent,
-               celleb_dummy_page_va, PAGE_SIZE, DMA_FROM_DEVICE);
-       if (private->dummy_page_da == DMA_ERROR_CODE) {
--              printk(KERN_ERR "EPCI: dummy read disabled."
-+              printk(KERN_ERR "EPCI: dummy read disabled. "
-                      "Map dummy page failed.\n");
-               return;
-       }
---- a/arch/powerpc/platforms/celleb/scc_uhc.c
-+++ b/arch/powerpc/platforms/celleb/scc_uhc.c
-@@ -47,7 +47,8 @@ static void enable_scc_uhc(struct pci_de
-       u32 val = 0;
-       int i;
--      if (!machine_is(celleb))
-+      if (!machine_is(celleb_beat) &&
-+          !machine_is(celleb_native))
-               return;
-       uhc_base = ioremap(pci_resource_start(dev, 0),
---- a/arch/powerpc/platforms/celleb/setup.c
-+++ b/arch/powerpc/platforms/celleb/setup.c
-@@ -40,6 +40,7 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/console.h>
-+#include <linux/of_platform.h>
- #include <asm/mmu.h>
- #include <asm/processor.h>
-@@ -52,12 +53,16 @@
- #include <asm/time.h>
- #include <asm/spu_priv1.h>
- #include <asm/firmware.h>
--#include <asm/of_platform.h>
-+#include <asm/rtas.h>
-+#include <asm/cell-regs.h>
- #include "interrupt.h"
- #include "beat_wrapper.h"
- #include "beat.h"
- #include "pci.h"
-+#include "../cell/interrupt.h"
-+#include "../cell/pervasive.h"
-+#include "../cell/ras.h"
- static char celleb_machine_type[128] = "Celleb";
-@@ -88,61 +93,122 @@ static void celleb_progress(char *s, uns
-       printk("*** %04x : %s\n", hex, s ? s : "");
- }
--static void __init celleb_setup_arch(void)
-+static void __init celleb_setup_arch_common(void)
-+{
-+      /* init to some ~sane value until calibrate_delay() runs */
-+      loops_per_jiffy = 50000000;
-+
-+#ifdef CONFIG_DUMMY_CONSOLE
-+      conswitchp = &dummy_con;
-+#endif
-+}
-+
-+static struct of_device_id celleb_bus_ids[] __initdata = {
-+      { .type = "scc", },
-+      { .type = "ioif", },    /* old style */
-+      {},
-+};
-+
-+static int __init celleb_publish_devices(void)
-+{
-+      /* Publish OF platform devices for southbridge IOs */
-+      of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
-+
-+      celleb_pci_workaround_init();
-+
-+      return 0;
-+}
-+machine_device_initcall(celleb_beat, celleb_publish_devices);
-+machine_device_initcall(celleb_native, celleb_publish_devices);
-+
-+
-+/*
-+ * functions for Celleb-Beat
-+ */
-+static void __init celleb_setup_arch_beat(void)
- {
- #ifdef CONFIG_SPU_BASE
--      spu_priv1_ops = &spu_priv1_beat_ops;
--      spu_management_ops = &spu_management_of_ops;
-+      spu_priv1_ops           = &spu_priv1_beat_ops;
-+      spu_management_ops      = &spu_management_of_ops;
- #endif
- #ifdef CONFIG_SMP
-       smp_init_celleb();
- #endif
--      /* init to some ~sane value until calibrate_delay() runs */
--      loops_per_jiffy = 50000000;
--
--#ifdef CONFIG_DUMMY_CONSOLE
--      conswitchp = &dummy_con;
--#endif
-+      celleb_setup_arch_common();
- }
--static int __init celleb_probe(void)
-+static int __init celleb_probe_beat(void)
- {
-       unsigned long root = of_get_flat_dt_root();
-       if (!of_flat_dt_is_compatible(root, "Beat"))
-               return 0;
--      powerpc_firmware_features |= FW_FEATURE_CELLEB_POSSIBLE;
-+      powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS
-+              | FW_FEATURE_BEAT | FW_FEATURE_LPAR;
-       hpte_init_beat_v3();
-+
-       return 1;
- }
--static struct of_device_id celleb_bus_ids[] __initdata = {
--      { .type = "scc", },
--      { .type = "ioif", },    /* old style */
--      {},
--};
--static int __init celleb_publish_devices(void)
-+/*
-+ * functions for Celleb-native
-+ */
-+static void __init celleb_init_IRQ_native(void)
- {
--      if (!machine_is(celleb))
--              return 0;
-+      iic_init_IRQ();
-+      spider_init_IRQ();
-+}
--      /* Publish OF platform devices for southbridge IOs */
--      of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
-+static void __init celleb_setup_arch_native(void)
-+{
-+#ifdef CONFIG_SPU_BASE
-+      spu_priv1_ops           = &spu_priv1_mmio_ops;
-+      spu_management_ops      = &spu_management_of_ops;
-+#endif
--      celleb_pci_workaround_init();
-+      cbe_regs_init();
--      return 0;
-+#ifdef CONFIG_CBE_RAS
-+      cbe_ras_init();
-+#endif
-+
-+#ifdef CONFIG_SMP
-+      smp_init_cell();
-+#endif
-+
-+      cbe_pervasive_init();
-+
-+      /* XXX: nvram initialization should be added */
-+
-+      celleb_setup_arch_common();
-+}
-+
-+static int __init celleb_probe_native(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      if (of_flat_dt_is_compatible(root, "Beat") ||
-+          !of_flat_dt_is_compatible(root, "TOSHIBA,Celleb"))
-+              return 0;
-+
-+      powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS;
-+      hpte_init_native();
-+
-+      return 1;
- }
--device_initcall(celleb_publish_devices);
--define_machine(celleb) {
--      .name                   = "Cell Reference Set",
--      .probe                  = celleb_probe,
--      .setup_arch             = celleb_setup_arch,
-+
-+/*
-+ * machine definitions
-+ */
-+define_machine(celleb_beat) {
-+      .name                   = "Cell Reference Set (Beat)",
-+      .probe                  = celleb_probe_beat,
-+      .setup_arch             = celleb_setup_arch_beat,
-       .show_cpuinfo           = celleb_show_cpuinfo,
-       .restart                = beat_restart,
-       .power_off              = beat_power_off,
-@@ -167,3 +233,26 @@ define_machine(celleb) {
-       .machine_crash_shutdown = default_machine_crash_shutdown,
- #endif
- };
-+
-+define_machine(celleb_native) {
-+      .name                   = "Cell Reference Set (native)",
-+      .probe                  = celleb_probe_native,
-+      .setup_arch             = celleb_setup_arch_native,
-+      .show_cpuinfo           = celleb_show_cpuinfo,
-+      .restart                = rtas_restart,
-+      .power_off              = rtas_power_off,
-+      .halt                   = rtas_halt,
-+      .get_boot_time          = rtas_get_boot_time,
-+      .get_rtc_time           = rtas_get_rtc_time,
-+      .set_rtc_time           = rtas_set_rtc_time,
-+      .calibrate_decr         = generic_calibrate_decr,
-+      .progress               = celleb_progress,
-+      .pci_probe_mode         = celleb_pci_probe_mode,
-+      .pci_setup_phb          = celleb_setup_phb,
-+      .init_IRQ               = celleb_init_IRQ_native,
-+#ifdef CONFIG_KEXEC
-+      .machine_kexec          = default_machine_kexec,
-+      .machine_kexec_prepare  = default_machine_kexec_prepare,
-+      .machine_crash_shutdown = default_machine_crash_shutdown,
-+#endif
-+};
---- a/arch/powerpc/platforms/chrp/pci.c
-+++ b/arch/powerpc/platforms/chrp/pci.c
-@@ -198,7 +198,7 @@ static void __init setup_peg2(struct pci
-               printk ("RTAS supporting Pegasos OF not found, please upgrade"
-                       " your firmware\n");
-       }
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       /* keep the reference to the root node */
- }
---- a/arch/powerpc/platforms/chrp/setup.c
-+++ b/arch/powerpc/platforms/chrp/setup.c
-@@ -115,7 +115,7 @@ void chrp_show_cpuinfo(struct seq_file *
-       seq_printf(m, "machine\t\t: CHRP %s\n", model);
-       /* longtrail (goldengate) stuff */
--      if (!strncmp(model, "IBM,LongTrail", 13)) {
-+      if (model && !strncmp(model, "IBM,LongTrail", 13)) {
-               /* VLSI VAS96011/12 `Golden Gate 2' */
-               /* Memory banks */
-               sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL)
-@@ -203,15 +203,20 @@ static void __init sio_fixup_irq(const c
- static void __init sio_init(void)
- {
-       struct device_node *root;
-+      const char *model;
--      if ((root = of_find_node_by_path("/")) &&
--          !strncmp(of_get_property(root, "model", NULL),
--                      "IBM,LongTrail", 13)) {
-+      root = of_find_node_by_path("/");
-+      if (!root)
-+              return;
-+
-+      model = of_get_property(root, "model", NULL);
-+      if (model && !strncmp(model, "IBM,LongTrail", 13)) {
-               /* logical device 0 (KBC/Keyboard) */
-               sio_fixup_irq("keyboard", 0, 1, 2);
-               /* select logical device 1 (KBC/Mouse) */
-               sio_fixup_irq("mouse", 1, 12, 2);
-       }
-+
-       of_node_put(root);
- }
-@@ -251,6 +256,57 @@ static void briq_restart(char *cmd)
-       for(;;);
- }
-+/*
-+ * Per default, input/output-device points to the keyboard/screen
-+ * If no card is installed, the built-in serial port is used as a fallback.
-+ * But unfortunately, the firmware does not connect /chosen/{stdin,stdout}
-+ * the the built-in serial node. Instead, a /failsafe node is created.
-+ */
-+static void chrp_init_early(void)
-+{
-+      struct device_node *node;
-+      const char *property;
-+
-+      if (strstr(cmd_line, "console="))
-+              return;
-+      /* find the boot console from /chosen/stdout */
-+      if (!of_chosen)
-+              return;
-+      node = of_find_node_by_path("/");
-+      if (!node)
-+              return;
-+      property = of_get_property(node, "model", NULL);
-+      if (!property)
-+              goto out_put;
-+      if (strcmp(property, "Pegasos2"))
-+              goto out_put;
-+      /* this is a Pegasos2 */
-+      property = of_get_property(of_chosen, "linux,stdout-path", NULL);
-+      if (!property)
-+              goto out_put;
-+      of_node_put(node);
-+      node = of_find_node_by_path(property);
-+      if (!node)
-+              return;
-+      property = of_get_property(node, "device_type", NULL);
-+      if (!property)
-+              goto out_put;
-+      if (strcmp(property, "serial"))
-+              goto out_put;
-+      /*
-+       * The 9pin connector is either /failsafe
-+       * or /pci@80000000/isa@C/serial@i2F8
-+       * The optional graphics card has also type 'serial' in VGA mode.
-+       */
-+      property = of_get_property(node, "name", NULL);
-+      if (!property)
-+              goto out_put;
-+      if (!strcmp(property, "failsafe") || !strcmp(property, "serial"))
-+              add_preferred_console("ttyS", 0, NULL);
-+out_put:
-+      of_node_put(node);
-+}
-+
- void __init chrp_setup_arch(void)
- {
-       struct device_node *root = of_find_node_by_path("/");
-@@ -594,6 +650,7 @@ define_machine(chrp) {
-       .probe                  = chrp_probe,
-       .setup_arch             = chrp_setup_arch,
-       .init                   = chrp_init2,
-+      .init_early             = chrp_init_early,
-       .show_cpuinfo           = chrp_show_cpuinfo,
-       .init_IRQ               = chrp_init_IRQ,
-       .restart                = rtas_restart,
---- a/arch/powerpc/platforms/embedded6xx/Kconfig
-+++ b/arch/powerpc/platforms/embedded6xx/Kconfig
-@@ -9,6 +9,8 @@ config LINKSTATION
-       select FSL_SOC
-       select PPC_UDBG_16550 if SERIAL_8250
-       select DEFAULT_UIMAGE
-+      select MPC10X_OPENPIC
-+      select MPC10X_BRIDGE
-       help
-         Select LINKSTATION if configuring for one of PPC- (MPC8241)
-         based NAS systems from Buffalo Technology. So far only
-@@ -16,6 +18,19 @@ config LINKSTATION
-         Linkstation-I HD-HLAN and HD-HGLAN versions, and PPC-based
-         Terastation systems should be supported too.
-+config STORCENTER
-+      bool "IOMEGA StorCenter"
-+      depends on EMBEDDED6xx
-+      select MPIC
-+      select FSL_SOC
-+      select PPC_UDBG_16550 if SERIAL_8250
-+      select WANT_DEVICE_TREE
-+      select MPC10X_OPENPIC
-+      select MPC10X_BRIDGE
-+      help
-+        Select STORCENTER if configuring for the iomega StorCenter
-+        with an 8241 CPU in it.
-+
- config MPC7448HPC2
-       bool "Freescale MPC7448HPC2(Taiga)"
-       depends on EMBEDDED6xx
-@@ -23,6 +38,7 @@ config MPC7448HPC2
-       select DEFAULT_UIMAGE
-       select PPC_UDBG_16550
-       select WANT_DEVICE_TREE
-+      select TSI108_BRIDGE
-       help
-         Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
-         platform
-@@ -33,6 +49,7 @@ config PPC_HOLLY
-       select TSI108_BRIDGE
-       select PPC_UDBG_16550
-       select WANT_DEVICE_TREE
-+      select TSI108_BRIDGE
-       help
-         Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval
-         Board with TSI108/9 bridge (Hickory/Holly)
-@@ -48,17 +65,13 @@ config PPC_PRPMC2800
- config TSI108_BRIDGE
-       bool
--      depends on MPC7448HPC2 || PPC_HOLLY
-       select PCI
-       select MPIC
-       select MPIC_WEIRD
--      default y
- config MPC10X_BRIDGE
-       bool
--      depends on LINKSTATION
-       select PPC_INDIRECT_PCI
--      default y
- config MV64X60
-       bool
-@@ -67,8 +80,6 @@ config MV64X60
- config MPC10X_OPENPIC
-       bool
--      depends on LINKSTATION
--      default y
- config MPC10X_STORE_GATHERING
-       bool "Enable MPC10x store gathering"
---- a/arch/powerpc/platforms/embedded6xx/Makefile
-+++ b/arch/powerpc/platforms/embedded6xx/Makefile
-@@ -3,5 +3,6 @@
- #
- obj-$(CONFIG_MPC7448HPC2)     += mpc7448_hpc2.o
- obj-$(CONFIG_LINKSTATION)     += linkstation.o ls_uart.o
-+obj-$(CONFIG_STORCENTER)      += storcenter.o
- obj-$(CONFIG_PPC_HOLLY)               += holly.o
- obj-$(CONFIG_PPC_PRPMC2800)   += prpmc2800.o
---- a/arch/powerpc/platforms/embedded6xx/holly.c
-+++ b/arch/powerpc/platforms/embedded6xx/holly.c
-@@ -20,12 +20,12 @@
- #include <linux/console.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
--#include <linux/ide.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/serial.h>
- #include <linux/tty.h>
- #include <linux/serial_core.h>
-+#include <linux/of_platform.h>
- #include <asm/system.h>
- #include <asm/time.h>
-@@ -39,7 +39,6 @@
- #include <asm/tsi108_irq.h>
- #include <asm/tsi108_pci.h>
- #include <asm/mpic.h>
--#include <asm/of_platform.h>
- #undef DEBUG
---- a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-+++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-@@ -53,8 +53,6 @@
- #define MPC7448HPC2_PCI_CFG_PHYS 0xfb000000
--extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
--
- int mpc7448_hpc2_exclude_device(struct pci_controller *hose,
-                               u_char bus, u_char devfn)
- {
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/storcenter.c
-@@ -0,0 +1,192 @@
-+/*
-+ * Board setup routines for the storcenter
-+ *
-+ * Copyright 2007 (C) Oyvind Repvik (nail@nslu2-linux.org)
-+ * Copyright 2007 Andy Wilcox, Jon Loeliger
-+ *
-+ * Based on linkstation.c by G. Liakhovetski
-+ *
-+ * 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/pci.h>
-+#include <linux/initrd.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/system.h>
-+#include <asm/time.h>
-+#include <asm/prom.h>
-+#include <asm/mpic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "mpc10x.h"
-+
-+
-+#ifdef CONFIG_MTD_PHYSMAP
-+static struct mtd_partition storcenter_physmap_partitions[] = {
-+      {
-+              .name   = "kernel",
-+              .offset = 0x000000,
-+              .size   = 0x170000,
-+      },
-+      {
-+              .name   = "rootfs",
-+              .offset = 0x170000,
-+              .size   = 0x590000,
-+      },
-+      {
-+              .name   = "uboot",
-+              .offset = 0x700000,
-+              .size   = 0x040000,
-+      },
-+      {
-+              .name   = "config",
-+              .offset = 0x740000,
-+              .size   = 0x0c0000,
-+      },
-+};
-+#endif
-+
-+
-+static __initdata struct of_device_id storcenter_of_bus[] = {
-+      { .name = "soc", },
-+      {},
-+};
-+
-+static int __init storcenter_device_probe(void)
-+{
-+      of_platform_bus_probe(NULL, storcenter_of_bus, NULL);
-+      return 0;
-+}
-+machine_device_initcall(storcenter, storcenter_device_probe);
-+
-+
-+static int __init storcenter_add_bridge(struct device_node *dev)
-+{
-+#ifdef CONFIG_PCI
-+      int len;
-+      struct pci_controller *hose;
-+      const int *bus_range;
-+
-+      printk("Adding PCI host bridge %s\n", dev->full_name);
-+
-+      hose = pcibios_alloc_controller(dev);
-+      if (hose == NULL)
-+              return -ENOMEM;
-+
-+      bus_range = of_get_property(dev, "bus-range", &len);
-+      hose->first_busno = bus_range ? bus_range[0] : 0;
-+      hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+      setup_indirect_pci(hose, MPC10X_MAPB_CNFG_ADDR, MPC10X_MAPB_CNFG_DATA, 0);
-+
-+      /* Interpret the "ranges" property */
-+      /* This also maps the I/O region and sets isa_io/mem_base */
-+      pci_process_bridge_OF_ranges(hose, dev, 1);
-+#endif
-+
-+      return 0;
-+}
-+
-+static void __init storcenter_setup_arch(void)
-+{
-+      struct device_node *np;
-+
-+#ifdef CONFIG_MTD_PHYSMAP
-+      physmap_set_partitions(storcenter_physmap_partitions,
-+                             ARRAY_SIZE(storcenter_physmap_partitions));
-+#endif
-+
-+      /* Lookup PCI host bridges */
-+      for_each_compatible_node(np, "pci", "mpc10x-pci")
-+              storcenter_add_bridge(np);
-+
-+      printk(KERN_INFO "IOMEGA StorCenter\n");
-+}
-+
-+/*
-+ * Interrupt setup and service.  Interrrupts on the turbostation come
-+ * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
-+ */
-+static void __init storcenter_init_IRQ(void)
-+{
-+      struct mpic *mpic;
-+      struct device_node *dnp;
-+      const void *prop;
-+      int size;
-+      phys_addr_t paddr;
-+
-+      dnp = of_find_node_by_type(NULL, "open-pic");
-+      if (dnp == NULL)
-+              return;
-+
-+      prop = of_get_property(dnp, "reg", &size);
-+      if (prop == NULL) {
-+              of_node_put(dnp);
-+              return;
-+      }
-+
-+      paddr = (phys_addr_t)of_translate_address(dnp, prop);
-+      mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET,
-+                      4, 32, " EPIC     ");
-+
-+      of_node_put(dnp);
-+
-+      BUG_ON(mpic == NULL);
-+
-+      /* PCI IRQs */
-+      /*
-+       * 2.6.12 patch:
-+       *         openpic_set_sources(0, 5, OpenPIC_Addr + 0x10200);
-+       *         openpic_set_sources(5, 2, OpenPIC_Addr + 0x11120);
-+       *         first_irq, num_irqs, __iomem first_ISR
-+       *         o_ss: i, src: 0, fdf50200
-+       *         o_ss: i, src: 1, fdf50220
-+       *         o_ss: i, src: 2, fdf50240
-+       *         o_ss: i, src: 3, fdf50260
-+       *         o_ss: i, src: 4, fdf50280
-+       *         o_ss: i, src: 5, fdf51120
-+       *         o_ss: i, src: 6, fdf51140
-+       */
-+      mpic_assign_isu(mpic, 0, paddr + 0x10200);
-+      mpic_assign_isu(mpic, 1, paddr + 0x10220);
-+      mpic_assign_isu(mpic, 2, paddr + 0x10240);
-+      mpic_assign_isu(mpic, 3, paddr + 0x10260);
-+      mpic_assign_isu(mpic, 4, paddr + 0x10280);
-+      mpic_assign_isu(mpic, 5, paddr + 0x11120);
-+      mpic_assign_isu(mpic, 6, paddr + 0x11140);
-+
-+      mpic_init(mpic);
-+}
-+
-+static void storcenter_restart(char *cmd)
-+{
-+      local_irq_disable();
-+
-+      /* Set exception prefix high - to the firmware */
-+      _nmask_and_or_msr(0, MSR_IP);
-+
-+      /* Wait for reset to happen */
-+      for (;;) ;
-+}
-+
-+static int __init storcenter_probe(void)
-+{
-+      unsigned long root = of_get_flat_dt_root();
-+
-+      return of_flat_dt_is_compatible(root, "storcenter");
-+}
-+
-+define_machine(storcenter){
-+      .name                   = "IOMEGA StorCenter",
-+      .probe                  = storcenter_probe,
-+      .setup_arch             = storcenter_setup_arch,
-+      .init_IRQ               = storcenter_init_IRQ,
-+      .get_irq                = mpic_get_irq,
-+      .restart                = storcenter_restart,
-+      .calibrate_decr         = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/iseries/Makefile
-+++ b/arch/powerpc/platforms/iseries/Makefile
-@@ -5,7 +5,7 @@ extra-y += dt.o
- obj-y += exception.o
- obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \
-       hvcall.o proc.o htab.o iommu.o misc.o irq.o
--obj-$(CONFIG_PCI) += pci.o vpdinfo.o
-+obj-$(CONFIG_PCI) += pci.o
- obj-$(CONFIG_SMP) += smp.o
- obj-$(CONFIG_VIOPATH) += viopath.o vio.o
- obj-$(CONFIG_MODULES) += ksyms.o
---- a/arch/powerpc/platforms/iseries/iommu.c
-+++ b/arch/powerpc/platforms/iseries/iommu.c
-@@ -163,8 +163,10 @@ static struct iommu_table *iommu_table_f
-                   (it->it_type == TCE_PCI) &&
-                   (it->it_offset == tbl->it_offset) &&
-                   (it->it_index == tbl->it_index) &&
--                  (it->it_size == tbl->it_size))
-+                  (it->it_size == tbl->it_size)) {
-+                      of_node_put(node);
-                       return it;
-+              }
-       }
-       return NULL;
- }
---- a/arch/powerpc/platforms/iseries/lpevents.c
-+++ b/arch/powerpc/platforms/iseries/lpevents.c
-@@ -239,7 +239,7 @@ int HvLpEvent_unregisterHandler(HvLpEven
-                        * other CPUs, and that the deleted handler isn't
-                        * still running on another CPU when we return.
-                        */
--                      synchronize_rcu();
-+                      synchronize_sched();
-                       return 0;
-               }
-       }
---- a/arch/powerpc/platforms/iseries/pci.c
-+++ b/arch/powerpc/platforms/iseries/pci.c
-@@ -1,5 +1,6 @@
- /*
-  * Copyright (C) 2001 Allan Trautman, IBM Corporation
-+ * Copyright (C) 2005,2007  Stephen Rothwell, IBM Corp
-  *
-  * iSeries specific routines for PCI.
-  *
-@@ -19,13 +20,18 @@
-  * along with this program; if not, write to the Free Software
-  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-  */
-+
-+#undef DEBUG
-+
- #include <linux/kernel.h>
- #include <linux/list.h>
- #include <linux/string.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/pci.h>
-+#include <linux/of.h>
-+#include <asm/types.h>
- #include <asm/io.h>
- #include <asm/irq.h>
- #include <asm/prom.h>
-@@ -35,6 +41,7 @@
- #include <asm/abs_addr.h>
- #include <asm/firmware.h>
-+#include <asm/iseries/hv_types.h>
- #include <asm/iseries/hv_call_xm.h>
- #include <asm/iseries/mf.h>
- #include <asm/iseries/iommu.h>
-@@ -45,15 +52,8 @@
- #include "pci.h"
- #include "call_pci.h"
--/*
-- * Forward declares of prototypes.
-- */
--static struct device_node *find_Device_Node(int bus, int devfn);
--
--static int Pci_Retry_Max = 3; /* Only retry 3 times  */
--static int Pci_Error_Flag = 1;        /* Set Retry Error on. */
--
--static struct pci_ops iSeries_pci_ops;
-+#define PCI_RETRY_MAX 3
-+static int limit_pci_retries = 1;     /* Set Retry Error on. */
- /*
-  * Table defines
-@@ -62,6 +62,7 @@ static struct pci_ops iSeries_pci_ops;
- #define IOMM_TABLE_MAX_ENTRIES        1024
- #define IOMM_TABLE_ENTRY_SIZE 0x0000000000400000UL
- #define BASE_IO_MEMORY                0xE000000000000000UL
-+#define END_IO_MEMORY         0xEFFFFFFFFFFFFFFFUL
- static unsigned long max_io_memory = BASE_IO_MEMORY;
- static long current_iomm_table_entry;
-@@ -70,12 +71,237 @@ static long current_iomm_table_entry;
-  * Lookup Tables.
-  */
- static struct device_node *iomm_table[IOMM_TABLE_MAX_ENTRIES];
--static u8 iobar_table[IOMM_TABLE_MAX_ENTRIES];
-+static u64 ds_addr_table[IOMM_TABLE_MAX_ENTRIES];
--static const char pci_io_text[] = "iSeries PCI I/O";
- static DEFINE_SPINLOCK(iomm_table_lock);
- /*
-+ * Generate a Direct Select Address for the Hypervisor
-+ */
-+static inline u64 iseries_ds_addr(struct device_node *node)
-+{
-+      struct pci_dn *pdn = PCI_DN(node);
-+      const u32 *sbp = of_get_property(node, "linux,subbus", NULL);
-+
-+      return ((u64)pdn->busno << 48) + ((u64)(sbp ? *sbp : 0) << 40)
-+                      + ((u64)0x10 << 32);
-+}
-+
-+/*
-+ * Size of Bus VPD data
-+ */
-+#define BUS_VPDSIZE      1024
-+
-+/*
-+ * Bus Vpd Tags
-+ */
-+#define VPD_END_OF_AREA               0x79
-+#define VPD_ID_STRING         0x82
-+#define VPD_VENDOR_AREA               0x84
-+
-+/*
-+ * Mfg Area Tags
-+ */
-+#define VPD_FRU_FRAME_ID      0x4649  /* "FI" */
-+#define VPD_SLOT_MAP_FORMAT   0x4D46  /* "MF" */
-+#define VPD_SLOT_MAP          0x534D  /* "SM" */
-+
-+/*
-+ * Structures of the areas
-+ */
-+struct mfg_vpd_area {
-+      u16     tag;
-+      u8      length;
-+      u8      data1;
-+      u8      data2;
-+};
-+#define MFG_ENTRY_SIZE   3
-+
-+struct slot_map {
-+      u8      agent;
-+      u8      secondary_agent;
-+      u8      phb;
-+      char    card_location[3];
-+      char    parms[8];
-+      char    reserved[2];
-+};
-+#define SLOT_ENTRY_SIZE   16
-+
-+/*
-+ * Parse the Slot Area
-+ */
-+static void __init iseries_parse_slot_area(struct slot_map *map, int len,
-+              HvAgentId agent, u8 *phb, char card[4])
-+{
-+      /*
-+       * Parse Slot label until we find the one requested
-+       */
-+      while (len > 0) {
-+              if (map->agent == agent) {
-+                      /*
-+                       * If Phb wasn't found, grab the entry first one found.
-+                       */
-+                      if (*phb == 0xff)
-+                              *phb = map->phb;
-+                      /* Found it, extract the data. */
-+                      if (map->phb == *phb) {
-+                              memcpy(card, &map->card_location, 3);
-+                              card[3]  = 0;
-+                              break;
-+                      }
-+              }
-+              /* Point to the next Slot */
-+              map = (struct slot_map *)((char *)map + SLOT_ENTRY_SIZE);
-+              len -= SLOT_ENTRY_SIZE;
-+      }
-+}
-+
-+/*
-+ * Parse the Mfg Area
-+ */
-+static void __init iseries_parse_mfg_area(struct mfg_vpd_area *area, int len,
-+              HvAgentId agent, u8 *phb, u8 *frame, char card[4])
-+{
-+      u16 slot_map_fmt = 0;
-+
-+      /* Parse Mfg Data */
-+      while (len > 0) {
-+              int mfg_tag_len = area->length;
-+              /* Frame ID         (FI 4649020310 ) */
-+              if (area->tag == VPD_FRU_FRAME_ID)
-+                      *frame = area->data1;
-+              /* Slot Map Format  (MF 4D46020004 ) */
-+              else if (area->tag == VPD_SLOT_MAP_FORMAT)
-+                      slot_map_fmt = (area->data1 * 256)
-+                              + area->data2;
-+              /* Slot Map         (SM 534D90 */
-+              else if (area->tag == VPD_SLOT_MAP) {
-+                      struct slot_map *slot_map;
-+
-+                      if (slot_map_fmt == 0x1004)
-+                              slot_map = (struct slot_map *)((char *)area
-+                                              + MFG_ENTRY_SIZE + 1);
-+                      else
-+                              slot_map = (struct slot_map *)((char *)area
-+                                              + MFG_ENTRY_SIZE);
-+                      iseries_parse_slot_area(slot_map, mfg_tag_len,
-+                                      agent, phb, card);
-+              }
-+              /*
-+               * Point to the next Mfg Area
-+               * Use defined size, sizeof give wrong answer
-+               */
-+              area = (struct mfg_vpd_area *)((char *)area + mfg_tag_len
-+                              + MFG_ENTRY_SIZE);
-+              len -= (mfg_tag_len + MFG_ENTRY_SIZE);
-+      }
-+}
-+
-+/*
-+ * Look for "BUS".. Data is not Null terminated.
-+ * PHBID of 0xFF indicates PHB was not found in VPD Data.
-+ */
-+static u8 __init iseries_parse_phbid(u8 *area, int len)
-+{
-+      while (len > 0) {
-+              if ((*area == 'B') && (*(area + 1) == 'U')
-+                              && (*(area + 2) == 'S')) {
-+                      area += 3;
-+                      while (*area == ' ')
-+                              area++;
-+                      return *area & 0x0F;
-+              }
-+              area++;
-+              len--;
-+      }
-+      return 0xff;
-+}
-+
-+/*
-+ * Parse out the VPD Areas
-+ */
-+static void __init iseries_parse_vpd(u8 *data, int data_len,
-+              HvAgentId agent, u8 *frame, char card[4])
-+{
-+      u8 phb = 0xff;
-+
-+      while (data_len > 0) {
-+              int len;
-+              u8 tag = *data;
-+
-+              if (tag == VPD_END_OF_AREA)
-+                      break;
-+              len = *(data + 1) + (*(data + 2) * 256);
-+              data += 3;
-+              data_len -= 3;
-+              if (tag == VPD_ID_STRING)
-+                      phb = iseries_parse_phbid(data, len);
-+              else if (tag == VPD_VENDOR_AREA)
-+                      iseries_parse_mfg_area((struct mfg_vpd_area *)data, len,
-+                                      agent, &phb, frame, card);
-+              /* Point to next Area. */
-+              data += len;
-+              data_len -= len;
-+      }
-+}
-+
-+static int __init iseries_get_location_code(u16 bus, HvAgentId agent,
-+              u8 *frame, char card[4])
-+{
-+      int status = 0;
-+      int bus_vpd_len = 0;
-+      u8 *bus_vpd = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
-+
-+      if (bus_vpd == NULL) {
-+              printk("PCI: Bus VPD Buffer allocation failure.\n");
-+              return 0;
-+      }
-+      bus_vpd_len = HvCallPci_getBusVpd(bus, iseries_hv_addr(bus_vpd),
-+                                      BUS_VPDSIZE);
-+      if (bus_vpd_len == 0) {
-+              printk("PCI: Bus VPD Buffer zero length.\n");
-+              goto out_free;
-+      }
-+      /* printk("PCI: bus_vpd: %p, %d\n",bus_vpd, bus_vpd_len); */
-+      /* Make sure this is what I think it is */
-+      if (*bus_vpd != VPD_ID_STRING) {
-+              printk("PCI: Bus VPD Buffer missing starting tag.\n");
-+              goto out_free;
-+      }
-+      iseries_parse_vpd(bus_vpd, bus_vpd_len, agent, frame, card);
-+      status = 1;
-+out_free:
-+      kfree(bus_vpd);
-+      return status;
-+}
-+
-+/*
-+ * Prints the device information.
-+ * - Pass in pci_dev* pointer to the device.
-+ * - Pass in the device count
-+ *
-+ * Format:
-+ * PCI: Bus  0, Device 26, Vendor 0x12AE  Frame  1, Card  C10  Ethernet
-+ * controller
-+ */
-+static void __init iseries_device_information(struct pci_dev *pdev,
-+                                            u16 bus, HvSubBusNumber subbus)
-+{
-+      u8 frame = 0;
-+      char card[4];
-+      HvAgentId agent;
-+
-+      agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
-+                      ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
-+
-+      if (iseries_get_location_code(bus, agent, &frame, card)) {
-+              printk(KERN_INFO "PCI: %s, Vendor %04X Frame%3d, "
-+                     "Card %4s  0x%04X\n", pci_name(pdev), pdev->vendor,
-+                     frame, card, (int)(pdev->class >> 8));
-+      }
-+}
-+
-+/*
-  * iomm_table_allocate_entry
-  *
-  * Adds pci_dev entry in address translation table
-@@ -87,7 +313,7 @@ static DEFINE_SPINLOCK(iomm_table_lock);
-  * - CurrentIndex is incremented to keep track of the last entry.
-  * - Builds the resource entry for allocated BARs.
-  */
--static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
-+static void __init iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
- {
-       struct resource *bar_res = &dev->resource[bar_num];
-       long bar_size = pci_resource_len(dev, bar_num);
-@@ -101,7 +327,6 @@ static void iomm_table_allocate_entry(st
-        * Set Resource values.
-        */
-       spin_lock(&iomm_table_lock);
--      bar_res->name = pci_io_text;
-       bar_res->start = BASE_IO_MEMORY +
-               IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry;
-       bar_res->end = bar_res->start + bar_size - 1;
-@@ -110,7 +335,8 @@ static void iomm_table_allocate_entry(st
-        */
-       while (bar_size > 0 ) {
-               iomm_table[current_iomm_table_entry] = dev->sysdata;
--              iobar_table[current_iomm_table_entry] = bar_num;
-+              ds_addr_table[current_iomm_table_entry] =
-+                      iseries_ds_addr(dev->sysdata) | (bar_num << 24);
-               bar_size -= IOMM_TABLE_ENTRY_SIZE;
-               ++current_iomm_table_entry;
-       }
-@@ -130,7 +356,7 @@ static void iomm_table_allocate_entry(st
-  * - Loops through The Bar resources(0 - 5) including the ROM
-  *   is resource(6).
-  */
--static void allocate_device_bars(struct pci_dev *dev)
-+static void __init allocate_device_bars(struct pci_dev *dev)
- {
-       int bar_num;
-@@ -145,79 +371,19 @@ static void allocate_device_bars(struct 
-  * PCI: Read Vendor Failed 0x18.58.10 Rc: 0x00xx
-  * PCI: Connect Bus Unit Failed 0x18.58.10 Rc: 0x00xx
-  */
--static void pci_Log_Error(char *Error_Text, int Bus, int SubBus,
--              int AgentId, int HvRc)
-+static void pci_log_error(char *error, int bus, int subbus,
-+              int agent, int hv_res)
- {
--      if (HvRc == 0x0302)
-+      if (hv_res == 0x0302)
-               return;
-       printk(KERN_ERR "PCI: %s Failed: 0x%02X.%02X.%02X Rc: 0x%04X",
--             Error_Text, Bus, SubBus, AgentId, HvRc);
--}
--
--/*
-- * iSeries_pci_final_fixup(void)
-- */
--void __init iSeries_pci_final_fixup(void)
--{
--      struct pci_dev *pdev = NULL;
--      struct device_node *node;
--      int DeviceCount = 0;
--
--      /* Fix up at the device node and pci_dev relationship */
--      mf_display_src(0xC9000100);
--
--      printk("pcibios_final_fixup\n");
--      for_each_pci_dev(pdev) {
--              node = find_Device_Node(pdev->bus->number, pdev->devfn);
--              printk("pci dev %p (%x.%x), node %p\n", pdev,
--                     pdev->bus->number, pdev->devfn, node);
--
--              if (node != NULL) {
--                      struct pci_dn *pdn = PCI_DN(node);
--                      const u32 *agent;
--
--                      agent = of_get_property(node, "linux,agent-id", NULL);
--                      if ((pdn != NULL) && (agent != NULL)) {
--                              u8 irq = iSeries_allocate_IRQ(pdn->busno, 0,
--                                              pdn->bussubno);
--                              int err;
--
--                              err = HvCallXm_connectBusUnit(pdn->busno, pdn->bussubno,
--                                              *agent, irq);
--                              if (err)
--                                      pci_Log_Error("Connect Bus Unit",
--                                              pdn->busno, pdn->bussubno, *agent, err);
--                              else {
--                                      err = HvCallPci_configStore8(pdn->busno, pdn->bussubno,
--                                                      *agent,
--                                                      PCI_INTERRUPT_LINE,
--                                                      irq);
--                                      if (err)
--                                              pci_Log_Error("PciCfgStore Irq Failed!",
--                                                      pdn->busno, pdn->bussubno, *agent, err);
--                              }
--                              if (!err)
--                                      pdev->irq = irq;
--                      }
--
--                      ++DeviceCount;
--                      pdev->sysdata = (void *)node;
--                      PCI_DN(node)->pcidev = pdev;
--                      allocate_device_bars(pdev);
--                      iSeries_Device_Information(pdev, DeviceCount);
--                      iommu_devnode_init_iSeries(pdev, node);
--              } else
--                      printk("PCI: Device Tree not found for 0x%016lX\n",
--                                      (unsigned long)pdev);
--      }
--      iSeries_activate_IRQs();
--      mf_display_src(0xC9000200);
-+             error, bus, subbus, agent, hv_res);
- }
- /*
-  * Look down the chain to find the matching Device Device
-  */
--static struct device_node *find_Device_Node(int bus, int devfn)
-+static struct device_node *find_device_node(int bus, int devfn)
- {
-       struct device_node *node;
-@@ -230,22 +396,66 @@ static struct device_node *find_Device_N
-       return NULL;
- }
--#if 0
- /*
-- * Returns the device node for the passed pci_dev
-- * Sanity Check Node PciDev to passed pci_dev
-- * If none is found, returns a NULL which the client must handle.
-+ * iSeries_pcibios_fixup_resources
-+ *
-+ * Fixes up all resources for devices
-  */
--static struct device_node *get_Device_Node(struct pci_dev *pdev)
-+void __init iSeries_pcibios_fixup_resources(struct pci_dev *pdev)
- {
-+      const u32 *agent;
-+      const u32 *sub_bus;
-+      unsigned char bus = pdev->bus->number;
-       struct device_node *node;
-+      int i;
-+
-+      node = find_device_node(bus, pdev->devfn);
-+      pr_debug("PCI: iSeries %s, pdev %p, node %p\n",
-+               pci_name(pdev), pdev, node);
-+      if (!node) {
-+              printk("PCI: %s disabled, device tree entry not found !\n",
-+                     pci_name(pdev));
-+              for (i = 0; i <= PCI_ROM_RESOURCE; i++)
-+                      pdev->resource[i].flags = 0;
-+              return;
-+      }
-+      sub_bus = of_get_property(node, "linux,subbus", NULL);
-+      agent = of_get_property(node, "linux,agent-id", NULL);
-+      if (agent && sub_bus) {
-+              u8 irq = iSeries_allocate_IRQ(bus, 0, *sub_bus);
-+              int err;
-+
-+              err = HvCallXm_connectBusUnit(bus, *sub_bus, *agent, irq);
-+              if (err)
-+                      pci_log_error("Connect Bus Unit",
-+                                    bus, *sub_bus, *agent, err);
-+              else {
-+                      err = HvCallPci_configStore8(bus, *sub_bus,
-+                                      *agent, PCI_INTERRUPT_LINE, irq);
-+                      if (err)
-+                              pci_log_error("PciCfgStore Irq Failed!",
-+                                              bus, *sub_bus, *agent, err);
-+                      else
-+                              pdev->irq = irq;
-+              }
-+      }
--      node = pdev->sysdata;
--      if (node == NULL || PCI_DN(node)->pcidev != pdev)
--              node = find_Device_Node(pdev->bus->number, pdev->devfn);
--      return node;
-+      pdev->sysdata = node;
-+      allocate_device_bars(pdev);
-+      iseries_device_information(pdev, bus, *sub_bus);
-+      iommu_devnode_init_iSeries(pdev, node);
-+}
-+
-+/*
-+ * iSeries_pci_final_fixup(void)
-+ */
-+void __init iSeries_pci_final_fixup(void)
-+{
-+      /* Fix up at the device node and pci_dev relationship */
-+      mf_display_src(0xC9000100);
-+      iSeries_activate_IRQs();
-+      mf_display_src(0xC9000200);
- }
--#endif
- /*
-  * Config space read and write functions.
-@@ -269,7 +479,7 @@ static u64 hv_cfg_write_func[4] = {
- static int iSeries_pci_read_config(struct pci_bus *bus, unsigned int devfn,
-               int offset, int size, u32 *val)
- {
--      struct device_node *node = find_Device_Node(bus->number, devfn);
-+      struct device_node *node = find_device_node(bus->number, devfn);
-       u64 fn;
-       struct HvCallPci_LoadReturn ret;
-@@ -299,7 +509,7 @@ static int iSeries_pci_read_config(struc
- static int iSeries_pci_write_config(struct pci_bus *bus, unsigned int devfn,
-               int offset, int size, u32 val)
- {
--      struct device_node *node = find_Device_Node(bus->number, devfn);
-+      struct device_node *node = find_device_node(bus->number, devfn);
-       u64 fn;
-       u64 ret;
-@@ -331,22 +541,22 @@ static struct pci_ops iSeries_pci_ops = 
-  * PCI: Device 23.90 ReadL Retry( 1)
-  * PCI: Device 23.90 ReadL Retry Successful(1)
-  */
--static int CheckReturnCode(char *TextHdr, struct device_node *DevNode,
-+static int check_return_code(char *type, struct device_node *dn,
-               int *retry, u64 ret)
- {
-       if (ret != 0)  {
--              struct pci_dn *pdn = PCI_DN(DevNode);
-+              struct pci_dn *pdn = PCI_DN(dn);
-               (*retry)++;
-               printk("PCI: %s: Device 0x%04X:%02X  I/O Error(%2d): 0x%04X\n",
--                              TextHdr, pdn->busno, pdn->devfn,
-+                              type, pdn->busno, pdn->devfn,
-                               *retry, (int)ret);
-               /*
-                * Bump the retry and check for retry count exceeded.
-                * If, Exceeded, panic the system.
-                */
--              if (((*retry) > Pci_Retry_Max) &&
--                              (Pci_Error_Flag > 0)) {
-+              if (((*retry) > PCI_RETRY_MAX) &&
-+                              (limit_pci_retries > 0)) {
-                       mf_display_src(0xB6000103);
-                       panic_timeout = 0;
-                       panic("PCI: Hardware I/O Error, SRC B6000103, "
-@@ -363,28 +573,39 @@ static int CheckReturnCode(char *TextHdr
-  * the exposure of being device global.
-  */
- static inline struct device_node *xlate_iomm_address(
--              const volatile void __iomem *IoAddress,
--              u64 *dsaptr, u64 *BarOffsetPtr)
-+              const volatile void __iomem *addr,
-+              u64 *dsaptr, u64 *bar_offset, const char *func)
- {
--      unsigned long OrigIoAddr;
--      unsigned long BaseIoAddr;
--      unsigned long TableIndex;
--      struct device_node *DevNode;
-+      unsigned long orig_addr;
-+      unsigned long base_addr;
-+      unsigned long ind;
-+      struct device_node *dn;
--      OrigIoAddr = (unsigned long __force)IoAddress;
--      if ((OrigIoAddr < BASE_IO_MEMORY) || (OrigIoAddr >= max_io_memory))
-+      orig_addr = (unsigned long __force)addr;
-+      if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) {
-+              static unsigned long last_jiffies;
-+              static int num_printed;
-+
-+              if ((jiffies - last_jiffies) > 60 * HZ) {
-+                      last_jiffies = jiffies;
-+                      num_printed = 0;
-+              }
-+              if (num_printed++ < 10)
-+                      printk(KERN_ERR
-+                              "iSeries_%s: invalid access at IO address %p\n",
-+                              func, addr);
-               return NULL;
--      BaseIoAddr = OrigIoAddr - BASE_IO_MEMORY;
--      TableIndex = BaseIoAddr / IOMM_TABLE_ENTRY_SIZE;
--      DevNode = iomm_table[TableIndex];
--
--      if (DevNode != NULL) {
--              int barnum = iobar_table[TableIndex];
--              *dsaptr = iseries_ds_addr(DevNode) | (barnum << 24);
--              *BarOffsetPtr = BaseIoAddr % IOMM_TABLE_ENTRY_SIZE;
-+      }
-+      base_addr = orig_addr - BASE_IO_MEMORY;
-+      ind = base_addr / IOMM_TABLE_ENTRY_SIZE;
-+      dn = iomm_table[ind];
-+
-+      if (dn != NULL) {
-+              *dsaptr = ds_addr_table[ind];
-+              *bar_offset = base_addr % IOMM_TABLE_ENTRY_SIZE;
-       } else
--              panic("PCI: Invalid PCI IoAddress detected!\n");
--      return DevNode;
-+              panic("PCI: Invalid PCI IO address detected!\n");
-+      return dn;
- }
- /*
-@@ -392,91 +613,58 @@ static inline struct device_node *xlate_
-  * On MM I/O error, all ones are returned and iSeries_pci_IoError is cal
-  * else, data is returned in Big Endian format.
-  */
--static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
-+static u8 iseries_readb(const volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       struct HvCallPci_LoadReturn ret;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte");
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Read_Byte: invalid access at IO address %p\n",
--                             IoAddress);
-+      if (dn == NULL)
-               return 0xff;
--      }
-       do {
--              HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0);
--      } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0);
-+              HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0);
-+      } while (check_return_code("RDB", dn, &retry, ret.rc) != 0);
-       return ret.value;
- }
--static u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
-+static u16 iseries_readw_be(const volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       struct HvCallPci_LoadReturn ret;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "read_word");
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Read_Word: invalid access at IO address %p\n",
--                             IoAddress);
-+      if (dn == NULL)
-               return 0xffff;
--      }
-       do {
-               HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa,
--                              BarOffset, 0);
--      } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0);
-+                              bar_offset, 0);
-+      } while (check_return_code("RDW", dn, &retry, ret.rc) != 0);
-       return ret.value;
- }
--static u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
-+static u32 iseries_readl_be(const volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       struct HvCallPci_LoadReturn ret;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "read_long");
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
--
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Read_Long: invalid access at IO address %p\n",
--                             IoAddress);
-+      if (dn == NULL)
-               return 0xffffffff;
--      }
-       do {
-               HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa,
--                              BarOffset, 0);
--      } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0);
-+                              bar_offset, 0);
-+      } while (check_return_code("RDL", dn, &retry, ret.rc) != 0);
-       return ret.value;
- }
-@@ -485,134 +673,72 @@ static u32 iSeries_Read_Long(const volat
-  * Write MM I/O Instructions for the iSeries
-  *
-  */
--static void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
-+static void iseries_writeb(u8 data, volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       u64 rc;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "write_byte");
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Write_Byte: invalid access at IO address %p\n", IoAddress);
-+      if (dn == NULL)
-               return;
--      }
-       do {
--              rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0);
--      } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0);
-+              rc = HvCall4(HvCallPciBarStore8, dsa, bar_offset, data, 0);
-+      } while (check_return_code("WWB", dn, &retry, rc) != 0);
- }
--static void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
-+static void iseries_writew_be(u16 data, volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       u64 rc;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "write_word");
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
--
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Write_Word: invalid access at IO address %p\n",
--                             IoAddress);
-+      if (dn == NULL)
-               return;
--      }
-       do {
--              rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, data, 0);
--      } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0);
-+              rc = HvCall4(HvCallPciBarStore16, dsa, bar_offset, data, 0);
-+      } while (check_return_code("WWW", dn, &retry, rc) != 0);
- }
--static void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
-+static void iseries_writel_be(u32 data, volatile void __iomem *addr)
- {
--      u64 BarOffset;
-+      u64 bar_offset;
-       u64 dsa;
-       int retry = 0;
-       u64 rc;
--      struct device_node *DevNode =
--              xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
--      if (DevNode == NULL) {
--              static unsigned long last_jiffies;
--              static int num_printed;
-+      struct device_node *dn =
-+              xlate_iomm_address(addr, &dsa, &bar_offset, "write_long");
--              if ((jiffies - last_jiffies) > 60 * HZ) {
--                      last_jiffies = jiffies;
--                      num_printed = 0;
--              }
--              if (num_printed++ < 10)
--                      printk(KERN_ERR "iSeries_Write_Long: invalid access at IO address %p\n",
--                             IoAddress);
-+      if (dn == NULL)
-               return;
--      }
-       do {
--              rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, data, 0);
--      } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0);
--}
--
--static u8 iseries_readb(const volatile void __iomem *addr)
--{
--      return iSeries_Read_Byte(addr);
-+              rc = HvCall4(HvCallPciBarStore32, dsa, bar_offset, data, 0);
-+      } while (check_return_code("WWL", dn, &retry, rc) != 0);
- }
- static u16 iseries_readw(const volatile void __iomem *addr)
- {
--      return le16_to_cpu(iSeries_Read_Word(addr));
-+      return le16_to_cpu(iseries_readw_be(addr));
- }
- static u32 iseries_readl(const volatile void __iomem *addr)
- {
--      return le32_to_cpu(iSeries_Read_Long(addr));
--}
--
--static u16 iseries_readw_be(const volatile void __iomem *addr)
--{
--      return iSeries_Read_Word(addr);
--}
--
--static u32 iseries_readl_be(const volatile void __iomem *addr)
--{
--      return iSeries_Read_Long(addr);
--}
--
--static void iseries_writeb(u8 data, volatile void __iomem *addr)
--{
--      iSeries_Write_Byte(data, addr);
-+      return le32_to_cpu(iseries_readl_be(addr));
- }
- static void iseries_writew(u16 data, volatile void __iomem *addr)
- {
--      iSeries_Write_Word(cpu_to_le16(data), addr);
-+      iseries_writew_be(cpu_to_le16(data), addr);
- }
- static void iseries_writel(u32 data, volatile void __iomem *addr)
- {
--      iSeries_Write_Long(cpu_to_le32(data), addr);
--}
--
--static void iseries_writew_be(u16 data, volatile void __iomem *addr)
--{
--      iSeries_Write_Word(data, addr);
--}
--
--static void iseries_writel_be(u32 data, volatile void __iomem *addr)
--{
--      iSeries_Write_Long(data, addr);
-+      iseries_writel(cpu_to_le32(data), addr);
- }
- static void iseries_readsb(const volatile void __iomem *addr, void *buf,
-@@ -620,7 +746,7 @@ static void iseries_readsb(const volatil
- {
-       u8 *dst = buf;
-       while(count-- > 0)
--              *(dst++) = iSeries_Read_Byte(addr);
-+              *(dst++) = iseries_readb(addr);
- }
- static void iseries_readsw(const volatile void __iomem *addr, void *buf,
-@@ -628,7 +754,7 @@ static void iseries_readsw(const volatil
- {
-       u16 *dst = buf;
-       while(count-- > 0)
--              *(dst++) = iSeries_Read_Word(addr);
-+              *(dst++) = iseries_readw_be(addr);
- }
- static void iseries_readsl(const volatile void __iomem *addr, void *buf,
-@@ -636,7 +762,7 @@ static void iseries_readsl(const volatil
- {
-       u32 *dst = buf;
-       while(count-- > 0)
--              *(dst++) = iSeries_Read_Long(addr);
-+              *(dst++) = iseries_readl_be(addr);
- }
- static void iseries_writesb(volatile void __iomem *addr, const void *buf,
-@@ -644,7 +770,7 @@ static void iseries_writesb(volatile voi
- {
-       const u8 *src = buf;
-       while(count-- > 0)
--              iSeries_Write_Byte(*(src++), addr);
-+              iseries_writeb(*(src++), addr);
- }
- static void iseries_writesw(volatile void __iomem *addr, const void *buf,
-@@ -652,7 +778,7 @@ static void iseries_writesw(volatile voi
- {
-       const u16 *src = buf;
-       while(count-- > 0)
--              iSeries_Write_Word(*(src++), addr);
-+              iseries_writew_be(*(src++), addr);
- }
- static void iseries_writesl(volatile void __iomem *addr, const void *buf,
-@@ -660,7 +786,7 @@ static void iseries_writesl(volatile voi
- {
-       const u32 *src = buf;
-       while(count-- > 0)
--              iSeries_Write_Long(*(src++), addr);
-+              iseries_writel_be(*(src++), addr);
- }
- static void iseries_memset_io(volatile void __iomem *addr, int c,
-@@ -669,7 +795,7 @@ static void iseries_memset_io(volatile v
-       volatile char __iomem *d = addr;
-       while (n-- > 0)
--              iSeries_Write_Byte(c, d++);
-+              iseries_writeb(c, d++);
- }
- static void iseries_memcpy_fromio(void *dest, const volatile void __iomem *src,
-@@ -679,7 +805,7 @@ static void iseries_memcpy_fromio(void *
-       const volatile char __iomem *s = src;
-       while (n-- > 0)
--              *d++ = iSeries_Read_Byte(s++);
-+              *d++ = iseries_readb(s++);
- }
- static void iseries_memcpy_toio(volatile void __iomem *dest, const void *src,
-@@ -689,7 +815,7 @@ static void iseries_memcpy_toio(volatile
-       volatile char __iomem *d = dest;
-       while (n-- > 0)
--              iSeries_Write_Byte(*s++, d++);
-+              iseries_writeb(*s++, d++);
- }
- /* We only set MMIO ops. The default PIO ops will be default
-@@ -742,6 +868,8 @@ void __init iSeries_pcibios_init(void)
-       /* Install IO hooks */
-       ppc_pci_io = iseries_pci_io;
-+      pci_probe_only = 1;
-+
-       /* iSeries has no IO space in the common sense, it needs to set
-        * the IO base to 0
-        */
-@@ -767,11 +895,21 @@ void __init iSeries_pcibios_init(void)
-               phb = pcibios_alloc_controller(node);
-               if (phb == NULL)
-                       continue;
-+              /* All legacy iSeries PHBs are in domain zero */
-+              phb->global_number = 0;
--              phb->pci_mem_offset = bus;
-               phb->first_busno = bus;
-               phb->last_busno = bus;
-               phb->ops = &iSeries_pci_ops;
-+              phb->io_base_virt = (void __iomem *)_IO_BASE;
-+              phb->io_resource.flags = IORESOURCE_IO;
-+              phb->io_resource.start = BASE_IO_MEMORY;
-+              phb->io_resource.end = END_IO_MEMORY;
-+              phb->io_resource.name = "iSeries PCI IO";
-+              phb->mem_resources[0].flags = IORESOURCE_MEM;
-+              phb->mem_resources[0].start = BASE_IO_MEMORY;
-+              phb->mem_resources[0].end = END_IO_MEMORY;
-+              phb->mem_resources[0].name = "Series PCI MEM";
-       }
-       of_node_put(root);
---- a/arch/powerpc/platforms/iseries/pci.h
-+++ b/arch/powerpc/platforms/iseries/pci.h
-@@ -30,10 +30,6 @@
-  * End Change Activity
-  */
--#include <asm/pci-bridge.h>
--
--struct pci_dev;                               /* For Forward Reference */
--
- /*
-  * Decodes Linux DevFn to iSeries DevFn, bridge device, or function.
-  * For Linux, see PCI_SLOT and PCI_FUNC in include/linux/pci.h
-@@ -47,17 +43,16 @@ struct pci_dev;                            /* For Forward Refere
- #define ISERIES_GET_DEVICE_FROM_SUBBUS(subbus)                ((subbus >> 5) & 0x7)
- #define ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus)      ((subbus >> 2) & 0x7)
--/*
-- * Generate a Direct Select Address for the Hypervisor
-- */
--static inline u64 iseries_ds_addr(struct device_node *node)
--{
--      struct pci_dn *pdn = PCI_DN(node);
--
--      return ((u64)pdn->busno << 48) + ((u64)pdn->bussubno << 40)
--                      + ((u64)0x10 << 32);
--}
-+struct pci_dev;
--extern void   iSeries_Device_Information(struct pci_dev*, int);
-+#ifdef CONFIG_PCI
-+extern void   iSeries_pcibios_init(void);
-+extern void   iSeries_pci_final_fixup(void);
-+extern void   iSeries_pcibios_fixup_resources(struct pci_dev *dev);
-+#else
-+static inline void    iSeries_pcibios_init(void) { }
-+static inline void    iSeries_pci_final_fixup(void) { }
-+static inline void    iSeries_pcibios_fixup_resources(struct pci_dev *dev) {}
-+#endif
- #endif /* _PLATFORMS_ISERIES_PCI_H */
---- a/arch/powerpc/platforms/iseries/setup.c
-+++ b/arch/powerpc/platforms/iseries/setup.c
-@@ -63,6 +63,7 @@
- #include "main_store.h"
- #include "call_sm.h"
- #include "call_hpt.h"
-+#include "pci.h"
- #ifdef DEBUG
- #define DBG(fmt...) udbg_printf(fmt)
-@@ -74,11 +75,6 @@
- static unsigned long build_iSeries_Memory_Map(void);
- static void iseries_shared_idle(void);
- static void iseries_dedicated_idle(void);
--#ifdef CONFIG_PCI
--extern void iSeries_pci_final_fixup(void);
--#else
--static void iSeries_pci_final_fixup(void) { }
--#endif
- struct MemoryBlock {
-@@ -112,13 +108,13 @@ static unsigned long iSeries_process_Con
-        * correctly.
-        */
-       mb_array[0].logicalStart = 0;
--      mb_array[0].logicalEnd = 0x100000000;
-+      mb_array[0].logicalEnd = 0x100000000UL;
-       mb_array[0].absStart = 0;
--      mb_array[0].absEnd = 0x100000000;
-+      mb_array[0].absEnd = 0x100000000UL;
-       if (holeSize) {
-               numMemoryBlocks = 2;
--              holeStart = holeStart & 0x000fffffffffffff;
-+              holeStart = holeStart & 0x000fffffffffffffUL;
-               holeStart = addr_to_chunk(holeStart);
-               holeFirstChunk = holeStart;
-               holeSize = addr_to_chunk(holeSize);
-@@ -128,9 +124,9 @@ static unsigned long iSeries_process_Con
-               mb_array[0].logicalEnd = holeFirstChunk;
-               mb_array[0].absEnd = holeFirstChunk;
-               mb_array[1].logicalStart = holeFirstChunk;
--              mb_array[1].logicalEnd = 0x100000000 - holeSizeChunks;
-+              mb_array[1].logicalEnd = 0x100000000UL - holeSizeChunks;
-               mb_array[1].absStart = holeFirstChunk + holeSizeChunks;
--              mb_array[1].absEnd = 0x100000000;
-+              mb_array[1].absEnd = 0x100000000UL;
-       }
-       return numMemoryBlocks;
- }
-@@ -234,9 +230,9 @@ static unsigned long iSeries_process_Reg
-                               mb_array[i].logicalEnd,
-                               mb_array[i].absStart, mb_array[i].absEnd);
-               mb_array[i].absStart = addr_to_chunk(mb_array[i].absStart &
--                              0x000fffffffffffff);
-+                              0x000fffffffffffffUL);
-               mb_array[i].absEnd = addr_to_chunk(mb_array[i].absEnd &
--                              0x000fffffffffffff);
-+                              0x000fffffffffffffUL);
-               mb_array[i].logicalStart =
-                       addr_to_chunk(mb_array[i].logicalStart);
-               mb_array[i].logicalEnd = addr_to_chunk(mb_array[i].logicalEnd);
-@@ -320,7 +316,7 @@ struct mschunks_map mschunks_map = {
- };
- EXPORT_SYMBOL(mschunks_map);
--void mschunks_alloc(unsigned long num_chunks)
-+static void mschunks_alloc(unsigned long num_chunks)
- {
-       klimit = _ALIGN(klimit, sizeof(u32));
-       mschunks_map.mapping = (u32 *)klimit;
-@@ -499,6 +495,8 @@ static void __init iSeries_setup_arch(vo
-                       itVpdAreas.xSlicMaxLogicalProcs);
-       printk("Max physical processors = %d\n",
-                       itVpdAreas.xSlicMaxPhysicalProcs);
-+
-+      iSeries_pcibios_init();
- }
- static void iSeries_show_cpuinfo(struct seq_file *m)
-@@ -641,24 +639,25 @@ static int __init iseries_probe(void)
- }
- define_machine(iseries) {
--      .name           = "iSeries",
--      .setup_arch     = iSeries_setup_arch,
--      .show_cpuinfo   = iSeries_show_cpuinfo,
--      .init_IRQ       = iSeries_init_IRQ,
--      .get_irq        = iSeries_get_irq,
--      .init_early     = iSeries_init_early,
--      .pcibios_fixup  = iSeries_pci_final_fixup,
--      .restart        = mf_reboot,
--      .power_off      = mf_power_off,
--      .halt           = mf_power_off,
--      .get_boot_time  = iSeries_get_boot_time,
--      .set_rtc_time   = iSeries_set_rtc_time,
--      .get_rtc_time   = iSeries_get_rtc_time,
--      .calibrate_decr = generic_calibrate_decr,
--      .progress       = iSeries_progress,
--      .probe          = iseries_probe,
--      .ioremap        = iseries_ioremap,
--      .iounmap        = iseries_iounmap,
-+      .name                   = "iSeries",
-+      .setup_arch             = iSeries_setup_arch,
-+      .show_cpuinfo           = iSeries_show_cpuinfo,
-+      .init_IRQ               = iSeries_init_IRQ,
-+      .get_irq                = iSeries_get_irq,
-+      .init_early             = iSeries_init_early,
-+      .pcibios_fixup          = iSeries_pci_final_fixup,
-+      .pcibios_fixup_resources= iSeries_pcibios_fixup_resources,
-+      .restart                = mf_reboot,
-+      .power_off              = mf_power_off,
-+      .halt                   = mf_power_off,
-+      .get_boot_time          = iSeries_get_boot_time,
-+      .set_rtc_time           = iSeries_set_rtc_time,
-+      .get_rtc_time           = iSeries_get_rtc_time,
-+      .calibrate_decr         = generic_calibrate_decr,
-+      .progress               = iSeries_progress,
-+      .probe                  = iseries_probe,
-+      .ioremap                = iseries_ioremap,
-+      .iounmap                = iseries_iounmap,
-       /* XXX Implement enable_pmcs for iSeries */
- };
---- a/arch/powerpc/platforms/iseries/setup.h
-+++ b/arch/powerpc/platforms/iseries/setup.h
-@@ -17,6 +17,7 @@
- #ifndef       __ISERIES_SETUP_H__
- #define       __ISERIES_SETUP_H__
-+extern void *iSeries_early_setup(void);
- extern unsigned long iSeries_get_boot_time(void);
- extern int iSeries_set_rtc_time(struct rtc_time *tm);
- extern void iSeries_get_rtc_time(struct rtc_time *tm);
---- a/arch/powerpc/platforms/iseries/vpdinfo.c
-+++ /dev/null
-@@ -1,275 +0,0 @@
--/*
-- * This code gets the card location of the hardware
-- * Copyright (C) 2001  <Allan H Trautman> <IBM Corp>
-- * Copyright (C) 2005  Stephen Rothwel, IBM Corp
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the:
-- * Free Software Foundation, Inc.,
-- * 59 Temple Place, Suite 330,
-- * Boston, MA  02111-1307  USA
-- *
-- * Change Activity:
-- *   Created, Feb 2, 2001
-- *   Ported to ppc64, August 20, 2001
-- * End Change Activity
-- */
--#include <linux/init.h>
--#include <linux/module.h>
--#include <linux/pci.h>
--
--#include <asm/types.h>
--#include <asm/resource.h>
--#include <asm/abs_addr.h>
--#include <asm/pci-bridge.h>
--#include <asm/iseries/hv_types.h>
--
--#include "pci.h"
--#include "call_pci.h"
--
--/*
-- * Size of Bus VPD data
-- */
--#define BUS_VPDSIZE      1024
--
--/*
-- * Bus Vpd Tags
-- */
--#define  VpdEndOfAreaTag   0x79
--#define  VpdIdStringTag    0x82
--#define  VpdVendorAreaTag  0x84
--
--/*
-- * Mfg Area Tags
-- */
--#define  VpdFruFrameId    0x4649     // "FI"
--#define  VpdSlotMapFormat 0x4D46     // "MF"
--#define  VpdSlotMap       0x534D     // "SM"
--
--/*
-- * Structures of the areas
-- */
--struct MfgVpdAreaStruct {
--      u16 Tag;
--      u8  TagLength;
--      u8  AreaData1;
--      u8  AreaData2;
--};
--typedef struct MfgVpdAreaStruct MfgArea;
--#define MFG_ENTRY_SIZE   3
--
--struct SlotMapStruct {
--      u8   AgentId;
--      u8   SecondaryAgentId;
--      u8   PhbId;
--      char CardLocation[3];
--      char Parms[8];
--      char Reserved[2];
--};
--typedef struct SlotMapStruct SlotMap;
--#define SLOT_ENTRY_SIZE   16
--
--/*
-- * Parse the Slot Area
-- */
--static void __init iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
--              HvAgentId agent, u8 *PhbId, char card[4])
--{
--      int SlotMapLen = MapLen;
--      SlotMap *SlotMapPtr = MapPtr;
--
--      /*
--       * Parse Slot label until we find the one requested
--       */
--      while (SlotMapLen > 0) {
--              if (SlotMapPtr->AgentId == agent) {
--                      /*
--                       * If Phb wasn't found, grab the entry first one found.
--                       */
--                      if (*PhbId == 0xff)
--                              *PhbId = SlotMapPtr->PhbId;
--                      /* Found it, extract the data. */
--                      if (SlotMapPtr->PhbId == *PhbId) {
--                              memcpy(card, &SlotMapPtr->CardLocation, 3);
--                              card[3]  = 0;
--                              break;
--                      }
--              }
--              /* Point to the next Slot */
--              SlotMapPtr = (SlotMap *)((char *)SlotMapPtr + SLOT_ENTRY_SIZE);
--              SlotMapLen -= SLOT_ENTRY_SIZE;
--      }
--}
--
--/*
-- * Parse the Mfg Area
-- */
--static void __init iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
--              HvAgentId agent, u8 *PhbId,
--              u8 *frame, char card[4])
--{
--      MfgArea *MfgAreaPtr = (MfgArea *)AreaData;
--      int MfgAreaLen = AreaLen;
--      u16 SlotMapFmt = 0;
--
--      /* Parse Mfg Data */
--      while (MfgAreaLen > 0) {
--              int MfgTagLen = MfgAreaPtr->TagLength;
--              /* Frame ID         (FI 4649020310 ) */
--              if (MfgAreaPtr->Tag == VpdFruFrameId)           /* FI  */
--                      *frame = MfgAreaPtr->AreaData1;
--              /* Slot Map Format  (MF 4D46020004 ) */
--              else if (MfgAreaPtr->Tag == VpdSlotMapFormat)   /* MF  */
--                      SlotMapFmt = (MfgAreaPtr->AreaData1 * 256)
--                              + MfgAreaPtr->AreaData2;
--              /* Slot Map         (SM 534D90 */
--              else if (MfgAreaPtr->Tag == VpdSlotMap) {       /* SM  */
--                      SlotMap *SlotMapPtr;
--
--                      if (SlotMapFmt == 0x1004)
--                              SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
--                                              + MFG_ENTRY_SIZE + 1);
--                      else
--                              SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
--                                              + MFG_ENTRY_SIZE);
--                      iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen,
--                                      agent, PhbId, card);
--              }
--              /*
--               * Point to the next Mfg Area
--               * Use defined size, sizeof give wrong answer
--               */
--              MfgAreaPtr = (MfgArea *)((char *)MfgAreaPtr + MfgTagLen
--                              + MFG_ENTRY_SIZE);
--              MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE);
--      }
--}
--
--/*
-- * Look for "BUS".. Data is not Null terminated.
-- * PHBID of 0xFF indicates PHB was not found in VPD Data.
-- */
--static int __init iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
--{
--      u8 *PhbPtr = AreaPtr;
--      int DataLen = AreaLength;
--      char PhbId = 0xFF;
--
--      while (DataLen > 0) {
--              if ((*PhbPtr == 'B') && (*(PhbPtr + 1) == 'U')
--                              && (*(PhbPtr + 2) == 'S')) {
--                      PhbPtr += 3;
--                      while (*PhbPtr == ' ')
--                              ++PhbPtr;
--                      PhbId = (*PhbPtr & 0x0F);
--                      break;
--              }
--              ++PhbPtr;
--              --DataLen;
--      }
--      return PhbId;
--}
--
--/*
-- * Parse out the VPD Areas
-- */
--static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
--              HvAgentId agent, u8 *frame, char card[4])
--{
--      u8 *TagPtr = VpdData;
--      int DataLen = VpdDataLen - 3;
--      u8 PhbId = 0xff;
--
--      while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) {
--              int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);
--              u8 *AreaData  = TagPtr + 3;
--
--              if (*TagPtr == VpdIdStringTag)
--                      PhbId = iSeries_Parse_PhbId(AreaData, AreaLen);
--              else if (*TagPtr == VpdVendorAreaTag)
--                      iSeries_Parse_MfgArea(AreaData, AreaLen,
--                                      agent, &PhbId, frame, card);
--              /* Point to next Area. */
--              TagPtr  = AreaData + AreaLen;
--              DataLen -= AreaLen;
--      }
--}
--
--static int __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
--              u8 *frame, char card[4])
--{
--      int status = 0;
--      int BusVpdLen = 0;
--      u8 *BusVpdPtr = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
--
--      if (BusVpdPtr == NULL) {
--              printk("PCI: Bus VPD Buffer allocation failure.\n");
--              return 0;
--      }
--      BusVpdLen = HvCallPci_getBusVpd(bus, iseries_hv_addr(BusVpdPtr),
--                                      BUS_VPDSIZE);
--      if (BusVpdLen == 0) {
--              printk("PCI: Bus VPD Buffer zero length.\n");
--              goto out_free;
--      }
--      /* printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); */
--      /* Make sure this is what I think it is */
--      if (*BusVpdPtr != VpdIdStringTag) {     /* 0x82 */
--              printk("PCI: Bus VPD Buffer missing starting tag.\n");
--              goto out_free;
--      }
--      iSeries_Parse_Vpd(BusVpdPtr, BusVpdLen, agent, frame, card);
--      status = 1;
--out_free:
--      kfree(BusVpdPtr);
--      return status;
--}
--
--/*
-- * Prints the device information.
-- * - Pass in pci_dev* pointer to the device.
-- * - Pass in the device count
-- *
-- * Format:
-- * PCI: Bus  0, Device 26, Vendor 0x12AE  Frame  1, Card  C10  Ethernet
-- * controller
-- */
--void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
--{
--      struct device_node *DevNode = PciDev->sysdata;
--      struct pci_dn *pdn;
--      u16 bus;
--      u8 frame = 0;
--      char card[4];
--      HvSubBusNumber subbus;
--      HvAgentId agent;
--
--      if (DevNode == NULL) {
--              printk("%d. PCI: iSeries_Device_Information DevNode is NULL\n",
--                              count);
--              return;
--      }
--
--      pdn = PCI_DN(DevNode);
--      bus = pdn->busno;
--      subbus = pdn->bussubno;
--      agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
--                      ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
--
--      if (iSeries_Get_Location_Code(bus, agent, &frame, card)) {
--              printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, "
--                      "Card %4s  0x%04X\n", count, bus,
--                      PCI_SLOT(PciDev->devfn), PciDev->vendor, frame,
--                      card, (int)(PciDev->class >> 8));
--      }
--}
---- a/arch/powerpc/platforms/maple/Kconfig
-+++ b/arch/powerpc/platforms/maple/Kconfig
-@@ -1,6 +1,7 @@
- config PPC_MAPLE
-       depends on PPC_MULTIPLATFORM && PPC64
-       bool "Maple 970FX Evaluation Board"
-+      select PCI
-       select MPIC
-       select U3_DART
-       select MPIC_U3_HT_IRQS
---- a/arch/powerpc/platforms/maple/pci.c
-+++ b/arch/powerpc/platforms/maple/pci.c
-@@ -558,7 +558,7 @@ void __init maple_pci_init(void)
-        * safe assumptions hopefully.
-        */
-       if (u3_agp) {
--              struct device_node *np = u3_agp->arch_data;
-+              struct device_node *np = u3_agp->dn;
-               PCI_DN(np)->busno = 0xf0;
-               for (np = np->child; np; np = np->sibling)
-                       PCI_DN(np)->busno = 0xf0;
---- a/arch/powerpc/platforms/maple/setup.c
-+++ b/arch/powerpc/platforms/maple/setup.c
-@@ -42,6 +42,7 @@
- #include <linux/serial.h>
- #include <linux/smp.h>
- #include <linux/bitops.h>
-+#include <linux/of_device.h>
- #include <asm/processor.h>
- #include <asm/sections.h>
-@@ -56,7 +57,6 @@
- #include <asm/dma.h>
- #include <asm/cputable.h>
- #include <asm/time.h>
--#include <asm/of_device.h>
- #include <asm/lmb.h>
- #include <asm/mpic.h>
- #include <asm/rtas.h>
---- a/arch/powerpc/platforms/pasemi/Kconfig
-+++ b/arch/powerpc/platforms/pasemi/Kconfig
-@@ -3,6 +3,7 @@ config PPC_PASEMI
-       bool "PA Semi SoC-based platforms"
-       default n
-       select MPIC
-+      select PCI
-       select PPC_UDBG_16550
-       select PPC_NATIVE
-       select MPIC_BROKEN_REGREAD
-@@ -17,7 +18,7 @@ config PPC_PASEMI_IOMMU
-       bool "PA Semi IOMMU support"
-       depends on PPC_PASEMI
-       help
--        IOMMU support for PA6T-1682M
-+        IOMMU support for PA Semi PWRficient
- config PPC_PASEMI_IOMMU_DMA_FORCE
-       bool "Force DMA engine to use IOMMU"
-@@ -36,13 +37,4 @@ config PPC_PASEMI_MDIO
-       help
-         Driver for MDIO via GPIO on PWRficient platforms
--config ELECTRA_IDE
--      tristate "Electra IDE driver"
--      default y
--      depends on PPC_PASEMI && ATA
--      select PATA_PLATFORM
--      help
--      This includes driver support for the Electra on-board IDE
--      interface.
--
- endmenu
---- a/arch/powerpc/platforms/pasemi/Makefile
-+++ b/arch/powerpc/platforms/pasemi/Makefile
-@@ -1,4 +1,3 @@
- obj-y += setup.o pci.o time.o idle.o powersave.o iommu.o
- obj-$(CONFIG_PPC_PASEMI_MDIO) += gpio_mdio.o
--obj-$(CONFIG_ELECTRA_IDE) += electra_ide.o
- obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += cpufreq.o
---- a/arch/powerpc/platforms/pasemi/cpufreq.c
-+++ b/arch/powerpc/platforms/pasemi/cpufreq.c
-@@ -32,6 +32,7 @@
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/time.h>
-+#include <asm/smp.h>
- #define SDCASR_REG            0x0100
- #define SDCASR_REG_STRIDE     0x1000
-@@ -124,6 +125,11 @@ static void set_astate(int cpu, unsigned
-       local_irq_restore(flags);
- }
-+int check_astate(void)
-+{
-+      return get_cur_astate(hard_smp_processor_id());
-+}
-+
- void restore_astate(int cpu)
- {
-       set_astate(cpu, current_astate);
-@@ -147,7 +153,10 @@ static int pas_cpufreq_cpu_init(struct c
-       if (!cpu)
-               goto out;
--      dn = of_find_compatible_node(NULL, "sdc", "1682m-sdc");
-+      dn = of_find_compatible_node(NULL, NULL, "1682m-sdc");
-+      if (!dn)
-+              dn = of_find_compatible_node(NULL, NULL,
-+                                           "pasemi,pwrficient-sdc");
-       if (!dn)
-               goto out;
-       err = of_address_to_resource(dn, 0, &res);
-@@ -160,7 +169,10 @@ static int pas_cpufreq_cpu_init(struct c
-               goto out;
-       }
--      dn = of_find_compatible_node(NULL, "gizmo", "1682m-gizmo");
-+      dn = of_find_compatible_node(NULL, NULL, "1682m-gizmo");
-+      if (!dn)
-+              dn = of_find_compatible_node(NULL, NULL,
-+                                           "pasemi,pwrficient-gizmo");
-       if (!dn) {
-               err = -ENODEV;
-               goto out_unmap_sdcasr;
-@@ -292,7 +304,8 @@ static struct cpufreq_driver pas_cpufreq
- static int __init pas_cpufreq_init(void)
- {
--      if (!machine_is_compatible("PA6T-1682M"))
-+      if (!machine_is_compatible("PA6T-1682M") &&
-+          !machine_is_compatible("pasemi,pwrficient"))
-               return -ENODEV;
-       return cpufreq_register_driver(&pas_cpufreq_driver);
---- a/arch/powerpc/platforms/pasemi/electra_ide.c
-+++ /dev/null
-@@ -1,96 +0,0 @@
--/*
-- * Copyright (C) 2007 PA Semi, Inc
-- *
-- * Maintained by: Olof Johansson <olof@lixom.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 by the Free Software Foundation.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-- */
--
--#include <linux/platform_device.h>
--
--#include <asm/prom.h>
--#include <asm/system.h>
--
--/* The electra IDE interface is incredibly simple: Just a device on the localbus
-- * with interrupts hooked up to one of the GPIOs. The device tree contains the
-- * address window and interrupt mappings already, and the pata_platform driver handles
-- * the rest. We just need to hook the two up.
-- */
--
--#define MAX_IFS       4       /* really, we have only one */
--
--static struct platform_device *pdevs[MAX_IFS];
--
--static int __devinit electra_ide_init(void)
--{
--      struct device_node *np;
--      struct resource r[3];
--      int ret = 0;
--      int i;
--
--      np = of_find_compatible_node(NULL, "ide", "electra-ide");
--      i = 0;
--
--      while (np && i < MAX_IFS) {
--              memset(r, 0, sizeof(r));
--
--              /* pata_platform wants two address ranges: one for the base registers,
--               * another for the control (altstatus). It's located at offset 0x3f6 in
--               * the window, but the device tree only has one large register window
--               * that covers both ranges. So we need to split it up by hand here:
--               */
--
--              ret = of_address_to_resource(np, 0, &r[0]);
--              if (ret)
--                      goto out;
--              ret = of_address_to_resource(np, 0, &r[1]);
--              if (ret)
--                      goto out;
--
--              r[1].start += 0x3f6;
--              r[0].end = r[1].start-1;
--
--              r[2].start = irq_of_parse_and_map(np, 0);
--              r[2].end = irq_of_parse_and_map(np, 0);
--              r[2].flags = IORESOURCE_IRQ;
--
--              pr_debug("registering platform device at 0x%lx/0x%lx, irq is %ld\n",
--                       r[0].start, r[1].start, r[2].start);
--              pdevs[i] = platform_device_register_simple("pata_platform", i, r, 3);
--              if (IS_ERR(pdevs[i])) {
--                      ret = PTR_ERR(pdevs[i]);
--                      pdevs[i] = NULL;
--                      goto out;
--              }
--              np = of_find_compatible_node(np, "ide", "electra-ide");
--      }
--out:
--      return ret;
--}
--module_init(electra_ide_init);
--
--static void __devexit electra_ide_exit(void)
--{
--      int i;
--
--      for (i = 0; i < MAX_IFS; i++)
--              if (pdevs[i])
--                      platform_device_unregister(pdevs[i]);
--}
--module_exit(electra_ide_exit);
--
--
--MODULE_LICENSE("GPL");
--MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
--MODULE_DESCRIPTION("PA Semi Electra IDE driver");
---- a/arch/powerpc/platforms/pasemi/gpio_mdio.c
-+++ b/arch/powerpc/platforms/pasemi/gpio_mdio.c
-@@ -30,7 +30,7 @@
- #include <linux/interrupt.h>
- #include <linux/phy.h>
- #include <linux/platform_device.h>
--#include <asm/of_platform.h>
-+#include <linux/of_platform.h>
- #define DELAY 1
-@@ -218,45 +218,27 @@ static int __devinit gpio_mdio_probe(str
-                                    const struct of_device_id *match)
- {
-       struct device *dev = &ofdev->dev;
--      struct device_node *np = ofdev->node;
--      struct device_node *gpio_np;
-+      struct device_node *phy_dn, *np = ofdev->node;
-       struct mii_bus *new_bus;
--      struct resource res;
-       struct gpio_priv *priv;
-       const unsigned int *prop;
--      int err = 0;
-+      int err;
-       int i;
--      gpio_np = of_find_compatible_node(NULL, "gpio", "1682m-gpio");
--
--      if (!gpio_np)
--              return -ENODEV;
--
--      err = of_address_to_resource(gpio_np, 0, &res);
--      of_node_put(gpio_np);
--
--      if (err)
--              return -EINVAL;
--
--      if (!gpio_regs)
--              gpio_regs = ioremap(res.start, 0x100);
--
--      if (!gpio_regs)
--              return -EPERM;
--
-+      err = -ENOMEM;
-       priv = kzalloc(sizeof(struct gpio_priv), GFP_KERNEL);
--      if (priv == NULL)
--              return -ENOMEM;
-+      if (!priv)
-+              goto out;
-       new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
--      if (new_bus == NULL)
--              return -ENOMEM;
-+      if (!new_bus)
-+              goto out_free_priv;
--      new_bus->name = "pasemi gpio mdio bus",
--      new_bus->read = &gpio_mdio_read,
--      new_bus->write = &gpio_mdio_write,
--      new_bus->reset = &gpio_mdio_reset,
-+      new_bus->name = "pasemi gpio mdio bus";
-+      new_bus->read = &gpio_mdio_read;
-+      new_bus->write = &gpio_mdio_write;
-+      new_bus->reset = &gpio_mdio_reset;
-       prop = of_get_property(np, "reg", NULL);
-       new_bus->id = *prop;
-@@ -265,9 +247,24 @@ static int __devinit gpio_mdio_probe(str
-       new_bus->phy_mask = 0;
-       new_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
--      for(i = 0; i < PHY_MAX_ADDR; ++i)
--              new_bus->irq[i] = irq_create_mapping(NULL, 10);
-+      if (!new_bus->irq)
-+              goto out_free_bus;
-+
-+      for (i = 0; i < PHY_MAX_ADDR; i++)
-+              new_bus->irq[i] = NO_IRQ;
-+
-+      for (phy_dn = of_get_next_child(np, NULL);
-+           phy_dn != NULL;
-+           phy_dn = of_get_next_child(np, phy_dn)) {
-+              const unsigned int *ip, *regp;
-+
-+              ip = of_get_property(phy_dn, "interrupts", NULL);
-+              regp = of_get_property(phy_dn, "reg", NULL);
-+              if (!ip || !regp || *regp >= PHY_MAX_ADDR)
-+                      continue;
-+              new_bus->irq[*regp] = irq_create_mapping(NULL, *ip);
-+      }
-       prop = of_get_property(np, "mdc-pin", NULL);
-       priv->mdc_pin = *prop;
-@@ -280,17 +277,21 @@ static int __devinit gpio_mdio_probe(str
-       err = mdiobus_register(new_bus);
--      if (0 != err) {
-+      if (err != 0) {
-               printk(KERN_ERR "%s: Cannot register as MDIO bus, err %d\n",
-                               new_bus->name, err);
--              goto bus_register_fail;
-+              goto out_free_irq;
-       }
-       return 0;
--bus_register_fail:
-+out_free_irq:
-+      kfree(new_bus->irq);
-+out_free_bus:
-       kfree(new_bus);
--
-+out_free_priv:
-+      kfree(priv);
-+out:
-       return err;
- }
-@@ -317,6 +318,7 @@ static struct of_device_id gpio_mdio_mat
-       },
-       {},
- };
-+MODULE_DEVICE_TABLE(of, gpio_mdio_match);
- static struct of_platform_driver gpio_mdio_driver =
- {
-@@ -330,12 +332,32 @@ static struct of_platform_driver gpio_md
- int gpio_mdio_init(void)
- {
-+      struct device_node *np;
-+
-+      np = of_find_compatible_node(NULL, NULL, "1682m-gpio");
-+      if (!np)
-+              np = of_find_compatible_node(NULL, NULL,
-+                                           "pasemi,pwrficient-gpio");
-+      if (!np)
-+              return -ENODEV;
-+      gpio_regs = of_iomap(np, 0);
-+      of_node_put(np);
-+
-+      if (!gpio_regs)
-+              return -ENODEV;
-+
-       return of_register_platform_driver(&gpio_mdio_driver);
- }
-+module_init(gpio_mdio_init);
- void gpio_mdio_exit(void)
- {
-       of_unregister_platform_driver(&gpio_mdio_driver);
-+      if (gpio_regs)
-+              iounmap(gpio_regs);
- }
--device_initcall(gpio_mdio_init);
-+module_exit(gpio_mdio_exit);
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Olof Johansson <olof@lixom.net>");
-+MODULE_DESCRIPTION("Driver for MDIO over GPIO on PA Semi PWRficient-based boards");
---- a/arch/powerpc/platforms/pasemi/idle.c
-+++ b/arch/powerpc/platforms/pasemi/idle.c
-@@ -74,9 +74,6 @@ static int pasemi_system_reset_exception
- static int __init pasemi_idle_init(void)
- {
--      if (!machine_is(pasemi))
--              return -ENODEV;
--
- #ifndef CONFIG_PPC_PASEMI_CPUFREQ
-       printk(KERN_WARNING "No cpufreq driver, powersavings modes disabled\n");
-       current_mode = 0;
-@@ -88,7 +85,7 @@ static int __init pasemi_idle_init(void)
-       return 0;
- }
--late_initcall(pasemi_idle_init);
-+machine_late_initcall(pasemi, pasemi_idle_init);
- static int __init idle_param(char *p)
- {
---- a/arch/powerpc/platforms/pasemi/pasemi.h
-+++ b/arch/powerpc/platforms/pasemi/pasemi.h
-@@ -16,8 +16,14 @@ extern void idle_doze(void);
- /* Restore astate to last set */
- #ifdef CONFIG_PPC_PASEMI_CPUFREQ
-+extern int check_astate(void);
- extern void restore_astate(int cpu);
- #else
-+static inline int check_astate(void)
-+{
-+      /* Always return >0 so we never power save */
-+      return 1;
-+}
- static inline void restore_astate(int cpu)
- {
- }
---- a/arch/powerpc/platforms/pasemi/powersave.S
-+++ b/arch/powerpc/platforms/pasemi/powersave.S
-@@ -62,7 +62,16 @@ sleep_common:
-       mflr    r0
-       std     r0, 16(r1)
-       stdu    r1,-64(r1)
-+#ifdef CONFIG_PPC_PASEMI_CPUFREQ
-+      std     r3, 48(r1)
-+      /* Only do power savings when in astate 0 */
-+      bl      .check_astate
-+      cmpwi   r3,0
-+      bne     1f
-+
-+      ld      r3, 48(r1)
-+#endif
-       LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
-       mfmsr   r4
-       andc    r5,r4,r6
-@@ -73,7 +82,7 @@ sleep_common:
-       mtmsrd  r4,0
--      addi    r1,r1,64
-+1:    addi    r1,r1,64
-       ld      r0,16(r1)
-       mtlr    r0
-       blr
---- a/arch/powerpc/platforms/pasemi/setup.c
-+++ b/arch/powerpc/platforms/pasemi/setup.c
-@@ -27,6 +27,7 @@
- #include <linux/delay.h>
- #include <linux/console.h>
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
- #include <asm/prom.h>
- #include <asm/system.h>
-@@ -35,7 +36,7 @@
- #include <asm/mpic.h>
- #include <asm/smp.h>
- #include <asm/time.h>
--#include <asm/of_platform.h>
-+#include <asm/mmu.h>
- #include <pcmcia/ss.h>
- #include <pcmcia/cistpl.h>
-@@ -43,6 +44,10 @@
- #include "pasemi.h"
-+#if !defined(CONFIG_SMP)
-+static void smp_send_stop(void) {}
-+#endif
-+
- /* SDC reset register, must be pre-mapped at reset time */
- static void __iomem *reset_reg;
-@@ -56,10 +61,14 @@ struct mce_regs {
- static struct mce_regs mce_regs[MAX_MCE_REGS];
- static int num_mce_regs;
-+static int nmi_virq = NO_IRQ;
- static void pas_restart(char *cmd)
- {
-+      /* Need to put others cpu in hold loop so they're not sleeping */
-+      smp_send_stop();
-+      udelay(10000);
-       printk("Restarting...\n");
-       while (1)
-               out_le32(reset_reg, 0x6000000);
-@@ -126,9 +135,6 @@ static int __init pas_setup_mce_regs(voi
-       struct pci_dev *dev;
-       int reg;
--      if (!machine_is(pasemi))
--              return -ENODEV;
--
-       /* Remap various SoC status registers for use by the MCE handler */
-       reg = 0;
-@@ -172,7 +178,7 @@ static int __init pas_setup_mce_regs(voi
-       return 0;
- }
--device_initcall(pas_setup_mce_regs);
-+machine_device_initcall(pasemi, pas_setup_mce_regs);
- static __init void pas_init_IRQ(void)
- {
-@@ -181,6 +187,8 @@ static __init void pas_init_IRQ(void)
-       unsigned long openpic_addr;
-       const unsigned int *opprop;
-       int naddr, opplen;
-+      int mpic_flags;
-+      const unsigned int *nmiprop;
-       struct mpic *mpic;
-       mpic_node = NULL;
-@@ -213,13 +221,26 @@ static __init void pas_init_IRQ(void)
-       openpic_addr = of_read_number(opprop, naddr);
-       printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
-+      mpic_flags = MPIC_PRIMARY | MPIC_LARGE_VECTORS | MPIC_NO_BIAS;
-+
-+      nmiprop = of_get_property(mpic_node, "nmi-source", NULL);
-+      if (nmiprop)
-+              mpic_flags |= MPIC_ENABLE_MCK;
-+
-       mpic = mpic_alloc(mpic_node, openpic_addr,
--                        MPIC_PRIMARY|MPIC_LARGE_VECTORS,
--                        0, 0, " PAS-OPIC  ");
-+                        mpic_flags, 0, 0, "PASEMI-OPIC");
-       BUG_ON(!mpic);
-       mpic_assign_isu(mpic, 0, openpic_addr + 0x10000);
-       mpic_init(mpic);
-+      /* The NMI/MCK source needs to be prio 15 */
-+      if (nmiprop) {
-+              nmi_virq = irq_create_mapping(NULL, *nmiprop);
-+              mpic_irq_set_priority(nmi_virq, 15);
-+              set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
-+              mpic_unmask_irq(nmi_virq);
-+      }
-+
-       of_node_put(mpic_node);
-       of_node_put(root);
- }
-@@ -239,6 +260,14 @@ static int pas_machine_check_handler(str
-       srr0 = regs->nip;
-       srr1 = regs->msr;
-+
-+      if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
-+              printk(KERN_ERR "NMI delivered\n");
-+              debugger(regs);
-+              mpic_end_irq(nmi_virq);
-+              goto out;
-+      }
-+
-       dsisr = mfspr(SPRN_DSISR);
-       printk(KERN_ERR "Machine Check on CPU %d\n", cpu);
-       printk(KERN_ERR "SRR0  0x%016lx SRR1 0x%016lx\n", srr0, srr1);
-@@ -295,14 +324,14 @@ static int pas_machine_check_handler(str
-               int i;
-               printk(KERN_ERR "slb contents:\n");
--              for (i = 0; i < SLB_NUM_ENTRIES; i++) {
-+              for (i = 0; i < mmu_slb_size; i++) {
-                       asm volatile("slbmfee  %0,%1" : "=r" (e) : "r" (i));
-                       asm volatile("slbmfev  %0,%1" : "=r" (v) : "r" (i));
-                       printk(KERN_ERR "%02d %016lx %016lx\n", i, e, v);
-               }
-       }
--
-+out:
-       /* SRR1[62] is from MSR[62] if recoverable, so pass that back */
-       return !!(srr1 & 0x2);
- }
-@@ -362,16 +391,17 @@ static inline void pasemi_pcmcia_init(vo
- static struct of_device_id pasemi_bus_ids[] = {
-+      /* Unfortunately needed for legacy firmwares */
-       { .type = "localbus", },
-       { .type = "sdc", },
-+      /* These are the proper entries, which newer firmware uses */
-+      { .compatible = "pasemi,localbus", },
-+      { .compatible = "pasemi,sdc", },
-       {},
- };
- static int __init pasemi_publish_devices(void)
- {
--      if (!machine_is(pasemi))
--              return 0;
--
-       pasemi_pcmcia_init();
-       /* Publish OF platform devices for SDC and other non-PCI devices */
-@@ -379,7 +409,7 @@ static int __init pasemi_publish_devices
-       return 0;
- }
--device_initcall(pasemi_publish_devices);
-+machine_device_initcall(pasemi, pasemi_publish_devices);
- /*
-@@ -389,7 +419,8 @@ static int __init pas_probe(void)
- {
-       unsigned long root = of_get_flat_dt_root();
--      if (!of_flat_dt_is_compatible(root, "PA6T-1682M"))
-+      if (!of_flat_dt_is_compatible(root, "PA6T-1682M") &&
-+          !of_flat_dt_is_compatible(root, "pasemi,pwrficient"))
-               return 0;
-       hpte_init_native();
-@@ -400,7 +431,7 @@ static int __init pas_probe(void)
- }
- define_machine(pasemi) {
--      .name                   = "PA Semi PA6T-1682M",
-+      .name                   = "PA Semi PWRficient",
-       .probe                  = pas_probe,
-       .setup_arch             = pas_setup_arch,
-       .init_early             = pas_init_early,
---- a/arch/powerpc/platforms/powermac/low_i2c.c
-+++ b/arch/powerpc/platforms/powermac/low_i2c.c
-@@ -585,8 +585,7 @@ static void __init kw_i2c_probe(void)
-       struct device_node *np, *child, *parent;
-       /* Probe keywest-i2c busses */
--      for (np = NULL;
--           (np = of_find_compatible_node(np, "i2c","keywest-i2c")) != NULL;){
-+      for_each_compatible_node(np, "i2c","keywest-i2c") {
-               struct pmac_i2c_host_kw *host;
-               int multibus, chans, i;
-@@ -1462,9 +1461,6 @@ int __init pmac_i2c_init(void)
-               return 0;
-       i2c_inited = 1;
--      if (!machine_is(powermac))
--              return 0;
--
-       /* Probe keywest-i2c busses */
-       kw_i2c_probe();
-@@ -1483,7 +1479,7 @@ int __init pmac_i2c_init(void)
-       return 0;
- }
--arch_initcall(pmac_i2c_init);
-+machine_arch_initcall(powermac, pmac_i2c_init);
- /* Since pmac_i2c_init can be called too early for the platform device
-  * registration, we need to do it at a later time. In our case, subsys
-@@ -1515,4 +1511,4 @@ static int __init pmac_i2c_create_platfo
-       return 0;
- }
--subsys_initcall(pmac_i2c_create_platform_devices);
-+machine_subsys_initcall(powermac, pmac_i2c_create_platform_devices);
---- a/arch/powerpc/platforms/powermac/pci.c
-+++ b/arch/powerpc/platforms/powermac/pci.c
-@@ -40,8 +40,6 @@
- static int has_uninorth;
- #ifdef CONFIG_PPC64
- static struct pci_controller *u3_agp;
--static struct pci_controller *u4_pcie;
--static struct pci_controller *u3_ht;
- #else
- static int has_second_ohare;
- #endif /* CONFIG_PPC64 */
-@@ -314,12 +312,15 @@ static int u3_ht_skip_device(struct pci_
-       /* We only allow config cycles to devices that are in OF device-tree
-        * as we are apparently having some weird things going on with some
--       * revs of K2 on recent G5s
-+       * revs of K2 on recent G5s, except for the host bridge itself, which
-+       * is missing from the tree but we know we can probe.
-        */
-       if (bus->self)
-               busdn = pci_device_to_OF_node(bus->self);
-+      else if (devfn == 0)
-+              return 0;
-       else
--              busdn = hose->arch_data;
-+              busdn = hose->dn;
-       for (dn = busdn->child; dn; dn = dn->sibling)
-               if (PCI_DN(dn) && PCI_DN(dn)->devfn == devfn)
-                       break;
-@@ -344,14 +345,15 @@ static int u3_ht_skip_device(struct pci_
-               + (((unsigned int)bus) << 16) \
-               + 0x01000000UL)
--static volatile void __iomem *u3_ht_cfg_access(struct pci_controller* hose,
--                                           u8 bus, u8 devfn, u8 offset)
-+static void __iomem *u3_ht_cfg_access(struct pci_controller *hose, u8 bus,
-+                                    u8 devfn, u8 offset, int *swap)
- {
-+      *swap = 1;
-       if (bus == hose->first_busno) {
--              /* For now, we don't self probe U3 HT bridge */
--              if (PCI_SLOT(devfn) == 0)
--                      return NULL;
--              return hose->cfg_data + U3_HT_CFA0(devfn, offset);
-+              if (devfn != 0)
-+                      return hose->cfg_data + U3_HT_CFA0(devfn, offset);
-+              *swap = 0;
-+              return ((void __iomem *)hose->cfg_addr) + (offset << 2);
-       } else
-               return hose->cfg_data + U3_HT_CFA1(bus, devfn, offset);
- }
-@@ -360,14 +362,15 @@ static int u3_ht_read_config(struct pci_
-                                   int offset, int len, u32 *val)
- {
-       struct pci_controller *hose;
--      volatile void __iomem *addr;
-+      void __iomem *addr;
-+      int swap;
-       hose = pci_bus_to_host(bus);
-       if (hose == NULL)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       if (offset >= 0x100)
-               return  PCIBIOS_BAD_REGISTER_NUMBER;
--      addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
-+      addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
-       if (!addr)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-@@ -397,10 +400,10 @@ static int u3_ht_read_config(struct pci_
-               *val = in_8(addr);
-               break;
-       case 2:
--              *val = in_le16(addr);
-+              *val = swap ? in_le16(addr) : in_be16(addr);
-               break;
-       default:
--              *val = in_le32(addr);
-+              *val = swap ? in_le32(addr) : in_be32(addr);
-               break;
-       }
-       return PCIBIOS_SUCCESSFUL;
-@@ -410,14 +413,15 @@ static int u3_ht_write_config(struct pci
-                                    int offset, int len, u32 val)
- {
-       struct pci_controller *hose;
--      volatile void __iomem *addr;
-+      void __iomem *addr;
-+      int swap;
-       hose = pci_bus_to_host(bus);
-       if (hose == NULL)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       if (offset >= 0x100)
-               return  PCIBIOS_BAD_REGISTER_NUMBER;
--      addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
-+      addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
-       if (!addr)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-@@ -439,10 +443,10 @@ static int u3_ht_write_config(struct pci
-               out_8(addr, val);
-               break;
-       case 2:
--              out_le16(addr, val);
-+              swap ? out_le16(addr, val) : out_be16(addr, val);
-               break;
-       default:
--              out_le32((u32 __iomem *)addr, val);
-+              swap ? out_le32(addr, val) : out_be32(addr, val);
-               break;
-       }
-       return PCIBIOS_SUCCESSFUL;
-@@ -725,7 +729,7 @@ static void __init setup_bandit(struct p
- static int __init setup_uninorth(struct pci_controller *hose,
-                                struct resource *addr)
- {
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       has_uninorth = 1;
-       hose->ops = &macrisc_pci_ops;
-       hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000);
-@@ -773,31 +777,72 @@ static void __init setup_u4_pcie(struct 
-        */
-       hose->first_busno = 0x00;
-       hose->last_busno = 0xff;
--      u4_pcie = hose;
- }
--static void __init setup_u3_ht(struct pci_controller* hose)
-+static void __init parse_region_decode(struct pci_controller *hose,
-+                                     u32 decode)
- {
--      struct device_node *np = (struct device_node *)hose->arch_data;
--      struct pci_controller *other = NULL;
--      int i, cur;
-+      unsigned long base, end, next = -1;
-+      int i, cur = -1;
-+      /* Iterate through all bits. We ignore the last bit as this region is
-+       * reserved for the ROM among other niceties
-+       */
-+      for (i = 0; i < 31; i++) {
-+              if ((decode & (0x80000000 >> i)) == 0)
-+                      continue;
-+              if (i < 16) {
-+                      base = 0xf0000000 | (((u32)i) << 24);
-+                      end = base + 0x00ffffff;
-+              } else {
-+                      base = ((u32)i-16) << 28;
-+                      end = base + 0x0fffffff;
-+              }
-+              if (base != next) {
-+                      if (++cur >= 3) {
-+                              printk(KERN_WARNING "PCI: Too many ranges !\n");
-+                              break;
-+                      }
-+                      hose->mem_resources[cur].flags = IORESOURCE_MEM;
-+                      hose->mem_resources[cur].name = hose->dn->full_name;
-+                      hose->mem_resources[cur].start = base;
-+                      hose->mem_resources[cur].end = end;
-+                      DBG("  %d: 0x%08lx-0x%08lx\n", cur, base, end);
-+              } else {
-+                      DBG("   :           -0x%08lx\n", end);
-+                      hose->mem_resources[cur].end = end;
-+              }
-+              next = end + 1;
-+      }
-+}
-+
-+static void __init setup_u3_ht(struct pci_controller* hose)
-+{
-+      struct device_node *np = hose->dn;
-+      struct resource cfg_res, self_res;
-+      u32 decode;
-       hose->ops = &u3_ht_pci_ops;
--      /* We hard code the address because of the different size of
--       * the reg address cell, we shall fix that by killing struct
--       * reg_property and using some accessor functions instead
-+      /* Get base addresses from OF tree
-        */
--      hose->cfg_data = ioremap(0xf2000000, 0x02000000);
-+      if (of_address_to_resource(np, 0, &cfg_res) ||
-+          of_address_to_resource(np, 1, &self_res)) {
-+              printk(KERN_ERR "PCI: Failed to get U3/U4 HT resources !\n");
-+              return;
-+      }
-+
-+      /* Map external cfg space access into cfg_data and self registers
-+       * into cfg_addr
-+       */
-+      hose->cfg_data = ioremap(cfg_res.start, 0x02000000);
-+      hose->cfg_addr = ioremap(self_res.start,
-+                               self_res.end - self_res.start + 1);
-       /*
--       * /ht node doesn't expose a "ranges" property, so we "remove"
--       * regions that have been allocated to AGP. So far, this version of
--       * the code doesn't assign any of the 0xfxxxxxxx "fine" memory regions
--       * to /ht. We need to fix that sooner or later by either parsing all
--       * child "ranges" properties or figuring out the U3 address space
--       * decoding logic and then read its configuration register (if any).
-+       * /ht node doesn't expose a "ranges" property, we read the register
-+       * that controls the decoding logic and use that for memory regions.
-+       * The IO region is hard coded since it is fixed in HW as well.
-        */
-       hose->io_base_phys = 0xf4000000;
-       hose->pci_io_size = 0x00400000;
-@@ -808,76 +853,33 @@ static void __init setup_u3_ht(struct pc
-       hose->pci_mem_offset = 0;
-       hose->first_busno = 0;
-       hose->last_busno = 0xef;
--      hose->mem_resources[0].name = np->full_name;
--      hose->mem_resources[0].start = 0x80000000;
--      hose->mem_resources[0].end = 0xefffffff;
--      hose->mem_resources[0].flags = IORESOURCE_MEM;
--
--      u3_ht = hose;
--
--      if (u3_agp != NULL)
--              other = u3_agp;
--      else if (u4_pcie != NULL)
--              other = u4_pcie;
--      if (other == NULL) {
--              DBG("U3/4 has no AGP/PCIE, using full resource range\n");
--              return;
--      }
-+      /* Note: fix offset when cfg_addr becomes a void * */
-+      decode = in_be32(hose->cfg_addr + 0x80);
--      /* Fixup bus range vs. PCIE */
--      if (u4_pcie)
--              hose->last_busno = u4_pcie->first_busno - 1;
--
--      /* We "remove" the AGP resources from the resources allocated to HT,
--       * that is we create "holes". However, that code does assumptions
--       * that so far happen to be true (cross fingers...), typically that
--       * resources in the AGP node are properly ordered
--       */
--      cur = 0;
--      for (i=0; i<3; i++) {
--              struct resource *res = &other->mem_resources[i];
--              if (res->flags != IORESOURCE_MEM)
--                      continue;
--              /* We don't care about "fine" resources */
--              if (res->start >= 0xf0000000)
--                      continue;
--              /* Check if it's just a matter of "shrinking" us in one
--               * direction
--               */
--              if (hose->mem_resources[cur].start == res->start) {
--                      DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n",
--                          cur, hose->mem_resources[cur].start,
--                          res->end + 1);
--                      hose->mem_resources[cur].start = res->end + 1;
--                      continue;
--              }
--              if (hose->mem_resources[cur].end == res->end) {
--                      DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n",
--                          cur, hose->mem_resources[cur].end,
--                          res->start - 1);
--                      hose->mem_resources[cur].end = res->start - 1;
--                      continue;
--              }
--              /* No, it's not the case, we need a hole */
--              if (cur == 2) {
--                      /* not enough resources for a hole, we drop part
--                       * of the range
--                       */
--                      printk(KERN_WARNING "Running out of resources"
--                             " for /ht host !\n");
--                      hose->mem_resources[cur].end = res->start - 1;
--                      continue;
--              }
--              cur++;
--              DBG("U3/HT: hole, %d end at %08lx, %d start at %08lx\n",
--                  cur-1, res->start - 1, cur, res->end + 1);
--              hose->mem_resources[cur].name = np->full_name;
--              hose->mem_resources[cur].flags = IORESOURCE_MEM;
--              hose->mem_resources[cur].start = res->end + 1;
--              hose->mem_resources[cur].end = hose->mem_resources[cur-1].end;
--              hose->mem_resources[cur-1].end = res->start - 1;
--      }
-+      DBG("PCI: Apple HT bridge decode register: 0x%08x\n", decode);
-+
-+      /* NOTE: The decode register setup is a bit weird... region
-+       * 0xf8000000 for example is marked as enabled in there while it's
-+       & actually the memory controller registers.
-+       * That means that we are incorrectly attributing it to HT.
-+       *
-+       * In a similar vein, region 0xf4000000 is actually the HT IO space but
-+       * also marked as enabled in here and 0xf9000000 is used by some other
-+       * internal bits of the northbridge.
-+       *
-+       * Unfortunately, we can't just mask out those bit as we would end
-+       * up with more regions than we can cope (linux can only cope with
-+       * 3 memory regions for a PHB at this stage).
-+       *
-+       * So for now, we just do a little hack. We happen to -know- that
-+       * Apple firmware doesn't assign things below 0xfa000000 for that
-+       * bridge anyway so we mask out all bits we don't want.
-+       */
-+      decode &= 0x003fffff;
-+
-+      /* Now parse the resulting bits and build resources */
-+      parse_region_decode(hose, decode);
- }
- #endif /* CONFIG_PPC64 */
-@@ -994,6 +996,8 @@ void __init pmac_pci_init(void)
-       struct device_node *np, *root;
-       struct device_node *ht = NULL;
-+      ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN;
-+
-       root = of_find_node_by_path("/");
-       if (root == NULL) {
-               printk(KERN_CRIT "pmac_pci_init: can't find root "
-@@ -1032,15 +1036,15 @@ void __init pmac_pci_init(void)
-        * future though
-        */
-       if (u3_agp) {
--              struct device_node *np = u3_agp->arch_data;
-+              struct device_node *np = u3_agp->dn;
-               PCI_DN(np)->busno = 0xf0;
-               for (np = np->child; np; np = np->sibling)
-                       PCI_DN(np)->busno = 0xf0;
-       }
-       /* pmac_check_ht_link(); */
--      /* Tell pci.c to not use the common resource allocation mechanism */
--      pci_probe_only = 1;
-+      /* We can allocate missing resources if any */
-+      pci_probe_only = 0;
- #else /* CONFIG_PPC64 */
-       init_p2pbridge();
-@@ -1051,13 +1055,13 @@ void __init pmac_pci_init(void)
-        * some offset between bus number and domains for now when we
-        * assign all busses should help for now
-        */
--      if (pci_assign_all_buses)
-+      if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
-               pcibios_assign_bus_offset = 0x10;
- #endif
- }
--int
--pmac_pci_enable_device_hook(struct pci_dev *dev, int initial)
-+#ifdef CONFIG_PPC32
-+int pmac_pci_enable_device_hook(struct pci_dev *dev)
- {
-       struct device_node* node;
-       int updatecfg = 0;
-@@ -1099,24 +1103,21 @@ pmac_pci_enable_device_hook(struct pci_d
-               updatecfg = 1;
-       }
-+      /*
-+       * Fixup various header fields on 32 bits. We don't do that on
-+       * 64 bits as some of these have strange values behind the HT
-+       * bridge and we must not, for example, enable MWI or set the
-+       * cache line size on them.
-+       */
-       if (updatecfg) {
-               u16 cmd;
--              /*
--               * Make sure PCI is correctly configured
--               *
--               * We use old pci_bios versions of the function since, by
--               * default, gmac is not powered up, and so will be absent
--               * from the kernel initial PCI lookup.
--               *
--               * Should be replaced by 2.4 new PCI mechanisms and really
--               * register the device.
--               */
-               pci_read_config_word(dev, PCI_COMMAND, &cmd);
-               cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
-                       | PCI_COMMAND_INVALIDATE;
-               pci_write_config_word(dev, PCI_COMMAND, cmd);
-               pci_write_config_byte(dev, PCI_LATENCY_TIMER, 16);
-+
-               pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
-                                     L1_CACHE_BYTES >> 2);
-       }
-@@ -1124,6 +1125,18 @@ pmac_pci_enable_device_hook(struct pci_d
-       return 0;
- }
-+void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev)
-+{
-+      struct device_node *node = pci_device_to_OF_node(dev);
-+
-+      /* We don't want to assign resources to USB controllers
-+       * absent from the OF tree (iBook second controller)
-+       */
-+      if (dev->class == PCI_CLASS_SERIAL_USB_OHCI && !node)
-+              dev->resource[0].flags = 0;
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, PCI_ANY_ID, pmac_pci_fixup_ohci);
-+
- /* We power down some devices after they have been probed. They'll
-  * be powered back on later on
-  */
-@@ -1171,7 +1184,6 @@ void __init pmac_pcibios_after_init(void
-       of_node_put(nd);
- }
--#ifdef CONFIG_PPC32
- void pmac_pci_fixup_cardbus(struct pci_dev* dev)
- {
-       if (!machine_is(powermac))
-@@ -1259,7 +1271,7 @@ void pmac_pci_fixup_pciata(struct pci_de
-       }
- }
- DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata);
--#endif
-+#endif /* CONFIG_PPC32 */
- /*
-  * Disable second function on K2-SATA, it's broken
---- a/arch/powerpc/platforms/powermac/pfunc_base.c
-+++ b/arch/powerpc/platforms/powermac/pfunc_base.c
-@@ -363,8 +363,7 @@ int __init pmac_pfunc_base_install(void)
-       return 0;
- }
--
--arch_initcall(pmac_pfunc_base_install);
-+machine_arch_initcall(powermac, pmac_pfunc_base_install);
- #ifdef CONFIG_PM
---- a/arch/powerpc/platforms/powermac/pic.c
-+++ b/arch/powerpc/platforms/powermac/pic.c
-@@ -690,6 +690,5 @@ static int __init init_pmacpic_sysfs(voi
-       sysdev_driver_register(&pmacpic_sysclass, &driver_pmacpic);
-       return 0;
- }
--
--subsys_initcall(init_pmacpic_sysfs);
-+machine_subsys_initcall(powermac, init_pmacpic_sysfs);
---- a/arch/powerpc/platforms/powermac/pmac.h
-+++ b/arch/powerpc/platforms/powermac/pmac.h
-@@ -26,7 +26,7 @@ extern void pmac_pci_init(void);
- extern void pmac_nvram_update(void);
- extern unsigned char pmac_nvram_read_byte(int addr);
- extern void pmac_nvram_write_byte(int addr, unsigned char val);
--extern int pmac_pci_enable_device_hook(struct pci_dev *dev, int initial);
-+extern int pmac_pci_enable_device_hook(struct pci_dev *dev);
- extern void pmac_pcibios_after_init(void);
- extern int of_show_percpuinfo(struct seq_file *m, int i);
---- a/arch/powerpc/platforms/powermac/setup.c
-+++ b/arch/powerpc/platforms/powermac/setup.c
-@@ -51,6 +51,8 @@
- #include <linux/root_dev.h>
- #include <linux/bitops.h>
- #include <linux/suspend.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
- #include <asm/reg.h>
- #include <asm/sections.h>
-@@ -68,8 +70,6 @@
- #include <asm/btext.h>
- #include <asm/pmac_feature.h>
- #include <asm/time.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/mmu_context.h>
- #include <asm/iommu.h>
- #include <asm/smu.h>
-@@ -94,7 +94,6 @@ extern struct machdep_calls pmac_md;
- #define DEFAULT_ROOT_DEVICE Root_SDA1 /* sda1 - slightly silly choice */
- #ifdef CONFIG_PPC64
--#include <asm/udbg.h>
- int sccdbg;
- #endif
-@@ -398,17 +397,13 @@ static int initializing = 1;
- static int pmac_late_init(void)
- {
--      if (!machine_is(powermac))
--              return -ENODEV;
--
-       initializing = 0;
-       /* this is udbg (which is __init) and we can later use it during
-        * cpu hotplug (in smp_core99_kick_cpu) */
-       ppc_md.progress = NULL;
-       return 0;
- }
--
--late_initcall(pmac_late_init);
-+machine_late_initcall(powermac, pmac_late_init);
- /*
-  * This is __init_refok because we check for "initializing" before
-@@ -535,9 +530,6 @@ static int __init pmac_declare_of_platfo
-       if (machine_is(chrp))
-               return -1;
--      if (!machine_is(powermac))
--              return 0;
--
-       np = of_find_node_by_name(NULL, "valkyrie");
-       if (np)
-               of_platform_device_create(np, "valkyrie", NULL);
-@@ -552,8 +544,7 @@ static int __init pmac_declare_of_platfo
-       return 0;
- }
--
--device_initcall(pmac_declare_of_platform_devices);
-+machine_device_initcall(powermac, pmac_declare_of_platform_devices);
- /*
-  * Called very early, MMU is off, device-tree isn't unflattened
-@@ -613,9 +604,11 @@ static int pmac_pci_probe_mode(struct pc
-       /* We need to use normal PCI probing for the AGP bus,
-        * since the device for the AGP bridge isn't in the tree.
-+       * Same for the PCIe host on U4 and the HT host bridge.
-        */
-       if (bus->self == NULL && (of_device_is_compatible(node, "u3-agp") ||
--                                of_device_is_compatible(node, "u4-pcie")))
-+                                of_device_is_compatible(node, "u4-pcie") ||
-+                                of_device_is_compatible(node, "u3-ht")))
-               return PCI_PROBE_NORMAL;
-       return PCI_PROBE_DEVTREE;
- }
---- a/arch/powerpc/platforms/powermac/time.c
-+++ b/arch/powerpc/platforms/powermac/time.c
-@@ -84,12 +84,14 @@ long __init pmac_time_init(void)
-       return delta;
- }
-+#if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU)
- static void to_rtc_time(unsigned long now, struct rtc_time *tm)
- {
-       to_tm(now, tm);
-       tm->tm_year -= 1900;
-       tm->tm_mon -= 1;
- }
-+#endif
- static unsigned long from_rtc_time(struct rtc_time *tm)
- {
---- a/arch/powerpc/platforms/ps3/Kconfig
-+++ b/arch/powerpc/platforms/ps3/Kconfig
-@@ -61,17 +61,6 @@ config PS3_DYNAMIC_DMA
-         This support is mainly for Linux kernel development.  If unsure,
-         say N.
--config PS3_USE_LPAR_ADDR
--      depends on PPC_PS3 && EXPERIMENTAL
--      bool "PS3 use lpar address space"
--      default y
--      help
--        This option is solely for experimentation by experts.  Disables
--        translation of lpar addresses.  SPE support currently won't work
--        without this set to y.
--
--        If you have any doubt, choose the default y.
--
- config PS3_VUART
-       depends on PPC_PS3
-       tristate
-@@ -138,4 +127,17 @@ config PS3_FLASH
-         be disabled on the kernel command line using "ps3flash=off", to
-         not allocate this fixed buffer.
-+config PS3_LPM
-+      tristate "PS3 Logical Performance Monitor support"
-+      depends on PPC_PS3
-+      help
-+        Include support for the PS3 Logical Performance Monitor.
-+
-+        This support is required to use the logical performance monitor
-+        of the PS3's LV1 hypervisor.
-+
-+        If you intend to use the advanced performance monitoring and
-+        profiling support of the Cell processor with programs like
-+        oprofile and perfmon2, then say Y or M, otherwise say N.
-+
- endmenu
---- a/arch/powerpc/platforms/ps3/device-init.c
-+++ b/arch/powerpc/platforms/ps3/device-init.c
-@@ -23,6 +23,7 @@
- #include <linux/kernel.h>
- #include <linux/kthread.h>
- #include <linux/init.h>
-+#include <linux/reboot.h>
- #include <asm/firmware.h>
- #include <asm/lv1call.h>
-@@ -30,6 +31,89 @@
- #include "platform.h"
-+static int __init ps3_register_lpm_devices(void)
-+{
-+      int result;
-+      u64 tmp1;
-+      u64 tmp2;
-+      struct ps3_system_bus_device *dev;
-+
-+      pr_debug(" -> %s:%d\n", __func__, __LINE__);
-+
-+      dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+      if (!dev)
-+              return -ENOMEM;
-+
-+      dev->match_id = PS3_MATCH_ID_LPM;
-+      dev->dev_type = PS3_DEVICE_TYPE_LPM;
-+
-+      /* The current lpm driver only supports a single BE processor. */
-+
-+      result = ps3_repository_read_be_node_id(0, &dev->lpm.node_id);
-+
-+      if (result) {
-+              pr_debug("%s:%d: ps3_repository_read_be_node_id failed \n",
-+                      __func__, __LINE__);
-+              goto fail_read_repo;
-+      }
-+
-+      result = ps3_repository_read_lpm_privileges(dev->lpm.node_id, &tmp1,
-+              &dev->lpm.rights);
-+
-+      if (result) {
-+              pr_debug("%s:%d: ps3_repository_read_lpm_privleges failed \n",
-+                      __func__, __LINE__);
-+              goto fail_read_repo;
-+      }
-+
-+      lv1_get_logical_partition_id(&tmp2);
-+
-+      if (tmp1 != tmp2) {
-+              pr_debug("%s:%d: wrong lpar\n",
-+                      __func__, __LINE__);
-+              result = -ENODEV;
-+              goto fail_rights;
-+      }
-+
-+      if (!(dev->lpm.rights & PS3_LPM_RIGHTS_USE_LPM)) {
-+              pr_debug("%s:%d: don't have rights to use lpm\n",
-+                      __func__, __LINE__);
-+              result = -EPERM;
-+              goto fail_rights;
-+      }
-+
-+      pr_debug("%s:%d: pu_id %lu, rights %lu(%lxh)\n",
-+              __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights,
-+              dev->lpm.rights);
-+
-+      result = ps3_repository_read_pu_id(0, &dev->lpm.pu_id);
-+
-+      if (result) {
-+              pr_debug("%s:%d: ps3_repository_read_pu_id failed \n",
-+                      __func__, __LINE__);
-+              goto fail_read_repo;
-+      }
-+
-+      result = ps3_system_bus_device_register(dev);
-+
-+      if (result) {
-+              pr_debug("%s:%d ps3_system_bus_device_register failed\n",
-+                      __func__, __LINE__);
-+              goto fail_register;
-+      }
-+
-+      pr_debug(" <- %s:%d\n", __func__, __LINE__);
-+      return 0;
-+
-+
-+fail_register:
-+fail_rights:
-+fail_read_repo:
-+      kfree(dev);
-+      pr_debug(" <- %s:%d: failed\n", __func__, __LINE__);
-+      return result;
-+}
-+
- /**
-  * ps3_setup_gelic_device - Setup and register a gelic device instance.
-  *
-@@ -238,166 +322,6 @@ static int __init ps3_setup_vuart_device
-       return result;
- }
--static int ps3stor_wait_for_completion(u64 dev_id, u64 tag,
--                                     unsigned int timeout)
--{
--      int result = -1;
--      unsigned int retries = 0;
--      u64 status;
--
--      for (retries = 0; retries < timeout; retries++) {
--              result = lv1_storage_check_async_status(dev_id, tag, &status);
--              if (!result)
--                      break;
--
--              msleep(1);
--      }
--
--      if (result)
--              pr_debug("%s:%u: check_async_status: %s, status %lx\n",
--                       __func__, __LINE__, ps3_result(result), status);
--
--      return result;
--}
--
--/**
-- * ps3_storage_wait_for_device - Wait for a storage device to become ready.
-- * @repo: The repository device to wait for.
-- *
-- * Uses the hypervisor's storage device notification mechanism to wait until
-- * a storage device is ready.  The device notification mechanism uses a
-- * psuedo device (id = -1) to asynchronously notify the guest when storage
-- * devices become ready.  The notification device has a block size of 512
-- * bytes.
-- */
--
--static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
--{
--      int error = -ENODEV;
--      int result;
--      const u64 notification_dev_id = (u64)-1LL;
--      const unsigned int timeout = HZ;
--      u64 lpar;
--      u64 tag;
--      void *buf;
--      enum ps3_notify_type {
--              notify_device_ready = 0,
--              notify_region_probe = 1,
--              notify_region_update = 2,
--      };
--      struct {
--              u64 operation_code;     /* must be zero */
--              u64 event_mask;         /* OR of 1UL << enum ps3_notify_type */
--      } *notify_cmd;
--      struct {
--              u64 event_type;         /* enum ps3_notify_type */
--              u64 bus_id;
--              u64 dev_id;
--              u64 dev_type;
--              u64 dev_port;
--      } *notify_event;
--
--      pr_debug(" -> %s:%u: (%u:%u:%u)\n", __func__, __LINE__, repo->bus_id,
--               repo->dev_id, repo->dev_type);
--
--      buf = kzalloc(512, GFP_KERNEL);
--      if (!buf)
--              return -ENOMEM;
--
--      lpar = ps3_mm_phys_to_lpar(__pa(buf));
--      notify_cmd = buf;
--      notify_event = buf;
--
--      result = lv1_open_device(repo->bus_id, notification_dev_id, 0);
--      if (result) {
--              printk(KERN_ERR "%s:%u: lv1_open_device %s\n", __func__,
--                     __LINE__, ps3_result(result));
--              goto fail_free;
--      }
--
--      /* Setup and write the request for device notification. */
--
--      notify_cmd->operation_code = 0; /* must be zero */
--      notify_cmd->event_mask = 1UL << notify_region_probe;
--
--      result = lv1_storage_write(notification_dev_id, 0, 0, 1, 0, lpar,
--                                 &tag);
--      if (result) {
--              printk(KERN_ERR "%s:%u: write failed %s\n", __func__, __LINE__,
--                     ps3_result(result));
--              goto fail_close;
--      }
--
--      /* Wait for the write completion */
--
--      result = ps3stor_wait_for_completion(notification_dev_id, tag,
--                                           timeout);
--      if (result) {
--              printk(KERN_ERR "%s:%u: write not completed %s\n", __func__,
--                     __LINE__, ps3_result(result));
--              goto fail_close;
--      }
--
--      /* Loop here processing the requested notification events. */
--
--      while (1) {
--              memset(notify_event, 0, sizeof(*notify_event));
--
--              result = lv1_storage_read(notification_dev_id, 0, 0, 1, 0,
--                                        lpar, &tag);
--              if (result) {
--                      printk(KERN_ERR "%s:%u: write failed %s\n", __func__,
--                             __LINE__, ps3_result(result));
--                      break;
--              }
--
--              result = ps3stor_wait_for_completion(notification_dev_id, tag,
--                                                   timeout);
--              if (result) {
--                      printk(KERN_ERR "%s:%u: read not completed %s\n",
--                             __func__, __LINE__, ps3_result(result));
--                      break;
--              }
--
--              pr_debug("%s:%d: notify event (%u:%u:%u): event_type 0x%lx, "
--                       "port %lu\n", __func__, __LINE__, repo->bus_index,
--                       repo->dev_index, repo->dev_type,
--                       notify_event->event_type, notify_event->dev_port);
--
--              if (notify_event->event_type != notify_region_probe ||
--                  notify_event->bus_id != repo->bus_id) {
--                      pr_debug("%s:%u: bad notify_event: event %lu, "
--                               "dev_id %lu, dev_type %lu\n",
--                               __func__, __LINE__, notify_event->event_type,
--                               notify_event->dev_id, notify_event->dev_type);
--                      break;
--              }
--
--              if (notify_event->dev_id == repo->dev_id &&
--                  notify_event->dev_type == repo->dev_type) {
--                      pr_debug("%s:%u: device ready (%u:%u:%u)\n", __func__,
--                               __LINE__, repo->bus_index, repo->dev_index,
--                               repo->dev_type);
--                      error = 0;
--                      break;
--              }
--
--              if (notify_event->dev_id == repo->dev_id &&
--                  notify_event->dev_type == PS3_DEV_TYPE_NOACCESS) {
--                      pr_debug("%s:%u: no access: dev_id %u\n", __func__,
--                               __LINE__, repo->dev_id);
--                      break;
--              }
--      }
--
--fail_close:
--      lv1_close_device(repo->bus_id, notification_dev_id);
--fail_free:
--      kfree(buf);
--      pr_debug(" <- %s:%u\n", __func__, __LINE__);
--      return error;
--}
--
- static int ps3_setup_storage_dev(const struct ps3_repository_device *repo,
-                                enum ps3_match_id match_id)
- {
-@@ -449,16 +373,6 @@ static int ps3_setup_storage_dev(const s
-               goto fail_find_interrupt;
-       }
--      /* FIXME: Arrange to only do this on a 'cold' boot */
--
--      result = ps3_storage_wait_for_device(repo);
--      if (result) {
--              printk(KERN_ERR "%s:%u: storage_notification failed %d\n",
--                     __func__, __LINE__, result);
--              result = -ENODEV;
--              goto fail_probe_notification;
--      }
--
-       for (i = 0; i < num_regions; i++) {
-               unsigned int id;
-               u64 start, size;
-@@ -494,7 +408,6 @@ static int ps3_setup_storage_dev(const s
- fail_device_register:
- fail_read_region:
--fail_probe_notification:
- fail_find_interrupt:
-       kfree(p);
- fail_malloc:
-@@ -659,62 +572,268 @@ static int ps3_register_repository_devic
-       return result;
- }
-+static void ps3_find_and_add_device(u64 bus_id, u64 dev_id)
-+{
-+      struct ps3_repository_device repo;
-+      int res;
-+      unsigned int retries;
-+      unsigned long rem;
-+
-+      /*
-+       * On some firmware versions (e.g. 1.90), the device may not show up
-+       * in the repository immediately
-+       */
-+      for (retries = 0; retries < 10; retries++) {
-+              res = ps3_repository_find_device_by_id(&repo, bus_id, dev_id);
-+              if (!res)
-+                      goto found;
-+
-+              rem = msleep_interruptible(100);
-+              if (rem)
-+                      break;
-+      }
-+      pr_warning("%s:%u: device %lu:%lu not found\n", __func__, __LINE__,
-+                 bus_id, dev_id);
-+      return;
-+
-+found:
-+      if (retries)
-+              pr_debug("%s:%u: device %lu:%lu found after %u retries\n",
-+                       __func__, __LINE__, bus_id, dev_id, retries);
-+
-+      ps3_register_repository_device(&repo);
-+      return;
-+}
-+
-+#define PS3_NOTIFICATION_DEV_ID               ULONG_MAX
-+#define PS3_NOTIFICATION_INTERRUPT_ID 0
-+
-+struct ps3_notification_device {
-+      struct ps3_system_bus_device sbd;
-+      spinlock_t lock;
-+      u64 tag;
-+      u64 lv1_status;
-+      struct completion done;
-+};
-+
-+enum ps3_notify_type {
-+      notify_device_ready = 0,
-+      notify_region_probe = 1,
-+      notify_region_update = 2,
-+};
-+
-+struct ps3_notify_cmd {
-+      u64 operation_code;             /* must be zero */
-+      u64 event_mask;                 /* OR of 1UL << enum ps3_notify_type */
-+};
-+
-+struct ps3_notify_event {
-+      u64 event_type;                 /* enum ps3_notify_type */
-+      u64 bus_id;
-+      u64 dev_id;
-+      u64 dev_type;
-+      u64 dev_port;
-+};
-+
-+static irqreturn_t ps3_notification_interrupt(int irq, void *data)
-+{
-+      struct ps3_notification_device *dev = data;
-+      int res;
-+      u64 tag, status;
-+
-+      spin_lock(&dev->lock);
-+      res = lv1_storage_get_async_status(PS3_NOTIFICATION_DEV_ID, &tag,
-+                                         &status);
-+      if (tag != dev->tag)
-+              pr_err("%s:%u: tag mismatch, got %lx, expected %lx\n",
-+                     __func__, __LINE__, tag, dev->tag);
-+
-+      if (res) {
-+              pr_err("%s:%u: res %d status 0x%lx\n", __func__, __LINE__, res,
-+                     status);
-+      } else {
-+              pr_debug("%s:%u: completed, status 0x%lx\n", __func__,
-+                       __LINE__, status);
-+              dev->lv1_status = status;
-+              complete(&dev->done);
-+      }
-+      spin_unlock(&dev->lock);
-+      return IRQ_HANDLED;
-+}
-+
-+static int ps3_notification_read_write(struct ps3_notification_device *dev,
-+                                     u64 lpar, int write)
-+{
-+      const char *op = write ? "write" : "read";
-+      unsigned long flags;
-+      int res;
-+
-+      init_completion(&dev->done);
-+      spin_lock_irqsave(&dev->lock, flags);
-+      res = write ? lv1_storage_write(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
-+                                      &dev->tag)
-+                  : lv1_storage_read(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
-+                                     &dev->tag);
-+      spin_unlock_irqrestore(&dev->lock, flags);
-+      if (res) {
-+              pr_err("%s:%u: %s failed %d\n", __func__, __LINE__, op, res);
-+              return -EPERM;
-+      }
-+      pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op);
-+
-+      res = wait_event_interruptible(dev->done.wait,
-+                                     dev->done.done || kthread_should_stop());
-+      if (kthread_should_stop())
-+              res = -EINTR;
-+      if (res) {
-+              pr_debug("%s:%u: interrupted %s\n", __func__, __LINE__, op);
-+              return res;
-+      }
-+
-+      if (dev->lv1_status) {
-+              pr_err("%s:%u: %s not completed, status 0x%lx\n", __func__,
-+                     __LINE__, op, dev->lv1_status);
-+              return -EIO;
-+      }
-+      pr_debug("%s:%u: notification %s completed\n", __func__, __LINE__, op);
-+
-+      return 0;
-+}
-+
-+static struct task_struct *probe_task;
-+
- /**
-  * ps3_probe_thread - Background repository probing at system startup.
-  *
-  * This implementation only supports background probing on a single bus.
-+ * It uses the hypervisor's storage device notification mechanism to wait until
-+ * a storage device is ready.  The device notification mechanism uses a
-+ * pseudo device to asynchronously notify the guest when storage devices become
-+ * ready.  The notification device has a block size of 512 bytes.
-  */
- static int ps3_probe_thread(void *data)
- {
--      struct ps3_repository_device *repo = data;
--      int result;
--      unsigned int ms = 250;
-+      struct ps3_notification_device dev;
-+      int res;
-+      unsigned int irq;
-+      u64 lpar;
-+      void *buf;
-+      struct ps3_notify_cmd *notify_cmd;
-+      struct ps3_notify_event *notify_event;
-       pr_debug(" -> %s:%u: kthread started\n", __func__, __LINE__);
--      do {
--              try_to_freeze();
-+      buf = kzalloc(512, GFP_KERNEL);
-+      if (!buf)
-+              return -ENOMEM;
--              pr_debug("%s:%u: probing...\n", __func__, __LINE__);
-+      lpar = ps3_mm_phys_to_lpar(__pa(buf));
-+      notify_cmd = buf;
-+      notify_event = buf;
-+
-+      /* dummy system bus device */
-+      dev.sbd.bus_id = (u64)data;
-+      dev.sbd.dev_id = PS3_NOTIFICATION_DEV_ID;
-+      dev.sbd.interrupt_id = PS3_NOTIFICATION_INTERRUPT_ID;
-+
-+      res = lv1_open_device(dev.sbd.bus_id, dev.sbd.dev_id, 0);
-+      if (res) {
-+              pr_err("%s:%u: lv1_open_device failed %s\n", __func__,
-+                     __LINE__, ps3_result(res));
-+              goto fail_free;
-+      }
-+
-+      res = ps3_sb_event_receive_port_setup(&dev.sbd, PS3_BINDING_CPU_ANY,
-+                                            &irq);
-+      if (res) {
-+              pr_err("%s:%u: ps3_sb_event_receive_port_setup failed %d\n",
-+                     __func__, __LINE__, res);
-+             goto fail_close_device;
-+      }
-+
-+      spin_lock_init(&dev.lock);
-+
-+      res = request_irq(irq, ps3_notification_interrupt, IRQF_DISABLED,
-+                        "ps3_notification", &dev);
-+      if (res) {
-+              pr_err("%s:%u: request_irq failed %d\n", __func__, __LINE__,
-+                     res);
-+              goto fail_sb_event_receive_port_destroy;
-+      }
-+
-+      /* Setup and write the request for device notification. */
-+      notify_cmd->operation_code = 0; /* must be zero */
-+      notify_cmd->event_mask = 1UL << notify_region_probe;
--              do {
--                      result = ps3_repository_find_device(repo);
-+      res = ps3_notification_read_write(&dev, lpar, 1);
-+      if (res)
-+              goto fail_free_irq;
--                      if (result == -ENODEV)
--                              pr_debug("%s:%u: nothing new\n", __func__,
--                                      __LINE__);
--                      else if (result)
--                              pr_debug("%s:%u: find device error.\n",
--                                      __func__, __LINE__);
--                      else {
--                              pr_debug("%s:%u: found device (%u:%u:%u)\n",
--                                       __func__, __LINE__, repo->bus_index,
--                                       repo->dev_index, repo->dev_type);
--                              ps3_register_repository_device(repo);
--                              ps3_repository_bump_device(repo);
--                              ms = 250;
--                      }
--              } while (!result);
-+      /* Loop here processing the requested notification events. */
-+      do {
-+              try_to_freeze();
--              pr_debug("%s:%u: ms %u\n", __func__, __LINE__, ms);
-+              memset(notify_event, 0, sizeof(*notify_event));
--              if ( ms > 60000)
-+              res = ps3_notification_read_write(&dev, lpar, 0);
-+              if (res)
-                       break;
--              msleep_interruptible(ms);
-+              pr_debug("%s:%u: notify event type 0x%lx bus id %lu dev id %lu"
-+                       " type %lu port %lu\n", __func__, __LINE__,
-+                       notify_event->event_type, notify_event->bus_id,
-+                       notify_event->dev_id, notify_event->dev_type,
-+                       notify_event->dev_port);
-+
-+              if (notify_event->event_type != notify_region_probe ||
-+                  notify_event->bus_id != dev.sbd.bus_id) {
-+                      pr_warning("%s:%u: bad notify_event: event %lu, "
-+                                 "dev_id %lu, dev_type %lu\n",
-+                                 __func__, __LINE__, notify_event->event_type,
-+                                 notify_event->dev_id,
-+                                 notify_event->dev_type);
-+                      continue;
-+              }
--              /* An exponential backoff. */
--              ms <<= 1;
-+              ps3_find_and_add_device(dev.sbd.bus_id, notify_event->dev_id);
-       } while (!kthread_should_stop());
-+fail_free_irq:
-+      free_irq(irq, &dev);
-+fail_sb_event_receive_port_destroy:
-+      ps3_sb_event_receive_port_destroy(&dev.sbd, irq);
-+fail_close_device:
-+      lv1_close_device(dev.sbd.bus_id, dev.sbd.dev_id);
-+fail_free:
-+      kfree(buf);
-+
-+      probe_task = NULL;
-+
-       pr_debug(" <- %s:%u: kthread finished\n", __func__, __LINE__);
-       return 0;
- }
- /**
-+ * ps3_stop_probe_thread - Stops the background probe thread.
-+ *
-+ */
-+
-+static int ps3_stop_probe_thread(struct notifier_block *nb, unsigned long code,
-+                               void *data)
-+{
-+      if (probe_task)
-+              kthread_stop(probe_task);
-+      return 0;
-+}
-+
-+static struct notifier_block nb = {
-+      .notifier_call = ps3_stop_probe_thread
-+};
-+
-+/**
-  * ps3_start_probe_thread - Starts the background probe thread.
-  *
-  */
-@@ -723,7 +842,7 @@ static int __init ps3_start_probe_thread
- {
-       int result;
-       struct task_struct *task;
--      static struct ps3_repository_device repo; /* must be static */
-+      struct ps3_repository_device repo;
-       pr_debug(" -> %s:%d\n", __func__, __LINE__);
-@@ -746,7 +865,8 @@ static int __init ps3_start_probe_thread
-               return -ENODEV;
-       }
--      task = kthread_run(ps3_probe_thread, &repo, "ps3-probe-%u", bus_type);
-+      task = kthread_run(ps3_probe_thread, (void *)repo.bus_id,
-+                         "ps3-probe-%u", bus_type);
-       if (IS_ERR(task)) {
-               result = PTR_ERR(task);
-@@ -755,6 +875,9 @@ static int __init ps3_start_probe_thread
-               return result;
-       }
-+      probe_task = task;
-+      register_reboot_notifier(&nb);
-+
-       pr_debug(" <- %s:%d\n", __func__, __LINE__);
-       return 0;
- }
-@@ -787,6 +910,8 @@ static int __init ps3_register_devices(v
-       ps3_register_sound_devices();
-+      ps3_register_lpm_devices();
-+
-       pr_debug(" <- %s:%d\n", __func__, __LINE__);
-       return 0;
- }
---- a/arch/powerpc/platforms/ps3/mm.c
-+++ b/arch/powerpc/platforms/ps3/mm.c
-@@ -36,11 +36,6 @@
- #endif
- enum {
--#if defined(CONFIG_PS3_USE_LPAR_ADDR)
--      USE_LPAR_ADDR = 1,
--#else
--      USE_LPAR_ADDR = 0,
--#endif
- #if defined(CONFIG_PS3_DYNAMIC_DMA)
-       USE_DYNAMIC_DMA = 1,
- #else
-@@ -137,11 +132,8 @@ static struct map map;
- unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr)
- {
-       BUG_ON(is_kernel_addr(phys_addr));
--      if (USE_LPAR_ADDR)
--              return phys_addr;
--      else
--              return (phys_addr < map.rm.size || phys_addr >= map.total)
--                      ? phys_addr : phys_addr + map.r1.offset;
-+      return (phys_addr < map.rm.size || phys_addr >= map.total)
-+              ? phys_addr : phys_addr + map.r1.offset;
- }
- EXPORT_SYMBOL(ps3_mm_phys_to_lpar);
-@@ -309,7 +301,7 @@ static int __init ps3_mm_add_memory(void
-       BUG_ON(!mem_init_done);
--      start_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
-+      start_addr = map.rm.size;
-       start_pfn = start_addr >> PAGE_SHIFT;
-       nr_pages = (map.r1.size + PAGE_SIZE - 1) >> PAGE_SHIFT;
-@@ -359,7 +351,7 @@ static unsigned long dma_sb_lpar_to_bus(
- static void  __maybe_unused _dma_dump_region(const struct ps3_dma_region *r,
-       const char *func, int line)
- {
--      DBG("%s:%d: dev        %u:%u\n", func, line, r->dev->bus_id,
-+      DBG("%s:%d: dev        %lu:%lu\n", func, line, r->dev->bus_id,
-               r->dev->dev_id);
-       DBG("%s:%d: page_size  %u\n", func, line, r->page_size);
-       DBG("%s:%d: bus_addr   %lxh\n", func, line, r->bus_addr);
-@@ -394,7 +386,7 @@ struct dma_chunk {
- static void _dma_dump_chunk (const struct dma_chunk* c, const char* func,
-       int line)
- {
--      DBG("%s:%d: r.dev        %u:%u\n", func, line,
-+      DBG("%s:%d: r.dev        %lu:%lu\n", func, line,
-               c->region->dev->bus_id, c->region->dev->dev_id);
-       DBG("%s:%d: r.bus_addr   %lxh\n", func, line, c->region->bus_addr);
-       DBG("%s:%d: r.page_size  %u\n", func, line, c->region->page_size);
-@@ -658,7 +650,7 @@ static int dma_sb_region_create(struct p
-       BUG_ON(!r);
-       if (!r->dev->bus_id) {
--              pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
-+              pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
-                       r->dev->bus_id, r->dev->dev_id);
-               return 0;
-       }
-@@ -724,7 +716,7 @@ static int dma_sb_region_free(struct ps3
-       BUG_ON(!r);
-       if (!r->dev->bus_id) {
--              pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
-+              pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
-                       r->dev->bus_id, r->dev->dev_id);
-               return 0;
-       }
-@@ -1007,7 +999,7 @@ static int dma_sb_region_create_linear(s
-       if (r->offset + r->len > map.rm.size) {
-               /* Map (part of) 2nd RAM chunk */
--              virt_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
-+              virt_addr = map.rm.size;
-               len = r->len;
-               if (r->offset >= map.rm.size)
-                       virt_addr += r->offset - map.rm.size;
---- a/arch/powerpc/platforms/ps3/platform.h
-+++ b/arch/powerpc/platforms/ps3/platform.h
-@@ -89,13 +89,11 @@ enum ps3_dev_type {
-       PS3_DEV_TYPE_STOR_ROM = TYPE_ROM,       /* 5 */
-       PS3_DEV_TYPE_SB_GPIO = 6,
-       PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC,     /* 14 */
--      PS3_DEV_TYPE_STOR_DUMMY = 32,
--      PS3_DEV_TYPE_NOACCESS = 255,
- };
- int ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
-       u64 *value);
--int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id);
-+int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id);
- int ps3_repository_read_bus_type(unsigned int bus_index,
-       enum ps3_bus_type *bus_type);
- int ps3_repository_read_bus_num_dev(unsigned int bus_index,
-@@ -119,7 +117,7 @@ enum ps3_reg_type {
- int ps3_repository_read_dev_str(unsigned int bus_index,
-       unsigned int dev_index, const char *dev_str, u64 *value);
- int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
--      unsigned int *dev_id);
-+      u64 *dev_id);
- int ps3_repository_read_dev_type(unsigned int bus_index,
-       unsigned int dev_index, enum ps3_dev_type *dev_type);
- int ps3_repository_read_dev_intr(unsigned int bus_index,
-@@ -138,21 +136,17 @@ int ps3_repository_read_dev_reg(unsigned
- /* repository bus enumerators */
- struct ps3_repository_device {
--      enum ps3_bus_type bus_type;
-       unsigned int bus_index;
--      unsigned int bus_id;
--      enum ps3_dev_type dev_type;
-       unsigned int dev_index;
--      unsigned int dev_id;
-+      enum ps3_bus_type bus_type;
-+      enum ps3_dev_type dev_type;
-+      u64 bus_id;
-+      u64 dev_id;
- };
--static inline struct ps3_repository_device *ps3_repository_bump_device(
--      struct ps3_repository_device *repo)
--{
--      repo->dev_index++;
--      return repo;
--}
- int ps3_repository_find_device(struct ps3_repository_device *repo);
-+int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
-+                                   u64 bus_id, u64 dev_id);
- int ps3_repository_find_devices(enum ps3_bus_type bus_type,
-       int (*callback)(const struct ps3_repository_device *repo));
- int ps3_repository_find_bus(enum ps3_bus_type bus_type, unsigned int from,
-@@ -186,10 +180,10 @@ int ps3_repository_read_stor_dev_region(
-       unsigned int dev_index, unsigned int region_index,
-       unsigned int *region_id, u64 *region_start, u64 *region_size);
--/* repository pu and memory info */
-+/* repository logical pu and memory info */
--int ps3_repository_read_num_pu(unsigned int *num_pu);
--int ps3_repository_read_ppe_id(unsigned int *pu_index, unsigned int *ppe_id);
-+int ps3_repository_read_num_pu(u64 *num_pu);
-+int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id);
- int ps3_repository_read_rm_base(unsigned int ppe_id, u64 *rm_base);
- int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size);
- int ps3_repository_read_region_total(u64 *region_total);
-@@ -200,9 +194,15 @@ int ps3_repository_read_mm_info(u64 *rm_
- int ps3_repository_read_num_be(unsigned int *num_be);
- int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id);
-+int ps3_repository_read_be_id(u64 node_id, u64 *be_id);
- int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq);
- int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq);
-+/* repository performance monitor info */
-+
-+int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
-+      u64 *rights);
-+
- /* repository 'Other OS' area */
- int ps3_repository_read_boot_dat_addr(u64 *lpar_addr);
---- a/arch/powerpc/platforms/ps3/repository.c
-+++ b/arch/powerpc/platforms/ps3/repository.c
-@@ -33,7 +33,7 @@ enum ps3_lpar_id {
- };
- #define dump_field(_a, _b) _dump_field(_a, _b, __func__, __LINE__)
--static void _dump_field(const char *hdr, u64 n, const char* func, int line)
-+static void _dump_field(const char *hdr, u64 n, const char *func, int line)
- {
- #if defined(DEBUG)
-       char s[16];
-@@ -50,8 +50,8 @@ static void _dump_field(const char *hdr,
- #define dump_node_name(_a, _b, _c, _d, _e) \
-       _dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__)
--static void _dump_node_name (unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
--      u64 n4, const char* func, int line)
-+static void _dump_node_name(unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
-+      u64 n4, const char *func, int line)
- {
-       pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
-       _dump_field("n1: ", n1, func, line);
-@@ -63,7 +63,7 @@ static void _dump_node_name (unsigned in
- #define dump_node(_a, _b, _c, _d, _e, _f, _g) \
-       _dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)
- static void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
--      u64 v1, u64 v2, const char* func, int line)
-+      u64 v1, u64 v2, const char *func, int line)
- {
-       pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
-       _dump_field("n1: ", n1, func, line);
-@@ -165,21 +165,18 @@ int ps3_repository_read_bus_str(unsigned
-               make_first_field("bus", bus_index),
-               make_field(bus_str, 0),
-               0, 0,
--              value, 0);
-+              value, NULL);
- }
--int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id)
-+int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id)
- {
-       int result;
--      u64 v1;
--      u64 v2; /* unused */
-       result = read_node(PS3_LPAR_ID_PME,
-               make_first_field("bus", bus_index),
-               make_field("id", 0),
-               0, 0,
--              &v1, &v2);
--      *bus_id = v1;
-+              bus_id, NULL);
-       return result;
- }
-@@ -193,7 +190,7 @@ int ps3_repository_read_bus_type(unsigne
-               make_first_field("bus", bus_index),
-               make_field("type", 0),
-               0, 0,
--              &v1, 0);
-+              &v1, NULL);
-       *bus_type = v1;
-       return result;
- }
-@@ -208,7 +205,7 @@ int ps3_repository_read_bus_num_dev(unsi
-               make_first_field("bus", bus_index),
-               make_field("num_dev", 0),
-               0, 0,
--              &v1, 0);
-+              &v1, NULL);
-       *num_dev = v1;
-       return result;
- }
-@@ -221,22 +218,20 @@ int ps3_repository_read_dev_str(unsigned
-               make_field("dev", dev_index),
-               make_field(dev_str, 0),
-               0,
--              value, 0);
-+              value, NULL);
- }
- int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
--      unsigned int *dev_id)
-+      u64 *dev_id)
- {
-       int result;
--      u64 v1;
-       result = read_node(PS3_LPAR_ID_PME,
-               make_first_field("bus", bus_index),
-               make_field("dev", dev_index),
-               make_field("id", 0),
-               0,
--              &v1, 0);
--      *dev_id = v1;
-+              dev_id, NULL);
-       return result;
- }
-@@ -251,14 +246,14 @@ int ps3_repository_read_dev_type(unsigne
-               make_field("dev", dev_index),
-               make_field("type", 0),
-               0,
--              &v1, 0);
-+              &v1, NULL);
-       *dev_type = v1;
-       return result;
- }
- int ps3_repository_read_dev_intr(unsigned int bus_index,
-       unsigned int dev_index, unsigned int intr_index,
--      enum ps3_interrupt_type *intr_type, unsigned int* interrupt_id)
-+      enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id)
- {
-       int result;
-       u64 v1;
-@@ -287,7 +282,7 @@ int ps3_repository_read_dev_reg_type(uns
-               make_field("dev", dev_index),
-               make_field("reg", reg_index),
-               make_field("type", 0),
--              &v1, 0);
-+              &v1, NULL);
-       *reg_type = v1;
-       return result;
- }
-@@ -332,7 +327,7 @@ int ps3_repository_find_device(struct ps
-               return result;
-       }
--      pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %u, num_dev %u\n",
-+      pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %lu, num_dev %u\n",
-               __func__, __LINE__, tmp.bus_type, tmp.bus_index, tmp.bus_id,
-               num_dev);
-@@ -349,47 +344,95 @@ int ps3_repository_find_device(struct ps
-               return result;
-       }
--      if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) {
--              /*
--               * A storage device may show up in the repository before the
--               * hypervisor has finished probing its type and regions
--               */
--              unsigned int num_regions;
--
--              if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) {
--                      pr_debug("%s:%u storage device not ready\n", __func__,
--                               __LINE__);
--                      return -ENODEV;
--              }
-+      result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
-+              &tmp.dev_id);
--              result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index,
--                                                                tmp.dev_index,
--                                                                &num_regions);
-+      if (result) {
-+              pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
-+              __LINE__);
-+              return result;
-+      }
-+
-+      pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %lu\n",
-+              __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
-+
-+      *repo = tmp;
-+      return 0;
-+}
-+
-+int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
-+                                   u64 bus_id, u64 dev_id)
-+{
-+      int result = -ENODEV;
-+      struct ps3_repository_device tmp;
-+      unsigned int num_dev;
-+
-+      pr_debug(" -> %s:%u: find device by id %lu:%lu\n", __func__, __LINE__,
-+               bus_id, dev_id);
-+
-+      for (tmp.bus_index = 0; tmp.bus_index < 10; tmp.bus_index++) {
-+              result = ps3_repository_read_bus_id(tmp.bus_index,
-+                                                  &tmp.bus_id);
-               if (result) {
--                      pr_debug("%s:%d read_stor_dev_num_regions failed\n",
--                               __func__, __LINE__);
-+                      pr_debug("%s:%u read_bus_id(%u) failed\n", __func__,
-+                               __LINE__, tmp.bus_index);
-                       return result;
-               }
--              if (!num_regions) {
--                      pr_debug("%s:%u storage device has no regions yet\n",
--                               __func__, __LINE__);
--                      return -ENODEV;
--              }
-+              if (tmp.bus_id == bus_id)
-+                      goto found_bus;
-+
-+              pr_debug("%s:%u: skip, bus_id %lu\n", __func__, __LINE__,
-+                       tmp.bus_id);
-       }
-+      pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
-+      return result;
--      result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
--              &tmp.dev_id);
-+found_bus:
-+      result = ps3_repository_read_bus_type(tmp.bus_index, &tmp.bus_type);
-+      if (result) {
-+              pr_debug("%s:%u read_bus_type(%u) failed\n", __func__,
-+                       __LINE__, tmp.bus_index);
-+              return result;
-+      }
-+      result = ps3_repository_read_bus_num_dev(tmp.bus_index, &num_dev);
-       if (result) {
--              pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
--              __LINE__);
-+              pr_debug("%s:%u read_bus_num_dev failed\n", __func__,
-+                       __LINE__);
-               return result;
-       }
--      pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %u\n",
--              __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
-+      for (tmp.dev_index = 0; tmp.dev_index < num_dev; tmp.dev_index++) {
-+              result = ps3_repository_read_dev_id(tmp.bus_index,
-+                                                  tmp.dev_index,
-+                                                  &tmp.dev_id);
-+              if (result) {
-+                      pr_debug("%s:%u read_dev_id(%u:%u) failed\n", __func__,
-+                               __LINE__, tmp.bus_index, tmp.dev_index);
-+                      return result;
-+              }
-+
-+              if (tmp.dev_id == dev_id)
-+                      goto found_dev;
-+
-+              pr_debug("%s:%u: skip, dev_id %lu\n", __func__, __LINE__,
-+                       tmp.dev_id);
-+      }
-+      pr_debug(" <- %s:%u: dev not found\n", __func__, __LINE__);
-+      return result;
-+
-+found_dev:
-+      result = ps3_repository_read_dev_type(tmp.bus_index, tmp.dev_index,
-+                                            &tmp.dev_type);
-+      if (result) {
-+              pr_debug("%s:%u read_dev_type failed\n", __func__, __LINE__);
-+              return result;
-+      }
-+      pr_debug(" <- %s:%u: found: type (%u:%u) index (%u:%u) id (%lu:%lu)\n",
-+               __func__, __LINE__, tmp.bus_type, tmp.dev_type, tmp.bus_index,
-+               tmp.dev_index, tmp.bus_id, tmp.dev_id);
-       *repo = tmp;
-       return 0;
- }
-@@ -402,50 +445,34 @@ int __devinit ps3_repository_find_device
-       pr_debug(" -> %s:%d: find bus_type %u\n", __func__, __LINE__, bus_type);
--      for (repo.bus_index = 0; repo.bus_index < 10; repo.bus_index++) {
-+      repo.bus_type = bus_type;
-+      result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index);
-+      if (result) {
-+              pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
-+              return result;
-+      }
--              result = ps3_repository_read_bus_type(repo.bus_index,
--                      &repo.bus_type);
-+      result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id);
-+      if (result) {
-+              pr_debug("%s:%d read_bus_id(%u) failed\n", __func__, __LINE__,
-+                       repo.bus_index);
-+              return result;
-+      }
--              if (result) {
--                      pr_debug("%s:%d read_bus_type(%u) failed\n",
--                              __func__, __LINE__, repo.bus_index);
-+      for (repo.dev_index = 0; ; repo.dev_index++) {
-+              result = ps3_repository_find_device(&repo);
-+              if (result == -ENODEV) {
-+                      result = 0;
-+                      break;
-+              } else if (result)
-                       break;
--              }
--
--              if (repo.bus_type != bus_type) {
--                      pr_debug("%s:%d: skip, bus_type %u\n", __func__,
--                              __LINE__, repo.bus_type);
--                      continue;
--              }
--
--              result = ps3_repository_read_bus_id(repo.bus_index,
--                      &repo.bus_id);
-+              result = callback(&repo);
-               if (result) {
--                      pr_debug("%s:%d read_bus_id(%u) failed\n",
--                              __func__, __LINE__, repo.bus_index);
--                      continue;
--              }
--
--              for (repo.dev_index = 0; ; repo.dev_index++) {
--                      result = ps3_repository_find_device(&repo);
--
--                      if (result == -ENODEV) {
--                              result = 0;
--                              break;
--                      } else if (result)
--                              break;
--
--                      result = callback(&repo);
--
--                      if (result) {
--                              pr_debug("%s:%d: abort at callback\n", __func__,
--                                      __LINE__);
--                              break;
--                      }
-+                      pr_debug("%s:%d: abort at callback\n", __func__,
-+                              __LINE__);
-+                      break;
-               }
--              break;
-       }
-       pr_debug(" <- %s:%d\n", __func__, __LINE__);
-@@ -561,7 +588,7 @@ int ps3_repository_read_stor_dev_port(un
-               make_first_field("bus", bus_index),
-               make_field("dev", dev_index),
-               make_field("port", 0),
--              0, port, 0);
-+              0, port, NULL);
- }
- int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
-@@ -571,7 +598,7 @@ int ps3_repository_read_stor_dev_blk_siz
-               make_first_field("bus", bus_index),
-               make_field("dev", dev_index),
-               make_field("blk_size", 0),
--              0, blk_size, 0);
-+              0, blk_size, NULL);
- }
- int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
-@@ -581,7 +608,7 @@ int ps3_repository_read_stor_dev_num_blo
-               make_first_field("bus", bus_index),
-               make_field("dev", dev_index),
-               make_field("n_blocks", 0),
--              0, num_blocks, 0);
-+              0, num_blocks, NULL);
- }
- int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
-@@ -594,7 +621,7 @@ int ps3_repository_read_stor_dev_num_reg
-               make_first_field("bus", bus_index),
-               make_field("dev", dev_index),
-               make_field("n_regs", 0),
--              0, &v1, 0);
-+              0, &v1, NULL);
-       *num_regions = v1;
-       return result;
- }
-@@ -611,7 +638,7 @@ int ps3_repository_read_stor_dev_region_
-           make_field("dev", dev_index),
-           make_field("region", region_index),
-           make_field("id", 0),
--          &v1, 0);
-+          &v1, NULL);
-       *region_id = v1;
-       return result;
- }
-@@ -624,7 +651,7 @@ int ps3_repository_read_stor_dev_region_
-           make_field("dev", dev_index),
-           make_field("region", region_index),
-           make_field("size", 0),
--          region_size, 0);
-+          region_size, NULL);
- }
- int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
-@@ -635,7 +662,7 @@ int ps3_repository_read_stor_dev_region_
-           make_field("dev", dev_index),
-           make_field("region", region_index),
-           make_field("start", 0),
--          region_start, 0);
-+          region_start, NULL);
- }
- int ps3_repository_read_stor_dev_info(unsigned int bus_index,
-@@ -684,6 +711,35 @@ int ps3_repository_read_stor_dev_region(
-       return result;
- }
-+/**
-+ * ps3_repository_read_num_pu - Number of logical PU processors for this lpar.
-+ */
-+
-+int ps3_repository_read_num_pu(u64 *num_pu)
-+{
-+      *num_pu = 0;
-+      return read_node(PS3_LPAR_ID_CURRENT,
-+                         make_first_field("bi", 0),
-+                         make_field("pun", 0),
-+                         0, 0,
-+                         num_pu, NULL);
-+}
-+
-+/**
-+ * ps3_repository_read_pu_id - Read the logical PU id.
-+ * @pu_index: Zero based index.
-+ * @pu_id: The logical PU id.
-+ */
-+
-+int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id)
-+{
-+      return read_node(PS3_LPAR_ID_CURRENT,
-+              make_first_field("bi", 0),
-+              make_field("pu", pu_index),
-+              0, 0,
-+              pu_id, NULL);
-+}
-+
- int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
- {
-       return read_node(PS3_LPAR_ID_CURRENT,
-@@ -691,7 +747,7 @@ int ps3_repository_read_rm_size(unsigned
-               make_field("pu", 0),
-               ppe_id,
-               make_field("rm_size", 0),
--              rm_size, 0);
-+              rm_size, NULL);
- }
- int ps3_repository_read_region_total(u64 *region_total)
-@@ -700,7 +756,7 @@ int ps3_repository_read_region_total(u64
-               make_first_field("bi", 0),
-               make_field("rgntotal", 0),
-               0, 0,
--              region_total, 0);
-+              region_total, NULL);
- }
- /**
-@@ -736,7 +792,7 @@ int ps3_repository_read_num_spu_reserved
-               make_first_field("bi", 0),
-               make_field("spun", 0),
-               0, 0,
--              &v1, 0);
-+              &v1, NULL);
-       *num_spu_reserved = v1;
-       return result;
- }
-@@ -755,7 +811,7 @@ int ps3_repository_read_num_spu_resource
-               make_first_field("bi", 0),
-               make_field("spursvn", 0),
-               0, 0,
--              &v1, 0);
-+              &v1, NULL);
-       *num_resource_id = v1;
-       return result;
- }
-@@ -768,7 +824,7 @@ int ps3_repository_read_num_spu_resource
-  */
- int ps3_repository_read_spu_resource_id(unsigned int res_index,
--      enum ps3_spu_resource_type* resource_type, unsigned int *resource_id)
-+      enum ps3_spu_resource_type *resource_type, unsigned int *resource_id)
- {
-       int result;
-       u64 v1;
-@@ -785,14 +841,14 @@ int ps3_repository_read_spu_resource_id(
-       return result;
- }
--int ps3_repository_read_boot_dat_address(u64 *address)
-+static int ps3_repository_read_boot_dat_address(u64 *address)
- {
-       return read_node(PS3_LPAR_ID_CURRENT,
-               make_first_field("bi", 0),
-               make_field("boot_dat", 0),
-               make_field("address", 0),
-               0,
--              address, 0);
-+              address, NULL);
- }
- int ps3_repository_read_boot_dat_size(unsigned int *size)
-@@ -805,7 +861,7 @@ int ps3_repository_read_boot_dat_size(un
-               make_field("boot_dat", 0),
-               make_field("size", 0),
-               0,
--              &v1, 0);
-+              &v1, NULL);
-       *size = v1;
-       return result;
- }
-@@ -820,7 +876,7 @@ int ps3_repository_read_vuart_av_port(un
-               make_field("vir_uart", 0),
-               make_field("port", 0),
-               make_field("avset", 0),
--              &v1, 0);
-+              &v1, NULL);
-       *port = v1;
-       return result;
- }
-@@ -835,7 +891,7 @@ int ps3_repository_read_vuart_sysmgr_por
-               make_field("vir_uart", 0),
-               make_field("port", 0),
-               make_field("sysmgr", 0),
--              &v1, 0);
-+              &v1, NULL);
-       *port = v1;
-       return result;
- }
-@@ -856,6 +912,10 @@ int ps3_repository_read_boot_dat_info(u6
-               : ps3_repository_read_boot_dat_size(size);
- }
-+/**
-+ * ps3_repository_read_num_be - Number of physical BE processors in the system.
-+ */
-+
- int ps3_repository_read_num_be(unsigned int *num_be)
- {
-       int result;
-@@ -866,11 +926,17 @@ int ps3_repository_read_num_be(unsigned 
-               0,
-               0,
-               0,
--              &v1, 0);
-+              &v1, NULL);
-       *num_be = v1;
-       return result;
- }
-+/**
-+ * ps3_repository_read_be_node_id - Read the physical BE processor node id.
-+ * @be_index: Zero based index.
-+ * @node_id: The BE processor node id.
-+ */
-+
- int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id)
- {
-       return read_node(PS3_LPAR_ID_PME,
-@@ -878,7 +944,23 @@ int ps3_repository_read_be_node_id(unsig
-               0,
-               0,
-               0,
--              node_id, 0);
-+              node_id, NULL);
-+}
-+
-+/**
-+ * ps3_repository_read_be_id - Read the physical BE processor id.
-+ * @node_id: The BE processor node id.
-+ * @be_id: The BE processor id.
-+ */
-+
-+int ps3_repository_read_be_id(u64 node_id, u64 *be_id)
-+{
-+      return read_node(PS3_LPAR_ID_PME,
-+              make_first_field("be", 0),
-+              node_id,
-+              0,
-+              0,
-+              be_id, NULL);
- }
- int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq)
-@@ -888,7 +970,7 @@ int ps3_repository_read_tb_freq(u64 node
-               node_id,
-               make_field("clock", 0),
-               0,
--              tb_freq, 0);
-+              tb_freq, NULL);
- }
- int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq)
-@@ -897,11 +979,29 @@ int ps3_repository_read_be_tb_freq(unsig
-       u64 node_id;
-       *tb_freq = 0;
--      result = ps3_repository_read_be_node_id(0, &node_id);
-+      result = ps3_repository_read_be_node_id(be_index, &node_id);
-       return result ? result
-               : ps3_repository_read_tb_freq(node_id, tb_freq);
- }
-+int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
-+      u64 *rights)
-+{
-+      int result;
-+      u64 node_id;
-+
-+      *lpar = 0;
-+      *rights = 0;
-+      result = ps3_repository_read_be_node_id(be_index, &node_id);
-+      return result ? result
-+              : read_node(PS3_LPAR_ID_PME,
-+                          make_first_field("be", 0),
-+                          node_id,
-+                          make_field("lpm", 0),
-+                          make_field("priv", 0),
-+                          lpar, rights);
-+}
-+
- #if defined(DEBUG)
- int ps3_repository_dump_resource_info(const struct ps3_repository_device *repo)
-@@ -1034,7 +1134,7 @@ static int dump_device_info(struct ps3_r
-                       continue;
-               }
--              pr_debug("%s:%d  (%u:%u): dev_type %u, dev_id %u\n", __func__,
-+              pr_debug("%s:%d  (%u:%u): dev_type %u, dev_id %lu\n", __func__,
-                       __LINE__, repo->bus_index, repo->dev_index,
-                       repo->dev_type, repo->dev_id);
-@@ -1091,7 +1191,7 @@ int ps3_repository_dump_bus_info(void)
-                       continue;
-               }
--              pr_debug("%s:%d bus_%u: bus_type %u, bus_id %u, num_dev %u\n",
-+              pr_debug("%s:%d bus_%u: bus_type %u, bus_id %lu, num_dev %u\n",
-                       __func__, __LINE__, repo.bus_index, repo.bus_type,
-                       repo.bus_id, num_dev);
---- a/arch/powerpc/platforms/ps3/spu.c
-+++ b/arch/powerpc/platforms/ps3/spu.c
-@@ -28,6 +28,7 @@
- #include <asm/spu_priv1.h>
- #include <asm/lv1call.h>
-+#include "../cell/spufs/spufs.h"
- #include "platform.h"
- /* spu_management_ops */
-@@ -419,10 +420,34 @@ static int ps3_init_affinity(void)
-       return 0;
- }
-+/**
-+ * ps3_enable_spu - Enable SPU run control.
-+ *
-+ * An outstanding enhancement for the PS3 would be to add a guard to check
-+ * for incorrect access to the spu problem state when the spu context is
-+ * disabled.  This check could be implemented with a flag added to the spu
-+ * context that would inhibit mapping problem state pages, and a routine
-+ * to unmap spu problem state pages.  When the spu is enabled with
-+ * ps3_enable_spu() the flag would be set allowing pages to be mapped,
-+ * and when the spu is disabled with ps3_disable_spu() the flag would be
-+ * cleared and the mapped problem state pages would be unmapped.
-+ */
-+
-+static void ps3_enable_spu(struct spu_context *ctx)
-+{
-+}
-+
-+static void ps3_disable_spu(struct spu_context *ctx)
-+{
-+      ctx->ops->runcntl_stop(ctx);
-+}
-+
- const struct spu_management_ops spu_management_ps3_ops = {
-       .enumerate_spus = ps3_enumerate_spus,
-       .create_spu = ps3_create_spu,
-       .destroy_spu = ps3_destroy_spu,
-+      .enable_spu = ps3_enable_spu,
-+      .disable_spu = ps3_disable_spu,
-       .init_affinity = ps3_init_affinity,
- };
-@@ -505,8 +530,6 @@ static void mfc_sr1_set(struct spu *spu,
-       static const u64 allowed = ~(MFC_STATE1_LOCAL_STORAGE_DECODE_MASK
-               | MFC_STATE1_PROBLEM_STATE_MASK);
--      sr1 |= MFC_STATE1_MASTER_RUN_CONTROL_MASK;
--
-       BUG_ON((sr1 & allowed) != (spu_pdata(spu)->cache.sr1 & allowed));
-       spu_pdata(spu)->cache.sr1 = sr1;
---- a/arch/powerpc/platforms/ps3/system-bus.c
-+++ b/arch/powerpc/platforms/ps3/system-bus.c
-@@ -42,8 +42,8 @@ struct {
-       int gpu;
- } static usage_hack;
--static int ps3_is_device(struct ps3_system_bus_device *dev,
--                       unsigned int bus_id, unsigned int dev_id)
-+static int ps3_is_device(struct ps3_system_bus_device *dev, u64 bus_id,
-+                       u64 dev_id)
- {
-       return dev->bus_id == bus_id && dev->dev_id == dev_id;
- }
-@@ -182,8 +182,8 @@ int ps3_open_hv_device(struct ps3_system
-       case PS3_MATCH_ID_SYSTEM_MANAGER:
-               pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
-                       __LINE__, dev->match_id);
--              pr_debug("%s:%d: bus_id: %u\n", __func__,
--                      __LINE__, dev->bus_id);
-+              pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
-+                      dev->bus_id);
-               BUG();
-               return -EINVAL;
-@@ -220,8 +220,8 @@ int ps3_close_hv_device(struct ps3_syste
-       case PS3_MATCH_ID_SYSTEM_MANAGER:
-               pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
-                       __LINE__, dev->match_id);
--              pr_debug("%s:%d: bus_id: %u\n", __func__,
--                      __LINE__, dev->bus_id);
-+              pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
-+                      dev->bus_id);
-               BUG();
-               return -EINVAL;
-@@ -240,7 +240,7 @@ EXPORT_SYMBOL_GPL(ps3_close_hv_device);
- static void _dump_mmio_region(const struct ps3_mmio_region* r,
-       const char* func, int line)
- {
--      pr_debug("%s:%d: dev       %u:%u\n", func, line, r->dev->bus_id,
-+      pr_debug("%s:%d: dev       %lu:%lu\n", func, line, r->dev->bus_id,
-               r->dev->dev_id);
-       pr_debug("%s:%d: bus_addr  %lxh\n", func, line, r->bus_addr);
-       pr_debug("%s:%d: len       %lxh\n", func, line, r->len);
-@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(struc
-       static unsigned int dev_ioc0_count;
-       static unsigned int dev_sb_count;
-       static unsigned int dev_vuart_count;
-+      static unsigned int dev_lpm_count;
-       if (!dev->core.parent)
-               dev->core.parent = &ps3_system_bus;
-@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(struc
-               snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
-                       "vuart_%02x", ++dev_vuart_count);
-               break;
-+      case PS3_DEVICE_TYPE_LPM:
-+              snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
-+                      "lpm_%02x", ++dev_lpm_count);
-+              break;
-       default:
-               BUG();
-       };
---- a/arch/powerpc/platforms/pseries/eeh.c
-+++ b/arch/powerpc/platforms/pseries/eeh.c
-@@ -29,6 +29,8 @@
- #include <linux/rbtree.h>
- #include <linux/seq_file.h>
- #include <linux/spinlock.h>
-+#include <linux/of.h>
-+
- #include <asm/atomic.h>
- #include <asm/eeh.h>
- #include <asm/eeh_event.h>
-@@ -169,7 +171,6 @@ static void rtas_slot_error_detail(struc
-  */
- static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
- {
--      struct device_node *dn;
-       struct pci_dev *dev = pdn->pcidev;
-       u32 cfg;
-       int cap, i;
-@@ -243,12 +244,12 @@ static size_t gather_pci_data(struct pci
-       /* Gather status on devices under the bridge */
-       if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
--              dn = pdn->node->child;
--              while (dn) {
-+              struct device_node *dn;
-+
-+              for_each_child_of_node(pdn->node, dn) {
-                       pdn = PCI_DN(dn);
-                       if (pdn)
-                               n += gather_pci_data(pdn, buf+n, len-n);
--                      dn = dn->sibling;
-               }
-       }
-@@ -372,7 +373,7 @@ struct device_node * find_device_pe(stru
-       return dn;
- }
--/** Mark all devices that are peers of this device as failed.
-+/** Mark all devices that are children of this device as failed.
-  *  Mark the device driver too, so that it can see the failure
-  *  immediately; this is critical, since some drivers poll
-  *  status registers in interrupts ... If a driver is polling,
-@@ -380,9 +381,11 @@ struct device_node * find_device_pe(stru
-  *  an interrupt context, which is bad.
-  */
--static void __eeh_mark_slot (struct device_node *dn, int mode_flag)
-+static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
- {
--      while (dn) {
-+      struct device_node *dn;
-+
-+      for_each_child_of_node(parent, dn) {
-               if (PCI_DN(dn)) {
-                       /* Mark the pci device driver too */
-                       struct pci_dev *dev = PCI_DN(dn)->pcidev;
-@@ -392,10 +395,8 @@ static void __eeh_mark_slot (struct devi
-                       if (dev && dev->driver)
-                               dev->error_state = pci_channel_io_frozen;
--                      if (dn->child)
--                              __eeh_mark_slot (dn->child, mode_flag);
-+                      __eeh_mark_slot(dn, mode_flag);
-               }
--              dn = dn->sibling;
-       }
- }
-@@ -415,19 +416,19 @@ void eeh_mark_slot (struct device_node *
-       if (dev)
-               dev->error_state = pci_channel_io_frozen;
--      __eeh_mark_slot (dn->child, mode_flag);
-+      __eeh_mark_slot(dn, mode_flag);
- }
--static void __eeh_clear_slot (struct device_node *dn, int mode_flag)
-+static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
- {
--      while (dn) {
-+      struct device_node *dn;
-+
-+      for_each_child_of_node(parent, dn) {
-               if (PCI_DN(dn)) {
-                       PCI_DN(dn)->eeh_mode &= ~mode_flag;
-                       PCI_DN(dn)->eeh_check_count = 0;
--                      if (dn->child)
--                              __eeh_clear_slot (dn->child, mode_flag);
-+                      __eeh_clear_slot(dn, mode_flag);
-               }
--              dn = dn->sibling;
-       }
- }
-@@ -444,7 +445,7 @@ void eeh_clear_slot (struct device_node 
-       PCI_DN(dn)->eeh_mode &= ~mode_flag;
-       PCI_DN(dn)->eeh_check_count = 0;
--      __eeh_clear_slot (dn->child, mode_flag);
-+      __eeh_clear_slot(dn, mode_flag);
-       spin_unlock_irqrestore(&confirm_error_lock, flags);
- }
-@@ -480,6 +481,7 @@ int eeh_dn_check_failure(struct device_n
-               no_dn++;
-               return 0;
-       }
-+      dn = find_device_pe(dn);
-       pdn = PCI_DN(dn);
-       /* Access to IO BARs might get this far and still not want checking. */
-@@ -545,7 +547,7 @@ int eeh_dn_check_failure(struct device_n
-       /* Note that config-io to empty slots may fail;
-        * they are empty when they don't have children. */
--      if ((rets[0] == 5) && (dn->child == NULL)) {
-+      if ((rets[0] == 5) && (rets[2] == 0) && (dn->child == NULL)) {
-               false_positives++;
-               pdn->eeh_false_positives ++;
-               rc = 0;
-@@ -848,11 +850,8 @@ void eeh_restore_bars(struct pci_dn *pdn
-       if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
-               __restore_bars (pdn);
--      dn = pdn->node->child;
--      while (dn) {
-+      for_each_child_of_node(pdn->node, dn)
-               eeh_restore_bars (PCI_DN(dn));
--              dn = dn->sibling;
--      }
- }
- /**
-@@ -1130,7 +1129,8 @@ static void eeh_add_device_early(struct 
- void eeh_add_device_tree_early(struct device_node *dn)
- {
-       struct device_node *sib;
--      for (sib = dn->child; sib; sib = sib->sibling)
-+
-+      for_each_child_of_node(dn, sib)
-               eeh_add_device_tree_early(sib);
-       eeh_add_device_early(dn);
- }
---- a/arch/powerpc/platforms/pseries/eeh_driver.c
-+++ b/arch/powerpc/platforms/pseries/eeh_driver.c
-@@ -310,8 +310,6 @@ struct pci_dn * handle_eeh_events (struc
-       const char *location, *pci_str, *drv_str;
-       frozen_dn = find_device_pe(event->dn);
--      frozen_bus = pcibios_find_pci_bus(frozen_dn);
--
-       if (!frozen_dn) {
-               location = of_get_property(event->dn, "ibm,loc-code", NULL);
-@@ -321,6 +319,8 @@ struct pci_dn * handle_eeh_events (struc
-                       location, pci_name(event->dev));
-               return NULL;
-       }
-+
-+      frozen_bus = pcibios_find_pci_bus(frozen_dn);
-       location = of_get_property(frozen_dn, "ibm,loc-code", NULL);
-       location = location ? location : "unknown";
-@@ -354,13 +354,6 @@ struct pci_dn * handle_eeh_events (struc
-       if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES)
-               goto excess_failures;
--      /* Get the current PCI slot state. */
--      rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
--      if (rc < 0) {
--              printk(KERN_WARNING "EEH: Permanent failure\n");
--              goto hard_fail;
--      }
--
-       printk(KERN_WARNING
-          "EEH: This PCI device has failed %d times in the last hour:\n",
-               frozen_pdn->eeh_freeze_count);
-@@ -376,6 +369,14 @@ struct pci_dn * handle_eeh_events (struc
-        */
-       pci_walk_bus(frozen_bus, eeh_report_error, &result);
-+      /* Get the current PCI slot state. This can take a long time,
-+       * sometimes over 3 seconds for certain systems. */
-+      rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
-+      if (rc < 0) {
-+              printk(KERN_WARNING "EEH: Permanent failure\n");
-+              goto hard_fail;
-+      }
-+
-       /* Since rtas may enable MMIO when posting the error log,
-        * don't post the error log until after all dev drivers
-        * have been informed.
---- a/arch/powerpc/platforms/pseries/iommu.c
-+++ b/arch/powerpc/platforms/pseries/iommu.c
-@@ -251,7 +251,7 @@ static void iommu_table_setparms(struct 
-       const unsigned long *basep;
-       const u32 *sizep;
--      node = (struct device_node *)phb->arch_data;
-+      node = phb->dn;
-       basep = of_get_property(node, "linux,tce-base", NULL);
-       sizep = of_get_property(node, "linux,tce-size", NULL);
-@@ -296,11 +296,12 @@ static void iommu_table_setparms(struct 
- static void iommu_table_setparms_lpar(struct pci_controller *phb,
-                                     struct device_node *dn,
-                                     struct iommu_table *tbl,
--                                    const void *dma_window)
-+                                    const void *dma_window,
-+                                    int bussubno)
- {
-       unsigned long offset, size;
--      tbl->it_busno  = PCI_DN(dn)->bussubno;
-+      tbl->it_busno  = bussubno;
-       of_parse_dma_window(dn, dma_window, &tbl->it_index, &offset, &size);
-       tbl->it_base   = 0;
-@@ -420,17 +421,10 @@ static void pci_dma_bus_setup_pSeriesLP(
-           pdn->full_name, ppci->iommu_table);
-       if (!ppci->iommu_table) {
--              /* Bussubno hasn't been copied yet.
--               * Do it now because iommu_table_setparms_lpar needs it.
--               */
--
--              ppci->bussubno = bus->number;
--
-               tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
-                                  ppci->phb->node);
--
--              iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window);
--
-+              iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window,
-+                      bus->number);
-               ppci->iommu_table = iommu_init_table(tbl, ppci->phb->node);
-               DBG("  created table: %p\n", ppci->iommu_table);
-       }
-@@ -523,14 +517,10 @@ static void pci_dma_dev_setup_pSeriesLP(
-       pci = PCI_DN(pdn);
-       if (!pci->iommu_table) {
--              /* iommu_table_setparms_lpar needs bussubno. */
--              pci->bussubno = pci->phb->bus->number;
--
-               tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
-                                  pci->phb->node);
--
--              iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window);
--
-+              iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window,
-+                      pci->phb->bus->number);
-               pci->iommu_table = iommu_init_table(tbl, pci->phb->node);
-               DBG("  created table: %p\n", pci->iommu_table);
-       } else {
-@@ -556,7 +546,7 @@ static int iommu_reconfig_notifier(struc
-       case PSERIES_RECONFIG_REMOVE:
-               if (pci && pci->iommu_table &&
-                   of_get_property(np, "ibm,dma-window", NULL))
--                      iommu_free_table(np);
-+                      iommu_free_table(pci->iommu_table, np->full_name);
-               break;
-       default:
-               err = NOTIFY_DONE;
---- a/arch/powerpc/platforms/pseries/pci_dlpar.c
-+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
-@@ -83,7 +83,7 @@ EXPORT_SYMBOL_GPL(pcibios_remove_pci_dev
- /* Must be called before pci_bus_add_devices */
- void
--pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
-+pcibios_fixup_new_pci_devices(struct pci_bus *bus)
- {
-       struct pci_dev *dev;
-@@ -98,8 +98,6 @@ pcibios_fixup_new_pci_devices(struct pci
-                       /* Fill device archdata and setup iommu table */
-                       pcibios_setup_new_device(dev);
--                      if(fix_bus)
--                              pcibios_fixup_device_resources(dev, bus);
-                       pci_read_irq_line(dev);
-                       for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-                               struct resource *r = &dev->resource[i];
-@@ -132,8 +130,8 @@ pcibios_pci_config_bridge(struct pci_dev
-       pci_scan_child_bus(child_bus);
--      /* Fixup new pci devices without touching bus struct */
--      pcibios_fixup_new_pci_devices(child_bus, 0);
-+      /* Fixup new pci devices */
-+      pcibios_fixup_new_pci_devices(child_bus);
-       /* Make the discovered devices available */
-       pci_bus_add_devices(child_bus);
-@@ -169,7 +167,7 @@ pcibios_add_pci_devices(struct pci_bus *
-               /* use ofdt-based probe */
-               of_scan_bus(dn, bus);
-               if (!list_empty(&bus->devices)) {
--                      pcibios_fixup_new_pci_devices(bus, 0);
-+                      pcibios_fixup_new_pci_devices(bus);
-                       pci_bus_add_devices(bus);
-                       eeh_add_device_tree_late(bus);
-               }
-@@ -178,7 +176,7 @@ pcibios_add_pci_devices(struct pci_bus *
-               slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
-               num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
-               if (num) {
--                      pcibios_fixup_new_pci_devices(bus, 1);
-+                      pcibios_fixup_new_pci_devices(bus);
-                       pci_bus_add_devices(bus);
-                       eeh_add_device_tree_late(bus);
-               }
-@@ -208,7 +206,7 @@ struct pci_controller * __devinit init_p
-               eeh_add_device_tree_early(dn);
-       scan_phb(phb);
--      pcibios_fixup_new_pci_devices(phb->bus, 0);
-+      pcibios_fixup_new_pci_devices(phb->bus);
-       pci_bus_add_devices(phb->bus);
-       eeh_add_device_tree_late(phb->bus);
---- a/arch/powerpc/platforms/pseries/plpar_wrappers.h
-+++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h
-@@ -8,11 +8,6 @@ static inline long poll_pending(void)
-       return plpar_hcall_norets(H_POLL_PENDING);
- }
--static inline long prod_processor(void)
--{
--      return plpar_hcall_norets(H_PROD);
--}
--
- static inline long cede_processor(void)
- {
-       return plpar_hcall_norets(H_CEDE);
---- a/arch/powerpc/platforms/pseries/smp.c
-+++ b/arch/powerpc/platforms/pseries/smp.c
-@@ -46,6 +46,7 @@
- #include <asm/pSeries_reconfig.h>
- #include <asm/mpic.h>
- #include <asm/vdso_datapage.h>
-+#include <asm/cputhreads.h>
- #include "plpar_wrappers.h"
- #include "pseries.h"
-@@ -202,7 +203,7 @@ static int smp_pSeries_cpu_bootable(unsi
-        */
-       if (system_state < SYSTEM_RUNNING &&
-           cpu_has_feature(CPU_FTR_SMT) &&
--          !smt_enabled_at_boot && nr % 2 != 0)
-+          !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
-               return 0;
-       return 1;
---- a/arch/powerpc/platforms/pseries/xics.c
-+++ b/arch/powerpc/platforms/pseries/xics.c
-@@ -87,19 +87,25 @@ static int ibm_int_off;
- /* Direct HW low level accessors */
--static inline unsigned int direct_xirr_info_get(int n_cpu)
-+static inline unsigned int direct_xirr_info_get(void)
- {
--      return in_be32(&xics_per_cpu[n_cpu]->xirr.word);
-+      int cpu = smp_processor_id();
-+
-+      return in_be32(&xics_per_cpu[cpu]->xirr.word);
- }
--static inline void direct_xirr_info_set(int n_cpu, int value)
-+static inline void direct_xirr_info_set(int value)
- {
--      out_be32(&xics_per_cpu[n_cpu]->xirr.word, value);
-+      int cpu = smp_processor_id();
-+
-+      out_be32(&xics_per_cpu[cpu]->xirr.word, value);
- }
--static inline void direct_cppr_info(int n_cpu, u8 value)
-+static inline void direct_cppr_info(u8 value)
- {
--      out_8(&xics_per_cpu[n_cpu]->xirr.bytes[0], value);
-+      int cpu = smp_processor_id();
-+
-+      out_8(&xics_per_cpu[cpu]->xirr.bytes[0], value);
- }
- static inline void direct_qirr_info(int n_cpu, u8 value)
-@@ -111,7 +117,7 @@ static inline void direct_qirr_info(int 
- /* LPAR low level accessors */
--static inline unsigned int lpar_xirr_info_get(int n_cpu)
-+static inline unsigned int lpar_xirr_info_get(void)
- {
-       unsigned long lpar_rc;
-       unsigned long return_value;
-@@ -122,7 +128,7 @@ static inline unsigned int lpar_xirr_inf
-       return (unsigned int)return_value;
- }
--static inline void lpar_xirr_info_set(int n_cpu, int value)
-+static inline void lpar_xirr_info_set(int value)
- {
-       unsigned long lpar_rc;
-       unsigned long val64 = value & 0xffffffff;
-@@ -133,7 +139,7 @@ static inline void lpar_xirr_info_set(in
-                     val64);
- }
--static inline void lpar_cppr_info(int n_cpu, u8 value)
-+static inline void lpar_cppr_info(u8 value)
- {
-       unsigned long lpar_rc;
-@@ -275,21 +281,19 @@ static unsigned int xics_startup(unsigne
- static void xics_eoi_direct(unsigned int virq)
- {
--      int cpu = smp_processor_id();
-       unsigned int irq = (unsigned int)irq_map[virq].hwirq;
-       iosync();
--      direct_xirr_info_set(cpu, (0xff << 24) | irq);
-+      direct_xirr_info_set((0xff << 24) | irq);
- }
- static void xics_eoi_lpar(unsigned int virq)
- {
--      int cpu = smp_processor_id();
-       unsigned int irq = (unsigned int)irq_map[virq].hwirq;
-       iosync();
--      lpar_xirr_info_set(cpu, (0xff << 24) | irq);
-+      lpar_xirr_info_set((0xff << 24) | irq);
- }
- static inline unsigned int xics_remap_irq(unsigned int vec)
-@@ -312,16 +316,12 @@ static inline unsigned int xics_remap_ir
- static unsigned int xics_get_irq_direct(void)
- {
--      unsigned int cpu = smp_processor_id();
--
--      return xics_remap_irq(direct_xirr_info_get(cpu));
-+      return xics_remap_irq(direct_xirr_info_get());
- }
- static unsigned int xics_get_irq_lpar(void)
- {
--      unsigned int cpu = smp_processor_id();
--
--      return xics_remap_irq(lpar_xirr_info_get(cpu));
-+      return xics_remap_irq(lpar_xirr_info_get());
- }
- #ifdef CONFIG_SMP
-@@ -387,12 +387,12 @@ void xics_cause_IPI(int cpu)
- #endif /* CONFIG_SMP */
--static void xics_set_cpu_priority(int cpu, unsigned char cppr)
-+static void xics_set_cpu_priority(unsigned char cppr)
- {
-       if (firmware_has_feature(FW_FEATURE_LPAR))
--              lpar_cppr_info(cpu, cppr);
-+              lpar_cppr_info(cppr);
-       else
--              direct_cppr_info(cpu, cppr);
-+              direct_cppr_info(cppr);
-       iosync();
- }
-@@ -440,9 +440,7 @@ static void xics_set_affinity(unsigned i
- void xics_setup_cpu(void)
- {
--      int cpu = smp_processor_id();
--
--      xics_set_cpu_priority(cpu, 0xff);
-+      xics_set_cpu_priority(0xff);
-       /*
-        * Put the calling processor into the GIQ.  This is really only
-@@ -783,7 +781,7 @@ void xics_teardown_cpu(int secondary)
-       unsigned int ipi;
-       struct irq_desc *desc;
--      xics_set_cpu_priority(cpu, 0);
-+      xics_set_cpu_priority(0);
-       /*
-        * Clear IPI
-@@ -824,10 +822,11 @@ void xics_teardown_cpu(int secondary)
- void xics_migrate_irqs_away(void)
- {
-       int status;
--      unsigned int irq, virq, cpu = smp_processor_id();
-+      int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id();
-+      unsigned int irq, virq;
-       /* Reject any interrupt that was queued to us... */
--      xics_set_cpu_priority(cpu, 0);
-+      xics_set_cpu_priority(0);
-       /* remove ourselves from the global interrupt queue */
-       status = rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE,
-@@ -835,7 +834,7 @@ void xics_migrate_irqs_away(void)
-       WARN_ON(status < 0);
-       /* Allow IPIs again... */
--      xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
-+      xics_set_cpu_priority(DEFAULT_PRIORITY);
-       for_each_irq(virq) {
-               struct irq_desc *desc;
-@@ -874,7 +873,7 @@ void xics_migrate_irqs_away(void)
-                * The irq has to be migrated only in the single cpu
-                * case.
-                */
--              if (xics_status[0] != get_hard_smp_processor_id(cpu))
-+              if (xics_status[0] != hw_cpu)
-                       goto unlock;
-               printk(KERN_WARNING "IRQ %u affinity broken off cpu %u\n",
---- a/arch/powerpc/platforms/pseries/xics.h
-+++ b/arch/powerpc/platforms/pseries/xics.h
-@@ -21,9 +21,6 @@ extern void xics_cause_IPI(int cpu);
- extern  void xics_request_IPIs(void);
- extern void xics_migrate_irqs_away(void);
--/* first argument is ignored for now*/
--void pSeriesLP_cppr_info(int n_cpu, u8 value);
--
- struct xics_ipi_struct {
-       volatile unsigned long value;
- } ____cacheline_aligned;
---- /dev/null
-+++ b/arch/powerpc/sysdev/Kconfig
-@@ -0,0 +1,8 @@
-+# For a description of the syntax of this configuration file,
-+# see Documentation/kbuild/kconfig-language.txt.
-+#
-+
-+config PPC4xx_PCI_EXPRESS
-+      bool
-+      depends on PCI && 4xx
-+      default n
---- a/arch/powerpc/sysdev/Makefile
-+++ b/arch/powerpc/sysdev/Makefile
-@@ -2,7 +2,7 @@ ifeq ($(CONFIG_PPC64),y)
- EXTRA_CFLAGS                  += -mno-minimal-toc
- endif
--mpic-msi-obj-$(CONFIG_PCI_MSI)        += mpic_msi.o mpic_u3msi.o
-+mpic-msi-obj-$(CONFIG_PCI_MSI)        += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o
- obj-$(CONFIG_MPIC)            += mpic.o $(mpic-msi-obj-y)
- obj-$(CONFIG_PPC_MPC106)      += grackle.o
-@@ -12,6 +12,7 @@ obj-$(CONFIG_U3_DART)                += dart_iommu.o
- obj-$(CONFIG_MMIO_NVRAM)      += mmio_nvram.o
- obj-$(CONFIG_FSL_SOC)         += fsl_soc.o
- obj-$(CONFIG_FSL_PCI)         += fsl_pci.o
-+obj-$(CONFIG_RAPIDIO)         += fsl_rio.o
- obj-$(CONFIG_TSI108_BRIDGE)   += tsi108_pci.o tsi108_dev.o
- obj-$(CONFIG_QUICC_ENGINE)    += qe_lib/
- obj-$(CONFIG_PPC_BESTCOMM)    += bestcomm/
-@@ -24,9 +25,13 @@ obj-$(CONFIG_AXON_RAM)              += axonram.o
- ifeq ($(CONFIG_PPC_MERGE),y)
- obj-$(CONFIG_PPC_INDIRECT_PCI)        += indirect_pci.o
- obj-$(CONFIG_PPC_I8259)               += i8259.o
--obj-$(CONFIG_PPC_83xx)                += ipic.o
-+obj-$(CONFIG_IPIC)            += ipic.o
- obj-$(CONFIG_4xx)             += uic.o
- obj-$(CONFIG_XILINX_VIRTEX)   += xilinx_intc.o
-+obj-$(CONFIG_OF_RTC)          += of_rtc.o
-+ifeq ($(CONFIG_PCI),y)
-+obj-$(CONFIG_4xx)             += ppc4xx_pci.o
-+endif
- endif
- # Temporary hack until we have migrated to asm-powerpc
---- a/arch/powerpc/sysdev/axonram.c
-+++ b/arch/powerpc/sysdev/axonram.c
-@@ -42,8 +42,9 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/types.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/page.h>
- #include <asm/prom.h>
---- a/arch/powerpc/sysdev/bestcomm/bestcomm.h
-+++ b/arch/powerpc/sysdev/bestcomm/bestcomm.h
-@@ -20,7 +20,7 @@ struct bcom_bd; /* defined later on ... 
- /* ======================================================================== */
--/* Generic task managment                                                   */
-+/* Generic task management                                                   */
- /* ======================================================================== */
- /**
---- a/arch/powerpc/sysdev/commproc.c
-+++ b/arch/powerpc/sysdev/commproc.c
-@@ -240,6 +240,34 @@ void __init cpm_reset(void)
- #endif
- }
-+static DEFINE_SPINLOCK(cmd_lock);
-+
-+#define MAX_CR_CMD_LOOPS        10000
-+
-+int cpm_command(u32 command, u8 opcode)
-+{
-+      int i, ret;
-+      unsigned long flags;
-+
-+      if (command & 0xffffff0f)
-+              return -EINVAL;
-+
-+      spin_lock_irqsave(&cmd_lock, flags);
-+
-+      ret = 0;
-+      out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8));
-+      for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-+              if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
-+                      goto out;
-+
-+      printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+      ret = -EIO;
-+out:
-+      spin_unlock_irqrestore(&cmd_lock, flags);
-+      return ret;
-+}
-+EXPORT_SYMBOL(cpm_command);
-+
- /* We used to do this earlier, but have to postpone as long as possible
-  * to ensure the kernel VM is now running.
-  */
-@@ -408,7 +436,7 @@ EXPORT_SYMBOL(cpm_dpram_phys);
- #endif /* !CONFIG_PPC_CPM_NEW_BINDING */
- struct cpm_ioport16 {
--      __be16 dir, par, sor, dat, intr;
-+      __be16 dir, par, odr_sor, dat, intr;
-       __be16 res[3];
- };
-@@ -438,6 +466,13 @@ static void cpm1_set_pin32(int port, int
-       else
-               clrbits32(&iop->par, pin);
-+      if (port == CPM_PORTB) {
-+              if (flags & CPM_PIN_OPENDRAIN)
-+                      setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
-+              else
-+                      clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
-+      }
-+
-       if (port == CPM_PORTE) {
-               if (flags & CPM_PIN_SECONDARY)
-                       setbits32(&iop->sor, pin);
-@@ -471,11 +506,17 @@ static void cpm1_set_pin16(int port, int
-       else
-               clrbits16(&iop->par, pin);
-+      if (port == CPM_PORTA) {
-+              if (flags & CPM_PIN_OPENDRAIN)
-+                      setbits16(&iop->odr_sor, pin);
-+              else
-+                      clrbits16(&iop->odr_sor, pin);
-+      }
-       if (port == CPM_PORTC) {
-               if (flags & CPM_PIN_SECONDARY)
--                      setbits16(&iop->sor, pin);
-+                      setbits16(&iop->odr_sor, pin);
-               else
--                      clrbits16(&iop->sor, pin);
-+                      clrbits16(&iop->odr_sor, pin);
-       }
- }
---- a/arch/powerpc/sysdev/cpm2_common.c
-+++ b/arch/powerpc/sysdev/cpm2_common.c
-@@ -82,6 +82,31 @@ void __init cpm2_reset(void)
-       cpmp = &cpm2_immr->im_cpm;
- }
-+static DEFINE_SPINLOCK(cmd_lock);
-+
-+#define MAX_CR_CMD_LOOPS        10000
-+
-+int cpm_command(u32 command, u8 opcode)
-+{
-+      int i, ret;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&cmd_lock, flags);
-+
-+      ret = 0;
-+      out_be32(&cpmp->cp_cpcr, command | opcode | CPM_CR_FLG);
-+      for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-+              if ((in_be32(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
-+                      goto out;
-+
-+      printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+      ret = -EIO;
-+out:
-+      spin_unlock_irqrestore(&cmd_lock, flags);
-+      return ret;
-+}
-+EXPORT_SYMBOL(cpm_command);
-+
- /* Set a baud rate generator.  This needs lots of work.  There are
-  * eight BRGs, which can be connected to the CPM channels or output
-  * as clocks.  The BRGs are in two different block of internal
---- a/arch/powerpc/sysdev/fsl_pci.c
-+++ b/arch/powerpc/sysdev/fsl_pci.c
-@@ -33,8 +33,8 @@ void __init setup_pci_atmu(struct pci_co
-       struct ccsr_pci __iomem *pci;
-       int i;
--      pr_debug("PCI memory map start 0x%x, size 0x%x\n", rsrc->start,
--                      rsrc->end - rsrc->start + 1);
-+      pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n",
-+                  (u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1);
-       pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1);
-       /* Disable all windows (except powar0 since its ignored) */
-@@ -46,17 +46,17 @@ void __init setup_pci_atmu(struct pci_co
-       /* Setup outbound MEM window */
-       for(i = 0; i < 3; i++)
-               if (hose->mem_resources[i].flags & IORESOURCE_MEM){
--                      pr_debug("PCI MEM resource start 0x%08x, size 0x%08x.\n",
--                              hose->mem_resources[i].start,
--                              hose->mem_resources[i].end
--                                - hose->mem_resources[i].start + 1);
--                      out_be32(&pci->pow[i+1].potar,
--                              (hose->mem_resources[i].start >> 12)
--                              & 0x000fffff);
-+                      resource_size_t pci_addr_start =
-+                               hose->mem_resources[i].start -
-+                               hose->pci_mem_offset;
-+                      pr_debug("PCI MEM resource start 0x%016llx, size 0x%016llx.\n",
-+                              (u64)hose->mem_resources[i].start,
-+                              (u64)hose->mem_resources[i].end
-+                                - (u64)hose->mem_resources[i].start + 1);
-+                      out_be32(&pci->pow[i+1].potar, (pci_addr_start >> 12));
-                       out_be32(&pci->pow[i+1].potear, 0);
-                       out_be32(&pci->pow[i+1].powbar,
--                              (hose->mem_resources[i].start >> 12)
--                              & 0x000fffff);
-+                              (hose->mem_resources[i].start >> 12));
-                       /* Enable, Mem R/W */
-                       out_be32(&pci->pow[i+1].powar, 0x80044000
-                               | (__ilog2(hose->mem_resources[i].end
-@@ -65,15 +65,14 @@ void __init setup_pci_atmu(struct pci_co
-       /* Setup outbound IO window */
-       if (hose->io_resource.flags & IORESOURCE_IO){
--              pr_debug("PCI IO resource start 0x%08x, size 0x%08x, phy base 0x%08x.\n",
--                      hose->io_resource.start,
--                      hose->io_resource.end - hose->io_resource.start + 1,
--                      hose->io_base_phys);
--              out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12)
--                              & 0x000fffff);
-+              pr_debug("PCI IO resource start 0x%016llx, size 0x%016llx, "
-+                       "phy base 0x%016llx.\n",
-+                      (u64)hose->io_resource.start,
-+                      (u64)hose->io_resource.end - (u64)hose->io_resource.start + 1,
-+                      (u64)hose->io_base_phys);
-+              out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12));
-               out_be32(&pci->pow[i+1].potear, 0);
--              out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12)
--                              & 0x000fffff);
-+              out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12));
-               /* Enable, IO R/W */
-               out_be32(&pci->pow[i+1].powar, 0x80088000
-                       | (__ilog2(hose->io_resource.end
-@@ -107,55 +106,17 @@ void __init setup_pci_cmd(struct pci_con
-       }
- }
--static void __init quirk_fsl_pcie_transparent(struct pci_dev *dev)
--{
--      struct resource *res;
--      int i, res_idx = PCI_BRIDGE_RESOURCES;
--      struct pci_controller *hose;
-+static int fsl_pcie_bus_fixup;
-+static void __init quirk_fsl_pcie_header(struct pci_dev *dev)
-+{
-       /* if we aren't a PCIe don't bother */
-       if (!pci_find_capability(dev, PCI_CAP_ID_EXP))
-               return ;
--      /*
--       * Make the bridge be transparent.
--       */
--      dev->transparent = 1;
--
--      hose = pci_bus_to_host(dev->bus);
--      if (!hose) {
--              printk(KERN_ERR "Can't find hose for bus %d\n",
--                     dev->bus->number);
--              return;
--      }
--
--      /* Clear out any of the virtual P2P bridge registers */
--      pci_write_config_word(dev, PCI_IO_BASE_UPPER16, 0);
--      pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16, 0);
--      pci_write_config_byte(dev, PCI_IO_BASE, 0x10);
--      pci_write_config_byte(dev, PCI_IO_LIMIT, 0);
--      pci_write_config_word(dev, PCI_MEMORY_BASE, 0x10);
--      pci_write_config_word(dev, PCI_MEMORY_LIMIT, 0);
--      pci_write_config_word(dev, PCI_PREF_BASE_UPPER32, 0x0);
--      pci_write_config_word(dev, PCI_PREF_LIMIT_UPPER32, 0x0);
--      pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0x10);
--      pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0);
--
--      if (hose->io_resource.flags) {
--              res = &dev->resource[res_idx++];
--              res->start = hose->io_resource.start;
--              res->end = hose->io_resource.end;
--              res->flags = hose->io_resource.flags;
--              update_bridge_resource(dev, res);
--      }
--
--      for (i = 0; i < 3; i++) {
--              res = &dev->resource[res_idx + i];
--              res->start = hose->mem_resources[i].start;
--              res->end = hose->mem_resources[i].end;
--              res->flags = hose->mem_resources[i].flags;
--              update_bridge_resource(dev, res);
--      }
-+      dev->class = PCI_CLASS_BRIDGE_PCI << 8;
-+      fsl_pcie_bus_fixup = 1;
-+      return ;
- }
- int __init fsl_pcie_check_link(struct pci_controller *hose)
-@@ -172,11 +133,24 @@ void fsl_pcibios_fixup_bus(struct pci_bu
-       struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-       int i;
--      /* deal with bogus pci_bus when we don't have anything connected on PCIe */
--      if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
--              if (bus->parent) {
--                      for (i = 0; i < 4; ++i)
--                              bus->resource[i] = bus->parent->resource[i];
-+      if ((bus->parent == hose->bus) &&
-+          ((fsl_pcie_bus_fixup &&
-+            early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) ||
-+           (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK)))
-+      {
-+              for (i = 0; i < 4; ++i) {
-+                      struct resource *res = bus->resource[i];
-+                      struct resource *par = bus->parent->resource[i];
-+                      if (res) {
-+                              res->start = 0;
-+                              res->end   = 0;
-+                              res->flags = 0;
-+                      }
-+                      if (res && par) {
-+                              res->start = par->start;
-+                              res->end   = par->end;
-+                              res->flags = par->flags;
-+                      }
-               }
-       }
- }
-@@ -202,7 +176,7 @@ int __init fsl_add_bridge(struct device_
-               printk(KERN_WARNING "Can't get bus-range for %s, assume"
-                       " bus 0\n", dev->full_name);
--      pci_assign_all_buses = 1;
-+      ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       hose = pcibios_alloc_controller(dev);
-       if (!hose)
-               return -ENOMEM;
-@@ -222,7 +196,7 @@ int __init fsl_add_bridge(struct device_
-                       hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK;
-       }
--      printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx."
-+      printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx. "
-               "Firmware bus number: %d->%d\n",
-               (unsigned long long)rsrc.start, hose->first_busno,
-               hose->last_busno);
-@@ -240,23 +214,23 @@ int __init fsl_add_bridge(struct device_
-       return 0;
- }
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_transparent);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
---- /dev/null
-+++ b/arch/powerpc/sysdev/fsl_rio.c
-@@ -0,0 +1,932 @@
-+/*
-+ * MPC85xx RapidIO support
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/interrupt.h>
-+#include <linux/rio.h>
-+#include <linux/rio_drv.h>
-+
-+#include <asm/io.h>
-+
-+#define RIO_REGS_BASE         (CCSRBAR + 0xc0000)
-+#define RIO_ATMU_REGS_OFFSET  0x10c00
-+#define RIO_MSG_REGS_OFFSET   0x11000
-+#define RIO_MAINT_WIN_SIZE    0x400000
-+#define RIO_DBELL_WIN_SIZE    0x1000
-+
-+#define RIO_MSG_OMR_MUI               0x00000002
-+#define RIO_MSG_OSR_TE                0x00000080
-+#define RIO_MSG_OSR_QOI               0x00000020
-+#define RIO_MSG_OSR_QFI               0x00000010
-+#define RIO_MSG_OSR_MUB               0x00000004
-+#define RIO_MSG_OSR_EOMI      0x00000002
-+#define RIO_MSG_OSR_QEI               0x00000001
-+
-+#define RIO_MSG_IMR_MI                0x00000002
-+#define RIO_MSG_ISR_TE                0x00000080
-+#define RIO_MSG_ISR_QFI               0x00000010
-+#define RIO_MSG_ISR_DIQI      0x00000001
-+
-+#define RIO_MSG_DESC_SIZE     32
-+#define RIO_MSG_BUFFER_SIZE   4096
-+#define RIO_MIN_TX_RING_SIZE  2
-+#define RIO_MAX_TX_RING_SIZE  2048
-+#define RIO_MIN_RX_RING_SIZE  2
-+#define RIO_MAX_RX_RING_SIZE  2048
-+
-+#define DOORBELL_DMR_DI               0x00000002
-+#define DOORBELL_DSR_TE               0x00000080
-+#define DOORBELL_DSR_QFI      0x00000010
-+#define DOORBELL_DSR_DIQI     0x00000001
-+#define DOORBELL_TID_OFFSET   0x03
-+#define DOORBELL_SID_OFFSET   0x05
-+#define DOORBELL_INFO_OFFSET  0x06
-+
-+#define DOORBELL_MESSAGE_SIZE 0x08
-+#define DBELL_SID(x)          (*(u8 *)(x + DOORBELL_SID_OFFSET))
-+#define DBELL_TID(x)          (*(u8 *)(x + DOORBELL_TID_OFFSET))
-+#define DBELL_INF(x)          (*(u16 *)(x + DOORBELL_INFO_OFFSET))
-+
-+struct rio_atmu_regs {
-+      u32 rowtar;
-+      u32 pad1;
-+      u32 rowbar;
-+      u32 pad2;
-+      u32 rowar;
-+      u32 pad3[3];
-+};
-+
-+struct rio_msg_regs {
-+      u32 omr;
-+      u32 osr;
-+      u32 pad1;
-+      u32 odqdpar;
-+      u32 pad2;
-+      u32 osar;
-+      u32 odpr;
-+      u32 odatr;
-+      u32 odcr;
-+      u32 pad3;
-+      u32 odqepar;
-+      u32 pad4[13];
-+      u32 imr;
-+      u32 isr;
-+      u32 pad5;
-+      u32 ifqdpar;
-+      u32 pad6;
-+      u32 ifqepar;
-+      u32 pad7[250];
-+      u32 dmr;
-+      u32 dsr;
-+      u32 pad8;
-+      u32 dqdpar;
-+      u32 pad9;
-+      u32 dqepar;
-+      u32 pad10[26];
-+      u32 pwmr;
-+      u32 pwsr;
-+      u32 pad11;
-+      u32 pwqbar;
-+};
-+
-+struct rio_tx_desc {
-+      u32 res1;
-+      u32 saddr;
-+      u32 dport;
-+      u32 dattr;
-+      u32 res2;
-+      u32 res3;
-+      u32 dwcnt;
-+      u32 res4;
-+};
-+
-+static u32 regs_win;
-+static struct rio_atmu_regs *atmu_regs;
-+static struct rio_atmu_regs *maint_atmu_regs;
-+static struct rio_atmu_regs *dbell_atmu_regs;
-+static u32 dbell_win;
-+static u32 maint_win;
-+static struct rio_msg_regs *msg_regs;
-+
-+static struct rio_dbell_ring {
-+      void *virt;
-+      dma_addr_t phys;
-+} dbell_ring;
-+
-+static struct rio_msg_tx_ring {
-+      void *virt;
-+      dma_addr_t phys;
-+      void *virt_buffer[RIO_MAX_TX_RING_SIZE];
-+      dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
-+      int tx_slot;
-+      int size;
-+      void *dev_id;
-+} msg_tx_ring;
-+
-+static struct rio_msg_rx_ring {
-+      void *virt;
-+      dma_addr_t phys;
-+      void *virt_buffer[RIO_MAX_RX_RING_SIZE];
-+      int rx_slot;
-+      int size;
-+      void *dev_id;
-+} msg_rx_ring;
-+
-+/**
-+ * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
-+ * @index: ID of RapidIO interface
-+ * @destid: Destination ID of target device
-+ * @data: 16-bit info field of RapidIO doorbell message
-+ *
-+ * Sends a MPC85xx doorbell message. Returns %0 on success or
-+ * %-EINVAL on failure.
-+ */
-+static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
-+{
-+      pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
-+               index, destid, data);
-+      out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
-+      out_be16((void *)(dbell_win), data);
-+
-+      return 0;
-+}
-+
-+/**
-+ * mpc85xx_local_config_read - Generate a MPC85xx local config space read
-+ * @index: ID of RapdiIO interface
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @data: Value to be read into
-+ *
-+ * Generates a MPC85xx local configuration space read. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
-+{
-+      pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
-+               offset);
-+      *data = in_be32((void *)(regs_win + offset));
-+
-+      return 0;
-+}
-+
-+/**
-+ * mpc85xx_local_config_write - Generate a MPC85xx local config space write
-+ * @index: ID of RapdiIO interface
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @data: Value to be written
-+ *
-+ * Generates a MPC85xx local configuration space write. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
-+{
-+      pr_debug
-+          ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
-+           index, offset, data);
-+      out_be32((void *)(regs_win + offset), data);
-+
-+      return 0;
-+}
-+
-+/**
-+ * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
-+ * @index: ID of RapdiIO interface
-+ * @destid: Destination ID of transaction
-+ * @hopcount: Number of hops to target device
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @val: Location to be read into
-+ *
-+ * Generates a MPC85xx read maintenance transaction. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int
-+mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
-+                      u32 * val)
-+{
-+      u8 *data;
-+
-+      pr_debug
-+          ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
-+           index, destid, hopcount, offset, len);
-+      out_be32((void *)&maint_atmu_regs->rowtar,
-+               (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
-+
-+      data = (u8 *) maint_win + offset;
-+      switch (len) {
-+      case 1:
-+              *val = in_8((u8 *) data);
-+              break;
-+      case 2:
-+              *val = in_be16((u16 *) data);
-+              break;
-+      default:
-+              *val = in_be32((u32 *) data);
-+              break;
-+      }
-+
-+      return 0;
-+}
-+
-+/**
-+ * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
-+ * @index: ID of RapdiIO interface
-+ * @destid: Destination ID of transaction
-+ * @hopcount: Number of hops to target device
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @val: Value to be written
-+ *
-+ * Generates an MPC85xx write maintenance transaction. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int
-+mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
-+                       int len, u32 val)
-+{
-+      u8 *data;
-+      pr_debug
-+          ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
-+           index, destid, hopcount, offset, len, val);
-+      out_be32((void *)&maint_atmu_regs->rowtar,
-+               (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
-+
-+      data = (u8 *) maint_win + offset;
-+      switch (len) {
-+      case 1:
-+              out_8((u8 *) data, val);
-+              break;
-+      case 2:
-+              out_be16((u16 *) data, val);
-+              break;
-+      default:
-+              out_be32((u32 *) data, val);
-+              break;
-+      }
-+
-+      return 0;
-+}
-+
-+/**
-+ * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
-+ * @mport: Master port with outbound message queue
-+ * @rdev: Target of outbound message
-+ * @mbox: Outbound mailbox
-+ * @buffer: Message to add to outbound queue
-+ * @len: Length of message
-+ *
-+ * Adds the @buffer message to the MPC85xx outbound message queue. Returns
-+ * %0 on success or %-EINVAL on failure.
-+ */
-+int
-+rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
-+                      void *buffer, size_t len)
-+{
-+      u32 omr;
-+      struct rio_tx_desc *desc =
-+          (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
-+      int ret = 0;
-+
-+      pr_debug
-+          ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
-+           rdev->destid, mbox, (int)buffer, len);
-+
-+      if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
-+              ret = -EINVAL;
-+              goto out;
-+      }
-+
-+      /* Copy and clear rest of buffer */
-+      memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
-+      if (len < (RIO_MAX_MSG_SIZE - 4))
-+              memset((void *)((u32) msg_tx_ring.
-+                              virt_buffer[msg_tx_ring.tx_slot] + len), 0,
-+                     RIO_MAX_MSG_SIZE - len);
-+
-+      /* Set mbox field for message */
-+      desc->dport = mbox & 0x3;
-+
-+      /* Enable EOMI interrupt, set priority, and set destid */
-+      desc->dattr = 0x28000000 | (rdev->destid << 2);
-+
-+      /* Set transfer size aligned to next power of 2 (in double words) */
-+      desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
-+
-+      /* Set snooping and source buffer address */
-+      desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
-+
-+      /* Increment enqueue pointer */
-+      omr = in_be32((void *)&msg_regs->omr);
-+      out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
-+
-+      /* Go to next descriptor */
-+      if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
-+              msg_tx_ring.tx_slot = 0;
-+
-+      out:
-+      return ret;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
-+
-+/**
-+ * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles outbound message interrupts. Executes a register outbound
-+ * mailbox event handler and acks the interrupt occurrence.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_tx_handler(int irq, void *dev_instance)
-+{
-+      int osr;
-+      struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+      osr = in_be32((void *)&msg_regs->osr);
-+
-+      if (osr & RIO_MSG_OSR_TE) {
-+              pr_info("RIO: outbound message transmission error\n");
-+              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
-+              goto out;
-+      }
-+
-+      if (osr & RIO_MSG_OSR_QOI) {
-+              pr_info("RIO: outbound message queue overflow\n");
-+              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
-+              goto out;
-+      }
-+
-+      if (osr & RIO_MSG_OSR_EOMI) {
-+              u32 dqp = in_be32((void *)&msg_regs->odqdpar);
-+              int slot = (dqp - msg_tx_ring.phys) >> 5;
-+              port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
-+
-+              /* Ack the end-of-message interrupt */
-+              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
-+      }
-+
-+      out:
-+      return IRQ_HANDLED;
-+}
-+
-+/**
-+ * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
-+ * @mport: Master port implementing the outbound message unit
-+ * @dev_id: Device specific pointer to pass on event
-+ * @mbox: Mailbox to open
-+ * @entries: Number of entries in the outbound mailbox ring
-+ *
-+ * Initializes buffer ring, request the outbound message interrupt,
-+ * and enables the outbound message unit. Returns %0 on success and
-+ * %-EINVAL or %-ENOMEM on failure.
-+ */
-+int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
-+{
-+      int i, j, rc = 0;
-+
-+      if ((entries < RIO_MIN_TX_RING_SIZE) ||
-+          (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
-+              rc = -EINVAL;
-+              goto out;
-+      }
-+
-+      /* Initialize shadow copy ring */
-+      msg_tx_ring.dev_id = dev_id;
-+      msg_tx_ring.size = entries;
-+
-+      for (i = 0; i < msg_tx_ring.size; i++) {
-+              if (!
-+                  (msg_tx_ring.virt_buffer[i] =
-+                   dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+                                      &msg_tx_ring.phys_buffer[i],
-+                                      GFP_KERNEL))) {
-+                      rc = -ENOMEM;
-+                      for (j = 0; j < msg_tx_ring.size; j++)
-+                              if (msg_tx_ring.virt_buffer[j])
-+                                      dma_free_coherent(NULL,
-+                                                        RIO_MSG_BUFFER_SIZE,
-+                                                        msg_tx_ring.
-+                                                        virt_buffer[j],
-+                                                        msg_tx_ring.
-+                                                        phys_buffer[j]);
-+                      goto out;
-+              }
-+      }
-+
-+      /* Initialize outbound message descriptor ring */
-+      if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
-+                                                  msg_tx_ring.size *
-+                                                  RIO_MSG_DESC_SIZE,
-+                                                  &msg_tx_ring.phys,
-+                                                  GFP_KERNEL))) {
-+              rc = -ENOMEM;
-+              goto out_dma;
-+      }
-+      memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
-+      msg_tx_ring.tx_slot = 0;
-+
-+      /* Point dequeue/enqueue pointers at first entry in ring */
-+      out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
-+      out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
-+
-+      /* Configure for snooping */
-+      out_be32((void *)&msg_regs->osar, 0x00000004);
-+
-+      /* Clear interrupt status */
-+      out_be32((void *)&msg_regs->osr, 0x000000b3);
-+
-+      /* Hook up outbound message handler */
-+      if ((rc =
-+           request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
-+                       "msg_tx", (void *)mport)) < 0)
-+              goto out_irq;
-+
-+      /*
-+       * Configure outbound message unit
-+       *      Snooping
-+       *      Interrupts (all enabled, except QEIE)
-+       *      Chaining mode
-+       *      Disable
-+       */
-+      out_be32((void *)&msg_regs->omr, 0x00100220);
-+
-+      /* Set number of entries */
-+      out_be32((void *)&msg_regs->omr,
-+               in_be32((void *)&msg_regs->omr) |
-+               ((get_bitmask_order(entries) - 2) << 12));
-+
-+      /* Now enable the unit */
-+      out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
-+
-+      out:
-+      return rc;
-+
-+      out_irq:
-+      dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-+                        msg_tx_ring.virt, msg_tx_ring.phys);
-+
-+      out_dma:
-+      for (i = 0; i < msg_tx_ring.size; i++)
-+              dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+                                msg_tx_ring.virt_buffer[i],
-+                                msg_tx_ring.phys_buffer[i]);
-+
-+      return rc;
-+}
-+
-+/**
-+ * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
-+ * @mport: Master port implementing the outbound message unit
-+ * @mbox: Mailbox to close
-+ *
-+ * Disables the outbound message unit, free all buffers, and
-+ * frees the outbound message interrupt.
-+ */
-+void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
-+{
-+      /* Disable inbound message unit */
-+      out_be32((void *)&msg_regs->omr, 0);
-+
-+      /* Free ring */
-+      dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-+                        msg_tx_ring.virt, msg_tx_ring.phys);
-+
-+      /* Free interrupt */
-+      free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
-+}
-+
-+/**
-+ * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles inbound message interrupts. Executes a registered inbound
-+ * mailbox event handler and acks the interrupt occurrence.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_rx_handler(int irq, void *dev_instance)
-+{
-+      int isr;
-+      struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+      isr = in_be32((void *)&msg_regs->isr);
-+
-+      if (isr & RIO_MSG_ISR_TE) {
-+              pr_info("RIO: inbound message reception error\n");
-+              out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
-+              goto out;
-+      }
-+
-+      /* XXX Need to check/dispatch until queue empty */
-+      if (isr & RIO_MSG_ISR_DIQI) {
-+              /*
-+               * We implement *only* mailbox 0, but can receive messages
-+               * for any mailbox/letter to that mailbox destination. So,
-+               * make the callback with an unknown/invalid mailbox number
-+               * argument.
-+               */
-+              port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
-+
-+              /* Ack the queueing interrupt */
-+              out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
-+      }
-+
-+      out:
-+      return IRQ_HANDLED;
-+}
-+
-+/**
-+ * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
-+ * @mport: Master port implementing the inbound message unit
-+ * @dev_id: Device specific pointer to pass on event
-+ * @mbox: Mailbox to open
-+ * @entries: Number of entries in the inbound mailbox ring
-+ *
-+ * Initializes buffer ring, request the inbound message interrupt,
-+ * and enables the inbound message unit. Returns %0 on success
-+ * and %-EINVAL or %-ENOMEM on failure.
-+ */
-+int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
-+{
-+      int i, rc = 0;
-+
-+      if ((entries < RIO_MIN_RX_RING_SIZE) ||
-+          (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
-+              rc = -EINVAL;
-+              goto out;
-+      }
-+
-+      /* Initialize client buffer ring */
-+      msg_rx_ring.dev_id = dev_id;
-+      msg_rx_ring.size = entries;
-+      msg_rx_ring.rx_slot = 0;
-+      for (i = 0; i < msg_rx_ring.size; i++)
-+              msg_rx_ring.virt_buffer[i] = NULL;
-+
-+      /* Initialize inbound message ring */
-+      if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
-+                                                  msg_rx_ring.size *
-+                                                  RIO_MAX_MSG_SIZE,
-+                                                  &msg_rx_ring.phys,
-+                                                  GFP_KERNEL))) {
-+              rc = -ENOMEM;
-+              goto out;
-+      }
-+
-+      /* Point dequeue/enqueue pointers at first entry in ring */
-+      out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
-+      out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
-+
-+      /* Clear interrupt status */
-+      out_be32((void *)&msg_regs->isr, 0x00000091);
-+
-+      /* Hook up inbound message handler */
-+      if ((rc =
-+           request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
-+                       "msg_rx", (void *)mport)) < 0) {
-+              dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+                                msg_tx_ring.virt_buffer[i],
-+                                msg_tx_ring.phys_buffer[i]);
-+              goto out;
-+      }
-+
-+      /*
-+       * Configure inbound message unit:
-+       *      Snooping
-+       *      4KB max message size
-+       *      Unmask all interrupt sources
-+       *      Disable
-+       */
-+      out_be32((void *)&msg_regs->imr, 0x001b0060);
-+
-+      /* Set number of queue entries */
-+      out_be32((void *)&msg_regs->imr,
-+               in_be32((void *)&msg_regs->imr) |
-+               ((get_bitmask_order(entries) - 2) << 12));
-+
-+      /* Now enable the unit */
-+      out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
-+
-+      out:
-+      return rc;
-+}
-+
-+/**
-+ * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Mailbox to close
-+ *
-+ * Disables the inbound message unit, free all buffers, and
-+ * frees the inbound message interrupt.
-+ */
-+void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
-+{
-+      /* Disable inbound message unit */
-+      out_be32((void *)&msg_regs->imr, 0);
-+
-+      /* Free ring */
-+      dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
-+                        msg_rx_ring.virt, msg_rx_ring.phys);
-+
-+      /* Free interrupt */
-+      free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
-+}
-+
-+/**
-+ * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Inbound mailbox number
-+ * @buf: Buffer to add to inbound queue
-+ *
-+ * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
-+ * %0 on success or %-EINVAL on failure.
-+ */
-+int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
-+{
-+      int rc = 0;
-+
-+      pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
-+               msg_rx_ring.rx_slot);
-+
-+      if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
-+              printk(KERN_ERR
-+                     "RIO: error adding inbound buffer %d, buffer exists\n",
-+                     msg_rx_ring.rx_slot);
-+              rc = -EINVAL;
-+              goto out;
-+      }
-+
-+      msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
-+      if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
-+              msg_rx_ring.rx_slot = 0;
-+
-+      out:
-+      return rc;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
-+
-+/**
-+ * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Inbound mailbox number
-+ *
-+ * Gets the next available inbound message from the inbound message queue.
-+ * A pointer to the message is returned on success or NULL on failure.
-+ */
-+void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
-+{
-+      u32 imr;
-+      u32 phys_buf, virt_buf;
-+      void *buf = NULL;
-+      int buf_idx;
-+
-+      phys_buf = in_be32((void *)&msg_regs->ifqdpar);
-+
-+      /* If no more messages, then bail out */
-+      if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
-+              goto out2;
-+
-+      virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
-+      buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
-+      buf = msg_rx_ring.virt_buffer[buf_idx];
-+
-+      if (!buf) {
-+              printk(KERN_ERR
-+                     "RIO: inbound message copy failed, no buffers\n");
-+              goto out1;
-+      }
-+
-+      /* Copy max message size, caller is expected to allocate that big */
-+      memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
-+
-+      /* Clear the available buffer */
-+      msg_rx_ring.virt_buffer[buf_idx] = NULL;
-+
-+      out1:
-+      imr = in_be32((void *)&msg_regs->imr);
-+      out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
-+
-+      out2:
-+      return buf;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
-+
-+/**
-+ * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles doorbell interrupts. Parses a list of registered
-+ * doorbell event handlers and executes a matching event handler.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
-+{
-+      int dsr;
-+      struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+      dsr = in_be32((void *)&msg_regs->dsr);
-+
-+      if (dsr & DOORBELL_DSR_TE) {
-+              pr_info("RIO: doorbell reception error\n");
-+              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
-+              goto out;
-+      }
-+
-+      if (dsr & DOORBELL_DSR_QFI) {
-+              pr_info("RIO: doorbell queue full\n");
-+              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
-+              goto out;
-+      }
-+
-+      /* XXX Need to check/dispatch until queue empty */
-+      if (dsr & DOORBELL_DSR_DIQI) {
-+              u32 dmsg =
-+                  (u32) dbell_ring.virt +
-+                  (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
-+              u32 dmr;
-+              struct rio_dbell *dbell;
-+              int found = 0;
-+
-+              pr_debug
-+                  ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-+                   DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
-+
-+              list_for_each_entry(dbell, &port->dbells, node) {
-+                      if ((dbell->res->start <= DBELL_INF(dmsg)) &&
-+                          (dbell->res->end >= DBELL_INF(dmsg))) {
-+                              found = 1;
-+                              break;
-+                      }
-+              }
-+              if (found) {
-+                      dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
-+                                  DBELL_INF(dmsg));
-+              } else {
-+                      pr_debug
-+                          ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-+                           DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
-+              }
-+              dmr = in_be32((void *)&msg_regs->dmr);
-+              out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
-+              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
-+      }
-+
-+      out:
-+      return IRQ_HANDLED;
-+}
-+
-+/**
-+ * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
-+ * @mport: Master port implementing the inbound doorbell unit
-+ *
-+ * Initializes doorbell unit hardware and inbound DMA buffer
-+ * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
-+ * or %-ENOMEM on failure.
-+ */
-+static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
-+{
-+      int rc = 0;
-+
-+      /* Map outbound doorbell window immediately after maintenance window */
-+      if (!(dbell_win =
-+            (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
-+                          RIO_DBELL_WIN_SIZE))) {
-+              printk(KERN_ERR
-+                     "RIO: unable to map outbound doorbell window\n");
-+              rc = -ENOMEM;
-+              goto out;
-+      }
-+
-+      /* Initialize inbound doorbells */
-+      if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
-+                                                 512 * DOORBELL_MESSAGE_SIZE,
-+                                                 &dbell_ring.phys,
-+                                                 GFP_KERNEL))) {
-+              printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
-+              rc = -ENOMEM;
-+              iounmap((void *)dbell_win);
-+              goto out;
-+      }
-+
-+      /* Point dequeue/enqueue pointers at first entry in ring */
-+      out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
-+      out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
-+
-+      /* Clear interrupt status */
-+      out_be32((void *)&msg_regs->dsr, 0x00000091);
-+
-+      /* Hook up doorbell handler */
-+      if ((rc =
-+           request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
-+                       "dbell_rx", (void *)mport) < 0)) {
-+              iounmap((void *)dbell_win);
-+              dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
-+                                dbell_ring.virt, dbell_ring.phys);
-+              printk(KERN_ERR
-+                     "MPC85xx RIO: unable to request inbound doorbell irq");
-+              goto out;
-+      }
-+
-+      /* Configure doorbells for snooping, 512 entries, and enable */
-+      out_be32((void *)&msg_regs->dmr, 0x00108161);
-+
-+      out:
-+      return rc;
-+}
-+
-+static char *cmdline = NULL;
-+
-+static int mpc85xx_rio_get_hdid(int index)
-+{
-+      /* XXX Need to parse multiple entries in some format */
-+      if (!cmdline)
-+              return -1;
-+
-+      return simple_strtol(cmdline, NULL, 0);
-+}
-+
-+static int mpc85xx_rio_get_cmdline(char *s)
-+{
-+      if (!s)
-+              return 0;
-+
-+      cmdline = s;
-+      return 1;
-+}
-+
-+__setup("riohdid=", mpc85xx_rio_get_cmdline);
-+
-+/**
-+ * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
-+ * @law_start: Starting physical address of RapidIO LAW
-+ * @law_size: Size of RapidIO LAW
-+ *
-+ * Initializes MPC85xx RapidIO hardware interface, configures
-+ * master port with system-specific info, and registers the
-+ * master port with the RapidIO subsystem.
-+ */
-+void mpc85xx_rio_setup(int law_start, int law_size)
-+{
-+      struct rio_ops *ops;
-+      struct rio_mport *port;
-+
-+      ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
-+      ops->lcread = mpc85xx_local_config_read;
-+      ops->lcwrite = mpc85xx_local_config_write;
-+      ops->cread = mpc85xx_rio_config_read;
-+      ops->cwrite = mpc85xx_rio_config_write;
-+      ops->dsend = mpc85xx_rio_doorbell_send;
-+
-+      port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
-+      port->id = 0;
-+      port->index = 0;
-+      INIT_LIST_HEAD(&port->dbells);
-+      port->iores.start = law_start;
-+      port->iores.end = law_start + law_size;
-+      port->iores.flags = IORESOURCE_MEM;
-+
-+      rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
-+      rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
-+      rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
-+      strcpy(port->name, "RIO0 mport");
-+
-+      port->ops = ops;
-+      port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
-+
-+      rio_register_mport(port);
-+
-+      regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
-+      atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
-+      maint_atmu_regs = atmu_regs + 1;
-+      dbell_atmu_regs = atmu_regs + 2;
-+      msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
-+
-+      /* Configure maintenance transaction window */
-+      out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
-+      out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
-+
-+      maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
-+
-+      /* Configure outbound doorbell window */
-+      out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
-+      out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
-+      mpc85xx_rio_doorbell_init(port);
-+}
---- /dev/null
-+++ b/arch/powerpc/sysdev/fsl_rio.h
-@@ -0,0 +1,20 @@
-+/*
-+ * MPC85xx RapidIO definitions
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+
-+#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
-+#define __PPC_SYSLIB_PPC85XX_RIO_H
-+
-+#include <linux/init.h>
-+
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
-+
-+#endif                                /* __PPC_SYSLIB_PPC85XX_RIO_H */
---- a/arch/powerpc/sysdev/fsl_soc.c
-+++ b/arch/powerpc/sysdev/fsl_soc.c
-@@ -24,6 +24,7 @@
- #include <linux/platform_device.h>
- #include <linux/of_platform.h>
- #include <linux/phy.h>
-+#include <linux/phy_fixed.h>
- #include <linux/spi/spi.h>
- #include <linux/fsl_devices.h>
- #include <linux/fs_enet_pd.h>
-@@ -54,10 +55,18 @@ phys_addr_t get_immrbase(void)
-       soc = of_find_node_by_type(NULL, "soc");
-       if (soc) {
-               int size;
--              const void *prop = of_get_property(soc, "reg", &size);
-+              u32 naddr;
-+              const u32 *prop = of_get_property(soc, "#address-cells", &size);
-+              if (prop && size == 4)
-+                      naddr = *prop;
-+              else
-+                      naddr = 2;
-+
-+              prop = of_get_property(soc, "ranges", &size);
-               if (prop)
--                      immrbase = of_translate_address(soc, prop);
-+                      immrbase = of_translate_address(soc, prop + naddr);
-+
-               of_node_put(soc);
-       }
-@@ -130,17 +139,51 @@ u32 get_baudrate(void)
- EXPORT_SYMBOL(get_baudrate);
- #endif /* CONFIG_CPM2 */
--static int __init gfar_mdio_of_init(void)
-+#ifdef CONFIG_FIXED_PHY
-+static int __init of_add_fixed_phys(void)
- {
-+      int ret;
-       struct device_node *np;
--      unsigned int i;
-+      u32 *fixed_link;
-+      struct fixed_phy_status status = {};
-+
-+      for_each_node_by_name(np, "ethernet") {
-+              fixed_link  = (u32 *)of_get_property(np, "fixed-link", NULL);
-+              if (!fixed_link)
-+                      continue;
-+
-+              status.link = 1;
-+              status.duplex = fixed_link[1];
-+              status.speed = fixed_link[2];
-+              status.pause = fixed_link[3];
-+              status.asym_pause = fixed_link[4];
-+
-+              ret = fixed_phy_add(PHY_POLL, fixed_link[0], &status);
-+              if (ret) {
-+                      of_node_put(np);
-+                      return ret;
-+              }
-+      }
-+
-+      return 0;
-+}
-+arch_initcall(of_add_fixed_phys);
-+#endif /* CONFIG_FIXED_PHY */
-+
-+static int __init gfar_mdio_of_init(void)
-+{
-+      struct device_node *np = NULL;
-       struct platform_device *mdio_dev;
-       struct resource res;
-       int ret;
--      for (np = NULL, i = 0;
--           (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL;
--           i++) {
-+      np = of_find_compatible_node(np, NULL, "fsl,gianfar-mdio");
-+
-+      /* try the deprecated version */
-+      if (!np)
-+              np = of_find_compatible_node(np, "mdio", "gianfar");
-+
-+      if (np) {
-               int k;
-               struct device_node *child = NULL;
-               struct gianfar_mdio_data mdio_data;
-@@ -179,11 +222,13 @@ static int __init gfar_mdio_of_init(void
-                       goto unreg;
-       }
-+      of_node_put(np);
-       return 0;
- unreg:
-       platform_device_unregister(mdio_dev);
- err:
-+      of_node_put(np);
-       return ret;
- }
-@@ -193,7 +238,6 @@ static const char *gfar_tx_intr = "tx";
- static const char *gfar_rx_intr = "rx";
- static const char *gfar_err_intr = "error";
--
- static int __init gfar_of_init(void)
- {
-       struct device_node *np;
-@@ -277,29 +321,43 @@ static int __init gfar_of_init(void)
-                       gfar_data.interface = PHY_INTERFACE_MODE_MII;
-               ph = of_get_property(np, "phy-handle", NULL);
--              phy = of_find_node_by_phandle(*ph);
-+              if (ph == NULL) {
-+                      u32 *fixed_link;
--              if (phy == NULL) {
--                      ret = -ENODEV;
--                      goto unreg;
--              }
-+                      fixed_link = (u32 *)of_get_property(np, "fixed-link",
-+                                                         NULL);
-+                      if (!fixed_link) {
-+                              ret = -ENODEV;
-+                              goto unreg;
-+                      }
--              mdio = of_get_parent(phy);
-+                      gfar_data.bus_id = 0;
-+                      gfar_data.phy_id = fixed_link[0];
-+              } else {
-+                      phy = of_find_node_by_phandle(*ph);
-+
-+                      if (phy == NULL) {
-+                              ret = -ENODEV;
-+                              goto unreg;
-+                      }
-+
-+                      mdio = of_get_parent(phy);
-+
-+                      id = of_get_property(phy, "reg", NULL);
-+                      ret = of_address_to_resource(mdio, 0, &res);
-+                      if (ret) {
-+                              of_node_put(phy);
-+                              of_node_put(mdio);
-+                              goto unreg;
-+                      }
-+
-+                      gfar_data.phy_id = *id;
-+                      gfar_data.bus_id = res.start;
--              id = of_get_property(phy, "reg", NULL);
--              ret = of_address_to_resource(mdio, 0, &res);
--              if (ret) {
-                       of_node_put(phy);
-                       of_node_put(mdio);
--                      goto unreg;
-               }
--              gfar_data.phy_id = *id;
--              gfar_data.bus_id = res.start;
--
--              of_node_put(phy);
--              of_node_put(mdio);
--
-               ret =
-                   platform_device_add_data(gfar_dev, &gfar_data,
-                                            sizeof(struct
-@@ -390,13 +448,11 @@ static void __init of_register_i2c_devic
- static int __init fsl_i2c_of_init(void)
- {
-       struct device_node *np;
--      unsigned int i;
-+      unsigned int i = 0;
-       struct platform_device *i2c_dev;
-       int ret;
--      for (np = NULL, i = 0;
--           (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL;
--           i++) {
-+      for_each_compatible_node(np, NULL, "fsl-i2c") {
-               struct resource r[2];
-               struct fsl_i2c_platform_data i2c_data;
-               const unsigned char *flags = NULL;
-@@ -432,7 +488,7 @@ static int __init fsl_i2c_of_init(void)
-               if (ret)
-                       goto unreg;
--              of_register_i2c_devices(np, i);
-+              of_register_i2c_devices(np, i++);
-       }
-       return 0;
-@@ -528,14 +584,12 @@ static enum fsl_usb2_phy_modes determine
- static int __init fsl_usb_of_init(void)
- {
-       struct device_node *np;
--      unsigned int i;
-+      unsigned int i = 0;
-       struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,
-               *usb_dev_dr_client = NULL;
-       int ret;
--      for (np = NULL, i = 0;
--           (np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL;
--           i++) {
-+      for_each_compatible_node(np, NULL, "fsl-usb2-mph") {
-               struct resource r[2];
-               struct fsl_usb2_platform_data usb_data;
-               const unsigned char *prop = NULL;
-@@ -578,11 +632,10 @@ static int __init fsl_usb_of_init(void)
-                                                   fsl_usb2_platform_data));
-               if (ret)
-                       goto unreg_mph;
-+              i++;
-       }
--      for (np = NULL;
--           (np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL;
--           i++) {
-+      for_each_compatible_node(np, NULL, "fsl-usb2-dr") {
-               struct resource r[2];
-               struct fsl_usb2_platform_data usb_data;
-               const unsigned char *prop = NULL;
-@@ -654,6 +707,7 @@ static int __init fsl_usb_of_init(void)
-                                               fsl_usb2_platform_data))))
-                               goto unreg_dr;
-               }
-+              i++;
-       }
-       return 0;
-@@ -1125,13 +1179,12 @@ arch_initcall(fs_enet_of_init);
- static int __init fsl_pcmcia_of_init(void)
- {
--      struct device_node *np = NULL;
-+      struct device_node *np;
-       /*
-        * Register all the devices which type is "pcmcia"
-        */
--      while ((np = of_find_compatible_node(np,
--                      "pcmcia", "fsl,pq-pcmcia")) != NULL)
--                          of_platform_device_create(np, "m8xx-pcmcia", NULL);
-+      for_each_compatible_node(np, "pcmcia", "fsl,pq-pcmcia")
-+              of_platform_device_create(np, "m8xx-pcmcia", NULL);
-       return 0;
- }
---- a/arch/powerpc/sysdev/grackle.c
-+++ b/arch/powerpc/sysdev/grackle.c
-@@ -57,7 +57,7 @@ void __init setup_grackle(struct pci_con
- {
-       setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
-       if (machine_is_compatible("PowerMac1,1"))
--              pci_assign_all_buses = 1;
-+              ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-       if (machine_is_compatible("AAPL,PowerBook1998"))
-               grackle_set_loop_snoop(hose, 1);
- #if 0 /* Disabled for now, HW problems ??? */
---- a/arch/powerpc/sysdev/ipic.c
-+++ b/arch/powerpc/sysdev/ipic.c
-@@ -30,11 +30,67 @@
- #include "ipic.h"
- static struct ipic * primary_ipic;
-+static struct irq_chip ipic_level_irq_chip, ipic_edge_irq_chip;
- static DEFINE_SPINLOCK(ipic_lock);
- static struct ipic_info ipic_info[] = {
-+      [1] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 16,
-+              .prio_mask = 0,
-+      },
-+      [2] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 17,
-+              .prio_mask = 1,
-+      },
-+      [3] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 18,
-+              .prio_mask = 2,
-+      },
-+      [4] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 19,
-+              .prio_mask = 3,
-+      },
-+      [5] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 20,
-+              .prio_mask = 4,
-+      },
-+      [6] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 21,
-+              .prio_mask = 5,
-+      },
-+      [7] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 22,
-+              .prio_mask = 6,
-+      },
-+      [8] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_C,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 23,
-+              .prio_mask = 7,
-+      },
-       [9] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-@@ -42,7 +98,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 0,
-       },
-       [10] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-@@ -50,15 +105,27 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 1,
-       },
-       [11] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-               .bit    = 26,
-               .prio_mask = 2,
-       },
-+      [12] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_D,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 27,
-+              .prio_mask = 3,
-+      },
-+      [13] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_D,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 28,
-+              .prio_mask = 4,
-+      },
-       [14] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-@@ -66,7 +133,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 5,
-       },
-       [15] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-@@ -74,7 +140,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 6,
-       },
-       [16] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_D,
-               .force  = IPIC_SIFCR_H,
-@@ -82,7 +147,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 7,
-       },
-       [17] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SEFCR,
-@@ -90,7 +155,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 5,
-       },
-       [18] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SEFCR,
-@@ -98,7 +163,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 6,
-       },
-       [19] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SEFCR,
-@@ -106,7 +171,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 7,
-       },
-       [20] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SEFCR,
-@@ -114,7 +179,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 4,
-       },
-       [21] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SEFCR,
-@@ -122,7 +187,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 5,
-       },
-       [22] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SEFCR,
-@@ -130,7 +195,7 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 6,
-       },
-       [23] = {
--              .pend   = IPIC_SEPNR,
-+              .ack    = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SEFCR,
-@@ -138,7 +203,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 7,
-       },
-       [32] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -146,7 +210,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 0,
-       },
-       [33] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -154,7 +217,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 1,
-       },
-       [34] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -162,7 +224,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 2,
-       },
-       [35] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -170,7 +231,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 3,
-       },
-       [36] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -178,7 +238,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 4,
-       },
-       [37] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -186,7 +245,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 5,
-       },
-       [38] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-@@ -194,15 +252,69 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 6,
-       },
-       [39] = {
--              .pend   = IPIC_SIPNR_H,
-               .mask   = IPIC_SIMSR_H,
-               .prio   = IPIC_SIPRR_A,
-               .force  = IPIC_SIFCR_H,
-               .bit    = 7,
-               .prio_mask = 7,
-       },
-+      [40] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 8,
-+              .prio_mask = 0,
-+      },
-+      [41] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 9,
-+              .prio_mask = 1,
-+      },
-+      [42] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 10,
-+              .prio_mask = 2,
-+      },
-+      [43] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 11,
-+              .prio_mask = 3,
-+      },
-+      [44] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 12,
-+              .prio_mask = 4,
-+      },
-+      [45] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 13,
-+              .prio_mask = 5,
-+      },
-+      [46] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 14,
-+              .prio_mask = 6,
-+      },
-+      [47] = {
-+              .mask   = IPIC_SIMSR_H,
-+              .prio   = IPIC_SIPRR_B,
-+              .force  = IPIC_SIFCR_H,
-+              .bit    = 15,
-+              .prio_mask = 7,
-+      },
-       [48] = {
--              .pend   = IPIC_SEPNR,
-               .mask   = IPIC_SEMSR,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SEFCR,
-@@ -210,7 +322,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 4,
-       },
-       [64] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SIFCR_L,
-@@ -218,7 +329,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 0,
-       },
-       [65] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SIFCR_L,
-@@ -226,7 +336,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 1,
-       },
-       [66] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SIFCR_L,
-@@ -234,7 +343,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 2,
-       },
-       [67] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_A,
-               .force  = IPIC_SIFCR_L,
-@@ -242,7 +350,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 3,
-       },
-       [68] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SIFCR_L,
-@@ -250,7 +357,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 0,
-       },
-       [69] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SIFCR_L,
-@@ -258,7 +364,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 1,
-       },
-       [70] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SIFCR_L,
-@@ -266,7 +371,6 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 2,
-       },
-       [71] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = IPIC_SMPRR_B,
-               .force  = IPIC_SIFCR_L,
-@@ -274,91 +378,120 @@ static struct ipic_info ipic_info[] = {
-               .prio_mask = 3,
-       },
-       [72] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 8,
-       },
-       [73] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 9,
-       },
-       [74] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 10,
-       },
-       [75] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 11,
-       },
-       [76] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 12,
-       },
-       [77] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 13,
-       },
-       [78] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 14,
-       },
-       [79] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 15,
-       },
-       [80] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 16,
-       },
-+      [81] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 17,
-+      },
-+      [82] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 18,
-+      },
-+      [83] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 19,
-+      },
-       [84] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 20,
-       },
-       [85] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 21,
-       },
-+      [86] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 22,
-+      },
-+      [87] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 23,
-+      },
-+      [88] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 24,
-+      },
-+      [89] = {
-+              .mask   = IPIC_SIMSR_L,
-+              .prio   = 0,
-+              .force  = IPIC_SIFCR_L,
-+              .bit    = 25,
-+      },
-       [90] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-               .bit    = 26,
-       },
-       [91] = {
--              .pend   = IPIC_SIPNR_L,
-               .mask   = IPIC_SIMSR_L,
-               .prio   = 0,
-               .force  = IPIC_SIFCR_L,
-@@ -412,6 +545,10 @@ static void ipic_mask_irq(unsigned int v
-       temp &= ~(1 << (31 - ipic_info[src].bit));
-       ipic_write(ipic->regs, ipic_info[src].mask, temp);
-+      /* mb() can't guarantee that masking is finished.  But it does finish
-+       * for nearly all cases. */
-+      mb();
-+
-       spin_unlock_irqrestore(&ipic_lock, flags);
- }
-@@ -424,9 +561,13 @@ static void ipic_ack_irq(unsigned int vi
-       spin_lock_irqsave(&ipic_lock, flags);
--      temp = ipic_read(ipic->regs, ipic_info[src].pend);
-+      temp = ipic_read(ipic->regs, ipic_info[src].ack);
-       temp |= (1 << (31 - ipic_info[src].bit));
--      ipic_write(ipic->regs, ipic_info[src].pend, temp);
-+      ipic_write(ipic->regs, ipic_info[src].ack, temp);
-+
-+      /* mb() can't guarantee that ack is finished.  But it does finish
-+       * for nearly all cases. */
-+      mb();
-       spin_unlock_irqrestore(&ipic_lock, flags);
- }
-@@ -444,9 +585,13 @@ static void ipic_mask_irq_and_ack(unsign
-       temp &= ~(1 << (31 - ipic_info[src].bit));
-       ipic_write(ipic->regs, ipic_info[src].mask, temp);
--      temp = ipic_read(ipic->regs, ipic_info[src].pend);
-+      temp = ipic_read(ipic->regs, ipic_info[src].ack);
-       temp |= (1 << (31 - ipic_info[src].bit));
--      ipic_write(ipic->regs, ipic_info[src].pend, temp);
-+      ipic_write(ipic->regs, ipic_info[src].ack, temp);
-+
-+      /* mb() can't guarantee that ack is finished.  But it does finish
-+       * for nearly all cases. */
-+      mb();
-       spin_unlock_irqrestore(&ipic_lock, flags);
- }
-@@ -468,14 +613,22 @@ static int ipic_set_irq_type(unsigned in
-                       flow_type);
-               return -EINVAL;
-       }
-+      /* ipic supports only edge mode on external interrupts */
-+      if ((flow_type & IRQ_TYPE_EDGE_FALLING) && !ipic_info[src].ack) {
-+              printk(KERN_ERR "ipic: edge sense not supported on internal "
-+                              "interrupts\n");
-+              return -EINVAL;
-+      }
-       desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
-       desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
-       if (flow_type & IRQ_TYPE_LEVEL_LOW)  {
-               desc->status |= IRQ_LEVEL;
-               desc->handle_irq = handle_level_irq;
-+              desc->chip = &ipic_level_irq_chip;
-       } else {
-               desc->handle_irq = handle_edge_irq;
-+              desc->chip = &ipic_edge_irq_chip;
-       }
-       /* only EXT IRQ senses are programmable on ipic
-@@ -500,7 +653,16 @@ static int ipic_set_irq_type(unsigned in
-       return 0;
- }
--static struct irq_chip ipic_irq_chip = {
-+/* level interrupts and edge interrupts have different ack operations */
-+static struct irq_chip ipic_level_irq_chip = {
-+      .typename       = " IPIC  ",
-+      .unmask         = ipic_unmask_irq,
-+      .mask           = ipic_mask_irq,
-+      .mask_ack       = ipic_mask_irq,
-+      .set_type       = ipic_set_irq_type,
-+};
-+
-+static struct irq_chip ipic_edge_irq_chip = {
-       .typename       = " IPIC  ",
-       .unmask         = ipic_unmask_irq,
-       .mask           = ipic_mask_irq,
-@@ -519,13 +681,9 @@ static int ipic_host_map(struct irq_host
-                        irq_hw_number_t hw)
- {
-       struct ipic *ipic = h->host_data;
--      struct irq_chip *chip;
--
--      /* Default chip */
--      chip = &ipic->hc_irq;
-       set_irq_chip_data(virq, ipic);
--      set_irq_chip_and_handler(virq, chip, handle_level_irq);
-+      set_irq_chip_and_handler(virq, &ipic_level_irq_chip, handle_level_irq);
-       /* Set default irq type */
-       set_irq_type(virq, IRQ_TYPE_NONE);
-@@ -584,7 +742,6 @@ struct ipic * __init ipic_init(struct de
-       ipic->regs = ioremap(res.start, res.end - res.start + 1);
-       ipic->irqhost->host_data = ipic;
--      ipic->hc_irq = ipic_irq_chip;
-       /* init hw */
-       ipic_write(ipic->regs, IPIC_SICNR, 0x0);
-@@ -593,6 +750,10 @@ struct ipic * __init ipic_init(struct de
-        * configure SICFR accordingly */
-       if (flags & IPIC_SPREADMODE_GRP_A)
-               temp |= SICFR_IPSA;
-+      if (flags & IPIC_SPREADMODE_GRP_B)
-+              temp |= SICFR_IPSB;
-+      if (flags & IPIC_SPREADMODE_GRP_C)
-+              temp |= SICFR_IPSC;
-       if (flags & IPIC_SPREADMODE_GRP_D)
-               temp |= SICFR_IPSD;
-       if (flags & IPIC_SPREADMODE_MIX_A)
-@@ -600,7 +761,7 @@ struct ipic * __init ipic_init(struct de
-       if (flags & IPIC_SPREADMODE_MIX_B)
-               temp |= SICFR_MPSB;
--      ipic_write(ipic->regs, IPIC_SICNR, temp);
-+      ipic_write(ipic->regs, IPIC_SICFR, temp);
-       /* handle MCP route */
-       temp = 0;
-@@ -672,10 +833,12 @@ void ipic_set_highest_priority(unsigned 
- void ipic_set_default_priority(void)
- {
--      ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_SIPRR_A_DEFAULT);
--      ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_SIPRR_D_DEFAULT);
--      ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_SMPRR_A_DEFAULT);
--      ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_SMPRR_B_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_PRIORITY_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SIPRR_B, IPIC_PRIORITY_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SIPRR_C, IPIC_PRIORITY_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_PRIORITY_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_PRIORITY_DEFAULT);
-+      ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_PRIORITY_DEFAULT);
- }
- void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq)
---- a/arch/powerpc/sysdev/ipic.h
-+++ b/arch/powerpc/sysdev/ipic.h
-@@ -23,13 +23,12 @@
- #define IPIC_IRQ_EXT7 23
- /* Default Priority Registers */
--#define IPIC_SIPRR_A_DEFAULT 0x05309770
--#define IPIC_SIPRR_D_DEFAULT 0x05309770
--#define IPIC_SMPRR_A_DEFAULT 0x05309770
--#define IPIC_SMPRR_B_DEFAULT 0x05309770
-+#define IPIC_PRIORITY_DEFAULT 0x05309770
- /* System Global Interrupt Configuration Register */
- #define       SICFR_IPSA      0x00010000
-+#define       SICFR_IPSB      0x00020000
-+#define       SICFR_IPSC      0x00040000
- #define       SICFR_IPSD      0x00080000
- #define       SICFR_MPSA      0x00200000
- #define       SICFR_MPSB      0x00400000
-@@ -45,13 +44,11 @@ struct ipic {
-       /* The remapper for this IPIC */
-       struct irq_host         *irqhost;
--
--      /* The "linux" controller struct */
--      struct irq_chip         hc_irq;
- };
- struct ipic_info {
--      u8      pend;           /* pending register offset from base */
-+      u8      ack;            /* pending register offset from base if the irq
-+                                 supports ack operation */
-       u8      mask;           /* mask register offset from base */
-       u8      prio;           /* priority register offset from base */
-       u8      force;          /* force register offset from base */
---- a/arch/powerpc/sysdev/mmio_nvram.c
-+++ b/arch/powerpc/sysdev/mmio_nvram.c
-@@ -99,7 +99,7 @@ int __init mmio_nvram_init(void)
-       nvram_addr = r.start;
-       mmio_nvram_len = r.end - r.start + 1;
-       if ( (!mmio_nvram_len) || (!nvram_addr) ) {
--              printk(KERN_WARNING "nvram: address or lenght is 0\n");
-+              printk(KERN_WARNING "nvram: address or length is 0\n");
-               ret = -EIO;
-               goto out;
-       }
---- a/arch/powerpc/sysdev/mpic.c
-+++ b/arch/powerpc/sysdev/mpic.c
-@@ -83,6 +83,7 @@ static u32 mpic_infos[][MPIC_IDX_END] = 
-               MPIC_CPU_WHOAMI,
-               MPIC_CPU_INTACK,
-               MPIC_CPU_EOI,
-+              MPIC_CPU_MCACK,
-               MPIC_IRQ_BASE,
-               MPIC_IRQ_STRIDE,
-@@ -121,6 +122,7 @@ static u32 mpic_infos[][MPIC_IDX_END] = 
-               TSI108_CPU_WHOAMI,
-               TSI108_CPU_INTACK,
-               TSI108_CPU_EOI,
-+              TSI108_CPU_MCACK,
-               TSI108_IRQ_BASE,
-               TSI108_IRQ_STRIDE,
-@@ -265,7 +267,7 @@ static inline void _mpic_irq_write(struc
-  */
--static void _mpic_map_mmio(struct mpic *mpic, unsigned long phys_addr,
-+static void _mpic_map_mmio(struct mpic *mpic, phys_addr_t phys_addr,
-                          struct mpic_reg_bank *rb, unsigned int offset,
-                          unsigned int size)
- {
-@@ -285,7 +287,7 @@ static void _mpic_map_dcr(struct mpic *m
-       BUG_ON(!DCR_MAP_OK(rb->dhost));
- }
--static inline void mpic_map(struct mpic *mpic, unsigned long phys_addr,
-+static inline void mpic_map(struct mpic *mpic, phys_addr_t phys_addr,
-                           struct mpic_reg_bank *rb, unsigned int offset,
-                           unsigned int size)
- {
-@@ -612,12 +614,11 @@ static inline void mpic_eoi(struct mpic 
- }
- #ifdef CONFIG_SMP
--static irqreturn_t mpic_ipi_action(int irq, void *dev_id)
-+static irqreturn_t mpic_ipi_action(int irq, void *data)
- {
--      struct mpic *mpic;
-+      long ipi = (long)data;
--      mpic = mpic_find(irq, NULL);
--      smp_message_recv(mpic_irq_to_hw(irq) - mpic->ipi_vecs[0]);
-+      smp_message_recv(ipi);
-       return IRQ_HANDLED;
- }
-@@ -842,6 +843,24 @@ int mpic_set_irq_type(unsigned int virq,
-       return 0;
- }
-+void mpic_set_vector(unsigned int virq, unsigned int vector)
-+{
-+      struct mpic *mpic = mpic_from_irq(virq);
-+      unsigned int src = mpic_irq_to_hw(virq);
-+      unsigned int vecpri;
-+
-+      DBG("mpic: set_vector(mpic:@%p,virq:%d,src:%d,vector:0x%x)\n",
-+          mpic, virq, src, vector);
-+
-+      if (src >= mpic->irq_count)
-+              return;
-+
-+      vecpri = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI));
-+      vecpri = vecpri & ~MPIC_INFO(VECPRI_VECTOR_MASK);
-+      vecpri |= vector;
-+      mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
-+}
-+
- static struct irq_chip mpic_irq_chip = {
-       .mask           = mpic_mask_irq,
-       .unmask         = mpic_unmask_irq,
-@@ -1109,6 +1128,11 @@ struct mpic * __init mpic_alloc(struct d
-                       mb();
-       }
-+      if (flags & MPIC_ENABLE_MCK)
-+              mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
-+                         mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
-+                         | MPIC_GREG_GCONF_MCK);
-+
-       /* Read feature register, calculate num CPUs and, for non-ISU
-        * MPICs, num sources as well. On ISU MPICs, sources are counted
-        * as ISUs are added
-@@ -1230,6 +1254,8 @@ void __init mpic_init(struct mpic *mpic)
-               mpic_u3msi_init(mpic);
-       }
-+      mpic_pasemi_msi_init(mpic);
-+
-       for (i = 0; i < mpic->num_sources; i++) {
-               /* start with vector = source number, and masked */
-               u32 vecpri = MPIC_VECPRI_MASK | i |
-@@ -1253,6 +1279,11 @@ void __init mpic_init(struct mpic *mpic)
-                          mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
-                          | MPIC_GREG_GCONF_8259_PTHROU_DIS);
-+      if (mpic->flags & MPIC_NO_BIAS)
-+              mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
-+                      mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
-+                      | MPIC_GREG_GCONF_NO_BIAS);
-+
-       /* Set current processor priority to 0 */
-       mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
-@@ -1419,13 +1450,13 @@ void mpic_send_ipi(unsigned int ipi_no, 
-                      mpic_physmask(cpu_mask & cpus_addr(cpu_online_map)[0]));
- }
--unsigned int mpic_get_one_irq(struct mpic *mpic)
-+static unsigned int _mpic_get_one_irq(struct mpic *mpic, int reg)
- {
-       u32 src;
--      src = mpic_cpu_read(MPIC_INFO(CPU_INTACK)) & MPIC_INFO(VECPRI_VECTOR_MASK);
-+      src = mpic_cpu_read(reg) & MPIC_INFO(VECPRI_VECTOR_MASK);
- #ifdef DEBUG_LOW
--      DBG("%s: get_one_irq(): %d\n", mpic->name, src);
-+      DBG("%s: get_one_irq(reg 0x%x): %d\n", mpic->name, reg, src);
- #endif
-       if (unlikely(src == mpic->spurious_vec)) {
-               if (mpic->flags & MPIC_SPV_EOI)
-@@ -1443,6 +1474,11 @@ unsigned int mpic_get_one_irq(struct mpi
-       return irq_linear_revmap(mpic->irqhost, src);
- }
-+unsigned int mpic_get_one_irq(struct mpic *mpic)
-+{
-+      return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_INTACK));
-+}
-+
- unsigned int mpic_get_irq(void)
- {
-       struct mpic *mpic = mpic_primary;
-@@ -1452,12 +1488,20 @@ unsigned int mpic_get_irq(void)
-       return mpic_get_one_irq(mpic);
- }
-+unsigned int mpic_get_mcirq(void)
-+{
-+      struct mpic *mpic = mpic_primary;
-+
-+      BUG_ON(mpic == NULL);
-+
-+      return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_MCACK));
-+}
- #ifdef CONFIG_SMP
- void mpic_request_ipis(void)
- {
-       struct mpic *mpic = mpic_primary;
--      int i, err;
-+      long i, err;
-       static char *ipi_names[] = {
-               "IPI0 (call function)",
-               "IPI1 (reschedule)",
-@@ -1472,14 +1516,14 @@ void mpic_request_ipis(void)
-               unsigned int vipi = irq_create_mapping(mpic->irqhost,
-                                                      mpic->ipi_vecs[0] + i);
-               if (vipi == NO_IRQ) {
--                      printk(KERN_ERR "Failed to map IPI %d\n", i);
-+                      printk(KERN_ERR "Failed to map IPI %ld\n", i);
-                       break;
-               }
-               err = request_irq(vipi, mpic_ipi_action,
-                                 IRQF_DISABLED|IRQF_PERCPU,
--                                ipi_names[i], mpic);
-+                                ipi_names[i], (void *)i);
-               if (err) {
--                      printk(KERN_ERR "Request of irq %d for IPI %d failed\n",
-+                      printk(KERN_ERR "Request of irq %d for IPI %ld failed\n",
-                              vipi, i);
-                       break;
-               }
---- a/arch/powerpc/sysdev/mpic.h
-+++ b/arch/powerpc/sysdev/mpic.h
-@@ -17,6 +17,7 @@ extern int mpic_msi_init_allocator(struc
- extern irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num);
- extern void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num);
- extern int mpic_u3msi_init(struct mpic *mpic);
-+extern int mpic_pasemi_msi_init(struct mpic *mpic);
- #else
- static inline void mpic_msi_reserve_hwirq(struct mpic *mpic,
-                                         irq_hw_number_t hwirq)
-@@ -28,12 +29,15 @@ static inline int mpic_u3msi_init(struct
- {
-       return -1;
- }
-+
-+static inline int mpic_pasemi_msi_init(struct mpic *mpic)
-+{
-+      return -1;
-+}
- #endif
- extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
--extern void mpic_end_irq(unsigned int irq);
--extern void mpic_mask_irq(unsigned int irq);
--extern void mpic_unmask_irq(unsigned int irq);
-+extern void mpic_set_vector(unsigned int virq, unsigned int vector);
- extern void mpic_set_affinity(unsigned int irq, cpumask_t cpumask);
- #endif /* _POWERPC_SYSDEV_MPIC_H */
---- /dev/null
-+++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright 2007, Olof Johansson, PA Semi
-+ *
-+ * Based on arch/powerpc/sysdev/mpic_u3msi.c:
-+ *
-+ * Copyright 2006, Segher Boessenkool, IBM Corporation.
-+ * Copyright 2006-2007, Michael Ellerman, IBM Corporation.
-+ *
-+ * This 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; version 2 of the
-+ * License.
-+ *
-+ */
-+
-+#undef DEBUG
-+
-+#include <linux/irq.h>
-+#include <linux/bootmem.h>
-+#include <linux/msi.h>
-+#include <asm/mpic.h>
-+#include <asm/prom.h>
-+#include <asm/hw_irq.h>
-+#include <asm/ppc-pci.h>
-+
-+#include "mpic.h"
-+
-+/* Allocate 16 interrupts per device, to give an alignment of 16,
-+ * since that's the size of the grouping w.r.t. affinity. If someone
-+ * needs more than 32 MSI's down the road we'll have to rethink this,
-+ * but it should be OK for now.
-+ */
-+#define ALLOC_CHUNK 16
-+
-+#define PASEMI_MSI_ADDR 0xfc080000
-+
-+/* A bit ugly, can we get this from the pci_dev somehow? */
-+static struct mpic *msi_mpic;
-+
-+
-+static void mpic_pasemi_msi_mask_irq(unsigned int irq)
-+{
-+      pr_debug("mpic_pasemi_msi_mask_irq %d\n", irq);
-+      mask_msi_irq(irq);
-+      mpic_mask_irq(irq);
-+}
-+
-+static void mpic_pasemi_msi_unmask_irq(unsigned int irq)
-+{
-+      pr_debug("mpic_pasemi_msi_unmask_irq %d\n", irq);
-+      mpic_unmask_irq(irq);
-+      unmask_msi_irq(irq);
-+}
-+
-+static struct irq_chip mpic_pasemi_msi_chip = {
-+      .shutdown       = mpic_pasemi_msi_mask_irq,
-+      .mask           = mpic_pasemi_msi_mask_irq,
-+      .unmask         = mpic_pasemi_msi_unmask_irq,
-+      .eoi            = mpic_end_irq,
-+      .set_type       = mpic_set_irq_type,
-+      .set_affinity   = mpic_set_affinity,
-+      .typename       = "PASEMI-MSI ",
-+};
-+
-+static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
-+{
-+      if (type == PCI_CAP_ID_MSIX)
-+              pr_debug("pasemi_msi: MSI-X untested, trying anyway\n");
-+
-+      return 0;
-+}
-+
-+static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
-+{
-+      struct msi_desc *entry;
-+
-+      pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev);
-+
-+      list_for_each_entry(entry, &pdev->msi_list, list) {
-+              if (entry->irq == NO_IRQ)
-+                      continue;
-+
-+              set_irq_msi(entry->irq, NULL);
-+              mpic_msi_free_hwirqs(msi_mpic, virq_to_hw(entry->irq),
-+                                   ALLOC_CHUNK);
-+              irq_dispose_mapping(entry->irq);
-+      }
-+
-+      return;
-+}
-+
-+static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
-+{
-+      irq_hw_number_t hwirq;
-+      unsigned int virq;
-+      struct msi_desc *entry;
-+      struct msi_msg msg;
-+      u64 addr;
-+
-+      pr_debug("pasemi_msi_setup_msi_irqs, pdev %p nvec %d type %d\n",
-+               pdev, nvec, type);
-+
-+      msg.address_hi = 0;
-+      msg.address_lo = PASEMI_MSI_ADDR;
-+
-+      list_for_each_entry(entry, &pdev->msi_list, list) {
-+              /* Allocate 16 interrupts for now, since that's the grouping for
-+               * affinity. This can be changed later if it turns out 32 is too
-+               * few MSIs for someone, but restrictions will apply to how the
-+               * sources can be changed independently.
-+               */
-+              hwirq = mpic_msi_alloc_hwirqs(msi_mpic, ALLOC_CHUNK);
-+              if (hwirq < 0) {
-+                      pr_debug("pasemi_msi: failed allocating hwirq\n");
-+                      return hwirq;
-+              }
-+
-+              virq = irq_create_mapping(msi_mpic->irqhost, hwirq);
-+              if (virq == NO_IRQ) {
-+                      pr_debug("pasemi_msi: failed mapping hwirq 0x%lx\n", hwirq);
-+                      mpic_msi_free_hwirqs(msi_mpic, hwirq, ALLOC_CHUNK);
-+                      return -ENOSPC;
-+              }
-+
-+              /* Vector on MSI is really an offset, the hardware adds
-+               * it to the value written at the magic address. So set
-+               * it to 0 to remain sane.
-+               */
-+              mpic_set_vector(virq, 0);
-+
-+              set_irq_msi(virq, entry);
-+              set_irq_chip(virq, &mpic_pasemi_msi_chip);
-+              set_irq_type(virq, IRQ_TYPE_EDGE_RISING);
-+
-+              pr_debug("pasemi_msi: allocated virq 0x%x (hw 0x%lx) addr 0x%lx\n",
-+                        virq, hwirq, addr);
-+
-+              /* Likewise, the device writes [0...511] into the target
-+               * register to generate MSI [512...1023]
-+               */
-+              msg.data = hwirq-0x200;
-+              write_msi_msg(virq, &msg);
-+      }
-+
-+      return 0;
-+}
-+
-+int mpic_pasemi_msi_init(struct mpic *mpic)
-+{
-+      int rc;
-+
-+      if (!mpic->irqhost->of_node ||
-+          !of_device_is_compatible(mpic->irqhost->of_node,
-+                                   "pasemi,pwrficient-openpic"))
-+              return -ENODEV;
-+
-+      rc = mpic_msi_init_allocator(mpic);
-+      if (rc) {
-+              pr_debug("pasemi_msi: Error allocating bitmap!\n");
-+              return rc;
-+      }
-+
-+      pr_debug("pasemi_msi: Registering PA Semi MPIC MSI callbacks\n");
-+
-+      msi_mpic = mpic;
-+      WARN_ON(ppc_md.setup_msi_irqs);
-+      ppc_md.setup_msi_irqs = pasemi_msi_setup_msi_irqs;
-+      ppc_md.teardown_msi_irqs = pasemi_msi_teardown_msi_irqs;
-+      ppc_md.msi_check_device = pasemi_msi_check_device;
-+
-+      return 0;
-+}
---- a/arch/powerpc/sysdev/mv64x60_dev.c
-+++ b/arch/powerpc/sysdev/mv64x60_dev.c
-@@ -241,7 +241,7 @@ static int __init mv64x60_eth_device_set
-       /* only register the shared platform device the first time through */
-       if (id == 0 && (err = eth_register_shared_pdev(np)))
--              return err;;
-+              return err;
-       memset(r, 0, sizeof(r));
-       of_irq_to_resource(np, 0, &r[0]);
-@@ -451,22 +451,19 @@ static int __init mv64x60_device_setup(v
-       int id;
-       int err;
--      for (id = 0;
--           (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); id++)
--              if ((err = mv64x60_mpsc_device_setup(np, id)))
-+      id = 0;
-+      for_each_compatible_node(np, "serial", "marvell,mpsc")
-+              if ((err = mv64x60_mpsc_device_setup(np, id++)))
-                       goto error;
--      for (id = 0;
--           (np = of_find_compatible_node(np, "network",
--                                         "marvell,mv64x60-eth"));
--           id++)
--              if ((err = mv64x60_eth_device_setup(np, id)))
-+      id = 0;
-+      for_each_compatible_node(np, "network", "marvell,mv64x60-eth")
-+              if ((err = mv64x60_eth_device_setup(np, id++)))
-                       goto error;
--      for (id = 0;
--           (np = of_find_compatible_node(np, "i2c", "marvell,mv64x60-i2c"));
--           id++)
--              if ((err = mv64x60_i2c_device_setup(np, id)))
-+      id = 0;
-+      for_each_compatible_node(np, "i2c", "marvell,mv64x60-i2c")
-+              if ((err = mv64x60_i2c_device_setup(np, id++)))
-                       goto error;
-       /* support up to one watchdog timer */
-@@ -477,7 +474,6 @@ static int __init mv64x60_device_setup(v
-               of_node_put(np);
-       }
--
-       return 0;
- error:
---- a/arch/powerpc/sysdev/mv64x60_pci.c
-+++ b/arch/powerpc/sysdev/mv64x60_pci.c
-@@ -164,8 +164,8 @@ static int __init mv64x60_add_bridge(str
- void __init mv64x60_pci_init(void)
- {
--      struct device_node *np = NULL;
-+      struct device_node *np;
--      while ((np = of_find_compatible_node(np, "pci", "marvell,mv64x60-pci")))
-+      for_each_compatible_node(np, "pci", "marvell,mv64x60-pci")
-               mv64x60_add_bridge(np);
- }
---- a/arch/powerpc/sysdev/mv64x60_udbg.c
-+++ b/arch/powerpc/sysdev/mv64x60_udbg.c
-@@ -85,10 +85,10 @@ static void mv64x60_udbg_init(void)
-       if (!stdout)
-               return;
--      for (np = NULL;
--           (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); )
-+      for_each_compatible_node(np, "serial", "marvell,mpsc") {
-               if (np == stdout)
-                       break;
-+      }
-       of_node_put(stdout);
-       if (!np)
---- /dev/null
-+++ b/arch/powerpc/sysdev/of_rtc.c
-@@ -0,0 +1,59 @@
-+/*
-+ * Instantiate mmio-mapped RTC chips based on device tree information
-+ *
-+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/kernel.h>
-+#include <linux/of.h>
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+static __initdata struct {
-+      const char *compatible;
-+      char *plat_name;
-+} of_rtc_table[] = {
-+      { "ds1743-nvram", "rtc-ds1742" },
-+};
-+
-+void __init of_instantiate_rtc(void)
-+{
-+      struct device_node *node;
-+      int err;
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
-+              char *plat_name = of_rtc_table[i].plat_name;
-+
-+              for_each_compatible_node(node, NULL,
-+                                       of_rtc_table[i].compatible) {
-+                      struct resource *res;
-+
-+                      res = kmalloc(sizeof(*res), GFP_KERNEL);
-+                      if (!res) {
-+                              printk(KERN_ERR "OF RTC: Out of memory "
-+                                     "allocating resource structure for %s\n",
-+                                     node->full_name);
-+                              continue;
-+                      }
-+
-+                      err = of_address_to_resource(node, 0, res);
-+                      if (err) {
-+                              printk(KERN_ERR "OF RTC: Error "
-+                                     "translating resources for %s\n",
-+                                     node->full_name);
-+                              continue;
-+                      }
-+
-+                      printk(KERN_INFO "OF_RTC: %s is a %s @ 0x%llx-0x%llx\n",
-+                             node->full_name, plat_name,
-+                             (unsigned long long)res->start,
-+                             (unsigned long long)res->end);
-+                      platform_device_register_simple(plat_name, -1, res, 1);
-+              }
-+      }
-+}
---- a/arch/powerpc/sysdev/pmi.c
-+++ b/arch/powerpc/sysdev/pmi.c
-@@ -28,9 +28,9 @@
- #include <linux/completion.h>
- #include <linux/spinlock.h>
- #include <linux/workqueue.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/io.h>
- #include <asm/pmi.h>
- #include <asm/prom.h>
---- /dev/null
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.c
-@@ -0,0 +1,1528 @@
-+/*
-+ * PCI / PCI-X / PCI-Express support for 4xx parts
-+ *
-+ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
-+ *
-+ * Most PCI Express code is coming from Stefan Roese implementation for
-+ * arch/ppc in the Denx tree, slightly reworked by me.
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * Some of that comes itself from a previous implementation for 440SPE only
-+ * by Roland Dreier:
-+ *
-+ * Copyright (c) 2005 Cisco Systems.  All rights reserved.
-+ * Roland Dreier <rolandd@cisco.com>
-+ *
-+ */
-+
-+#undef DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/of.h>
-+#include <linux/bootmem.h>
-+#include <linux/delay.h>
-+
-+#include <asm/io.h>
-+#include <asm/pci-bridge.h>
-+#include <asm/machdep.h>
-+#include <asm/dcr.h>
-+#include <asm/dcr-regs.h>
-+
-+#include "ppc4xx_pci.h"
-+
-+static int dma_offset_set;
-+
-+/* Move that to a useable header */
-+extern unsigned long total_memory;
-+
-+#define U64_TO_U32_LOW(val)   ((u32)((val) & 0x00000000ffffffffULL))
-+#define U64_TO_U32_HIGH(val)  ((u32)((val) >> 32))
-+
-+#ifdef CONFIG_RESOURCES_64BIT
-+#define RES_TO_U32_LOW(val)   U64_TO_U32_LOW(val)
-+#define RES_TO_U32_HIGH(val)  U64_TO_U32_HIGH(val)
-+#else
-+#define RES_TO_U32_LOW(val)   (val)
-+#define RES_TO_U32_HIGH(val)  (0)
-+#endif
-+
-+static inline int ppc440spe_revA(void)
-+{
-+      /* Catch both 440SPe variants, with and without RAID6 support */
-+        if ((mfspr(SPRN_PVR) & 0xffefffff) == 0x53421890)
-+                return 1;
-+        else
-+                return 0;
-+}
-+
-+static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev)
-+{
-+      struct pci_controller *hose;
-+      int i;
-+
-+      if (dev->devfn != 0 || dev->bus->self != NULL)
-+              return;
-+
-+      hose = pci_bus_to_host(dev->bus);
-+      if (hose == NULL)
-+              return;
-+
-+      if (!of_device_is_compatible(hose->dn, "ibm,plb-pciex") &&
-+          !of_device_is_compatible(hose->dn, "ibm,plb-pcix") &&
-+          !of_device_is_compatible(hose->dn, "ibm,plb-pci"))
-+              return;
-+
-+      /* Hide the PCI host BARs from the kernel as their content doesn't
-+       * fit well in the resource management
-+       */
-+      for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-+              dev->resource[i].start = dev->resource[i].end = 0;
-+              dev->resource[i].flags = 0;
-+      }
-+
-+      printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n",
-+             pci_name(dev));
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_ppc4xx_pci_bridge);
-+
-+static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose,
-+                                        void __iomem *reg,
-+                                        struct resource *res)
-+{
-+      u64 size;
-+      const u32 *ranges;
-+      int rlen;
-+      int pna = of_n_addr_cells(hose->dn);
-+      int np = pna + 5;
-+
-+      /* Default */
-+      res->start = 0;
-+      res->end = size = 0x80000000;
-+      res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
-+
-+      /* Get dma-ranges property */
-+      ranges = of_get_property(hose->dn, "dma-ranges", &rlen);
-+      if (ranges == NULL)
-+              goto out;
-+
-+      /* Walk it */
-+      while ((rlen -= np * 4) >= 0) {
-+              u32 pci_space = ranges[0];
-+              u64 pci_addr = of_read_number(ranges + 1, 2);
-+              u64 cpu_addr = of_translate_dma_address(hose->dn, ranges + 3);
-+              size = of_read_number(ranges + pna + 3, 2);
-+              ranges += np;
-+              if (cpu_addr == OF_BAD_ADDR || size == 0)
-+                      continue;
-+
-+              /* We only care about memory */
-+              if ((pci_space & 0x03000000) != 0x02000000)
-+                      continue;
-+
-+              /* We currently only support memory at 0, and pci_addr
-+               * within 32 bits space
-+               */
-+              if (cpu_addr != 0 || pci_addr > 0xffffffff) {
-+                      printk(KERN_WARNING "%s: Ignored unsupported dma range"
-+                             " 0x%016llx...0x%016llx -> 0x%016llx\n",
-+                             hose->dn->full_name,
-+                             pci_addr, pci_addr + size - 1, cpu_addr);
-+                      continue;
-+              }
-+
-+              /* Check if not prefetchable */
-+              if (!(pci_space & 0x40000000))
-+                      res->flags &= ~IORESOURCE_PREFETCH;
-+
-+
-+              /* Use that */
-+              res->start = pci_addr;
-+#ifndef CONFIG_RESOURCES_64BIT
-+              /* Beware of 32 bits resources */
-+              if ((pci_addr + size) > 0x100000000ull)
-+                      res->end = 0xffffffff;
-+              else
-+#endif
-+                      res->end = res->start + size - 1;
-+              break;
-+      }
-+
-+      /* We only support one global DMA offset */
-+      if (dma_offset_set && pci_dram_offset != res->start) {
-+              printk(KERN_ERR "%s: dma-ranges(s) mismatch\n",
-+                     hose->dn->full_name);
-+              return -ENXIO;
-+      }
-+
-+      /* Check that we can fit all of memory as we don't support
-+       * DMA bounce buffers
-+       */
-+      if (size < total_memory) {
-+              printk(KERN_ERR "%s: dma-ranges too small "
-+                     "(size=%llx total_memory=%lx)\n",
-+                     hose->dn->full_name, size, total_memory);
-+              return -ENXIO;
-+      }
-+
-+      /* Check we are a power of 2 size and that base is a multiple of size*/
-+      if (!is_power_of_2(size) ||
-+          (res->start & (size - 1)) != 0) {
-+              printk(KERN_ERR "%s: dma-ranges unaligned\n",
-+                     hose->dn->full_name);
-+              return -ENXIO;
-+      }
-+
-+      /* Check that we are fully contained within 32 bits space */
-+      if (res->end > 0xffffffff) {
-+              printk(KERN_ERR "%s: dma-ranges outside of 32 bits space\n",
-+                     hose->dn->full_name);
-+              return -ENXIO;
-+      }
-+ out:
-+      dma_offset_set = 1;
-+      pci_dram_offset = res->start;
-+
-+      printk(KERN_INFO "4xx PCI DMA offset set to 0x%08lx\n",
-+             pci_dram_offset);
-+      return 0;
-+}
-+
-+/*
-+ * 4xx PCI 2.x part
-+ */
-+
-+static void __init ppc4xx_configure_pci_PMMs(struct pci_controller *hose,
-+                                           void __iomem *reg)
-+{
-+      u32 la, ma, pcila, pciha;
-+      int i, j;
-+
-+      /* Setup outbound memory windows */
-+      for (i = j = 0; i < 3; i++) {
-+              struct resource *res = &hose->mem_resources[i];
-+
-+              /* we only care about memory windows */
-+              if (!(res->flags & IORESOURCE_MEM))
-+                      continue;
-+              if (j > 2) {
-+                      printk(KERN_WARNING "%s: Too many ranges\n",
-+                             hose->dn->full_name);
-+                      break;
-+              }
-+
-+              /* Calculate register values */
-+              la = res->start;
-+              pciha = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+              pcila = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+
-+              ma = res->end + 1 - res->start;
-+              if (!is_power_of_2(ma) || ma < 0x1000 || ma > 0xffffffffu) {
-+                      printk(KERN_WARNING "%s: Resource out of range\n",
-+                             hose->dn->full_name);
-+                      continue;
-+              }
-+              ma = (0xffffffffu << ilog2(ma)) | 0x1;
-+              if (res->flags & IORESOURCE_PREFETCH)
-+                      ma |= 0x2;
-+
-+              /* Program register values */
-+              writel(la, reg + PCIL0_PMM0LA + (0x10 * j));
-+              writel(pcila, reg + PCIL0_PMM0PCILA + (0x10 * j));
-+              writel(pciha, reg + PCIL0_PMM0PCIHA + (0x10 * j));
-+              writel(ma, reg + PCIL0_PMM0MA + (0x10 * j));
-+              j++;
-+      }
-+}
-+
-+static void __init ppc4xx_configure_pci_PTMs(struct pci_controller *hose,
-+                                           void __iomem *reg,
-+                                           const struct resource *res)
-+{
-+      resource_size_t size = res->end - res->start + 1;
-+      u32 sa;
-+
-+      /* Calculate window size */
-+      sa = (0xffffffffu << ilog2(size)) | 1;
-+      sa |= 0x1;
-+
-+      /* RAM is always at 0 local for now */
-+      writel(0, reg + PCIL0_PTM1LA);
-+      writel(sa, reg + PCIL0_PTM1MS);
-+
-+      /* Map on PCI side */
-+      early_write_config_dword(hose, hose->first_busno, 0,
-+                               PCI_BASE_ADDRESS_1, res->start);
-+      early_write_config_dword(hose, hose->first_busno, 0,
-+                               PCI_BASE_ADDRESS_2, 0x00000000);
-+      early_write_config_word(hose, hose->first_busno, 0,
-+                              PCI_COMMAND, 0x0006);
-+}
-+
-+static void __init ppc4xx_probe_pci_bridge(struct device_node *np)
-+{
-+      /* NYI */
-+      struct resource rsrc_cfg;
-+      struct resource rsrc_reg;
-+      struct resource dma_window;
-+      struct pci_controller *hose = NULL;
-+      void __iomem *reg = NULL;
-+      const int *bus_range;
-+      int primary = 0;
-+
-+      /* Fetch config space registers address */
-+      if (of_address_to_resource(np, 0, &rsrc_cfg)) {
-+              printk(KERN_ERR "%s:Can't get PCI config register base !",
-+                     np->full_name);
-+              return;
-+      }
-+      /* Fetch host bridge internal registers address */
-+      if (of_address_to_resource(np, 3, &rsrc_reg)) {
-+              printk(KERN_ERR "%s: Can't get PCI internal register base !",
-+                     np->full_name);
-+              return;
-+      }
-+
-+      /* Check if primary bridge */
-+      if (of_get_property(np, "primary", NULL))
-+              primary = 1;
-+
-+      /* Get bus range if any */
-+      bus_range = of_get_property(np, "bus-range", NULL);
-+
-+      /* Map registers */
-+      reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
-+      if (reg == NULL) {
-+              printk(KERN_ERR "%s: Can't map registers !", np->full_name);
-+              goto fail;
-+      }
-+
-+      /* Allocate the host controller data structure */
-+      hose = pcibios_alloc_controller(np);
-+      if (!hose)
-+              goto fail;
-+
-+      hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+      hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+      /* Setup config space */
-+      setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
-+
-+      /* Disable all windows */
-+      writel(0, reg + PCIL0_PMM0MA);
-+      writel(0, reg + PCIL0_PMM1MA);
-+      writel(0, reg + PCIL0_PMM2MA);
-+      writel(0, reg + PCIL0_PTM1MS);
-+      writel(0, reg + PCIL0_PTM2MS);
-+
-+      /* Parse outbound mapping resources */
-+      pci_process_bridge_OF_ranges(hose, np, primary);
-+
-+      /* Parse inbound mapping resources */
-+      if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
-+              goto fail;
-+
-+      /* Configure outbound ranges POMs */
-+      ppc4xx_configure_pci_PMMs(hose, reg);
-+
-+      /* Configure inbound ranges PIMs */
-+      ppc4xx_configure_pci_PTMs(hose, reg, &dma_window);
-+
-+      /* We don't need the registers anymore */
-+      iounmap(reg);
-+      return;
-+
-+ fail:
-+      if (hose)
-+              pcibios_free_controller(hose);
-+      if (reg)
-+              iounmap(reg);
-+}
-+
-+/*
-+ * 4xx PCI-X part
-+ */
-+
-+static void __init ppc4xx_configure_pcix_POMs(struct pci_controller *hose,
-+                                            void __iomem *reg)
-+{
-+      u32 lah, lal, pciah, pcial, sa;
-+      int i, j;
-+
-+      /* Setup outbound memory windows */
-+      for (i = j = 0; i < 3; i++) {
-+              struct resource *res = &hose->mem_resources[i];
-+
-+              /* we only care about memory windows */
-+              if (!(res->flags & IORESOURCE_MEM))
-+                      continue;
-+              if (j > 1) {
-+                      printk(KERN_WARNING "%s: Too many ranges\n",
-+                             hose->dn->full_name);
-+                      break;
-+              }
-+
-+              /* Calculate register values */
-+              lah = RES_TO_U32_HIGH(res->start);
-+              lal = RES_TO_U32_LOW(res->start);
-+              pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+              pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+              sa = res->end + 1 - res->start;
-+              if (!is_power_of_2(sa) || sa < 0x100000 ||
-+                  sa > 0xffffffffu) {
-+                      printk(KERN_WARNING "%s: Resource out of range\n",
-+                             hose->dn->full_name);
-+                      continue;
-+              }
-+              sa = (0xffffffffu << ilog2(sa)) | 0x1;
-+
-+              /* Program register values */
-+              if (j == 0) {
-+                      writel(lah, reg + PCIX0_POM0LAH);
-+                      writel(lal, reg + PCIX0_POM0LAL);
-+                      writel(pciah, reg + PCIX0_POM0PCIAH);
-+                      writel(pcial, reg + PCIX0_POM0PCIAL);
-+                      writel(sa, reg + PCIX0_POM0SA);
-+              } else {
-+                      writel(lah, reg + PCIX0_POM1LAH);
-+                      writel(lal, reg + PCIX0_POM1LAL);
-+                      writel(pciah, reg + PCIX0_POM1PCIAH);
-+                      writel(pcial, reg + PCIX0_POM1PCIAL);
-+                      writel(sa, reg + PCIX0_POM1SA);
-+              }
-+              j++;
-+      }
-+}
-+
-+static void __init ppc4xx_configure_pcix_PIMs(struct pci_controller *hose,
-+                                            void __iomem *reg,
-+                                            const struct resource *res,
-+                                            int big_pim,
-+                                            int enable_msi_hole)
-+{
-+      resource_size_t size = res->end - res->start + 1;
-+      u32 sa;
-+
-+      /* RAM is always at 0 */
-+      writel(0x00000000, reg + PCIX0_PIM0LAH);
-+      writel(0x00000000, reg + PCIX0_PIM0LAL);
-+
-+      /* Calculate window size */
-+      sa = (0xffffffffu << ilog2(size)) | 1;
-+      sa |= 0x1;
-+      if (res->flags & IORESOURCE_PREFETCH)
-+              sa |= 0x2;
-+      if (enable_msi_hole)
-+              sa |= 0x4;
-+      writel(sa, reg + PCIX0_PIM0SA);
-+      if (big_pim)
-+              writel(0xffffffff, reg + PCIX0_PIM0SAH);
-+
-+      /* Map on PCI side */
-+      writel(0x00000000, reg + PCIX0_BAR0H);
-+      writel(res->start, reg + PCIX0_BAR0L);
-+      writew(0x0006, reg + PCIX0_COMMAND);
-+}
-+
-+static void __init ppc4xx_probe_pcix_bridge(struct device_node *np)
-+{
-+      struct resource rsrc_cfg;
-+      struct resource rsrc_reg;
-+      struct resource dma_window;
-+      struct pci_controller *hose = NULL;
-+      void __iomem *reg = NULL;
-+      const int *bus_range;
-+      int big_pim = 0, msi = 0, primary = 0;
-+
-+      /* Fetch config space registers address */
-+      if (of_address_to_resource(np, 0, &rsrc_cfg)) {
-+              printk(KERN_ERR "%s:Can't get PCI-X config register base !",
-+                     np->full_name);
-+              return;
-+      }
-+      /* Fetch host bridge internal registers address */
-+      if (of_address_to_resource(np, 3, &rsrc_reg)) {
-+              printk(KERN_ERR "%s: Can't get PCI-X internal register base !",
-+                     np->full_name);
-+              return;
-+      }
-+
-+      /* Check if it supports large PIMs (440GX) */
-+      if (of_get_property(np, "large-inbound-windows", NULL))
-+              big_pim = 1;
-+
-+      /* Check if we should enable MSIs inbound hole */
-+      if (of_get_property(np, "enable-msi-hole", NULL))
-+              msi = 1;
-+
-+      /* Check if primary bridge */
-+      if (of_get_property(np, "primary", NULL))
-+              primary = 1;
-+
-+      /* Get bus range if any */
-+      bus_range = of_get_property(np, "bus-range", NULL);
-+
-+      /* Map registers */
-+      reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
-+      if (reg == NULL) {
-+              printk(KERN_ERR "%s: Can't map registers !", np->full_name);
-+              goto fail;
-+      }
-+
-+      /* Allocate the host controller data structure */
-+      hose = pcibios_alloc_controller(np);
-+      if (!hose)
-+              goto fail;
-+
-+      hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+      hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+      /* Setup config space */
-+      setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
-+
-+      /* Disable all windows */
-+      writel(0, reg + PCIX0_POM0SA);
-+      writel(0, reg + PCIX0_POM1SA);
-+      writel(0, reg + PCIX0_POM2SA);
-+      writel(0, reg + PCIX0_PIM0SA);
-+      writel(0, reg + PCIX0_PIM1SA);
-+      writel(0, reg + PCIX0_PIM2SA);
-+      if (big_pim) {
-+              writel(0, reg + PCIX0_PIM0SAH);
-+              writel(0, reg + PCIX0_PIM2SAH);
-+      }
-+
-+      /* Parse outbound mapping resources */
-+      pci_process_bridge_OF_ranges(hose, np, primary);
-+
-+      /* Parse inbound mapping resources */
-+      if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
-+              goto fail;
-+
-+      /* Configure outbound ranges POMs */
-+      ppc4xx_configure_pcix_POMs(hose, reg);
-+
-+      /* Configure inbound ranges PIMs */
-+      ppc4xx_configure_pcix_PIMs(hose, reg, &dma_window, big_pim, msi);
-+
-+      /* We don't need the registers anymore */
-+      iounmap(reg);
-+      return;
-+
-+ fail:
-+      if (hose)
-+              pcibios_free_controller(hose);
-+      if (reg)
-+              iounmap(reg);
-+}
-+
-+#ifdef CONFIG_PPC4xx_PCI_EXPRESS
-+
-+/*
-+ * 4xx PCI-Express part
-+ *
-+ * We support 3 parts currently based on the compatible property:
-+ *
-+ * ibm,plb-pciex-440spe
-+ * ibm,plb-pciex-405ex
-+ *
-+ * Anything else will be rejected for now as they are all subtly
-+ * different unfortunately.
-+ *
-+ */
-+
-+#define MAX_PCIE_BUS_MAPPED   0x40
-+
-+struct ppc4xx_pciex_port
-+{
-+      struct pci_controller   *hose;
-+      struct device_node      *node;
-+      unsigned int            index;
-+      int                     endpoint;
-+      int                     link;
-+      int                     has_ibpre;
-+      unsigned int            sdr_base;
-+      dcr_host_t              dcrs;
-+      struct resource         cfg_space;
-+      struct resource         utl_regs;
-+      void __iomem            *utl_base;
-+};
-+
-+static struct ppc4xx_pciex_port *ppc4xx_pciex_ports;
-+static unsigned int ppc4xx_pciex_port_count;
-+
-+struct ppc4xx_pciex_hwops
-+{
-+      int (*core_init)(struct device_node *np);
-+      int (*port_init_hw)(struct ppc4xx_pciex_port *port);
-+      int (*setup_utl)(struct ppc4xx_pciex_port *port);
-+};
-+
-+static struct ppc4xx_pciex_hwops *ppc4xx_pciex_hwops;
-+
-+#ifdef CONFIG_44x
-+
-+/* Check various reset bits of the 440SPe PCIe core */
-+static int __init ppc440spe_pciex_check_reset(struct device_node *np)
-+{
-+      u32 valPE0, valPE1, valPE2;
-+      int err = 0;
-+
-+      /* SDR0_PEGPLLLCT1 reset */
-+      if (!(mfdcri(SDR0, PESDR0_PLLLCT1) & 0x01000000)) {
-+              /*
-+               * the PCIe core was probably already initialised
-+               * by firmware - let's re-reset RCSSET regs
-+               *
-+               * -- Shouldn't we also re-reset the whole thing ? -- BenH
-+               */
-+              pr_debug("PCIE: SDR0_PLLLCT1 already reset.\n");
-+              mtdcri(SDR0, PESDR0_440SPE_RCSSET, 0x01010000);
-+              mtdcri(SDR0, PESDR1_440SPE_RCSSET, 0x01010000);
-+              mtdcri(SDR0, PESDR2_440SPE_RCSSET, 0x01010000);
-+      }
-+
-+      valPE0 = mfdcri(SDR0, PESDR0_440SPE_RCSSET);
-+      valPE1 = mfdcri(SDR0, PESDR1_440SPE_RCSSET);
-+      valPE2 = mfdcri(SDR0, PESDR2_440SPE_RCSSET);
-+
-+      /* SDR0_PExRCSSET rstgu */
-+      if (!(valPE0 & 0x01000000) ||
-+          !(valPE1 & 0x01000000) ||
-+          !(valPE2 & 0x01000000)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstgu error\n");
-+              err = -1;
-+      }
-+
-+      /* SDR0_PExRCSSET rstdl */
-+      if (!(valPE0 & 0x00010000) ||
-+          !(valPE1 & 0x00010000) ||
-+          !(valPE2 & 0x00010000)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstdl error\n");
-+              err = -1;
-+      }
-+
-+      /* SDR0_PExRCSSET rstpyn */
-+      if ((valPE0 & 0x00001000) ||
-+          (valPE1 & 0x00001000) ||
-+          (valPE2 & 0x00001000)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstpyn error\n");
-+              err = -1;
-+      }
-+
-+      /* SDR0_PExRCSSET hldplb */
-+      if ((valPE0 & 0x10000000) ||
-+          (valPE1 & 0x10000000) ||
-+          (valPE2 & 0x10000000)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET hldplb error\n");
-+              err = -1;
-+      }
-+
-+      /* SDR0_PExRCSSET rdy */
-+      if ((valPE0 & 0x00100000) ||
-+          (valPE1 & 0x00100000) ||
-+          (valPE2 & 0x00100000)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET rdy error\n");
-+              err = -1;
-+      }
-+
-+      /* SDR0_PExRCSSET shutdown */
-+      if ((valPE0 & 0x00000100) ||
-+          (valPE1 & 0x00000100) ||
-+          (valPE2 & 0x00000100)) {
-+              printk(KERN_INFO "PCIE: SDR0_PExRCSSET shutdown error\n");
-+              err = -1;
-+      }
-+
-+      return err;
-+}
-+
-+/* Global PCIe core initializations for 440SPe core */
-+static int __init ppc440spe_pciex_core_init(struct device_node *np)
-+{
-+      int time_out = 20;
-+
-+      /* Set PLL clock receiver to LVPECL */
-+      mtdcri(SDR0, PESDR0_PLLLCT1, mfdcri(SDR0, PESDR0_PLLLCT1) | 1 << 28);
-+
-+      /* Shouldn't we do all the calibration stuff etc... here ? */
-+      if (ppc440spe_pciex_check_reset(np))
-+              return -ENXIO;
-+
-+      if (!(mfdcri(SDR0, PESDR0_PLLLCT2) & 0x10000)) {
-+              printk(KERN_INFO "PCIE: PESDR_PLLCT2 resistance calibration "
-+                     "failed (0x%08x)\n",
-+                     mfdcri(SDR0, PESDR0_PLLLCT2));
-+              return -1;
-+      }
-+
-+      /* De-assert reset of PCIe PLL, wait for lock */
-+      mtdcri(SDR0, PESDR0_PLLLCT1,
-+             mfdcri(SDR0, PESDR0_PLLLCT1) & ~(1 << 24));
-+      udelay(3);
-+
-+      while (time_out) {
-+              if (!(mfdcri(SDR0, PESDR0_PLLLCT3) & 0x10000000)) {
-+                      time_out--;
-+                      udelay(1);
-+              } else
-+                      break;
-+      }
-+      if (!time_out) {
-+              printk(KERN_INFO "PCIE: VCO output not locked\n");
-+              return -1;
-+      }
-+
-+      pr_debug("PCIE initialization OK\n");
-+
-+      return 3;
-+}
-+
-+static int ppc440spe_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+      u32 val = 1 << 24;
-+
-+      if (port->endpoint)
-+              val = PTYPE_LEGACY_ENDPOINT << 20;
-+      else
-+              val = PTYPE_ROOT_PORT << 20;
-+
-+      if (port->index == 0)
-+              val |= LNKW_X8 << 12;
-+      else
-+              val |= LNKW_X4 << 12;
-+
-+      mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET, val);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x20222222);
-+      if (ppc440spe_revA())
-+              mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x11000000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL0SET1, 0x35000000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL1SET1, 0x35000000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL2SET1, 0x35000000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL3SET1, 0x35000000);
-+      if (port->index == 0) {
-+              mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL4SET1,
-+                     0x35000000);
-+              mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL5SET1,
-+                     0x35000000);
-+              mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL6SET1,
-+                     0x35000000);
-+              mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL7SET1,
-+                     0x35000000);
-+      }
-+      val = mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+             (val & ~(1 << 24 | 1 << 16)) | 1 << 12);
-+
-+      return 0;
-+}
-+
-+static int ppc440speA_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+      return ppc440spe_pciex_init_port_hw(port);
-+}
-+
-+static int ppc440speB_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+      int rc = ppc440spe_pciex_init_port_hw(port);
-+
-+      port->has_ibpre = 1;
-+
-+      return rc;
-+}
-+
-+static int ppc440speA_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+      /* XXX Check what that value means... I hate magic */
-+      dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x68782800);
-+
-+      /*
-+       * Set buffer allocations and then assert VRB and TXE.
-+       */
-+      out_be32(port->utl_base + PEUTL_OUTTR,   0x08000000);
-+      out_be32(port->utl_base + PEUTL_INTR,    0x02000000);
-+      out_be32(port->utl_base + PEUTL_OPDBSZ,  0x10000000);
-+      out_be32(port->utl_base + PEUTL_PBBSZ,   0x53000000);
-+      out_be32(port->utl_base + PEUTL_IPHBSZ,  0x08000000);
-+      out_be32(port->utl_base + PEUTL_IPDBSZ,  0x10000000);
-+      out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
-+      out_be32(port->utl_base + PEUTL_PCTL,    0x80800066);
-+
-+      return 0;
-+}
-+
-+static int ppc440speB_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+      /* Report CRS to the operating system */
-+      out_be32(port->utl_base + PEUTL_PBCTL,    0x08000000);
-+
-+      return 0;
-+}
-+
-+static struct ppc4xx_pciex_hwops ppc440speA_pcie_hwops __initdata =
-+{
-+      .core_init      = ppc440spe_pciex_core_init,
-+      .port_init_hw   = ppc440speA_pciex_init_port_hw,
-+      .setup_utl      = ppc440speA_pciex_init_utl,
-+};
-+
-+static struct ppc4xx_pciex_hwops ppc440speB_pcie_hwops __initdata =
-+{
-+      .core_init      = ppc440spe_pciex_core_init,
-+      .port_init_hw   = ppc440speB_pciex_init_port_hw,
-+      .setup_utl      = ppc440speB_pciex_init_utl,
-+};
-+
-+#endif /* CONFIG_44x */
-+
-+#ifdef CONFIG_40x
-+
-+static int __init ppc405ex_pciex_core_init(struct device_node *np)
-+{
-+      /* Nothing to do, return 2 ports */
-+      return 2;
-+}
-+
-+static void ppc405ex_pcie_phy_reset(struct ppc4xx_pciex_port *port)
-+{
-+      /* Assert the PE0_PHY reset */
-+      mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01010000);
-+      msleep(1);
-+
-+      /* deassert the PE0_hotreset */
-+      if (port->endpoint)
-+              mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01111000);
-+      else
-+              mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01101000);
-+
-+      /* poll for phy !reset */
-+      /* XXX FIXME add timeout */
-+      while (!(mfdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSTA) & 0x00001000))
-+              ;
-+
-+      /* deassert the PE0_gpl_utl_reset */
-+      mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x00101000);
-+}
-+
-+static int ppc405ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+      u32 val;
-+
-+      if (port->endpoint)
-+              val = PTYPE_LEGACY_ENDPOINT;
-+      else
-+              val = PTYPE_ROOT_PORT;
-+
-+      mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET,
-+             1 << 24 | val << 20 | LNKW_X1 << 12);
-+
-+      mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x00000000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x01010000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET1, 0x720F0000);
-+      mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET2, 0x70600003);
-+
-+      /*
-+       * Only reset the PHY when no link is currently established.
-+       * This is for the Atheros PCIe board which has problems to establish
-+       * the link (again) after this PHY reset. All other currently tested
-+       * PCIe boards don't show this problem.
-+       * This has to be re-tested and fixed in a later release!
-+       */
-+#if 0 /* XXX FIXME: Not resetting the PHY will leave all resources
-+       * configured as done previously by U-Boot. Then Linux will currently
-+       * not reassign them. So the PHY reset is now done always. This will
-+       * lead to problems with the Atheros PCIe board again.
-+       */
-+      val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
-+      if (!(val & 0x00001000))
-+              ppc405ex_pcie_phy_reset(port);
-+#else
-+      ppc405ex_pcie_phy_reset(port);
-+#endif
-+
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFG, 0x10000000);  /* guarded on */
-+
-+      port->has_ibpre = 1;
-+
-+      return 0;
-+}
-+
-+static int ppc405ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+      dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x0);
-+
-+      /*
-+       * Set buffer allocations and then assert VRB and TXE.
-+       */
-+      out_be32(port->utl_base + PEUTL_OUTTR,   0x02000000);
-+      out_be32(port->utl_base + PEUTL_INTR,    0x02000000);
-+      out_be32(port->utl_base + PEUTL_OPDBSZ,  0x04000000);
-+      out_be32(port->utl_base + PEUTL_PBBSZ,   0x21000000);
-+      out_be32(port->utl_base + PEUTL_IPHBSZ,  0x02000000);
-+      out_be32(port->utl_base + PEUTL_IPDBSZ,  0x04000000);
-+      out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
-+      out_be32(port->utl_base + PEUTL_PCTL,    0x80800066);
-+
-+      out_be32(port->utl_base + PEUTL_PBCTL,   0x08000000);
-+
-+      return 0;
-+}
-+
-+static struct ppc4xx_pciex_hwops ppc405ex_pcie_hwops __initdata =
-+{
-+      .core_init      = ppc405ex_pciex_core_init,
-+      .port_init_hw   = ppc405ex_pciex_init_port_hw,
-+      .setup_utl      = ppc405ex_pciex_init_utl,
-+};
-+
-+#endif /* CONFIG_40x */
-+
-+
-+/* Check that the core has been initied and if not, do it */
-+static int __init ppc4xx_pciex_check_core_init(struct device_node *np)
-+{
-+      static int core_init;
-+      int count = -ENODEV;
-+
-+      if (core_init++)
-+              return 0;
-+
-+#ifdef CONFIG_44x
-+      if (of_device_is_compatible(np, "ibm,plb-pciex-440spe")) {
-+              if (ppc440spe_revA())
-+                      ppc4xx_pciex_hwops = &ppc440speA_pcie_hwops;
-+              else
-+                      ppc4xx_pciex_hwops = &ppc440speB_pcie_hwops;
-+      }
-+#endif /* CONFIG_44x    */
-+#ifdef CONFIG_40x
-+      if (of_device_is_compatible(np, "ibm,plb-pciex-405ex"))
-+              ppc4xx_pciex_hwops = &ppc405ex_pcie_hwops;
-+#endif
-+      if (ppc4xx_pciex_hwops == NULL) {
-+              printk(KERN_WARNING "PCIE: unknown host type %s\n",
-+                     np->full_name);
-+              return -ENODEV;
-+      }
-+
-+      count = ppc4xx_pciex_hwops->core_init(np);
-+      if (count > 0) {
-+              ppc4xx_pciex_ports =
-+                     kzalloc(count * sizeof(struct ppc4xx_pciex_port),
-+                             GFP_KERNEL);
-+              if (ppc4xx_pciex_ports) {
-+                      ppc4xx_pciex_port_count = count;
-+                      return 0;
-+              }
-+              printk(KERN_WARNING "PCIE: failed to allocate ports array\n");
-+              return -ENOMEM;
-+      }
-+      return -ENODEV;
-+}
-+
-+static void __init ppc4xx_pciex_port_init_mapping(struct ppc4xx_pciex_port *port)
-+{
-+      /* We map PCI Express configuration based on the reg property */
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFGBAH,
-+                RES_TO_U32_HIGH(port->cfg_space.start));
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFGBAL,
-+                RES_TO_U32_LOW(port->cfg_space.start));
-+
-+      /* XXX FIXME: Use size from reg property. For now, map 512M */
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFGMSK, 0xe0000001);
-+
-+      /* We map UTL registers based on the reg property */
-+      dcr_write(port->dcrs, DCRO_PEGPL_REGBAH,
-+                RES_TO_U32_HIGH(port->utl_regs.start));
-+      dcr_write(port->dcrs, DCRO_PEGPL_REGBAL,
-+                RES_TO_U32_LOW(port->utl_regs.start));
-+
-+      /* XXX FIXME: Use size from reg property */
-+      dcr_write(port->dcrs, DCRO_PEGPL_REGMSK, 0x00007001);
-+
-+      /* Disable all other outbound windows */
-+      dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, 0);
-+      dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, 0);
-+      dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0);
-+      dcr_write(port->dcrs, DCRO_PEGPL_MSGMSK, 0);
-+}
-+
-+static int __init ppc4xx_pciex_wait_on_sdr(struct ppc4xx_pciex_port *port,
-+                                         unsigned int sdr_offset,
-+                                         unsigned int mask,
-+                                         unsigned int value,
-+                                         int timeout_ms)
-+{
-+      u32 val;
-+
-+      while(timeout_ms--) {
-+              val = mfdcri(SDR0, port->sdr_base + sdr_offset);
-+              if ((val & mask) == value) {
-+                      pr_debug("PCIE%d: Wait on SDR %x success with tm %d (%08x)\n",
-+                               port->index, sdr_offset, timeout_ms, val);
-+                      return 0;
-+              }
-+              msleep(1);
-+      }
-+      return -1;
-+}
-+
-+static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
-+{
-+      int rc = 0;
-+
-+      /* Init HW */
-+      if (ppc4xx_pciex_hwops->port_init_hw)
-+              rc = ppc4xx_pciex_hwops->port_init_hw(port);
-+      if (rc != 0)
-+              return rc;
-+
-+      printk(KERN_INFO "PCIE%d: Checking link...\n",
-+             port->index);
-+
-+      /* Wait for reset to complete */
-+      if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS, 1 << 20, 0, 10)) {
-+              printk(KERN_WARNING "PCIE%d: PGRST failed\n",
-+                     port->index);
-+              return -1;
-+      }
-+
-+      /* Check for card presence detect if supported, if not, just wait for
-+       * link unconditionally.
-+       *
-+       * note that we don't fail if there is no link, we just filter out
-+       * config space accesses. That way, it will be easier to implement
-+       * hotplug later on.
-+       */
-+      if (!port->has_ibpre ||
-+          !ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-+                                    1 << 28, 1 << 28, 100)) {
-+              printk(KERN_INFO
-+                     "PCIE%d: Device detected, waiting for link...\n",
-+                     port->index);
-+              if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-+                                           0x1000, 0x1000, 2000))
-+                      printk(KERN_WARNING
-+                             "PCIE%d: Link up failed\n", port->index);
-+              else {
-+                      printk(KERN_INFO
-+                             "PCIE%d: link is up !\n", port->index);
-+                      port->link = 1;
-+              }
-+      } else
-+              printk(KERN_INFO "PCIE%d: No device detected.\n", port->index);
-+
-+      /*
-+       * Initialize mapping: disable all regions and configure
-+       * CFG and REG regions based on resources in the device tree
-+       */
-+      ppc4xx_pciex_port_init_mapping(port);
-+
-+      /*
-+       * Map UTL
-+       */
-+      port->utl_base = ioremap(port->utl_regs.start, 0x100);
-+      BUG_ON(port->utl_base == NULL);
-+
-+      /*
-+       * Setup UTL registers --BenH.
-+       */
-+      if (ppc4xx_pciex_hwops->setup_utl)
-+              ppc4xx_pciex_hwops->setup_utl(port);
-+
-+      /*
-+       * Check for VC0 active and assert RDY.
-+       */
-+      if (port->link &&
-+          ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS,
-+                                   1 << 16, 1 << 16, 5000)) {
-+              printk(KERN_INFO "PCIE%d: VC0 not active\n", port->index);
-+              port->link = 0;
-+      }
-+
-+      mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+             mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) | 1 << 20);
-+      msleep(100);
-+
-+      return 0;
-+}
-+
-+static int ppc4xx_pciex_validate_bdf(struct ppc4xx_pciex_port *port,
-+                                   struct pci_bus *bus,
-+                                   unsigned int devfn)
-+{
-+      static int message;
-+
-+      /* Endpoint can not generate upstream(remote) config cycles */
-+      if (port->endpoint && bus->number != port->hose->first_busno)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      /* Check we are within the mapped range */
-+      if (bus->number > port->hose->last_busno) {
-+              if (!message) {
-+                      printk(KERN_WARNING "Warning! Probing bus %u"
-+                             " out of range !\n", bus->number);
-+                      message++;
-+              }
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+      }
-+
-+      /* The root complex has only one device / function */
-+      if (bus->number == port->hose->first_busno && devfn != 0)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      /* The other side of the RC has only one device as well */
-+      if (bus->number == (port->hose->first_busno + 1) &&
-+          PCI_SLOT(devfn) != 0)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      /* Check if we have a link */
-+      if ((bus->number != port->hose->first_busno) && !port->link)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      return 0;
-+}
-+
-+static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port,
-+                                                struct pci_bus *bus,
-+                                                unsigned int devfn)
-+{
-+      int relbus;
-+
-+      /* Remove the casts when we finally remove the stupid volatile
-+       * in struct pci_controller
-+       */
-+      if (bus->number == port->hose->first_busno)
-+              return (void __iomem *)port->hose->cfg_addr;
-+
-+      relbus = bus->number - (port->hose->first_busno + 1);
-+      return (void __iomem *)port->hose->cfg_data +
-+              ((relbus  << 20) | (devfn << 12));
-+}
-+
-+static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn,
-+                                  int offset, int len, u32 *val)
-+{
-+      struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-+      struct ppc4xx_pciex_port *port =
-+              &ppc4xx_pciex_ports[hose->indirect_type];
-+      void __iomem *addr;
-+      u32 gpl_cfg;
-+
-+      BUG_ON(hose != port->hose);
-+
-+      if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
-+
-+      /*
-+       * Reading from configuration space of non-existing device can
-+       * generate transaction errors. For the read duration we suppress
-+       * assertion of machine check exceptions to avoid those.
-+       */
-+      gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
-+
-+      /* Make sure no CRS is recorded */
-+      out_be32(port->utl_base + PEUTL_RCSTA, 0x00040000);
-+
-+      switch (len) {
-+      case 1:
-+              *val = in_8((u8 *)(addr + offset));
-+              break;
-+      case 2:
-+              *val = in_le16((u16 *)(addr + offset));
-+              break;
-+      default:
-+              *val = in_le32((u32 *)(addr + offset));
-+              break;
-+      }
-+
-+      pr_debug("pcie-config-read: bus=%3d [%3d..%3d] devfn=0x%04x"
-+               " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
-+               bus->number, hose->first_busno, hose->last_busno,
-+               devfn, offset, len, addr + offset, *val);
-+
-+      /* Check for CRS (440SPe rev B does that for us but heh ..) */
-+      if (in_be32(port->utl_base + PEUTL_RCSTA) & 0x00040000) {
-+              pr_debug("Got CRS !\n");
-+              if (len != 4 || offset != 0)
-+                      return PCIBIOS_DEVICE_NOT_FOUND;
-+              *val = 0xffff0001;
-+      }
-+
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn,
-+                                   int offset, int len, u32 val)
-+{
-+      struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-+      struct ppc4xx_pciex_port *port =
-+              &ppc4xx_pciex_ports[hose->indirect_type];
-+      void __iomem *addr;
-+      u32 gpl_cfg;
-+
-+      if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
-+
-+      /*
-+       * Reading from configuration space of non-existing device can
-+       * generate transaction errors. For the read duration we suppress
-+       * assertion of machine check exceptions to avoid those.
-+       */
-+      gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
-+
-+      pr_debug("pcie-config-write: bus=%3d [%3d..%3d] devfn=0x%04x"
-+               " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
-+               bus->number, hose->first_busno, hose->last_busno,
-+               devfn, offset, len, addr + offset, val);
-+
-+      switch (len) {
-+      case 1:
-+              out_8((u8 *)(addr + offset), val);
-+              break;
-+      case 2:
-+              out_le16((u16 *)(addr + offset), val);
-+              break;
-+      default:
-+              out_le32((u32 *)(addr + offset), val);
-+              break;
-+      }
-+
-+      dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static struct pci_ops ppc4xx_pciex_pci_ops =
-+{
-+      .read  = ppc4xx_pciex_read_config,
-+      .write = ppc4xx_pciex_write_config,
-+};
-+
-+static void __init ppc4xx_configure_pciex_POMs(struct ppc4xx_pciex_port *port,
-+                                             struct pci_controller *hose,
-+                                             void __iomem *mbase)
-+{
-+      u32 lah, lal, pciah, pcial, sa;
-+      int i, j;
-+
-+      /* Setup outbound memory windows */
-+      for (i = j = 0; i < 3; i++) {
-+              struct resource *res = &hose->mem_resources[i];
-+
-+              /* we only care about memory windows */
-+              if (!(res->flags & IORESOURCE_MEM))
-+                      continue;
-+              if (j > 1) {
-+                      printk(KERN_WARNING "%s: Too many ranges\n",
-+                             port->node->full_name);
-+                      break;
-+              }
-+
-+              /* Calculate register values */
-+              lah = RES_TO_U32_HIGH(res->start);
-+              lal = RES_TO_U32_LOW(res->start);
-+              pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+              pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+              sa = res->end + 1 - res->start;
-+              if (!is_power_of_2(sa) || sa < 0x100000 ||
-+                  sa > 0xffffffffu) {
-+                      printk(KERN_WARNING "%s: Resource out of range\n",
-+                             port->node->full_name);
-+                      continue;
-+              }
-+              sa = (0xffffffffu << ilog2(sa)) | 0x1;
-+
-+              /* Program register values */
-+              switch (j) {
-+              case 0:
-+                      out_le32(mbase + PECFG_POM0LAH, pciah);
-+                      out_le32(mbase + PECFG_POM0LAL, pcial);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAH, lah);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAL, lal);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKH, 0x7fffffff);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, sa | 3);
-+                      break;
-+              case 1:
-+                      out_le32(mbase + PECFG_POM1LAH, pciah);
-+                      out_le32(mbase + PECFG_POM1LAL, pcial);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAH, lah);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAL, lal);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKH, 0x7fffffff);
-+                      dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, sa | 3);
-+                      break;
-+              }
-+              j++;
-+      }
-+
-+      /* Configure IO, always 64K starting at 0 */
-+      if (hose->io_resource.flags & IORESOURCE_IO) {
-+              lah = RES_TO_U32_HIGH(hose->io_base_phys);
-+              lal = RES_TO_U32_LOW(hose->io_base_phys);
-+              out_le32(mbase + PECFG_POM2LAH, 0);
-+              out_le32(mbase + PECFG_POM2LAL, 0);
-+              dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAH, lah);
-+              dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAL, lal);
-+              dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKH, 0x7fffffff);
-+              dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0xffff0000 | 3);
-+      }
-+}
-+
-+static void __init ppc4xx_configure_pciex_PIMs(struct ppc4xx_pciex_port *port,
-+                                             struct pci_controller *hose,
-+                                             void __iomem *mbase,
-+                                             struct resource *res)
-+{
-+      resource_size_t size = res->end - res->start + 1;
-+      u64 sa;
-+
-+      /* Calculate window size */
-+      sa = (0xffffffffffffffffull << ilog2(size));;
-+      if (res->flags & IORESOURCE_PREFETCH)
-+              sa |= 0x8;
-+
-+      out_le32(mbase + PECFG_BAR0HMPA, RES_TO_U32_HIGH(sa));
-+      out_le32(mbase + PECFG_BAR0LMPA, RES_TO_U32_LOW(sa));
-+
-+      /* The setup of the split looks weird to me ... let's see if it works */
-+      out_le32(mbase + PECFG_PIM0LAL, 0x00000000);
-+      out_le32(mbase + PECFG_PIM0LAH, 0x00000000);
-+      out_le32(mbase + PECFG_PIM1LAL, 0x00000000);
-+      out_le32(mbase + PECFG_PIM1LAH, 0x00000000);
-+      out_le32(mbase + PECFG_PIM01SAH, 0xffff0000);
-+      out_le32(mbase + PECFG_PIM01SAL, 0x00000000);
-+
-+      /* Enable inbound mapping */
-+      out_le32(mbase + PECFG_PIMEN, 0x1);
-+
-+      out_le32(mbase + PCI_BASE_ADDRESS_0, RES_TO_U32_LOW(res->start));
-+      out_le32(mbase + PCI_BASE_ADDRESS_1, RES_TO_U32_HIGH(res->start));
-+
-+      /* Enable I/O, Mem, and Busmaster cycles */
-+      out_le16(mbase + PCI_COMMAND,
-+               in_le16(mbase + PCI_COMMAND) |
-+               PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
-+}
-+
-+static void __init ppc4xx_pciex_port_setup_hose(struct ppc4xx_pciex_port *port)
-+{
-+      struct resource dma_window;
-+      struct pci_controller *hose = NULL;
-+      const int *bus_range;
-+      int primary = 0, busses;
-+      void __iomem *mbase = NULL, *cfg_data = NULL;
-+
-+      /* XXX FIXME: Handle endpoint mode properly */
-+      if (port->endpoint) {
-+              printk(KERN_WARNING "PCIE%d: Port in endpoint mode !\n",
-+                     port->index);
-+              return;
-+      }
-+
-+      /* Check if primary bridge */
-+      if (of_get_property(port->node, "primary", NULL))
-+              primary = 1;
-+
-+      /* Get bus range if any */
-+      bus_range = of_get_property(port->node, "bus-range", NULL);
-+
-+      /* Allocate the host controller data structure */
-+      hose = pcibios_alloc_controller(port->node);
-+      if (!hose)
-+              goto fail;
-+
-+      /* We stick the port number in "indirect_type" so the config space
-+       * ops can retrieve the port data structure easily
-+       */
-+      hose->indirect_type = port->index;
-+
-+      /* Get bus range */
-+      hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+      hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+      /* Because of how big mapping the config space is (1M per bus), we
-+       * limit how many busses we support. In the long run, we could replace
-+       * that with something akin to kmap_atomic instead. We set aside 1 bus
-+       * for the host itself too.
-+       */
-+      busses = hose->last_busno - hose->first_busno; /* This is off by 1 */
-+      if (busses > MAX_PCIE_BUS_MAPPED) {
-+              busses = MAX_PCIE_BUS_MAPPED;
-+              hose->last_busno = hose->first_busno + busses;
-+      }
-+
-+      /* We map the external config space in cfg_data and the host config
-+       * space in cfg_addr. External space is 1M per bus, internal space
-+       * is 4K
-+       */
-+      cfg_data = ioremap(port->cfg_space.start +
-+                               (hose->first_busno + 1) * 0x100000,
-+                               busses * 0x100000);
-+      mbase = ioremap(port->cfg_space.start + 0x10000000, 0x1000);
-+      if (cfg_data == NULL || mbase == NULL) {
-+              printk(KERN_ERR "%s: Can't map config space !",
-+                     port->node->full_name);
-+              goto fail;
-+      }
-+
-+      hose->cfg_data = cfg_data;
-+      hose->cfg_addr = mbase;
-+
-+      pr_debug("PCIE %s, bus %d..%d\n", port->node->full_name,
-+               hose->first_busno, hose->last_busno);
-+      pr_debug("     config space mapped at: root @0x%p, other @0x%p\n",
-+               hose->cfg_addr, hose->cfg_data);
-+
-+      /* Setup config space */
-+      hose->ops = &ppc4xx_pciex_pci_ops;
-+      port->hose = hose;
-+      mbase = (void __iomem *)hose->cfg_addr;
-+
-+      /*
-+       * Set bus numbers on our root port
-+       */
-+      out_8(mbase + PCI_PRIMARY_BUS, hose->first_busno);
-+      out_8(mbase + PCI_SECONDARY_BUS, hose->first_busno + 1);
-+      out_8(mbase + PCI_SUBORDINATE_BUS, hose->last_busno);
-+
-+      /*
-+       * OMRs are already reset, also disable PIMs
-+       */
-+      out_le32(mbase + PECFG_PIMEN, 0);
-+
-+      /* Parse outbound mapping resources */
-+      pci_process_bridge_OF_ranges(hose, port->node, primary);
-+
-+      /* Parse inbound mapping resources */
-+      if (ppc4xx_parse_dma_ranges(hose, mbase, &dma_window) != 0)
-+              goto fail;
-+
-+      /* Configure outbound ranges POMs */
-+      ppc4xx_configure_pciex_POMs(port, hose, mbase);
-+
-+      /* Configure inbound ranges PIMs */
-+      ppc4xx_configure_pciex_PIMs(port, hose, mbase, &dma_window);
-+
-+      /* The root complex doesn't show up if we don't set some vendor
-+       * and device IDs into it. Those are the same bogus one that the
-+       * initial code in arch/ppc add. We might want to change that.
-+       */
-+      out_le16(mbase + 0x200, 0xaaa0 + port->index);
-+      out_le16(mbase + 0x202, 0xbed0 + port->index);
-+
-+      /* Set Class Code to PCI-PCI bridge and Revision Id to 1 */
-+      out_le32(mbase + 0x208, 0x06040001);
-+
-+      printk(KERN_INFO "PCIE%d: successfully set as root-complex\n",
-+             port->index);
-+      return;
-+ fail:
-+      if (hose)
-+              pcibios_free_controller(hose);
-+      if (cfg_data)
-+              iounmap(cfg_data);
-+      if (mbase)
-+              iounmap(mbase);
-+}
-+
-+static void __init ppc4xx_probe_pciex_bridge(struct device_node *np)
-+{
-+      struct ppc4xx_pciex_port *port;
-+      const u32 *pval;
-+      int portno;
-+      unsigned int dcrs;
-+
-+      /* First, proceed to core initialization as we assume there's
-+       * only one PCIe core in the system
-+       */
-+      if (ppc4xx_pciex_check_core_init(np))
-+              return;
-+
-+      /* Get the port number from the device-tree */
-+      pval = of_get_property(np, "port", NULL);
-+      if (pval == NULL) {
-+              printk(KERN_ERR "PCIE: Can't find port number for %s\n",
-+                     np->full_name);
-+              return;
-+      }
-+      portno = *pval;
-+      if (portno >= ppc4xx_pciex_port_count) {
-+              printk(KERN_ERR "PCIE: port number out of range for %s\n",
-+                     np->full_name);
-+              return;
-+      }
-+      port = &ppc4xx_pciex_ports[portno];
-+      port->index = portno;
-+      port->node = of_node_get(np);
-+      pval = of_get_property(np, "sdr-base", NULL);
-+      if (pval == NULL) {
-+              printk(KERN_ERR "PCIE: missing sdr-base for %s\n",
-+                     np->full_name);
-+              return;
-+      }
-+      port->sdr_base = *pval;
-+
-+      /* XXX Currently, we only support root complex mode */
-+      port->endpoint = 0;
-+
-+      /* Fetch config space registers address */
-+      if (of_address_to_resource(np, 0, &port->cfg_space)) {
-+              printk(KERN_ERR "%s: Can't get PCI-E config space !",
-+                     np->full_name);
-+              return;
-+      }
-+      /* Fetch host bridge internal registers address */
-+      if (of_address_to_resource(np, 1, &port->utl_regs)) {
-+              printk(KERN_ERR "%s: Can't get UTL register base !",
-+                     np->full_name);
-+              return;
-+      }
-+
-+      /* Map DCRs */
-+      dcrs = dcr_resource_start(np, 0);
-+      if (dcrs == 0) {
-+              printk(KERN_ERR "%s: Can't get DCR register base !",
-+                     np->full_name);
-+              return;
-+      }
-+      port->dcrs = dcr_map(np, dcrs, dcr_resource_len(np, 0));
-+
-+      /* Initialize the port specific registers */
-+      if (ppc4xx_pciex_port_init(port)) {
-+              printk(KERN_WARNING "PCIE%d: Port init failed\n", port->index);
-+              return;
-+      }
-+
-+      /* Setup the linux hose data structure */
-+      ppc4xx_pciex_port_setup_hose(port);
-+}
-+
-+#endif /* CONFIG_PPC4xx_PCI_EXPRESS */
-+
-+static int __init ppc4xx_pci_find_bridges(void)
-+{
-+      struct device_node *np;
-+
-+#ifdef CONFIG_PPC4xx_PCI_EXPRESS
-+      for_each_compatible_node(np, NULL, "ibm,plb-pciex")
-+              ppc4xx_probe_pciex_bridge(np);
-+#endif
-+      for_each_compatible_node(np, NULL, "ibm,plb-pcix")
-+              ppc4xx_probe_pcix_bridge(np);
-+      for_each_compatible_node(np, NULL, "ibm,plb-pci")
-+              ppc4xx_probe_pci_bridge(np);
-+
-+      return 0;
-+}
-+arch_initcall(ppc4xx_pci_find_bridges);
-+
---- /dev/null
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.h
-@@ -0,0 +1,369 @@
-+/*
-+ * PCI / PCI-X / PCI-Express support for 4xx parts
-+ *
-+ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
-+ *
-+ * Bits and pieces extracted from arch/ppc support by
-+ *
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * Copyright 2002-2005 MontaVista Software Inc.
-+ */
-+#ifndef __PPC4XX_PCI_H__
-+#define __PPC4XX_PCI_H__
-+
-+/*
-+ * 4xx PCI-X bridge register definitions
-+ */
-+#define PCIX0_VENDID          0x000
-+#define PCIX0_DEVID           0x002
-+#define PCIX0_COMMAND         0x004
-+#define PCIX0_STATUS          0x006
-+#define PCIX0_REVID           0x008
-+#define PCIX0_CLS             0x009
-+#define PCIX0_CACHELS         0x00c
-+#define PCIX0_LATTIM          0x00d
-+#define PCIX0_HDTYPE          0x00e
-+#define PCIX0_BIST            0x00f
-+#define PCIX0_BAR0L           0x010
-+#define PCIX0_BAR0H           0x014
-+#define PCIX0_BAR1            0x018
-+#define PCIX0_BAR2L           0x01c
-+#define PCIX0_BAR2H           0x020
-+#define PCIX0_BAR3            0x024
-+#define PCIX0_CISPTR          0x028
-+#define PCIX0_SBSYSVID                0x02c
-+#define PCIX0_SBSYSID         0x02e
-+#define PCIX0_EROMBA          0x030
-+#define PCIX0_CAP             0x034
-+#define PCIX0_RES0            0x035
-+#define PCIX0_RES1            0x036
-+#define PCIX0_RES2            0x038
-+#define PCIX0_INTLN           0x03c
-+#define PCIX0_INTPN           0x03d
-+#define PCIX0_MINGNT          0x03e
-+#define PCIX0_MAXLTNCY                0x03f
-+#define PCIX0_BRDGOPT1                0x040
-+#define PCIX0_BRDGOPT2                0x044
-+#define PCIX0_ERREN           0x050
-+#define PCIX0_ERRSTS          0x054
-+#define PCIX0_PLBBESR         0x058
-+#define PCIX0_PLBBEARL                0x05c
-+#define PCIX0_PLBBEARH                0x060
-+#define PCIX0_POM0LAL         0x068
-+#define PCIX0_POM0LAH         0x06c
-+#define PCIX0_POM0SA          0x070
-+#define PCIX0_POM0PCIAL               0x074
-+#define PCIX0_POM0PCIAH               0x078
-+#define PCIX0_POM1LAL         0x07c
-+#define PCIX0_POM1LAH         0x080
-+#define PCIX0_POM1SA          0x084
-+#define PCIX0_POM1PCIAL               0x088
-+#define PCIX0_POM1PCIAH               0x08c
-+#define PCIX0_POM2SA          0x090
-+#define PCIX0_PIM0SAL         0x098
-+#define PCIX0_PIM0SA          PCIX0_PIM0SAL
-+#define PCIX0_PIM0LAL         0x09c
-+#define PCIX0_PIM0LAH         0x0a0
-+#define PCIX0_PIM1SA          0x0a4
-+#define PCIX0_PIM1LAL         0x0a8
-+#define PCIX0_PIM1LAH         0x0ac
-+#define PCIX0_PIM2SAL         0x0b0
-+#define PCIX0_PIM2SA          PCIX0_PIM2SAL
-+#define PCIX0_PIM2LAL         0x0b4
-+#define PCIX0_PIM2LAH         0x0b8
-+#define PCIX0_OMCAPID         0x0c0
-+#define PCIX0_OMNIPTR         0x0c1
-+#define PCIX0_OMMC            0x0c2
-+#define PCIX0_OMMA            0x0c4
-+#define PCIX0_OMMUA           0x0c8
-+#define PCIX0_OMMDATA         0x0cc
-+#define PCIX0_OMMEOI          0x0ce
-+#define PCIX0_PMCAPID         0x0d0
-+#define PCIX0_PMNIPTR         0x0d1
-+#define PCIX0_PMC             0x0d2
-+#define PCIX0_PMCSR           0x0d4
-+#define PCIX0_PMCSRBSE                0x0d6
-+#define PCIX0_PMDATA          0x0d7
-+#define PCIX0_PMSCRR          0x0d8
-+#define PCIX0_CAPID           0x0dc
-+#define PCIX0_NIPTR           0x0dd
-+#define PCIX0_CMD             0x0de
-+#define PCIX0_STS             0x0e0
-+#define PCIX0_IDR             0x0e4
-+#define PCIX0_CID             0x0e8
-+#define PCIX0_RID             0x0ec
-+#define PCIX0_PIM0SAH         0x0f8
-+#define PCIX0_PIM2SAH         0x0fc
-+#define PCIX0_MSGIL           0x100
-+#define PCIX0_MSGIH           0x104
-+#define PCIX0_MSGOL           0x108
-+#define PCIX0_MSGOH           0x10c
-+#define PCIX0_IM              0x1f8
-+
-+/*
-+ * 4xx PCI bridge register definitions
-+ */
-+#define PCIL0_PMM0LA          0x00
-+#define PCIL0_PMM0MA          0x04
-+#define PCIL0_PMM0PCILA               0x08
-+#define PCIL0_PMM0PCIHA               0x0c
-+#define PCIL0_PMM1LA          0x10
-+#define PCIL0_PMM1MA          0x14
-+#define PCIL0_PMM1PCILA               0x18
-+#define PCIL0_PMM1PCIHA               0x1c
-+#define PCIL0_PMM2LA          0x20
-+#define PCIL0_PMM2MA          0x24
-+#define PCIL0_PMM2PCILA               0x28
-+#define PCIL0_PMM2PCIHA               0x2c
-+#define PCIL0_PTM1MS          0x30
-+#define PCIL0_PTM1LA          0x34
-+#define PCIL0_PTM2MS          0x38
-+#define PCIL0_PTM2LA          0x3c
-+
-+/*
-+ * 4xx PCIe bridge register definitions
-+ */
-+
-+/* DCR offsets */
-+#define DCRO_PEGPL_CFGBAH             0x00
-+#define DCRO_PEGPL_CFGBAL             0x01
-+#define DCRO_PEGPL_CFGMSK             0x02
-+#define DCRO_PEGPL_MSGBAH             0x03
-+#define DCRO_PEGPL_MSGBAL             0x04
-+#define DCRO_PEGPL_MSGMSK             0x05
-+#define DCRO_PEGPL_OMR1BAH            0x06
-+#define DCRO_PEGPL_OMR1BAL            0x07
-+#define DCRO_PEGPL_OMR1MSKH           0x08
-+#define DCRO_PEGPL_OMR1MSKL           0x09
-+#define DCRO_PEGPL_OMR2BAH            0x0a
-+#define DCRO_PEGPL_OMR2BAL            0x0b
-+#define DCRO_PEGPL_OMR2MSKH           0x0c
-+#define DCRO_PEGPL_OMR2MSKL           0x0d
-+#define DCRO_PEGPL_OMR3BAH            0x0e
-+#define DCRO_PEGPL_OMR3BAL            0x0f
-+#define DCRO_PEGPL_OMR3MSKH           0x10
-+#define DCRO_PEGPL_OMR3MSKL           0x11
-+#define DCRO_PEGPL_REGBAH             0x12
-+#define DCRO_PEGPL_REGBAL             0x13
-+#define DCRO_PEGPL_REGMSK             0x14
-+#define DCRO_PEGPL_SPECIAL            0x15
-+#define DCRO_PEGPL_CFG                        0x16
-+#define DCRO_PEGPL_ESR                        0x17
-+#define DCRO_PEGPL_EARH                       0x18
-+#define DCRO_PEGPL_EARL                       0x19
-+#define DCRO_PEGPL_EATR                       0x1a
-+
-+/* DMER mask */
-+#define GPL_DMER_MASK_DISA    0x02000000
-+
-+/*
-+ * System DCRs (SDRs)
-+ */
-+#define PESDR0_PLLLCT1                        0x03a0
-+#define PESDR0_PLLLCT2                        0x03a1
-+#define PESDR0_PLLLCT3                        0x03a2
-+
-+/*
-+ * 440SPe additional DCRs
-+ */
-+#define PESDR0_440SPE_UTLSET1         0x0300
-+#define PESDR0_440SPE_UTLSET2         0x0301
-+#define PESDR0_440SPE_DLPSET          0x0302
-+#define PESDR0_440SPE_LOOP            0x0303
-+#define PESDR0_440SPE_RCSSET          0x0304
-+#define PESDR0_440SPE_RCSSTS          0x0305
-+#define PESDR0_440SPE_HSSL0SET1               0x0306
-+#define PESDR0_440SPE_HSSL0SET2               0x0307
-+#define PESDR0_440SPE_HSSL0STS                0x0308
-+#define PESDR0_440SPE_HSSL1SET1               0x0309
-+#define PESDR0_440SPE_HSSL1SET2               0x030a
-+#define PESDR0_440SPE_HSSL1STS                0x030b
-+#define PESDR0_440SPE_HSSL2SET1               0x030c
-+#define PESDR0_440SPE_HSSL2SET2               0x030d
-+#define PESDR0_440SPE_HSSL2STS                0x030e
-+#define PESDR0_440SPE_HSSL3SET1               0x030f
-+#define PESDR0_440SPE_HSSL3SET2               0x0310
-+#define PESDR0_440SPE_HSSL3STS                0x0311
-+#define PESDR0_440SPE_HSSL4SET1               0x0312
-+#define PESDR0_440SPE_HSSL4SET2               0x0313
-+#define PESDR0_440SPE_HSSL4STS                0x0314
-+#define PESDR0_440SPE_HSSL5SET1               0x0315
-+#define PESDR0_440SPE_HSSL5SET2               0x0316
-+#define PESDR0_440SPE_HSSL5STS                0x0317
-+#define PESDR0_440SPE_HSSL6SET1               0x0318
-+#define PESDR0_440SPE_HSSL6SET2               0x0319
-+#define PESDR0_440SPE_HSSL6STS                0x031a
-+#define PESDR0_440SPE_HSSL7SET1               0x031b
-+#define PESDR0_440SPE_HSSL7SET2               0x031c
-+#define PESDR0_440SPE_HSSL7STS                0x031d
-+#define PESDR0_440SPE_HSSCTLSET               0x031e
-+#define PESDR0_440SPE_LANE_ABCD               0x031f
-+#define PESDR0_440SPE_LANE_EFGH               0x0320
-+
-+#define PESDR1_440SPE_UTLSET1         0x0340
-+#define PESDR1_440SPE_UTLSET2         0x0341
-+#define PESDR1_440SPE_DLPSET          0x0342
-+#define PESDR1_440SPE_LOOP            0x0343
-+#define PESDR1_440SPE_RCSSET          0x0344
-+#define PESDR1_440SPE_RCSSTS          0x0345
-+#define PESDR1_440SPE_HSSL0SET1               0x0346
-+#define PESDR1_440SPE_HSSL0SET2               0x0347
-+#define PESDR1_440SPE_HSSL0STS                0x0348
-+#define PESDR1_440SPE_HSSL1SET1               0x0349
-+#define PESDR1_440SPE_HSSL1SET2               0x034a
-+#define PESDR1_440SPE_HSSL1STS                0x034b
-+#define PESDR1_440SPE_HSSL2SET1               0x034c
-+#define PESDR1_440SPE_HSSL2SET2               0x034d
-+#define PESDR1_440SPE_HSSL2STS                0x034e
-+#define PESDR1_440SPE_HSSL3SET1               0x034f
-+#define PESDR1_440SPE_HSSL3SET2               0x0350
-+#define PESDR1_440SPE_HSSL3STS                0x0351
-+#define PESDR1_440SPE_HSSCTLSET               0x0352
-+#define PESDR1_440SPE_LANE_ABCD               0x0353
-+
-+#define PESDR2_440SPE_UTLSET1         0x0370
-+#define PESDR2_440SPE_UTLSET2         0x0371
-+#define PESDR2_440SPE_DLPSET          0x0372
-+#define PESDR2_440SPE_LOOP            0x0373
-+#define PESDR2_440SPE_RCSSET          0x0374
-+#define PESDR2_440SPE_RCSSTS          0x0375
-+#define PESDR2_440SPE_HSSL0SET1               0x0376
-+#define PESDR2_440SPE_HSSL0SET2               0x0377
-+#define PESDR2_440SPE_HSSL0STS                0x0378
-+#define PESDR2_440SPE_HSSL1SET1               0x0379
-+#define PESDR2_440SPE_HSSL1SET2               0x037a
-+#define PESDR2_440SPE_HSSL1STS                0x037b
-+#define PESDR2_440SPE_HSSL2SET1               0x037c
-+#define PESDR2_440SPE_HSSL2SET2               0x037d
-+#define PESDR2_440SPE_HSSL2STS                0x037e
-+#define PESDR2_440SPE_HSSL3SET1               0x037f
-+#define PESDR2_440SPE_HSSL3SET2               0x0380
-+#define PESDR2_440SPE_HSSL3STS                0x0381
-+#define PESDR2_440SPE_HSSCTLSET               0x0382
-+#define PESDR2_440SPE_LANE_ABCD               0x0383
-+
-+/*
-+ * 405EX additional DCRs
-+ */
-+#define PESDR0_405EX_UTLSET1          0x0400
-+#define PESDR0_405EX_UTLSET2          0x0401
-+#define PESDR0_405EX_DLPSET           0x0402
-+#define PESDR0_405EX_LOOP             0x0403
-+#define PESDR0_405EX_RCSSET           0x0404
-+#define PESDR0_405EX_RCSSTS           0x0405
-+#define PESDR0_405EX_PHYSET1          0x0406
-+#define PESDR0_405EX_PHYSET2          0x0407
-+#define PESDR0_405EX_BIST             0x0408
-+#define PESDR0_405EX_LPB              0x040B
-+#define PESDR0_405EX_PHYSTA           0x040C
-+
-+#define PESDR1_405EX_UTLSET1          0x0440
-+#define PESDR1_405EX_UTLSET2          0x0441
-+#define PESDR1_405EX_DLPSET           0x0442
-+#define PESDR1_405EX_LOOP             0x0443
-+#define PESDR1_405EX_RCSSET           0x0444
-+#define PESDR1_405EX_RCSSTS           0x0445
-+#define PESDR1_405EX_PHYSET1          0x0446
-+#define PESDR1_405EX_PHYSET2          0x0447
-+#define PESDR1_405EX_BIST             0x0448
-+#define PESDR1_405EX_LPB              0x044B
-+#define PESDR1_405EX_PHYSTA           0x044C
-+
-+/*
-+ * Of the above, some are common offsets from the base
-+ */
-+#define PESDRn_UTLSET1                        0x00
-+#define PESDRn_UTLSET2                        0x01
-+#define PESDRn_DLPSET                 0x02
-+#define PESDRn_LOOP                   0x03
-+#define PESDRn_RCSSET                 0x04
-+#define PESDRn_RCSSTS                 0x05
-+
-+/* 440spe only */
-+#define PESDRn_440SPE_HSSL0SET1               0x06
-+#define PESDRn_440SPE_HSSL0SET2               0x07
-+#define PESDRn_440SPE_HSSL0STS                0x08
-+#define PESDRn_440SPE_HSSL1SET1               0x09
-+#define PESDRn_440SPE_HSSL1SET2               0x0a
-+#define PESDRn_440SPE_HSSL1STS                0x0b
-+#define PESDRn_440SPE_HSSL2SET1               0x0c
-+#define PESDRn_440SPE_HSSL2SET2               0x0d
-+#define PESDRn_440SPE_HSSL2STS                0x0e
-+#define PESDRn_440SPE_HSSL3SET1               0x0f
-+#define PESDRn_440SPE_HSSL3SET2               0x10
-+#define PESDRn_440SPE_HSSL3STS                0x11
-+
-+/* 440spe port 0 only */
-+#define PESDRn_440SPE_HSSL4SET1               0x12
-+#define PESDRn_440SPE_HSSL4SET2               0x13
-+#define PESDRn_440SPE_HSSL4STS                0x14
-+#define PESDRn_440SPE_HSSL5SET1               0x15
-+#define PESDRn_440SPE_HSSL5SET2               0x16
-+#define PESDRn_440SPE_HSSL5STS                0x17
-+#define PESDRn_440SPE_HSSL6SET1               0x18
-+#define PESDRn_440SPE_HSSL6SET2               0x19
-+#define PESDRn_440SPE_HSSL6STS                0x1a
-+#define PESDRn_440SPE_HSSL7SET1               0x1b
-+#define PESDRn_440SPE_HSSL7SET2               0x1c
-+#define PESDRn_440SPE_HSSL7STS                0x1d
-+
-+/* 405ex only */
-+#define PESDRn_405EX_PHYSET1          0x06
-+#define PESDRn_405EX_PHYSET2          0x07
-+#define PESDRn_405EX_PHYSTA           0x0c
-+
-+/*
-+ * UTL register offsets
-+ */
-+#define PEUTL_PBCTL           0x00
-+#define PEUTL_PBBSZ           0x20
-+#define PEUTL_OPDBSZ          0x68
-+#define PEUTL_IPHBSZ          0x70
-+#define PEUTL_IPDBSZ          0x78
-+#define PEUTL_OUTTR           0x90
-+#define PEUTL_INTR            0x98
-+#define PEUTL_PCTL            0xa0
-+#define PEUTL_RCSTA           0xB0
-+#define PEUTL_RCIRQEN         0xb8
-+
-+/*
-+ * Config space register offsets
-+ */
-+#define PECFG_ECRTCTL         0x074
-+
-+#define PECFG_BAR0LMPA                0x210
-+#define PECFG_BAR0HMPA                0x214
-+#define PECFG_BAR1MPA         0x218
-+#define PECFG_BAR2LMPA                0x220
-+#define PECFG_BAR2HMPA                0x224
-+
-+#define PECFG_PIMEN           0x33c
-+#define PECFG_PIM0LAL         0x340
-+#define PECFG_PIM0LAH         0x344
-+#define PECFG_PIM1LAL         0x348
-+#define PECFG_PIM1LAH         0x34c
-+#define PECFG_PIM01SAL                0x350
-+#define PECFG_PIM01SAH                0x354
-+
-+#define PECFG_POM0LAL         0x380
-+#define PECFG_POM0LAH         0x384
-+#define PECFG_POM1LAL         0x388
-+#define PECFG_POM1LAH         0x38c
-+#define PECFG_POM2LAL         0x390
-+#define PECFG_POM2LAH         0x394
-+
-+
-+enum
-+{
-+      PTYPE_ENDPOINT          = 0x0,
-+      PTYPE_LEGACY_ENDPOINT   = 0x1,
-+      PTYPE_ROOT_PORT         = 0x4,
-+
-+      LNKW_X1                 = 0x1,
-+      LNKW_X4                 = 0x4,
-+      LNKW_X8                 = 0x8
-+};
-+
-+
-+#endif /* __PPC4XX_PCI_H__ */
---- a/arch/powerpc/sysdev/qe_lib/Kconfig
-+++ b/arch/powerpc/sysdev/qe_lib/Kconfig
-@@ -4,7 +4,7 @@
- config UCC_SLOW
-       bool
--      default n
-+      default y if SERIAL_QE
-       help
-         This option provides qe_lib support to UCC slow
-         protocols: UART, BISYNC, QMC
---- a/arch/powerpc/sysdev/qe_lib/qe.c
-+++ b/arch/powerpc/sysdev/qe_lib/qe.c
-@@ -25,6 +25,7 @@
- #include <linux/module.h>
- #include <linux/delay.h>
- #include <linux/ioport.h>
-+#include <linux/crc32.h>
- #include <asm/irq.h>
- #include <asm/page.h>
- #include <asm/pgtable.h>
-@@ -167,19 +168,20 @@ unsigned int get_brg_clk(void)
- /* Program the BRG to the given sampling rate and multiplier
-  *
-- * @brg: the BRG, 1-16
-+ * @brg: the BRG, QE_BRG1 - QE_BRG16
-  * @rate: the desired sampling rate
-  * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
-  * GUMR_L[TDCR].  E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
-  * then 'multiplier' should be 8.
-- *
-- * Also note that the value programmed into the BRGC register must be even.
-  */
--void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier)
-+int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
- {
-       u32 divisor, tempval;
-       u32 div16 = 0;
-+      if ((brg < QE_BRG1) || (brg > QE_BRG16))
-+              return -EINVAL;
-+
-       divisor = get_brg_clk() / (rate * multiplier);
-       if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
-@@ -196,8 +198,43 @@ void qe_setbrg(unsigned int brg, unsigne
-       tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
-               QE_BRGC_ENABLE | div16;
--      out_be32(&qe_immr->brg.brgc[brg - 1], tempval);
-+      out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(qe_setbrg);
-+
-+/* Convert a string to a QE clock source enum
-+ *
-+ * This function takes a string, typically from a property in the device
-+ * tree, and returns the corresponding "enum qe_clock" value.
-+*/
-+enum qe_clock qe_clock_source(const char *source)
-+{
-+      unsigned int i;
-+
-+      if (strcasecmp(source, "none") == 0)
-+              return QE_CLK_NONE;
-+
-+      if (strncasecmp(source, "brg", 3) == 0) {
-+              i = simple_strtoul(source + 3, NULL, 10);
-+              if ((i >= 1) && (i <= 16))
-+                      return (QE_BRG1 - 1) + i;
-+              else
-+                      return QE_CLK_DUMMY;
-+      }
-+
-+      if (strncasecmp(source, "clk", 3) == 0) {
-+              i = simple_strtoul(source + 3, NULL, 10);
-+              if ((i >= 1) && (i <= 24))
-+                      return (QE_CLK1 - 1) + i;
-+              else
-+                      return QE_CLK_DUMMY;
-+      }
-+
-+      return QE_CLK_DUMMY;
- }
-+EXPORT_SYMBOL(qe_clock_source);
- /* Initialize SNUMs (thread serial numbers) according to
-  * QE Module Control chapter, SNUM table
-@@ -358,3 +395,249 @@ void *qe_muram_addr(unsigned long offset
-       return (void *)&qe_immr->muram[offset];
- }
- EXPORT_SYMBOL(qe_muram_addr);
-+
-+/* The maximum number of RISCs we support */
-+#define MAX_QE_RISC     2
-+
-+/* Firmware information stored here for qe_get_firmware_info() */
-+static struct qe_firmware_info qe_firmware_info;
-+
-+/*
-+ * Set to 1 if QE firmware has been uploaded, and therefore
-+ * qe_firmware_info contains valid data.
-+ */
-+static int qe_firmware_uploaded;
-+
-+/*
-+ * Upload a QE microcode
-+ *
-+ * This function is a worker function for qe_upload_firmware().  It does
-+ * the actual uploading of the microcode.
-+ */
-+static void qe_upload_microcode(const void *base,
-+      const struct qe_microcode *ucode)
-+{
-+      const __be32 *code = base + be32_to_cpu(ucode->code_offset);
-+      unsigned int i;
-+
-+      if (ucode->major || ucode->minor || ucode->revision)
-+              printk(KERN_INFO "qe-firmware: "
-+                      "uploading microcode '%s' version %u.%u.%u\n",
-+                      ucode->id, ucode->major, ucode->minor, ucode->revision);
-+      else
-+              printk(KERN_INFO "qe-firmware: "
-+                      "uploading microcode '%s'\n", ucode->id);
-+
-+      /* Use auto-increment */
-+      out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
-+              QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
-+
-+      for (i = 0; i < be32_to_cpu(ucode->count); i++)
-+              out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
-+}
-+
-+/*
-+ * Upload a microcode to the I-RAM at a specific address.
-+ *
-+ * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
-+ * uploading.
-+ *
-+ * Currently, only version 1 is supported, so the 'version' field must be
-+ * set to 1.
-+ *
-+ * The SOC model and revision are not validated, they are only displayed for
-+ * informational purposes.
-+ *
-+ * 'calc_size' is the calculated size, in bytes, of the firmware structure and
-+ * all of the microcode structures, minus the CRC.
-+ *
-+ * 'length' is the size that the structure says it is, including the CRC.
-+ */
-+int qe_upload_firmware(const struct qe_firmware *firmware)
-+{
-+      unsigned int i;
-+      unsigned int j;
-+      u32 crc;
-+      size_t calc_size = sizeof(struct qe_firmware);
-+      size_t length;
-+      const struct qe_header *hdr;
-+
-+      if (!firmware) {
-+              printk(KERN_ERR "qe-firmware: invalid pointer\n");
-+              return -EINVAL;
-+      }
-+
-+      hdr = &firmware->header;
-+      length = be32_to_cpu(hdr->length);
-+
-+      /* Check the magic */
-+      if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
-+          (hdr->magic[2] != 'F')) {
-+              printk(KERN_ERR "qe-firmware: not a microcode\n");
-+              return -EPERM;
-+      }
-+
-+      /* Check the version */
-+      if (hdr->version != 1) {
-+              printk(KERN_ERR "qe-firmware: unsupported version\n");
-+              return -EPERM;
-+      }
-+
-+      /* Validate some of the fields */
-+      if ((firmware->count < 1) || (firmware->count >= MAX_QE_RISC)) {
-+              printk(KERN_ERR "qe-firmware: invalid data\n");
-+              return -EINVAL;
-+      }
-+
-+      /* Validate the length and check if there's a CRC */
-+      calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
-+
-+      for (i = 0; i < firmware->count; i++)
-+              /*
-+               * For situations where the second RISC uses the same microcode
-+               * as the first, the 'code_offset' and 'count' fields will be
-+               * zero, so it's okay to add those.
-+               */
-+              calc_size += sizeof(__be32) *
-+                      be32_to_cpu(firmware->microcode[i].count);
-+
-+      /* Validate the length */
-+      if (length != calc_size + sizeof(__be32)) {
-+              printk(KERN_ERR "qe-firmware: invalid length\n");
-+              return -EPERM;
-+      }
-+
-+      /* Validate the CRC */
-+      crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
-+      if (crc != crc32(0, firmware, calc_size)) {
-+              printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
-+              return -EIO;
-+      }
-+
-+      /*
-+       * If the microcode calls for it, split the I-RAM.
-+       */
-+      if (!firmware->split)
-+              setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
-+
-+      if (firmware->soc.model)
-+              printk(KERN_INFO
-+                      "qe-firmware: firmware '%s' for %u V%u.%u\n",
-+                      firmware->id, be16_to_cpu(firmware->soc.model),
-+                      firmware->soc.major, firmware->soc.minor);
-+      else
-+              printk(KERN_INFO "qe-firmware: firmware '%s'\n",
-+                      firmware->id);
-+
-+      /*
-+       * The QE only supports one microcode per RISC, so clear out all the
-+       * saved microcode information and put in the new.
-+       */
-+      memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
-+      strcpy(qe_firmware_info.id, firmware->id);
-+      qe_firmware_info.extended_modes = firmware->extended_modes;
-+      memcpy(qe_firmware_info.vtraps, firmware->vtraps,
-+              sizeof(firmware->vtraps));
-+
-+      /* Loop through each microcode. */
-+      for (i = 0; i < firmware->count; i++) {
-+              const struct qe_microcode *ucode = &firmware->microcode[i];
-+
-+              /* Upload a microcode if it's present */
-+              if (ucode->code_offset)
-+                      qe_upload_microcode(firmware, ucode);
-+
-+              /* Program the traps for this processor */
-+              for (j = 0; j < 16; j++) {
-+                      u32 trap = be32_to_cpu(ucode->traps[j]);
-+
-+                      if (trap)
-+                              out_be32(&qe_immr->rsp[i].tibcr[j], trap);
-+              }
-+
-+              /* Enable traps */
-+              out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
-+      }
-+
-+      qe_firmware_uploaded = 1;
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(qe_upload_firmware);
-+
-+/*
-+ * Get info on the currently-loaded firmware
-+ *
-+ * This function also checks the device tree to see if the boot loader has
-+ * uploaded a firmware already.
-+ */
-+struct qe_firmware_info *qe_get_firmware_info(void)
-+{
-+      static int initialized;
-+      struct property *prop;
-+      struct device_node *qe;
-+      struct device_node *fw = NULL;
-+      const char *sprop;
-+      unsigned int i;
-+
-+      /*
-+       * If we haven't checked yet, and a driver hasn't uploaded a firmware
-+       * yet, then check the device tree for information.
-+       */
-+      if (initialized || qe_firmware_uploaded)
-+              return NULL;
-+
-+      initialized = 1;
-+
-+      /*
-+       * Newer device trees have an "fsl,qe" compatible property for the QE
-+       * node, but we still need to support older device trees.
-+      */
-+      qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
-+      if (!qe) {
-+              qe = of_find_node_by_type(NULL, "qe");
-+              if (!qe)
-+                      return NULL;
-+      }
-+
-+      /* Find the 'firmware' child node */
-+      for_each_child_of_node(qe, fw) {
-+              if (strcmp(fw->name, "firmware") == 0)
-+                      break;
-+      }
-+
-+      of_node_put(qe);
-+
-+      /* Did we find the 'firmware' node? */
-+      if (!fw)
-+              return NULL;
-+
-+      qe_firmware_uploaded = 1;
-+
-+      /* Copy the data into qe_firmware_info*/
-+      sprop = of_get_property(fw, "id", NULL);
-+      if (sprop)
-+              strncpy(qe_firmware_info.id, sprop,
-+                      sizeof(qe_firmware_info.id) - 1);
-+
-+      prop = of_find_property(fw, "extended-modes", NULL);
-+      if (prop && (prop->length == sizeof(u64))) {
-+              const u64 *iprop = prop->value;
-+
-+              qe_firmware_info.extended_modes = *iprop;
-+      }
-+
-+      prop = of_find_property(fw, "virtual-traps", NULL);
-+      if (prop && (prop->length == 32)) {
-+              const u32 *iprop = prop->value;
-+
-+              for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
-+                      qe_firmware_info.vtraps[i] = iprop[i];
-+      }
-+
-+      of_node_put(fw);
-+
-+      return &qe_firmware_info;
-+}
-+EXPORT_SYMBOL(qe_get_firmware_info);
-+
---- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-+++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-@@ -19,6 +19,7 @@
- #include <linux/stddef.h>
- #include <linux/interrupt.h>
- #include <linux/err.h>
-+#include <linux/module.h>
- #include <asm/io.h>
- #include <asm/immap_qe.h>
-@@ -41,6 +42,7 @@ u32 ucc_slow_get_qe_cr_subblock(int uccs
-       default: return QE_CR_SUBBLOCK_INVALID;
-       }
- }
-+EXPORT_SYMBOL(ucc_slow_get_qe_cr_subblock);
- void ucc_slow_poll_transmitter_now(struct ucc_slow_private * uccs)
- {
-@@ -56,6 +58,7 @@ void ucc_slow_graceful_stop_tx(struct uc
-       qe_issue_cmd(QE_GRACEFUL_STOP_TX, id,
-                        QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_graceful_stop_tx);
- void ucc_slow_stop_tx(struct ucc_slow_private * uccs)
- {
-@@ -65,6 +68,7 @@ void ucc_slow_stop_tx(struct ucc_slow_pr
-       id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
-       qe_issue_cmd(QE_STOP_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_stop_tx);
- void ucc_slow_restart_tx(struct ucc_slow_private * uccs)
- {
-@@ -74,6 +78,7 @@ void ucc_slow_restart_tx(struct ucc_slow
-       id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
-       qe_issue_cmd(QE_RESTART_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_restart_tx);
- void ucc_slow_enable(struct ucc_slow_private * uccs, enum comm_dir mode)
- {
-@@ -94,6 +99,7 @@ void ucc_slow_enable(struct ucc_slow_pri
-       }
-       out_be32(&us_regs->gumr_l, gumr_l);
- }
-+EXPORT_SYMBOL(ucc_slow_enable);
- void ucc_slow_disable(struct ucc_slow_private * uccs, enum comm_dir mode)
- {
-@@ -114,6 +120,7 @@ void ucc_slow_disable(struct ucc_slow_pr
-       }
-       out_be32(&us_regs->gumr_l, gumr_l);
- }
-+EXPORT_SYMBOL(ucc_slow_disable);
- /* Initialize the UCC for Slow operations
-  *
-@@ -347,6 +354,7 @@ int ucc_slow_init(struct ucc_slow_info *
-       *uccs_ret = uccs;
-       return 0;
- }
-+EXPORT_SYMBOL(ucc_slow_init);
- void ucc_slow_free(struct ucc_slow_private * uccs)
- {
-@@ -366,5 +374,5 @@ void ucc_slow_free(struct ucc_slow_priva
-       kfree(uccs);
- }
--
-+EXPORT_SYMBOL(ucc_slow_free);
---- a/arch/powerpc/sysdev/tsi108_dev.c
-+++ b/arch/powerpc/sysdev/tsi108_dev.c
-@@ -66,14 +66,12 @@ EXPORT_SYMBOL(get_vir_csrbase);
- static int __init tsi108_eth_of_init(void)
- {
-       struct device_node *np;
--      unsigned int i;
-+      unsigned int i = 0;
-       struct platform_device *tsi_eth_dev;
-       struct resource res;
-       int ret;
--      for (np = NULL, i = 0;
--           (np = of_find_compatible_node(np, "network", "tsi108-ethernet")) != NULL;
--           i++) {
-+      for_each_compatible_node(np, "network", "tsi108-ethernet") {
-               struct resource r[2];
-               struct device_node *phy, *mdio;
-               hw_info tsi_eth_data;
-@@ -98,7 +96,7 @@ static int __init tsi108_eth_of_init(voi
-                       __FUNCTION__,r[1].name, r[1].start, r[1].end);
-               tsi_eth_dev =
--                  platform_device_register_simple("tsi-ethernet", i, &r[0],
-+                  platform_device_register_simple("tsi-ethernet", i++, &r[0],
-                                                   1);
-               if (IS_ERR(tsi_eth_dev)) {
-@@ -154,6 +152,7 @@ static int __init tsi108_eth_of_init(voi
- unreg:
-       platform_device_unregister(tsi_eth_dev);
- err:
-+      of_node_put(np);
-       return ret;
- }
---- a/arch/powerpc/sysdev/uic.c
-+++ b/arch/powerpc/sysdev/uic.c
-@@ -53,21 +53,23 @@ struct uic {
-       /* The remapper for this UIC */
-       struct irq_host *irqhost;
--
--      /* For secondary UICs, the cascade interrupt's irqaction */
--      struct irqaction cascade;
- };
- static void uic_unmask_irq(unsigned int virq)
- {
-+      struct irq_desc *desc = get_irq_desc(virq);
-       struct uic *uic = get_irq_chip_data(virq);
-       unsigned int src = uic_irq_to_hw(virq);
-       unsigned long flags;
--      u32 er;
-+      u32 er, sr;
-+      sr = 1 << (31-src);
-       spin_lock_irqsave(&uic->lock, flags);
-+      /* ack level-triggered interrupts here */
-+      if (desc->status & IRQ_LEVEL)
-+              mtdcr(uic->dcrbase + UIC_SR, sr);
-       er = mfdcr(uic->dcrbase + UIC_ER);
--      er |= 1 << (31 - src);
-+      er |= sr;
-       mtdcr(uic->dcrbase + UIC_ER, er);
-       spin_unlock_irqrestore(&uic->lock, flags);
- }
-@@ -99,6 +101,7 @@ static void uic_ack_irq(unsigned int vir
- static void uic_mask_ack_irq(unsigned int virq)
- {
-+      struct irq_desc *desc = get_irq_desc(virq);
-       struct uic *uic = get_irq_chip_data(virq);
-       unsigned int src = uic_irq_to_hw(virq);
-       unsigned long flags;
-@@ -109,7 +112,16 @@ static void uic_mask_ack_irq(unsigned in
-       er = mfdcr(uic->dcrbase + UIC_ER);
-       er &= ~sr;
-       mtdcr(uic->dcrbase + UIC_ER, er);
--      mtdcr(uic->dcrbase + UIC_SR, sr);
-+      /* On the UIC, acking (i.e. clearing the SR bit)
-+       * a level irq will have no effect if the interrupt
-+       * is still asserted by the device, even if
-+       * the interrupt is already masked. Therefore
-+       * we only ack the egde interrupts here, while
-+       * level interrupts are ack'ed after the actual
-+       * isr call in the uic_unmask_irq()
-+       */
-+      if (!(desc->status & IRQ_LEVEL))
-+              mtdcr(uic->dcrbase + UIC_SR, sr);
-       spin_unlock_irqrestore(&uic->lock, flags);
- }
-@@ -173,64 +185,6 @@ static struct irq_chip uic_irq_chip = {
-       .set_type       = uic_set_irq_type,
- };
--/**
-- *    handle_uic_irq - irq flow handler for UIC
-- *    @irq:   the interrupt number
-- *    @desc:  the interrupt description structure for this irq
-- *
-- * This is modified version of the generic handle_level_irq() suitable
-- * for the UIC.  On the UIC, acking (i.e. clearing the SR bit) a level
-- * irq will have no effect if the interrupt is still asserted by the
-- * device, even if the interrupt is already masked.  Therefore, unlike
-- * the standard handle_level_irq(), we must ack the interrupt *after*
-- * invoking the ISR (which should have de-asserted the interrupt in
-- * the external source).  For edge interrupts we ack at the beginning
-- * instead of the end, to keep the window in which we can miss an
-- * interrupt as small as possible.
-- */
--void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc)
--{
--      unsigned int cpu = smp_processor_id();
--      struct irqaction *action;
--      irqreturn_t action_ret;
--
--      spin_lock(&desc->lock);
--      if (desc->status & IRQ_LEVEL)
--              desc->chip->mask(irq);
--      else
--              desc->chip->mask_ack(irq);
--
--      if (unlikely(desc->status & IRQ_INPROGRESS))
--              goto out_unlock;
--      desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
--      kstat_cpu(cpu).irqs[irq]++;
--
--      /*
--       * If its disabled or no action available
--       * keep it masked and get out of here
--       */
--      action = desc->action;
--      if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
--              desc->status |= IRQ_PENDING;
--              goto out_unlock;
--      }
--
--      desc->status |= IRQ_INPROGRESS;
--      desc->status &= ~IRQ_PENDING;
--      spin_unlock(&desc->lock);
--
--      action_ret = handle_IRQ_event(irq, action);
--
--      spin_lock(&desc->lock);
--      desc->status &= ~IRQ_INPROGRESS;
--      if (desc->status & IRQ_LEVEL)
--              desc->chip->ack(irq);
--      if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
--              desc->chip->unmask(irq);
--out_unlock:
--      spin_unlock(&desc->lock);
--}
--
- static int uic_host_map(struct irq_host *h, unsigned int virq,
-                       irq_hw_number_t hw)
- {
-@@ -239,7 +193,7 @@ static int uic_host_map(struct irq_host 
-       set_irq_chip_data(virq, uic);
-       /* Despite the name, handle_level_irq() works for both level
-        * and edge irqs on UIC.  FIXME: check this is correct */
--      set_irq_chip_and_handler(virq, &uic_irq_chip, handle_uic_irq);
-+      set_irq_chip_and_handler(virq, &uic_irq_chip, handle_level_irq);
-       /* Set default irq type */
-       set_irq_type(virq, IRQ_TYPE_NONE);
-@@ -264,23 +218,36 @@ static struct irq_host_ops uic_host_ops 
-       .xlate  = uic_host_xlate,
- };
--irqreturn_t uic_cascade(int virq, void *data)
-+void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)
- {
--      struct uic *uic = data;
-+      struct uic *uic = get_irq_data(virq);
-       u32 msr;
-       int src;
-       int subvirq;
-+      spin_lock(&desc->lock);
-+      if (desc->status & IRQ_LEVEL)
-+              desc->chip->mask(virq);
-+      else
-+              desc->chip->mask_ack(virq);
-+      spin_unlock(&desc->lock);
-+
-       msr = mfdcr(uic->dcrbase + UIC_MSR);
-       if (!msr) /* spurious interrupt */
--              return IRQ_HANDLED;
-+              goto uic_irq_ret;
-       src = 32 - ffs(msr);
-       subvirq = irq_linear_revmap(uic->irqhost, src);
-       generic_handle_irq(subvirq);
--      return IRQ_HANDLED;
-+uic_irq_ret:
-+      spin_lock(&desc->lock);
-+      if (desc->status & IRQ_LEVEL)
-+              desc->chip->ack(virq);
-+      if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
-+              desc->chip->unmask(virq);
-+      spin_unlock(&desc->lock);
- }
- static struct uic * __init uic_init_one(struct device_node *node)
-@@ -342,33 +309,27 @@ void __init uic_init_tree(void)
-       const u32 *interrupts;
-       /* First locate and initialize the top-level UIC */
--
--      np = of_find_compatible_node(NULL, NULL, "ibm,uic");
--      while (np) {
-+      for_each_compatible_node(np, NULL, "ibm,uic") {
-               interrupts = of_get_property(np, "interrupts", NULL);
--              if (! interrupts)
-+              if (!interrupts)
-                       break;
--
--              np = of_find_compatible_node(np, NULL, "ibm,uic");
-       }
-       BUG_ON(!np); /* uic_init_tree() assumes there's a UIC as the
-                     * top-level interrupt controller */
-       primary_uic = uic_init_one(np);
--      if (! primary_uic)
-+      if (!primary_uic)
-               panic("Unable to initialize primary UIC %s\n", np->full_name);
-       irq_set_default_host(primary_uic->irqhost);
-       of_node_put(np);
-       /* The scan again for cascaded UICs */
--      np = of_find_compatible_node(NULL, NULL, "ibm,uic");
--      while (np) {
-+      for_each_compatible_node(np, NULL, "ibm,uic") {
-               interrupts = of_get_property(np, "interrupts", NULL);
-               if (interrupts) {
-                       /* Secondary UIC */
-                       int cascade_virq;
--                      int ret;
-                       uic = uic_init_one(np);
-                       if (! uic)
-@@ -377,20 +338,11 @@ void __init uic_init_tree(void)
-                       cascade_virq = irq_of_parse_and_map(np, 0);
--                      uic->cascade.handler = uic_cascade;
--                      uic->cascade.name = "UIC cascade";
--                      uic->cascade.dev_id = uic;
--
--                      ret = setup_irq(cascade_virq, &uic->cascade);
--                      if (ret)
--                              printk(KERN_ERR "Failed to setup_irq(%d) for "
--                                     "UIC%d cascade\n", cascade_virq,
--                                     uic->index);
-+                      set_irq_data(cascade_virq, uic);
-+                      set_irq_chained_handler(cascade_virq, uic_irq_cascade);
-                       /* FIXME: setup critical cascade?? */
-               }
--
--              np = of_find_compatible_node(np, NULL, "ibm,uic");
-       }
- }
---- a/arch/powerpc/sysdev/xilinx_intc.c
-+++ b/arch/powerpc/sysdev/xilinx_intc.c
-@@ -135,10 +135,16 @@ void __init xilinx_intc_init_tree(void)
-       struct device_node *np;
-       /* find top level interrupt controller */
--      for_each_compatible_node(np, NULL, "xilinx,intc") {
-+      for_each_compatible_node(np, NULL, "xlnx,opb-intc-1.00.c") {
-               if (!of_get_property(np, "interrupts", NULL))
-                       break;
-       }
-+      if (!np) {
-+              for_each_compatible_node(np, NULL, "xlnx,xps-intc-1.00.a") {
-+                      if (!of_get_property(np, "interrupts", NULL))
-+                              break;
-+              }
-+      }
-       /* xilinx interrupt controller needs to be top level */
-       BUG_ON(!np);
---- a/arch/powerpc/xmon/setjmp.S
-+++ b/arch/powerpc/xmon/setjmp.S
-@@ -12,67 +12,6 @@
- #include <asm/ppc_asm.h>
- #include <asm/asm-offsets.h>
--_GLOBAL(xmon_setjmp)
--      mflr    r0
--      PPC_STL r0,0(r3)
--      PPC_STL r1,SZL(r3)
--      PPC_STL r2,2*SZL(r3)
--      mfcr    r0
--      PPC_STL r0,3*SZL(r3)
--      PPC_STL r13,4*SZL(r3)
--      PPC_STL r14,5*SZL(r3)
--      PPC_STL r15,6*SZL(r3)
--      PPC_STL r16,7*SZL(r3)
--      PPC_STL r17,8*SZL(r3)
--      PPC_STL r18,9*SZL(r3)
--      PPC_STL r19,10*SZL(r3)
--      PPC_STL r20,11*SZL(r3)
--      PPC_STL r21,12*SZL(r3)
--      PPC_STL r22,13*SZL(r3)
--      PPC_STL r23,14*SZL(r3)
--      PPC_STL r24,15*SZL(r3)
--      PPC_STL r25,16*SZL(r3)
--      PPC_STL r26,17*SZL(r3)
--      PPC_STL r27,18*SZL(r3)
--      PPC_STL r28,19*SZL(r3)
--      PPC_STL r29,20*SZL(r3)
--      PPC_STL r30,21*SZL(r3)
--      PPC_STL r31,22*SZL(r3)
--      li      r3,0
--      blr
--
--_GLOBAL(xmon_longjmp)
--      PPC_LCMPI r4,0
--      bne     1f
--      li      r4,1
--1:    PPC_LL  r13,4*SZL(r3)
--      PPC_LL  r14,5*SZL(r3)
--      PPC_LL  r15,6*SZL(r3)
--      PPC_LL  r16,7*SZL(r3)
--      PPC_LL  r17,8*SZL(r3)
--      PPC_LL  r18,9*SZL(r3)
--      PPC_LL  r19,10*SZL(r3)
--      PPC_LL  r20,11*SZL(r3)
--      PPC_LL  r21,12*SZL(r3)
--      PPC_LL  r22,13*SZL(r3)
--      PPC_LL  r23,14*SZL(r3)
--      PPC_LL  r24,15*SZL(r3)
--      PPC_LL  r25,16*SZL(r3)
--      PPC_LL  r26,17*SZL(r3)
--      PPC_LL  r27,18*SZL(r3)
--      PPC_LL  r28,19*SZL(r3)
--      PPC_LL  r29,20*SZL(r3)
--      PPC_LL  r30,21*SZL(r3)
--      PPC_LL  r31,22*SZL(r3)
--      PPC_LL  r0,3*SZL(r3)
--      mtcrf   0x38,r0
--      PPC_LL  r0,0(r3)
--      PPC_LL  r1,SZL(r3)
--      PPC_LL  r2,2*SZL(r3)
--      mtlr    r0
--      mr      r3,r4
--      blr
--
- /*
-  * Grab the register values as they are now.
-  * This won't do a particularily good job because we really
---- a/arch/powerpc/xmon/xmon.c
-+++ b/arch/powerpc/xmon/xmon.c
-@@ -40,6 +40,7 @@
- #include <asm/spu.h>
- #include <asm/spu_priv1.h>
- #include <asm/firmware.h>
-+#include <asm/setjmp.h>
- #ifdef CONFIG_PPC64
- #include <asm/hvcall.h>
-@@ -71,12 +72,9 @@ static unsigned long ncsum = 4096;
- static int termch;
- static char tmpstr[128];
--#define JMP_BUF_LEN   23
- static long bus_error_jmp[JMP_BUF_LEN];
- static int catch_memory_errors;
- static long *xmon_fault_jmp[NR_CPUS];
--#define setjmp xmon_setjmp
--#define longjmp xmon_longjmp
- /* Breakpoint stuff */
- struct bpt {
-@@ -153,13 +151,15 @@ static const char *getvecname(unsigned l
- static int do_spu_cmd(void);
-+#ifdef CONFIG_44x
-+static void dump_tlb_44x(void);
-+#endif
-+
- int xmon_no_auto_backtrace;
- extern void xmon_enter(void);
- extern void xmon_leave(void);
--extern long setjmp(long *);
--extern void longjmp(long *, long);
- extern void xmon_save_regs(struct pt_regs *);
- #ifdef CONFIG_PPC64
-@@ -231,6 +231,9 @@ Commands:\n\
- #ifdef CONFIG_PPC_STD_MMU_32
- "  u  dump segment registers\n"
- #endif
-+#ifdef CONFIG_44x
-+"  u  dump TLB\n"
-+#endif
- "  ?  help\n"
- "  zr reboot\n\
-   zh  halt\n"
-@@ -856,6 +859,11 @@ cmds(struct pt_regs *excp)
-                       dump_segments();
-                       break;
- #endif
-+#ifdef CONFIG_4xx
-+              case 'u':
-+                      dump_tlb_44x();
-+                      break;
-+#endif
-               default:
-                       printf("Unrecognized command: ");
-                       do {
-@@ -2527,16 +2535,33 @@ static void xmon_print_symbol(unsigned l
- static void dump_slb(void)
- {
-       int i;
--      unsigned long tmp;
-+      unsigned long esid,vsid,valid;
-+      unsigned long llp;
-       printf("SLB contents of cpu %x\n", smp_processor_id());
--      for (i = 0; i < SLB_NUM_ENTRIES; i++) {
--              asm volatile("slbmfee  %0,%1" : "=r" (tmp) : "r" (i));
--              printf("%02d %016lx ", i, tmp);
--
--              asm volatile("slbmfev  %0,%1" : "=r" (tmp) : "r" (i));
--              printf("%016lx\n", tmp);
-+      for (i = 0; i < mmu_slb_size; i++) {
-+              asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
-+              asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
-+              valid = (esid & SLB_ESID_V);
-+              if (valid | esid | vsid) {
-+                      printf("%02d %016lx %016lx", i, esid, vsid);
-+                      if (valid) {
-+                              llp = vsid & SLB_VSID_LLP;
-+                              if (vsid & SLB_VSID_B_1T) {
-+                                      printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",
-+                                              GET_ESID_1T(esid),
-+                                              (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
-+                                              llp);
-+                              } else {
-+                                      printf(" 256M ESID=%9lx  VSID=%13lx LLP:%3lx \n",
-+                                              GET_ESID(esid),
-+                                              (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
-+                                              llp);
-+                              }
-+                      } else
-+                              printf("\n");
-+              }
-       }
- }
-@@ -2581,6 +2606,32 @@ void dump_segments(void)
- }
- #endif
-+#ifdef CONFIG_44x
-+static void dump_tlb_44x(void)
-+{
-+      int i;
-+
-+      for (i = 0; i < PPC44x_TLB_SIZE; i++) {
-+              unsigned long w0,w1,w2;
-+              asm volatile("tlbre  %0,%1,0" : "=r" (w0) : "r" (i));
-+              asm volatile("tlbre  %0,%1,1" : "=r" (w1) : "r" (i));
-+              asm volatile("tlbre  %0,%1,2" : "=r" (w2) : "r" (i));
-+              printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
-+              if (w0 & PPC44x_TLB_VALID) {
-+                      printf("V %08x -> %01x%08x %c%c%c%c%c",
-+                             w0 & PPC44x_TLB_EPN_MASK,
-+                             w1 & PPC44x_TLB_ERPN_MASK,
-+                             w1 & PPC44x_TLB_RPN_MASK,
-+                             (w2 & PPC44x_TLB_W) ? 'W' : 'w',
-+                             (w2 & PPC44x_TLB_I) ? 'I' : 'i',
-+                             (w2 & PPC44x_TLB_M) ? 'M' : 'm',
-+                             (w2 & PPC44x_TLB_G) ? 'G' : 'g',
-+                             (w2 & PPC44x_TLB_E) ? 'E' : 'e');
-+              }
-+              printf("\n");
-+      }
-+}
-+#endif /* CONFIG_44x */
- void xmon_init(int enable)
- {
- #ifdef CONFIG_PPC_ISERIES
---- a/arch/ppc/kernel/Makefile
-+++ b/arch/ppc/kernel/Makefile
-@@ -13,7 +13,6 @@ obj-y                                := entry.o traps.o time.o misc.
-                                       ppc_htab.o
- obj-$(CONFIG_MODULES)         += ppc_ksyms.o
- obj-$(CONFIG_PCI)             += pci.o
--obj-$(CONFIG_RAPIDIO)         += rio.o
- obj-$(CONFIG_KGDB)            += ppc-stub.o
- obj-$(CONFIG_SMP)             += smp.o smp-tbsync.o
- obj-$(CONFIG_KEXEC)           += machine_kexec.o relocate_kernel.o
---- a/arch/ppc/kernel/head_44x.S
-+++ b/arch/ppc/kernel/head_44x.S
-@@ -195,7 +195,7 @@ skpinv:    addi    r4,r4,1                         /* Increment */
-       li      r5,0
-       ori     r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G)
--        li      r0,0                    /* TLB slot 0 */
-+      li      r0,62                   /* TLB slot 62 */
-       tlbwe   r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */
-       tlbwe   r4,r0,PPC44x_TLB_XLAT   /* Load the translation fields */
---- a/arch/ppc/kernel/rio.c
-+++ /dev/null
-@@ -1,52 +0,0 @@
--/*
-- * RapidIO PPC32 support
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute  it and/or modify it
-- * under  the terms of  the GNU General  Public License as published by the
-- * Free Software Foundation;  either version 2 of the  License, or (at your
-- * option) any later version.
-- */
--
--#include <linux/init.h>
--#include <linux/kernel.h>
--#include <linux/rio.h>
--
--#include <asm/rio.h>
--
--/**
-- * platform_rio_init - Do platform specific RIO init
-- *
-- * Any platform specific initialization of RapdIO
-- * hardware is done here as well as registration
-- * of any active master ports in the system.
-- */
--void __attribute__ ((weak))
--    platform_rio_init(void)
--{
--      printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
--}
--
--/**
-- * ppc_rio_init - Do PPC32 RIO init
-- *
-- * Calls platform-specific RIO init code and then calls
-- * rio_init_mports() to initialize any master ports that
-- * have been registered with the RIO subsystem.
-- */
--static int __init ppc_rio_init(void)
--{
--      printk(KERN_INFO "RIO: RapidIO init\n");
--
--      /* Platform specific initialization */
--      platform_rio_init();
--
--      /* Enumerate all registered ports */
--      rio_init_mports();
--
--      return 0;
--}
--
--subsys_initcall(ppc_rio_init);
---- a/arch/ppc/kernel/setup.c
-+++ b/arch/ppc/kernel/setup.c
-@@ -37,7 +37,6 @@
- #include <asm/nvram.h>
- #include <asm/xmon.h>
- #include <asm/ocp.h>
--#include <asm/prom.h>
- #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \
-                     defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \
---- a/arch/ppc/kernel/traps.c
-+++ b/arch/ppc/kernel/traps.c
-@@ -231,39 +231,25 @@ platform_machine_check(struct pt_regs *r
- {
- }
--void machine_check_exception(struct pt_regs *regs)
-+#if defined(CONFIG_4xx)
-+int machine_check_4xx(struct pt_regs *regs)
- {
-       unsigned long reason = get_mc_reason(regs);
--      if (user_mode(regs)) {
--              regs->msr |= MSR_RI;
--              _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
--              return;
--      }
--
--#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
--      /* the qspan pci read routines can cause machine checks -- Cort */
--      bad_page_fault(regs, regs->dar, SIGBUS);
--      return;
--#endif
--
--      if (debugger_fault_handler) {
--              debugger_fault_handler(regs);
--              regs->msr |= MSR_RI;
--              return;
--      }
--
--      if (check_io_access(regs))
--              return;
--
--#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
-       if (reason & ESR_IMCP) {
-               printk("Instruction");
-               mtspr(SPRN_ESR, reason & ~ESR_IMCP);
-       } else
-               printk("Data");
-       printk(" machine check in kernel mode.\n");
--#elif defined(CONFIG_440A)
-+
-+      return 0;
-+}
-+
-+int machine_check_440A(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       if (reason & ESR_IMCP){
-               printk("Instruction Synchronous Machine Check exception\n");
-@@ -293,7 +279,13 @@ void machine_check_exception(struct pt_r
-               /* Clear MCSR */
-               mtspr(SPRN_MCSR, mcsr);
-       }
--#elif defined (CONFIG_E500)
-+      return 0;
-+}
-+#elif defined(CONFIG_E500)
-+int machine_check_e500(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from MCSR=%lx): ", reason);
-@@ -305,8 +297,6 @@ void machine_check_exception(struct pt_r
-               printk("Data Cache Push Parity Error\n");
-       if (reason & MCSR_DCPERR)
-               printk("Data Cache Parity Error\n");
--      if (reason & MCSR_GL_CI)
--              printk("Guarded Load or Cache-Inhibited stwcx.\n");
-       if (reason & MCSR_BUS_IAERR)
-               printk("Bus - Instruction Address Error\n");
-       if (reason & MCSR_BUS_RAERR)
-@@ -318,12 +308,19 @@ void machine_check_exception(struct pt_r
-       if (reason & MCSR_BUS_RBERR)
-               printk("Bus - Read Data Bus Error\n");
-       if (reason & MCSR_BUS_WBERR)
--              printk("Bus - Write Data Bus Error\n");
-+              printk("Bus - Read Data Bus Error\n");
-       if (reason & MCSR_BUS_IPERR)
-               printk("Bus - Instruction Parity Error\n");
-       if (reason & MCSR_BUS_RPERR)
-               printk("Bus - Read Parity Error\n");
--#elif defined (CONFIG_E200)
-+
-+      return 0;
-+}
-+#elif defined(CONFIG_E200)
-+int machine_check_e200(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from MCSR=%lx): ", reason);
-@@ -341,7 +338,14 @@ void machine_check_exception(struct pt_r
-               printk("Bus - Read Bus Error on data load\n");
-       if (reason & MCSR_BUS_WRERR)
-               printk("Bus - Write Bus Error on buffered store or cache line push\n");
--#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
-+
-+      return 0;
-+}
-+#else
-+int machine_check_generic(struct pt_regs *regs)
-+{
-+      unsigned long reason = get_mc_reason(regs);
-+
-       printk("Machine check in kernel mode.\n");
-       printk("Caused by (from SRR1=%lx): ", reason);
-       switch (reason & 0x601F0000) {
-@@ -371,7 +375,39 @@ void machine_check_exception(struct pt_r
-       default:
-               printk("Unknown values in msr\n");
-       }
--#endif /* CONFIG_4xx */
-+      return 0;
-+}
-+#endif /* everything else */
-+
-+void machine_check_exception(struct pt_regs *regs)
-+{
-+      int recover = 0;
-+
-+      if (cur_cpu_spec->machine_check)
-+              recover = cur_cpu_spec->machine_check(regs);
-+      if (recover > 0)
-+              return;
-+
-+      if (user_mode(regs)) {
-+              regs->msr |= MSR_RI;
-+              _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
-+              return;
-+      }
-+
-+#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
-+      /* the qspan pci read routines can cause machine checks -- Cort */
-+      bad_page_fault(regs, regs->dar, SIGBUS);
-+      return;
-+#endif
-+
-+      if (debugger_fault_handler) {
-+              debugger_fault_handler(regs);
-+              regs->msr |= MSR_RI;
-+              return;
-+      }
-+
-+      if (check_io_access(regs))
-+              return;
-       /*
-        * Optional platform-provided routine to print out
---- a/arch/ppc/mm/44x_mmu.c
-+++ b/arch/ppc/mm/44x_mmu.c
-@@ -60,38 +60,28 @@ extern char etext[], _stext[];
-  * Just needed it declared someplace.
-  */
- unsigned int tlb_44x_index = 0;
--unsigned int tlb_44x_hwater = 62;
-+unsigned int tlb_44x_hwater = PPC4XX_TLB_SIZE - 1 - PPC44x_EARLY_TLBS;
- int icache_44x_need_flush;
- /*
-  * "Pins" a 256MB TLB entry in AS0 for kernel lowmem
-  */
--static void __init
--ppc44x_pin_tlb(int slot, unsigned int virt, unsigned int phys)
-+static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys)
- {
--      unsigned long attrib = 0;
--
--      __asm__ __volatile__("\
--      clrrwi  %2,%2,10\n\
--      ori     %2,%2,%4\n\
--      clrrwi  %1,%1,10\n\
--      li      %0,0\n\
--      ori     %0,%0,%5\n\
--      tlbwe   %2,%3,%6\n\
--      tlbwe   %1,%3,%7\n\
--      tlbwe   %0,%3,%8"
-+      __asm__ __volatile__(
-+              "tlbwe  %2,%3,%4\n"
-+              "tlbwe  %1,%3,%5\n"
-+              "tlbwe  %0,%3,%6\n"
-       :
--      : "r" (attrib), "r" (phys), "r" (virt), "r" (slot),
--        "i" (PPC44x_TLB_VALID | PPC44x_TLB_256M),
--        "i" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
-+      : "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
-+        "r" (phys),
-+        "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M),
-+        "r" (tlb_44x_hwater--), /* slot for this TLB entry */
-         "i" (PPC44x_TLB_PAGEID),
-         "i" (PPC44x_TLB_XLAT),
-         "i" (PPC44x_TLB_ATTRIB));
- }
--/*
-- * MMU_init_hw does the chip-specific initialization of the MMU hardware.
-- */
- void __init MMU_init_hw(void)
- {
-       flush_instruction_cache();
-@@ -99,22 +89,13 @@ void __init MMU_init_hw(void)
- unsigned long __init mmu_mapin_ram(void)
- {
--      unsigned int pinned_tlbs = 1;
--      int i;
--
--      /* Determine number of entries necessary to cover lowmem */
--      pinned_tlbs = (unsigned int)
--              (_ALIGN(total_lowmem, PPC_PIN_SIZE) >> PPC44x_PIN_SHIFT);
--
--      /* Write upper watermark to save location */
--      tlb_44x_hwater = PPC44x_LOW_SLOT - pinned_tlbs;
-+      unsigned long addr;
--      /* If necessary, set additional pinned TLBs */
--      if (pinned_tlbs > 1)
--              for (i = (PPC44x_LOW_SLOT-(pinned_tlbs-1)); i < PPC44x_LOW_SLOT; i++) {
--                      unsigned int phys_addr = (PPC44x_LOW_SLOT-i) * PPC_PIN_SIZE;
--                      ppc44x_pin_tlb(i, phys_addr+PAGE_OFFSET, phys_addr);
--              }
-+      /* Pin in enough TLBs to cover any lowmem not covered by the
-+       * initial 256M mapping established in head_44x.S */
-+      for (addr = PPC_PIN_SIZE; addr < total_lowmem;
-+           addr += PPC_PIN_SIZE)
-+              ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
-       return total_lowmem;
- }
---- a/arch/ppc/platforms/85xx/mpc85xx_ads_common.c
-+++ b/arch/ppc/platforms/85xx/mpc85xx_ads_common.c
-@@ -42,8 +42,6 @@
- #include <mm/mmu_decl.h>
--#include <syslib/ppc85xx_rio.h>
--
- #include <platforms/85xx/mpc85xx_ads_common.h>
- #ifndef CONFIG_PCI
-@@ -190,6 +188,7 @@ mpc85xx_exclude_device(u_char bus, u_cha
- #endif /* CONFIG_PCI */
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void platform_rio_init(void)
- {
-       /* 512MB RIO LAW at 0xc0000000 */
---- a/arch/ppc/platforms/85xx/stx_gp3.c
-+++ b/arch/ppc/platforms/85xx/stx_gp3.c
-@@ -50,12 +50,10 @@
- #include <asm/irq.h>
- #include <asm/immap_85xx.h>
- #include <asm/cpm2.h>
--#include <asm/mpc85xx.h>
- #include <asm/ppc_sys.h>
- #include <syslib/cpm2_pic.h>
- #include <syslib/ppc85xx_common.h>
--#include <syslib/ppc85xx_rio.h>
- unsigned char __res[sizeof(bd_t)];
-@@ -271,6 +269,7 @@ int mpc85xx_exclude_device(u_char bus, u
- #endif /* CONFIG_PCI */
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void
- platform_rio_init(void)
- {
---- a/arch/ppc/platforms/85xx/tqm85xx.c
-+++ b/arch/ppc/platforms/85xx/tqm85xx.c
-@@ -54,7 +54,6 @@
- #include <syslib/ppc85xx_setup.h>
- #include <syslib/cpm2_pic.h>
- #include <syslib/ppc85xx_common.h>
--#include <syslib/ppc85xx_rio.h>
- #ifndef CONFIG_PCI
- unsigned long isa_io_base = 0;
-@@ -309,6 +308,7 @@ int mpc85xx_exclude_device(u_char bus, u
- #endif /* CONFIG_PCI */
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void platform_rio_init(void)
- {
-       /* 512MB RIO LAW at 0xc0000000 */
---- a/arch/ppc/platforms/ev64260.c
-+++ b/arch/ppc/platforms/ev64260.c
-@@ -336,7 +336,7 @@ ev64260_early_serial_map(void)
- #endif
-               if (early_serial_setup(&port) != 0)
--                      printk(KERN_WARNING "Early serial init of port 0"
-+                      printk(KERN_WARNING "Early serial init of port 0 "
-                               "failed\n");
-               first_time = 0;
-@@ -388,7 +388,7 @@ ev64260_setup_arch(void)
-       ev64260_early_serial_map();
- #endif
--      printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc."
-+      printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc. "
-               "(source@mvista.com)\n", BOARD_VENDOR, BOARD_MACHINE);
-       if (ppc_md.progress)
---- a/arch/ppc/platforms/prep_pci.c
-+++ b/arch/ppc/platforms/prep_pci.c
-@@ -1099,7 +1099,6 @@ prep_pib_init(void)
-                               pci_write_config_byte(dev, 0x43, reg);
-                       }
-               }
--              pci_dev_put(dev);
-       }
-       if ((dev = pci_get_device(PCI_VENDOR_ID_WINBOND,
---- a/arch/ppc/syslib/Makefile
-+++ b/arch/ppc/syslib/Makefile
-@@ -93,7 +93,6 @@ obj-$(CONFIG_85xx)           += open_pic.o ppc85x
- ifeq ($(CONFIG_85xx),y)
- obj-$(CONFIG_PCI)             += pci_auto.o
- endif
--obj-$(CONFIG_RAPIDIO)         += ppc85xx_rio.o
- obj-$(CONFIG_83xx)            += ppc83xx_setup.o ppc_sys.o \
-                                       mpc83xx_sys.o mpc83xx_devices.o ipic.o
- ifeq ($(CONFIG_83xx),y)
---- a/arch/ppc/syslib/gt64260_pic.c
-+++ b/arch/ppc/syslib/gt64260_pic.c
-@@ -35,7 +35,6 @@
- #include <linux/interrupt.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
---- a/arch/ppc/syslib/mpc52xx_pic.c
-+++ b/arch/ppc/syslib/mpc52xx_pic.c
-@@ -20,7 +20,6 @@
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
---- a/arch/ppc/syslib/mv64360_pic.c
-+++ b/arch/ppc/syslib/mv64360_pic.c
-@@ -36,7 +36,6 @@
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
- #include <linux/interrupt.h>
---- a/arch/ppc/syslib/ocp.c
-+++ b/arch/ppc/syslib/ocp.c
-@@ -376,7 +376,7 @@ ocp_remove_one_device(unsigned int vendo
-       down_write(&ocp_devices_sem);
-       dev = __ocp_find_device(vendor, function, index);
--      list_del((struct list_head *)dev);
-+      list_del(&dev->link);
-       up_write(&ocp_devices_sem);
-       DBG(("ocp: ocp_remove_one_device(vendor: %x, function: %x, index: %d)... done.\n", vendor, function, index));
---- a/arch/ppc/syslib/ppc83xx_setup.c
-+++ b/arch/ppc/syslib/ppc83xx_setup.c
-@@ -41,7 +41,6 @@
- #include <syslib/ppc83xx_setup.h>
- #if defined(CONFIG_PCI)
--#include <asm/delay.h>
- #include <syslib/ppc83xx_pci.h>
- #endif
---- a/arch/ppc/syslib/ppc85xx_rio.c
-+++ /dev/null
-@@ -1,932 +0,0 @@
--/*
-- * MPC85xx RapidIO support
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute  it and/or modify it
-- * under  the terms of  the GNU General  Public License as published by the
-- * Free Software Foundation;  either version 2 of the  License, or (at your
-- * option) any later version.
-- */
--
--#include <linux/init.h>
--#include <linux/module.h>
--#include <linux/types.h>
--#include <linux/dma-mapping.h>
--#include <linux/interrupt.h>
--#include <linux/rio.h>
--#include <linux/rio_drv.h>
--
--#include <asm/io.h>
--
--#define RIO_REGS_BASE         (CCSRBAR + 0xc0000)
--#define RIO_ATMU_REGS_OFFSET  0x10c00
--#define RIO_MSG_REGS_OFFSET   0x11000
--#define RIO_MAINT_WIN_SIZE    0x400000
--#define RIO_DBELL_WIN_SIZE    0x1000
--
--#define RIO_MSG_OMR_MUI               0x00000002
--#define RIO_MSG_OSR_TE                0x00000080
--#define RIO_MSG_OSR_QOI               0x00000020
--#define RIO_MSG_OSR_QFI               0x00000010
--#define RIO_MSG_OSR_MUB               0x00000004
--#define RIO_MSG_OSR_EOMI      0x00000002
--#define RIO_MSG_OSR_QEI               0x00000001
--
--#define RIO_MSG_IMR_MI                0x00000002
--#define RIO_MSG_ISR_TE                0x00000080
--#define RIO_MSG_ISR_QFI               0x00000010
--#define RIO_MSG_ISR_DIQI      0x00000001
--
--#define RIO_MSG_DESC_SIZE     32
--#define RIO_MSG_BUFFER_SIZE   4096
--#define RIO_MIN_TX_RING_SIZE  2
--#define RIO_MAX_TX_RING_SIZE  2048
--#define RIO_MIN_RX_RING_SIZE  2
--#define RIO_MAX_RX_RING_SIZE  2048
--
--#define DOORBELL_DMR_DI               0x00000002
--#define DOORBELL_DSR_TE               0x00000080
--#define DOORBELL_DSR_QFI      0x00000010
--#define DOORBELL_DSR_DIQI     0x00000001
--#define DOORBELL_TID_OFFSET   0x03
--#define DOORBELL_SID_OFFSET   0x05
--#define DOORBELL_INFO_OFFSET  0x06
--
--#define DOORBELL_MESSAGE_SIZE 0x08
--#define DBELL_SID(x)          (*(u8 *)(x + DOORBELL_SID_OFFSET))
--#define DBELL_TID(x)          (*(u8 *)(x + DOORBELL_TID_OFFSET))
--#define DBELL_INF(x)          (*(u16 *)(x + DOORBELL_INFO_OFFSET))
--
--struct rio_atmu_regs {
--      u32 rowtar;
--      u32 pad1;
--      u32 rowbar;
--      u32 pad2;
--      u32 rowar;
--      u32 pad3[3];
--};
--
--struct rio_msg_regs {
--      u32 omr;
--      u32 osr;
--      u32 pad1;
--      u32 odqdpar;
--      u32 pad2;
--      u32 osar;
--      u32 odpr;
--      u32 odatr;
--      u32 odcr;
--      u32 pad3;
--      u32 odqepar;
--      u32 pad4[13];
--      u32 imr;
--      u32 isr;
--      u32 pad5;
--      u32 ifqdpar;
--      u32 pad6;
--      u32 ifqepar;
--      u32 pad7[250];
--      u32 dmr;
--      u32 dsr;
--      u32 pad8;
--      u32 dqdpar;
--      u32 pad9;
--      u32 dqepar;
--      u32 pad10[26];
--      u32 pwmr;
--      u32 pwsr;
--      u32 pad11;
--      u32 pwqbar;
--};
--
--struct rio_tx_desc {
--      u32 res1;
--      u32 saddr;
--      u32 dport;
--      u32 dattr;
--      u32 res2;
--      u32 res3;
--      u32 dwcnt;
--      u32 res4;
--};
--
--static u32 regs_win;
--static struct rio_atmu_regs *atmu_regs;
--static struct rio_atmu_regs *maint_atmu_regs;
--static struct rio_atmu_regs *dbell_atmu_regs;
--static u32 dbell_win;
--static u32 maint_win;
--static struct rio_msg_regs *msg_regs;
--
--static struct rio_dbell_ring {
--      void *virt;
--      dma_addr_t phys;
--} dbell_ring;
--
--static struct rio_msg_tx_ring {
--      void *virt;
--      dma_addr_t phys;
--      void *virt_buffer[RIO_MAX_TX_RING_SIZE];
--      dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
--      int tx_slot;
--      int size;
--      void *dev_id;
--} msg_tx_ring;
--
--static struct rio_msg_rx_ring {
--      void *virt;
--      dma_addr_t phys;
--      void *virt_buffer[RIO_MAX_RX_RING_SIZE];
--      int rx_slot;
--      int size;
--      void *dev_id;
--} msg_rx_ring;
--
--/**
-- * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
-- * @index: ID of RapidIO interface
-- * @destid: Destination ID of target device
-- * @data: 16-bit info field of RapidIO doorbell message
-- *
-- * Sends a MPC85xx doorbell message. Returns %0 on success or
-- * %-EINVAL on failure.
-- */
--static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
--{
--      pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
--               index, destid, data);
--      out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
--      out_be16((void *)(dbell_win), data);
--
--      return 0;
--}
--
--/**
-- * mpc85xx_local_config_read - Generate a MPC85xx local config space read
-- * @index: ID of RapdiIO interface
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @data: Value to be read into
-- *
-- * Generates a MPC85xx local configuration space read. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
--{
--      pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
--               offset);
--      *data = in_be32((void *)(regs_win + offset));
--
--      return 0;
--}
--
--/**
-- * mpc85xx_local_config_write - Generate a MPC85xx local config space write
-- * @index: ID of RapdiIO interface
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @data: Value to be written
-- *
-- * Generates a MPC85xx local configuration space write. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
--{
--      pr_debug
--          ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
--           index, offset, data);
--      out_be32((void *)(regs_win + offset), data);
--
--      return 0;
--}
--
--/**
-- * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
-- * @index: ID of RapdiIO interface
-- * @destid: Destination ID of transaction
-- * @hopcount: Number of hops to target device
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @val: Location to be read into
-- *
-- * Generates a MPC85xx read maintenance transaction. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int
--mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
--                      u32 * val)
--{
--      u8 *data;
--
--      pr_debug
--          ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
--           index, destid, hopcount, offset, len);
--      out_be32((void *)&maint_atmu_regs->rowtar,
--               (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
--
--      data = (u8 *) maint_win + offset;
--      switch (len) {
--      case 1:
--              *val = in_8((u8 *) data);
--              break;
--      case 2:
--              *val = in_be16((u16 *) data);
--              break;
--      default:
--              *val = in_be32((u32 *) data);
--              break;
--      }
--
--      return 0;
--}
--
--/**
-- * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
-- * @index: ID of RapdiIO interface
-- * @destid: Destination ID of transaction
-- * @hopcount: Number of hops to target device
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @val: Value to be written
-- *
-- * Generates an MPC85xx write maintenance transaction. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int
--mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
--                       int len, u32 val)
--{
--      u8 *data;
--      pr_debug
--          ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
--           index, destid, hopcount, offset, len, val);
--      out_be32((void *)&maint_atmu_regs->rowtar,
--               (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
--
--      data = (u8 *) maint_win + offset;
--      switch (len) {
--      case 1:
--              out_8((u8 *) data, val);
--              break;
--      case 2:
--              out_be16((u16 *) data, val);
--              break;
--      default:
--              out_be32((u32 *) data, val);
--              break;
--      }
--
--      return 0;
--}
--
--/**
-- * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
-- * @mport: Master port with outbound message queue
-- * @rdev: Target of outbound message
-- * @mbox: Outbound mailbox
-- * @buffer: Message to add to outbound queue
-- * @len: Length of message
-- *
-- * Adds the @buffer message to the MPC85xx outbound message queue. Returns
-- * %0 on success or %-EINVAL on failure.
-- */
--int
--rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
--                      void *buffer, size_t len)
--{
--      u32 omr;
--      struct rio_tx_desc *desc =
--          (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
--      int ret = 0;
--
--      pr_debug
--          ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
--           rdev->destid, mbox, (int)buffer, len);
--
--      if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
--              ret = -EINVAL;
--              goto out;
--      }
--
--      /* Copy and clear rest of buffer */
--      memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
--      if (len < (RIO_MAX_MSG_SIZE - 4))
--              memset((void *)((u32) msg_tx_ring.
--                              virt_buffer[msg_tx_ring.tx_slot] + len), 0,
--                     RIO_MAX_MSG_SIZE - len);
--
--      /* Set mbox field for message */
--      desc->dport = mbox & 0x3;
--
--      /* Enable EOMI interrupt, set priority, and set destid */
--      desc->dattr = 0x28000000 | (rdev->destid << 2);
--
--      /* Set transfer size aligned to next power of 2 (in double words) */
--      desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
--
--      /* Set snooping and source buffer address */
--      desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
--
--      /* Increment enqueue pointer */
--      omr = in_be32((void *)&msg_regs->omr);
--      out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
--
--      /* Go to next descriptor */
--      if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
--              msg_tx_ring.tx_slot = 0;
--
--      out:
--      return ret;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
--
--/**
-- * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles outbound message interrupts. Executes a register outbound
-- * mailbox event handler and acks the interrupt occurrence.
-- */
--static irqreturn_t
--mpc85xx_rio_tx_handler(int irq, void *dev_instance)
--{
--      int osr;
--      struct rio_mport *port = (struct rio_mport *)dev_instance;
--
--      osr = in_be32((void *)&msg_regs->osr);
--
--      if (osr & RIO_MSG_OSR_TE) {
--              pr_info("RIO: outbound message transmission error\n");
--              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
--              goto out;
--      }
--
--      if (osr & RIO_MSG_OSR_QOI) {
--              pr_info("RIO: outbound message queue overflow\n");
--              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
--              goto out;
--      }
--
--      if (osr & RIO_MSG_OSR_EOMI) {
--              u32 dqp = in_be32((void *)&msg_regs->odqdpar);
--              int slot = (dqp - msg_tx_ring.phys) >> 5;
--              port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
--
--              /* Ack the end-of-message interrupt */
--              out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
--      }
--
--      out:
--      return IRQ_HANDLED;
--}
--
--/**
-- * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
-- * @mport: Master port implementing the outbound message unit
-- * @dev_id: Device specific pointer to pass on event
-- * @mbox: Mailbox to open
-- * @entries: Number of entries in the outbound mailbox ring
-- *
-- * Initializes buffer ring, request the outbound message interrupt,
-- * and enables the outbound message unit. Returns %0 on success and
-- * %-EINVAL or %-ENOMEM on failure.
-- */
--int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
--{
--      int i, j, rc = 0;
--
--      if ((entries < RIO_MIN_TX_RING_SIZE) ||
--          (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
--              rc = -EINVAL;
--              goto out;
--      }
--
--      /* Initialize shadow copy ring */
--      msg_tx_ring.dev_id = dev_id;
--      msg_tx_ring.size = entries;
--
--      for (i = 0; i < msg_tx_ring.size; i++) {
--              if (!
--                  (msg_tx_ring.virt_buffer[i] =
--                   dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
--                                      &msg_tx_ring.phys_buffer[i],
--                                      GFP_KERNEL))) {
--                      rc = -ENOMEM;
--                      for (j = 0; j < msg_tx_ring.size; j++)
--                              if (msg_tx_ring.virt_buffer[j])
--                                      dma_free_coherent(NULL,
--                                                        RIO_MSG_BUFFER_SIZE,
--                                                        msg_tx_ring.
--                                                        virt_buffer[j],
--                                                        msg_tx_ring.
--                                                        phys_buffer[j]);
--                      goto out;
--              }
--      }
--
--      /* Initialize outbound message descriptor ring */
--      if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
--                                                  msg_tx_ring.size *
--                                                  RIO_MSG_DESC_SIZE,
--                                                  &msg_tx_ring.phys,
--                                                  GFP_KERNEL))) {
--              rc = -ENOMEM;
--              goto out_dma;
--      }
--      memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
--      msg_tx_ring.tx_slot = 0;
--
--      /* Point dequeue/enqueue pointers at first entry in ring */
--      out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
--      out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
--
--      /* Configure for snooping */
--      out_be32((void *)&msg_regs->osar, 0x00000004);
--
--      /* Clear interrupt status */
--      out_be32((void *)&msg_regs->osr, 0x000000b3);
--
--      /* Hook up outbound message handler */
--      if ((rc =
--           request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
--                       "msg_tx", (void *)mport)) < 0)
--              goto out_irq;
--
--      /*
--       * Configure outbound message unit
--       *      Snooping
--       *      Interrupts (all enabled, except QEIE)
--       *      Chaining mode
--       *      Disable
--       */
--      out_be32((void *)&msg_regs->omr, 0x00100220);
--
--      /* Set number of entries */
--      out_be32((void *)&msg_regs->omr,
--               in_be32((void *)&msg_regs->omr) |
--               ((get_bitmask_order(entries) - 2) << 12));
--
--      /* Now enable the unit */
--      out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
--
--      out:
--      return rc;
--
--      out_irq:
--      dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
--                        msg_tx_ring.virt, msg_tx_ring.phys);
--
--      out_dma:
--      for (i = 0; i < msg_tx_ring.size; i++)
--              dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
--                                msg_tx_ring.virt_buffer[i],
--                                msg_tx_ring.phys_buffer[i]);
--
--      return rc;
--}
--
--/**
-- * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
-- * @mport: Master port implementing the outbound message unit
-- * @mbox: Mailbox to close
-- *
-- * Disables the outbound message unit, free all buffers, and
-- * frees the outbound message interrupt.
-- */
--void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
--{
--      /* Disable inbound message unit */
--      out_be32((void *)&msg_regs->omr, 0);
--
--      /* Free ring */
--      dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
--                        msg_tx_ring.virt, msg_tx_ring.phys);
--
--      /* Free interrupt */
--      free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
--}
--
--/**
-- * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles inbound message interrupts. Executes a registered inbound
-- * mailbox event handler and acks the interrupt occurrence.
-- */
--static irqreturn_t
--mpc85xx_rio_rx_handler(int irq, void *dev_instance)
--{
--      int isr;
--      struct rio_mport *port = (struct rio_mport *)dev_instance;
--
--      isr = in_be32((void *)&msg_regs->isr);
--
--      if (isr & RIO_MSG_ISR_TE) {
--              pr_info("RIO: inbound message reception error\n");
--              out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
--              goto out;
--      }
--
--      /* XXX Need to check/dispatch until queue empty */
--      if (isr & RIO_MSG_ISR_DIQI) {
--              /*
--               * We implement *only* mailbox 0, but can receive messages
--               * for any mailbox/letter to that mailbox destination. So,
--               * make the callback with an unknown/invalid mailbox number
--               * argument.
--               */
--              port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
--
--              /* Ack the queueing interrupt */
--              out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
--      }
--
--      out:
--      return IRQ_HANDLED;
--}
--
--/**
-- * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
-- * @mport: Master port implementing the inbound message unit
-- * @dev_id: Device specific pointer to pass on event
-- * @mbox: Mailbox to open
-- * @entries: Number of entries in the inbound mailbox ring
-- *
-- * Initializes buffer ring, request the inbound message interrupt,
-- * and enables the inbound message unit. Returns %0 on success
-- * and %-EINVAL or %-ENOMEM on failure.
-- */
--int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
--{
--      int i, rc = 0;
--
--      if ((entries < RIO_MIN_RX_RING_SIZE) ||
--          (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
--              rc = -EINVAL;
--              goto out;
--      }
--
--      /* Initialize client buffer ring */
--      msg_rx_ring.dev_id = dev_id;
--      msg_rx_ring.size = entries;
--      msg_rx_ring.rx_slot = 0;
--      for (i = 0; i < msg_rx_ring.size; i++)
--              msg_rx_ring.virt_buffer[i] = NULL;
--
--      /* Initialize inbound message ring */
--      if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
--                                                  msg_rx_ring.size *
--                                                  RIO_MAX_MSG_SIZE,
--                                                  &msg_rx_ring.phys,
--                                                  GFP_KERNEL))) {
--              rc = -ENOMEM;
--              goto out;
--      }
--
--      /* Point dequeue/enqueue pointers at first entry in ring */
--      out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
--      out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
--
--      /* Clear interrupt status */
--      out_be32((void *)&msg_regs->isr, 0x00000091);
--
--      /* Hook up inbound message handler */
--      if ((rc =
--           request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
--                       "msg_rx", (void *)mport)) < 0) {
--              dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
--                                msg_tx_ring.virt_buffer[i],
--                                msg_tx_ring.phys_buffer[i]);
--              goto out;
--      }
--
--      /*
--       * Configure inbound message unit:
--       *      Snooping
--       *      4KB max message size
--       *      Unmask all interrupt sources
--       *      Disable
--       */
--      out_be32((void *)&msg_regs->imr, 0x001b0060);
--
--      /* Set number of queue entries */
--      out_be32((void *)&msg_regs->imr,
--               in_be32((void *)&msg_regs->imr) |
--               ((get_bitmask_order(entries) - 2) << 12));
--
--      /* Now enable the unit */
--      out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
--
--      out:
--      return rc;
--}
--
--/**
-- * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Mailbox to close
-- *
-- * Disables the inbound message unit, free all buffers, and
-- * frees the inbound message interrupt.
-- */
--void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
--{
--      /* Disable inbound message unit */
--      out_be32((void *)&msg_regs->imr, 0);
--
--      /* Free ring */
--      dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
--                        msg_rx_ring.virt, msg_rx_ring.phys);
--
--      /* Free interrupt */
--      free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
--}
--
--/**
-- * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Inbound mailbox number
-- * @buf: Buffer to add to inbound queue
-- *
-- * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
-- * %0 on success or %-EINVAL on failure.
-- */
--int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
--{
--      int rc = 0;
--
--      pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
--               msg_rx_ring.rx_slot);
--
--      if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
--              printk(KERN_ERR
--                     "RIO: error adding inbound buffer %d, buffer exists\n",
--                     msg_rx_ring.rx_slot);
--              rc = -EINVAL;
--              goto out;
--      }
--
--      msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
--      if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
--              msg_rx_ring.rx_slot = 0;
--
--      out:
--      return rc;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
--
--/**
-- * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Inbound mailbox number
-- *
-- * Gets the next available inbound message from the inbound message queue.
-- * A pointer to the message is returned on success or NULL on failure.
-- */
--void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
--{
--      u32 imr;
--      u32 phys_buf, virt_buf;
--      void *buf = NULL;
--      int buf_idx;
--
--      phys_buf = in_be32((void *)&msg_regs->ifqdpar);
--
--      /* If no more messages, then bail out */
--      if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
--              goto out2;
--
--      virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
--      buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
--      buf = msg_rx_ring.virt_buffer[buf_idx];
--
--      if (!buf) {
--              printk(KERN_ERR
--                     "RIO: inbound message copy failed, no buffers\n");
--              goto out1;
--      }
--
--      /* Copy max message size, caller is expected to allocate that big */
--      memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
--
--      /* Clear the available buffer */
--      msg_rx_ring.virt_buffer[buf_idx] = NULL;
--
--      out1:
--      imr = in_be32((void *)&msg_regs->imr);
--      out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
--
--      out2:
--      return buf;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
--
--/**
-- * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles doorbell interrupts. Parses a list of registered
-- * doorbell event handlers and executes a matching event handler.
-- */
--static irqreturn_t
--mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
--{
--      int dsr;
--      struct rio_mport *port = (struct rio_mport *)dev_instance;
--
--      dsr = in_be32((void *)&msg_regs->dsr);
--
--      if (dsr & DOORBELL_DSR_TE) {
--              pr_info("RIO: doorbell reception error\n");
--              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
--              goto out;
--      }
--
--      if (dsr & DOORBELL_DSR_QFI) {
--              pr_info("RIO: doorbell queue full\n");
--              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
--              goto out;
--      }
--
--      /* XXX Need to check/dispatch until queue empty */
--      if (dsr & DOORBELL_DSR_DIQI) {
--              u32 dmsg =
--                  (u32) dbell_ring.virt +
--                  (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
--              u32 dmr;
--              struct rio_dbell *dbell;
--              int found = 0;
--
--              pr_debug
--                  ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
--                   DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
--
--              list_for_each_entry(dbell, &port->dbells, node) {
--                      if ((dbell->res->start <= DBELL_INF(dmsg)) &&
--                          (dbell->res->end >= DBELL_INF(dmsg))) {
--                              found = 1;
--                              break;
--                      }
--              }
--              if (found) {
--                      dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
--                                  DBELL_INF(dmsg));
--              } else {
--                      pr_debug
--                          ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
--                           DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
--              }
--              dmr = in_be32((void *)&msg_regs->dmr);
--              out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
--              out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
--      }
--
--      out:
--      return IRQ_HANDLED;
--}
--
--/**
-- * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
-- * @mport: Master port implementing the inbound doorbell unit
-- *
-- * Initializes doorbell unit hardware and inbound DMA buffer
-- * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
-- * or %-ENOMEM on failure.
-- */
--static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
--{
--      int rc = 0;
--
--      /* Map outbound doorbell window immediately after maintenance window */
--      if (!(dbell_win =
--            (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
--                          RIO_DBELL_WIN_SIZE))) {
--              printk(KERN_ERR
--                     "RIO: unable to map outbound doorbell window\n");
--              rc = -ENOMEM;
--              goto out;
--      }
--
--      /* Initialize inbound doorbells */
--      if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
--                                                 512 * DOORBELL_MESSAGE_SIZE,
--                                                 &dbell_ring.phys,
--                                                 GFP_KERNEL))) {
--              printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
--              rc = -ENOMEM;
--              iounmap((void *)dbell_win);
--              goto out;
--      }
--
--      /* Point dequeue/enqueue pointers at first entry in ring */
--      out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
--      out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
--
--      /* Clear interrupt status */
--      out_be32((void *)&msg_regs->dsr, 0x00000091);
--
--      /* Hook up doorbell handler */
--      if ((rc =
--           request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
--                       "dbell_rx", (void *)mport) < 0)) {
--              iounmap((void *)dbell_win);
--              dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
--                                dbell_ring.virt, dbell_ring.phys);
--              printk(KERN_ERR
--                     "MPC85xx RIO: unable to request inbound doorbell irq");
--              goto out;
--      }
--
--      /* Configure doorbells for snooping, 512 entries, and enable */
--      out_be32((void *)&msg_regs->dmr, 0x00108161);
--
--      out:
--      return rc;
--}
--
--static char *cmdline = NULL;
--
--static int mpc85xx_rio_get_hdid(int index)
--{
--      /* XXX Need to parse multiple entries in some format */
--      if (!cmdline)
--              return -1;
--
--      return simple_strtol(cmdline, NULL, 0);
--}
--
--static int mpc85xx_rio_get_cmdline(char *s)
--{
--      if (!s)
--              return 0;
--
--      cmdline = s;
--      return 1;
--}
--
--__setup("riohdid=", mpc85xx_rio_get_cmdline);
--
--/**
-- * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
-- * @law_start: Starting physical address of RapidIO LAW
-- * @law_size: Size of RapidIO LAW
-- *
-- * Initializes MPC85xx RapidIO hardware interface, configures
-- * master port with system-specific info, and registers the
-- * master port with the RapidIO subsystem.
-- */
--void mpc85xx_rio_setup(int law_start, int law_size)
--{
--      struct rio_ops *ops;
--      struct rio_mport *port;
--
--      ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
--      ops->lcread = mpc85xx_local_config_read;
--      ops->lcwrite = mpc85xx_local_config_write;
--      ops->cread = mpc85xx_rio_config_read;
--      ops->cwrite = mpc85xx_rio_config_write;
--      ops->dsend = mpc85xx_rio_doorbell_send;
--
--      port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
--      port->id = 0;
--      port->index = 0;
--      INIT_LIST_HEAD(&port->dbells);
--      port->iores.start = law_start;
--      port->iores.end = law_start + law_size;
--      port->iores.flags = IORESOURCE_MEM;
--
--      rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
--      rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
--      rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
--      strcpy(port->name, "RIO0 mport");
--
--      port->ops = ops;
--      port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
--
--      rio_register_mport(port);
--
--      regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
--      atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
--      maint_atmu_regs = atmu_regs + 1;
--      dbell_atmu_regs = atmu_regs + 2;
--      msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
--
--      /* Configure maintenance transaction window */
--      out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
--      out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
--
--      maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
--
--      /* Configure outbound doorbell window */
--      out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
--      out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
--      mpc85xx_rio_doorbell_init(port);
--}
---- a/arch/ppc/syslib/ppc85xx_rio.h
-+++ /dev/null
-@@ -1,20 +0,0 @@
--/*
-- * MPC85xx RapidIO definitions
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute  it and/or modify it
-- * under  the terms of  the GNU General  Public License as published by the
-- * Free Software Foundation;  either version 2 of the  License, or (at your
-- * option) any later version.
-- */
--
--#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
--#define __PPC_SYSLIB_PPC85XX_RIO_H
--
--#include <linux/init.h>
--
--extern void mpc85xx_rio_setup(int law_start, int law_size);
--
--#endif                                /* __PPC_SYSLIB_PPC85XX_RIO_H */
---- a/arch/ppc/syslib/ppc8xx_pic.c
-+++ b/arch/ppc/syslib/ppc8xx_pic.c
-@@ -16,7 +16,7 @@ extern int cpm_get_irq(void);
-  * the only interrupt controller.  Some boards, like the MBX and
-  * Sandpoint have the 8259 as a secondary controller.  Depending
-  * upon the processor type, the internal controller can have as
-- * few as 16 interrups or as many as 64.  We could use  the
-+ * few as 16 interrupts or as many as 64.  We could use  the
-  * "clear_bit()" and "set_bit()" functions like other platforms,
-  * but they are overkill for us.
-  */
---- a/arch/ppc/syslib/ppc_sys.c
-+++ b/arch/ppc/syslib/ppc_sys.c
-@@ -185,7 +185,7 @@ void platform_notify_map(const struct pl
-  */
- /*
--   Here we'll replace .name pointers with fixed-lenght strings
-+   Here we'll replace .name pointers with fixed-length strings
-    Hereby, this should be called *before* any func stuff triggeded.
-  */
- void ppc_sys_device_initfunc(void)
---- a/arch/ppc/xmon/start.c
-+++ b/arch/ppc/xmon/start.c
-@@ -10,7 +10,6 @@
- #include <linux/sysrq.h>
- #include <linux/bitops.h>
- #include <asm/xmon.h>
--#include <asm/machdep.h>
- #include <asm/errno.h>
- #include <asm/processor.h>
- #include <asm/delay.h>
---- a/drivers/ata/Kconfig
-+++ b/drivers/ata/Kconfig
-@@ -607,13 +607,23 @@ config PATA_WINBOND_VLB
- config PATA_PLATFORM
-       tristate "Generic platform device PATA support"
--      depends on EMBEDDED || ARCH_RPC
-+      depends on EMBEDDED || ARCH_RPC || PPC
-       help
-         This option enables support for generic directly connected ATA
-         devices commonly found on embedded systems.
-         If unsure, say N.
-+config PATA_OF_PLATFORM
-+      tristate "OpenFirmware platform device PATA support"
-+      depends on PATA_PLATFORM && PPC_OF
-+      help
-+        This option enables support for generic directly connected ATA
-+        devices commonly found on embedded systems with OpenFirmware
-+        bindings.
-+
-+        If unsure, say N.
-+
- config PATA_ICSIDE
-       tristate "Acorn ICS PATA support"
-       depends on ARM && ARCH_ACORN
---- a/drivers/ata/Makefile
-+++ b/drivers/ata/Makefile
-@@ -67,6 +67,7 @@ obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp
- obj-$(CONFIG_PATA_SCC)                += pata_scc.o
- obj-$(CONFIG_PATA_BF54X)      += pata_bf54x.o
- obj-$(CONFIG_PATA_PLATFORM)   += pata_platform.o
-+obj-$(CONFIG_PATA_OF_PLATFORM)        += pata_of_platform.o
- obj-$(CONFIG_PATA_ICSIDE)     += pata_icside.o
- # Should be last but two libata driver
- obj-$(CONFIG_PATA_ACPI)               += pata_acpi.o
---- /dev/null
-+++ b/drivers/ata/pata_of_platform.c
-@@ -0,0 +1,114 @@
-+/*
-+ * OF-platform PATA driver
-+ *
-+ * Copyright (c) 2007  MontaVista Software, Inc.
-+ *                     Anton Vorontsov <avorontsov@ru.mvista.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/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/pata_platform.h>
-+
-+static int __devinit pata_of_platform_probe(struct of_device *ofdev,
-+                                          const struct of_device_id *match)
-+{
-+      int ret;
-+      struct device_node *dn = ofdev->node;
-+      struct resource io_res;
-+      struct resource ctl_res;
-+      struct resource irq_res;
-+      unsigned int reg_shift = 0;
-+      int pio_mode = 0;
-+      int pio_mask;
-+      const u32 *prop;
-+
-+      ret = of_address_to_resource(dn, 0, &io_res);
-+      if (ret) {
-+              dev_err(&ofdev->dev, "can't get IO address from "
-+                      "device tree\n");
-+              return -EINVAL;
-+      }
-+
-+      if (of_device_is_compatible(dn, "electra-ide")) {
-+              /* Altstatus is really at offset 0x3f6 from the primary window
-+               * on electra-ide. Adjust ctl_res and io_res accordingly.
-+               */
-+              ctl_res = io_res;
-+              ctl_res.start = ctl_res.start+0x3f6;
-+              io_res.end = ctl_res.start-1;
-+      } else {
-+              ret = of_address_to_resource(dn, 1, &ctl_res);
-+              if (ret) {
-+                      dev_err(&ofdev->dev, "can't get CTL address from "
-+                              "device tree\n");
-+                      return -EINVAL;
-+              }
-+      }
-+
-+      ret = of_irq_to_resource(dn, 0, &irq_res);
-+      if (ret == NO_IRQ)
-+              irq_res.start = irq_res.end = -1;
-+      else
-+              irq_res.flags = 0;
-+
-+      prop = of_get_property(dn, "reg-shift", NULL);
-+      if (prop)
-+              reg_shift = *prop;
-+
-+      prop = of_get_property(dn, "pio-mode", NULL);
-+      if (prop) {
-+              pio_mode = *prop;
-+              if (pio_mode > 6) {
-+                      dev_err(&ofdev->dev, "invalid pio-mode\n");
-+                      return -EINVAL;
-+              }
-+      } else {
-+              dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n");
-+      }
-+
-+      pio_mask = 1 << pio_mode;
-+      pio_mask |= (1 << pio_mode) - 1;
-+
-+      return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res,
-+                                   reg_shift, pio_mask);
-+}
-+
-+static int __devexit pata_of_platform_remove(struct of_device *ofdev)
-+{
-+      return __pata_platform_remove(&ofdev->dev);
-+}
-+
-+static struct of_device_id pata_of_platform_match[] = {
-+      { .compatible = "ata-generic", },
-+      { .compatible = "electra-ide", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, pata_of_platform_match);
-+
-+static struct of_platform_driver pata_of_platform_driver = {
-+      .name           = "pata_of_platform",
-+      .match_table    = pata_of_platform_match,
-+      .probe          = pata_of_platform_probe,
-+      .remove         = __devexit_p(pata_of_platform_remove),
-+};
-+
-+static int __init pata_of_platform_init(void)
-+{
-+      return of_register_platform_driver(&pata_of_platform_driver);
-+}
-+module_init(pata_of_platform_init);
-+
-+static void __exit pata_of_platform_exit(void)
-+{
-+      of_unregister_platform_driver(&pata_of_platform_driver);
-+}
-+module_exit(pata_of_platform_exit);
-+
-+MODULE_DESCRIPTION("OF-platform PATA driver");
-+MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>");
-+MODULE_LICENSE("GPL");
---- a/drivers/ata/pata_platform.c
-+++ b/drivers/ata/pata_platform.c
-@@ -93,14 +93,9 @@ static struct ata_port_operations pata_p
- };
- static void pata_platform_setup_port(struct ata_ioports *ioaddr,
--                                   struct pata_platform_info *info)
-+                                   unsigned int shift)
- {
--      unsigned int shift = 0;
--
-       /* Fixup the port shift for platforms that need it */
--      if (info && info->ioport_shift)
--              shift = info->ioport_shift;
--
-       ioaddr->data_addr       = ioaddr->cmd_addr + (ATA_REG_DATA    << shift);
-       ioaddr->error_addr      = ioaddr->cmd_addr + (ATA_REG_ERR     << shift);
-       ioaddr->feature_addr    = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
-@@ -114,8 +109,13 @@ static void pata_platform_setup_port(str
- }
- /**
-- *    pata_platform_probe             -       attach a platform interface
-- *    @pdev: platform device
-+ *    __pata_platform_probe           -       attach a platform interface
-+ *    @dev: device
-+ *    @io_res: Resource representing I/O base
-+ *    @ctl_res: Resource representing CTL base
-+ *    @irq_res: Resource representing IRQ and its flags
-+ *    @ioport_shift: I/O port shift
-+ *    @__pio_mask: PIO mask
-  *
-  *    Register a platform bus IDE interface. Such interfaces are PIO and we
-  *    assume do not support IRQ sharing.
-@@ -135,42 +135,18 @@ static void pata_platform_setup_port(str
-  *
-  *    If no IRQ resource is present, PIO polling mode is used instead.
-  */
--static int __devinit pata_platform_probe(struct platform_device *pdev)
-+int __devinit __pata_platform_probe(struct device *dev,
-+                                  struct resource *io_res,
-+                                  struct resource *ctl_res,
-+                                  struct resource *irq_res,
-+                                  unsigned int ioport_shift,
-+                                  int __pio_mask)
- {
--      struct resource *io_res, *ctl_res;
-       struct ata_host *host;
-       struct ata_port *ap;
--      struct pata_platform_info *pp_info;
-       unsigned int mmio;
--      int irq;
--
--      /*
--       * Simple resource validation ..
--       */
--      if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
--              dev_err(&pdev->dev, "invalid number of resources\n");
--              return -EINVAL;
--      }
--
--      /*
--       * Get the I/O base first
--       */
--      io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
--      if (io_res == NULL) {
--              io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
--              if (unlikely(io_res == NULL))
--                      return -EINVAL;
--      }
--
--      /*
--       * Then the CTL base
--       */
--      ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
--      if (ctl_res == NULL) {
--              ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
--              if (unlikely(ctl_res == NULL))
--                      return -EINVAL;
--      }
-+      int irq = 0;
-+      int irq_flags = 0;
-       /*
-        * Check for MMIO
-@@ -181,20 +157,21 @@ static int __devinit pata_platform_probe
-       /*
-        * And the IRQ
-        */
--      irq = platform_get_irq(pdev, 0);
--      if (irq < 0)
--              irq = 0;        /* no irq */
-+      if (irq_res && irq_res->start > 0) {
-+              irq = irq_res->start;
-+              irq_flags = irq_res->flags;
-+      }
-       /*
-        * Now that that's out of the way, wire up the port..
-        */
--      host = ata_host_alloc(&pdev->dev, 1);
-+      host = ata_host_alloc(dev, 1);
-       if (!host)
-               return -ENOMEM;
-       ap = host->ports[0];
-       ap->ops = &pata_platform_port_ops;
--      ap->pio_mask = pio_mask;
-+      ap->pio_mask = __pio_mask;
-       ap->flags |= ATA_FLAG_SLAVE_POSS;
-       /*
-@@ -209,25 +186,24 @@ static int __devinit pata_platform_probe
-        * Handle the MMIO case
-        */
-       if (mmio) {
--              ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, io_res->start,
-+              ap->ioaddr.cmd_addr = devm_ioremap(dev, io_res->start,
-                               io_res->end - io_res->start + 1);
--              ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
-+              ap->ioaddr.ctl_addr = devm_ioremap(dev, ctl_res->start,
-                               ctl_res->end - ctl_res->start + 1);
-       } else {
--              ap->ioaddr.cmd_addr = devm_ioport_map(&pdev->dev, io_res->start,
-+              ap->ioaddr.cmd_addr = devm_ioport_map(dev, io_res->start,
-                               io_res->end - io_res->start + 1);
--              ap->ioaddr.ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start,
-+              ap->ioaddr.ctl_addr = devm_ioport_map(dev, ctl_res->start,
-                               ctl_res->end - ctl_res->start + 1);
-       }
-       if (!ap->ioaddr.cmd_addr || !ap->ioaddr.ctl_addr) {
--              dev_err(&pdev->dev, "failed to map IO/CTL base\n");
-+              dev_err(dev, "failed to map IO/CTL base\n");
-               return -ENOMEM;
-       }
-       ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
--      pp_info = pdev->dev.platform_data;
--      pata_platform_setup_port(&ap->ioaddr, pp_info);
-+      pata_platform_setup_port(&ap->ioaddr, ioport_shift);
-       ata_port_desc(ap, "%s cmd 0x%llx ctl 0x%llx", mmio ? "mmio" : "ioport",
-                     (unsigned long long)io_res->start,
-@@ -235,26 +211,78 @@ static int __devinit pata_platform_probe
-       /* activate */
-       return ata_host_activate(host, irq, irq ? ata_interrupt : NULL,
--                               pp_info ? pp_info->irq_flags : 0,
--                               &pata_platform_sht);
-+                               irq_flags, &pata_platform_sht);
- }
-+EXPORT_SYMBOL_GPL(__pata_platform_probe);
- /**
-- *    pata_platform_remove    -       unplug a platform interface
-- *    @pdev: platform device
-+ *    __pata_platform_remove          -       unplug a platform interface
-+ *    @dev: device
-  *
-  *    A platform bus ATA device has been unplugged. Perform the needed
-  *    cleanup. Also called on module unload for any active devices.
-  */
--static int __devexit pata_platform_remove(struct platform_device *pdev)
-+int __devexit __pata_platform_remove(struct device *dev)
- {
--      struct device *dev = &pdev->dev;
-       struct ata_host *host = dev_get_drvdata(dev);
-       ata_host_detach(host);
-       return 0;
- }
-+EXPORT_SYMBOL_GPL(__pata_platform_remove);
-+
-+static int __devinit pata_platform_probe(struct platform_device *pdev)
-+{
-+      struct resource *io_res;
-+      struct resource *ctl_res;
-+      struct resource *irq_res;
-+      struct pata_platform_info *pp_info = pdev->dev.platform_data;
-+
-+      /*
-+       * Simple resource validation ..
-+       */
-+      if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
-+              dev_err(&pdev->dev, "invalid number of resources\n");
-+              return -EINVAL;
-+      }
-+
-+      /*
-+       * Get the I/O base first
-+       */
-+      io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-+      if (io_res == NULL) {
-+              io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+              if (unlikely(io_res == NULL))
-+                      return -EINVAL;
-+      }
-+
-+      /*
-+       * Then the CTL base
-+       */
-+      ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
-+      if (ctl_res == NULL) {
-+              ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-+              if (unlikely(ctl_res == NULL))
-+                      return -EINVAL;
-+      }
-+
-+      /*
-+       * And the IRQ
-+       */
-+      irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-+      if (irq_res)
-+              irq_res->flags = pp_info ? pp_info->irq_flags : 0;
-+
-+      return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res,
-+                                   pp_info ? pp_info->ioport_shift : 0,
-+                                   pio_mask);
-+}
-+
-+static int __devexit pata_platform_remove(struct platform_device *pdev)
-+{
-+      return __pata_platform_remove(&pdev->dev);
-+}
- static struct platform_driver pata_platform_driver = {
-       .probe          = pata_platform_probe,
---- a/drivers/char/hw_random/Kconfig
-+++ b/drivers/char/hw_random/Kconfig
-@@ -98,7 +98,7 @@ config HW_RANDOM_PASEMI
-       default HW_RANDOM
-       ---help---
-         This driver provides kernel-side support for the Random Number
--        Generator hardware found on PA6T-1682M processor.
-+        Generator hardware found on PA Semi PWRficient SoCs.
-         To compile this driver as a module, choose M here: the
-         module will be called pasemi-rng.
---- a/drivers/char/hw_random/pasemi-rng.c
-+++ b/drivers/char/hw_random/pasemi-rng.c
-@@ -126,10 +126,9 @@ static int __devexit rng_remove(struct o
- }
- static struct of_device_id rng_match[] = {
--      {
--              .compatible      = "1682m-rng",
--      },
--      {},
-+      { .compatible      = "1682m-rng", },
-+      { .compatible      = "pasemi,pwrficient-rng", },
-+      { },
- };
- static struct of_platform_driver rng_driver = {
---- a/drivers/edac/pasemi_edac.c
-+++ b/drivers/edac/pasemi_edac.c
-@@ -225,7 +225,7 @@ static int __devinit pasemi_edac_probe(s
-               EDAC_FLAG_NONE;
-       mci->mod_name = MODULE_NAME;
-       mci->dev_name = pci_name(pdev);
--      mci->ctl_name = "pasemi,1682m-mc";
-+      mci->ctl_name = "pasemi,pwrficient-mc";
-       mci->edac_check = pasemi_edac_check;
-       mci->ctl_page_to_phys = NULL;
-       pci_read_config_dword(pdev, MCCFG_SCRUB, &scrub);
-@@ -297,4 +297,4 @@ module_exit(pasemi_edac_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>");
--MODULE_DESCRIPTION("MC support for PA Semi PA6T-1682M memory controller");
-+MODULE_DESCRIPTION("MC support for PA Semi PWRficient memory controller");
---- a/drivers/macintosh/adb.c
-+++ b/drivers/macintosh/adb.c
-@@ -35,6 +35,7 @@
- #include <linux/spinlock.h>
- #include <linux/completion.h>
- #include <linux/device.h>
-+#include <linux/kthread.h>
- #include <asm/uaccess.h>
- #include <asm/semaphore.h>
-@@ -82,21 +83,11 @@ struct adb_driver *adb_controller;
- BLOCKING_NOTIFIER_HEAD(adb_client_list);
- static int adb_got_sleep;
- static int adb_inited;
--static pid_t adb_probe_task_pid;
- static DECLARE_MUTEX(adb_probe_mutex);
--static struct completion adb_probe_task_comp;
- static int sleepy_trackpad;
- static int autopoll_devs;
- int __adb_probe_sync;
--#ifdef CONFIG_PM_SLEEP
--static void adb_notify_sleep(struct pmu_sleep_notifier *self, int when);
--static struct pmu_sleep_notifier adb_sleep_notifier = {
--      adb_notify_sleep,
--      SLEEP_LEVEL_ADB,
--};
--#endif
--
- static int adb_scan_bus(void);
- static int do_adb_reset_bus(void);
- static void adbdev_init(void);
-@@ -134,16 +125,6 @@ static void printADBreply(struct adb_req
- }
- #endif
--
--static __inline__ void adb_wait_ms(unsigned int ms)
--{
--      if (current->pid && adb_probe_task_pid &&
--        adb_probe_task_pid == current->pid)
--              msleep(ms);
--      else
--              mdelay(ms);
--}
--
- static int adb_scan_bus(void)
- {
-       int i, highFree=0, noMovement;
-@@ -248,13 +229,10 @@ static int adb_scan_bus(void)
- static int
- adb_probe_task(void *x)
- {
--      strcpy(current->comm, "kadbprobe");
--
-       printk(KERN_INFO "adb: starting probe task...\n");
-       do_adb_reset_bus();
-       printk(KERN_INFO "adb: finished probe task...\n");
--      adb_probe_task_pid = 0;
-       up(&adb_probe_mutex);
-       return 0;
-@@ -263,7 +241,7 @@ adb_probe_task(void *x)
- static void
- __adb_probe_task(struct work_struct *bullshit)
- {
--      adb_probe_task_pid = kernel_thread(adb_probe_task, NULL, SIGCHLD | CLONE_KERNEL);
-+      kthread_run(adb_probe_task, NULL, "kadbprobe");
- }
- static DECLARE_WORK(adb_reset_work, __adb_probe_task);
-@@ -281,6 +259,36 @@ adb_reset_bus(void)
-       return 0;
- }
-+#ifdef CONFIG_PM
-+/*
-+ * notify clients before sleep
-+ */
-+static int adb_suspend(struct platform_device *dev, pm_message_t state)
-+{
-+      adb_got_sleep = 1;
-+      /* We need to get a lock on the probe thread */
-+      down(&adb_probe_mutex);
-+      /* Stop autopoll */
-+      if (adb_controller->autopoll)
-+              adb_controller->autopoll(0);
-+      blocking_notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
-+
-+      return 0;
-+}
-+
-+/*
-+ * reset bus after sleep
-+ */
-+static int adb_resume(struct platform_device *dev)
-+{
-+      adb_got_sleep = 0;
-+      up(&adb_probe_mutex);
-+      adb_reset_bus();
-+
-+      return 0;
-+}
-+#endif /* CONFIG_PM */
-+
- int __init adb_init(void)
- {
-       struct adb_driver *driver;
-@@ -313,15 +321,12 @@ int __init adb_init(void)
-               printk(KERN_WARNING "Warning: no ADB interface detected\n");
-               adb_controller = NULL;
-       } else {
--#ifdef CONFIG_PM_SLEEP
--              pmu_register_sleep_notifier(&adb_sleep_notifier);
--#endif /* CONFIG_PM */
- #ifdef CONFIG_PPC
-               if (machine_is_compatible("AAPL,PowerBook1998") ||
-                       machine_is_compatible("PowerBook1,1"))
-                       sleepy_trackpad = 1;
- #endif /* CONFIG_PPC */
--              init_completion(&adb_probe_task_comp);
-+
-               adbdev_init();
-               adb_reset_bus();
-       }
-@@ -330,33 +335,6 @@ int __init adb_init(void)
- __initcall(adb_init);
--#ifdef CONFIG_PM
--/*
-- * notify clients before sleep and reset bus afterwards
-- */
--void
--adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
--{
--      switch (when) {
--      case PBOOK_SLEEP_REQUEST:
--              adb_got_sleep = 1;
--              /* We need to get a lock on the probe thread */
--              down(&adb_probe_mutex);
--              /* Stop autopoll */
--              if (adb_controller->autopoll)
--                      adb_controller->autopoll(0);
--              blocking_notifier_call_chain(&adb_client_list,
--                      ADB_MSG_POWERDOWN, NULL);
--              break;
--      case PBOOK_WAKE:
--              adb_got_sleep = 0;
--              up(&adb_probe_mutex);
--              adb_reset_bus();
--              break;
--      }
--}
--#endif /* CONFIG_PM */
--
- static int
- do_adb_reset_bus(void)
- {
-@@ -373,7 +351,7 @@ do_adb_reset_bus(void)
-       if (sleepy_trackpad) {
-               /* Let the trackpad settle down */
--              adb_wait_ms(500);
-+              msleep(500);
-       }
-       down(&adb_handler_sem);
-@@ -389,7 +367,7 @@ do_adb_reset_bus(void)
-       if (sleepy_trackpad) {
-               /* Let the trackpad settle down */
--              adb_wait_ms(1500);
-+              msleep(1500);
-       }
-       if (!ret) {
-@@ -413,41 +391,27 @@ adb_poll(void)
-       adb_controller->poll();
- }
--static void
--adb_probe_wakeup(struct adb_request *req)
-+static void adb_sync_req_done(struct adb_request *req)
- {
--      complete(&adb_probe_task_comp);
--}
-+      struct completion *comp = req->arg;
--/* Static request used during probe */
--static struct adb_request adb_sreq;
--static unsigned long adb_sreq_lock; // Use semaphore ! */ 
-+      complete(comp);
-+}
- int
- adb_request(struct adb_request *req, void (*done)(struct adb_request *),
-           int flags, int nbytes, ...)
- {
-       va_list list;
--      int i, use_sreq;
-+      int i;
-       int rc;
-+      struct completion comp;
-       if ((adb_controller == NULL) || (adb_controller->send_request == NULL))
-               return -ENXIO;
-       if (nbytes < 1)
-               return -EINVAL;
--      if (req == NULL && (flags & ADBREQ_NOSEND))
--              return -EINVAL;
--      
--      if (req == NULL) {
--              if (test_and_set_bit(0,&adb_sreq_lock)) {
--                      printk("adb.c: Warning: contention on static request !\n");
--                      return -EPERM;
--              }
--              req = &adb_sreq;
--              flags |= ADBREQ_SYNC;
--              use_sreq = 1;
--      } else
--              use_sreq = 0;
-+
-       req->nbytes = nbytes+1;
-       req->done = done;
-       req->reply_expected = flags & ADBREQ_REPLY;
-@@ -460,25 +424,18 @@ adb_request(struct adb_request *req, voi
-       if (flags & ADBREQ_NOSEND)
-               return 0;
--      /* Synchronous requests send from the probe thread cause it to
--       * block. Beware that the "done" callback will be overriden !
--       */
--      if ((flags & ADBREQ_SYNC) &&
--          (current->pid && adb_probe_task_pid &&
--          adb_probe_task_pid == current->pid)) {
--              req->done = adb_probe_wakeup;
--              rc = adb_controller->send_request(req, 0);
--              if (rc || req->complete)
--                      goto bail;
--              wait_for_completion(&adb_probe_task_comp);
--              rc = 0;
--              goto bail;
--      }
--
--      rc = adb_controller->send_request(req, flags & ADBREQ_SYNC);
--bail:
--      if (use_sreq)
--              clear_bit(0, &adb_sreq_lock);
-+      /* Synchronous requests block using an on-stack completion */
-+      if (flags & ADBREQ_SYNC) {
-+              WARN_ON(done);
-+              req->done = adb_sync_req_done;
-+              req->arg = &comp;
-+              init_completion(&comp);
-+      }
-+
-+      rc = adb_controller->send_request(req, 0);
-+
-+      if ((flags & ADBREQ_SYNC) && !rc && !req->complete)
-+              wait_for_completion(&comp);
-       return rc;
- }
-@@ -864,7 +821,29 @@ static const struct file_operations adb_
-       .release        = adb_release,
- };
--static void
-+static struct platform_driver adb_pfdrv = {
-+      .driver = {
-+              .name = "adb",
-+      },
-+#ifdef CONFIG_PM
-+      .suspend = adb_suspend,
-+      .resume = adb_resume,
-+#endif
-+};
-+
-+static struct platform_device adb_pfdev = {
-+      .name = "adb",
-+};
-+
-+static int __init
-+adb_dummy_probe(struct platform_device *dev)
-+{
-+      if (dev == &adb_pfdev)
-+              return 0;
-+      return -ENODEV;
-+}
-+
-+static void __init
- adbdev_init(void)
- {
-       if (register_chrdev(ADB_MAJOR, "adb", &adb_fops)) {
-@@ -876,4 +855,7 @@ adbdev_init(void)
-       if (IS_ERR(adb_dev_class))
-               return;
-       class_device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
-+
-+      platform_device_register(&adb_pfdev);
-+      platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
- }
---- a/drivers/macintosh/mediabay.c
-+++ b/drivers/macintosh/mediabay.c
-@@ -20,6 +20,7 @@
- #include <linux/stddef.h>
- #include <linux/init.h>
- #include <linux/ide.h>
-+#include <linux/kthread.h>
- #include <asm/prom.h>
- #include <asm/pgtable.h>
- #include <asm/io.h>
-@@ -35,7 +36,6 @@
- #define MB_DEBUG
--#define MB_IGNORE_SIGNALS
- #ifdef MB_DEBUG
- #define MBDBG(fmt, arg...)    printk(KERN_INFO fmt , ## arg)
-@@ -622,12 +622,7 @@ static int media_bay_task(void *x)
- {
-       int     i;
--      strcpy(current->comm, "media-bay");
--#ifdef MB_IGNORE_SIGNALS
--      sigfillset(&current->blocked);
--#endif
--
--      for (;;) {
-+      while (!kthread_should_stop()) {
-               for (i = 0; i < media_bay_count; ++i) {
-                       down(&media_bays[i].lock);
-                       if (!media_bays[i].sleeping)
-@@ -636,9 +631,8 @@ static int media_bay_task(void *x)
-               }
-               msleep_interruptible(MB_POLL_DELAY);
--              if (signal_pending(current))
--                      return 0;
-       }
-+      return 0;
- }
- static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_device_id *match)
-@@ -699,7 +693,7 @@ static int __devinit media_bay_attach(st
-       /* Startup kernel thread */
-       if (i == 0)
--              kernel_thread(media_bay_task, NULL, CLONE_KERNEL);
-+              kthread_run(media_bay_task, NULL, "media-bay");
-       return 0;
---- a/drivers/macintosh/therm_adt746x.c
-+++ b/drivers/macintosh/therm_adt746x.c
-@@ -553,6 +553,7 @@ thermostat_init(void)
-       struct device_node* np;
-       const u32 *prop;
-       int i = 0, offset = 0;
-+      int err;
-       
-       np = of_find_node_by_name(NULL, "fan");
-       if (!np)
-@@ -612,17 +613,20 @@ thermostat_init(void)
-               return -ENODEV;
-       }
-       
--      device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
--      device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
--      device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
--      device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
--      device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
--      device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
--      device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
--      device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
--      device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
-+      err = device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
-       if(therm_type == ADT7460)
--              device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
-+      if (err)
-+              printk(KERN_WARNING
-+                      "Failed to create tempertaure attribute file(s).\n");
- #ifndef CONFIG_I2C_POWERMAC
-       request_module("i2c-powermac");
---- a/drivers/macintosh/therm_pm72.c
-+++ b/drivers/macintosh/therm_pm72.c
-@@ -121,6 +121,7 @@
- #include <linux/reboot.h>
- #include <linux/kmod.h>
- #include <linux/i2c.h>
-+#include <linux/kthread.h>
- #include <asm/prom.h>
- #include <asm/machdep.h>
- #include <asm/io.h>
-@@ -161,7 +162,7 @@ static struct slots_pid_state              slots_sta
- static int                            state;
- static int                            cpu_count;
- static int                            cpu_pid_type;
--static pid_t                          ctrl_task;
-+static struct task_struct             *ctrl_task;
- static struct completion              ctrl_complete;
- static int                            critical_state;
- static int                            rackmac;
-@@ -1156,6 +1157,8 @@ static void do_monitor_cpu_rack(struct c
-  */
- static int init_cpu_state(struct cpu_pid_state *state, int index)
- {
-+      int err;
-+
-       state->index = index;
-       state->first = 1;
-       state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000;
-@@ -1181,18 +1184,21 @@ static int init_cpu_state(struct cpu_pid
-       DBG("CPU %d Using %d power history entries\n", index, state->count_power);
-       if (index == 0) {
--              device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
--              device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
--              device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
--              device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
--              device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
-+              err = device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
-       } else {
--              device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
--              device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
--              device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
--              device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
--              device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
--      }
-+              err = device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
-+              err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
-+      }
-+      if (err)
-+              printk(KERN_WARNING "Failed to create some of the atribute"
-+                      "files for CPU %d\n", index);
-       return 0;
-  fail:
-@@ -1328,6 +1334,7 @@ static int init_backside_state(struct ba
- {
-       struct device_node *u3;
-       int u3h = 1; /* conservative by default */
-+      int err;
-       /*
-        * There are different PID params for machines with U3 and machines
-@@ -1379,8 +1386,11 @@ static int init_backside_state(struct ba
-       if (state->monitor == NULL)
-               return -ENODEV;
--      device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
--      device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
-+      err = device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
-+      if (err)
-+              printk(KERN_WARNING "Failed to create attribute file(s)"
-+                      " for backside fan\n");
-       return 0;
- }
-@@ -1491,6 +1501,8 @@ static void do_monitor_drives(struct dri
-  */
- static int init_drives_state(struct drives_pid_state *state)
- {
-+      int err;
-+
-       state->ticks = 1;
-       state->first = 1;
-       state->rpm = 1000;
-@@ -1499,8 +1511,11 @@ static int init_drives_state(struct driv
-       if (state->monitor == NULL)
-               return -ENODEV;
--      device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
--      device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
-+      err = device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
-+      if (err)
-+              printk(KERN_WARNING "Failed to create attribute file(s)"
-+                      " for drives bay fan\n");
-       return 0;
- }
-@@ -1621,7 +1636,9 @@ static int init_dimms_state(struct dimm_
-       if (state->monitor == NULL)
-               return -ENODEV;
--              device_create_file(&of_dev->dev, &dev_attr_dimms_temperature);
-+      if (device_create_file(&of_dev->dev, &dev_attr_dimms_temperature))
-+              printk(KERN_WARNING "Failed to create attribute file"
-+                      " for DIMM temperature\n");
-       return 0;
- }
-@@ -1731,6 +1748,8 @@ static void do_monitor_slots(struct slot
-  */
- static int init_slots_state(struct slots_pid_state *state)
- {
-+      int err;
-+
-       state->ticks = 1;
-       state->first = 1;
-       state->pwm = 50;
-@@ -1739,8 +1758,11 @@ static int init_slots_state(struct slots
-       if (state->monitor == NULL)
-               return -ENODEV;
--      device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
--      device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
-+      err = device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
-+      err |= device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
-+      if (err)
-+              printk(KERN_WARNING "Failed to create attribute file(s)"
-+                      " for slots bay fan\n");
-       return 0;
- }
-@@ -1779,8 +1801,6 @@ static int call_critical_overtemp(void)
-  */
- static int main_control_loop(void *x)
- {
--      daemonize("kfand");
--
-       DBG("main_control_loop started\n");
-       down(&driver_lock);
-@@ -1956,7 +1976,7 @@ static void start_control_loops(void)
- {
-       init_completion(&ctrl_complete);
--      ctrl_task = kernel_thread(main_control_loop, NULL, SIGCHLD | CLONE_KERNEL);
-+      ctrl_task = kthread_run(main_control_loop, NULL, "kfand");
- }
- /*
-@@ -1964,7 +1984,7 @@ static void start_control_loops(void)
-  */
- static void stop_control_loops(void)
- {
--      if (ctrl_task != 0)
-+      if (ctrl_task)
-               wait_for_completion(&ctrl_complete);
- }
---- a/drivers/macintosh/therm_windtunnel.c
-+++ b/drivers/macintosh/therm_windtunnel.c
-@@ -36,6 +36,7 @@
- #include <linux/i2c.h>
- #include <linux/slab.h>
- #include <linux/init.h>
-+#include <linux/kthread.h>
- #include <asm/prom.h>
- #include <asm/machdep.h>
-@@ -61,8 +62,7 @@ I2C_CLIENT_INSMOD;
- static struct {
-       volatile int            running;
--      struct completion       completion;
--      pid_t                   poll_task;
-+      struct task_struct      *poll_task;
-       
-       struct semaphore        lock;
-       struct of_device        *of_dev;
-@@ -223,6 +223,7 @@ static void
- setup_hardware( void )
- {
-       int val;
-+      int err;
-       /* save registers (if we unload the module) */
-       x.r0 = read_reg( x.fan, 0x00, 1 );
-@@ -265,8 +266,11 @@ setup_hardware( void )
-       x.upind = -1;
-       /* tune_fan( fan_up_table[x.upind].fan_setting ); */
--      device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
--      device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
-+      err = device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
-+      err |= device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
-+      if (err)
-+              printk(KERN_WARNING
-+                      "Failed to create temperature attribute file(s).\n");
- }
- static void
-@@ -282,27 +286,27 @@ restore_regs( void )
-       write_reg( x.fan, 0x00, x.r0, 1 );
- }
--static int
--control_loop( void *dummy )
-+static int control_loop(void *dummy)
- {
--      daemonize("g4fand");
--
--      down( &x.lock );
-+      down(&x.lock);
-       setup_hardware();
-+      up(&x.lock);
--      while( x.running ) {
--              up( &x.lock );
--
-+      for (;;) {
-               msleep_interruptible(8000);
--              
--              down( &x.lock );
-+              if (kthread_should_stop())
-+                      break;
-+
-+              down(&x.lock);
-               poll_temp();
-+              up(&x.lock);
-       }
-+      down(&x.lock);
-       restore_regs();
--      up( &x.lock );
-+      up(&x.lock);
--      complete_and_exit( &x.completion, 0 );
-+      return 0;
- }
-@@ -322,8 +326,7 @@ do_attach( struct i2c_adapter *adapter )
-               ret = i2c_probe( adapter, &addr_data, &do_probe );
-               if( x.thermostat && x.fan ) {
-                       x.running = 1;
--                      init_completion( &x.completion );
--                      x.poll_task = kernel_thread( control_loop, NULL, SIGCHLD | CLONE_KERNEL );
-+                      x.poll_task = kthread_run(control_loop, NULL, "g4fand");
-               }
-       }
-       return ret;
-@@ -339,7 +342,8 @@ do_detach( struct i2c_client *client )
-       else {
-               if( x.running ) {
-                       x.running = 0;
--                      wait_for_completion( &x.completion );
-+                      kthread_stop(x.poll_task);
-+                      x.poll_task = NULL;
-               }
-               if( client == x.thermostat )
-                       x.thermostat = NULL;
---- a/drivers/macintosh/via-pmu-backlight.c
-+++ b/drivers/macintosh/via-pmu-backlight.c
-@@ -22,7 +22,7 @@ static u8 bl_curve[FB_BACKLIGHT_LEVELS];
- static void pmu_backlight_init_curve(u8 off, u8 min, u8 max)
- {
--      unsigned int i, flat, count, range = (max - min);
-+      int i, flat, count, range = (max - min);
-       bl_curve[0] = off;
-@@ -68,17 +68,11 @@ static int pmu_backlight_get_level_brigh
-       return pmulevel;
- }
--static int pmu_backlight_update_status(struct backlight_device *bd)
-+static int __pmu_backlight_update_status(struct backlight_device *bd)
- {
-       struct adb_request req;
--      unsigned long flags;
-       int level = bd->props.brightness;
--      spin_lock_irqsave(&pmu_backlight_lock, flags);
--
--      /* Don't update brightness when sleeping */
--      if (sleeping)
--              goto out;
-       if (bd->props.power != FB_BLANK_UNBLANK ||
-           bd->props.fb_blank != FB_BLANK_UNBLANK)
-@@ -99,12 +93,23 @@ static int pmu_backlight_update_status(s
-               pmu_wait_complete(&req);
-       }
--out:
--      spin_unlock_irqrestore(&pmu_backlight_lock, flags);
--
-       return 0;
- }
-+static int pmu_backlight_update_status(struct backlight_device *bd)
-+{
-+      unsigned long flags;
-+      int rc = 0;
-+
-+      spin_lock_irqsave(&pmu_backlight_lock, flags);
-+      /* Don't update brightness when sleeping */
-+      if (!sleeping)
-+              rc = __pmu_backlight_update_status(bd);
-+      spin_unlock_irqrestore(&pmu_backlight_lock, flags);
-+      return rc;
-+}
-+
-+
- static int pmu_backlight_get_brightness(struct backlight_device *bd)
- {
-       return bd->props.brightness;
-@@ -123,6 +128,16 @@ void pmu_backlight_set_sleep(int sleep)
-       spin_lock_irqsave(&pmu_backlight_lock, flags);
-       sleeping = sleep;
-+      if (pmac_backlight) {
-+              if (sleep) {
-+                      struct adb_request req;
-+
-+                      pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
-+                                  PMU_POW_BACKLIGHT | PMU_POW_OFF);
-+                      pmu_wait_complete(&req);
-+              } else
-+                      __pmu_backlight_update_status(pmac_backlight);
-+      }
-       spin_unlock_irqrestore(&pmu_backlight_lock, flags);
- }
- #endif /* CONFIG_PM */
-@@ -148,8 +163,8 @@ void __init pmu_backlight_init()
-       bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data);
-       if (IS_ERR(bd)) {
--              printk("pmubl: Backlight registration failed\n");
--              goto error;
-+              printk(KERN_ERR "PMU Backlight registration failed\n");
-+              return;
-       }
-       bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
-       pmu_backlight_init_curve(0x7F, 0x46, 0x0E);
-@@ -171,10 +186,5 @@ void __init pmu_backlight_init()
-       bd->props.power = FB_BLANK_UNBLANK;
-       backlight_update_status(bd);
--      printk("pmubl: Backlight initialized (%s)\n", name);
--
--      return;
--
--error:
--      return;
-+      printk(KERN_INFO "PMU Backlight initialized (%s)\n", name);
- }
---- a/drivers/macintosh/via-pmu.c
-+++ b/drivers/macintosh/via-pmu.c
-@@ -10,13 +10,11 @@
-  *
-  * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
-  * Copyright (C) 2001-2002 Benjamin Herrenschmidt
-+ * Copyright (C) 2006-2007 Johannes Berg
-  *
-  * THIS DRIVER IS BECOMING A TOTAL MESS !
-  *  - Cleanup atomically disabling reply to PMU events after
-  *    a sleep or a freq. switch
-- *  - Move sleep code out of here to pmac_pm, merge into new
-- *    common PM infrastructure
-- *  - Save/Restore PCI space properly
-  *
-  */
- #include <stdarg.h>
-@@ -33,7 +31,6 @@
- #include <linux/adb.h>
- #include <linux/pmu.h>
- #include <linux/cuda.h>
--#include <linux/smp_lock.h>
- #include <linux/module.h>
- #include <linux/spinlock.h>
- #include <linux/pm.h>
-@@ -65,9 +62,7 @@
- #include "via-pmu-event.h"
- /* Some compile options */
--#undef SUSPEND_USES_PMU
--#define DEBUG_SLEEP
--#undef HACKED_PCI_SAVE
-+#undef DEBUG_SLEEP
- /* Misc minor number allocated for /dev/pmu */
- #define PMU_MINOR             154
-@@ -152,12 +147,9 @@ static spinlock_t pmu_lock;
- static u8 pmu_intr_mask;
- static int pmu_version;
- static int drop_interrupts;
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- static int option_lid_wakeup = 1;
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
--#if (defined(CONFIG_PM_SLEEP)&&defined(CONFIG_PPC32))||defined(CONFIG_PMAC_BACKLIGHT_LEGACY)
--static int sleep_in_progress;
--#endif
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- static unsigned long async_req_locks;
- static unsigned int pmu_irq_stats[11];
-@@ -177,7 +169,6 @@ static struct proc_dir_entry *proc_pmu_b
- int __fake_sleep;
- int asleep;
--BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
- #ifdef CONFIG_ADB
- static int adb_dev_map;
-@@ -224,7 +215,7 @@ extern void enable_kernel_fp(void);
- #ifdef DEBUG_SLEEP
- int pmu_polled_request(struct adb_request *req);
--int pmu_wink(struct adb_request *req);
-+void pmu_blink(int n);
- #endif
- /*
-@@ -875,7 +866,7 @@ proc_read_options(char *page, char **sta
- {
-       char *p = page;
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
-       if (pmu_kind == PMU_KEYLARGO_BASED &&
-           pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
-               p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup);
-@@ -916,7 +907,7 @@ proc_write_options(struct file *file, co
-       *(val++) = 0;
-       while(*val == ' ')
-               val++;
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
-       if (pmu_kind == PMU_KEYLARGO_BASED &&
-           pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
-               if (!strcmp(label, "lid_wakeup"))
-@@ -1256,9 +1247,7 @@ void
- pmu_suspend(void)
- {
-       unsigned long flags;
--#ifdef SUSPEND_USES_PMU
--      struct adb_request *req;
--#endif
-+
-       if (!via)
-               return;
-       
-@@ -1276,17 +1265,10 @@ pmu_suspend(void)
-               via_pmu_interrupt(0, NULL);
-               spin_lock_irqsave(&pmu_lock, flags);
-               if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
--#ifdef SUSPEND_USES_PMU
--                      pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
--                      spin_unlock_irqrestore(&pmu_lock, flags);
--                      while(!req.complete)
--                              pmu_poll();
--#else /* SUSPEND_USES_PMU */
-                       if (gpio_irq >= 0)
-                               disable_irq_nosync(gpio_irq);
-                       out_8(&via[IER], CB1_INT | IER_CLR);
-                       spin_unlock_irqrestore(&pmu_lock, flags);
--#endif /* SUSPEND_USES_PMU */
-                       break;
-               }
-       } while (1);
-@@ -1307,18 +1289,11 @@ pmu_resume(void)
-               return;
-       }
-       adb_int_pending = 1;
--#ifdef SUSPEND_USES_PMU
--      pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
--      spin_unlock_irqrestore(&pmu_lock, flags);
--      while(!req.complete)
--              pmu_poll();
--#else /* SUSPEND_USES_PMU */
-       if (gpio_irq >= 0)
-               enable_irq(gpio_irq);
-       out_8(&via[IER], CB1_INT | IER_SET);
-       spin_unlock_irqrestore(&pmu_lock, flags);
-       pmu_poll();
--#endif /* SUSPEND_USES_PMU */
- }
- /* Interrupt data could be the result data from an ADB cmd */
-@@ -1738,228 +1713,7 @@ pmu_present(void)
-       return via != 0;
- }
--#ifdef CONFIG_PM_SLEEP
--
--static LIST_HEAD(sleep_notifiers);
--
--int
--pmu_register_sleep_notifier(struct pmu_sleep_notifier *n)
--{
--      struct list_head *list;
--      struct pmu_sleep_notifier *notifier;
--
--      for (list = sleep_notifiers.next; list != &sleep_notifiers;
--           list = list->next) {
--              notifier = list_entry(list, struct pmu_sleep_notifier, list);
--              if (n->priority > notifier->priority)
--                      break;
--      }
--      __list_add(&n->list, list->prev, list);
--      return 0;
--}
--EXPORT_SYMBOL(pmu_register_sleep_notifier);
--
--int
--pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* n)
--{
--      if (n->list.next == 0)
--              return -ENOENT;
--      list_del(&n->list);
--      n->list.next = NULL;
--      return 0;
--}
--EXPORT_SYMBOL(pmu_unregister_sleep_notifier);
--#endif /* CONFIG_PM_SLEEP */
--
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
--
--/* Sleep is broadcast last-to-first */
--static void broadcast_sleep(int when)
--{
--      struct list_head *list;
--      struct pmu_sleep_notifier *notifier;
--
--      for (list = sleep_notifiers.prev; list != &sleep_notifiers;
--           list = list->prev) {
--              notifier = list_entry(list, struct pmu_sleep_notifier, list);
--              notifier->notifier_call(notifier, when);
--      }
--}
--
--/* Wake is broadcast first-to-last */
--static void broadcast_wake(void)
--{
--      struct list_head *list;
--      struct pmu_sleep_notifier *notifier;
--
--      for (list = sleep_notifiers.next; list != &sleep_notifiers;
--           list = list->next) {
--              notifier = list_entry(list, struct pmu_sleep_notifier, list);
--              notifier->notifier_call(notifier, PBOOK_WAKE);
--      }
--}
--
--/*
-- * This struct is used to store config register values for
-- * PCI devices which may get powered off when we sleep.
-- */
--static struct pci_save {
--#ifndef HACKED_PCI_SAVE
--      u16     command;
--      u16     cache_lat;
--      u16     intr;
--      u32     rom_address;
--#else
--      u32     config[16];
--#endif        
--} *pbook_pci_saves;
--static int pbook_npci_saves;
--
--static void
--pbook_alloc_pci_save(void)
--{
--      int npci;
--      struct pci_dev *pd = NULL;
--
--      npci = 0;
--      while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
--              ++npci;
--      }
--      if (npci == 0)
--              return;
--      pbook_pci_saves = (struct pci_save *)
--              kmalloc(npci * sizeof(struct pci_save), GFP_KERNEL);
--      pbook_npci_saves = npci;
--}
--
--static void
--pbook_free_pci_save(void)
--{
--      if (pbook_pci_saves == NULL)
--              return;
--      kfree(pbook_pci_saves);
--      pbook_pci_saves = NULL;
--      pbook_npci_saves = 0;
--}
--
--static void
--pbook_pci_save(void)
--{
--      struct pci_save *ps = pbook_pci_saves;
--      struct pci_dev *pd = NULL;
--      int npci = pbook_npci_saves;
--      
--      if (ps == NULL)
--              return;
--
--      while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
--              if (npci-- == 0) {
--                      pci_dev_put(pd);
--                      return;
--              }
--#ifndef HACKED_PCI_SAVE
--              pci_read_config_word(pd, PCI_COMMAND, &ps->command);
--              pci_read_config_word(pd, PCI_CACHE_LINE_SIZE, &ps->cache_lat);
--              pci_read_config_word(pd, PCI_INTERRUPT_LINE, &ps->intr);
--              pci_read_config_dword(pd, PCI_ROM_ADDRESS, &ps->rom_address);
--#else
--              int i;
--              for (i=1;i<16;i++)
--                      pci_read_config_dword(pd, i<<4, &ps->config[i]);
--#endif
--              ++ps;
--      }
--}
--
--/* For this to work, we must take care of a few things: If gmac was enabled
-- * during boot, it will be in the pci dev list. If it's disabled at this point
-- * (and it will probably be), then you can't access it's config space.
-- */
--static void
--pbook_pci_restore(void)
--{
--      u16 cmd;
--      struct pci_save *ps = pbook_pci_saves - 1;
--      struct pci_dev *pd = NULL;
--      int npci = pbook_npci_saves;
--      int j;
--
--      while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
--#ifdef HACKED_PCI_SAVE
--              int i;
--              if (npci-- == 0) {
--                      pci_dev_put(pd);
--                      return;
--              }
--              ps++;
--              for (i=2;i<16;i++)
--                      pci_write_config_dword(pd, i<<4, ps->config[i]);
--              pci_write_config_dword(pd, 4, ps->config[1]);
--#else
--              if (npci-- == 0)
--                      return;
--              ps++;
--              if (ps->command == 0)
--                      continue;
--              pci_read_config_word(pd, PCI_COMMAND, &cmd);
--              if ((ps->command & ~cmd) == 0)
--                      continue;
--              switch (pd->hdr_type) {
--              case PCI_HEADER_TYPE_NORMAL:
--                      for (j = 0; j < 6; ++j)
--                              pci_write_config_dword(pd,
--                                      PCI_BASE_ADDRESS_0 + j*4,
--                                      pd->resource[j].start);
--                      pci_write_config_dword(pd, PCI_ROM_ADDRESS,
--                              ps->rom_address);
--                      pci_write_config_word(pd, PCI_CACHE_LINE_SIZE,
--                              ps->cache_lat);
--                      pci_write_config_word(pd, PCI_INTERRUPT_LINE,
--                              ps->intr);
--                      pci_write_config_word(pd, PCI_COMMAND, ps->command);
--                      break;
--              }
--#endif        
--      }
--}
--
--#ifdef DEBUG_SLEEP
--/* N.B. This doesn't work on the 3400 */
--void 
--pmu_blink(int n)
--{
--      struct adb_request req;
--
--      memset(&req, 0, sizeof(req));
--
--      for (; n > 0; --n) {
--              req.nbytes = 4;
--              req.done = NULL;
--              req.data[0] = 0xee;
--              req.data[1] = 4;
--              req.data[2] = 0;
--              req.data[3] = 1;
--              req.reply[0] = ADB_RET_OK;
--              req.reply_len = 1;
--              req.reply_expected = 0;
--              pmu_polled_request(&req);
--              mdelay(50);
--              req.nbytes = 4;
--              req.done = NULL;
--              req.data[0] = 0xee;
--              req.data[1] = 4;
--              req.data[2] = 0;
--              req.data[3] = 0;
--              req.reply[0] = ADB_RET_OK;
--              req.reply_len = 1;
--              req.reply_expected = 0;
--              pmu_polled_request(&req);
--              mdelay(50);
--      }
--      mdelay(50);
--}
--#endif
--
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- /*
-  * Put the powerbook to sleep.
-  */
-@@ -1994,134 +1748,6 @@ restore_via_state(void)
-       out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
- }
--extern void pmu_backlight_set_sleep(int sleep);
--
--static int
--pmac_suspend_devices(void)
--{
--      int ret;
--
--      pm_prepare_console();
--      
--      /* Notify old-style device drivers */
--      broadcast_sleep(PBOOK_SLEEP_REQUEST);
--
--      /* Sync the disks. */
--      /* XXX It would be nice to have some way to ensure that
--       * nobody is dirtying any new buffers while we wait. That
--       * could be achieved using the refrigerator for processes
--       * that swsusp uses
--       */
--      sys_sync();
--
--      broadcast_sleep(PBOOK_SLEEP_NOW);
--
--      /* Send suspend call to devices, hold the device core's dpm_sem */
--      ret = device_suspend(PMSG_SUSPEND);
--      if (ret) {
--              broadcast_wake();
--              printk(KERN_ERR "Driver sleep failed\n");
--              return -EBUSY;
--      }
--
--#ifdef CONFIG_PMAC_BACKLIGHT
--      /* Tell backlight code not to muck around with the chip anymore */
--      pmu_backlight_set_sleep(1);
--#endif
--
--      /* Call platform functions marked "on sleep" */
--      pmac_pfunc_i2c_suspend();
--      pmac_pfunc_base_suspend();
--
--      /* Stop preemption */
--      preempt_disable();
--
--      /* Make sure the decrementer won't interrupt us */
--      asm volatile("mtdec %0" : : "r" (0x7fffffff));
--      /* Make sure any pending DEC interrupt occurring while we did
--       * the above didn't re-enable the DEC */
--      mb();
--      asm volatile("mtdec %0" : : "r" (0x7fffffff));
--
--      /* We can now disable MSR_EE. This code of course works properly only
--       * on UP machines... For SMP, if we ever implement sleep, we'll have to
--       * stop the "other" CPUs way before we do all that stuff.
--       */
--      local_irq_disable();
--
--      /* Broadcast power down irq
--       * This isn't that useful in most cases (only directly wired devices can
--       * use this but still... This will take care of sysdev's as well, so
--       * we exit from here with local irqs disabled and PIC off.
--       */
--      ret = device_power_down(PMSG_SUSPEND);
--      if (ret) {
--              wakeup_decrementer();
--              local_irq_enable();
--              preempt_enable();
--              device_resume();
--              broadcast_wake();
--              printk(KERN_ERR "Driver powerdown failed\n");
--              return -EBUSY;
--      }
--
--      /* Wait for completion of async requests */
--      while (!batt_req.complete)
--              pmu_poll();
--
--      /* Giveup the lazy FPU & vec so we don't have to back them
--       * up from the low level code
--       */
--      enable_kernel_fp();
--
--#ifdef CONFIG_ALTIVEC
--      if (cpu_has_feature(CPU_FTR_ALTIVEC))
--              enable_kernel_altivec();
--#endif /* CONFIG_ALTIVEC */
--
--      return 0;
--}
--
--static int
--pmac_wakeup_devices(void)
--{
--      mdelay(100);
--
--#ifdef CONFIG_PMAC_BACKLIGHT
--      /* Tell backlight code it can use the chip again */
--      pmu_backlight_set_sleep(0);
--#endif
--
--      /* Power back up system devices (including the PIC) */
--      device_power_up();
--
--      /* Force a poll of ADB interrupts */
--      adb_int_pending = 1;
--      via_pmu_interrupt(0, NULL);
--
--      /* Restart jiffies & scheduling */
--      wakeup_decrementer();
--
--      /* Re-enable local CPU interrupts */
--      local_irq_enable();
--      mdelay(10);
--      preempt_enable();
--
--      /* Call platform functions marked "on wake" */
--      pmac_pfunc_base_resume();
--      pmac_pfunc_i2c_resume();
--
--      /* Resume devices */
--      device_resume();
--
--      /* Notify old style drivers */
--      broadcast_wake();
--
--      pm_restore_console();
--
--      return 0;
--}
--
- #define       GRACKLE_PM      (1<<7)
- #define GRACKLE_DOZE  (1<<5)
- #define       GRACKLE_NAP     (1<<4)
-@@ -2132,19 +1758,12 @@ static int powerbook_sleep_grackle(void)
-       unsigned long save_l2cr;
-       unsigned short pmcr1;
-       struct adb_request req;
--      int ret;
-       struct pci_dev *grackle;
-       grackle = pci_get_bus_and_slot(0, 0);
-       if (!grackle)
-               return -ENODEV;
--      ret = pmac_suspend_devices();
--      if (ret) {
--              printk(KERN_ERR "Sleep rejected by devices\n");
--              return ret;
--      }
--      
-       /* Turn off various things. Darwin does some retry tests here... */
-       pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
-       pmu_wait_complete(&req);
-@@ -2207,8 +1826,6 @@ static int powerbook_sleep_grackle(void)
-                       PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
-       pmu_wait_complete(&req);
--      pmac_wakeup_devices();
--
-       return 0;
- }
-@@ -2218,7 +1835,6 @@ powerbook_sleep_Core99(void)
-       unsigned long save_l2cr;
-       unsigned long save_l3cr;
-       struct adb_request req;
--      int ret;
-       
-       if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
-               printk(KERN_ERR "Sleep mode not supported on this machine\n");
-@@ -2228,12 +1844,6 @@ powerbook_sleep_Core99(void)
-       if (num_online_cpus() > 1 || cpu_is_offline(0))
-               return -EAGAIN;
--      ret = pmac_suspend_devices();
--      if (ret) {
--              printk(KERN_ERR "Sleep rejected by devices\n");
--              return ret;
--      }
--
-       /* Stop environment and ADB interrupts */
-       pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
-       pmu_wait_complete(&req);
-@@ -2304,45 +1914,33 @@ powerbook_sleep_Core99(void)
-       /* Restore LPJ, cpufreq will adjust the cpu frequency */
-       loops_per_jiffy /= 2;
--      pmac_wakeup_devices();
--
-       return 0;
- }
- #define PB3400_MEM_CTRL               0xf8000000
- #define PB3400_MEM_CTRL_SLEEP 0x70
--static int
--powerbook_sleep_3400(void)
-+static void __iomem *pb3400_mem_ctrl;
-+
-+static void powerbook_sleep_init_3400(void)
- {
--      int ret, i, x;
-+      /* map in the memory controller registers */
-+      pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
-+      if (pb3400_mem_ctrl == NULL)
-+              printk(KERN_WARNING "ioremap failed: sleep won't be possible");
-+}
-+
-+static int powerbook_sleep_3400(void)
-+{
-+      int i, x;
-       unsigned int hid0;
--      unsigned long p;
-+      unsigned long msr;
-       struct adb_request sleep_req;
--      void __iomem *mem_ctrl;
-       unsigned int __iomem *mem_ctrl_sleep;
--      /* first map in the memory controller registers */
--      mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
--      if (mem_ctrl == NULL) {
--              printk("powerbook_sleep_3400: ioremap failed\n");
-+      if (pb3400_mem_ctrl == NULL)
-               return -ENOMEM;
--      }
--      mem_ctrl_sleep = mem_ctrl + PB3400_MEM_CTRL_SLEEP;
--
--      /* Allocate room for PCI save */
--      pbook_alloc_pci_save();
--
--      ret = pmac_suspend_devices();
--      if (ret) {
--              pbook_free_pci_save();
--              iounmap(mem_ctrl);
--              printk(KERN_ERR "Sleep rejected by devices\n");
--              return ret;
--      }
--
--      /* Save the state of PCI config space for some slots */
--      pbook_pci_save();
-+      mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
-       /* Set the memory controller to keep the memory refreshed
-          while we're asleep */
-@@ -2357,41 +1955,34 @@ powerbook_sleep_3400(void)
-       /* Ask the PMU to put us to sleep */
-       pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
--      while (!sleep_req.complete)
--              mb();
-+      pmu_wait_complete(&sleep_req);
-+      pmu_unlock();
--      pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
-+      pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
--      /* displacement-flush the L2 cache - necessary? */
--      for (p = KERNELBASE; p < KERNELBASE + 0x100000; p += 0x1000)
--              i = *(volatile int *)p;
-       asleep = 1;
-       /* Put the CPU into sleep mode */
-       hid0 = mfspr(SPRN_HID0);
-       hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
-       mtspr(SPRN_HID0, hid0);
--      mtmsr(mfmsr() | MSR_POW | MSR_EE);
--      udelay(10);
-+      local_irq_enable();
-+      msr = mfmsr() | MSR_POW;
-+      while (asleep) {
-+              mb();
-+              mtmsr(msr);
-+              isync();
-+      }
-+      local_irq_disable();
-       /* OK, we're awake again, start restoring things */
-       out_be32(mem_ctrl_sleep, 0x3f);
--      pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
--      pbook_pci_restore();
--      pmu_unlock();
--
--      /* wait for the PMU interrupt sequence to complete */
--      while (asleep)
--              mb();
--
--      pmac_wakeup_devices();
--      pbook_free_pci_save();
--      iounmap(mem_ctrl);
-+      pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
-       return 0;
- }
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- /*
-  * Support for /dev/pmu device
-@@ -2548,7 +2139,6 @@ pmu_release(struct inode *inode, struct 
-       struct pmu_private *pp = file->private_data;
-       unsigned long flags;
--      lock_kernel();
-       if (pp != 0) {
-               file->private_data = NULL;
-               spin_lock_irqsave(&all_pvt_lock, flags);
-@@ -2562,10 +2152,96 @@ pmu_release(struct inode *inode, struct 
-               kfree(pp);
-       }
--      unlock_kernel();
-       return 0;
- }
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
-+static void pmac_suspend_disable_irqs(void)
-+{
-+      /* Call platform functions marked "on sleep" */
-+      pmac_pfunc_i2c_suspend();
-+      pmac_pfunc_base_suspend();
-+}
-+
-+static int powerbook_sleep(suspend_state_t state)
-+{
-+      int error = 0;
-+
-+      /* Wait for completion of async requests */
-+      while (!batt_req.complete)
-+              pmu_poll();
-+
-+      /* Giveup the lazy FPU & vec so we don't have to back them
-+       * up from the low level code
-+       */
-+      enable_kernel_fp();
-+
-+#ifdef CONFIG_ALTIVEC
-+      if (cpu_has_feature(CPU_FTR_ALTIVEC))
-+              enable_kernel_altivec();
-+#endif /* CONFIG_ALTIVEC */
-+
-+      switch (pmu_kind) {
-+      case PMU_OHARE_BASED:
-+              error = powerbook_sleep_3400();
-+              break;
-+      case PMU_HEATHROW_BASED:
-+      case PMU_PADDINGTON_BASED:
-+              error = powerbook_sleep_grackle();
-+              break;
-+      case PMU_KEYLARGO_BASED:
-+              error = powerbook_sleep_Core99();
-+              break;
-+      default:
-+              return -ENOSYS;
-+      }
-+
-+      if (error)
-+              return error;
-+
-+      mdelay(100);
-+
-+      return 0;
-+}
-+
-+static void pmac_suspend_enable_irqs(void)
-+{
-+      /* Force a poll of ADB interrupts */
-+      adb_int_pending = 1;
-+      via_pmu_interrupt(0, NULL);
-+
-+      mdelay(10);
-+
-+      /* Call platform functions marked "on wake" */
-+      pmac_pfunc_base_resume();
-+      pmac_pfunc_i2c_resume();
-+}
-+
-+static int pmu_sleep_valid(suspend_state_t state)
-+{
-+      return state == PM_SUSPEND_MEM
-+              && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
-+}
-+
-+static struct platform_suspend_ops pmu_pm_ops = {
-+      .enter = powerbook_sleep,
-+      .valid = pmu_sleep_valid,
-+};
-+
-+static int register_pmu_pm_ops(void)
-+{
-+      if (pmu_kind == PMU_OHARE_BASED)
-+              powerbook_sleep_init_3400();
-+      ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
-+      ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
-+      suspend_set_ops(&pmu_pm_ops);
-+
-+      return 0;
-+}
-+
-+device_initcall(register_pmu_pm_ops);
-+#endif
-+
- static int
- pmu_ioctl(struct inode * inode, struct file *filp,
-                    u_int cmd, u_long arg)
-@@ -2574,35 +2250,15 @@ pmu_ioctl(struct inode * inode, struct f
-       int error = -EINVAL;
-       switch (cmd) {
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-       case PMU_IOC_SLEEP:
-               if (!capable(CAP_SYS_ADMIN))
-                       return -EACCES;
--              if (sleep_in_progress)
--                      return -EBUSY;
--              sleep_in_progress = 1;
--              switch (pmu_kind) {
--              case PMU_OHARE_BASED:
--                      error = powerbook_sleep_3400();
--                      break;
--              case PMU_HEATHROW_BASED:
--              case PMU_PADDINGTON_BASED:
--                      error = powerbook_sleep_grackle();
--                      break;
--              case PMU_KEYLARGO_BASED:
--                      error = powerbook_sleep_Core99();
--                      break;
--              default:
--                      error = -ENOSYS;
--              }
--              sleep_in_progress = 0;
--              break;
-+              return pm_suspend(PM_SUSPEND_MEM);
-       case PMU_IOC_CAN_SLEEP:
--              if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0)
-+              if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
-                       return put_user(0, argp);
-               else
-                       return put_user(1, argp);
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
- #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
-       /* Compatibility ioctl's for backlight */
-@@ -2610,9 +2266,6 @@ pmu_ioctl(struct inode * inode, struct f
-       {
-               int brightness;
--              if (sleep_in_progress)
--                      return -EBUSY;
--
-               brightness = pmac_backlight_get_legacy_brightness();
-               if (brightness < 0)
-                       return brightness;
-@@ -2624,9 +2277,6 @@ pmu_ioctl(struct inode * inode, struct f
-       {
-               int brightness;
--              if (sleep_in_progress)
--                      return -EBUSY;
--
-               error = get_user(brightness, argp);
-               if (error)
-                       return error;
-@@ -2751,15 +2401,43 @@ pmu_polled_request(struct adb_request *r
-       local_irq_restore(flags);
-       return 0;
- }
--#endif /* DEBUG_SLEEP */
-+/* N.B. This doesn't work on the 3400 */
-+void pmu_blink(int n)
-+{
-+      struct adb_request req;
--/* FIXME: This is a temporary set of callbacks to enable us
-- * to do suspend-to-disk.
-- */
-+      memset(&req, 0, sizeof(req));
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+      for (; n > 0; --n) {
-+              req.nbytes = 4;
-+              req.done = NULL;
-+              req.data[0] = 0xee;
-+              req.data[1] = 4;
-+              req.data[2] = 0;
-+              req.data[3] = 1;
-+              req.reply[0] = ADB_RET_OK;
-+              req.reply_len = 1;
-+              req.reply_expected = 0;
-+              pmu_polled_request(&req);
-+              mdelay(50);
-+              req.nbytes = 4;
-+              req.done = NULL;
-+              req.data[0] = 0xee;
-+              req.data[1] = 4;
-+              req.data[2] = 0;
-+              req.data[3] = 0;
-+              req.reply[0] = ADB_RET_OK;
-+              req.reply_len = 1;
-+              req.reply_expected = 0;
-+              pmu_polled_request(&req);
-+              mdelay(50);
-+      }
-+      mdelay(50);
-+}
-+#endif /* DEBUG_SLEEP */
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- int pmu_sys_suspended;
- static int pmu_sys_suspend(struct sys_device *sysdev, pm_message_t state)
-@@ -2767,10 +2445,15 @@ static int pmu_sys_suspend(struct sys_de
-       if (state.event != PM_EVENT_SUSPEND || pmu_sys_suspended)
-               return 0;
--      /* Suspend PMU event interrupts */
-+      /* Suspend PMU event interrupts */\
-       pmu_suspend();
--
-       pmu_sys_suspended = 1;
-+
-+#ifdef CONFIG_PMAC_BACKLIGHT
-+      /* Tell backlight code not to muck around with the chip anymore */
-+      pmu_backlight_set_sleep(1);
-+#endif
-+
-       return 0;
- }
-@@ -2785,15 +2468,18 @@ static int pmu_sys_resume(struct sys_dev
-       pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
-       pmu_wait_complete(&req);
-+#ifdef CONFIG_PMAC_BACKLIGHT
-+      /* Tell backlight code it can use the chip again */
-+      pmu_backlight_set_sleep(0);
-+#endif
-       /* Resume PMU event interrupts */
-       pmu_resume();
--
-       pmu_sys_suspended = 0;
-       return 0;
- }
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- static struct sysdev_class pmu_sysclass = {
-       set_kset_name("pmu"),
-@@ -2804,10 +2490,10 @@ static struct sys_device device_pmu = {
- };
- static struct sysdev_driver driver_pmu = {
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
-       .suspend        = &pmu_sys_suspend,
-       .resume         = &pmu_sys_resume,
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- };
- static int __init init_pmu_sysfs(void)
-@@ -2842,10 +2528,10 @@ EXPORT_SYMBOL(pmu_wait_complete);
- EXPORT_SYMBOL(pmu_suspend);
- EXPORT_SYMBOL(pmu_resume);
- EXPORT_SYMBOL(pmu_unlock);
--#if defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- EXPORT_SYMBOL(pmu_enable_irled);
- EXPORT_SYMBOL(pmu_battery_count);
- EXPORT_SYMBOL(pmu_batteries);
- EXPORT_SYMBOL(pmu_power_flags);
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
---- a/drivers/net/fs_enet/fs_enet-main.c
-+++ b/drivers/net/fs_enet/fs_enet-main.c
-@@ -1178,8 +1178,15 @@ static int __devinit find_phy(struct dev
-       struct device_node *phynode, *mdionode;
-       struct resource res;
-       int ret = 0, len;
-+      const u32 *data;
-+
-+      data  = of_get_property(np, "fixed-link", NULL);
-+      if (data) {
-+              snprintf(fpi->bus_id, 16, PHY_ID_FMT, 0, *data);
-+              return 0;
-+      }
--      const u32 *data = of_get_property(np, "phy-handle", &len);
-+      data = of_get_property(np, "phy-handle", &len);
-       if (!data || len != 4)
-               return -EINVAL;
---- a/drivers/net/fs_enet/mac-fcc.c
-+++ b/drivers/net/fs_enet/mac-fcc.c
-@@ -81,16 +81,8 @@
- static inline int fcc_cr_cmd(struct fs_enet_private *fep, u32 op)
- {
-       const struct fs_platform_info *fpi = fep->fpi;
--      int i;
--      W32(cpmp, cp_cpcr, fpi->cp_command | op | CPM_CR_FLG);
--      for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
--              if ((R32(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
--                      return 0;
--
--      printk(KERN_ERR "%s(): Not able to issue CPM command\n",
--             __FUNCTION__);
--      return 1;
-+      return cpm_command(fpi->cp_command, op);
- }
- static int do_pd_setup(struct fs_enet_private *fep)
---- a/drivers/net/fs_enet/mac-scc.c
-+++ b/drivers/net/fs_enet/mac-scc.c
-@@ -89,21 +89,12 @@
-  * Delay to wait for SCC reset command to complete (in us)
-  */
- #define SCC_RESET_DELAY               50
--#define MAX_CR_CMD_LOOPS      10000
- static inline int scc_cr_cmd(struct fs_enet_private *fep, u32 op)
- {
-       const struct fs_platform_info *fpi = fep->fpi;
--      int i;
--      W16(cpmp, cp_cpcr, fpi->cp_command | CPM_CR_FLG | (op << 8));
--      for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
--              if ((R16(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
--                      return 0;
--
--      printk(KERN_ERR "%s(): Not able to issue CPM command\n",
--              __FUNCTION__);
--      return 1;
-+      return cpm_command(fpi->cp_command, op);
- }
- static int do_pd_setup(struct fs_enet_private *fep)
---- a/drivers/net/ibm_newemac/core.c
-+++ b/drivers/net/ibm_newemac/core.c
-@@ -37,6 +37,7 @@
- #include <linux/mii.h>
- #include <linux/bitops.h>
- #include <linux/workqueue.h>
-+#include <linux/of.h>
- #include <asm/processor.h>
- #include <asm/io.h>
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -61,34 +61,12 @@ config ICPLUS_PHY
-         Currently supports the IP175C PHY.
- config FIXED_PHY
--      tristate "Drivers for PHY emulation on fixed speed/link"
-+      bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
-       ---help---
--        Adds the driver to PHY layer to cover the boards that do not have any PHY bound,
--        but with the ability to manipulate the speed/link in software. The relevant MII
--        speed/duplex parameters could be effectively handled in a user-specified function.
--        Currently tested with mpc866ads.
-+        Adds the platform "fixed" MDIO Bus to cover the boards that use
-+        PHYs that are not connected to the real MDIO bus.
--config FIXED_MII_10_FDX
--      bool "Emulation for 10M Fdx fixed PHY behavior"
--      depends on FIXED_PHY
--
--config FIXED_MII_100_FDX
--      bool "Emulation for 100M Fdx fixed PHY behavior"
--      depends on FIXED_PHY
--
--config FIXED_MII_1000_FDX
--      bool "Emulation for 1000M Fdx fixed PHY behavior"
--      depends on FIXED_PHY
--
--config FIXED_MII_AMNT
--        int "Number of emulated PHYs to allocate "
--        depends on FIXED_PHY
--        default "1"
--        ---help---
--        Sometimes it is required to have several independent emulated
--        PHYs on the bus (in case of multi-eth but phy-less HW for instance).
--        This control will have specified number allocated for each fixed
--        PHY type enabled.
-+        Currently tested with mpc866ads and mpc8349e-mitx.
- config MDIO_BITBANG
-       tristate "Support for bitbanged MDIO buses"
---- a/drivers/net/phy/fixed.c
-+++ b/drivers/net/phy/fixed.c
-@@ -1,362 +1,253 @@
- /*
-- * drivers/net/phy/fixed.c
-+ * Fixed MDIO bus (MDIO bus emulation with fixed PHYs)
-  *
-- * Driver for fixed PHYs, when transceiver is able to operate in one fixed mode.
-+ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
-+ *         Anton Vorontsov <avorontsov@ru.mvista.com>
-  *
-- * Author: Vitaly Bordug
-- *
-- * Copyright (c) 2006 MontaVista Software, Inc.
-+ * Copyright (c) 2006-2007 MontaVista Software, Inc.
-  *
-  * This program is free software; you can redistribute  it and/or modify it
-  * under  the terms of  the GNU General  Public License as published by the
-  * Free Software Foundation;  either version 2 of the  License, or (at your
-  * option) any later version.
-- *
-  */
-+
- #include <linux/kernel.h>
--#include <linux/string.h>
--#include <linux/errno.h>
--#include <linux/unistd.h>
--#include <linux/slab.h>
--#include <linux/interrupt.h>
--#include <linux/init.h>
--#include <linux/delay.h>
--#include <linux/netdevice.h>
--#include <linux/etherdevice.h>
--#include <linux/skbuff.h>
--#include <linux/spinlock.h>
--#include <linux/mm.h>
- #include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
- #include <linux/mii.h>
--#include <linux/ethtool.h>
- #include <linux/phy.h>
- #include <linux/phy_fixed.h>
--#include <asm/io.h>
--#include <asm/irq.h>
--#include <asm/uaccess.h>
--
--/* we need to track the allocated pointers in order to free them on exit */
--static struct fixed_info *fixed_phy_ptrs[CONFIG_FIXED_MII_AMNT*MAX_PHY_AMNT];
--
--/*-----------------------------------------------------------------------------
-- *  If something weird is required to be done with link/speed,
-- * network driver is able to assign a function to implement this.
-- * May be useful for PHY's that need to be software-driven.
-- *-----------------------------------------------------------------------------*/
--int fixed_mdio_set_link_update(struct phy_device *phydev,
--                             int (*link_update) (struct net_device *,
--                                                 struct fixed_phy_status *))
--{
--      struct fixed_info *fixed;
--
--      if (link_update == NULL)
--              return -EINVAL;
-+#define MII_REGS_NUM 29
--      if (phydev) {
--              if (phydev->bus) {
--                      fixed = phydev->bus->priv;
--                      fixed->link_update = link_update;
--                      return 0;
--              }
--      }
--      return -EINVAL;
--}
--
--EXPORT_SYMBOL(fixed_mdio_set_link_update);
-+struct fixed_mdio_bus {
-+      int irqs[PHY_MAX_ADDR];
-+      struct mii_bus mii_bus;
-+      struct list_head phys;
-+};
--struct fixed_info *fixed_mdio_get_phydev (int phydev_ind)
--{
--      if (phydev_ind >= MAX_PHY_AMNT)
--              return NULL;
--      return fixed_phy_ptrs[phydev_ind];
--}
-+struct fixed_phy {
-+      int id;
-+      u16 regs[MII_REGS_NUM];
-+      struct phy_device *phydev;
-+      struct fixed_phy_status status;
-+      int (*link_update)(struct net_device *, struct fixed_phy_status *);
-+      struct list_head node;
-+};
--EXPORT_SYMBOL(fixed_mdio_get_phydev);
-+static struct platform_device *pdev;
-+static struct fixed_mdio_bus platform_fmb = {
-+      .phys = LIST_HEAD_INIT(platform_fmb.phys),
-+};
--/*-----------------------------------------------------------------------------
-- *  This is used for updating internal mii regs from the status
-- *-----------------------------------------------------------------------------*/
--#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
--static int fixed_mdio_update_regs(struct fixed_info *fixed)
-+static int fixed_phy_update_regs(struct fixed_phy *fp)
- {
--      u16 *regs = fixed->regs;
--      u16 bmsr = 0;
-+      u16 bmsr = BMSR_ANEGCAPABLE;
-       u16 bmcr = 0;
-+      u16 lpagb = 0;
-+      u16 lpa = 0;
--      if (!regs) {
--              printk(KERN_ERR "%s: regs not set up", __FUNCTION__);
--              return -EINVAL;
--      }
--
--      if (fixed->phy_status.link)
--              bmsr |= BMSR_LSTATUS;
--
--      if (fixed->phy_status.duplex) {
-+      if (fp->status.duplex) {
-               bmcr |= BMCR_FULLDPLX;
--              switch (fixed->phy_status.speed) {
-+              switch (fp->status.speed) {
-+              case 1000:
-+                      bmsr |= BMSR_ESTATEN;
-+                      bmcr |= BMCR_SPEED1000;
-+                      lpagb |= LPA_1000FULL;
-+                      break;
-               case 100:
-                       bmsr |= BMSR_100FULL;
-                       bmcr |= BMCR_SPEED100;
-+                      lpa |= LPA_100FULL;
-                       break;
--
-               case 10:
-                       bmsr |= BMSR_10FULL;
-+                      lpa |= LPA_10FULL;
-                       break;
-+              default:
-+                      printk(KERN_WARNING "fixed phy: unknown speed\n");
-+                      return -EINVAL;
-               }
-       } else {
--              switch (fixed->phy_status.speed) {
-+              switch (fp->status.speed) {
-+              case 1000:
-+                      bmsr |= BMSR_ESTATEN;
-+                      bmcr |= BMCR_SPEED1000;
-+                      lpagb |= LPA_1000HALF;
-+                      break;
-               case 100:
-                       bmsr |= BMSR_100HALF;
-                       bmcr |= BMCR_SPEED100;
-+                      lpa |= LPA_100HALF;
-                       break;
--
-               case 10:
--                      bmsr |= BMSR_100HALF;
-+                      bmsr |= BMSR_10HALF;
-+                      lpa |= LPA_10HALF;
-                       break;
-+              default:
-+                      printk(KERN_WARNING "fixed phy: unknown speed\n");
-+                      return -EINVAL;
-               }
-       }
--      regs[MII_BMCR] = bmcr;
--      regs[MII_BMSR] = bmsr | 0x800;  /*we are always capable of 10 hdx */
-+      if (fp->status.link)
-+              bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
-+
-+      if (fp->status.pause)
-+              lpa |= LPA_PAUSE_CAP;
-+
-+      if (fp->status.asym_pause)
-+              lpa |= LPA_PAUSE_ASYM;
-+
-+      fp->regs[MII_PHYSID1] = fp->id >> 16;
-+      fp->regs[MII_PHYSID2] = fp->id;
-+
-+      fp->regs[MII_BMSR] = bmsr;
-+      fp->regs[MII_BMCR] = bmcr;
-+      fp->regs[MII_LPA] = lpa;
-+      fp->regs[MII_STAT1000] = lpagb;
-       return 0;
- }
--static int fixed_mii_read(struct mii_bus *bus, int phy_id, int location)
-+static int fixed_mdio_read(struct mii_bus *bus, int phy_id, int reg_num)
- {
--      struct fixed_info *fixed = bus->priv;
-+      struct fixed_mdio_bus *fmb = container_of(bus, struct fixed_mdio_bus,
-+                                                mii_bus);
-+      struct fixed_phy *fp;
--      /* if user has registered link update callback, use it */
--      if (fixed->phydev)
--              if (fixed->phydev->attached_dev) {
--                      if (fixed->link_update) {
--                              fixed->link_update(fixed->phydev->attached_dev,
--                                                 &fixed->phy_status);
--                              fixed_mdio_update_regs(fixed);
-+      if (reg_num >= MII_REGS_NUM)
-+              return -1;
-+
-+      list_for_each_entry(fp, &fmb->phys, node) {
-+              if (fp->id == phy_id) {
-+                      /* Issue callback if user registered it. */
-+                      if (fp->link_update) {
-+                              fp->link_update(fp->phydev->attached_dev,
-+                                              &fp->status);
-+                              fixed_phy_update_regs(fp);
-                       }
-+                      return fp->regs[reg_num];
-               }
-+      }
--      if ((unsigned int)location >= fixed->regs_num)
--              return -1;
--      return fixed->regs[location];
-+      return 0xFFFF;
- }
--static int fixed_mii_write(struct mii_bus *bus, int phy_id, int location,
--                         u16 val)
-+static int fixed_mdio_write(struct mii_bus *bus, int phy_id, int reg_num,
-+                          u16 val)
- {
--      /* do nothing for now */
-       return 0;
- }
--static int fixed_mii_reset(struct mii_bus *bus)
-+/*
-+ * If something weird is required to be done with link/speed,
-+ * network driver is able to assign a function to implement this.
-+ * May be useful for PHY's that need to be software-driven.
-+ */
-+int fixed_phy_set_link_update(struct phy_device *phydev,
-+                            int (*link_update)(struct net_device *,
-+                                               struct fixed_phy_status *))
- {
--      /*nothing here - no way/need to reset it */
--      return 0;
--}
--#endif
-+      struct fixed_mdio_bus *fmb = &platform_fmb;
-+      struct fixed_phy *fp;
--static int fixed_config_aneg(struct phy_device *phydev)
--{
--      /* :TODO:03/13/2006 09:45:37 PM::
--         The full autoneg funcionality can be emulated,
--         but no need to have anything here for now
--       */
--      return 0;
--}
-+      if (!link_update || !phydev || !phydev->bus)
-+              return -EINVAL;
--/*-----------------------------------------------------------------------------
-- * the manual bind will do the magic - with phy_id_mask == 0
-- * match will never return true...
-- *-----------------------------------------------------------------------------*/
--static struct phy_driver fixed_mdio_driver = {
--      .name = "Fixed PHY",
--#ifdef CONFIG_FIXED_MII_1000_FDX
--      .features = PHY_GBIT_FEATURES,
--#else
--      .features = PHY_BASIC_FEATURES,
--#endif
--      .config_aneg = fixed_config_aneg,
--      .read_status = genphy_read_status,
--      .driver = { .owner = THIS_MODULE, },
--};
-+      list_for_each_entry(fp, &fmb->phys, node) {
-+              if (fp->id == phydev->phy_id) {
-+                      fp->link_update = link_update;
-+                      fp->phydev = phydev;
-+                      return 0;
-+              }
-+      }
--static void fixed_mdio_release(struct device *dev)
--{
--      struct phy_device *phydev = container_of(dev, struct phy_device, dev);
--      struct mii_bus *bus = phydev->bus;
--      struct fixed_info *fixed = bus->priv;
--
--      kfree(phydev);
--      kfree(bus->dev);
--      kfree(bus);
--      kfree(fixed->regs);
--      kfree(fixed);
-+      return -ENOENT;
- }
-+EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
--/*-----------------------------------------------------------------------------
-- *  This func is used to create all the necessary stuff, bind
-- * the fixed phy driver and register all it on the mdio_bus_type.
-- * speed is either 10 or 100 or 1000, duplex is boolean.
-- * number is used to create multiple fixed PHYs, so that several devices can
-- * utilize them simultaneously.
-- *
-- * The device on mdio bus will look like [bus_id]:[phy_id],
-- * bus_id = number
-- * phy_id = speed+duplex.
-- *-----------------------------------------------------------------------------*/
--#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
--struct fixed_info *fixed_mdio_register_device(
--      int bus_id, int speed, int duplex, u8 phy_id)
-+int fixed_phy_add(unsigned int irq, int phy_id,
-+                struct fixed_phy_status *status)
- {
--      struct mii_bus *new_bus;
--      struct fixed_info *fixed;
--      struct phy_device *phydev;
--      int err;
-+      int ret;
-+      struct fixed_mdio_bus *fmb = &platform_fmb;
-+      struct fixed_phy *fp;
--      struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
-+      fp = kzalloc(sizeof(*fp), GFP_KERNEL);
-+      if (!fp)
-+              return -ENOMEM;
--      if (dev == NULL)
--              goto err_dev_alloc;
-+      memset(fp->regs, 0xFF,  sizeof(fp->regs[0]) * MII_REGS_NUM);
--      new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
-+      fmb->irqs[phy_id] = irq;
--      if (new_bus == NULL)
--              goto err_bus_alloc;
--
--      fixed = kzalloc(sizeof(struct fixed_info), GFP_KERNEL);
--
--      if (fixed == NULL)
--              goto err_fixed_alloc;
--
--      fixed->regs = kzalloc(MII_REGS_NUM * sizeof(int), GFP_KERNEL);
--      if (NULL == fixed->regs)
--              goto err_fixed_regs_alloc;
--
--      fixed->regs_num = MII_REGS_NUM;
--      fixed->phy_status.speed = speed;
--      fixed->phy_status.duplex = duplex;
--      fixed->phy_status.link = 1;
--
--      new_bus->name = "Fixed MII Bus";
--      new_bus->read = &fixed_mii_read;
--      new_bus->write = &fixed_mii_write;
--      new_bus->reset = &fixed_mii_reset;
--      /*set up workspace */
--      fixed_mdio_update_regs(fixed);
--      new_bus->priv = fixed;
--
--      new_bus->dev = dev;
--      dev_set_drvdata(dev, new_bus);
--
--      /* create phy_device and register it on the mdio bus */
--      phydev = phy_device_create(new_bus, 0, 0);
--      if (phydev == NULL)
--              goto err_phy_dev_create;
--
--      /*
--       * Put the phydev pointer into the fixed pack so that bus read/write
--       * code could be able to access for instance attached netdev. Well it
--       * doesn't have to do so, only in case of utilizing user-specified
--       * link-update...
--       */
--
--      fixed->phydev = phydev;
--      phydev->speed = speed;
--      phydev->duplex = duplex;
--
--      phydev->irq = PHY_IGNORE_INTERRUPT;
--      phydev->dev.bus = &mdio_bus_type;
--
--      snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
--               PHY_ID_FMT, bus_id, phy_id);
--
--      phydev->bus = new_bus;
--
--      phydev->dev.driver = &fixed_mdio_driver.driver;
--      phydev->dev.release = fixed_mdio_release;
--      err = phydev->dev.driver->probe(&phydev->dev);
--      if (err < 0) {
--              printk(KERN_ERR "Phy %s: problems with fixed driver\n",
--                     phydev->dev.bus_id);
--              goto err_out;
--      }
--      err = device_register(&phydev->dev);
--      if (err) {
--              printk(KERN_ERR "Phy %s failed to register\n",
--                     phydev->dev.bus_id);
--              goto err_out;
--      }
--      //phydev->state = PHY_RUNNING; /* make phy go up quick, but in 10Mbit/HDX
--      return fixed;
-+      fp->id = phy_id;
-+      fp->status = *status;
--err_out:
--      kfree(phydev);
--err_phy_dev_create:
--      kfree(fixed->regs);
--err_fixed_regs_alloc:
--      kfree(fixed);
--err_fixed_alloc:
--      kfree(new_bus);
--err_bus_alloc:
--      kfree(dev);
--err_dev_alloc:
-+      ret = fixed_phy_update_regs(fp);
-+      if (ret)
-+              goto err_regs;
--      return NULL;
-+      list_add_tail(&fp->node, &fmb->phys);
--}
--#endif
-+      return 0;
--MODULE_DESCRIPTION("Fixed PHY device & driver for PAL");
--MODULE_AUTHOR("Vitaly Bordug");
--MODULE_LICENSE("GPL");
-+err_regs:
-+      kfree(fp);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(fixed_phy_add);
--static int __init fixed_init(void)
-+static int __init fixed_mdio_bus_init(void)
- {
--      int cnt = 0;
--      int i;
--/* register on the bus... Not expected to be matched
-- * with anything there...
-- *
-- */
--      phy_driver_register(&fixed_mdio_driver);
-+      struct fixed_mdio_bus *fmb = &platform_fmb;
-+      int ret;
--/* We will create several mdio devices here, and will bound the upper
-- * driver to them.
-- *
-- * Then the external software can lookup the phy bus by searching
-- * for 0:101, to be connected to the virtual 100M Fdx phy.
-- *
-- * In case several virtual PHYs required, the bus_id will be in form
-- * [num]:[duplex]+[speed], which make it able even to define
-- * driver-specific link control callback, if for instance PHY is
-- * completely SW-driven.
-- */
--      for (i=1; i <= CONFIG_FIXED_MII_AMNT; i++) {
--#ifdef CONFIG_FIXED_MII_1000_FDX
--              fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(0, 1000, 1, i);
--#endif
--#ifdef CONFIG_FIXED_MII_100_FDX
--              fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(1, 100, 1, i);
--#endif
--#ifdef CONFIG_FIXED_MII_10_FDX
--              fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(2, 10, 1, i);
--#endif
-+      pdev = platform_device_register_simple("Fixed MDIO bus", 0, NULL, 0);
-+      if (!pdev) {
-+              ret = -ENOMEM;
-+              goto err_pdev;
-       }
-+      fmb->mii_bus.id = 0;
-+      fmb->mii_bus.name = "Fixed MDIO Bus";
-+      fmb->mii_bus.dev = &pdev->dev;
-+      fmb->mii_bus.read = &fixed_mdio_read;
-+      fmb->mii_bus.write = &fixed_mdio_write;
-+      fmb->mii_bus.irq = fmb->irqs;
-+
-+      ret = mdiobus_register(&fmb->mii_bus);
-+      if (ret)
-+              goto err_mdiobus_reg;
-+
-       return 0;
-+
-+err_mdiobus_reg:
-+      platform_device_unregister(pdev);
-+err_pdev:
-+      return ret;
- }
-+module_init(fixed_mdio_bus_init);
--static void __exit fixed_exit(void)
-+static void __exit fixed_mdio_bus_exit(void)
- {
--      int i;
-+      struct fixed_mdio_bus *fmb = &platform_fmb;
-+      struct fixed_phy *fp;
--      phy_driver_unregister(&fixed_mdio_driver);
--      for (i=0; i < MAX_PHY_AMNT; i++)
--              if ( fixed_phy_ptrs[i] )
--                      device_unregister(&fixed_phy_ptrs[i]->phydev->dev);
-+      mdiobus_unregister(&fmb->mii_bus);
-+      platform_device_unregister(pdev);
-+
-+      list_for_each_entry(fp, &fmb->phys, node) {
-+              list_del(&fp->node);
-+              kfree(fp);
-+      }
- }
-+module_exit(fixed_mdio_bus_exit);
--module_init(fixed_init);
--module_exit(fixed_exit);
-+MODULE_DESCRIPTION("Fixed MDIO bus (MDIO bus emulation with fixed PHYs)");
-+MODULE_AUTHOR("Vitaly Bordug");
-+MODULE_LICENSE("GPL");
---- a/drivers/net/ps3_gelic_net.c
-+++ b/drivers/net/ps3_gelic_net.c
-@@ -58,11 +58,11 @@ static inline struct device *ctodev(stru
- {
-       return &card->dev->core;
- }
--static inline unsigned int bus_id(struct gelic_net_card *card)
-+static inline u64 bus_id(struct gelic_net_card *card)
- {
-       return card->dev->bus_id;
- }
--static inline unsigned int dev_id(struct gelic_net_card *card)
-+static inline u64 dev_id(struct gelic_net_card *card)
- {
-       return card->dev->dev_id;
- }
---- a/drivers/net/ucc_geth.c
-+++ b/drivers/net/ucc_geth.c
-@@ -3822,6 +3822,7 @@ static int ucc_geth_probe(struct of_devi
-       int err, ucc_num, max_speed = 0;
-       const phandle *ph;
-       const unsigned int *prop;
-+      const char *sprop;
-       const void *mac_addr;
-       phy_interface_t phy_interface;
-       static const int enet_to_speed[] = {
-@@ -3854,10 +3855,56 @@ static int ucc_geth_probe(struct of_devi
-       ug_info->uf_info.ucc_num = ucc_num;
--      prop = of_get_property(np, "rx-clock", NULL);
--      ug_info->uf_info.rx_clock = *prop;
--      prop = of_get_property(np, "tx-clock", NULL);
--      ug_info->uf_info.tx_clock = *prop;
-+      sprop = of_get_property(np, "rx-clock-name", NULL);
-+      if (sprop) {
-+              ug_info->uf_info.rx_clock = qe_clock_source(sprop);
-+              if ((ug_info->uf_info.rx_clock < QE_CLK_NONE) ||
-+                  (ug_info->uf_info.rx_clock > QE_CLK24)) {
-+                      printk(KERN_ERR
-+                              "ucc_geth: invalid rx-clock-name property\n");
-+                      return -EINVAL;
-+              }
-+      } else {
-+              prop = of_get_property(np, "rx-clock", NULL);
-+              if (!prop) {
-+                      /* If both rx-clock-name and rx-clock are missing,
-+                         we want to tell people to use rx-clock-name. */
-+                      printk(KERN_ERR
-+                              "ucc_geth: missing rx-clock-name property\n");
-+                      return -EINVAL;
-+              }
-+              if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
-+                      printk(KERN_ERR
-+                              "ucc_geth: invalid rx-clock propperty\n");
-+                      return -EINVAL;
-+              }
-+              ug_info->uf_info.rx_clock = *prop;
-+      }
-+
-+      sprop = of_get_property(np, "tx-clock-name", NULL);
-+      if (sprop) {
-+              ug_info->uf_info.tx_clock = qe_clock_source(sprop);
-+              if ((ug_info->uf_info.tx_clock < QE_CLK_NONE) ||
-+                  (ug_info->uf_info.tx_clock > QE_CLK24)) {
-+                      printk(KERN_ERR
-+                              "ucc_geth: invalid tx-clock-name property\n");
-+                      return -EINVAL;
-+              }
-+      } else {
-+              prop = of_get_property(np, "rx-clock", NULL);
-+              if (!prop) {
-+                      printk(KERN_ERR
-+                              "ucc_geth: mising tx-clock-name property\n");
-+                      return -EINVAL;
-+              }
-+              if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
-+                      printk(KERN_ERR
-+                              "ucc_geth: invalid tx-clock property\n");
-+                      return -EINVAL;
-+              }
-+              ug_info->uf_info.tx_clock = *prop;
-+      }
-+
-       err = of_address_to_resource(np, 0, &res);
-       if (err)
-               return -EINVAL;
---- a/drivers/of/base.c
-+++ b/drivers/of/base.c
-@@ -273,3 +273,61 @@ struct device_node *of_find_compatible_n
-       return np;
- }
- EXPORT_SYMBOL(of_find_compatible_node);
-+
-+/**
-+ * of_match_node - Tell if an device_node has a matching of_match structure
-+ *    @matches:       array of of device match structures to search in
-+ *    @node:          the of device structure to match against
-+ *
-+ *    Low level utility function used by device matching.
-+ */
-+const struct of_device_id *of_match_node(const struct of_device_id *matches,
-+                                       const struct device_node *node)
-+{
-+      while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
-+              int match = 1;
-+              if (matches->name[0])
-+                      match &= node->name
-+                              && !strcmp(matches->name, node->name);
-+              if (matches->type[0])
-+                      match &= node->type
-+                              && !strcmp(matches->type, node->type);
-+              if (matches->compatible[0])
-+                      match &= of_device_is_compatible(node,
-+                                              matches->compatible);
-+              if (match)
-+                      return matches;
-+              matches++;
-+      }
-+      return NULL;
-+}
-+EXPORT_SYMBOL(of_match_node);
-+
-+/**
-+ *    of_find_matching_node - Find a node based on an of_device_id match
-+ *                            table.
-+ *    @from:          The node to start searching from or NULL, the node
-+ *                    you pass will not be searched, only the next one
-+ *                    will; typically, you pass what the previous call
-+ *                    returned. of_node_put() will be called on it
-+ *    @matches:       array of of device match structures to search in
-+ *
-+ *    Returns a node pointer with refcount incremented, use
-+ *    of_node_put() on it when done.
-+ */
-+struct device_node *of_find_matching_node(struct device_node *from,
-+                                        const struct of_device_id *matches)
-+{
-+      struct device_node *np;
-+
-+      read_lock(&devtree_lock);
-+      np = from ? from->allnext : allnodes;
-+      for (; np; np = np->allnext) {
-+              if (of_match_node(matches, np) && of_node_get(np))
-+                      break;
-+      }
-+      of_node_put(from);
-+      read_unlock(&devtree_lock);
-+      return np;
-+}
-+EXPORT_SYMBOL(of_find_matching_node);
---- a/drivers/of/device.c
-+++ b/drivers/of/device.c
-@@ -10,35 +10,6 @@
- #include <asm/errno.h>
- /**
-- * of_match_node - Tell if an device_node has a matching of_match structure
-- * @ids: array of of device match structures to search in
-- * @node: the of device structure to match against
-- *
-- * Low level utility function used by device matching.
-- */
--const struct of_device_id *of_match_node(const struct of_device_id *matches,
--                                       const struct device_node *node)
--{
--      while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
--              int match = 1;
--              if (matches->name[0])
--                      match &= node->name
--                              && !strcmp(matches->name, node->name);
--              if (matches->type[0])
--                      match &= node->type
--                              && !strcmp(matches->type, node->type);
--              if (matches->compatible[0])
--                      match &= of_device_is_compatible(node,
--                                              matches->compatible);
--              if (match)
--                      return matches;
--              matches++;
--      }
--      return NULL;
--}
--EXPORT_SYMBOL(of_match_node);
--
--/**
-  * of_match_device - Tell if an of_device structure has a matching
-  * of_match structure
-  * @ids: array of of device match structures to search in
---- a/drivers/ps3/Makefile
-+++ b/drivers/ps3/Makefile
-@@ -4,3 +4,4 @@ ps3av_mod-objs         += ps3av.o ps3av_cmd.o
- obj-$(CONFIG_PPC_PS3) += sys-manager-core.o
- obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o
- obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o
-+obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
---- /dev/null
-+++ b/drivers/ps3/ps3-lpm.c
-@@ -0,0 +1,1248 @@
-+/*
-+ * PS3 Logical Performance Monitor.
-+ *
-+ *  Copyright (C) 2007 Sony Computer Entertainment Inc.
-+ *  Copyright 2007 Sony Corp.
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; version 2 of the License.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You 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/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/uaccess.h>
-+#include <asm/ps3.h>
-+#include <asm/lv1call.h>
-+#include <asm/cell-pmu.h>
-+
-+
-+/* BOOKMARK tag macros */
-+#define PS3_PM_BOOKMARK_START                    0x8000000000000000ULL
-+#define PS3_PM_BOOKMARK_STOP                     0x4000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_KERNEL               0x1000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_USER                 0x3000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_MASK_HI              0xF000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_MASK_LO              0x0F00000000000000ULL
-+
-+/* CBE PM CONTROL register macros */
-+#define PS3_PM_CONTROL_PPU_TH0_BOOKMARK          0x00001000
-+#define PS3_PM_CONTROL_PPU_TH1_BOOKMARK          0x00000800
-+#define PS3_PM_CONTROL_PPU_COUNT_MODE_MASK       0x000C0000
-+#define PS3_PM_CONTROL_PPU_COUNT_MODE_PROBLEM    0x00080000
-+#define PS3_WRITE_PM_MASK                        0xFFFFFFFFFFFFFFFFULL
-+
-+/* CBE PM START STOP register macros */
-+#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START 0x02000000
-+#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START 0x01000000
-+#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP  0x00020000
-+#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP  0x00010000
-+#define PS3_PM_START_STOP_START_MASK             0xFF000000
-+#define PS3_PM_START_STOP_STOP_MASK              0x00FF0000
-+
-+/* CBE PM COUNTER register macres */
-+#define PS3_PM_COUNTER_MASK_HI                   0xFFFFFFFF00000000ULL
-+#define PS3_PM_COUNTER_MASK_LO                   0x00000000FFFFFFFFULL
-+
-+/* BASE SIGNAL GROUP NUMBER macros */
-+#define PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER  0
-+#define PM_ISLAND2_SIGNAL_GROUP_NUMBER1      6
-+#define PM_ISLAND2_SIGNAL_GROUP_NUMBER2      7
-+#define PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER  7
-+#define PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER  15
-+#define PM_SPU_TRIGGER_SIGNAL_GROUP_NUMBER   17
-+#define PM_SPU_EVENT_SIGNAL_GROUP_NUMBER     18
-+#define PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER  18
-+#define PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER  24
-+#define PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER  49
-+#define PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER  52
-+#define PM_SIG_GROUP_SPU                     41
-+#define PM_SIG_GROUP_SPU_TRIGGER             42
-+#define PM_SIG_GROUP_SPU_EVENT               43
-+#define PM_SIG_GROUP_MFC_MAX                 60
-+
-+/**
-+ * struct ps3_lpm_shadow_regs - Performance monitor shadow registers.
-+ *
-+ * @pm_control: Shadow of the processor's pm_control register.
-+ * @pm_start_stop: Shadow of the processor's pm_start_stop register.
-+ * @pm_interval: Shadow of the processor's pm_interval register.
-+ * @group_control: Shadow of the processor's group_control register.
-+ * @debug_bus_control: Shadow of the processor's debug_bus_control register.
-+ *
-+ * The logical performance monitor provides a write-only interface to
-+ * these processor registers.  These shadow variables cache the processor
-+ * register values for reading.
-+ *
-+ * The initial value of the shadow registers at lpm creation is
-+ * PS3_LPM_SHADOW_REG_INIT.
-+ */
-+
-+struct ps3_lpm_shadow_regs {
-+      u64 pm_control;
-+      u64 pm_start_stop;
-+      u64 pm_interval;
-+      u64 group_control;
-+      u64 debug_bus_control;
-+};
-+
-+#define PS3_LPM_SHADOW_REG_INIT 0xFFFFFFFF00000000ULL
-+
-+/**
-+ * struct ps3_lpm_priv - Private lpm device data.
-+ *
-+ * @open: An atomic variable indicating the lpm driver has been opened.
-+ * @rights: The lpm rigths granted by the system policy module.  A logical
-+ *  OR of enum ps3_lpm_rights.
-+ * @node_id: The node id of a BE prosessor whose performance monitor this
-+ *  lpar has the right to use.
-+ * @pu_id: The lv1 id of the logical PU.
-+ * @lpm_id: The lv1 id of this lpm instance.
-+ * @outlet_id: The outlet created by lv1 for this lpm instance.
-+ * @tb_count: The number of bytes of data held in the lv1 trace buffer.
-+ * @tb_cache: Kernel buffer to receive the data from the lv1 trace buffer.
-+ *  Must be 128 byte aligned.
-+ * @tb_cache_size: Size of the kernel @tb_cache buffer.  Must be 128 byte
-+ *  aligned.
-+ * @tb_cache_internal: An unaligned buffer allocated by this driver to be
-+ *  used for the trace buffer cache when ps3_lpm_open() is called with a
-+ *  NULL tb_cache argument.  Otherwise unused.
-+ * @shadow: Processor register shadow of type struct ps3_lpm_shadow_regs.
-+ * @sbd: The struct ps3_system_bus_device attached to this driver.
-+ *
-+ * The trace buffer is a buffer allocated and used internally to the lv1
-+ * hypervisor to collect trace data.  The trace buffer cache is a guest
-+ * buffer that accepts the trace data from the trace buffer.
-+ */
-+
-+struct ps3_lpm_priv {
-+      atomic_t open;
-+      u64 rights;
-+      u64 node_id;
-+      u64 pu_id;
-+      u64 lpm_id;
-+      u64 outlet_id;
-+      u64 tb_count;
-+      void *tb_cache;
-+      u64 tb_cache_size;
-+      void *tb_cache_internal;
-+      struct ps3_lpm_shadow_regs shadow;
-+      struct ps3_system_bus_device *sbd;
-+};
-+
-+enum {
-+      PS3_LPM_DEFAULT_TB_CACHE_SIZE = 0x4000,
-+};
-+
-+/**
-+ * lpm_priv - Static instance of the lpm data.
-+ *
-+ * Since the exported routines don't support the notion of a device
-+ * instance we need to hold the instance in this static variable
-+ * and then only allow at most one instance at a time to be created.
-+ */
-+
-+static struct ps3_lpm_priv *lpm_priv;
-+
-+static struct device *sbd_core(void)
-+{
-+      BUG_ON(!lpm_priv || !lpm_priv->sbd);
-+      return &lpm_priv->sbd->core;
-+}
-+
-+/**
-+ * use_start_stop_bookmark - Enable the PPU bookmark trace.
-+ *
-+ * And it enables PPU bookmark triggers ONLY if the other triggers are not set.
-+ * The start/stop bookmarks are inserted at ps3_enable_pm() and ps3_disable_pm()
-+ * to start/stop LPM.
-+ *
-+ * Used to get good quality of the performance counter.
-+ */
-+
-+enum {use_start_stop_bookmark = 1,};
-+
-+void ps3_set_bookmark(u64 bookmark)
-+{
-+      /*
-+       * As per the PPE book IV, to avoid bookmark loss there must
-+       * not be a traced branch within 10 cycles of setting the
-+       * SPRN_BKMK register.  The actual text is unclear if 'within'
-+       * includes cycles before the call.
-+       */
-+
-+      asm volatile("or 29, 29, 29;"); /* db10cyc */
-+      mtspr(SPRN_BKMK, bookmark);
-+      asm volatile("or 29, 29, 29;"); /* db10cyc */
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_bookmark);
-+
-+void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id)
-+{
-+      u64 bookmark;
-+
-+      bookmark = (get_tb() & 0x00000000FFFFFFFFULL) |
-+              PS3_PM_BOOKMARK_TAG_KERNEL;
-+      bookmark = ((tag << 56) & PS3_PM_BOOKMARK_TAG_MASK_LO) |
-+              (incident << 48) | (th_id << 32) | bookmark;
-+      ps3_set_bookmark(bookmark);
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_pm_bookmark);
-+
-+/**
-+ * ps3_read_phys_ctr - Read physical counter registers.
-+ *
-+ * Each physical counter can act as one 32 bit counter or as two 16 bit
-+ * counters.
-+ */
-+
-+u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr)
-+{
-+      int result;
-+      u64 counter0415;
-+      u64 counter2637;
-+
-+      if (phys_ctr >= NR_PHYS_CTRS) {
-+              dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+                      __LINE__, phys_ctr);
-+              return 0;
-+      }
-+
-+      result = lv1_set_lpm_counter(lpm_priv->lpm_id, 0, 0, 0, 0, &counter0415,
-+                                   &counter2637);
-+      if (result) {
-+              dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
-+                      "phys_ctr %u, %s\n", __func__, __LINE__, phys_ctr,
-+                      ps3_result(result));
-+              return 0;
-+      }
-+
-+      switch (phys_ctr) {
-+      case 0:
-+              return counter0415 >> 32;
-+      case 1:
-+              return counter0415 & PS3_PM_COUNTER_MASK_LO;
-+      case 2:
-+              return counter2637 >> 32;
-+      case 3:
-+              return counter2637 & PS3_PM_COUNTER_MASK_LO;
-+      default:
-+              BUG();
-+      }
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_phys_ctr);
-+
-+/**
-+ * ps3_write_phys_ctr - Write physical counter registers.
-+ *
-+ * Each physical counter can act as one 32 bit counter or as two 16 bit
-+ * counters.
-+ */
-+
-+void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val)
-+{
-+      u64 counter0415;
-+      u64 counter0415_mask;
-+      u64 counter2637;
-+      u64 counter2637_mask;
-+      int result;
-+
-+      if (phys_ctr >= NR_PHYS_CTRS) {
-+              dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+                      __LINE__, phys_ctr);
-+              return;
-+      }
-+
-+      switch (phys_ctr) {
-+      case 0:
-+              counter0415 = (u64)val << 32;
-+              counter0415_mask = PS3_PM_COUNTER_MASK_HI;
-+              counter2637 = 0x0;
-+              counter2637_mask = 0x0;
-+              break;
-+      case 1:
-+              counter0415 = (u64)val;
-+              counter0415_mask = PS3_PM_COUNTER_MASK_LO;
-+              counter2637 = 0x0;
-+              counter2637_mask = 0x0;
-+              break;
-+      case 2:
-+              counter0415 = 0x0;
-+              counter0415_mask = 0x0;
-+              counter2637 = (u64)val << 32;
-+              counter2637_mask = PS3_PM_COUNTER_MASK_HI;
-+              break;
-+      case 3:
-+              counter0415 = 0x0;
-+              counter0415_mask = 0x0;
-+              counter2637 = (u64)val;
-+              counter2637_mask = PS3_PM_COUNTER_MASK_LO;
-+              break;
-+      default:
-+              BUG();
-+      }
-+
-+      result = lv1_set_lpm_counter(lpm_priv->lpm_id,
-+                                   counter0415, counter0415_mask,
-+                                   counter2637, counter2637_mask,
-+                                   &counter0415, &counter2637);
-+      if (result)
-+              dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
-+                      "phys_ctr %u, val %u, %s\n", __func__, __LINE__,
-+                      phys_ctr, val, ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_phys_ctr);
-+
-+/**
-+ * ps3_read_ctr - Read counter.
-+ *
-+ * Read 16 or 32 bits depending on the current size of the counter.
-+ * Counters 4, 5, 6 & 7 are always 16 bit.
-+ */
-+
-+u32 ps3_read_ctr(u32 cpu, u32 ctr)
-+{
-+      u32 val;
-+      u32 phys_ctr = ctr & (NR_PHYS_CTRS - 1);
-+
-+      val = ps3_read_phys_ctr(cpu, phys_ctr);
-+
-+      if (ps3_get_ctr_size(cpu, phys_ctr) == 16)
-+              val = (ctr < NR_PHYS_CTRS) ? (val >> 16) : (val & 0xffff);
-+
-+      return val;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_ctr);
-+
-+/**
-+ * ps3_write_ctr - Write counter.
-+ *
-+ * Write 16 or 32 bits depending on the current size of the counter.
-+ * Counters 4, 5, 6 & 7 are always 16 bit.
-+ */
-+
-+void ps3_write_ctr(u32 cpu, u32 ctr, u32 val)
-+{
-+      u32 phys_ctr;
-+      u32 phys_val;
-+
-+      phys_ctr = ctr & (NR_PHYS_CTRS - 1);
-+
-+      if (ps3_get_ctr_size(cpu, phys_ctr) == 16) {
-+              phys_val = ps3_read_phys_ctr(cpu, phys_ctr);
-+
-+              if (ctr < NR_PHYS_CTRS)
-+                      val = (val << 16) | (phys_val & 0xffff);
-+              else
-+                      val = (val & 0xffff) | (phys_val & 0xffff0000);
-+      }
-+
-+      ps3_write_phys_ctr(cpu, phys_ctr, val);
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_ctr);
-+
-+/**
-+ * ps3_read_pm07_control - Read counter control registers.
-+ *
-+ * Each logical counter has a corresponding control register.
-+ */
-+
-+u32 ps3_read_pm07_control(u32 cpu, u32 ctr)
-+{
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_pm07_control);
-+
-+/**
-+ * ps3_write_pm07_control - Write counter control registers.
-+ *
-+ * Each logical counter has a corresponding control register.
-+ */
-+
-+void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val)
-+{
-+      int result;
-+      static const u64 mask = 0xFFFFFFFFFFFFFFFFULL;
-+      u64 old_value;
-+
-+      if (ctr >= NR_CTRS) {
-+              dev_dbg(sbd_core(), "%s:%u: ctr too big: %u\n", __func__,
-+                      __LINE__, ctr);
-+              return;
-+      }
-+
-+      result = lv1_set_lpm_counter_control(lpm_priv->lpm_id, ctr, val, mask,
-+                                           &old_value);
-+      if (result)
-+              dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter_control "
-+                      "failed: ctr %u, %s\n", __func__, __LINE__, ctr,
-+                      ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_pm07_control);
-+
-+/**
-+ * ps3_read_pm - Read Other LPM control registers.
-+ */
-+
-+u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg)
-+{
-+      int result = 0;
-+      u64 val = 0;
-+
-+      switch (reg) {
-+      case pm_control:
-+              return lpm_priv->shadow.pm_control;
-+      case trace_address:
-+              return CBE_PM_TRACE_BUF_EMPTY;
-+      case pm_start_stop:
-+              return lpm_priv->shadow.pm_start_stop;
-+      case pm_interval:
-+              return lpm_priv->shadow.pm_interval;
-+      case group_control:
-+              return lpm_priv->shadow.group_control;
-+      case debug_bus_control:
-+              return lpm_priv->shadow.debug_bus_control;
-+      case pm_status:
-+              result = lv1_get_lpm_interrupt_status(lpm_priv->lpm_id,
-+                                                    &val);
-+              if (result) {
-+                      val = 0;
-+                      dev_dbg(sbd_core(), "%s:%u: lv1 get_lpm_status failed: "
-+                              "reg %u, %s\n", __func__, __LINE__, reg,
-+                              ps3_result(result));
-+              }
-+              return (u32)val;
-+      case ext_tr_timer:
-+              return 0;
-+      default:
-+              dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
-+                      __LINE__, reg);
-+              BUG();
-+              break;
-+      }
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_pm);
-+
-+/**
-+ * ps3_write_pm - Write Other LPM control registers.
-+ */
-+
-+void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val)
-+{
-+      int result = 0;
-+      u64 dummy;
-+
-+      switch (reg) {
-+      case group_control:
-+              if (val != lpm_priv->shadow.group_control)
-+                      result = lv1_set_lpm_group_control(lpm_priv->lpm_id,
-+                                                         val,
-+                                                         PS3_WRITE_PM_MASK,
-+                                                         &dummy);
-+              lpm_priv->shadow.group_control = val;
-+              break;
-+      case debug_bus_control:
-+              if (val != lpm_priv->shadow.debug_bus_control)
-+                      result = lv1_set_lpm_debug_bus_control(lpm_priv->lpm_id,
-+                                                            val,
-+                                                            PS3_WRITE_PM_MASK,
-+                                                            &dummy);
-+              lpm_priv->shadow.debug_bus_control = val;
-+              break;
-+      case pm_control:
-+              if (use_start_stop_bookmark)
-+                      val |= (PS3_PM_CONTROL_PPU_TH0_BOOKMARK |
-+                              PS3_PM_CONTROL_PPU_TH1_BOOKMARK);
-+              if (val != lpm_priv->shadow.pm_control)
-+                      result = lv1_set_lpm_general_control(lpm_priv->lpm_id,
-+                                                           val,
-+                                                           PS3_WRITE_PM_MASK,
-+                                                           0, 0, &dummy,
-+                                                           &dummy);
-+              lpm_priv->shadow.pm_control = val;
-+              break;
-+      case pm_interval:
-+              if (val != lpm_priv->shadow.pm_interval)
-+                      result = lv1_set_lpm_interval(lpm_priv->lpm_id, val,
-+                                                 PS3_WRITE_PM_MASK, &dummy);
-+              lpm_priv->shadow.pm_interval = val;
-+              break;
-+      case pm_start_stop:
-+              if (val != lpm_priv->shadow.pm_start_stop)
-+                      result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
-+                                                           val,
-+                                                           PS3_WRITE_PM_MASK,
-+                                                           &dummy);
-+              lpm_priv->shadow.pm_start_stop = val;
-+              break;
-+      case trace_address:
-+      case ext_tr_timer:
-+      case pm_status:
-+              break;
-+      default:
-+              dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
-+                      __LINE__, reg);
-+              BUG();
-+              break;
-+      }
-+
-+      if (result)
-+              dev_err(sbd_core(), "%s:%u: lv1 set_control failed: "
-+                      "reg %u, %s\n", __func__, __LINE__, reg,
-+                      ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_pm);
-+
-+/**
-+ * ps3_get_ctr_size - Get the size of a physical counter.
-+ *
-+ * Returns either 16 or 32.
-+ */
-+
-+u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr)
-+{
-+      u32 pm_ctrl;
-+
-+      if (phys_ctr >= NR_PHYS_CTRS) {
-+              dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+                      __LINE__, phys_ctr);
-+              return 0;
-+      }
-+
-+      pm_ctrl = ps3_read_pm(cpu, pm_control);
-+      return (pm_ctrl & CBE_PM_16BIT_CTR(phys_ctr)) ? 16 : 32;
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_ctr_size);
-+
-+/**
-+ * ps3_set_ctr_size - Set the size of a physical counter to 16 or 32 bits.
-+ */
-+
-+void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size)
-+{
-+      u32 pm_ctrl;
-+
-+      if (phys_ctr >= NR_PHYS_CTRS) {
-+              dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+                      __LINE__, phys_ctr);
-+              return;
-+      }
-+
-+      pm_ctrl = ps3_read_pm(cpu, pm_control);
-+
-+      switch (ctr_size) {
-+      case 16:
-+              pm_ctrl |= CBE_PM_16BIT_CTR(phys_ctr);
-+              ps3_write_pm(cpu, pm_control, pm_ctrl);
-+              break;
-+
-+      case 32:
-+              pm_ctrl &= ~CBE_PM_16BIT_CTR(phys_ctr);
-+              ps3_write_pm(cpu, pm_control, pm_ctrl);
-+              break;
-+      default:
-+              BUG();
-+      }
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_ctr_size);
-+
-+static u64 pm_translate_signal_group_number_on_island2(u64 subgroup)
-+{
-+
-+      if (subgroup == 2)
-+              subgroup = 3;
-+
-+      if (subgroup <= 6)
-+              return PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+      else if (subgroup == 7)
-+              return PM_ISLAND2_SIGNAL_GROUP_NUMBER1;
-+      else
-+              return PM_ISLAND2_SIGNAL_GROUP_NUMBER2;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island3(u64 subgroup)
-+{
-+
-+      switch (subgroup) {
-+      case 2:
-+      case 3:
-+      case 4:
-+              subgroup += 2;
-+              break;
-+      case 5:
-+              subgroup = 8;
-+              break;
-+      default:
-+              break;
-+      }
-+      return PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island4(u64 subgroup)
-+{
-+      return PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island5(u64 subgroup)
-+{
-+
-+      switch (subgroup) {
-+      case 3:
-+              subgroup = 4;
-+              break;
-+      case 4:
-+              subgroup = 6;
-+              break;
-+      default:
-+              break;
-+      }
-+      return PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island6(u64 subgroup,
-+                                                     u64 subsubgroup)
-+{
-+      switch (subgroup) {
-+      case 3:
-+      case 4:
-+      case 5:
-+              subgroup += 1;
-+              break;
-+      default:
-+              break;
-+      }
-+
-+      switch (subsubgroup) {
-+      case 4:
-+      case 5:
-+      case 6:
-+              subsubgroup += 2;
-+              break;
-+      case 7:
-+      case 8:
-+      case 9:
-+      case 10:
-+              subsubgroup += 4;
-+              break;
-+      case 11:
-+      case 12:
-+      case 13:
-+              subsubgroup += 5;
-+              break;
-+      default:
-+              break;
-+      }
-+
-+      if (subgroup <= 5)
-+              return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup);
-+      else
-+              return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup
-+                      + subsubgroup - 1);
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island7(u64 subgroup)
-+{
-+      return PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island8(u64 subgroup)
-+{
-+      return PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_signal_group_to_ps3_lv1_signal_group(u64 group)
-+{
-+      u64 island;
-+      u64 subgroup;
-+      u64 subsubgroup;
-+
-+      subgroup = 0;
-+      subsubgroup = 0;
-+      island = 0;
-+      if (group < 1000) {
-+              if (group < 100) {
-+                      if (20 <= group && group < 30) {
-+                              island = 2;
-+                              subgroup = group - 20;
-+                      } else if (30 <= group && group < 40) {
-+                              island = 3;
-+                              subgroup = group - 30;
-+                      } else if (40 <= group && group < 50) {
-+                              island = 4;
-+                              subgroup = group - 40;
-+                      } else if (50 <= group && group < 60) {
-+                              island = 5;
-+                              subgroup = group - 50;
-+                      } else if (60 <= group && group < 70) {
-+                              island = 6;
-+                              subgroup = group - 60;
-+                      } else if (70 <= group && group < 80) {
-+                              island = 7;
-+                              subgroup = group - 70;
-+                      } else if (80 <= group && group < 90) {
-+                              island = 8;
-+                              subgroup = group - 80;
-+                      }
-+              } else if (200 <= group && group < 300) {
-+                      island = 2;
-+                      subgroup = group - 200;
-+              } else if (600 <= group && group < 700) {
-+                      island = 6;
-+                      subgroup = 5;
-+                      subsubgroup = group - 650;
-+              }
-+      } else if (6000 <= group && group < 7000) {
-+              island = 6;
-+              subgroup = 5;
-+              subsubgroup = group - 6500;
-+      }
-+
-+      switch (island) {
-+      case 2:
-+              return pm_translate_signal_group_number_on_island2(subgroup);
-+      case 3:
-+              return pm_translate_signal_group_number_on_island3(subgroup);
-+      case 4:
-+              return pm_translate_signal_group_number_on_island4(subgroup);
-+      case 5:
-+              return pm_translate_signal_group_number_on_island5(subgroup);
-+      case 6:
-+              return pm_translate_signal_group_number_on_island6(subgroup,
-+                                                                 subsubgroup);
-+      case 7:
-+              return pm_translate_signal_group_number_on_island7(subgroup);
-+      case 8:
-+              return pm_translate_signal_group_number_on_island8(subgroup);
-+      default:
-+              dev_dbg(sbd_core(), "%s:%u: island not found: %lu\n", __func__,
-+                      __LINE__, group);
-+              BUG();
-+              break;
-+      }
-+      return 0;
-+}
-+
-+static u64 pm_bus_word_to_ps3_lv1_bus_word(u8 word)
-+{
-+
-+      switch (word) {
-+      case 1:
-+              return 0xF000;
-+      case 2:
-+              return 0x0F00;
-+      case 4:
-+              return 0x00F0;
-+      case 8:
-+      default:
-+              return 0x000F;
-+      }
-+}
-+
-+static int __ps3_set_signal(u64 lv1_signal_group, u64 bus_select,
-+                          u64 signal_select, u64 attr1, u64 attr2, u64 attr3)
-+{
-+      int ret;
-+
-+      ret = lv1_set_lpm_signal(lpm_priv->lpm_id, lv1_signal_group, bus_select,
-+                               signal_select, attr1, attr2, attr3);
-+      if (ret)
-+              dev_err(sbd_core(),
-+                      "%s:%u: error:%d 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
-+                      __func__, __LINE__, ret, lv1_signal_group, bus_select,
-+                      signal_select, attr1, attr2, attr3);
-+
-+      return ret;
-+}
-+
-+int ps3_set_signal(u64 signal_group, u8 signal_bit, u16 sub_unit,
-+                 u8 bus_word)
-+{
-+      int ret;
-+      u64 lv1_signal_group;
-+      u64 bus_select;
-+      u64 signal_select;
-+      u64 attr1, attr2, attr3;
-+
-+      if (signal_group == 0)
-+              return __ps3_set_signal(0, 0, 0, 0, 0, 0);
-+
-+      lv1_signal_group =
-+              pm_signal_group_to_ps3_lv1_signal_group(signal_group);
-+      bus_select = pm_bus_word_to_ps3_lv1_bus_word(bus_word);
-+
-+      switch (signal_group) {
-+      case PM_SIG_GROUP_SPU_TRIGGER:
-+              signal_select = 1;
-+              signal_select = signal_select << (63 - signal_bit);
-+              break;
-+      case PM_SIG_GROUP_SPU_EVENT:
-+              signal_select = 1;
-+              signal_select = (signal_select << (63 - signal_bit)) | 0x3;
-+              break;
-+      default:
-+              signal_select = 0;
-+              break;
-+      }
-+
-+      /*
-+       * 0: physical object.
-+       * 1: logical object.
-+       * This parameter is only used for the PPE and SPE signals.
-+       */
-+      attr1 = 1;
-+
-+      /*
-+       * This parameter is used to specify the target physical/logical
-+       * PPE/SPE object.
-+       */
-+      if (PM_SIG_GROUP_SPU <= signal_group &&
-+              signal_group < PM_SIG_GROUP_MFC_MAX)
-+              attr2 = sub_unit;
-+      else
-+              attr2 = lpm_priv->pu_id;
-+
-+      /*
-+       * This parameter is only used for setting the SPE signal.
-+       */
-+      attr3 = 0;
-+
-+      ret = __ps3_set_signal(lv1_signal_group, bus_select, signal_select,
-+                             attr1, attr2, attr3);
-+      if (ret)
-+              dev_err(sbd_core(), "%s:%u: __ps3_set_signal failed: %d\n",
-+                      __func__, __LINE__, ret);
-+
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_signal);
-+
-+u32 ps3_get_hw_thread_id(int cpu)
-+{
-+      return get_hard_smp_processor_id(cpu);
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_hw_thread_id);
-+
-+/**
-+ * ps3_enable_pm - Enable the entire performance monitoring unit.
-+ *
-+ * When we enable the LPM, all pending writes to counters get committed.
-+ */
-+
-+void ps3_enable_pm(u32 cpu)
-+{
-+      int result;
-+      u64 tmp;
-+      int insert_bookmark = 0;
-+
-+      lpm_priv->tb_count = 0;
-+
-+      if (use_start_stop_bookmark) {
-+              if (!(lpm_priv->shadow.pm_start_stop &
-+                      (PS3_PM_START_STOP_START_MASK
-+                      | PS3_PM_START_STOP_STOP_MASK))) {
-+                      result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
-+                              (PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START |
-+                              PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START |
-+                              PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP |
-+                              PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP),
-+                              0xFFFFFFFFFFFFFFFFULL, &tmp);
-+
-+                      if (result)
-+                              dev_err(sbd_core(), "%s:%u: "
-+                                      "lv1_set_lpm_trigger_control failed: "
-+                                      "%s\n", __func__, __LINE__,
-+                                      ps3_result(result));
-+
-+                      insert_bookmark = !result;
-+              }
-+      }
-+
-+      result = lv1_start_lpm(lpm_priv->lpm_id);
-+
-+      if (result)
-+              dev_err(sbd_core(), "%s:%u: lv1_start_lpm failed: %s\n",
-+                      __func__, __LINE__, ps3_result(result));
-+
-+      if (use_start_stop_bookmark && !result && insert_bookmark)
-+              ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_START);
-+}
-+EXPORT_SYMBOL_GPL(ps3_enable_pm);
-+
-+/**
-+ * ps3_disable_pm - Disable the entire performance monitoring unit.
-+ */
-+
-+void ps3_disable_pm(u32 cpu)
-+{
-+      int result;
-+      u64 tmp;
-+
-+      ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_STOP);
-+
-+      result = lv1_stop_lpm(lpm_priv->lpm_id, &tmp);
-+
-+      if (result) {
-+              if(result != LV1_WRONG_STATE)
-+                      dev_err(sbd_core(), "%s:%u: lv1_stop_lpm failed: %s\n",
-+                              __func__, __LINE__, ps3_result(result));
-+              return;
-+      }
-+
-+      lpm_priv->tb_count = tmp;
-+
-+      dev_dbg(sbd_core(), "%s:%u: tb_count %lu (%lxh)\n", __func__, __LINE__,
-+              lpm_priv->tb_count, lpm_priv->tb_count);
-+}
-+EXPORT_SYMBOL_GPL(ps3_disable_pm);
-+
-+/**
-+ * ps3_lpm_copy_tb - Copy data from the trace buffer to a kernel buffer.
-+ * @offset: Offset in bytes from the start of the trace buffer.
-+ * @buf: Copy destination.
-+ * @count: Maximum count of bytes to copy.
-+ * @bytes_copied: Pointer to a variable that will recieve the number of
-+ *  bytes copied to @buf.
-+ *
-+ * On error @buf will contain any successfully copied trace buffer data
-+ * and bytes_copied will be set to the number of bytes successfully copied.
-+ */
-+
-+int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
-+                  unsigned long *bytes_copied)
-+{
-+      int result;
-+
-+      *bytes_copied = 0;
-+
-+      if (!lpm_priv->tb_cache)
-+              return -EPERM;
-+
-+      if (offset >= lpm_priv->tb_count)
-+              return 0;
-+
-+      count = min(count, lpm_priv->tb_count - offset);
-+
-+      while (*bytes_copied < count) {
-+              const unsigned long request = count - *bytes_copied;
-+              u64 tmp;
-+
-+              result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
-+                                                 request, &tmp);
-+              if (result) {
-+                      dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
-+                              __func__, __LINE__, request, offset);
-+
-+                      dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
-+                              "failed: %s\n", __func__, __LINE__,
-+                              ps3_result(result));
-+                      return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
-+              }
-+
-+              memcpy(buf, lpm_priv->tb_cache, tmp);
-+              buf += tmp;
-+              *bytes_copied += tmp;
-+              offset += tmp;
-+      }
-+      dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
-+              *bytes_copied);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb);
-+
-+/**
-+ * ps3_lpm_copy_tb_to_user - Copy data from the trace buffer to a user buffer.
-+ * @offset: Offset in bytes from the start of the trace buffer.
-+ * @buf: A __user copy destination.
-+ * @count: Maximum count of bytes to copy.
-+ * @bytes_copied: Pointer to a variable that will recieve the number of
-+ *  bytes copied to @buf.
-+ *
-+ * On error @buf will contain any successfully copied trace buffer data
-+ * and bytes_copied will be set to the number of bytes successfully copied.
-+ */
-+
-+int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
-+                          unsigned long count, unsigned long *bytes_copied)
-+{
-+      int result;
-+
-+      *bytes_copied = 0;
-+
-+      if (!lpm_priv->tb_cache)
-+              return -EPERM;
-+
-+      if (offset >= lpm_priv->tb_count)
-+              return 0;
-+
-+      count = min(count, lpm_priv->tb_count - offset);
-+
-+      while (*bytes_copied < count) {
-+              const unsigned long request = count - *bytes_copied;
-+              u64 tmp;
-+
-+              result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
-+                                                 request, &tmp);
-+              if (result) {
-+                      dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
-+                              __func__, __LINE__, request, offset);
-+                      dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
-+                              "failed: %s\n", __func__, __LINE__,
-+                              ps3_result(result));
-+                      return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
-+              }
-+
-+              result = copy_to_user(buf, lpm_priv->tb_cache, tmp);
-+
-+              if (result) {
-+                      dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%p\n",
-+                              __func__, __LINE__, tmp, buf);
-+                      dev_err(sbd_core(), "%s:%u: copy_to_user failed: %d\n",
-+                              __func__, __LINE__, result);
-+                      return -EFAULT;
-+              }
-+
-+              buf += tmp;
-+              *bytes_copied += tmp;
-+              offset += tmp;
-+      }
-+      dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
-+              *bytes_copied);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb_to_user);
-+
-+/**
-+ * ps3_get_and_clear_pm_interrupts -
-+ *
-+ * Clearing interrupts for the entire performance monitoring unit.
-+ * Reading pm_status clears the interrupt bits.
-+ */
-+
-+u32 ps3_get_and_clear_pm_interrupts(u32 cpu)
-+{
-+      return ps3_read_pm(cpu, pm_status);
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_and_clear_pm_interrupts);
-+
-+/**
-+ * ps3_enable_pm_interrupts -
-+ *
-+ * Enabling interrupts for the entire performance monitoring unit.
-+ * Enables the interrupt bits in the pm_status register.
-+ */
-+
-+void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
-+{
-+      if (mask)
-+              ps3_write_pm(cpu, pm_status, mask);
-+}
-+EXPORT_SYMBOL_GPL(ps3_enable_pm_interrupts);
-+
-+/**
-+ * ps3_enable_pm_interrupts -
-+ *
-+ * Disabling interrupts for the entire performance monitoring unit.
-+ */
-+
-+void ps3_disable_pm_interrupts(u32 cpu)
-+{
-+      ps3_get_and_clear_pm_interrupts(cpu);
-+      ps3_write_pm(cpu, pm_status, 0);
-+}
-+EXPORT_SYMBOL_GPL(ps3_disable_pm_interrupts);
-+
-+/**
-+ * ps3_lpm_open - Open the logical performance monitor device.
-+ * @tb_type: Specifies the type of trace buffer lv1 sould use for this lpm
-+ *  instance, specified by one of enum ps3_lpm_tb_type.
-+ * @tb_cache: Optional user supplied buffer to use as the trace buffer cache.
-+ *  If NULL, the driver will allocate and manage an internal buffer.
-+ *  Unused when when @tb_type is PS3_LPM_TB_TYPE_NONE.
-+ * @tb_cache_size: The size in bytes of the user supplied @tb_cache buffer.
-+ *  Unused when @tb_cache is NULL or @tb_type is PS3_LPM_TB_TYPE_NONE.
-+ */
-+
-+int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
-+      u64 tb_cache_size)
-+{
-+      int result;
-+      u64 tb_size;
-+
-+      BUG_ON(!lpm_priv);
-+      BUG_ON(tb_type != PS3_LPM_TB_TYPE_NONE
-+              && tb_type != PS3_LPM_TB_TYPE_INTERNAL);
-+
-+      if (tb_type == PS3_LPM_TB_TYPE_NONE && tb_cache)
-+              dev_dbg(sbd_core(), "%s:%u: bad in vals\n", __func__, __LINE__);
-+
-+      if (!atomic_add_unless(&lpm_priv->open, 1, 1)) {
-+              dev_dbg(sbd_core(), "%s:%u: busy\n", __func__, __LINE__);
-+              return -EBUSY;
-+      }
-+
-+      /* Note tb_cache needs 128 byte alignment. */
-+
-+      if (tb_type == PS3_LPM_TB_TYPE_NONE) {
-+              lpm_priv->tb_cache_size = 0;
-+              lpm_priv->tb_cache_internal = NULL;
-+              lpm_priv->tb_cache = NULL;
-+      } else if (tb_cache) {
-+              if (tb_cache != (void *)_ALIGN_UP((unsigned long)tb_cache, 128)
-+                      || tb_cache_size != _ALIGN_UP(tb_cache_size, 128)) {
-+                      dev_err(sbd_core(), "%s:%u: unaligned tb_cache\n",
-+                              __func__, __LINE__);
-+                      result = -EINVAL;
-+                      goto fail_align;
-+              }
-+              lpm_priv->tb_cache_size = tb_cache_size;
-+              lpm_priv->tb_cache_internal = NULL;
-+              lpm_priv->tb_cache = tb_cache;
-+      } else {
-+              lpm_priv->tb_cache_size = PS3_LPM_DEFAULT_TB_CACHE_SIZE;
-+              lpm_priv->tb_cache_internal = kzalloc(
-+                      lpm_priv->tb_cache_size + 127, GFP_KERNEL);
-+              if (!lpm_priv->tb_cache_internal) {
-+                      dev_err(sbd_core(), "%s:%u: alloc internal tb_cache "
-+                              "failed\n", __func__, __LINE__);
-+                      result = -ENOMEM;
-+                      goto fail_malloc;
-+              }
-+              lpm_priv->tb_cache = (void *)_ALIGN_UP(
-+                      (unsigned long)lpm_priv->tb_cache_internal, 128);
-+      }
-+
-+      result = lv1_construct_lpm(lpm_priv->node_id, tb_type, 0, 0,
-+                              ps3_mm_phys_to_lpar(__pa(lpm_priv->tb_cache)),
-+                              lpm_priv->tb_cache_size, &lpm_priv->lpm_id,
-+                              &lpm_priv->outlet_id, &tb_size);
-+
-+      if (result) {
-+              dev_err(sbd_core(), "%s:%u: lv1_construct_lpm failed: %s\n",
-+                      __func__, __LINE__, ps3_result(result));
-+              result = -EINVAL;
-+              goto fail_construct;
-+      }
-+
-+      lpm_priv->shadow.pm_control = PS3_LPM_SHADOW_REG_INIT;
-+      lpm_priv->shadow.pm_start_stop = PS3_LPM_SHADOW_REG_INIT;
-+      lpm_priv->shadow.pm_interval = PS3_LPM_SHADOW_REG_INIT;
-+      lpm_priv->shadow.group_control = PS3_LPM_SHADOW_REG_INIT;
-+      lpm_priv->shadow.debug_bus_control = PS3_LPM_SHADOW_REG_INIT;
-+
-+      dev_dbg(sbd_core(), "%s:%u: lpm_id 0x%lx, outlet_id 0x%lx, "
-+              "tb_size 0x%lx\n", __func__, __LINE__, lpm_priv->lpm_id,
-+              lpm_priv->outlet_id, tb_size);
-+
-+      return 0;
-+
-+fail_construct:
-+      kfree(lpm_priv->tb_cache_internal);
-+      lpm_priv->tb_cache_internal = NULL;
-+fail_malloc:
-+fail_align:
-+      atomic_dec(&lpm_priv->open);
-+      return result;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_open);
-+
-+/**
-+ * ps3_lpm_close - Close the lpm device.
-+ *
-+ */
-+
-+int ps3_lpm_close(void)
-+{
-+      dev_dbg(sbd_core(), "%s:%u\n", __func__, __LINE__);
-+
-+      lv1_destruct_lpm(lpm_priv->lpm_id);
-+      lpm_priv->lpm_id = 0;
-+
-+      kfree(lpm_priv->tb_cache_internal);
-+      lpm_priv->tb_cache_internal = NULL;
-+
-+      atomic_dec(&lpm_priv->open);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_close);
-+
-+static int __devinit ps3_lpm_probe(struct ps3_system_bus_device *dev)
-+{
-+      dev_dbg(&dev->core, " -> %s:%u\n", __func__, __LINE__);
-+
-+      if (lpm_priv) {
-+              dev_info(&dev->core, "%s:%u: called twice\n",
-+                      __func__, __LINE__);
-+              return -EBUSY;
-+      }
-+
-+      lpm_priv = kzalloc(sizeof(*lpm_priv), GFP_KERNEL);
-+
-+      if (!lpm_priv)
-+              return -ENOMEM;
-+
-+      lpm_priv->sbd = dev;
-+      lpm_priv->node_id = dev->lpm.node_id;
-+      lpm_priv->pu_id = dev->lpm.pu_id;
-+      lpm_priv->rights = dev->lpm.rights;
-+
-+      dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
-+
-+      return 0;
-+}
-+
-+static int ps3_lpm_remove(struct ps3_system_bus_device *dev)
-+{
-+      dev_dbg(&dev->core, " -> %s:%u:\n", __func__, __LINE__);
-+
-+      ps3_lpm_close();
-+
-+      kfree(lpm_priv);
-+      lpm_priv = NULL;
-+
-+      dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
-+      return 0;
-+}
-+
-+static struct ps3_system_bus_driver ps3_lpm_driver = {
-+      .match_id = PS3_MATCH_ID_LPM,
-+      .core.name      = "ps3-lpm",
-+      .core.owner     = THIS_MODULE,
-+      .probe          = ps3_lpm_probe,
-+      .remove         = ps3_lpm_remove,
-+      .shutdown       = ps3_lpm_remove,
-+};
-+
-+static int __init ps3_lpm_init(void)
-+{
-+      pr_debug("%s:%d:\n", __func__, __LINE__);
-+      return ps3_system_bus_driver_register(&ps3_lpm_driver);
-+}
-+
-+static void __exit ps3_lpm_exit(void)
-+{
-+      pr_debug("%s:%d:\n", __func__, __LINE__);
-+      ps3_system_bus_driver_unregister(&ps3_lpm_driver);
-+}
-+
-+module_init(ps3_lpm_init);
-+module_exit(ps3_lpm_exit);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("PS3 Logical Performance Monitor Driver");
-+MODULE_AUTHOR("Sony Corporation");
-+MODULE_ALIAS(PS3_MODULE_ALIAS_LPM);
---- a/drivers/ps3/ps3-sys-manager.c
-+++ b/drivers/ps3/ps3-sys-manager.c
-@@ -452,7 +452,7 @@ static int ps3_sys_manager_handle_event(
-       case PS3_SM_EVENT_THERMAL_ALERT:
-               dev_dbg(&dev->core, "%s:%d: THERMAL_ALERT (zone %u)\n",
-                       __func__, __LINE__, event.value);
--              printk(KERN_INFO "PS3 Thermal Alert Zone %u\n", event.value);
-+              pr_info("PS3 Thermal Alert Zone %u\n", event.value);
-               break;
-       case PS3_SM_EVENT_THERMAL_CLEARED:
-               dev_dbg(&dev->core, "%s:%d: THERMAL_CLEARED (zone %u)\n",
-@@ -488,7 +488,7 @@ static int ps3_sys_manager_handle_cmd(st
-       result = ps3_vuart_read(dev, &cmd, sizeof(cmd));
-       BUG_ON(result && "need to retry here");
--      if(result)
-+      if (result)
-               return result;
-       if (cmd.version != 1) {
-@@ -521,7 +521,7 @@ static int ps3_sys_manager_handle_msg(st
-       result = ps3_vuart_read(dev, &header,
-               sizeof(struct ps3_sys_manager_header));
--      if(result)
-+      if (result)
-               return result;
-       if (header.version != 1) {
-@@ -589,9 +589,9 @@ static void ps3_sys_manager_final_power_
-               PS3_SM_WAKE_DEFAULT);
-       ps3_sys_manager_send_request_shutdown(dev);
--      printk(KERN_EMERG "System Halted, OK to turn off power\n");
-+      pr_emerg("System Halted, OK to turn off power\n");
--      while(1)
-+      while (1)
-               ps3_sys_manager_handle_msg(dev);
- }
-@@ -626,9 +626,9 @@ static void ps3_sys_manager_final_restar
-               PS3_SM_WAKE_DEFAULT);
-       ps3_sys_manager_send_request_shutdown(dev);
--      printk(KERN_EMERG "System Halted, OK to turn off power\n");
-+      pr_emerg("System Halted, OK to turn off power\n");
--      while(1)
-+      while (1)
-               ps3_sys_manager_handle_msg(dev);
- }
---- a/drivers/ps3/ps3-vuart.c
-+++ b/drivers/ps3/ps3-vuart.c
-@@ -108,18 +108,18 @@ static struct ps3_vuart_port_priv *to_po
- struct ports_bmp {
-       u64 status;
-       u64 unused[3];
--} __attribute__ ((aligned (32)));
-+} __attribute__((aligned(32)));
- #define dump_ports_bmp(_b) _dump_ports_bmp(_b, __func__, __LINE__)
- static void __maybe_unused _dump_ports_bmp(
--      const struct ports_bmp* bmp, const char* func, int line)
-+      const struct ports_bmp *bmp, const char *func, int line)
- {
-       pr_debug("%s:%d: ports_bmp: %016lxh\n", func, line, bmp->status);
- }
- #define dump_port_params(_b) _dump_port_params(_b, __func__, __LINE__)
- static void __maybe_unused _dump_port_params(unsigned int port_number,
--      const char* func, int line)
-+      const char *func, int line)
- {
- #if defined(DEBUG)
-       static const char *strings[] = {
-@@ -363,7 +363,7 @@ int ps3_vuart_disable_interrupt_disconne
-  */
- static int ps3_vuart_raw_write(struct ps3_system_bus_device *dev,
--      const void* buf, unsigned int bytes, unsigned long *bytes_written)
-+      const void *buf, unsigned int bytes, unsigned long *bytes_written)
- {
-       int result;
-       struct ps3_vuart_port_priv *priv = to_port_priv(dev);
-@@ -431,7 +431,7 @@ void ps3_vuart_clear_rx_bytes(struct ps3
-       int result;
-       struct ps3_vuart_port_priv *priv = to_port_priv(dev);
-       u64 bytes_waiting;
--      void* tmp;
-+      void *tmp;
-       result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes_waiting);
-@@ -526,9 +526,8 @@ int ps3_vuart_write(struct ps3_system_bu
-       lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_KERNEL);
--      if (!lb) {
-+      if (!lb)
-               return -ENOMEM;
--      }
-       memcpy(lb->data, buf, bytes);
-       lb->head = lb->data;
-@@ -878,7 +877,7 @@ static int ps3_vuart_handle_port_interru
- struct vuart_bus_priv {
-       struct ports_bmp *bmp;
-       unsigned int virq;
--      struct semaphore probe_mutex;
-+      struct mutex probe_mutex;
-       int use_count;
-       struct ps3_system_bus_device *devices[PORT_COUNT];
- } static vuart_bus_priv;
-@@ -926,9 +925,8 @@ static int ps3_vuart_bus_interrupt_get(v
-       BUG_ON(vuart_bus_priv.use_count > 2);
--      if (vuart_bus_priv.use_count != 1) {
-+      if (vuart_bus_priv.use_count != 1)
-               return 0;
--      }
-       BUG_ON(vuart_bus_priv.bmp);
-@@ -1017,7 +1015,7 @@ static int ps3_vuart_probe(struct ps3_sy
-               return -EINVAL;
-       }
--      down(&vuart_bus_priv.probe_mutex);
-+      mutex_lock(&vuart_bus_priv.probe_mutex);
-       result = ps3_vuart_bus_interrupt_get();
-@@ -1077,7 +1075,7 @@ static int ps3_vuart_probe(struct ps3_sy
-               goto fail_probe;
-       }
--      up(&vuart_bus_priv.probe_mutex);
-+      mutex_unlock(&vuart_bus_priv.probe_mutex);
-       return result;
-@@ -1090,7 +1088,7 @@ fail_dev_malloc:
- fail_busy:
-       ps3_vuart_bus_interrupt_put();
- fail_setup_interrupt:
--      up(&vuart_bus_priv.probe_mutex);
-+      mutex_unlock(&vuart_bus_priv.probe_mutex);
-       dev_dbg(&dev->core, "%s:%d: failed\n", __func__, __LINE__);
-       return result;
- }
-@@ -1129,7 +1127,7 @@ static int ps3_vuart_remove(struct ps3_s
-       BUG_ON(!dev);
--      down(&vuart_bus_priv.probe_mutex);
-+      mutex_lock(&vuart_bus_priv.probe_mutex);
-       dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
-               dev->match_id);
-@@ -1137,7 +1135,7 @@ static int ps3_vuart_remove(struct ps3_s
-       if (!dev->core.driver) {
-               dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
-                       __LINE__);
--              up(&vuart_bus_priv.probe_mutex);
-+              mutex_unlock(&vuart_bus_priv.probe_mutex);
-               return 0;
-       }
-@@ -1160,7 +1158,7 @@ static int ps3_vuart_remove(struct ps3_s
-       priv = NULL;
-       dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
--      up(&vuart_bus_priv.probe_mutex);
-+      mutex_unlock(&vuart_bus_priv.probe_mutex);
-       return 0;
- }
-@@ -1180,7 +1178,7 @@ static int ps3_vuart_shutdown(struct ps3
-       BUG_ON(!dev);
--      down(&vuart_bus_priv.probe_mutex);
-+      mutex_lock(&vuart_bus_priv.probe_mutex);
-       dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
-               dev->match_id);
-@@ -1188,7 +1186,7 @@ static int ps3_vuart_shutdown(struct ps3
-       if (!dev->core.driver) {
-               dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
-                       __LINE__);
--              up(&vuart_bus_priv.probe_mutex);
-+              mutex_unlock(&vuart_bus_priv.probe_mutex);
-               return 0;
-       }
-@@ -1212,7 +1210,7 @@ static int ps3_vuart_shutdown(struct ps3
-       dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
--      up(&vuart_bus_priv.probe_mutex);
-+      mutex_unlock(&vuart_bus_priv.probe_mutex);
-       return 0;
- }
-@@ -1223,7 +1221,7 @@ static int __init ps3_vuart_bus_init(voi
-       if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
-               return -ENODEV;
--      init_MUTEX(&vuart_bus_priv.probe_mutex);
-+      mutex_init(&vuart_bus_priv.probe_mutex);
-       return 0;
- }
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -1284,4 +1284,14 @@ config SERIAL_OF_PLATFORM
-         Currently, only 8250 compatible ports are supported, but
-         others can easily be added.
-+config SERIAL_QE
-+      tristate "Freescale QUICC Engine serial port support"
-+      depends on QUICC_ENGINE
-+      select SERIAL_CORE
-+      select FW_LOADER
-+      default n
-+      help
-+        This driver supports the QE serial ports on Freescale embedded
-+        PowerPC that contain a QUICC Engine.
-+
- endmenu
---- a/drivers/serial/Makefile
-+++ b/drivers/serial/Makefile
-@@ -64,3 +64,4 @@ obj-$(CONFIG_SERIAL_UARTLITE) += uartlit
- obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
- obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
- obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
-+obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
---- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-@@ -52,11 +52,7 @@
- #ifdef CONFIG_PPC_CPM_NEW_BINDING
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
--      u16 __iomem *cpcr = &cpmp->cp_cpcr;
--
--      out_be16(cpcr, port->command | (cmd << 8) | CPM_CR_FLG);
--      while (in_be16(cpcr) & CPM_CR_FLG)
--              ;
-+      cpm_command(port->command, cmd);
- }
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
---- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-@@ -52,13 +52,7 @@
- #ifdef CONFIG_PPC_CPM_NEW_BINDING
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
--      cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm);
--
--      out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG);
--      while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG)
--              ;
--
--      cpm2_unmap(cp);
-+      cpm_command(port->command, cmd);
- }
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
-@@ -171,9 +165,9 @@ void scc2_lineif(struct uart_cpm_port *p
-        * really has to get out of the driver so boards can
-        * be supported in a sane fashion.
-        */
-+      volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
- #ifndef CONFIG_STX_GP3
-       volatile iop_cpm2_t *io = cpm2_map(im_ioport);
--      volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
-       io->iop_pparb |= 0x008b0000;
-       io->iop_pdirb |= 0x00880000;
---- a/drivers/serial/mpc52xx_uart.c
-+++ b/drivers/serial/mpc52xx_uart.c
-@@ -36,7 +36,7 @@
-  * DCD. However, the pin multiplexing aren't changed and should be set either
-  * by the bootloader or in the platform init code.
-  *
-- * The idx field must be equal to the PSC index ( e.g. 0 for PSC1, 1 for PSC2,
-+ * The idx field must be equal to the PSC index (e.g. 0 for PSC1, 1 for PSC2,
-  * and so on). So the PSC1 is mapped to /dev/ttyPSC0, PSC2 to /dev/ttyPSC1 and
-  * so on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly
-  * fpr the console code : without this 1:1 mapping, at early boot time, when we
-@@ -68,11 +68,12 @@
- #include <linux/sysrq.h>
- #include <linux/console.h>
--#include <asm/delay.h>
--#include <asm/io.h>
-+#include <linux/delay.h>
-+#include <linux/io.h>
- #if defined(CONFIG_PPC_MERGE)
--#include <asm/of_platform.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
- #else
- #include <linux/platform_device.h>
- #endif
-@@ -111,16 +112,18 @@ static void mpc52xx_uart_of_enumerate(vo
- #endif
- #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase))
-+#define FIFO(port) ((struct mpc52xx_psc_fifo __iomem *)(PSC(port)+1))
- /* Forward declaration of the interruption handling routine */
--static irqreturn_t mpc52xx_uart_int(int irq,void *dev_id);
-+static irqreturn_t mpc52xx_uart_int(int irq, void *dev_id);
- /* Simple macro to test if a port is console or not. This one is taken
-  * for serial_core.c and maybe should be moved to serial_core.h ? */
- #ifdef CONFIG_SERIAL_CORE_CONSOLE
--#define uart_console(port)    ((port)->cons && (port)->cons->index == (port)->line)
-+#define uart_console(port) \
-+      ((port)->cons && (port)->cons->index == (port)->line)
- #else
- #define uart_console(port)    (0)
- #endif
-@@ -162,7 +165,7 @@ mpc52xx_uart_stop_tx(struct uart_port *p
- {
-       /* port->lock taken by caller */
-       port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY;
--      out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+      out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
- static void
-@@ -170,7 +173,7 @@ mpc52xx_uart_start_tx(struct uart_port *
- {
-       /* port->lock taken by caller */
-       port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
--      out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+      out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
- static void
-@@ -184,7 +187,7 @@ mpc52xx_uart_send_xchar(struct uart_port
-               /* Make sure tx interrupts are on */
-               /* Truly necessary ??? They should be anyway */
-               port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
--              out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+              out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
-       }
-       spin_unlock_irqrestore(&port->lock, flags);
-@@ -195,7 +198,7 @@ mpc52xx_uart_stop_rx(struct uart_port *p
- {
-       /* port->lock taken by caller */
-       port->read_status_mask &= ~MPC52xx_PSC_IMR_RXRDY;
--      out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+      out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
- static void
-@@ -210,10 +213,10 @@ mpc52xx_uart_break_ctl(struct uart_port 
-       unsigned long flags;
-       spin_lock_irqsave(&port->lock, flags);
--      if ( ctl == -1 )
--              out_8(&PSC(port)->command,MPC52xx_PSC_START_BRK);
-+      if (ctl == -1)
-+              out_8(&PSC(port)->command, MPC52xx_PSC_START_BRK);
-       else
--              out_8(&PSC(port)->command,MPC52xx_PSC_STOP_BRK);
-+              out_8(&PSC(port)->command, MPC52xx_PSC_STOP_BRK);
-       spin_unlock_irqrestore(&port->lock, flags);
- }
-@@ -222,6 +225,7 @@ static int
- mpc52xx_uart_startup(struct uart_port *port)
- {
-       struct mpc52xx_psc __iomem *psc = PSC(port);
-+      struct mpc52xx_psc_fifo __iomem *fifo = FIFO(port);
-       int ret;
-       /* Request IRQ */
-@@ -231,23 +235,23 @@ mpc52xx_uart_startup(struct uart_port *p
-               return ret;
-       /* Reset/activate the port, clear and enable interrupts */
--      out_8(&psc->command,MPC52xx_PSC_RST_RX);
--      out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+      out_8(&psc->command, MPC52xx_PSC_RST_RX);
-+      out_8(&psc->command, MPC52xx_PSC_RST_TX);
--      out_be32(&psc->sicr,0); /* UART mode DCD ignored */
-+      out_be32(&psc->sicr, 0);        /* UART mode DCD ignored */
-       out_be16(&psc->mpc52xx_psc_clock_select, 0xdd00); /* /16 prescaler on */
--      out_8(&psc->rfcntl, 0x00);
--      out_be16(&psc->rfalarm, 0x1ff);
--      out_8(&psc->tfcntl, 0x07);
--      out_be16(&psc->tfalarm, 0x80);
-+      out_8(&fifo->rfcntl, 0x00);
-+      out_be16(&fifo->rfalarm, 0x1ff);
-+      out_8(&fifo->tfcntl, 0x07);
-+      out_be16(&fifo->tfalarm, 0x80);
-       port->read_status_mask |= MPC52xx_PSC_IMR_RXRDY | MPC52xx_PSC_IMR_TXRDY;
--      out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
-+      out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
--      out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
--      out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
-+      out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
-+      out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
-       return 0;
- }
-@@ -258,12 +262,12 @@ mpc52xx_uart_shutdown(struct uart_port *
-       struct mpc52xx_psc __iomem *psc = PSC(port);
-       /* Shut down the port.  Leave TX active if on a console port */
--      out_8(&psc->command,MPC52xx_PSC_RST_RX);
-+      out_8(&psc->command, MPC52xx_PSC_RST_RX);
-       if (!uart_console(port))
--              out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+              out_8(&psc->command, MPC52xx_PSC_RST_TX);
-       port->read_status_mask = 0;
--      out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
-+      out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
-       /* Release interrupt */
-       free_irq(port->irq, port);
-@@ -271,7 +275,7 @@ mpc52xx_uart_shutdown(struct uart_port *
- static void
- mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
--                         struct ktermios *old)
-+                       struct ktermios *old)
- {
-       struct mpc52xx_psc __iomem *psc = PSC(port);
-       unsigned long flags;
-@@ -283,14 +287,14 @@ mpc52xx_uart_set_termios(struct uart_por
-       mr1 = 0;
-       switch (new->c_cflag & CSIZE) {
--              case CS5:       mr1 |= MPC52xx_PSC_MODE_5_BITS;
--                              break;
--              case CS6:       mr1 |= MPC52xx_PSC_MODE_6_BITS;
--                              break;
--              case CS7:       mr1 |= MPC52xx_PSC_MODE_7_BITS;
--                              break;
--              case CS8:
--              default:        mr1 |= MPC52xx_PSC_MODE_8_BITS;
-+      case CS5:       mr1 |= MPC52xx_PSC_MODE_5_BITS;
-+              break;
-+      case CS6:       mr1 |= MPC52xx_PSC_MODE_6_BITS;
-+              break;
-+      case CS7:       mr1 |= MPC52xx_PSC_MODE_7_BITS;
-+              break;
-+      case CS8:
-+      default:        mr1 |= MPC52xx_PSC_MODE_8_BITS;
-       }
-       if (new->c_cflag & PARENB) {
-@@ -332,24 +336,24 @@ mpc52xx_uart_set_termios(struct uart_por
-               udelay(1);
-       if (!j)
--              printk( KERN_ERR "mpc52xx_uart.c: "
-+              printk(KERN_ERR "mpc52xx_uart.c: "
-                       "Unable to flush RX & TX fifos in-time in set_termios."
--                      "Some chars may have been lost.\n" );
-+                      "Some chars may have been lost.\n");
-       /* Reset the TX & RX */
--      out_8(&psc->command,MPC52xx_PSC_RST_RX);
--      out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+      out_8(&psc->command, MPC52xx_PSC_RST_RX);
-+      out_8(&psc->command, MPC52xx_PSC_RST_TX);
-       /* Send new mode settings */
--      out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
--      out_8(&psc->mode,mr1);
--      out_8(&psc->mode,mr2);
--      out_8(&psc->ctur,ctr >> 8);
--      out_8(&psc->ctlr,ctr & 0xff);
-+      out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
-+      out_8(&psc->mode, mr1);
-+      out_8(&psc->mode, mr2);
-+      out_8(&psc->ctur, ctr >> 8);
-+      out_8(&psc->ctlr, ctr & 0xff);
-       /* Reenable TX & RX */
--      out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
--      out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
-+      out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
-+      out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
-       /* We're all set, release the lock */
-       spin_unlock_irqrestore(&port->lock, flags);
-@@ -364,7 +368,8 @@ mpc52xx_uart_type(struct uart_port *port
- static void
- mpc52xx_uart_release_port(struct uart_port *port)
- {
--      if (port->flags & UPF_IOREMAP) { /* remapped by us ? */
-+      /* remapped by us ? */
-+      if (port->flags & UPF_IOREMAP) {
-               iounmap(port->membase);
-               port->membase = NULL;
-       }
-@@ -379,7 +384,7 @@ mpc52xx_uart_request_port(struct uart_po
-       if (port->flags & UPF_IOREMAP) /* Need to remap ? */
-               port->membase = ioremap(port->mapbase,
--                                      sizeof(struct mpc52xx_psc));
-+                                      sizeof(struct mpc52xx_psc));
-       if (!port->membase)
-               return -EINVAL;
-@@ -398,22 +403,22 @@ mpc52xx_uart_request_port(struct uart_po
- static void
- mpc52xx_uart_config_port(struct uart_port *port, int flags)
- {
--      if ( (flags & UART_CONFIG_TYPE) &&
--           (mpc52xx_uart_request_port(port) == 0) )
--              port->type = PORT_MPC52xx;
-+      if ((flags & UART_CONFIG_TYPE)
-+              && (mpc52xx_uart_request_port(port) == 0))
-+              port->type = PORT_MPC52xx;
- }
- static int
- mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
- {
--      if ( ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx )
-+      if (ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx)
-               return -EINVAL;
--      if ( (ser->irq != port->irq) ||
--           (ser->io_type != SERIAL_IO_MEM) ||
--           (ser->baud_base != port->uartclk)  ||
--           (ser->iomem_base != (void*)port->mapbase) ||
--           (ser->hub6 != 0 ) )
-+      if ((ser->irq != port->irq) ||
-+          (ser->io_type != SERIAL_IO_MEM) ||
-+          (ser->baud_base != port->uartclk)  ||
-+          (ser->iomem_base != (void *)port->mapbase) ||
-+          (ser->hub6 != 0))
-               return -EINVAL;
-       return 0;
-@@ -455,8 +460,8 @@ mpc52xx_uart_int_rx_chars(struct uart_po
-       unsigned short status;
-       /* While we can read, do so ! */
--      while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
--              MPC52xx_PSC_SR_RXRDY) {
-+      while ((status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
-+              MPC52xx_PSC_SR_RXRDY) {
-               /* Get the char */
-               ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8);
-@@ -474,9 +479,9 @@ mpc52xx_uart_int_rx_chars(struct uart_po
-               flag = TTY_NORMAL;
-               port->icount.rx++;
--              if ( status & (MPC52xx_PSC_SR_PE |
--                             MPC52xx_PSC_SR_FE |
--                             MPC52xx_PSC_SR_RB) ) {
-+              if (status & (MPC52xx_PSC_SR_PE |
-+                            MPC52xx_PSC_SR_FE |
-+                            MPC52xx_PSC_SR_RB)) {
-                       if (status & MPC52xx_PSC_SR_RB) {
-                               flag = TTY_BREAK;
-@@ -487,7 +492,7 @@ mpc52xx_uart_int_rx_chars(struct uart_po
-                               flag = TTY_FRAME;
-                       /* Clear error condition */
--                      out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT);
-+                      out_8(&PSC(port)->command, MPC52xx_PSC_RST_ERR_STAT);
-               }
-               tty_insert_flip_char(tty, ch, flag);
-@@ -568,16 +573,16 @@ mpc52xx_uart_int(int irq, void *dev_id)
-               /* Do we need to receive chars ? */
-               /* For this RX interrupts must be on and some chars waiting */
--              if ( status & MPC52xx_PSC_IMR_RXRDY )
-+              if (status & MPC52xx_PSC_IMR_RXRDY)
-                       keepgoing |= mpc52xx_uart_int_rx_chars(port);
-               /* Do we need to send chars ? */
-               /* For this, TX must be ready and TX interrupt enabled */
--              if ( status & MPC52xx_PSC_IMR_TXRDY )
-+              if (status & MPC52xx_PSC_IMR_TXRDY)
-                       keepgoing |= mpc52xx_uart_int_tx_chars(port);
-               /* Limit number of iteration */
--              if ( !(--pass) )
-+              if (!(--pass))
-                       keepgoing = 0;
-       } while (keepgoing);
-@@ -596,7 +601,7 @@ mpc52xx_uart_int(int irq, void *dev_id)
- static void __init
- mpc52xx_console_get_options(struct uart_port *port,
--                            int *baud, int *parity, int *bits, int *flow)
-+                          int *baud, int *parity, int *bits, int *flow)
- {
-       struct mpc52xx_psc __iomem *psc = PSC(port);
-       unsigned char mr1;
-@@ -604,7 +609,7 @@ mpc52xx_console_get_options(struct uart_
-       pr_debug("mpc52xx_console_get_options(port=%p)\n", port);
-       /* Read the mode registers */
--      out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
-+      out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
-       mr1 = in_8(&psc->mode);
-       /* CT{U,L}R are write-only ! */
-@@ -616,11 +621,18 @@ mpc52xx_console_get_options(struct uart_
-       /* Parse them */
-       switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) {
--              case MPC52xx_PSC_MODE_5_BITS:   *bits = 5; break;
--              case MPC52xx_PSC_MODE_6_BITS:   *bits = 6; break;
--              case MPC52xx_PSC_MODE_7_BITS:   *bits = 7; break;
--              case MPC52xx_PSC_MODE_8_BITS:
--              default:                        *bits = 8;
-+      case MPC52xx_PSC_MODE_5_BITS:
-+              *bits = 5;
-+              break;
-+      case MPC52xx_PSC_MODE_6_BITS:
-+              *bits = 6;
-+              break;
-+      case MPC52xx_PSC_MODE_7_BITS:
-+              *bits = 7;
-+              break;
-+      case MPC52xx_PSC_MODE_8_BITS:
-+      default:
-+              *bits = 8;
-       }
-       if (mr1 & MPC52xx_PSC_MODE_PARNONE)
-@@ -657,7 +669,7 @@ mpc52xx_console_write(struct console *co
-               /* Wait the TX buffer to be empty */
-               j = 20000;      /* Maximum wait */
-               while (!(in_be16(&psc->mpc52xx_psc_status) &
--                       MPC52xx_PSC_SR_TXEMP) && --j)
-+                       MPC52xx_PSC_SR_TXEMP) && --j)
-                       udelay(1);
-       }
-@@ -730,16 +742,18 @@ mpc52xx_console_setup(struct console *co
-       }
-       pr_debug("Console on ttyPSC%x is %s\n",
--               co->index, mpc52xx_uart_nodes[co->index]->full_name);
-+               co->index, mpc52xx_uart_nodes[co->index]->full_name);
-       /* Fetch register locations */
--      if ((ret = of_address_to_resource(np, 0, &res)) != 0) {
-+      ret = of_address_to_resource(np, 0, &res);
-+      if (ret) {
-               pr_debug("Could not get resources for PSC%x\n", co->index);
-               return ret;
-       }
-       /* Search for bus-frequency property in this node or a parent */
--      if ((ipb_freq = mpc52xx_find_ipb_freq(np)) == 0) {
-+      ipb_freq = mpc52xx_find_ipb_freq(np);
-+      if (ipb_freq == 0) {
-               pr_debug("Could not find IPB bus frequency!\n");
-               return -EINVAL;
-       }
-@@ -757,7 +771,8 @@ mpc52xx_console_setup(struct console *co
-               return -EINVAL;
-       pr_debug("mpc52xx-psc uart at %p, mapped to %p, irq=%x, freq=%i\n",
--               (void*)port->mapbase, port->membase, port->irq, port->uartclk);
-+               (void *)port->mapbase, port->membase,
-+               port->irq, port->uartclk);
-       /* Setup the port parameters accoding to options */
-       if (options)
-@@ -766,7 +781,7 @@ mpc52xx_console_setup(struct console *co
-               mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow);
-       pr_debug("Setting console parameters: %i %i%c1 flow=%c\n",
--               baud, bits, parity, flow);
-+               baud, bits, parity, flow);
-       return uart_set_options(port, co, baud, parity, bits, flow);
- }
-@@ -781,7 +796,7 @@ static struct console mpc52xx_console = 
-       .device = uart_console_device,
-       .setup  = mpc52xx_console_setup,
-       .flags  = CON_PRINTBUFFER,
--      .index  = -1,   /* Specified on the cmdline (e.g. console=ttyPSC0 ) */
-+      .index  = -1,   /* Specified on the cmdline (e.g. console=ttyPSC0) */
-       .data   = &mpc52xx_uart_driver,
- };
-@@ -809,7 +824,6 @@ console_initcall(mpc52xx_console_init);
- /* ======================================================================== */
- static struct uart_driver mpc52xx_uart_driver = {
--      .owner          = THIS_MODULE,
-       .driver_name    = "mpc52xx_psc_uart",
-       .dev_name       = "ttyPSC",
-       .major          = SERIAL_PSC_MAJOR,
-@@ -837,7 +851,7 @@ mpc52xx_uart_probe(struct platform_devic
-       if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
-               return -EINVAL;
--      if (!mpc52xx_match_psc_function(idx,"uart"))
-+      if (!mpc52xx_match_psc_function(idx, "uart"))
-               return -ENODEV;
-       /* Init the port structure */
-@@ -848,13 +862,13 @@ mpc52xx_uart_probe(struct platform_devic
-       port->fifosize  = 512;
-       port->iotype    = UPIO_MEM;
-       port->flags     = UPF_BOOT_AUTOCONF |
--                        ( uart_console(port) ? 0 : UPF_IOREMAP );
-+                        (uart_console(port) ? 0 : UPF_IOREMAP);
-       port->line      = idx;
-       port->ops       = &mpc52xx_uart_ops;
-       port->dev       = &dev->dev;
-       /* Search for IRQ and mapbase */
--      for (i=0 ; i<dev->num_resources ; i++, res++) {
-+      for (i = 0 ; i < dev->num_resources ; i++, res++) {
-               if (res->flags & IORESOURCE_MEM)
-                       port->mapbase = res->start;
-               else if (res->flags & IORESOURCE_IRQ)
-@@ -866,7 +880,7 @@ mpc52xx_uart_probe(struct platform_devic
-       /* Add the port to the uart sub-system */
-       ret = uart_add_one_port(&mpc52xx_uart_driver, port);
-       if (!ret)
--              platform_set_drvdata(dev, (void*)port);
-+              platform_set_drvdata(dev, (void *)port);
-       return ret;
- }
-@@ -917,6 +931,7 @@ static struct platform_driver mpc52xx_ua
-       .resume         = mpc52xx_uart_resume,
- #endif
-       .driver         = {
-+              .owner  = THIS_MODULE,
-               .name   = "mpc52xx-psc",
-       },
- };
-@@ -946,10 +961,11 @@ mpc52xx_uart_of_probe(struct of_device *
-       if (idx >= MPC52xx_PSC_MAXNUM)
-               return -EINVAL;
-       pr_debug("Found %s assigned to ttyPSC%x\n",
--               mpc52xx_uart_nodes[idx]->full_name, idx);
-+               mpc52xx_uart_nodes[idx]->full_name, idx);
-       /* Search for bus-frequency property in this node or a parent */
--      if ((ipb_freq = mpc52xx_find_ipb_freq(op->node)) == 0) {
-+      ipb_freq = mpc52xx_find_ipb_freq(op->node);
-+      if (ipb_freq == 0) {
-               dev_dbg(&op->dev, "Could not find IPB bus frequency!\n");
-               return -EINVAL;
-       }
-@@ -962,22 +978,23 @@ mpc52xx_uart_of_probe(struct of_device *
-       port->fifosize  = 512;
-       port->iotype    = UPIO_MEM;
-       port->flags     = UPF_BOOT_AUTOCONF |
--                        ( uart_console(port) ? 0 : UPF_IOREMAP );
-+                        (uart_console(port) ? 0 : UPF_IOREMAP);
-       port->line      = idx;
-       port->ops       = &mpc52xx_uart_ops;
-       port->dev       = &op->dev;
-       /* Search for IRQ and mapbase */
--      if ((ret = of_address_to_resource(op->node, 0, &res)) != 0)
-+      ret = of_address_to_resource(op->node, 0, &res);
-+      if (ret)
-               return ret;
-       port->mapbase = res.start;
-       port->irq = irq_of_parse_and_map(op->node, 0);
-       dev_dbg(&op->dev, "mpc52xx-psc uart at %p, irq=%x, freq=%i\n",
--              (void*)port->mapbase, port->irq, port->uartclk);
-+              (void *)port->mapbase, port->irq, port->uartclk);
--      if ((port->irq==NO_IRQ) || !port->mapbase) {
-+      if ((port->irq == NO_IRQ) || !port->mapbase) {
-               printk(KERN_ERR "Could not allocate resources for PSC\n");
-               return -EINVAL;
-       }
-@@ -985,7 +1002,7 @@ mpc52xx_uart_of_probe(struct of_device *
-       /* Add the port to the uart sub-system */
-       ret = uart_add_one_port(&mpc52xx_uart_driver, port);
-       if (!ret)
--              dev_set_drvdata(&op->dev, (void*)port);
-+              dev_set_drvdata(&op->dev, (void *)port);
-       return ret;
- }
-@@ -1048,6 +1065,7 @@ mpc52xx_uart_of_assign(struct device_nod
-       if (idx < 0)
-               return; /* No free slot; abort */
-+      of_node_get(np);
-       /* If the slot is already occupied, then swap slots */
-       if (mpc52xx_uart_nodes[idx] && (free_idx != -1))
-               mpc52xx_uart_nodes[free_idx] = mpc52xx_uart_nodes[idx];
-@@ -1057,7 +1075,7 @@ mpc52xx_uart_of_assign(struct device_nod
- static void
- mpc52xx_uart_of_enumerate(void)
- {
--      static int enum_done = 0;
-+      static int enum_done;
-       struct device_node *np;
-       const unsigned int *devno;
-       int i;
-@@ -1071,7 +1089,7 @@ mpc52xx_uart_of_enumerate(void)
-               /* Is a particular device number requested? */
-               devno = of_get_property(np, "port-number", NULL);
--              mpc52xx_uart_of_assign(of_node_get(np), devno ? *devno : -1);
-+              mpc52xx_uart_of_assign(np, devno ? *devno : -1);
-       }
-       enum_done = 1;
-@@ -1079,15 +1097,13 @@ mpc52xx_uart_of_enumerate(void)
-       for (i = 0; i < MPC52xx_PSC_MAXNUM; i++) {
-               if (mpc52xx_uart_nodes[i])
-                       pr_debug("%s assigned to ttyPSC%x\n",
--                               mpc52xx_uart_nodes[i]->full_name, i);
-+                               mpc52xx_uart_nodes[i]->full_name, i);
-       }
- }
- MODULE_DEVICE_TABLE(of, mpc52xx_uart_of_match);
- static struct of_platform_driver mpc52xx_uart_of_driver = {
--      .owner          = THIS_MODULE,
--      .name           = "mpc52xx-psc-uart",
-       .match_table    = mpc52xx_uart_of_match,
-       .probe          = mpc52xx_uart_of_probe,
-       .remove         = mpc52xx_uart_of_remove,
-@@ -1113,7 +1129,8 @@ mpc52xx_uart_init(void)
-       printk(KERN_INFO "Serial: MPC52xx PSC UART driver\n");
--      if ((ret = uart_register_driver(&mpc52xx_uart_driver)) != 0) {
-+      ret = uart_register_driver(&mpc52xx_uart_driver);
-+      if (ret) {
-               printk(KERN_ERR "%s: uart_register_driver failed (%i)\n",
-                      __FILE__, ret);
-               return ret;
---- a/drivers/serial/uartlite.c
-+++ b/drivers/serial/uartlite.c
-@@ -539,7 +539,7 @@ static int __devinit ulite_assign(struct
-  *
-  * @dev: pointer to device structure
-  */
--static int __devinit ulite_release(struct device *dev)
-+static int __devexit ulite_release(struct device *dev)
- {
-       struct uart_port *port = dev_get_drvdata(dev);
-       int rc = 0;
-@@ -572,14 +572,14 @@ static int __devinit ulite_probe(struct 
-       return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
- }
--static int ulite_remove(struct platform_device *pdev)
-+static int __devexit ulite_remove(struct platform_device *pdev)
- {
-       return ulite_release(&pdev->dev);
- }
- static struct platform_driver ulite_platform_driver = {
-       .probe  = ulite_probe,
--      .remove = ulite_remove,
-+      .remove = __devexit_p(ulite_remove),
-       .driver = {
-                  .owner = THIS_MODULE,
-                  .name  = "uartlite",
---- /dev/null
-+++ b/drivers/serial/ucc_uart.c
-@@ -0,0 +1,1514 @@
-+/*
-+ * Freescale QUICC Engine UART device driver
-+ *
-+ * Author: Timur Tabi <timur@freescale.com>
-+ *
-+ * Copyright 2007 Freescale Semiconductor, 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.
-+ *
-+ * This driver adds support for UART devices via Freescale's QUICC Engine
-+ * found on some Freescale SOCs.
-+ *
-+ * If Soft-UART support is needed but not already present, then this driver
-+ * will request and upload the "Soft-UART" microcode upon probe.  The
-+ * filename of the microcode should be fsl_qe_ucode_uart_X_YZ.bin, where "X"
-+ * is the name of the SOC (e.g. 8323), and YZ is the revision of the SOC,
-+ * (e.g. "11" for 1.1).
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/serial.h>
-+#include <linux/serial_core.h>
-+#include <linux/io.h>
-+#include <linux/of_platform.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <linux/fs_uart_pd.h>
-+#include <asm/ucc_slow.h>
-+
-+#include <linux/firmware.h>
-+#include <asm/reg.h>
-+
-+/*
-+ * The GUMR flag for Soft UART.  This would normally be defined in qe.h,
-+ * but Soft-UART is a hack and we want to keep everything related to it in
-+ * this file.
-+ */
-+#define UCC_SLOW_GUMR_H_SUART         0x00004000      /* Soft-UART */
-+
-+/*
-+ * soft_uart is 1 if we need to use Soft-UART mode
-+ */
-+static int soft_uart;
-+/*
-+ * firmware_loaded is 1 if the firmware has been loaded, 0 otherwise.
-+ */
-+static int firmware_loaded;
-+
-+/* Enable this macro to configure all serial ports in internal loopback
-+   mode */
-+/* #define LOOPBACK */
-+
-+/* The major and minor device numbers are defined in
-+ * http://www.lanana.org/docs/device-list/devices-2.6+.txt.  For the QE
-+ * UART, we have major number 204 and minor numbers 46 - 49, which are the
-+ * same as for the CPM2.  This decision was made because no Freescale part
-+ * has both a CPM and a QE.
-+ */
-+#define SERIAL_QE_MAJOR 204
-+#define SERIAL_QE_MINOR 46
-+
-+/* Since we only have minor numbers 46 - 49, there is a hard limit of 4 ports */
-+#define UCC_MAX_UART    4
-+
-+/* The number of buffer descriptors for receiving characters. */
-+#define RX_NUM_FIFO     4
-+
-+/* The number of buffer descriptors for transmitting characters. */
-+#define TX_NUM_FIFO     4
-+
-+/* The maximum size of the character buffer for a single RX BD. */
-+#define RX_BUF_SIZE     32
-+
-+/* The maximum size of the character buffer for a single TX BD. */
-+#define TX_BUF_SIZE     32
-+
-+/*
-+ * The number of jiffies to wait after receiving a close command before the
-+ * device is actually closed.  This allows the last few characters to be
-+ * sent over the wire.
-+ */
-+#define UCC_WAIT_CLOSING 100
-+
-+struct ucc_uart_pram {
-+      struct ucc_slow_pram common;
-+      u8 res1[8];             /* reserved */
-+      __be16 maxidl;          /* Maximum idle chars */
-+      __be16 idlc;            /* temp idle counter */
-+      __be16 brkcr;           /* Break count register */
-+      __be16 parec;           /* receive parity error counter */
-+      __be16 frmec;           /* receive framing error counter */
-+      __be16 nosec;           /* receive noise counter */
-+      __be16 brkec;           /* receive break condition counter */
-+      __be16 brkln;           /* last received break length */
-+      __be16 uaddr[2];        /* UART address character 1 & 2 */
-+      __be16 rtemp;           /* Temp storage */
-+      __be16 toseq;           /* Transmit out of sequence char */
-+      __be16 cchars[8];       /* control characters 1-8 */
-+      __be16 rccm;            /* receive control character mask */
-+      __be16 rccr;            /* receive control character register */
-+      __be16 rlbc;            /* receive last break character */
-+      __be16 res2;            /* reserved */
-+      __be32 res3;            /* reserved, should be cleared */
-+      u8 res4;                /* reserved, should be cleared */
-+      u8 res5[3];             /* reserved, should be cleared */
-+      __be32 res6;            /* reserved, should be cleared */
-+      __be32 res7;            /* reserved, should be cleared */
-+      __be32 res8;            /* reserved, should be cleared */
-+      __be32 res9;            /* reserved, should be cleared */
-+      __be32 res10;           /* reserved, should be cleared */
-+      __be32 res11;           /* reserved, should be cleared */
-+      __be32 res12;           /* reserved, should be cleared */
-+      __be32 res13;           /* reserved, should be cleared */
-+/* The rest is for Soft-UART only */
-+      __be16 supsmr;          /* 0x90, Shadow UPSMR */
-+      __be16 res92;           /* 0x92, reserved, initialize to 0 */
-+      __be32 rx_state;        /* 0x94, RX state, initialize to 0 */
-+      __be32 rx_cnt;          /* 0x98, RX count, initialize to 0 */
-+      u8 rx_length;           /* 0x9C, Char length, set to 1+CL+PEN+1+SL */
-+      u8 rx_bitmark;          /* 0x9D, reserved, initialize to 0 */
-+      u8 rx_temp_dlst_qe;     /* 0x9E, reserved, initialize to 0 */
-+      u8 res14[0xBC - 0x9F];  /* reserved */
-+      __be32 dump_ptr;        /* 0xBC, Dump pointer */
-+      __be32 rx_frame_rem;    /* 0xC0, reserved, initialize to 0 */
-+      u8 rx_frame_rem_size;   /* 0xC4, reserved, initialize to 0 */
-+      u8 tx_mode;             /* 0xC5, mode, 0=AHDLC, 1=UART */
-+      __be16 tx_state;        /* 0xC6, TX state */
-+      u8 res15[0xD0 - 0xC8];  /* reserved */
-+      __be32 resD0;           /* 0xD0, reserved, initialize to 0 */
-+      u8 resD4;               /* 0xD4, reserved, initialize to 0 */
-+      __be16 resD5;           /* 0xD5, reserved, initialize to 0 */
-+} __attribute__ ((packed));
-+
-+/* SUPSMR definitions, for Soft-UART only */
-+#define UCC_UART_SUPSMR_SL            0x8000
-+#define UCC_UART_SUPSMR_RPM_MASK      0x6000
-+#define UCC_UART_SUPSMR_RPM_ODD       0x0000
-+#define UCC_UART_SUPSMR_RPM_LOW       0x2000
-+#define UCC_UART_SUPSMR_RPM_EVEN      0x4000
-+#define UCC_UART_SUPSMR_RPM_HIGH      0x6000
-+#define UCC_UART_SUPSMR_PEN           0x1000
-+#define UCC_UART_SUPSMR_TPM_MASK      0x0C00
-+#define UCC_UART_SUPSMR_TPM_ODD       0x0000
-+#define UCC_UART_SUPSMR_TPM_LOW       0x0400
-+#define UCC_UART_SUPSMR_TPM_EVEN      0x0800
-+#define UCC_UART_SUPSMR_TPM_HIGH      0x0C00
-+#define UCC_UART_SUPSMR_FRZ           0x0100
-+#define UCC_UART_SUPSMR_UM_MASK       0x00c0
-+#define UCC_UART_SUPSMR_UM_NORMAL       0x0000
-+#define UCC_UART_SUPSMR_UM_MAN_MULTI    0x0040
-+#define UCC_UART_SUPSMR_UM_AUTO_MULTI   0x00c0
-+#define UCC_UART_SUPSMR_CL_MASK       0x0030
-+#define UCC_UART_SUPSMR_CL_8          0x0030
-+#define UCC_UART_SUPSMR_CL_7          0x0020
-+#define UCC_UART_SUPSMR_CL_6          0x0010
-+#define UCC_UART_SUPSMR_CL_5          0x0000
-+
-+#define UCC_UART_TX_STATE_AHDLC       0x00
-+#define UCC_UART_TX_STATE_UART        0x01
-+#define UCC_UART_TX_STATE_X1          0x00
-+#define UCC_UART_TX_STATE_X16         0x80
-+
-+#define UCC_UART_PRAM_ALIGNMENT 0x100
-+
-+#define UCC_UART_SIZE_OF_BD     UCC_SLOW_SIZE_OF_BD
-+#define NUM_CONTROL_CHARS       8
-+
-+/* Private per-port data structure */
-+struct uart_qe_port {
-+      struct uart_port port;
-+      struct ucc_slow __iomem *uccp;
-+      struct ucc_uart_pram __iomem *uccup;
-+      struct ucc_slow_info us_info;
-+      struct ucc_slow_private *us_private;
-+      struct device_node *np;
-+      unsigned int ucc_num;   /* First ucc is 0, not 1 */
-+
-+      u16 rx_nrfifos;
-+      u16 rx_fifosize;
-+      u16 tx_nrfifos;
-+      u16 tx_fifosize;
-+      int wait_closing;
-+      u32 flags;
-+      struct qe_bd *rx_bd_base;
-+      struct qe_bd *rx_cur;
-+      struct qe_bd *tx_bd_base;
-+      struct qe_bd *tx_cur;
-+      unsigned char *tx_buf;
-+      unsigned char *rx_buf;
-+      void *bd_virt;          /* virtual address of the BD buffers */
-+      dma_addr_t bd_dma_addr; /* bus address of the BD buffers */
-+      unsigned int bd_size;   /* size of BD buffer space */
-+};
-+
-+static struct uart_driver ucc_uart_driver = {
-+      .owner          = THIS_MODULE,
-+      .driver_name    = "serial",
-+      .dev_name       = "ttyQE",
-+      .major          = SERIAL_QE_MAJOR,
-+      .minor          = SERIAL_QE_MINOR,
-+      .nr             = UCC_MAX_UART,
-+};
-+
-+/*
-+ * Virtual to physical address translation.
-+ *
-+ * Given the virtual address for a character buffer, this function returns
-+ * the physical (DMA) equivalent.
-+ */
-+static inline dma_addr_t cpu2qe_addr(void *addr, struct uart_qe_port *qe_port)
-+{
-+      if (likely((addr >= qe_port->bd_virt)) &&
-+          (addr < (qe_port->bd_virt + qe_port->bd_size)))
-+              return qe_port->bd_dma_addr + (addr - qe_port->bd_virt);
-+
-+      /* something nasty happened */
-+      printk(KERN_ERR "%s: addr=%p\n", __FUNCTION__, addr);
-+      BUG();
-+      return 0;
-+}
-+
-+/*
-+ * Physical to virtual address translation.
-+ *
-+ * Given the physical (DMA) address for a character buffer, this function
-+ * returns the virtual equivalent.
-+ */
-+static inline void *qe2cpu_addr(dma_addr_t addr, struct uart_qe_port *qe_port)
-+{
-+      /* sanity check */
-+      if (likely((addr >= qe_port->bd_dma_addr) &&
-+                 (addr < (qe_port->bd_dma_addr + qe_port->bd_size))))
-+              return qe_port->bd_virt + (addr - qe_port->bd_dma_addr);
-+
-+      /* something nasty happened */
-+      printk(KERN_ERR "%s: addr=%x\n", __FUNCTION__, addr);
-+      BUG();
-+      return NULL;
-+}
-+
-+/*
-+ * Return 1 if the QE is done transmitting all buffers for this port
-+ *
-+ * This function scans each BD in sequence.  If we find a BD that is not
-+ * ready (READY=1), then we return 0 indicating that the QE is still sending
-+ * data.  If we reach the last BD (WRAP=1), then we know we've scanned
-+ * the entire list, and all BDs are done.
-+ */
-+static unsigned int qe_uart_tx_empty(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      struct qe_bd *bdp = qe_port->tx_bd_base;
-+
-+      while (1) {
-+              if (in_be16(&bdp->status) & BD_SC_READY)
-+                      /* This BD is not done, so return "not done" */
-+                      return 0;
-+
-+              if (in_be16(&bdp->status) & BD_SC_WRAP)
-+                      /*
-+                       * This BD is done and it's the last one, so return
-+                       * "done"
-+                       */
-+                      return 1;
-+
-+              bdp++;
-+      };
-+}
-+
-+/*
-+ * Set the modem control lines
-+ *
-+ * Although the QE can control the modem control lines (e.g. CTS), we
-+ * don't need that support. This function must exist, however, otherwise
-+ * the kernel will panic.
-+ */
-+void qe_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
-+{
-+}
-+
-+/*
-+ * Get the current modem control line status
-+ *
-+ * Although the QE can control the modem control lines (e.g. CTS), this
-+ * driver currently doesn't support that, so we always return Carrier
-+ * Detect, Data Set Ready, and Clear To Send.
-+ */
-+static unsigned int qe_uart_get_mctrl(struct uart_port *port)
-+{
-+      return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
-+}
-+
-+/*
-+ * Disable the transmit interrupt.
-+ *
-+ * Although this function is called "stop_tx", it does not actually stop
-+ * transmission of data.  Instead, it tells the QE to not generate an
-+ * interrupt when the UCC is finished sending characters.
-+ */
-+static void qe_uart_stop_tx(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+
-+      clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
-+}
-+
-+/*
-+ * Transmit as many characters to the HW as possible.
-+ *
-+ * This function will attempt to stuff of all the characters from the
-+ * kernel's transmit buffer into TX BDs.
-+ *
-+ * A return value of non-zero indicates that it sucessfully stuffed all
-+ * characters from the kernel buffer.
-+ *
-+ * A return value of zero indicates that there are still characters in the
-+ * kernel's buffer that have not been transmitted, but there are no more BDs
-+ * available.  This function should be called again after a BD has been made
-+ * available.
-+ */
-+static int qe_uart_tx_pump(struct uart_qe_port *qe_port)
-+{
-+      struct qe_bd *bdp;
-+      unsigned char *p;
-+      unsigned int count;
-+      struct uart_port *port = &qe_port->port;
-+      struct circ_buf *xmit = &port->info->xmit;
-+
-+      bdp = qe_port->rx_cur;
-+
-+      /* Handle xon/xoff */
-+      if (port->x_char) {
-+              /* Pick next descriptor and fill from buffer */
-+              bdp = qe_port->tx_cur;
-+
-+              p = qe2cpu_addr(bdp->buf, qe_port);
-+
-+              *p++ = port->x_char;
-+              out_be16(&bdp->length, 1);
-+              setbits16(&bdp->status, BD_SC_READY);
-+              /* Get next BD. */
-+              if (in_be16(&bdp->status) & BD_SC_WRAP)
-+                      bdp = qe_port->tx_bd_base;
-+              else
-+                      bdp++;
-+              qe_port->tx_cur = bdp;
-+
-+              port->icount.tx++;
-+              port->x_char = 0;
-+              return 1;
-+      }
-+
-+      if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
-+              qe_uart_stop_tx(port);
-+              return 0;
-+      }
-+
-+      /* Pick next descriptor and fill from buffer */
-+      bdp = qe_port->tx_cur;
-+
-+      while (!(in_be16(&bdp->status) & BD_SC_READY) &&
-+             (xmit->tail != xmit->head)) {
-+              count = 0;
-+              p = qe2cpu_addr(bdp->buf, qe_port);
-+              while (count < qe_port->tx_fifosize) {
-+                      *p++ = xmit->buf[xmit->tail];
-+                      xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
-+                      port->icount.tx++;
-+                      count++;
-+                      if (xmit->head == xmit->tail)
-+                              break;
-+              }
-+
-+              out_be16(&bdp->length, count);
-+              setbits16(&bdp->status, BD_SC_READY);
-+
-+              /* Get next BD. */
-+              if (in_be16(&bdp->status) & BD_SC_WRAP)
-+                      bdp = qe_port->tx_bd_base;
-+              else
-+                      bdp++;
-+      }
-+      qe_port->tx_cur = bdp;
-+
-+      if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-+              uart_write_wakeup(port);
-+
-+      if (uart_circ_empty(xmit)) {
-+              /* The kernel buffer is empty, so turn off TX interrupts.  We
-+                 don't need to be told when the QE is finished transmitting
-+                 the data. */
-+              qe_uart_stop_tx(port);
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+/*
-+ * Start transmitting data
-+ *
-+ * This function will start transmitting any available data, if the port
-+ * isn't already transmitting data.
-+ */
-+static void qe_uart_start_tx(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+
-+      /* If we currently are transmitting, then just return */
-+      if (in_be16(&qe_port->uccp->uccm) & UCC_UART_UCCE_TX)
-+              return;
-+
-+      /* Otherwise, pump the port and start transmission */
-+      if (qe_uart_tx_pump(qe_port))
-+              setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
-+}
-+
-+/*
-+ * Stop transmitting data
-+ */
-+static void qe_uart_stop_rx(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+
-+      clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
-+}
-+
-+/*
-+ * Enable status change interrupts
-+ *
-+ * We don't support status change interrupts, but we need to define this
-+ * function otherwise the kernel will panic.
-+ */
-+static void qe_uart_enable_ms(struct uart_port *port)
-+{
-+}
-+
-+/* Start or stop sending  break signal
-+ *
-+ * This function controls the sending of a break signal.  If break_state=1,
-+ * then we start sending a break signal.  If break_state=0, then we stop
-+ * sending the break signal.
-+ */
-+static void qe_uart_break_ctl(struct uart_port *port, int break_state)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+
-+      if (break_state)
-+              ucc_slow_stop_tx(qe_port->us_private);
-+      else
-+              ucc_slow_restart_tx(qe_port->us_private);
-+}
-+
-+/* ISR helper function for receiving character.
-+ *
-+ * This function is called by the ISR to handling receiving characters
-+ */
-+static void qe_uart_int_rx(struct uart_qe_port *qe_port)
-+{
-+      int i;
-+      unsigned char ch, *cp;
-+      struct uart_port *port = &qe_port->port;
-+      struct tty_struct *tty = port->info->tty;
-+      struct qe_bd *bdp;
-+      u16 status;
-+      unsigned int flg;
-+
-+      /* Just loop through the closed BDs and copy the characters into
-+       * the buffer.
-+       */
-+      bdp = qe_port->rx_cur;
-+      while (1) {
-+              status = in_be16(&bdp->status);
-+
-+              /* If this one is empty, then we assume we've read them all */
-+              if (status & BD_SC_EMPTY)
-+                      break;
-+
-+              /* get number of characters, and check space in RX buffer */
-+              i = in_be16(&bdp->length);
-+
-+              /* If we don't have enough room in RX buffer for the entire BD,
-+               * then we try later, which will be the next RX interrupt.
-+               */
-+              if (tty_buffer_request_room(tty, i) < i) {
-+                      dev_dbg(port->dev, "ucc-uart: no room in RX buffer\n");
-+                      return;
-+              }
-+
-+              /* get pointer */
-+              cp = qe2cpu_addr(bdp->buf, qe_port);
-+
-+              /* loop through the buffer */
-+              while (i-- > 0) {
-+                      ch = *cp++;
-+                      port->icount.rx++;
-+                      flg = TTY_NORMAL;
-+
-+                      if (!i && status &
-+                          (BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV))
-+                              goto handle_error;
-+                      if (uart_handle_sysrq_char(port, ch))
-+                              continue;
-+
-+error_return:
-+                      tty_insert_flip_char(tty, ch, flg);
-+
-+              }
-+
-+              /* This BD is ready to be used again. Clear status. get next */
-+              clrsetbits_be16(&bdp->status, BD_SC_BR | BD_SC_FR | BD_SC_PR |
-+                      BD_SC_OV | BD_SC_ID, BD_SC_EMPTY);
-+              if (in_be16(&bdp->status) & BD_SC_WRAP)
-+                      bdp = qe_port->rx_bd_base;
-+              else
-+                      bdp++;
-+
-+      }
-+
-+      /* Write back buffer pointer */
-+      qe_port->rx_cur = bdp;
-+
-+      /* Activate BH processing */
-+      tty_flip_buffer_push(tty);
-+
-+      return;
-+
-+      /* Error processing */
-+
-+handle_error:
-+      /* Statistics */
-+      if (status & BD_SC_BR)
-+              port->icount.brk++;
-+      if (status & BD_SC_PR)
-+              port->icount.parity++;
-+      if (status & BD_SC_FR)
-+              port->icount.frame++;
-+      if (status & BD_SC_OV)
-+              port->icount.overrun++;
-+
-+      /* Mask out ignored conditions */
-+      status &= port->read_status_mask;
-+
-+      /* Handle the remaining ones */
-+      if (status & BD_SC_BR)
-+              flg = TTY_BREAK;
-+      else if (status & BD_SC_PR)
-+              flg = TTY_PARITY;
-+      else if (status & BD_SC_FR)
-+              flg = TTY_FRAME;
-+
-+      /* Overrun does not affect the current character ! */
-+      if (status & BD_SC_OV)
-+              tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-+#ifdef SUPPORT_SYSRQ
-+      port->sysrq = 0;
-+#endif
-+      goto error_return;
-+}
-+
-+/* Interrupt handler
-+ *
-+ * This interrupt handler is called after a BD is processed.
-+ */
-+static irqreturn_t qe_uart_int(int irq, void *data)
-+{
-+      struct uart_qe_port *qe_port = (struct uart_qe_port *) data;
-+      struct ucc_slow __iomem *uccp = qe_port->uccp;
-+      u16 events;
-+
-+      /* Clear the interrupts */
-+      events = in_be16(&uccp->ucce);
-+      out_be16(&uccp->ucce, events);
-+
-+      if (events & UCC_UART_UCCE_BRKE)
-+              uart_handle_break(&qe_port->port);
-+
-+      if (events & UCC_UART_UCCE_RX)
-+              qe_uart_int_rx(qe_port);
-+
-+      if (events & UCC_UART_UCCE_TX)
-+              qe_uart_tx_pump(qe_port);
-+
-+      return events ? IRQ_HANDLED : IRQ_NONE;
-+}
-+
-+/* Initialize buffer descriptors
-+ *
-+ * This function initializes all of the RX and TX buffer descriptors.
-+ */
-+static void qe_uart_initbd(struct uart_qe_port *qe_port)
-+{
-+      int i;
-+      void *bd_virt;
-+      struct qe_bd *bdp;
-+
-+      /* Set the physical address of the host memory buffers in the buffer
-+       * descriptors, and the virtual address for us to work with.
-+       */
-+      bd_virt = qe_port->bd_virt;
-+      bdp = qe_port->rx_bd_base;
-+      qe_port->rx_cur = qe_port->rx_bd_base;
-+      for (i = 0; i < (qe_port->rx_nrfifos - 1); i++) {
-+              out_be16(&bdp->status, BD_SC_EMPTY | BD_SC_INTRPT);
-+              out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+              out_be16(&bdp->length, 0);
-+              bd_virt += qe_port->rx_fifosize;
-+              bdp++;
-+      }
-+
-+      /* */
-+      out_be16(&bdp->status, BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT);
-+      out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+      out_be16(&bdp->length, 0);
-+
-+      /* Set the physical address of the host memory
-+       * buffers in the buffer descriptors, and the
-+       * virtual address for us to work with.
-+       */
-+      bd_virt = qe_port->bd_virt +
-+              L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
-+      qe_port->tx_cur = qe_port->tx_bd_base;
-+      bdp = qe_port->tx_bd_base;
-+      for (i = 0; i < (qe_port->tx_nrfifos - 1); i++) {
-+              out_be16(&bdp->status, BD_SC_INTRPT);
-+              out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+              out_be16(&bdp->length, 0);
-+              bd_virt += qe_port->tx_fifosize;
-+              bdp++;
-+      }
-+
-+      /* Loopback requires the preamble bit to be set on the first TX BD */
-+#ifdef LOOPBACK
-+      setbits16(&qe_port->tx_cur->status, BD_SC_P);
-+#endif
-+
-+      out_be16(&bdp->status, BD_SC_WRAP | BD_SC_INTRPT);
-+      out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+      out_be16(&bdp->length, 0);
-+}
-+
-+/*
-+ * Initialize a UCC for UART.
-+ *
-+ * This function configures a given UCC to be used as a UART device. Basic
-+ * UCC initialization is handled in qe_uart_request_port().  This function
-+ * does all the UART-specific stuff.
-+ */
-+static void qe_uart_init_ucc(struct uart_qe_port *qe_port)
-+{
-+      u32 cecr_subblock;
-+      struct ucc_slow __iomem *uccp = qe_port->uccp;
-+      struct ucc_uart_pram *uccup = qe_port->uccup;
-+
-+      unsigned int i;
-+
-+      /* First, disable TX and RX in the UCC */
-+      ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+
-+      /* Program the UCC UART parameter RAM */
-+      out_8(&uccup->common.rbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
-+      out_8(&uccup->common.tbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
-+      out_be16(&uccup->common.mrblr, qe_port->rx_fifosize);
-+      out_be16(&uccup->maxidl, 0x10);
-+      out_be16(&uccup->brkcr, 1);
-+      out_be16(&uccup->parec, 0);
-+      out_be16(&uccup->frmec, 0);
-+      out_be16(&uccup->nosec, 0);
-+      out_be16(&uccup->brkec, 0);
-+      out_be16(&uccup->uaddr[0], 0);
-+      out_be16(&uccup->uaddr[1], 0);
-+      out_be16(&uccup->toseq, 0);
-+      for (i = 0; i < 8; i++)
-+              out_be16(&uccup->cchars[i], 0xC000);
-+      out_be16(&uccup->rccm, 0xc0ff);
-+
-+      /* Configure the GUMR registers for UART */
-+      if (soft_uart)
-+              /* Soft-UART requires a 1X multiplier for TX */
-+              clrsetbits_be32(&uccp->gumr_l,
-+                      UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+                      UCC_SLOW_GUMR_L_RDCR_MASK,
-+                      UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_1 |
-+                      UCC_SLOW_GUMR_L_RDCR_16);
-+      else
-+              clrsetbits_be32(&uccp->gumr_l,
-+                      UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+                      UCC_SLOW_GUMR_L_RDCR_MASK,
-+                      UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_16 |
-+                      UCC_SLOW_GUMR_L_RDCR_16);
-+
-+      clrsetbits_be32(&uccp->gumr_h, UCC_SLOW_GUMR_H_RFW,
-+              UCC_SLOW_GUMR_H_TRX | UCC_SLOW_GUMR_H_TTX);
-+
-+#ifdef LOOPBACK
-+      clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
-+              UCC_SLOW_GUMR_L_DIAG_LOOP);
-+      clrsetbits_be32(&uccp->gumr_h,
-+              UCC_SLOW_GUMR_H_CTSP | UCC_SLOW_GUMR_H_RSYN,
-+              UCC_SLOW_GUMR_H_CDS);
-+#endif
-+
-+      /* Enable rx interrupts  and clear all pending events.  */
-+      out_be16(&uccp->uccm, 0);
-+      out_be16(&uccp->ucce, 0xffff);
-+      out_be16(&uccp->udsr, 0x7e7e);
-+
-+      /* Initialize UPSMR */
-+      out_be16(&uccp->upsmr, 0);
-+
-+      if (soft_uart) {
-+              out_be16(&uccup->supsmr, 0x30);
-+              out_be16(&uccup->res92, 0);
-+              out_be32(&uccup->rx_state, 0);
-+              out_be32(&uccup->rx_cnt, 0);
-+              out_8(&uccup->rx_bitmark, 0);
-+              out_8(&uccup->rx_length, 10);
-+              out_be32(&uccup->dump_ptr, 0x4000);
-+              out_8(&uccup->rx_temp_dlst_qe, 0);
-+              out_be32(&uccup->rx_frame_rem, 0);
-+              out_8(&uccup->rx_frame_rem_size, 0);
-+              /* Soft-UART requires TX to be 1X */
-+              out_8(&uccup->tx_mode,
-+                      UCC_UART_TX_STATE_UART | UCC_UART_TX_STATE_X1);
-+              out_be16(&uccup->tx_state, 0);
-+              out_8(&uccup->resD4, 0);
-+              out_be16(&uccup->resD5, 0);
-+
-+              /* Set UART mode.
-+               * Enable receive and transmit.
-+               */
-+
-+              /* From the microcode errata:
-+               * 1.GUMR_L register, set mode=0010 (QMC).
-+               * 2.Set GUMR_H[17] bit. (UART/AHDLC mode).
-+               * 3.Set GUMR_H[19:20] (Transparent mode)
-+               * 4.Clear GUMR_H[26] (RFW)
-+               * ...
-+               * 6.Receiver must use 16x over sampling
-+               */
-+              clrsetbits_be32(&uccp->gumr_l,
-+                      UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+                      UCC_SLOW_GUMR_L_RDCR_MASK,
-+                      UCC_SLOW_GUMR_L_MODE_QMC | UCC_SLOW_GUMR_L_TDCR_16 |
-+                      UCC_SLOW_GUMR_L_RDCR_16);
-+
-+              clrsetbits_be32(&uccp->gumr_h,
-+                      UCC_SLOW_GUMR_H_RFW | UCC_SLOW_GUMR_H_RSYN,
-+                      UCC_SLOW_GUMR_H_SUART | UCC_SLOW_GUMR_H_TRX |
-+                      UCC_SLOW_GUMR_H_TTX | UCC_SLOW_GUMR_H_TFL);
-+
-+#ifdef LOOPBACK
-+              clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
-+                              UCC_SLOW_GUMR_L_DIAG_LOOP);
-+              clrbits32(&uccp->gumr_h, UCC_SLOW_GUMR_H_CTSP |
-+                        UCC_SLOW_GUMR_H_CDS);
-+#endif
-+
-+              cecr_subblock = ucc_slow_get_qe_cr_subblock(qe_port->ucc_num);
-+              qe_issue_cmd(QE_INIT_TX_RX, cecr_subblock,
-+                      QE_CR_PROTOCOL_UNSPECIFIED, 0);
-+      }
-+}
-+
-+/*
-+ * Initialize the port.
-+ */
-+static int qe_uart_startup(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      int ret;
-+
-+      /*
-+       * If we're using Soft-UART mode, then we need to make sure the
-+       * firmware has been uploaded first.
-+       */
-+      if (soft_uart && !firmware_loaded) {
-+              dev_err(port->dev, "Soft-UART firmware not uploaded\n");
-+              return -ENODEV;
-+      }
-+
-+      qe_uart_initbd(qe_port);
-+      qe_uart_init_ucc(qe_port);
-+
-+      /* Install interrupt handler. */
-+      ret = request_irq(port->irq, qe_uart_int, IRQF_SHARED, "ucc-uart",
-+              qe_port);
-+      if (ret) {
-+              dev_err(port->dev, "could not claim IRQ %u\n", port->irq);
-+              return ret;
-+      }
-+
-+      /* Startup rx-int */
-+      setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
-+      ucc_slow_enable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+
-+      return 0;
-+}
-+
-+/*
-+ * Shutdown the port.
-+ */
-+static void qe_uart_shutdown(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      struct ucc_slow __iomem *uccp = qe_port->uccp;
-+      unsigned int timeout = 20;
-+
-+      /* Disable RX and TX */
-+
-+      /* Wait for all the BDs marked sent */
-+      while (!qe_uart_tx_empty(port)) {
-+              if (!--timeout) {
-+                      dev_warn(port->dev, "shutdown timeout\n");
-+                      break;
-+              }
-+              set_current_state(TASK_UNINTERRUPTIBLE);
-+              schedule_timeout(2);
-+      }
-+
-+      if (qe_port->wait_closing) {
-+              /* Wait a bit longer */
-+              set_current_state(TASK_UNINTERRUPTIBLE);
-+              schedule_timeout(qe_port->wait_closing);
-+      }
-+
-+      /* Stop uarts */
-+      ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+      clrbits16(&uccp->uccm, UCC_UART_UCCE_TX | UCC_UART_UCCE_RX);
-+
-+      /* Shut them really down and reinit buffer descriptors */
-+      ucc_slow_graceful_stop_tx(qe_port->us_private);
-+      qe_uart_initbd(qe_port);
-+
-+      free_irq(port->irq, qe_port);
-+}
-+
-+/*
-+ * Set the serial port parameters.
-+ */
-+static void qe_uart_set_termios(struct uart_port *port,
-+                              struct ktermios *termios, struct ktermios *old)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      struct ucc_slow __iomem *uccp = qe_port->uccp;
-+      unsigned int baud;
-+      unsigned long flags;
-+      u16 upsmr = in_be16(&uccp->upsmr);
-+      struct ucc_uart_pram __iomem *uccup = qe_port->uccup;
-+      u16 supsmr = in_be16(&uccup->supsmr);
-+      u8 char_length = 2; /* 1 + CL + PEN + 1 + SL */
-+
-+      /* Character length programmed into the mode register is the
-+       * sum of: 1 start bit, number of data bits, 0 or 1 parity bit,
-+       * 1 or 2 stop bits, minus 1.
-+       * The value 'bits' counts this for us.
-+       */
-+
-+      /* byte size */
-+      upsmr &= UCC_UART_UPSMR_CL_MASK;
-+      supsmr &= UCC_UART_SUPSMR_CL_MASK;
-+
-+      switch (termios->c_cflag & CSIZE) {
-+      case CS5:
-+              upsmr |= UCC_UART_UPSMR_CL_5;
-+              supsmr |= UCC_UART_SUPSMR_CL_5;
-+              char_length += 5;
-+              break;
-+      case CS6:
-+              upsmr |= UCC_UART_UPSMR_CL_6;
-+              supsmr |= UCC_UART_SUPSMR_CL_6;
-+              char_length += 6;
-+              break;
-+      case CS7:
-+              upsmr |= UCC_UART_UPSMR_CL_7;
-+              supsmr |= UCC_UART_SUPSMR_CL_7;
-+              char_length += 7;
-+              break;
-+      default:        /* case CS8 */
-+              upsmr |= UCC_UART_UPSMR_CL_8;
-+              supsmr |= UCC_UART_SUPSMR_CL_8;
-+              char_length += 8;
-+              break;
-+      }
-+
-+      /* If CSTOPB is set, we want two stop bits */
-+      if (termios->c_cflag & CSTOPB) {
-+              upsmr |= UCC_UART_UPSMR_SL;
-+              supsmr |= UCC_UART_SUPSMR_SL;
-+              char_length++;  /* + SL */
-+      }
-+
-+      if (termios->c_cflag & PARENB) {
-+              upsmr |= UCC_UART_UPSMR_PEN;
-+              supsmr |= UCC_UART_SUPSMR_PEN;
-+              char_length++;  /* + PEN */
-+
-+              if (!(termios->c_cflag & PARODD)) {
-+                      upsmr &= ~(UCC_UART_UPSMR_RPM_MASK |
-+                                 UCC_UART_UPSMR_TPM_MASK);
-+                      upsmr |= UCC_UART_UPSMR_RPM_EVEN |
-+                              UCC_UART_UPSMR_TPM_EVEN;
-+                      supsmr &= ~(UCC_UART_SUPSMR_RPM_MASK |
-+                                  UCC_UART_SUPSMR_TPM_MASK);
-+                      supsmr |= UCC_UART_SUPSMR_RPM_EVEN |
-+                              UCC_UART_SUPSMR_TPM_EVEN;
-+              }
-+      }
-+
-+      /*
-+       * Set up parity check flag
-+       */
-+      port->read_status_mask = BD_SC_EMPTY | BD_SC_OV;
-+      if (termios->c_iflag & INPCK)
-+              port->read_status_mask |= BD_SC_FR | BD_SC_PR;
-+      if (termios->c_iflag & (BRKINT | PARMRK))
-+              port->read_status_mask |= BD_SC_BR;
-+
-+      /*
-+       * Characters to ignore
-+       */
-+      port->ignore_status_mask = 0;
-+      if (termios->c_iflag & IGNPAR)
-+              port->ignore_status_mask |= BD_SC_PR | BD_SC_FR;
-+      if (termios->c_iflag & IGNBRK) {
-+              port->ignore_status_mask |= BD_SC_BR;
-+              /*
-+               * If we're ignore parity and break indicators, ignore
-+               * overruns too.  (For real raw support).
-+               */
-+              if (termios->c_iflag & IGNPAR)
-+                      port->ignore_status_mask |= BD_SC_OV;
-+      }
-+      /*
-+       * !!! ignore all characters if CREAD is not set
-+       */
-+      if ((termios->c_cflag & CREAD) == 0)
-+              port->read_status_mask &= ~BD_SC_EMPTY;
-+
-+      baud = uart_get_baud_rate(port, termios, old, 0, 115200);
-+
-+      /* Do we really need a spinlock here? */
-+      spin_lock_irqsave(&port->lock, flags);
-+
-+      out_be16(&uccp->upsmr, upsmr);
-+      if (soft_uart) {
-+              out_be16(&uccup->supsmr, supsmr);
-+              out_8(&uccup->rx_length, char_length);
-+
-+              /* Soft-UART requires a 1X multiplier for TX */
-+              qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
-+              qe_setbrg(qe_port->us_info.tx_clock, baud, 1);
-+      } else {
-+              qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
-+              qe_setbrg(qe_port->us_info.tx_clock, baud, 16);
-+      }
-+
-+      spin_unlock_irqrestore(&port->lock, flags);
-+}
-+
-+/*
-+ * Return a pointer to a string that describes what kind of port this is.
-+ */
-+static const char *qe_uart_type(struct uart_port *port)
-+{
-+      return "QE";
-+}
-+
-+/*
-+ * Allocate any memory and I/O resources required by the port.
-+ */
-+static int qe_uart_request_port(struct uart_port *port)
-+{
-+      int ret;
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      struct ucc_slow_info *us_info = &qe_port->us_info;
-+      struct ucc_slow_private *uccs;
-+      unsigned int rx_size, tx_size;
-+      void *bd_virt;
-+      dma_addr_t bd_dma_addr = 0;
-+
-+      ret = ucc_slow_init(us_info, &uccs);
-+      if (ret) {
-+              dev_err(port->dev, "could not initialize UCC%u\n",
-+                     qe_port->ucc_num);
-+              return ret;
-+      }
-+
-+      qe_port->us_private = uccs;
-+      qe_port->uccp = uccs->us_regs;
-+      qe_port->uccup = (struct ucc_uart_pram *) uccs->us_pram;
-+      qe_port->rx_bd_base = uccs->rx_bd;
-+      qe_port->tx_bd_base = uccs->tx_bd;
-+
-+      /*
-+       * Allocate the transmit and receive data buffers.
-+       */
-+
-+      rx_size = L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
-+      tx_size = L1_CACHE_ALIGN(qe_port->tx_nrfifos * qe_port->tx_fifosize);
-+
-+      bd_virt = dma_alloc_coherent(NULL, rx_size + tx_size, &bd_dma_addr,
-+              GFP_KERNEL);
-+      if (!bd_virt) {
-+              dev_err(port->dev, "could not allocate buffer descriptors\n");
-+              return -ENOMEM;
-+      }
-+
-+      qe_port->bd_virt = bd_virt;
-+      qe_port->bd_dma_addr = bd_dma_addr;
-+      qe_port->bd_size = rx_size + tx_size;
-+
-+      qe_port->rx_buf = bd_virt;
-+      qe_port->tx_buf = qe_port->rx_buf + rx_size;
-+
-+      return 0;
-+}
-+
-+/*
-+ * Configure the port.
-+ *
-+ * We say we're a CPM-type port because that's mostly true.  Once the device
-+ * is configured, this driver operates almost identically to the CPM serial
-+ * driver.
-+ */
-+static void qe_uart_config_port(struct uart_port *port, int flags)
-+{
-+      if (flags & UART_CONFIG_TYPE) {
-+              port->type = PORT_CPM;
-+              qe_uart_request_port(port);
-+      }
-+}
-+
-+/*
-+ * Release any memory and I/O resources that were allocated in
-+ * qe_uart_request_port().
-+ */
-+static void qe_uart_release_port(struct uart_port *port)
-+{
-+      struct uart_qe_port *qe_port =
-+              container_of(port, struct uart_qe_port, port);
-+      struct ucc_slow_private *uccs = qe_port->us_private;
-+
-+      dma_free_coherent(NULL, qe_port->bd_size, qe_port->bd_virt,
-+                        qe_port->bd_dma_addr);
-+
-+      ucc_slow_free(uccs);
-+}
-+
-+/*
-+ * Verify that the data in serial_struct is suitable for this device.
-+ */
-+static int qe_uart_verify_port(struct uart_port *port,
-+                             struct serial_struct *ser)
-+{
-+      if (ser->type != PORT_UNKNOWN && ser->type != PORT_CPM)
-+              return -EINVAL;
-+
-+      if (ser->irq < 0 || ser->irq >= NR_IRQS)
-+              return -EINVAL;
-+
-+      if (ser->baud_base < 9600)
-+              return -EINVAL;
-+
-+      return 0;
-+}
-+/* UART operations
-+ *
-+ * Details on these functions can be found in Documentation/serial/driver
-+ */
-+static struct uart_ops qe_uart_pops = {
-+      .tx_empty       = qe_uart_tx_empty,
-+      .set_mctrl      = qe_uart_set_mctrl,
-+      .get_mctrl      = qe_uart_get_mctrl,
-+      .stop_tx        = qe_uart_stop_tx,
-+      .start_tx       = qe_uart_start_tx,
-+      .stop_rx        = qe_uart_stop_rx,
-+      .enable_ms      = qe_uart_enable_ms,
-+      .break_ctl      = qe_uart_break_ctl,
-+      .startup        = qe_uart_startup,
-+      .shutdown       = qe_uart_shutdown,
-+      .set_termios    = qe_uart_set_termios,
-+      .type           = qe_uart_type,
-+      .release_port   = qe_uart_release_port,
-+      .request_port   = qe_uart_request_port,
-+      .config_port    = qe_uart_config_port,
-+      .verify_port    = qe_uart_verify_port,
-+};
-+
-+/*
-+ * Obtain the SOC model number and revision level
-+ *
-+ * This function parses the device tree to obtain the SOC model.  It then
-+ * reads the SVR register to the revision.
-+ *
-+ * The device tree stores the SOC model two different ways.
-+ *
-+ * The new way is:
-+ *
-+ *            cpu@0 {
-+ *                    compatible = "PowerPC,8323";
-+ *                    device_type = "cpu";
-+ *                    ...
-+ *
-+ *
-+ * The old way is:
-+ *             PowerPC,8323@0 {
-+ *                    device_type = "cpu";
-+ *                    ...
-+ *
-+ * This code first checks the new way, and then the old way.
-+ */
-+static unsigned int soc_info(unsigned int *rev_h, unsigned int *rev_l)
-+{
-+      struct device_node *np;
-+      const char *soc_string;
-+      unsigned int svr;
-+      unsigned int soc;
-+
-+      /* Find the CPU node */
-+      np = of_find_node_by_type(NULL, "cpu");
-+      if (!np)
-+              return 0;
-+      /* Find the compatible property */
-+      soc_string = of_get_property(np, "compatible", NULL);
-+      if (!soc_string)
-+              /* No compatible property, so try the name. */
-+              soc_string = np->name;
-+
-+      /* Extract the SOC number from the "PowerPC," string */
-+      if ((sscanf(soc_string, "PowerPC,%u", &soc) != 1) || !soc)
-+              return 0;
-+
-+      /* Get the revision from the SVR */
-+      svr = mfspr(SPRN_SVR);
-+      *rev_h = (svr >> 4) & 0xf;
-+      *rev_l = svr & 0xf;
-+
-+      return soc;
-+}
-+
-+/*
-+ * requst_firmware_nowait() callback function
-+ *
-+ * This function is called by the kernel when a firmware is made available,
-+ * or if it times out waiting for the firmware.
-+ */
-+static void uart_firmware_cont(const struct firmware *fw, void *context)
-+{
-+      struct qe_firmware *firmware;
-+      struct device *dev = context;
-+      int ret;
-+
-+      if (!fw) {
-+              dev_err(dev, "firmware not found\n");
-+              return;
-+      }
-+
-+      firmware = (struct qe_firmware *) fw->data;
-+
-+      if (firmware->header.length != fw->size) {
-+              dev_err(dev, "invalid firmware\n");
-+              return;
-+      }
-+
-+      ret = qe_upload_firmware(firmware);
-+      if (ret) {
-+              dev_err(dev, "could not load firmware\n");
-+              return;
-+      }
-+
-+      firmware_loaded = 1;
-+}
-+
-+static int ucc_uart_probe(struct of_device *ofdev,
-+      const struct of_device_id *match)
-+{
-+      struct device_node *np = ofdev->node;
-+      const unsigned int *iprop;      /* Integer OF properties */
-+      const char *sprop;      /* String OF properties */
-+      struct uart_qe_port *qe_port = NULL;
-+      struct resource res;
-+      int ret;
-+
-+      /*
-+       * Determine if we need Soft-UART mode
-+       */
-+      if (of_find_property(np, "soft-uart", NULL)) {
-+              dev_dbg(&ofdev->dev, "using Soft-UART mode\n");
-+              soft_uart = 1;
-+      }
-+
-+      /*
-+       * If we are using Soft-UART, determine if we need to upload the
-+       * firmware, too.
-+       */
-+      if (soft_uart) {
-+              struct qe_firmware_info *qe_fw_info;
-+
-+              qe_fw_info = qe_get_firmware_info();
-+
-+              /* Check if the firmware has been uploaded. */
-+              if (qe_fw_info && strstr(qe_fw_info->id, "Soft-UART")) {
-+                      firmware_loaded = 1;
-+              } else {
-+                      char filename[32];
-+                      unsigned int soc;
-+                      unsigned int rev_h;
-+                      unsigned int rev_l;
-+
-+                      soc = soc_info(&rev_h, &rev_l);
-+                      if (!soc) {
-+                              dev_err(&ofdev->dev, "unknown CPU model\n");
-+                              return -ENXIO;
-+                      }
-+                      sprintf(filename, "fsl_qe_ucode_uart_%u_%u%u.bin",
-+                              soc, rev_h, rev_l);
-+
-+                      dev_info(&ofdev->dev, "waiting for firmware %s\n",
-+                              filename);
-+
-+                      /*
-+                       * We call request_firmware_nowait instead of
-+                       * request_firmware so that the driver can load and
-+                       * initialize the ports without holding up the rest of
-+                       * the kernel.  If hotplug support is enabled in the
-+                       * kernel, then we use it.
-+                       */
-+                      ret = request_firmware_nowait(THIS_MODULE,
-+                              FW_ACTION_HOTPLUG, filename, &ofdev->dev,
-+                              &ofdev->dev, uart_firmware_cont);
-+                      if (ret) {
-+                              dev_err(&ofdev->dev,
-+                                      "could not load firmware %s\n",
-+                                      filename);
-+                              return ret;
-+                      }
-+              }
-+      }
-+
-+      qe_port = kzalloc(sizeof(struct uart_qe_port), GFP_KERNEL);
-+      if (!qe_port) {
-+              dev_err(&ofdev->dev, "can't allocate QE port structure\n");
-+              return -ENOMEM;
-+      }
-+
-+      /* Search for IRQ and mapbase */
-+      ret = of_address_to_resource(np, 0, &res);
-+      if (ret) {
-+              dev_err(&ofdev->dev, "missing 'reg' property in device tree\n");
-+              kfree(qe_port);
-+              return ret;
-+      }
-+      if (!res.start) {
-+              dev_err(&ofdev->dev, "invalid 'reg' property in device tree\n");
-+              kfree(qe_port);
-+              return -EINVAL;
-+      }
-+      qe_port->port.mapbase = res.start;
-+
-+      /* Get the UCC number (device ID) */
-+      /* UCCs are numbered 1-7 */
-+      iprop = of_get_property(np, "device-id", NULL);
-+      if (!iprop || (*iprop < 1) || (*iprop > UCC_MAX_NUM)) {
-+              dev_err(&ofdev->dev,
-+                      "missing or invalid UCC specified in device tree\n");
-+              kfree(qe_port);
-+              return -ENODEV;
-+      }
-+      qe_port->ucc_num = *iprop - 1;
-+
-+      /*
-+       * In the future, we should not require the BRG to be specified in the
-+       * device tree.  If no clock-source is specified, then just pick a BRG
-+       * to use.  This requires a new QE library function that manages BRG
-+       * assignments.
-+       */
-+
-+      sprop = of_get_property(np, "rx-clock-name", NULL);
-+      if (!sprop) {
-+              dev_err(&ofdev->dev, "missing rx-clock-name in device tree\n");
-+              kfree(qe_port);
-+              return -ENODEV;
-+      }
-+
-+      qe_port->us_info.rx_clock = qe_clock_source(sprop);
-+      if ((qe_port->us_info.rx_clock < QE_BRG1) ||
-+          (qe_port->us_info.rx_clock > QE_BRG16)) {
-+              dev_err(&ofdev->dev, "rx-clock-name must be a BRG for UART\n");
-+              kfree(qe_port);
-+              return -ENODEV;
-+      }
-+
-+#ifdef LOOPBACK
-+      /* In internal loopback mode, TX and RX must use the same clock */
-+      qe_port->us_info.tx_clock = qe_port->us_info.rx_clock;
-+#else
-+      sprop = of_get_property(np, "tx-clock-name", NULL);
-+      if (!sprop) {
-+              dev_err(&ofdev->dev, "missing tx-clock-name in device tree\n");
-+              kfree(qe_port);
-+              return -ENODEV;
-+      }
-+      qe_port->us_info.tx_clock = qe_clock_source(sprop);
-+#endif
-+      if ((qe_port->us_info.tx_clock < QE_BRG1) ||
-+          (qe_port->us_info.tx_clock > QE_BRG16)) {
-+              dev_err(&ofdev->dev, "tx-clock-name must be a BRG for UART\n");
-+              kfree(qe_port);
-+              return -ENODEV;
-+      }
-+
-+      /* Get the port number, numbered 0-3 */
-+      iprop = of_get_property(np, "port-number", NULL);
-+      if (!iprop) {
-+              dev_err(&ofdev->dev, "missing port-number in device tree\n");
-+              kfree(qe_port);
-+              return -EINVAL;
-+      }
-+      qe_port->port.line = *iprop;
-+      if (qe_port->port.line >= UCC_MAX_UART) {
-+              dev_err(&ofdev->dev, "port-number must be 0-%u\n",
-+                      UCC_MAX_UART - 1);
-+              kfree(qe_port);
-+              return -EINVAL;
-+      }
-+
-+      qe_port->port.irq = irq_of_parse_and_map(np, 0);
-+      if (qe_port->port.irq == NO_IRQ) {
-+              dev_err(&ofdev->dev, "could not map IRQ for UCC%u\n",
-+                     qe_port->ucc_num + 1);
-+              kfree(qe_port);
-+              return -EINVAL;
-+      }
-+
-+      /*
-+       * Newer device trees have an "fsl,qe" compatible property for the QE
-+       * node, but we still need to support older device trees.
-+       */
-+      np = of_find_compatible_node(NULL, NULL, "fsl,qe");
-+      if (!np) {
-+              np = of_find_node_by_type(NULL, "qe");
-+              if (!np) {
-+                      dev_err(&ofdev->dev, "could not find 'qe' node\n");
-+                      kfree(qe_port);
-+                      return -EINVAL;
-+              }
-+      }
-+
-+      iprop = of_get_property(np, "brg-frequency", NULL);
-+      if (!iprop) {
-+              dev_err(&ofdev->dev,
-+                     "missing brg-frequency in device tree\n");
-+              kfree(qe_port);
-+              return -EINVAL;
-+      }
-+
-+      if (*iprop)
-+              qe_port->port.uartclk = *iprop;
-+      else {
-+              /*
-+               * Older versions of U-Boot do not initialize the brg-frequency
-+               * property, so in this case we assume the BRG frequency is
-+               * half the QE bus frequency.
-+               */
-+              iprop = of_get_property(np, "bus-frequency", NULL);
-+              if (!iprop) {
-+                      dev_err(&ofdev->dev,
-+                              "missing QE bus-frequency in device tree\n");
-+                      kfree(qe_port);
-+                      return -EINVAL;
-+              }
-+              if (*iprop)
-+                      qe_port->port.uartclk = *iprop / 2;
-+              else {
-+                      dev_err(&ofdev->dev,
-+                              "invalid QE bus-frequency in device tree\n");
-+                      kfree(qe_port);
-+                      return -EINVAL;
-+              }
-+      }
-+
-+      spin_lock_init(&qe_port->port.lock);
-+      qe_port->np = np;
-+      qe_port->port.dev = &ofdev->dev;
-+      qe_port->port.ops = &qe_uart_pops;
-+      qe_port->port.iotype = UPIO_MEM;
-+
-+      qe_port->tx_nrfifos = TX_NUM_FIFO;
-+      qe_port->tx_fifosize = TX_BUF_SIZE;
-+      qe_port->rx_nrfifos = RX_NUM_FIFO;
-+      qe_port->rx_fifosize = RX_BUF_SIZE;
-+
-+      qe_port->wait_closing = UCC_WAIT_CLOSING;
-+      qe_port->port.fifosize = 512;
-+      qe_port->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
-+
-+      qe_port->us_info.ucc_num = qe_port->ucc_num;
-+      qe_port->us_info.regs = (phys_addr_t) res.start;
-+      qe_port->us_info.irq = qe_port->port.irq;
-+
-+      qe_port->us_info.rx_bd_ring_len = qe_port->rx_nrfifos;
-+      qe_port->us_info.tx_bd_ring_len = qe_port->tx_nrfifos;
-+
-+      /* Make sure ucc_slow_init() initializes both TX and RX */
-+      qe_port->us_info.init_tx = 1;
-+      qe_port->us_info.init_rx = 1;
-+
-+      /* Add the port to the uart sub-system.  This will cause
-+       * qe_uart_config_port() to be called, so the us_info structure must
-+       * be initialized.
-+       */
-+      ret = uart_add_one_port(&ucc_uart_driver, &qe_port->port);
-+      if (ret) {
-+              dev_err(&ofdev->dev, "could not add /dev/ttyQE%u\n",
-+                     qe_port->port.line);
-+              kfree(qe_port);
-+              return ret;
-+      }
-+
-+      dev_set_drvdata(&ofdev->dev, qe_port);
-+
-+      dev_info(&ofdev->dev, "UCC%u assigned to /dev/ttyQE%u\n",
-+              qe_port->ucc_num + 1, qe_port->port.line);
-+
-+      /* Display the mknod command for this device */
-+      dev_dbg(&ofdev->dev, "mknod command is 'mknod /dev/ttyQE%u c %u %u'\n",
-+             qe_port->port.line, SERIAL_QE_MAJOR,
-+             SERIAL_QE_MINOR + qe_port->port.line);
-+
-+      return 0;
-+}
-+
-+static int ucc_uart_remove(struct of_device *ofdev)
-+{
-+      struct uart_qe_port *qe_port = dev_get_drvdata(&ofdev->dev);
-+
-+      dev_info(&ofdev->dev, "removing /dev/ttyQE%u\n", qe_port->port.line);
-+
-+      uart_remove_one_port(&ucc_uart_driver, &qe_port->port);
-+
-+      dev_set_drvdata(&ofdev->dev, NULL);
-+      kfree(qe_port);
-+
-+      return 0;
-+}
-+
-+static struct of_device_id ucc_uart_match[] = {
-+      {
-+              .type = "serial",
-+              .compatible = "ucc_uart",
-+      },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, ucc_uart_match);
-+
-+static struct of_platform_driver ucc_uart_of_driver = {
-+      .owner          = THIS_MODULE,
-+      .name           = "ucc_uart",
-+      .match_table    = ucc_uart_match,
-+      .probe          = ucc_uart_probe,
-+      .remove         = ucc_uart_remove,
-+};
-+
-+static int __init ucc_uart_init(void)
-+{
-+      int ret;
-+
-+      printk(KERN_INFO "Freescale QUICC Engine UART device driver\n");
-+#ifdef LOOPBACK
-+      printk(KERN_INFO "ucc-uart: Using loopback mode\n");
-+#endif
-+
-+      ret = uart_register_driver(&ucc_uart_driver);
-+      if (ret) {
-+              printk(KERN_ERR "ucc-uart: could not register UART driver\n");
-+              return ret;
-+      }
-+
-+      ret = of_register_platform_driver(&ucc_uart_of_driver);
-+      if (ret)
-+              printk(KERN_ERR
-+                     "ucc-uart: could not register platform driver\n");
-+
-+      return ret;
-+}
-+
-+static void __exit ucc_uart_exit(void)
-+{
-+      printk(KERN_INFO
-+             "Freescale QUICC Engine UART device driver unloading\n");
-+
-+      of_unregister_platform_driver(&ucc_uart_of_driver);
-+      uart_unregister_driver(&ucc_uart_driver);
-+}
-+
-+module_init(ucc_uart_init);
-+module_exit(ucc_uart_exit);
-+
-+MODULE_DESCRIPTION("Freescale QUICC Engine (QE) UART");
-+MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_QE_MAJOR);
-+
---- a/drivers/spi/mpc52xx_psc_spi.c
-+++ b/drivers/spi/mpc52xx_psc_spi.c
-@@ -330,6 +330,7 @@ static void mpc52xx_psc_spi_cleanup(stru
- static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
- {
-+      struct device_node *np;
-       struct mpc52xx_cdm __iomem *cdm;
-       struct mpc52xx_gpio __iomem *gpio;
-       struct mpc52xx_psc __iomem *psc = mps->psc;
-@@ -338,8 +339,12 @@ static int mpc52xx_psc_spi_port_config(i
-       int ret = 0;
- #if defined(CONFIG_PPC_MERGE)
--      cdm = mpc52xx_find_and_map("mpc5200-cdm");
--      gpio = mpc52xx_find_and_map("mpc5200-gpio");
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
-+      cdm = of_iomap(np, 0);
-+      of_node_put(np);
-+      np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
-+      gpio = of_iomap(np, 0);
-+      of_node_put(np);
- #else
-       cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);
-       gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
---- a/fs/openpromfs/inode.c
-+++ b/fs/openpromfs/inode.c
-@@ -131,7 +131,7 @@ static void property_stop(struct seq_fil
-       /* Nothing to do */
- }
--static const struct seq_operations property_op = {
-+static struct seq_operations property_op = {
-       .start          = property_start,
-       .next           = property_next,
-       .stop           = property_stop,
---- a/include/asm-powerpc/8xx_immap.h
-+++ b/include/asm-powerpc/8xx_immap.h
-@@ -123,7 +123,7 @@ typedef struct     mem_ctlr {
- #define OR_G5LA               0x00000400      /* Output #GPL5 on #GPL_A5              */
- #define OR_G5LS               0x00000200      /* Drive #GPL high on falling edge of...*/
- #define OR_BI         0x00000100      /* Burst inhibit                        */
--#define OR_SCY_MSK    0x000000f0      /* Cycle Lenght in Clocks               */
-+#define OR_SCY_MSK    0x000000f0      /* Cycle Length in Clocks               */
- #define OR_SCY_0_CLK  0x00000000      /* 0 clock cycles wait states           */
- #define OR_SCY_1_CLK  0x00000010      /* 1 clock cycles wait states           */
- #define OR_SCY_2_CLK  0x00000020      /* 2 clock cycles wait states           */
---- a/include/asm-powerpc/commproc.h
-+++ b/include/asm-powerpc/commproc.h
-@@ -693,7 +693,7 @@ typedef struct risc_timer_pram {
- #define       CICR_SCC_SCC3           ((uint)0x00200000)      /* SCC3 @ SCCc */
- #define       CICR_SCB_SCC2           ((uint)0x00040000)      /* SCC2 @ SCCb */
- #define       CICR_SCA_SCC1           ((uint)0x00000000)      /* SCC1 @ SCCa */
--#define CICR_IRL_MASK         ((uint)0x0000e000)      /* Core interrrupt */
-+#define CICR_IRL_MASK         ((uint)0x0000e000)      /* Core interrupt */
- #define CICR_HP_MASK          ((uint)0x00001f00)      /* Hi-pri int. */
- #define CICR_IEN              ((uint)0x00000080)      /* Int. enable */
- #define CICR_SPS              ((uint)0x00000001)      /* SCC Spread */
---- a/include/asm-powerpc/cpm.h
-+++ b/include/asm-powerpc/cpm.h
-@@ -10,5 +10,6 @@ int cpm_muram_free(unsigned long offset)
- unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
- void __iomem *cpm_muram_addr(unsigned long offset);
- dma_addr_t cpm_muram_dma(void __iomem *addr);
-+int cpm_command(u32 command, u8 opcode);
- #endif
---- a/include/asm-powerpc/cputable.h
-+++ b/include/asm-powerpc/cputable.h
-@@ -57,6 +57,14 @@ enum powerpc_pmc_type {
-       PPC_PMC_PA6T = 2,
- };
-+struct pt_regs;
-+
-+extern int machine_check_generic(struct pt_regs *regs);
-+extern int machine_check_4xx(struct pt_regs *regs);
-+extern int machine_check_440A(struct pt_regs *regs);
-+extern int machine_check_e500(struct pt_regs *regs);
-+extern int machine_check_e200(struct pt_regs *regs);
-+
- /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
- struct cpu_spec {
-       /* CPU is matched via (PVR & pvr_mask) == pvr_value */
-@@ -97,6 +105,11 @@ struct cpu_spec {
-       /* Name of processor class, for the ELF AT_PLATFORM entry */
-       char            *platform;
-+
-+      /* Processor specific machine check handling. Return negative
-+       * if the error is fatal, 1 if it was fully recovered and 0 to
-+       * pass up (not CPU originated) */
-+      int             (*machine_check)(struct pt_regs *regs);
- };
- extern struct cpu_spec                *cur_cpu_spec;
---- /dev/null
-+++ b/include/asm-powerpc/cputhreads.h
-@@ -0,0 +1,71 @@
-+#ifndef _ASM_POWERPC_CPUTHREADS_H
-+#define _ASM_POWERPC_CPUTHREADS_H
-+
-+#include <linux/cpumask.h>
-+
-+/*
-+ * Mapping of threads to cores
-+ */
-+
-+#ifdef CONFIG_SMP
-+extern int threads_per_core;
-+extern int threads_shift;
-+extern cpumask_t threads_core_mask;
-+#else
-+#define threads_per_core      1
-+#define threads_shift         0
-+#define threads_core_mask     (CPU_MASK_CPU0)
-+#endif
-+
-+/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
-+ *                            hit by the argument
-+ *
-+ * @threads:  a cpumask of threads
-+ *
-+ * This function returns a cpumask which will have one "cpu" (or thread)
-+ * bit set for each core that has at least one thread set in the argument.
-+ *
-+ * This can typically be used for things like IPI for tlb invalidations
-+ * since those need to be done only once per core/TLB
-+ */
-+static inline cpumask_t cpu_thread_mask_to_cores(cpumask_t threads)
-+{
-+      cpumask_t       tmp, res;
-+      int             i;
-+
-+      res = CPU_MASK_NONE;
-+      for (i = 0; i < NR_CPUS; i += threads_per_core) {
-+              cpus_shift_right(tmp, threads_core_mask, i);
-+              if (cpus_intersects(threads, tmp))
-+                      cpu_set(i, res);
-+      }
-+      return res;
-+}
-+
-+static inline int cpu_nr_cores(void)
-+{
-+      return NR_CPUS >> threads_shift;
-+}
-+
-+static inline cpumask_t cpu_online_cores_map(void)
-+{
-+      return cpu_thread_mask_to_cores(cpu_online_map);
-+}
-+
-+static inline int cpu_thread_to_core(int cpu)
-+{
-+      return cpu >> threads_shift;
-+}
-+
-+static inline int cpu_thread_in_core(int cpu)
-+{
-+      return cpu & (threads_per_core - 1);
-+}
-+
-+static inline int cpu_first_thread_in_core(int cpu)
-+{
-+      return cpu & ~(threads_per_core - 1);
-+}
-+
-+#endif /* _ASM_POWERPC_CPUTHREADS_H */
-+
---- a/include/asm-powerpc/dcr-native.h
-+++ b/include/asm-powerpc/dcr-native.h
-@@ -22,6 +22,8 @@
- #ifdef __KERNEL__
- #ifndef __ASSEMBLY__
-+#include <linux/spinlock.h>
-+
- typedef struct {
-       unsigned int base;
- } dcr_host_t;
-@@ -55,20 +57,28 @@ do {                                                               \
- } while (0)
- /* R/W of indirect DCRs make use of standard naming conventions for DCRs */
--#define mfdcri(base, reg)                     \
--({                                            \
--      mtdcr(base ## _CFGADDR, base ## _ ## reg);      \
--      mfdcr(base ## _CFGDATA);                        \
-+extern spinlock_t dcr_ind_lock;
-+
-+#define mfdcri(base, reg)                             \
-+({                                                    \
-+      unsigned long flags;                            \
-+      unsigned int val;                               \
-+      spin_lock_irqsave(&dcr_ind_lock, flags);        \
-+      mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg);      \
-+      val = mfdcr(DCRN_ ## base ## _CONFIG_DATA);     \
-+      spin_unlock_irqrestore(&dcr_ind_lock, flags);   \
-+      val;                                            \
- })
--#define mtdcri(base, reg, data)                       \
--do {                                          \
--      mtdcr(base ## _CFGADDR, base ## _ ## reg);      \
--      mtdcr(base ## _CFGDATA, data);          \
-+#define mtdcri(base, reg, data)                               \
-+do {                                                  \
-+      unsigned long flags;                            \
-+      spin_lock_irqsave(&dcr_ind_lock, flags);        \
-+      mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg);      \
-+      mtdcr(DCRN_ ## base ## _CONFIG_DATA, data);     \
-+      spin_unlock_irqrestore(&dcr_ind_lock, flags);   \
- } while (0)
- #endif /* __ASSEMBLY__ */
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_DCR_NATIVE_H */
--
--
---- /dev/null
-+++ b/include/asm-powerpc/dcr-regs.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Common DCR / SDR / CPR register definitions used on various IBM/AMCC
-+ * 4xx processors
-+ *
-+ *    Copyright 2007 Benjamin Herrenschmidt, IBM Corp
-+ *                   <benh@kernel.crashing.org>
-+ *
-+ * Mostly lifted from asm-ppc/ibm4xx.h by
-+ *
-+ *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
-+ *
-+ */
-+
-+#ifndef __DCR_REGS_H__
-+#define __DCR_REGS_H__
-+
-+/*
-+ * Most DCRs used for controlling devices such as the MAL, DMA engine,
-+ * etc... are obtained for the device tree.
-+ *
-+ * The definitions in this files are fixed DCRs and indirect DCRs that
-+ * are commonly used outside of specific drivers or refer to core
-+ * common registers that may occasionally have to be tweaked outside
-+ * of the driver main register set
-+ */
-+
-+/* CPRs (440GX and 440SP/440SPe) */
-+#define DCRN_CPR0_CONFIG_ADDR 0xc
-+#define DCRN_CPR0_CONFIG_DATA 0xd
-+
-+/* SDRs (440GX and 440SP/440SPe) */
-+#define DCRN_SDR0_CONFIG_ADDR         0xe
-+#define DCRN_SDR0_CONFIG_DATA 0xf
-+
-+#define SDR0_PFC0             0x4100
-+#define SDR0_PFC1             0x4101
-+#define SDR0_PFC1_EPS         0x1c00000
-+#define SDR0_PFC1_EPS_SHIFT   22
-+#define SDR0_PFC1_RMII                0x02000000
-+#define SDR0_MFR              0x4300
-+#define SDR0_MFR_TAH0                 0x80000000      /* TAHOE0 Enable */
-+#define SDR0_MFR_TAH1                 0x40000000      /* TAHOE1 Enable */
-+#define SDR0_MFR_PCM                  0x10000000      /* PPC440GP irq compat mode */
-+#define SDR0_MFR_ECS                  0x08000000      /* EMAC int clk */
-+#define SDR0_MFR_T0TXFL               0x00080000
-+#define SDR0_MFR_T0TXFH               0x00040000
-+#define SDR0_MFR_T1TXFL               0x00020000
-+#define SDR0_MFR_T1TXFH               0x00010000
-+#define SDR0_MFR_E0TXFL               0x00008000
-+#define SDR0_MFR_E0TXFH               0x00004000
-+#define SDR0_MFR_E0RXFL               0x00002000
-+#define SDR0_MFR_E0RXFH               0x00001000
-+#define SDR0_MFR_E1TXFL               0x00000800
-+#define SDR0_MFR_E1TXFH               0x00000400
-+#define SDR0_MFR_E1RXFL               0x00000200
-+#define SDR0_MFR_E1RXFH               0x00000100
-+#define SDR0_MFR_E2TXFL               0x00000080
-+#define SDR0_MFR_E2TXFH               0x00000040
-+#define SDR0_MFR_E2RXFL               0x00000020
-+#define SDR0_MFR_E2RXFH               0x00000010
-+#define SDR0_MFR_E3TXFL               0x00000008
-+#define SDR0_MFR_E3TXFH               0x00000004
-+#define SDR0_MFR_E3RXFL               0x00000002
-+#define SDR0_MFR_E3RXFH               0x00000001
-+#define SDR0_UART0            0x0120
-+#define SDR0_UART1            0x0121
-+#define SDR0_UART2            0x0122
-+#define SDR0_UART3            0x0123
-+#define SDR0_CUST0            0x4000
-+
-+#endif /* __DCR_REGS_H__ */
---- a/include/asm-powerpc/dma-mapping.h
-+++ b/include/asm-powerpc/dma-mapping.h
-@@ -87,6 +87,9 @@ static inline int dma_supported(struct d
-       return dma_ops->dma_supported(dev, mask);
- }
-+/* We have our own implementation of pci_set_dma_mask() */
-+#define HAVE_ARCH_PCI_SET_DMA_MASK
-+
- static inline int dma_set_mask(struct device *dev, u64 dma_mask)
- {
-       struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
-@@ -186,8 +189,6 @@ static inline void dma_unmap_sg(struct d
- extern struct dma_mapping_ops dma_iommu_ops;
- extern struct dma_mapping_ops dma_direct_ops;
--extern unsigned long dma_direct_offset;
--
- #else /* CONFIG_PPC64 */
- #define dma_supported(dev, mask)      (1)
---- a/include/asm-powerpc/firmware.h
-+++ b/include/asm-powerpc/firmware.h
-@@ -64,7 +64,7 @@ enum {
-       FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
-       FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
-       FW_FEATURE_CELLEB_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
--      FW_FEATURE_CELLEB_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
-+      FW_FEATURE_CELLEB_ALWAYS = 0,
-       FW_FEATURE_NATIVE_POSSIBLE = 0,
-       FW_FEATURE_NATIVE_ALWAYS = 0,
-       FW_FEATURE_POSSIBLE =
---- a/include/asm-powerpc/immap_86xx.h
-+++ b/include/asm-powerpc/immap_86xx.h
-@@ -89,14 +89,14 @@ struct ccsr_guts {
-  * them.
-  *
-  * guts: Pointer to GUTS structure
-- * co: The DMA controller (1 or 2)
-+ * co: The DMA controller (0 or 1)
-  * ch: The channel on the DMA controller (0, 1, 2, or 3)
-  * device: The device to set as the source (CCSR_GUTS_DMACR_DEV_xx)
-  */
- static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
-       unsigned int co, unsigned int ch, unsigned int device)
- {
--      unsigned int shift = 16 + (8 * (2 - co) + 2 * (3 - ch));
-+      unsigned int shift = 16 + (8 * (1 - co) + 2 * (3 - ch));
-       clrsetbits_be32(&guts->dmacr, 3 << shift, device << shift);
- }
-@@ -118,6 +118,27 @@ static inline void guts_set_dmacr(struct
- #define CCSR_GUTS_PMUXCR_DMA1_0               0x00000002
- #define CCSR_GUTS_PMUXCR_DMA1_3               0x00000001
-+/*
-+ * Set the DMA external control bits in the GUTS
-+ *
-+ * The DMA external control bits in the PMUXCR are only meaningful for
-+ * channels 0 and 3.  Any other channels are ignored.
-+ *
-+ * guts: Pointer to GUTS structure
-+ * co: The DMA controller (0 or 1)
-+ * ch: The channel on the DMA controller (0, 1, 2, or 3)
-+ * value: the new value for the bit (0 or 1)
-+ */
-+static inline void guts_set_pmuxcr_dma(struct ccsr_guts __iomem *guts,
-+      unsigned int co, unsigned int ch, unsigned int value)
-+{
-+      if ((ch == 0) || (ch == 3)) {
-+              unsigned int shift = 2 * (co + 1) - (ch & 1) - 1;
-+
-+              clrsetbits_be32(&guts->pmuxcr, 1 << shift, value << shift);
-+      }
-+}
-+
- #define CCSR_GUTS_CLKDVDR_PXCKEN      0x80000000
- #define CCSR_GUTS_CLKDVDR_SSICKEN     0x20000000
- #define CCSR_GUTS_CLKDVDR_PXCKINV     0x10000000
---- a/include/asm-powerpc/immap_qe.h
-+++ b/include/asm-powerpc/immap_qe.h
-@@ -393,9 +393,39 @@ struct dbg {
-       u8      res2[0x48];
- } __attribute__ ((packed));
--/* RISC Special Registers (Trap and Breakpoint) */
-+/*
-+ * RISC Special Registers (Trap and Breakpoint).  These are described in
-+ * the QE Developer's Handbook.
-+ */
- struct rsp {
--      u32     reg[0x40];      /* 64 32-bit registers */
-+      __be32 tibcr[16];       /* Trap/instruction breakpoint control regs */
-+      u8 res0[64];
-+      __be32 ibcr0;
-+      __be32 ibs0;
-+      __be32 ibcnr0;
-+      u8 res1[4];
-+      __be32 ibcr1;
-+      __be32 ibs1;
-+      __be32 ibcnr1;
-+      __be32 npcr;
-+      __be32 dbcr;
-+      __be32 dbar;
-+      __be32 dbamr;
-+      __be32 dbsr;
-+      __be32 dbcnr;
-+      u8 res2[12];
-+      __be32 dbdr_h;
-+      __be32 dbdr_l;
-+      __be32 dbdmr_h;
-+      __be32 dbdmr_l;
-+      __be32 bsr;
-+      __be32 bor;
-+      __be32 bior;
-+      u8 res3[4];
-+      __be32 iatr[4];
-+      __be32 eccr;            /* Exception control configuration register */
-+      __be32 eicr;
-+      u8 res4[0x100-0xf8];
- } __attribute__ ((packed));
- struct qe_immap {
---- a/include/asm-powerpc/io.h
-+++ b/include/asm-powerpc/io.h
-@@ -50,15 +50,16 @@ extern int check_legacy_ioport(unsigned 
- #define PCI_DRAM_OFFSET       pci_dram_offset
- #else
- #define _IO_BASE      pci_io_base
--#define _ISA_MEM_BASE 0
-+#define _ISA_MEM_BASE isa_mem_base
- #define PCI_DRAM_OFFSET       0
- #endif
- extern unsigned long isa_io_base;
--extern unsigned long isa_mem_base;
- extern unsigned long pci_io_base;
- extern unsigned long pci_dram_offset;
-+extern resource_size_t isa_mem_base;
-+
- #if defined(CONFIG_PPC32) && defined(CONFIG_PPC_INDIRECT_IO)
- #error CONFIG_PPC_INDIRECT_IO is not yet supported on 32 bits
- #endif
---- a/include/asm-powerpc/iommu.h
-+++ b/include/asm-powerpc/iommu.h
-@@ -69,10 +69,9 @@ struct iommu_table {
- };
- struct scatterlist;
--struct device_node;
- /* Frees table for an individual device node */
--extern void iommu_free_table(struct device_node *dn);
-+extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
- /* Initializes an iommu_table based in values set in the passed-in
-  * structure
---- a/include/asm-powerpc/ipic.h
-+++ b/include/asm-powerpc/ipic.h
-@@ -20,11 +20,13 @@
- /* Flags when we init the IPIC */
- #define IPIC_SPREADMODE_GRP_A 0x00000001
--#define IPIC_SPREADMODE_GRP_D 0x00000002
--#define IPIC_SPREADMODE_MIX_A 0x00000004
--#define IPIC_SPREADMODE_MIX_B 0x00000008
--#define IPIC_DISABLE_MCP_OUT  0x00000010
--#define IPIC_IRQ0_MCP         0x00000020
-+#define IPIC_SPREADMODE_GRP_B 0x00000002
-+#define IPIC_SPREADMODE_GRP_C 0x00000004
-+#define IPIC_SPREADMODE_GRP_D 0x00000008
-+#define IPIC_SPREADMODE_MIX_A 0x00000010
-+#define IPIC_SPREADMODE_MIX_B 0x00000020
-+#define IPIC_DISABLE_MCP_OUT  0x00000040
-+#define IPIC_IRQ0_MCP         0x00000080
- /* IPIC registers offsets */
- #define IPIC_SICFR    0x00    /* System Global Interrupt Configuration Register */
---- a/include/asm-powerpc/iseries/hv_lp_event.h
-+++ b/include/asm-powerpc/iseries/hv_lp_event.h
-@@ -78,7 +78,7 @@ extern int HvLpEvent_openPath(HvLpEvent_
- /*
-  * Close an Lp Event Path for a type and partition
-- * returns 0 on sucess
-+ * returns 0 on success
-  */
- extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
---- a/include/asm-powerpc/kexec.h
-+++ b/include/asm-powerpc/kexec.h
-@@ -123,6 +123,9 @@ struct pt_regs;
- extern void default_machine_kexec(struct kimage *image);
- extern int default_machine_kexec_prepare(struct kimage *image);
- extern void default_machine_crash_shutdown(struct pt_regs *regs);
-+typedef void (*crash_shutdown_t)(void);
-+extern int crash_shutdown_register(crash_shutdown_t handler);
-+extern int crash_shutdown_unregister(crash_shutdown_t handler);
- extern void machine_kexec_simple(struct kimage *image);
- extern void crash_kexec_secondary(struct pt_regs *regs);
---- a/include/asm-powerpc/lmb.h
-+++ b/include/asm-powerpc/lmb.h
-@@ -51,6 +51,7 @@ extern unsigned long __init __lmb_alloc_
- extern unsigned long __init lmb_phys_mem_size(void);
- extern unsigned long __init lmb_end_of_DRAM(void);
- extern void __init lmb_enforce_memory_limit(unsigned long memory_limit);
-+extern int __init lmb_is_reserved(unsigned long addr);
- extern void lmb_dump_all(void);
---- a/include/asm-powerpc/machdep.h
-+++ b/include/asm-powerpc/machdep.h
-@@ -204,6 +204,13 @@ struct machdep_calls {
-       /*
-        * optional PCI "hooks"
-        */
-+      /* Called in indirect_* to avoid touching devices */
-+      int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
-+
-+      /* Called at then very end of pcibios_init() */
-+      void (*pcibios_after_init)(void);
-+
-+#endif /* CONFIG_PPC32 */
-       /* Called after PPC generic resource fixup to perform
-          machine specific fixups */
-@@ -212,18 +219,9 @@ struct machdep_calls {
-       /* Called for each PCI bus in the system when it's probed */
-       void (*pcibios_fixup_bus)(struct pci_bus *);
--      /* Called when pci_enable_device() is called (initial=0) or
--       * when a device with no assigned resource is found (initial=1).
--       * Returns 0 to allow assignment/enabling of the device. */
--      int  (*pcibios_enable_device_hook)(struct pci_dev *, int initial);
--
--      /* Called in indirect_* to avoid touching devices */
--      int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
--
--      /* Called at then very end of pcibios_init() */
--      void (*pcibios_after_init)(void);
--
--#endif /* CONFIG_PPC32 */
-+      /* Called when pci_enable_device() is called. Returns 0 to
-+       * allow assignment/enabling of the device. */
-+      int  (*pcibios_enable_device_hook)(struct pci_dev *);
-       /* Called to shutdown machine specific hardware not already controlled
-        * by other drivers.
-@@ -253,6 +251,16 @@ struct machdep_calls {
-        */
-       void (*machine_kexec)(struct kimage *image);
- #endif /* CONFIG_KEXEC */
-+
-+#ifdef CONFIG_SUSPEND
-+      /* These are called to disable and enable, respectively, IRQs when
-+       * entering a suspend state.  If NULL, then the generic versions
-+       * will be called.  The generic versions disable/enable the
-+       * decrementer along with interrupts.
-+       */
-+      void (*suspend_disable_irqs)(void);
-+      void (*suspend_enable_irqs)(void);
-+#endif
- };
- extern void power4_idle(void);
-@@ -326,5 +334,31 @@ static inline void log_error(char *buf, 
-               ppc_md.log_error(buf, err_type, fatal);
- }
-+#define __define_machine_initcall(mach,level,fn,id) \
-+      static int __init __machine_initcall_##mach##_##fn(void) { \
-+              if (machine_is(mach)) return fn(); \
-+              return 0; \
-+      } \
-+      __define_initcall(level,__machine_initcall_##mach##_##fn,id);
-+
-+#define machine_core_initcall(mach,fn)                __define_machine_initcall(mach,"1",fn,1)
-+#define machine_core_initcall_sync(mach,fn)   __define_machine_initcall(mach,"1s",fn,1s)
-+#define machine_postcore_initcall(mach,fn)    __define_machine_initcall(mach,"2",fn,2)
-+#define machine_postcore_initcall_sync(mach,fn)       __define_machine_initcall(mach,"2s",fn,2s)
-+#define machine_arch_initcall(mach,fn)                __define_machine_initcall(mach,"3",fn,3)
-+#define machine_arch_initcall_sync(mach,fn)   __define_machine_initcall(mach,"3s",fn,3s)
-+#define machine_subsys_initcall(mach,fn)      __define_machine_initcall(mach,"4",fn,4)
-+#define machine_subsys_initcall_sync(mach,fn) __define_machine_initcall(mach,"4s",fn,4s)
-+#define machine_fs_initcall(mach,fn)          __define_machine_initcall(mach,"5",fn,5)
-+#define machine_fs_initcall_sync(mach,fn)     __define_machine_initcall(mach,"5s",fn,5s)
-+#define machine_rootfs_initcall(mach,fn)      __define_machine_initcall(mach,"rootfs",fn,rootfs)
-+#define machine_device_initcall(mach,fn)      __define_machine_initcall(mach,"6",fn,6)
-+#define machine_device_initcall_sync(mach,fn) __define_machine_initcall(mach,"6s",fn,6s)
-+#define machine_late_initcall(mach,fn)                __define_machine_initcall(mach,"7",fn,7)
-+#define machine_late_initcall_sync(mach,fn)   __define_machine_initcall(mach,"7s",fn,7s)
-+
-+void generic_suspend_disable_irqs(void);
-+void generic_suspend_enable_irqs(void);
-+
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_MACHDEP_H */
---- a/include/asm-powerpc/mmu-hash64.h
-+++ b/include/asm-powerpc/mmu-hash64.h
-@@ -80,7 +80,7 @@ extern char initial_stab[];
- #define HPTE_V_AVPN_SHIFT     7
- #define HPTE_V_AVPN           ASM_CONST(0x3fffffffffffff80)
- #define HPTE_V_AVPN_VAL(x)    (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
--#define HPTE_V_COMPARE(x,y)   (!(((x) ^ (y)) & 0xffffffffffffff80))
-+#define HPTE_V_COMPARE(x,y)   (!(((x) ^ (y)) & 0xffffffffffffff80UL))
- #define HPTE_V_BOLTED         ASM_CONST(0x0000000000000010)
- #define HPTE_V_LOCK           ASM_CONST(0x0000000000000008)
- #define HPTE_V_LARGE          ASM_CONST(0x0000000000000004)
-@@ -180,6 +180,7 @@ extern int mmu_vmalloc_psize;
- extern int mmu_io_psize;
- extern int mmu_kernel_ssize;
- extern int mmu_highuser_ssize;
-+extern u16 mmu_slb_size;
- /*
-  * If the processor supports 64k normal pages but not 64k cache
-@@ -277,6 +278,7 @@ extern int hash_huge_page(struct mm_stru
- extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
-                            unsigned long pstart, unsigned long mode,
-                            int psize, int ssize);
-+extern void set_huge_psize(int psize);
- extern void htab_initialize(void);
- extern void htab_initialize_secondary(void);
---- a/include/asm-powerpc/mpc52xx.h
-+++ b/include/asm-powerpc/mpc52xx.h
-@@ -248,8 +248,6 @@ struct mpc52xx_cdm {
- #ifndef __ASSEMBLY__
--extern void __iomem * mpc52xx_find_and_map(const char *);
--extern void __iomem * mpc52xx_find_and_map_path(const char *path);
- extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
- extern void mpc5200_setup_xlb_arbiter(void);
- extern void mpc52xx_declare_of_platform_devices(void);
-@@ -257,7 +255,12 @@ extern void mpc52xx_declare_of_platform_
- extern void mpc52xx_init_irq(void);
- extern unsigned int mpc52xx_get_irq(void);
-+#ifdef CONFIG_PCI
- extern int __init mpc52xx_add_bridge(struct device_node *node);
-+extern void __init mpc52xx_setup_pci(void);
-+#else
-+static inline void mpc52xx_setup_pci(void) { }
-+#endif
- extern void __init mpc52xx_map_wdt(void);
- extern void mpc52xx_restart(char *cmd);
---- a/include/asm-powerpc/mpc52xx_psc.h
-+++ b/include/asm-powerpc/mpc52xx_psc.h
-@@ -153,6 +153,9 @@ struct mpc52xx_psc {
-       u8              reserved16[3];
-       u8              irfdr;          /* PSC + 0x54 */
-       u8              reserved17[3];
-+};
-+
-+struct mpc52xx_psc_fifo {
-       u16             rfnum;          /* PSC + 0x58 */
-       u16             reserved18;
-       u16             tfnum;          /* PSC + 0x5c */
---- a/include/asm-powerpc/mpc8260.h
-+++ b/include/asm-powerpc/mpc8260.h
-@@ -8,6 +8,7 @@
- #ifndef __ASM_POWERPC_MPC8260_H__
- #define __ASM_POWERPC_MPC8260_H__
-+#define MPC82XX_BCR_PLDP 0x00800000 /* Pipeline Maximum Depth */
- #ifdef CONFIG_8260
---- a/include/asm-powerpc/mpic.h
-+++ b/include/asm-powerpc/mpic.h
-@@ -22,7 +22,9 @@
- #define MPIC_GREG_GLOBAL_CONF_0               0x00020
- #define               MPIC_GREG_GCONF_RESET                   0x80000000
- #define               MPIC_GREG_GCONF_8259_PTHROU_DIS         0x20000000
-+#define               MPIC_GREG_GCONF_NO_BIAS                 0x10000000
- #define               MPIC_GREG_GCONF_BASE_MASK               0x000fffff
-+#define               MPIC_GREG_GCONF_MCK                     0x08000000
- #define MPIC_GREG_GLOBAL_CONF_1               0x00030
- #define               MPIC_GREG_GLOBAL_CONF_1_SIE             0x08000000
- #define               MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK  0x70000000
-@@ -78,6 +80,7 @@
- #define       MPIC_CPU_WHOAMI_MASK                    0x0000001f
- #define MPIC_CPU_INTACK                       0x000a0
- #define MPIC_CPU_EOI                  0x000b0
-+#define MPIC_CPU_MCACK                        0x000c0
- /*
-  * Per-source registers
-@@ -141,6 +144,7 @@
- #define TSI108_CPU_WHOAMI             0xffffffff
- #define TSI108_CPU_INTACK             0x00004
- #define TSI108_CPU_EOI                        0x00008
-+#define TSI108_CPU_MCACK              0x00004 /* Doesn't really exist here */
- /*
-  * Per-source registers
-@@ -183,6 +187,7 @@ enum {
-       MPIC_IDX_CPU_WHOAMI,
-       MPIC_IDX_CPU_INTACK,
-       MPIC_IDX_CPU_EOI,
-+      MPIC_IDX_CPU_MCACK,
-       MPIC_IDX_IRQ_BASE,
-       MPIC_IDX_IRQ_STRIDE,
-@@ -344,6 +349,10 @@ struct mpic
- #define MPIC_USES_DCR                 0x00000080
- /* MPIC has 11-bit vector fields (or larger) */
- #define MPIC_LARGE_VECTORS            0x00000100
-+/* Enable delivery of prio 15 interrupts as MCK instead of EE */
-+#define MPIC_ENABLE_MCK                       0x00000200
-+/* Disable bias among target selection, spread interrupts evenly */
-+#define MPIC_NO_BIAS                  0x00000400
- /* MPIC HW modification ID */
- #define MPIC_REGSET_MASK              0xf0000000
-@@ -447,10 +456,19 @@ extern void mpic_send_ipi(unsigned int i
- /* Send a message (IPI) to a given target (cpu number or MSG_*) */
- void smp_mpic_message_pass(int target, int msg);
-+/* Unmask a specific virq */
-+extern void mpic_unmask_irq(unsigned int irq);
-+/* Mask a specific virq */
-+extern void mpic_mask_irq(unsigned int irq);
-+/* EOI a specific virq */
-+extern void mpic_end_irq(unsigned int irq);
-+
- /* Fetch interrupt from a given mpic */
- extern unsigned int mpic_get_one_irq(struct mpic *mpic);
--/* This one gets to the primary mpic */
-+/* This one gets from the primary mpic */
- extern unsigned int mpic_get_irq(void);
-+/* Fetch Machine Check interrupt from primary mpic */
-+extern unsigned int mpic_get_mcirq(void);
- /* Set the EPIC clock ratio */
- void mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio);
---- a/include/asm-powerpc/nvram.h
-+++ b/include/asm-powerpc/nvram.h
-@@ -10,6 +10,8 @@
- #ifndef _ASM_POWERPC_NVRAM_H
- #define _ASM_POWERPC_NVRAM_H
-+#include <linux/errno.h>
-+
- #define NVRW_CNT 0x20
- #define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
- #define NVRAM_BLOCK_LEN 16
-@@ -71,7 +73,16 @@ extern int nvram_clear_error_log(void);
- extern struct nvram_partition *nvram_find_partition(int sig, const char *name);
- extern int pSeries_nvram_init(void);
-+
-+#ifdef CONFIG_MMIO_NVRAM
- extern int mmio_nvram_init(void);
-+#else
-+static inline int mmio_nvram_init(void)
-+{
-+      return -ENODEV;
-+}
-+#endif
-+
- #endif /* __KERNEL__ */
- /* PowerMac specific nvram stuffs */
---- a/include/asm-powerpc/of_platform.h
-+++ b/include/asm-powerpc/of_platform.h
-@@ -15,8 +15,14 @@
- #include <linux/of_platform.h>
- /* Platform drivers register/unregister */
--extern int of_register_platform_driver(struct of_platform_driver *drv);
--extern void of_unregister_platform_driver(struct of_platform_driver *drv);
-+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,
-@@ -26,9 +32,11 @@ extern struct of_device *of_platform_dev
- #define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
- extern int of_platform_bus_probe(struct device_node *root,
--                               struct of_device_id *matches,
-+                               const struct of_device_id *matches,
-                                struct device *parent);
- extern struct of_device *of_find_device_by_phandle(phandle ph);
-+extern void of_instantiate_rtc(void);
-+
- #endif        /* _ASM_POWERPC_OF_PLATFORM_H */
---- a/include/asm-powerpc/pci-bridge.h
-+++ b/include/asm-powerpc/pci-bridge.h
-@@ -1,15 +1,42 @@
- #ifndef _ASM_POWERPC_PCI_BRIDGE_H
- #define _ASM_POWERPC_PCI_BRIDGE_H
- #ifdef __KERNEL__
--
-+/*
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ */
- #include <linux/pci.h>
- #include <linux/list.h>
- #include <linux/ioport.h>
--#ifndef CONFIG_PPC64
--
- struct device_node;
--struct pci_controller;
-+
-+extern unsigned int ppc_pci_flags;
-+enum {
-+      /* Force re-assigning all resources (ignore firmware
-+       * setup completely)
-+       */
-+      PPC_PCI_REASSIGN_ALL_RSRC       = 0x00000001,
-+
-+      /* Re-assign all bus numbers */
-+      PPC_PCI_REASSIGN_ALL_BUS        = 0x00000002,
-+
-+      /* Do not try to assign, just use existing setup */
-+      PPC_PCI_PROBE_ONLY              = 0x00000004,
-+
-+      /* Don't bother with ISA alignment unless the bridge has
-+       * ISA forwarding enabled
-+       */
-+      PPC_PCI_CAN_SKIP_ISA_ALIGN      = 0x00000008,
-+
-+      /* Enable domain numbers in /proc */
-+      PPC_PCI_ENABLE_PROC_DOMAINS     = 0x00000010,
-+      /* ... except for domain 0 */
-+      PPC_PCI_COMPAT_DOMAIN_0         = 0x00000020,
-+};
-+
- /*
-  * Structure of a PCI controller (host bridge)
-@@ -17,26 +44,41 @@ struct pci_controller;
- struct pci_controller {
-       struct pci_bus *bus;
-       char is_dynamic;
--      void *arch_data;
-+#ifdef CONFIG_PPC64
-+      int node;
-+#endif
-+      struct device_node *dn;
-       struct list_head list_node;
-       struct device *parent;
-       int first_busno;
-       int last_busno;
-+#ifndef CONFIG_PPC64
-       int self_busno;
-+#endif
-       void __iomem *io_base_virt;
-+#ifdef CONFIG_PPC64
-+      void *io_base_alloc;
-+#endif
-       resource_size_t io_base_phys;
-+#ifndef CONFIG_PPC64
-+      resource_size_t pci_io_size;
-+#endif
-       /* Some machines (PReP) have a non 1:1 mapping of
-        * the PCI memory space in the CPU bus space
-        */
-       resource_size_t pci_mem_offset;
-+#ifdef CONFIG_PPC64
-+      unsigned long pci_io_size;
-+#endif
-       struct pci_ops *ops;
--      volatile unsigned int __iomem *cfg_addr;
--      volatile void __iomem *cfg_data;
-+      unsigned int __iomem *cfg_addr;
-+      void __iomem *cfg_data;
-+#ifndef CONFIG_PPC64
-       /*
-        * Used for variants of PCI indirect handling and possible quirks:
-        *  SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
-@@ -51,21 +93,30 @@ struct pci_controller {
-        *   set.
-        *  BIG_ENDIAN - cfg_addr is a big endian register
-        */
--#define PPC_INDIRECT_TYPE_SET_CFG_TYPE                (0x00000001)
--#define PPC_INDIRECT_TYPE_EXT_REG             (0x00000002)
--#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS        (0x00000004)
--#define PPC_INDIRECT_TYPE_NO_PCIE_LINK                (0x00000008)
--#define PPC_INDIRECT_TYPE_BIG_ENDIAN          (0x00000010)
-+#define PPC_INDIRECT_TYPE_SET_CFG_TYPE                0x00000001
-+#define PPC_INDIRECT_TYPE_EXT_REG             0x00000002
-+#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS        0x00000004
-+#define PPC_INDIRECT_TYPE_NO_PCIE_LINK                0x00000008
-+#define PPC_INDIRECT_TYPE_BIG_ENDIAN          0x00000010
-       u32 indirect_type;
--
-+#endif        /* !CONFIG_PPC64 */
-       /* Currently, we limit ourselves to 1 IO range and 3 mem
-        * ranges since the common pci_bus structure can't handle more
-        */
-       struct resource io_resource;
-       struct resource mem_resources[3];
-       int global_number;              /* PCI domain number */
-+#ifdef CONFIG_PPC64
-+      unsigned long buid;
-+      unsigned long dma_window_base_cur;
-+      unsigned long dma_window_size;
-+
-+      void *private_data;
-+#endif        /* CONFIG_PPC64 */
- };
-+#ifndef CONFIG_PPC64
-+
- static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
- {
-       return bus->sysdata;
-@@ -81,18 +132,18 @@ static inline int isa_vaddr_is_ioport(vo
- /* These are used for config access before all the PCI probing
-    has been done. */
--int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn,
--                         int where, u8 *val);
--int early_read_config_word(struct pci_controller *hose, int bus, int dev_fn,
--                         int where, u16 *val);
--int early_read_config_dword(struct pci_controller *hose, int bus, int dev_fn,
--                          int where, u32 *val);
--int early_write_config_byte(struct pci_controller *hose, int bus, int dev_fn,
--                          int where, u8 val);
--int early_write_config_word(struct pci_controller *hose, int bus, int dev_fn,
--                          int where, u16 val);
--int early_write_config_dword(struct pci_controller *hose, int bus, int dev_fn,
--                           int where, u32 val);
-+extern int early_read_config_byte(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u8 *val);
-+extern int early_read_config_word(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u16 *val);
-+extern int early_read_config_dword(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u32 *val);
-+extern int early_write_config_byte(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u8 val);
-+extern int early_write_config_word(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u16 val);
-+extern int early_write_config_dword(struct pci_controller *hose, int bus,
-+                      int dev_fn, int where, u32 val);
- extern int early_find_capability(struct pci_controller *hose, int bus,
-                                int dev_fn, int cap);
-@@ -101,87 +152,33 @@ extern void setup_indirect_pci(struct pc
-                              resource_size_t cfg_addr,
-                              resource_size_t cfg_data, u32 flags);
- extern void setup_grackle(struct pci_controller *hose);
--extern void __init update_bridge_resource(struct pci_dev *dev,
--                                        struct resource *res);
--
--#else
--
--
--/*
-- * This 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.
-- */
--
--/*
-- * Structure of a PCI controller (host bridge)
-- */
--struct pci_controller {
--      struct pci_bus *bus;
--      char is_dynamic;
--      int node;
--      void *arch_data;
--      struct list_head list_node;
--      struct device *parent;
--
--      int first_busno;
--      int last_busno;
--
--      void __iomem *io_base_virt;
--      void *io_base_alloc;
--      resource_size_t io_base_phys;
--
--      /* Some machines have a non 1:1 mapping of
--       * the PCI memory space in the CPU bus space
--       */
--      resource_size_t pci_mem_offset;
--      unsigned long pci_io_size;
--
--      struct pci_ops *ops;
--      volatile unsigned int __iomem *cfg_addr;
--      volatile void __iomem *cfg_data;
--
--      /* Currently, we limit ourselves to 1 IO range and 3 mem
--       * ranges since the common pci_bus structure can't handle more
--       */
--      struct resource io_resource;
--      struct resource mem_resources[3];
--      int global_number;
--      unsigned long buid;
--      unsigned long dma_window_base_cur;
--      unsigned long dma_window_size;
--
--      void *private_data;
--};
-+#else /* CONFIG_PPC64 */
- /*
-  * PCI stuff, for nodes representing PCI devices, pointed to
-  * by device_node->data.
-  */
--struct pci_controller;
- struct iommu_table;
- struct pci_dn {
-       int     busno;                  /* pci bus number */
--      int     bussubno;               /* pci subordinate bus number */
-       int     devfn;                  /* pci device and function number */
--      int     class_code;             /* pci device class */
-       struct  pci_controller *phb;    /* for pci devices */
-       struct  iommu_table *iommu_table;       /* for phb's or bridges */
--      struct  pci_dev *pcidev;        /* back-pointer to the pci device */
-       struct  device_node *node;      /* back-pointer to the device_node */
-       int     pci_ext_config_space;   /* for pci devices */
- #ifdef CONFIG_EEH
-+      struct  pci_dev *pcidev;        /* back-pointer to the pci device */
-+      int     class_code;             /* pci device class */
-       int     eeh_mode;               /* See eeh.h for possible EEH_MODEs */
-       int     eeh_config_addr;
-       int     eeh_pe_config_addr; /* new-style partition endpoint address */
--      int     eeh_check_count;        /* # times driver ignored error */
--      int     eeh_freeze_count;       /* # times this device froze up. */
--      int     eeh_false_positives;    /* # times this device reported #ff's */
-+      int     eeh_check_count;        /* # times driver ignored error */
-+      int     eeh_freeze_count;       /* # times this device froze up. */
-+      int     eeh_false_positives;    /* # times this device reported #ff's */
-       u32     config_space[16];       /* saved PCI config space */
- #endif
- };
-@@ -189,7 +186,7 @@ struct pci_dn {
- /* Get the pointer to a device_node's pci_dn */
- #define PCI_DN(dn)    ((struct pci_dn *) (dn)->data)
--struct device_node *fetch_dev_dn(struct pci_dev *dev);
-+extern struct device_node *fetch_dev_dn(struct pci_dev *dev);
- /* Get a device_node from a pci_dev.  This code must be fast except
-  * in the case where the sysdata is incorrect and needs to be fixed
-@@ -227,14 +224,14 @@ static inline struct device_node *pci_bu
- }
- /** Find the bus corresponding to the indicated device node */
--struct pci_bus * pcibios_find_pci_bus(struct device_node *dn);
-+extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn);
- /** Remove all of the PCI devices under this bus */
--void pcibios_remove_pci_devices(struct pci_bus *bus);
-+extern void pcibios_remove_pci_devices(struct pci_bus *bus);
- /** Discover new pci devices under this bus, and add them */
--void pcibios_add_pci_devices(struct pci_bus * bus);
--void pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus);
-+extern void pcibios_add_pci_devices(struct pci_bus *bus);
-+extern void pcibios_fixup_new_pci_devices(struct pci_bus *bus);
- extern int pcibios_remove_root_bus(struct pci_controller *phb);
-@@ -270,20 +267,18 @@ extern int pcibios_map_io_space(struct p
- #define PHB_SET_NODE(PHB, NODE)               ((PHB)->node = -1)
- #endif
--#endif /* CONFIG_PPC64 */
-+#endif        /* CONFIG_PPC64 */
- /* Get the PCI host controller for an OF device */
--extern struct pci_controller*
--pci_find_hose_for_OF_device(struct device_node* node);
-+extern struct pci_controller *pci_find_hose_for_OF_device(
-+                      struct device_node* node);
- /* Fill up host controller resources from the OF node */
--extern void
--pci_process_bridge_OF_ranges(struct pci_controller *hose,
--                         struct device_node *dev, int primary);
-+extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
-+                      struct device_node *dev, int primary);
- /* Allocate & free a PCI host bridge structure */
--extern struct pci_controller *
--pcibios_alloc_controller(struct device_node *dev);
-+extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
- extern void pcibios_free_controller(struct pci_controller *phb);
- #ifdef CONFIG_PCI
-@@ -298,9 +293,7 @@ static inline int pcibios_vaddr_is_iopor
- {
-       return 0;
- }
--#endif
--
-+#endif        /* CONFIG_PCI */
--
--#endif /* __KERNEL__ */
--#endif
-+#endif        /* __KERNEL__ */
-+#endif        /* _ASM_POWERPC_PCI_BRIDGE_H */
---- a/include/asm-powerpc/pci.h
-+++ b/include/asm-powerpc/pci.h
-@@ -36,11 +36,10 @@ struct pci_dev;
- /*
-  * Set this to 1 if you want the kernel to re-assign all PCI
-- * bus numbers
-+ * bus numbers (don't do that on ppc64 yet !)
-  */
--extern int pci_assign_all_buses;
--#define pcibios_assign_all_busses()   (pci_assign_all_buses)
--
-+#define pcibios_assign_all_busses()           (ppc_pci_flags & \
-+                                       PPC_PCI_REASSIGN_ALL_BUS)
- #define pcibios_scan_all_fns(a, b)    0
- static inline void pcibios_set_master(struct pci_dev *dev)
-@@ -95,9 +94,6 @@ static inline void pci_dma_burst_advice(
- #define get_pci_dma_ops()     NULL
- #endif
--/* Decide whether to display the domain number in /proc */
--extern int pci_proc_domain(struct pci_bus *bus);
--
- #else /* 32-bit */
- #ifdef CONFIG_PCI
-@@ -109,17 +105,14 @@ static inline void pci_dma_burst_advice(
-       *strategy_parameter = ~0UL;
- }
- #endif
--
--/* Set the name of the bus as it appears in /proc/bus/pci */
--static inline int pci_proc_domain(struct pci_bus *bus)
--{
--      return 0;
--}
--
- #endif /* CONFIG_PPC64 */
- extern int pci_domain_nr(struct pci_bus *bus);
-+/* Decide whether to display the domain number in /proc */
-+extern int pci_proc_domain(struct pci_bus *bus);
-+
-+
- struct vm_area_struct;
- /* Map a range of PCI memory or I/O space for a device into user space */
- int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
-@@ -199,13 +192,12 @@ static inline struct resource *pcibios_s
-       return root;
- }
--extern void pcibios_fixup_device_resources(struct pci_dev *dev,
--                      struct pci_bus *bus);
--
- extern void pcibios_setup_new_device(struct pci_dev *dev);
- extern void pcibios_claim_one_bus(struct pci_bus *b);
-+extern void pcibios_resource_survey(void);
-+
- extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
- extern struct pci_dev *of_create_pci_dev(struct device_node *node,
-@@ -229,5 +221,8 @@ extern void pci_resource_to_user(const s
-                                const struct resource *rsrc,
-                                resource_size_t *start, resource_size_t *end);
-+extern void pcibios_do_bus_setup(struct pci_bus *bus);
-+extern void pcibios_fixup_of_probed_bus(struct pci_bus *bus);
-+
- #endif        /* __KERNEL__ */
- #endif /* __ASM_POWERPC_PCI_H */
---- a/include/asm-powerpc/ppc-pci.h
-+++ b/include/asm-powerpc/ppc-pci.h
-@@ -22,7 +22,6 @@ extern void pci_setup_phb_io_dynamic(str
- extern struct list_head hose_list;
--extern int global_phb_number;
- extern void find_and_init_phbs(void);
-@@ -47,9 +46,6 @@ extern void init_pci_config_tokens (void
- extern unsigned long get_phb_buid (struct device_node *);
- extern int rtas_setup_phb(struct pci_controller *phb);
--/* From iSeries PCI */
--extern void iSeries_pcibios_init(void);
--
- extern unsigned long pci_probe_only;
- /* ---- EEH internal-use-only related routines ---- */
---- a/include/asm-powerpc/prom.h
-+++ b/include/asm-powerpc/prom.h
-@@ -202,6 +202,10 @@ static inline unsigned long of_read_ulon
-  */
- extern u64 of_translate_address(struct device_node *np, const u32 *addr);
-+/* Translate a DMA address from device space to CPU space */
-+extern u64 of_translate_dma_address(struct device_node *dev,
-+                                  const u32 *in_addr);
-+
- /* Extract an address from a device, returns the region size and
-  * the address space flags too. The PCI version uses a BAR number
-  * instead of an absolute index
---- a/include/asm-powerpc/ps3.h
-+++ b/include/asm-powerpc/ps3.h
-@@ -24,6 +24,7 @@
- #include <linux/init.h>
- #include <linux/types.h>
- #include <linux/device.h>
-+#include "cell-pmu.h"
- union ps3_firmware_version {
-       u64 raw;
-@@ -317,6 +318,7 @@ enum ps3_match_id {
-       PS3_MATCH_ID_STOR_FLASH     = 8,
-       PS3_MATCH_ID_SOUND          = 9,
-       PS3_MATCH_ID_GRAPHICS       = 10,
-+      PS3_MATCH_ID_LPM            = 11,
- };
- #define PS3_MODULE_ALIAS_EHCI           "ps3:1"
-@@ -329,11 +331,13 @@ enum ps3_match_id {
- #define PS3_MODULE_ALIAS_STOR_FLASH     "ps3:8"
- #define PS3_MODULE_ALIAS_SOUND          "ps3:9"
- #define PS3_MODULE_ALIAS_GRAPHICS       "ps3:10"
-+#define PS3_MODULE_ALIAS_LPM            "ps3:11"
- enum ps3_system_bus_device_type {
-       PS3_DEVICE_TYPE_IOC0 = 1,
-       PS3_DEVICE_TYPE_SB,
-       PS3_DEVICE_TYPE_VUART,
-+      PS3_DEVICE_TYPE_LPM,
- };
- /**
-@@ -344,12 +348,17 @@ struct ps3_system_bus_device {
-       enum ps3_match_id match_id;
-       enum ps3_system_bus_device_type dev_type;
--      unsigned int bus_id;              /* SB */
--      unsigned int dev_id;              /* SB */
-+      u64 bus_id;                       /* SB */
-+      u64 dev_id;                       /* SB */
-       unsigned int interrupt_id;        /* SB */
-       struct ps3_dma_region *d_region;  /* SB, IOC0 */
-       struct ps3_mmio_region *m_region; /* SB, IOC0*/
-       unsigned int port_number;         /* VUART */
-+      struct {                          /* LPM */
-+              u64 node_id;
-+              u64 pu_id;
-+              u64 rights;
-+      } lpm;
- /*    struct iommu_table *iommu_table; -- waiting for BenH's cleanups */
-       struct device core;
-@@ -438,5 +447,66 @@ struct ps3_prealloc {
- extern struct ps3_prealloc ps3fb_videomemory;
- extern struct ps3_prealloc ps3flash_bounce_buffer;
-+/* logical performance monitor */
-+
-+/**
-+ * enum ps3_lpm_rights - Rigths granted by the system policy module.
-+ *
-+ * @PS3_LPM_RIGHTS_USE_LPM: The right to use the lpm.
-+ * @PS3_LPM_RIGHTS_USE_TB: The right to use the internal trace buffer.
-+ */
-+
-+enum ps3_lpm_rights {
-+      PS3_LPM_RIGHTS_USE_LPM = 0x001,
-+      PS3_LPM_RIGHTS_USE_TB = 0x100,
-+};
-+
-+/**
-+ * enum ps3_lpm_tb_type - Type of trace buffer lv1 should use.
-+ *
-+ * @PS3_LPM_TB_TYPE_NONE: Do not use a trace buffer.
-+ * @PS3_LPM_RIGHTS_USE_TB: Use the lv1 internal trace buffer.  Must have
-+ *  rights @PS3_LPM_RIGHTS_USE_TB.
-+ */
-+
-+enum ps3_lpm_tb_type {
-+      PS3_LPM_TB_TYPE_NONE = 0,
-+      PS3_LPM_TB_TYPE_INTERNAL = 1,
-+};
-+
-+int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
-+      u64 tb_cache_size);
-+int ps3_lpm_close(void);
-+int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
-+      unsigned long *bytes_copied);
-+int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
-+      unsigned long count, unsigned long *bytes_copied);
-+void ps3_set_bookmark(u64 bookmark);
-+void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id);
-+int ps3_set_signal(u64 rtas_signal_group, u8 signal_bit, u16 sub_unit,
-+      u8 bus_word);
-+
-+u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr);
-+void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val);
-+u32 ps3_read_ctr(u32 cpu, u32 ctr);
-+void ps3_write_ctr(u32 cpu, u32 ctr, u32 val);
-+
-+u32 ps3_read_pm07_control(u32 cpu, u32 ctr);
-+void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val);
-+u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg);
-+void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val);
-+
-+u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr);
-+void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size);
-+
-+void ps3_enable_pm(u32 cpu);
-+void ps3_disable_pm(u32 cpu);
-+void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask);
-+void ps3_disable_pm_interrupts(u32 cpu);
-+
-+u32 ps3_get_and_clear_pm_interrupts(u32 cpu);
-+void ps3_sync_irq(int node);
-+u32 ps3_get_hw_thread_id(int cpu);
-+u64 ps3_get_spe_id(void *arg);
- #endif
---- a/include/asm-powerpc/ptrace.h
-+++ b/include/asm-powerpc/ptrace.h
-@@ -106,7 +106,8 @@ extern int ptrace_put_reg(struct task_st
-  */
- #define FULL_REGS(regs)               (((regs)->trap & 1) == 0)
- #ifndef __powerpc64__
--#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) == 0)
-+#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) != 0)
-+#define IS_MCHECK_EXC(regs)   (((regs)->trap & 4) != 0)
- #endif /* ! __powerpc64__ */
- #define TRAP(regs)            ((regs)->trap & ~0xF)
- #ifdef __powerpc64__
---- a/include/asm-powerpc/qe.h
-+++ b/include/asm-powerpc/qe.h
-@@ -28,6 +28,52 @@
- #define MEM_PART_SECONDARY    1
- #define MEM_PART_MURAM                2
-+/* Clocks and BRGs */
-+enum qe_clock {
-+      QE_CLK_NONE = 0,
-+      QE_BRG1,                /* Baud Rate Generator 1 */
-+      QE_BRG2,                /* Baud Rate Generator 2 */
-+      QE_BRG3,                /* Baud Rate Generator 3 */
-+      QE_BRG4,                /* Baud Rate Generator 4 */
-+      QE_BRG5,                /* Baud Rate Generator 5 */
-+      QE_BRG6,                /* Baud Rate Generator 6 */
-+      QE_BRG7,                /* Baud Rate Generator 7 */
-+      QE_BRG8,                /* Baud Rate Generator 8 */
-+      QE_BRG9,                /* Baud Rate Generator 9 */
-+      QE_BRG10,               /* Baud Rate Generator 10 */
-+      QE_BRG11,               /* Baud Rate Generator 11 */
-+      QE_BRG12,               /* Baud Rate Generator 12 */
-+      QE_BRG13,               /* Baud Rate Generator 13 */
-+      QE_BRG14,               /* Baud Rate Generator 14 */
-+      QE_BRG15,               /* Baud Rate Generator 15 */
-+      QE_BRG16,               /* Baud Rate Generator 16 */
-+      QE_CLK1,                /* Clock 1 */
-+      QE_CLK2,                /* Clock 2 */
-+      QE_CLK3,                /* Clock 3 */
-+      QE_CLK4,                /* Clock 4 */
-+      QE_CLK5,                /* Clock 5 */
-+      QE_CLK6,                /* Clock 6 */
-+      QE_CLK7,                /* Clock 7 */
-+      QE_CLK8,                /* Clock 8 */
-+      QE_CLK9,                /* Clock 9 */
-+      QE_CLK10,               /* Clock 10 */
-+      QE_CLK11,               /* Clock 11 */
-+      QE_CLK12,               /* Clock 12 */
-+      QE_CLK13,               /* Clock 13 */
-+      QE_CLK14,               /* Clock 14 */
-+      QE_CLK15,               /* Clock 15 */
-+      QE_CLK16,               /* Clock 16 */
-+      QE_CLK17,               /* Clock 17 */
-+      QE_CLK18,               /* Clock 18 */
-+      QE_CLK19,               /* Clock 19 */
-+      QE_CLK20,               /* Clock 20 */
-+      QE_CLK21,               /* Clock 21 */
-+      QE_CLK22,               /* Clock 22 */
-+      QE_CLK23,               /* Clock 23 */
-+      QE_CLK24,               /* Clock 24 */
-+      QE_CLK_DUMMY
-+};
-+
- /* Export QE common operations */
- extern void qe_reset(void);
- extern int par_io_init(struct device_node *np);
-@@ -38,7 +84,8 @@ extern int par_io_data_set(u8 port, u8 p
- /* QE internal API */
- int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
--void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier);
-+enum qe_clock qe_clock_source(const char *source);
-+int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier);
- int qe_get_snum(void);
- void qe_put_snum(u8 snum);
- unsigned long qe_muram_alloc(int size, int align);
-@@ -47,6 +94,58 @@ unsigned long qe_muram_alloc_fixed(unsig
- void qe_muram_dump(void);
- void *qe_muram_addr(unsigned long offset);
-+/* Structure that defines QE firmware binary files.
-+ *
-+ * See Documentation/powerpc/qe-firmware.txt for a description of these
-+ * fields.
-+ */
-+struct qe_firmware {
-+      struct qe_header {
-+              __be32 length;  /* Length of the entire structure, in bytes */
-+              u8 magic[3];    /* Set to { 'Q', 'E', 'F' } */
-+              u8 version;     /* Version of this layout. First ver is '1' */
-+      } header;
-+      u8 id[62];      /* Null-terminated identifier string */
-+      u8 split;       /* 0 = shared I-RAM, 1 = split I-RAM */
-+      u8 count;       /* Number of microcode[] structures */
-+      struct {
-+              __be16 model;           /* The SOC model  */
-+              u8 major;               /* The SOC revision major */
-+              u8 minor;               /* The SOC revision minor */
-+      } __attribute__ ((packed)) soc;
-+      u8 padding[4];                  /* Reserved, for alignment */
-+      __be64 extended_modes;          /* Extended modes */
-+      __be32 vtraps[8];               /* Virtual trap addresses */
-+      u8 reserved[4];                 /* Reserved, for future expansion */
-+      struct qe_microcode {
-+              u8 id[32];              /* Null-terminated identifier */
-+              __be32 traps[16];       /* Trap addresses, 0 == ignore */
-+              __be32 eccr;            /* The value for the ECCR register */
-+              __be32 iram_offset;     /* Offset into I-RAM for the code */
-+              __be32 count;           /* Number of 32-bit words of the code */
-+              __be32 code_offset;     /* Offset of the actual microcode */
-+              u8 major;               /* The microcode version major */
-+              u8 minor;               /* The microcode version minor */
-+              u8 revision;            /* The microcode version revision */
-+              u8 padding;             /* Reserved, for alignment */
-+              u8 reserved[4];         /* Reserved, for future expansion */
-+      } __attribute__ ((packed)) microcode[1];
-+      /* All microcode binaries should be located here */
-+      /* CRC32 should be located here, after the microcode binaries */
-+} __attribute__ ((packed));
-+
-+struct qe_firmware_info {
-+      char id[64];            /* Firmware name */
-+      u32 vtraps[8];          /* Virtual trap addresses */
-+      u64 extended_modes;     /* Extended modes */
-+};
-+
-+/* Upload a firmware to the QE */
-+int qe_upload_firmware(const struct qe_firmware *firmware);
-+
-+/* Obtain information on the uploaded firmware */
-+struct qe_firmware_info *qe_get_firmware_info(void);
-+
- /* Buffer descriptors */
- struct qe_bd {
-       __be16 status;
-@@ -129,52 +228,6 @@ enum comm_dir {
-       COMM_DIR_RX_AND_TX = 3
- };
--/* Clocks and BRGs */
--enum qe_clock {
--      QE_CLK_NONE = 0,
--      QE_BRG1,                /* Baud Rate Generator 1 */
--      QE_BRG2,                /* Baud Rate Generator 2 */
--      QE_BRG3,                /* Baud Rate Generator 3 */
--      QE_BRG4,                /* Baud Rate Generator 4 */
--      QE_BRG5,                /* Baud Rate Generator 5 */
--      QE_BRG6,                /* Baud Rate Generator 6 */
--      QE_BRG7,                /* Baud Rate Generator 7 */
--      QE_BRG8,                /* Baud Rate Generator 8 */
--      QE_BRG9,                /* Baud Rate Generator 9 */
--      QE_BRG10,               /* Baud Rate Generator 10 */
--      QE_BRG11,               /* Baud Rate Generator 11 */
--      QE_BRG12,               /* Baud Rate Generator 12 */
--      QE_BRG13,               /* Baud Rate Generator 13 */
--      QE_BRG14,               /* Baud Rate Generator 14 */
--      QE_BRG15,               /* Baud Rate Generator 15 */
--      QE_BRG16,               /* Baud Rate Generator 16 */
--      QE_CLK1,                /* Clock 1 */
--      QE_CLK2,                /* Clock 2 */
--      QE_CLK3,                /* Clock 3 */
--      QE_CLK4,                /* Clock 4 */
--      QE_CLK5,                /* Clock 5 */
--      QE_CLK6,                /* Clock 6 */
--      QE_CLK7,                /* Clock 7 */
--      QE_CLK8,                /* Clock 8 */
--      QE_CLK9,                /* Clock 9 */
--      QE_CLK10,               /* Clock 10 */
--      QE_CLK11,               /* Clock 11 */
--      QE_CLK12,               /* Clock 12 */
--      QE_CLK13,               /* Clock 13 */
--      QE_CLK14,               /* Clock 14 */
--      QE_CLK15,               /* Clock 15 */
--      QE_CLK16,               /* Clock 16 */
--      QE_CLK17,               /* Clock 17 */
--      QE_CLK18,               /* Clock 18 */
--      QE_CLK19,               /* Clock 19 */
--      QE_CLK20,               /* Clock 20 */
--      QE_CLK21,               /* Clock 21 */
--      QE_CLK22,               /* Clock 22 */
--      QE_CLK23,               /* Clock 23 */
--      QE_CLK24,               /* Clock 24 */
--      QE_CLK_DUMMY,
--};
--
- /* QE CMXUCR Registers.
-  * There are two UCCs represented in each of the four CMXUCR registers.
-  * These values are for the UCC in the LSBs
-@@ -328,6 +381,15 @@ enum qe_clock {
- #define QE_SDEBCR_BA_MASK     0x01FFFFFF
-+/* Communication Processor */
-+#define QE_CP_CERCR_MEE               0x8000  /* Multi-user RAM ECC enable */
-+#define QE_CP_CERCR_IEE               0x4000  /* Instruction RAM ECC enable */
-+#define QE_CP_CERCR_CIR               0x0800  /* Common instruction RAM */
-+
-+/* I-RAM */
-+#define QE_IRAM_IADD_AIE      0x80000000      /* Auto Increment Enable */
-+#define QE_IRAM_IADD_BADDR    0x00080000      /* Base Address */
-+
- /* UPC */
- #define UPGCR_PROTOCOL        0x80000000      /* protocol ul2 or pl2 */
- #define UPGCR_TMS     0x40000000      /* Transmit master/slave mode */
---- a/include/asm-powerpc/reg.h
-+++ b/include/asm-powerpc/reg.h
-@@ -553,6 +553,7 @@
- #define SPRN_PA6T_BTCR        978     /* Breakpoint and Tagging Control Register */
- #define SPRN_PA6T_IMAAT       979     /* Instruction Match Array Action Table */
- #define SPRN_PA6T_PCCR        1019    /* Power Counter Control Register */
-+#define SPRN_BKMK     1020    /* Cell Bookmark Register */
- #define SPRN_PA6T_RPCCR       1021    /* Retire PC Trace Control Register */
-@@ -691,12 +692,6 @@
- #define PV_BE         0x0070
- #define PV_PA6T               0x0090
--/*
-- * Number of entries in the SLB. If this ever changes we should handle
-- * it with a use a cpu feature fixup.
-- */
--#define SLB_NUM_ENTRIES 64
--
- /* Macros for setting and retrieving special purpose registers */
- #ifndef __ASSEMBLY__
- #define mfmsr()               ({unsigned long rval; \
---- a/include/asm-powerpc/reg_booke.h
-+++ b/include/asm-powerpc/reg_booke.h
-@@ -123,16 +123,23 @@
- #define SPRN_SPEFSCR  0x200   /* SPE & Embedded FP Status & Control */
- #define SPRN_BBEAR    0x201   /* Branch Buffer Entry Address Register */
- #define SPRN_BBTAR    0x202   /* Branch Buffer Target Address Register */
-+#define SPRN_ATB      0x20E   /* Alternate Time Base */
-+#define SPRN_ATBL     0x20E   /* Alternate Time Base Lower */
-+#define SPRN_ATBU     0x20F   /* Alternate Time Base Upper */
- #define SPRN_IVOR32   0x210   /* Interrupt Vector Offset Register 32 */
- #define SPRN_IVOR33   0x211   /* Interrupt Vector Offset Register 33 */
- #define SPRN_IVOR34   0x212   /* Interrupt Vector Offset Register 34 */
- #define SPRN_IVOR35   0x213   /* Interrupt Vector Offset Register 35 */
-+#define SPRN_IVOR36   0x214   /* Interrupt Vector Offset Register 36 */
-+#define SPRN_IVOR37   0x215   /* Interrupt Vector Offset Register 37 */
- #define SPRN_MCSRR0   0x23A   /* Machine Check Save and Restore Register 0 */
- #define SPRN_MCSRR1   0x23B   /* Machine Check Save and Restore Register 1 */
- #define SPRN_MCSR     0x23C   /* Machine Check Status Register */
- #define SPRN_MCAR     0x23D   /* Machine Check Address Register */
- #define SPRN_DSRR0    0x23E   /* Debug Save and Restore Register 0 */
- #define SPRN_DSRR1    0x23F   /* Debug Save and Restore Register 1 */
-+#define SPRN_SPRG8    0x25C   /* Special Purpose Register General 8 */
-+#define SPRN_SPRG9    0x25D   /* Special Purpose Register General 9 */
- #define SPRN_MAS0     0x270   /* MMU Assist Register 0 */
- #define SPRN_MAS1     0x271   /* MMU Assist Register 1 */
- #define SPRN_MAS2     0x272   /* MMU Assist Register 2 */
-@@ -140,15 +147,18 @@
- #define SPRN_MAS4     0x274   /* MMU Assist Register 4 */
- #define SPRN_MAS5     0x275   /* MMU Assist Register 5 */
- #define SPRN_MAS6     0x276   /* MMU Assist Register 6 */
--#define SPRN_MAS7     0x3b0   /* MMU Assist Register 7 */
- #define SPRN_PID1     0x279   /* Process ID Register 1 */
- #define SPRN_PID2     0x27A   /* Process ID Register 2 */
- #define SPRN_TLB0CFG  0x2B0   /* TLB 0 Config Register */
- #define SPRN_TLB1CFG  0x2B1   /* TLB 1 Config Register */
-+#define SPRN_EPR      0x2BE   /* External Proxy Register */
- #define SPRN_CCR1     0x378   /* Core Configuration Register 1 */
- #define SPRN_ZPR      0x3B0   /* Zone Protection Register (40x) */
-+#define SPRN_MAS7     0x3B0   /* MMU Assist Register 7 */
- #define SPRN_MMUCR    0x3B2   /* MMU Control Register */
- #define SPRN_CCR0     0x3B3   /* Core Configuration Register 0 */
-+#define SPRN_EPLC     0x3B3   /* External Process ID Load Context */
-+#define SPRN_EPSC     0x3B4   /* External Process ID Store Context */
- #define SPRN_SGR      0x3B9   /* Storage Guarded Register */
- #define SPRN_DCWR     0x3BA   /* Data Cache Write-thru Register */
- #define SPRN_SLER     0x3BB   /* Little-endian real mode */
-@@ -159,6 +169,7 @@
- #define SPRN_L1CSR0   0x3F2   /* L1 Cache Control and Status Register 0 */
- #define SPRN_L1CSR1   0x3F3   /* L1 Cache Control and Status Register 1 */
- #define SPRN_PIT      0x3DB   /* Programmable Interval Timer */
-+#define SPRN_BUCSR    0x3F5   /* Branch Unit Control and Status */
- #define SPRN_DCCR     0x3FA   /* Data Cache Cacheability Register */
- #define SPRN_ICCR     0x3FB   /* Instruction Cache Cacheability Register */
- #define SPRN_SVR      0x3FF   /* System Version Register */
-@@ -207,7 +218,6 @@
- #define       CCR1_TCS        0x00000080 /* Timer Clock Select */
- /* Bit definitions for the MCSR. */
--#ifdef CONFIG_440A
- #define MCSR_MCS      0x80000000 /* Machine Check Summary */
- #define MCSR_IB               0x40000000 /* Instruction PLB Error */
- #define MCSR_DRB      0x20000000 /* Data Read PLB Error */
-@@ -217,7 +227,7 @@
- #define MCSR_DCSP     0x02000000 /* D-Cache Search Parity Error */
- #define MCSR_DCFP     0x01000000 /* D-Cache Flush Parity Error */
- #define MCSR_IMPE     0x00800000 /* Imprecise Machine Check Exception */
--#endif
-+
- #ifdef CONFIG_E500
- #define MCSR_MCP      0x80000000UL /* Machine Check Input Pin */
- #define MCSR_ICPERR   0x40000000UL /* I-Cache Parity Error */
-@@ -293,7 +303,7 @@
- #define ESR_IMCB      0x20000000      /* Instr. Machine Check - Bus error */
- #define ESR_IMCT      0x10000000      /* Instr. Machine Check - Timeout */
- #define ESR_PIL               0x08000000      /* Program Exception - Illegal */
--#define ESR_PPR               0x04000000      /* Program Exception - Priveleged */
-+#define ESR_PPR               0x04000000      /* Program Exception - Privileged */
- #define ESR_PTR               0x02000000      /* Program Exception - Trap */
- #define ESR_FP                0x01000000      /* Floating Point Operation */
- #define ESR_DST               0x00800000      /* Storage Exception - Data miss */
---- /dev/null
-+++ b/include/asm-powerpc/setjmp.h
-@@ -0,0 +1,18 @@
-+/*
-+ * Copyright Â© 2008 Michael Neuling IBM Corporation
-+ *
-+ *      This program is free software; you can redistribute it and/or
-+ *      modify it under the terms of the GNU General Public License
-+ *      as published by the Free Software Foundation; either version
-+ *      2 of the License, or (at your option) any later version.
-+ *
-+ */
-+#ifndef _ASM_POWERPC_SETJMP_H
-+#define _ASM_POWERPC_SETJMP_H
-+
-+#define JMP_BUF_LEN    23
-+
-+extern long setjmp(long *);
-+extern void longjmp(long *, long);
-+
-+#endif /* _ASM_POWERPC_SETJMP_H */
---- a/include/asm-powerpc/smu.h
-+++ b/include/asm-powerpc/smu.h
-@@ -22,7 +22,7 @@
-  * Partition info commands
-  *
-  * These commands are used to retrieve the sdb-partition-XX datas from
-- * the SMU. The lenght is always 2. First byte is the subcommand code
-+ * the SMU. The length is always 2. First byte is the subcommand code
-  * and second byte is the partition ID.
-  *
-  * The reply is 6 bytes:
-@@ -173,12 +173,12 @@
-  * Power supply control
-  *
-  * The "sub" command is an ASCII string in the data, the
-- * data lenght is that of the string.
-+ * data length is that of the string.
-  *
-  * The VSLEW command can be used to get or set the voltage slewing.
-- *  - lenght 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
-+ *  - length 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
-  *    reply at data offset 6, 7 and 8.
-- *  - lenght 8 ("VSLEWxyz") has 3 additional bytes appended, and is
-+ *  - length 8 ("VSLEWxyz") has 3 additional bytes appended, and is
-  *    used to set the voltage slewing point. The SMU replies with "DONE"
-  * I yet have to figure out their exact meaning of those 3 bytes in
-  * both cases. They seem to be:
-@@ -201,20 +201,90 @@
-  */
- #define SMU_CMD_READ_ADC                      0xd8
-+
- /* Misc commands
-  *
-  * This command seem to be a grab bag of various things
-+ *
-+ * Parameters:
-+ *   1: subcommand
-  */
- #define SMU_CMD_MISC_df_COMMAND                       0xdf
--#define   SMU_CMD_MISC_df_SET_DISPLAY_LIT     0x02 /* i: 1 byte */
-+
-+/*
-+ * Sets "system ready" status
-+ *
-+ * I did not yet understand how it exactly works or what it does.
-+ *
-+ * Guessing from OF code, 0x02 activates the display backlight. Apple uses/used
-+ * the same codebase for all OF versions. On PowerBooks, this command would
-+ * enable the backlight. For the G5s, it only activates the front LED. However,
-+ * don't take this for granted.
-+ *
-+ * Parameters:
-+ *   2: status [0x00, 0x01 or 0x02]
-+ */
-+#define   SMU_CMD_MISC_df_SET_DISPLAY_LIT     0x02
-+
-+/*
-+ * Sets mode of power switch.
-+ *
-+ * What this actually does is not yet known. Maybe it enables some interrupt.
-+ *
-+ * Parameters:
-+ *   2: enable power switch? [0x00 or 0x01]
-+ *   3 (optional): enable nmi? [0x00 or 0x01]
-+ *
-+ * Returns:
-+ *   If parameter 2 is 0x00 and parameter 3 is not specified, returns wether
-+ *   NMI is enabled. Otherwise unknown.
-+ */
- #define   SMU_CMD_MISC_df_NMI_OPTION          0x04
-+/* Sets LED dimm offset.
-+ *
-+ * The front LED dimms itself during sleep. Its brightness (or, well, the PWM
-+ * frequency) depends on current time. Therefore, the SMU needs to know the
-+ * timezone.
-+ *
-+ * Parameters:
-+ *   2-8: unknown (BCD coding)
-+ */
-+#define   SMU_CMD_MISC_df_DIMM_OFFSET         0x99
-+
-+
- /*
-  * Version info commands
-  *
-- * I haven't quite tried to figure out how these work
-+ * Parameters:
-+ *   1 (optional): Specifies version part to retrieve
-+ *
-+ * Returns:
-+ *   Version value
-  */
- #define SMU_CMD_VERSION_COMMAND                       0xea
-+#define   SMU_VERSION_RUNNING                 0x00
-+#define   SMU_VERSION_BASE                    0x01
-+#define   SMU_VERSION_UPDATE                  0x02
-+
-+
-+/*
-+ * Switches
-+ *
-+ * These are switches whose status seems to be known to the SMU.
-+ *
-+ * Parameters:
-+ *   none
-+ *
-+ * Result:
-+ *   Switch bits (ORed, see below)
-+ */
-+#define SMU_CMD_SWITCHES                      0xdc
-+
-+/* Switches bits */
-+#define SMU_SWITCH_CASE_CLOSED                        0x01
-+#define SMU_SWITCH_AC_POWER                   0x04
-+#define SMU_SWITCH_POWER_SWITCH                       0x08
- /*
-@@ -243,10 +313,64 @@
-  */
- #define SMU_CMD_MISC_ee_COMMAND                       0xee
- #define   SMU_CMD_MISC_ee_GET_DATABLOCK_REC   0x02
--#define         SMU_CMD_MISC_ee_LEDS_CTRL             0x04 /* i: 00 (00,01) [00] */
-+
-+/* Retrieves currently used watts.
-+ *
-+ * Parameters:
-+ *   1: 0x03 (Meaning unknown)
-+ */
-+#define   SMU_CMD_MISC_ee_GET_WATTS           0x03
-+
-+#define   SMU_CMD_MISC_ee_LEDS_CTRL           0x04 /* i: 00 (00,01) [00] */
- #define   SMU_CMD_MISC_ee_GET_DATA            0x05 /* i: 00 , o: ?? */
-+/*
-+ * Power related commands
-+ *
-+ * Parameters:
-+ *   1: subcommand
-+ */
-+#define SMU_CMD_POWER_EVENTS_COMMAND          0x8f
-+
-+/* SMU_POWER_EVENTS subcommands */
-+enum {
-+      SMU_PWR_GET_POWERUP_EVENTS      = 0x00,
-+      SMU_PWR_SET_POWERUP_EVENTS      = 0x01,
-+      SMU_PWR_CLR_POWERUP_EVENTS      = 0x02,
-+      SMU_PWR_GET_WAKEUP_EVENTS       = 0x03,
-+      SMU_PWR_SET_WAKEUP_EVENTS       = 0x04,
-+      SMU_PWR_CLR_WAKEUP_EVENTS       = 0x05,
-+
-+      /*
-+       * Get last shutdown cause
-+       *
-+       * Returns:
-+       *   1 byte (signed char): Last shutdown cause. Exact meaning unknown.
-+       */
-+      SMU_PWR_LAST_SHUTDOWN_CAUSE     = 0x07,
-+
-+      /*
-+       * Sets or gets server ID. Meaning or use is unknown.
-+       *
-+       * Parameters:
-+       *   2 (optional): Set server ID (1 byte)
-+       *
-+       * Returns:
-+       *   1 byte (server ID?)
-+       */
-+      SMU_PWR_SERVER_ID               = 0x08,
-+};
-+
-+/* Power events wakeup bits */
-+enum {
-+      SMU_PWR_WAKEUP_KEY              = 0x01, /* Wake on key press */
-+      SMU_PWR_WAKEUP_AC_INSERT        = 0x02, /* Wake on AC adapter plug */
-+      SMU_PWR_WAKEUP_AC_CHANGE        = 0x04,
-+      SMU_PWR_WAKEUP_LID_OPEN         = 0x08,
-+      SMU_PWR_WAKEUP_RING             = 0x10,
-+};
-+
- /*
-  * - Kernel side interface -
-@@ -564,13 +688,13 @@ struct smu_user_cmd_hdr
-       __u8            cmd;                    /* SMU command byte */
-       __u8            pad[3];                 /* padding */
--      __u32           data_len;               /* Lenght of data following */
-+      __u32           data_len;               /* Length of data following */
- };
- struct smu_user_reply_hdr
- {
-       __u32           status;                 /* Command status */
--      __u32           reply_len;              /* Lenght of data follwing */
-+      __u32           reply_len;              /* Length of data follwing */
- };
- #endif /*  _SMU_H */
---- a/include/asm-powerpc/sparsemem.h
-+++ b/include/asm-powerpc/sparsemem.h
-@@ -10,13 +10,8 @@
-  */
- #define SECTION_SIZE_BITS       24
--#if defined(CONFIG_PS3_USE_LPAR_ADDR)
--#define MAX_PHYSADDR_BITS       47
--#define MAX_PHYSMEM_BITS        47
--#else
- #define MAX_PHYSADDR_BITS       44
- #define MAX_PHYSMEM_BITS        44
--#endif
- #ifdef CONFIG_MEMORY_HOTPLUG
- extern void create_section_mapping(unsigned long start, unsigned long end);
---- a/include/asm-powerpc/spu.h
-+++ b/include/asm-powerpc/spu.h
-@@ -104,6 +104,7 @@
- struct spu_context;
- struct spu_runqueue;
-+struct spu_lscsa;
- struct device_node;
- enum spu_utilization_state {
-@@ -145,7 +146,6 @@ struct spu {
-       void (* ibox_callback)(struct spu *spu);
-       void (* stop_callback)(struct spu *spu);
-       void (* mfc_callback)(struct spu *spu);
--      void (* dma_callback)(struct spu *spu, int type);
-       char irq_c0[8];
-       char irq_c1[8];
-@@ -196,10 +196,11 @@ struct cbe_spu_info {
- extern struct cbe_spu_info cbe_spu_info[];
- void spu_init_channels(struct spu *spu);
--int spu_irq_class_0_bottom(struct spu *spu);
--int spu_irq_class_1_bottom(struct spu *spu);
- void spu_irq_setaffinity(struct spu *spu, int cpu);
-+void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
-+              void *code, int code_size);
-+
- #ifdef CONFIG_KEXEC
- void crash_register_spus(struct list_head *list);
- #else
-@@ -210,6 +211,7 @@ static inline void crash_register_spus(s
- extern void spu_invalidate_slbs(struct spu *spu);
- extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm);
-+int spu_64k_pages_available(void);
- /* Calls from the memory management to the SPU */
- struct mm_struct;
-@@ -279,6 +281,8 @@ void spu_remove_sysdev_attr(struct sysde
- int spu_add_sysdev_attr_group(struct attribute_group *attrs);
- void spu_remove_sysdev_attr_group(struct attribute_group *attrs);
-+int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
-+              unsigned long dsisr, unsigned *flt);
- /*
-  * Notifier blocks:
-@@ -303,7 +307,7 @@ extern void notify_spus_active(void);
- extern void do_notify_spus_active(void);
- /*
-- * This defines the Local Store, Problem Area and Privlege Area of an SPU.
-+ * This defines the Local Store, Problem Area and Privilege Area of an SPU.
-  */
- union mfc_tag_size_class_cmd {
-@@ -524,8 +528,24 @@ struct spu_priv1 {
- #define CLASS2_ENABLE_SPU_STOP_INTR                   0x2L
- #define CLASS2_ENABLE_SPU_HALT_INTR                   0x4L
- #define CLASS2_ENABLE_SPU_DMA_TAG_GROUP_COMPLETE_INTR 0x8L
-+#define CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR          0x10L
-       u8  pad_0x118_0x140[0x28];                              /* 0x118 */
-       u64 int_stat_RW[3];                                     /* 0x140 */
-+#define CLASS0_DMA_ALIGNMENT_INTR                     0x1L
-+#define CLASS0_INVALID_DMA_COMMAND_INTR                       0x2L
-+#define CLASS0_SPU_ERROR_INTR                         0x4L
-+#define CLASS0_INTR_MASK                              0x7L
-+#define CLASS1_SEGMENT_FAULT_INTR                     0x1L
-+#define CLASS1_STORAGE_FAULT_INTR                     0x2L
-+#define CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR         0x4L
-+#define CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR         0x8L
-+#define CLASS1_INTR_MASK                              0xfL
-+#define CLASS2_MAILBOX_INTR                           0x1L
-+#define CLASS2_SPU_STOP_INTR                          0x2L
-+#define CLASS2_SPU_HALT_INTR                          0x4L
-+#define CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR                0x8L
-+#define CLASS2_MAILBOX_THRESHOLD_INTR                 0x10L
-+#define CLASS2_INTR_MASK                              0x1fL
-       u8  pad_0x158_0x180[0x28];                              /* 0x158 */
-       u64 int_route_RW;                                       /* 0x180 */
---- a/include/asm-powerpc/spu_csa.h
-+++ b/include/asm-powerpc/spu_csa.h
-@@ -194,7 +194,7 @@ struct spu_priv1_collapsed {
- };
- /*
-- * struct spu_priv2_collapsed - condensed priviliged 2 area, w/o pads.
-+ * struct spu_priv2_collapsed - condensed privileged 2 area, w/o pads.
-  */
- struct spu_priv2_collapsed {
-       u64 slb_index_W;
-@@ -254,20 +254,11 @@ struct spu_state {
-       u64 spu_chnldata_RW[32];
-       u32 spu_mailbox_data[4];
-       u32 pu_mailbox_data[1];
--      u64 dar, dsisr;
-+      u64 dar, dsisr, class_0_pending;
-       unsigned long suspend_time;
-       spinlock_t register_lock;
- };
--extern int spu_init_csa(struct spu_state *csa);
--extern void spu_fini_csa(struct spu_state *csa);
--extern int spu_save(struct spu_state *prev, struct spu *spu);
--extern int spu_restore(struct spu_state *new, struct spu *spu);
--extern int spu_switch(struct spu_state *prev, struct spu_state *new,
--                    struct spu *spu);
--extern int spu_alloc_lscsa(struct spu_state *csa);
--extern void spu_free_lscsa(struct spu_state *csa);
--
- #endif /* !__SPU__ */
- #endif /* __KERNEL__ */
- #endif /* !__ASSEMBLY__ */
---- a/include/asm-powerpc/spu_priv1.h
-+++ b/include/asm-powerpc/spu_priv1.h
-@@ -24,6 +24,7 @@
- #include <linux/types.h>
- struct spu;
-+struct spu_context;
- /* access to priv1 registers */
-@@ -178,6 +179,8 @@ struct spu_management_ops {
-       int (*enumerate_spus)(int (*fn)(void *data));
-       int (*create_spu)(struct spu *spu, void *data);
-       int (*destroy_spu)(struct spu *spu);
-+      void (*enable_spu)(struct spu_context *ctx);
-+      void (*disable_spu)(struct spu_context *ctx);
-       int (*init_affinity)(void);
- };
-@@ -207,6 +210,18 @@ spu_init_affinity (void)
-       return spu_management_ops->init_affinity();
- }
-+static inline void
-+spu_enable_spu (struct spu_context *ctx)
-+{
-+      spu_management_ops->enable_spu(ctx);
-+}
-+
-+static inline void
-+spu_disable_spu (struct spu_context *ctx)
-+{
-+      spu_management_ops->disable_spu(ctx);
-+}
-+
- /*
-  * The declarations folowing are put here for convenience
-  * and only intended to be used by the platform setup code.
---- a/include/asm-powerpc/system.h
-+++ b/include/asm-powerpc/system.h
-@@ -169,6 +169,8 @@ extern int do_page_fault(struct pt_regs 
- extern void bad_page_fault(struct pt_regs *, unsigned long, int);
- extern int die(const char *, struct pt_regs *, long);
- extern void _exception(int, struct pt_regs *, int, unsigned long);
-+extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
-+
- #ifdef CONFIG_BOOKE_WDT
- extern u32 booke_wdt_enabled;
- extern u32 booke_wdt_period;
---- a/include/asm-powerpc/udbg.h
-+++ b/include/asm-powerpc/udbg.h
-@@ -48,6 +48,7 @@ extern void __init udbg_init_rtas_consol
- extern void __init udbg_init_debug_beat(void);
- extern void __init udbg_init_btext(void);
- extern void __init udbg_init_44x_as1(void);
-+extern void __init udbg_init_40x_realmode(void);
- extern void __init udbg_init_cpm(void);
- #endif /* __KERNEL__ */
---- a/include/asm-ppc/8xx_immap.h
-+++ b/include/asm-ppc/8xx_immap.h
-@@ -123,7 +123,7 @@ typedef struct     mem_ctlr {
- #define OR_G5LA               0x00000400      /* Output #GPL5 on #GPL_A5              */
- #define OR_G5LS               0x00000200      /* Drive #GPL high on falling edge of...*/
- #define OR_BI         0x00000100      /* Burst inhibit                        */
--#define OR_SCY_MSK    0x000000f0      /* Cycle Lenght in Clocks               */
-+#define OR_SCY_MSK    0x000000f0      /* Cycle Length in Clocks               */
- #define OR_SCY_0_CLK  0x00000000      /* 0 clock cycles wait states           */
- #define OR_SCY_1_CLK  0x00000010      /* 1 clock cycles wait states           */
- #define OR_SCY_2_CLK  0x00000020      /* 2 clock cycles wait states           */
---- a/include/asm-ppc/commproc.h
-+++ b/include/asm-ppc/commproc.h
-@@ -681,7 +681,7 @@ typedef struct risc_timer_pram {
- #define       CICR_SCC_SCC3           ((uint)0x00200000)      /* SCC3 @ SCCc */
- #define       CICR_SCB_SCC2           ((uint)0x00040000)      /* SCC2 @ SCCb */
- #define       CICR_SCA_SCC1           ((uint)0x00000000)      /* SCC1 @ SCCa */
--#define CICR_IRL_MASK         ((uint)0x0000e000)      /* Core interrrupt */
-+#define CICR_IRL_MASK         ((uint)0x0000e000)      /* Core interrupt */
- #define CICR_HP_MASK          ((uint)0x00001f00)      /* Hi-pri int. */
- #define CICR_IEN              ((uint)0x00000080)      /* Int. enable */
- #define CICR_SPS              ((uint)0x00000001)      /* SCC Spread */
---- a/include/asm-ppc/mmu.h
-+++ b/include/asm-ppc/mmu.h
-@@ -383,6 +383,12 @@ typedef struct _P601_BAT {
- #define BOOKE_PAGESZ_256GB    14
- #define BOOKE_PAGESZ_1TB      15
-+#ifndef CONFIG_SERIAL_TEXT_DEBUG
-+#define PPC44x_EARLY_TLBS     1
-+#else
-+#define PPC44x_EARLY_TLBS     2
-+#endif
-+
- /*
-  * Freescale Book-E MMU support
-  */
---- a/include/asm-ppc/mpc52xx_psc.h
-+++ b/include/asm-ppc/mpc52xx_psc.h
-@@ -159,6 +159,9 @@ struct mpc52xx_psc {
-       u8              reserved16[3];
-       u8              irfdr;          /* PSC + 0x54 */
-       u8              reserved17[3];
-+};
-+
-+struct mpc52xx_psc_fifo {
-       u16             rfnum;          /* PSC + 0x58 */
-       u16             reserved18;
-       u16             tfnum;          /* PSC + 0x5c */
---- a/include/asm-ppc/reg_booke.h
-+++ b/include/asm-ppc/reg_booke.h
-@@ -207,7 +207,7 @@
- #define       CCR1_TCS        0x00000080 /* Timer Clock Select */
- /* Bit definitions for the MCSR. */
--#ifdef CONFIG_440A
-+#ifdef CONFIG_4xx
- #define MCSR_MCS      0x80000000 /* Machine Check Summary */
- #define MCSR_IB               0x40000000 /* Instruction PLB Error */
- #define MCSR_DRB      0x20000000 /* Data Read PLB Error */
-@@ -283,7 +283,7 @@
- #define ESR_IMCB      0x20000000      /* Instr. Machine Check - Bus error */
- #define ESR_IMCT      0x10000000      /* Instr. Machine Check - Timeout */
- #define ESR_PIL               0x08000000      /* Program Exception - Illegal */
--#define ESR_PPR               0x04000000      /* Program Exception - Priveleged */
-+#define ESR_PPR               0x04000000      /* Program Exception - Privileged */
- #define ESR_PTR               0x02000000      /* Program Exception - Trap */
- #define ESR_FP                0x01000000      /* Floating Point Operation */
- #define ESR_DST               0x00800000      /* Storage Exception - Data miss */
---- a/include/linux/of.h
-+++ b/include/linux/of.h
-@@ -17,6 +17,7 @@
-  */
- #include <linux/types.h>
- #include <linux/bitops.h>
-+#include <linux/mod_devicetable.h>
- #include <asm/prom.h>
-@@ -41,11 +42,20 @@ extern struct device_node *of_find_compa
- #define for_each_compatible_node(dn, type, compatible) \
-       for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-            dn = of_find_compatible_node(dn, type, compatible))
-+extern struct device_node *of_find_matching_node(struct device_node *from,
-+      const struct of_device_id *matches);
-+#define for_each_matching_node(dn, matches) \
-+      for (dn = of_find_matching_node(NULL, matches); dn; \
-+           dn = of_find_matching_node(dn, matches))
- extern struct device_node *of_find_node_by_path(const char *path);
- extern struct device_node *of_find_node_by_phandle(phandle handle);
- extern struct device_node *of_get_parent(const struct device_node *node);
- extern struct device_node *of_get_next_child(const struct device_node *node,
-                                            struct device_node *prev);
-+#define for_each_child_of_node(parent, child) \
-+      for (child = of_get_next_child(parent, NULL); child != NULL; \
-+           child = of_get_next_child(parent, child))
-+
- extern struct property *of_find_property(const struct device_node *np,
-                                        const char *name,
-                                        int *lenp);
-@@ -56,5 +66,7 @@ extern const void *of_get_property(const
-                               int *lenp);
- extern int of_n_addr_cells(struct device_node *np);
- extern int of_n_size_cells(struct device_node *np);
-+extern const struct of_device_id *of_match_node(
-+      const struct of_device_id *matches, const struct device_node *node);
- #endif /* _LINUX_OF_H */
---- a/include/linux/of_device.h
-+++ b/include/linux/of_device.h
-@@ -10,8 +10,6 @@
- #define       to_of_device(d) container_of(d, struct of_device, dev)
--extern const struct of_device_id *of_match_node(
--      const struct of_device_id *matches, const struct device_node *node);
- extern const struct of_device_id *of_match_device(
-       const struct of_device_id *matches, const struct of_device *dev);
---- a/include/linux/pata_platform.h
-+++ b/include/linux/pata_platform.h
-@@ -15,4 +15,13 @@ struct pata_platform_info {
-       unsigned int irq_flags;
- };
-+extern int __devinit __pata_platform_probe(struct device *dev,
-+                                         struct resource *io_res,
-+                                         struct resource *ctl_res,
-+                                         struct resource *irq_res,
-+                                         unsigned int ioport_shift,
-+                                         int __pio_mask);
-+
-+extern int __devexit __pata_platform_remove(struct device *dev);
-+
- #endif /* __LINUX_PATA_PLATFORM_H */
---- a/include/linux/phy_fixed.h
-+++ b/include/linux/phy_fixed.h
-@@ -1,38 +1,31 @@
- #ifndef __PHY_FIXED_H
- #define __PHY_FIXED_H
--#define MII_REGS_NUM  29
--
--/* max number of virtual phy stuff */
--#define MAX_PHY_AMNT  10
--/*
--    The idea is to emulate normal phy behavior by responding with
--    pre-defined values to mii BMCR read, so that read_status hook could
--    take all the needed info.
--*/
--
- struct fixed_phy_status {
--      u8 link;
--      u16 speed;
--      u8 duplex;
-+      int link;
-+      int speed;
-+      int duplex;
-+      int pause;
-+      int asym_pause;
- };
--/*-----------------------------------------------------------------------------
-- *  Private information hoder for mii_bus
-- *-----------------------------------------------------------------------------*/
--struct fixed_info {
--      u16 *regs;
--      u8 regs_num;
--      struct fixed_phy_status phy_status;
--      struct phy_device *phydev;      /* pointer to the container */
--      /* link & speed cb */
--      int (*link_update) (struct net_device *, struct fixed_phy_status *);
-+#ifdef CONFIG_FIXED_PHY
-+extern int fixed_phy_add(unsigned int irq, int phy_id,
-+                       struct fixed_phy_status *status);
-+#else
-+static inline int fixed_phy_add(unsigned int irq, int phy_id,
-+                              struct fixed_phy_status *status)
-+{
-+      return -ENODEV;
-+}
-+#endif /* CONFIG_FIXED_PHY */
--};
--
--
--int fixed_mdio_set_link_update(struct phy_device *,
--       int (*link_update) (struct net_device *, struct fixed_phy_status *));
--struct fixed_info *fixed_mdio_get_phydev (int phydev_ind);
-+/*
-+ * This function issued only by fixed_phy-aware drivers, no need
-+ * protect it with #ifdef
-+ */
-+extern int fixed_phy_set_link_update(struct phy_device *phydev,
-+                      int (*link_update)(struct net_device *,
-+                                         struct fixed_phy_status *));
- #endif /* __PHY_FIXED_H */
---- a/include/linux/pmu.h
-+++ b/include/linux/pmu.h
-@@ -159,41 +159,7 @@ extern void pmu_unlock(void);
- extern int pmu_present(void);
- extern int pmu_get_model(void);
--#ifdef CONFIG_PM
--/*
-- * Stuff for putting the powerbook to sleep and waking it again.
-- *
-- */
--#include <linux/list.h>
--
--struct pmu_sleep_notifier
--{
--      void (*notifier_call)(struct pmu_sleep_notifier *self, int when);
--      int priority;
--      struct list_head list;
--};
--
--/* Code values for calling sleep/wakeup handlers
-- */
--#define PBOOK_SLEEP_REQUEST   1
--#define PBOOK_SLEEP_NOW               2
--#define PBOOK_WAKE            3
--
--/* priority levels in notifiers */
--#define SLEEP_LEVEL_VIDEO     100     /* Video driver (first wake) */
--#define SLEEP_LEVEL_MEDIABAY  90      /* Media bay driver */
--#define SLEEP_LEVEL_BLOCK     80      /* IDE, SCSI */
--#define SLEEP_LEVEL_NET               70      /* bmac, gmac */
--#define SLEEP_LEVEL_MISC      60      /* Anything else */
--#define SLEEP_LEVEL_USERLAND  55      /* Reserved for apm_emu */
--#define SLEEP_LEVEL_ADB               50      /* ADB (async) */
--#define SLEEP_LEVEL_SOUND     40      /* Sound driver (blocking) */
--
--/* special register notifier functions */
--int pmu_register_sleep_notifier(struct pmu_sleep_notifier* notifier);
--int pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* notifier);
--
--#endif /* CONFIG_PM */
-+extern void pmu_backlight_set_sleep(int sleep);
- #define PMU_MAX_BATTERIES     2
diff --git a/target/linux/generic-2.6/patches-2.6.24/801-usb_serial_endpoint_size.patch b/target/linux/generic-2.6/patches-2.6.24/801-usb_serial_endpoint_size.patch
deleted file mode 100644 (file)
index 1c777d2..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -58,6 +58,7 @@ static struct usb_driver usb_serial_driv
-    drivers depend on it.
- */
-+static ushort maxSize = 0;
- static int debug;
- static struct usb_serial *serial_table[SERIAL_TTY_MINORS];    /* initially all NULL */
- static DEFINE_MUTEX(table_lock);
-@@ -894,7 +895,7 @@ int usb_serial_probe(struct usb_interfac
-                       dev_err(&interface->dev, "No free urbs available\n");
-                       goto probe_error;
-               }
--              buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
-+              buffer_size = (endpoint->wMaxPacketSize > maxSize) ? endpoint->wMaxPacketSize : maxSize;
-               port->bulk_in_size = buffer_size;
-               port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
-               port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
-@@ -1306,3 +1307,5 @@ MODULE_LICENSE("GPL");
- module_param(debug, bool, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(debug, "Debug enabled or not");
-+module_param(maxSize, ushort,0);
-+MODULE_PARM_DESC(maxSize,"User specified USB endpoint size");
diff --git a/target/linux/generic-2.6/patches-2.6.24/840-unable_to_open_console.patch b/target/linux/generic-2.6/patches-2.6.24/840-unable_to_open_console.patch
deleted file mode 100644 (file)
index dba2e27..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/init/main.c
-+++ b/init/main.c
-@@ -773,7 +773,7 @@ static int noinline init_post(void)
-       numa_default_policy();
-       if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
--              printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-+              printk(KERN_WARNING "Please be patient, while OpenWrt loads ...\n");
-       (void) sys_dup(0);
-       (void) sys_dup(0);
diff --git a/target/linux/generic-2.6/patches-2.6.24/850-jffs2_erase_progress_indicator.patch b/target/linux/generic-2.6/patches-2.6.24/850-jffs2_erase_progress_indicator.patch
deleted file mode 100644 (file)
index 20bf1ef..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
---- a/fs/jffs2/erase.c
-+++ b/fs/jffs2/erase.c
-@@ -35,6 +35,8 @@ static void jffs2_erase_block(struct jff
- {
-       int ret;
-       uint32_t bad_offset;
-+      static char s[]="|/-\\", *p=s;
-+
- #ifdef __ECOS
-        ret = jffs2_flash_erase(c, jeb);
-        if (!ret) {
-@@ -47,6 +49,11 @@ static void jffs2_erase_block(struct jff
-       D1(printk(KERN_DEBUG "jffs2_erase_block(): erase block %#08x (range %#08x-%#08x)\n",
-                               jeb->offset, jeb->offset, jeb->offset + c->sector_size));
-+
-+      printk("%c\b", *p);
-+      if (*++p==0)
-+      p=s;
-+
-       instr = kmalloc(sizeof(struct erase_info) + sizeof(struct erase_priv_struct), GFP_KERNEL);
-       if (!instr) {
-               printk(KERN_WARNING "kmalloc for struct erase_info in jffs2_erase_block failed. Refiling block for later\n");
diff --git a/target/linux/generic-2.6/patches-2.6.24/900-headers_type_and_time.patch b/target/linux/generic-2.6/patches-2.6.24/900-headers_type_and_time.patch
deleted file mode 100644 (file)
index dc6e542..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
---- a/include/linux/time.h
-+++ b/include/linux/time.h
-@@ -1,6 +1,10 @@
- #ifndef _LINUX_TIME_H
- #define _LINUX_TIME_H
-+#ifndef __KERNEL__
-+#include <time.h>
-+#else
-+
- #include <linux/types.h>
- #ifdef __KERNEL__
-@@ -231,4 +235,6 @@ struct itimerval {
-  */
- #define TIMER_ABSTIME                 0x01
-+#endif /* __KERNEL__ DEBIAN */
-+
- #endif
---- a/include/linux/types.h
-+++ b/include/linux/types.h
-@@ -1,6 +1,14 @@
- #ifndef _LINUX_TYPES_H
- #define _LINUX_TYPES_H
-+/* Debian: Use userland types instead.  */
-+#ifndef __KERNEL__
-+# include <sys/types.h>
-+/* For other kernel headers.  */
-+# include <linux/posix_types.h>
-+# include <asm/types.h>
-+#else
-+
- #ifdef        __KERNEL__
- #define DECLARE_BITMAP(name,bits) \
-@@ -161,6 +169,8 @@ typedef unsigned long blkcnt_t;
- #endif /* __KERNEL_STRICT_NAMES */
-+#endif /* __KERNEL__ DEBIAN */
-+
- /*
-  * Below are truly Linux-specific types that should never collide with
-  * any application/library that wants linux/types.h.
diff --git a/target/linux/generic-2.6/patches-2.6.24/902-darwin_scripts_include.patch b/target/linux/generic-2.6/patches-2.6.24/902-darwin_scripts_include.patch
deleted file mode 100644 (file)
index 621831e..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
---- a/scripts/genksyms/parse.c_shipped
-+++ b/scripts/genksyms/parse.c_shipped
-@@ -160,7 +160,9 @@
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
- static int is_typedef;
---- a/scripts/genksyms/parse.y
-+++ b/scripts/genksyms/parse.y
-@@ -24,7 +24,9 @@
- %{
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
- static int is_typedef;
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -28,6 +28,35 @@
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-+#ifdef __APPLE__
-+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */
-+void *memmem (const void *haystack, size_t haystack_len,
-+                          const void *needle,  size_t needle_len)
-+{
-+  const char *begin;
-+  const char *const last_possible
-+    = (const char *) haystack + haystack_len - needle_len;
-+
-+  if (needle_len == 0)
-+    /* The first occurrence of the empty string is deemed to occur at
-+       the beginning of the string.  */
-+    return (void *) haystack;
-+
-+  /* Sanity check, otherwise the loop might search through the whole
-+     memory.  */
-+  if (__builtin_expect (haystack_len < needle_len, 0))
-+    return NULL;
-+
-+  for (begin = (const char *) haystack; begin <= last_possible; ++begin)
-+    if (begin[0] == ((const char *) needle)[0] &&
-+        !memcmp ((const void *) &begin[1],
-+                 (const void *) ((const char *) needle + 1),
-+                 needle_len - 1))
-+      return (void *) begin;
-+
-+  return NULL;
-+}
-+#endif
- #define KSYM_NAME_LEN         128
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -90,6 +90,9 @@ check-lxdialog  := $(srctree)/$(src)/lxd
- # we really need to do so. (Do not call gcc as part of make mrproper)
- HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
- HOST_LOADLIBES   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-+ifeq ($(shell uname -s),Darwin)
-+HOST_LOADLIBES  += -lncurses
-+endif
- HOST_EXTRACFLAGS += -DLOCALE
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
- #include "elfconfig.h"
diff --git a/target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch b/target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch
deleted file mode 100644 (file)
index 1cf439e..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
---- a/drivers/net/wireless/hostap/hostap_ap.c
-+++ b/drivers/net/wireless/hostap/hostap_ap.c
-@@ -2358,13 +2358,13 @@ int prism2_ap_get_sta_qual(local_info_t 
-               addr[count].sa_family = ARPHRD_ETHER;
-               memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
-               if (sta->last_rx_silence == 0)
--                      qual[count].qual = sta->last_rx_signal < 27 ?
--                              0 : (sta->last_rx_signal - 27) * 92 / 127;
-+                        qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
-+                                0 : (sta->last_rx_signal - 156) * 92 / 64;
-               else
--                      qual[count].qual = sta->last_rx_signal -
--                              sta->last_rx_silence - 35;
--              qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
--              qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+                        qual[count].qual = (sta->last_rx_signal -
-+                                sta->last_rx_silence) * 92 / 64;
-+                qual[count].level = sta->last_rx_signal;
-+                qual[count].noise = sta->last_rx_silence;
-               qual[count].updated = sta->last_rx_updated;
-               sta->last_rx_updated = IW_QUAL_DBM;
-@@ -2429,13 +2429,13 @@ int prism2_ap_translate_scan(struct net_
-               memset(&iwe, 0, sizeof(iwe));
-               iwe.cmd = IWEVQUAL;
-               if (sta->last_rx_silence == 0)
--                      iwe.u.qual.qual = sta->last_rx_signal < 27 ?
--                              0 : (sta->last_rx_signal - 27) * 92 / 127;
-+                      iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
-+                              0 : (sta->last_rx_signal - 156) * 92 / 64;
-               else
--                      iwe.u.qual.qual = sta->last_rx_signal -
--                              sta->last_rx_silence - 35;
--              iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
--              iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+                        iwe.u.qual.qual = (sta->last_rx_signal -
-+                                sta->last_rx_silence) * 92 / 64;
-+                iwe.u.qual.level = sta->last_rx_signal;
-+                iwe.u.qual.noise = sta->last_rx_silence;
-               iwe.u.qual.updated = sta->last_rx_updated;
-               iwe.len = IW_EV_QUAL_LEN;
-               current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
---- a/drivers/net/wireless/hostap/hostap_config.h
-+++ b/drivers/net/wireless/hostap/hostap_config.h
-@@ -45,4 +45,9 @@
-  */
- /* #define PRISM2_NO_STATION_MODES */
-+/* Enable TX power Setting functions
-+ * (min att = -128 , max att =  127)
-+ */
-+#define RAW_TXPOWER_SETTING
-+
- #endif /* HOSTAP_CONFIG_H */
---- a/drivers/net/wireless/hostap/hostap.h
-+++ b/drivers/net/wireless/hostap/hostap.h
-@@ -89,6 +89,7 @@ extern const struct iw_handler_def hosta
- extern const struct ethtool_ops prism2_ethtool_ops;
- int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-+int hostap_restore_power(struct net_device *dev);
- #endif /* HOSTAP_H */
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -933,6 +933,7 @@ static int hfa384x_set_rid(struct net_de
-                       prism2_hw_reset(dev);
-       }
-+      hostap_restore_power(dev);
-       return res;
- }
---- a/drivers/net/wireless/hostap/hostap_info.c
-+++ b/drivers/net/wireless/hostap/hostap_info.c
-@@ -433,6 +433,11 @@ static void handle_info_queue_linkstatus
-       }
-       /* Get BSSID if we have a valid AP address */
-+
-+      if ( val == HFA384X_LINKSTATUS_CONNECTED ||
-+           val == HFA384X_LINKSTATUS_DISCONNECTED ) 
-+                      hostap_restore_power(local->dev);
-+
-       if (connected) {
-               netif_carrier_on(local->dev);
-               netif_carrier_on(local->ddev);
---- a/drivers/net/wireless/hostap/hostap_ioctl.c
-+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
-@@ -1501,23 +1501,20 @@ static int prism2_txpower_hfa386x_to_dBm
-               val = 255;
-       tmp = val;
--      tmp >>= 2;
--      return -12 - tmp;
-+      return tmp;
- }
- static u16 prism2_txpower_dBm_to_hfa386x(int val)
- {
-       signed char tmp;
--      if (val > 20)
--              return 128;
--      else if (val < -43)
-+      if (val > 127)
-               return 127;
-+      else if (val < -128)
-+              return 128;
-       tmp = val;
--      tmp = -12 - tmp;
--      tmp <<= 2;
-       return (unsigned char) tmp;
- }
-@@ -4077,3 +4074,35 @@ int hostap_ioctl(struct net_device *dev,
-       return ret;
- }
-+
-+/* BUG FIX: Restore power setting value when lost due to F/W bug */
-+
-+int hostap_restore_power(struct net_device *dev)
-+{
-+        struct hostap_interface *iface = dev->priv;
-+       local_info_t *local = iface->local;
-+               
-+       u16 val;
-+       int ret = 0;
-+
-+       if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-+                       val = 0xff; /* use all standby and sleep modes */
-+                       ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+                                              HFA386X_CR_A_D_TEST_MODES2,
-+                                              &val, NULL);
-+       }
-+
-+#ifdef RAW_TXPOWER_SETTING
-+       if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
-+               val = HFA384X_TEST_CFG_BIT_ALC;
-+               local->func->cmd(dev, HFA384X_CMDCODE_TEST |
-+                                (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
-+               val = prism2_txpower_dBm_to_hfa386x(local->txpower);
-+               ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+                            HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
-+       }
-+#endif /* RAW_TXPOWER_SETTING */
-+       return (ret ? -EOPNOTSUPP : 0);
-+}
-+
-+EXPORT_SYMBOL(hostap_restore_power);
diff --git a/target/linux/generic-2.6/patches-2.6.24/903-stddef_include.patch b/target/linux/generic-2.6/patches-2.6.24/903-stddef_include.patch
deleted file mode 100644 (file)
index 7fe248d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
---- a/include/linux/stddef.h
-+++ b/include/linux/stddef.h
-@@ -16,6 +16,7 @@ enum {
-       false   = 0,
-       true    = 1
- };
-+#endif /* __KERNEL__ */
- #undef offsetof
- #ifdef __compiler_offsetof
-@@ -23,6 +24,5 @@ enum {
- #else
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #endif
--#endif /* __KERNEL__ */
- #endif
diff --git a/target/linux/generic-2.6/patches-2.6.24/904-ls_time_locale.patch b/target/linux/generic-2.6/patches-2.6.24/904-ls_time_locale.patch
deleted file mode 100644 (file)
index 8fc9381..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/scripts/gen_initramfs_list.sh
-+++ b/scripts/gen_initramfs_list.sh
-@@ -125,7 +125,7 @@ parse() {
-                       str="${ftype} ${name} ${location} ${str}"
-                       ;;
-               "nod")
--                      local dev=`LC_ALL=C ls -l "${location}"`
-+                      local dev=`LC_ALL=C ls -l --time-style=locale "${location}"`
-                       local maj=`field 5 ${dev}`
-                       local min=`field 6 ${dev}`
-                       maj=${maj%,}
-@@ -135,7 +135,7 @@ parse() {
-                       str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
-                       ;;
-               "slink")
--                      local target=`field 11 $(LC_ALL=C ls -l "${location}")`
-+                      local target=`field 11 $(LC_ALL=C ls -l --time-style=locale "${location}")`
-                       str="${ftype} ${name} ${target} ${str}"
-                       ;;
-               *)
diff --git a/target/linux/generic-2.6/patches-2.6.24/905-i386_build.patch b/target/linux/generic-2.6/patches-2.6.24/905-i386_build.patch
deleted file mode 100644 (file)
index c701fda..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/arch/x86/boot/tools/build.c
-+++ b/arch/x86/boot/tools/build.c
-@@ -29,7 +29,6 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
--#include <sys/sysmacros.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/mman.h>
diff --git a/target/linux/generic-2.6/patches-2.6.24/921-gpio_spi_driver.patch b/target/linux/generic-2.6/patches-2.6.24/921-gpio_spi_driver.patch
deleted file mode 100644 (file)
index 1ad1932..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -100,6 +100,11 @@ config SPI_BUTTERFLY
-         inexpensive battery powered microcontroller evaluation board.
-         This same cable can be used to flash new firmware.
-+config SPI_GPIO
-+      tristate "GPIO API based bitbanging SPI controller"
-+      depends on SPI_MASTER && GENERIC_GPIO && EXPERIMENTAL
-+      select SPI_BITBANG
-+
- config SPI_IMX
-       tristate "Freescale iMX SPI controller"
-       depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_BFIN)                       += spi_bfin5xx.
- obj-$(CONFIG_SPI_BITBANG)             += spi_bitbang.o
- obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
- obj-$(CONFIG_SPI_BUTTERFLY)           += spi_butterfly.o
-+obj-$(CONFIG_SPI_GPIO)                        += spi_gpio.o
- obj-$(CONFIG_SPI_IMX)                 += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
- obj-$(CONFIG_SPI_PXA2XX)              += pxa2xx_spi.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/922-w1_gpio_driver_backport.patch b/target/linux/generic-2.6/patches-2.6.24/922-w1_gpio_driver_backport.patch
deleted file mode 100644 (file)
index dc5aadf..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
---- a/drivers/w1/masters/Kconfig
-+++ b/drivers/w1/masters/Kconfig
-@@ -42,5 +42,15 @@ config W1_MASTER_DS1WM
-         in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like
-         hx4700.
-+config W1_MASTER_GPIO
-+      tristate "GPIO 1-wire busmaster"
-+      depends on GENERIC_GPIO
-+      help
-+        Say Y here if you want to communicate with your 1-wire devices using
-+        GPIO pins. This driver uses the GPIO API to control the wire.
-+
-+        This support is also available as a module.  If so, the module
-+        will be called w1-gpio.ko.
-+
- endmenu
---- a/drivers/w1/masters/Makefile
-+++ b/drivers/w1/masters/Makefile
-@@ -6,3 +6,4 @@ obj-$(CONFIG_W1_MASTER_MATROX)         += matro
- obj-$(CONFIG_W1_MASTER_DS2490)                += ds2490.o
- obj-$(CONFIG_W1_MASTER_DS2482)                += ds2482.o
- obj-$(CONFIG_W1_MASTER_DS1WM)         += ds1wm.o
-+obj-$(CONFIG_W1_MASTER_GPIO)          += w1-gpio.o
---- /dev/null
-+++ b/drivers/w1/masters/w1-gpio.c
-@@ -0,0 +1,124 @@
-+/*
-+ * w1-gpio - GPIO w1 bus master driver
-+ *
-+ * Copyright (C) 2007 Ville Syrjala <syrjala@sci.fi>
-+ *
-+ * 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/init.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/w1-gpio.h>
-+
-+#include "../w1.h"
-+#include "../w1_int.h"
-+
-+#include <asm/gpio.h>
-+
-+static void w1_gpio_write_bit_dir(void *data, u8 bit)
-+{
-+      struct w1_gpio_platform_data *pdata = data;
-+
-+      if (bit)
-+              gpio_direction_input(pdata->pin);
-+      else
-+              gpio_direction_output(pdata->pin, 0);
-+}
-+
-+static void w1_gpio_write_bit_val(void *data, u8 bit)
-+{
-+      struct w1_gpio_platform_data *pdata = data;
-+
-+      gpio_set_value(pdata->pin, bit);
-+}
-+
-+static u8 w1_gpio_read_bit(void *data)
-+{
-+      struct w1_gpio_platform_data *pdata = data;
-+
-+      return gpio_get_value(pdata->pin);
-+}
-+
-+static int __init w1_gpio_probe(struct platform_device *pdev)
-+{
-+      struct w1_bus_master *master;
-+      struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
-+      int err;
-+
-+      if (!pdata)
-+              return -ENXIO;
-+
-+      master = kzalloc(sizeof(struct w1_bus_master), GFP_KERNEL);
-+      if (!master)
-+              return -ENOMEM;
-+
-+      err = gpio_request(pdata->pin, "w1");
-+      if (err)
-+              goto free_master;
-+
-+      master->data = pdata;
-+      master->read_bit = w1_gpio_read_bit;
-+
-+      if (pdata->is_open_drain) {
-+              gpio_direction_output(pdata->pin, 1);
-+              master->write_bit = w1_gpio_write_bit_val;
-+      } else {
-+              gpio_direction_input(pdata->pin);
-+              master->write_bit = w1_gpio_write_bit_dir;
-+      }
-+
-+      err = w1_add_master_device(master);
-+      if (err)
-+              goto free_gpio;
-+
-+      platform_set_drvdata(pdev, master);
-+
-+      return 0;
-+
-+ free_gpio:
-+      gpio_free(pdata->pin);
-+ free_master:
-+      kfree(master);
-+
-+      return err;
-+}
-+
-+static int __exit w1_gpio_remove(struct platform_device *pdev)
-+{
-+      struct w1_bus_master *master = platform_get_drvdata(pdev);
-+      struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
-+
-+      w1_remove_master_device(master);
-+      gpio_free(pdata->pin);
-+      kfree(master);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver w1_gpio_driver = {
-+      .driver = {
-+              .name   = "w1-gpio",
-+              .owner  = THIS_MODULE,
-+      },
-+      .remove = __exit_p(w1_gpio_remove),
-+};
-+
-+static int __init w1_gpio_init(void)
-+{
-+      return platform_driver_probe(&w1_gpio_driver, w1_gpio_probe);
-+}
-+
-+static void __exit w1_gpio_exit(void)
-+{
-+      platform_driver_unregister(&w1_gpio_driver);
-+}
-+
-+module_init(w1_gpio_init);
-+module_exit(w1_gpio_exit);
-+
-+MODULE_DESCRIPTION("GPIO w1 bus master driver");
-+MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/include/linux/w1-gpio.h
-@@ -0,0 +1,23 @@
-+/*
-+ * w1-gpio interface to platform code
-+ *
-+ * Copyright (C) 2007 Ville Syrjala <syrjala@sci.fi>
-+ *
-+ * 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 _LINUX_W1_GPIO_H
-+#define _LINUX_W1_GPIO_H
-+
-+/**
-+ * struct w1_gpio_platform_data - Platform-dependent data for w1-gpio
-+ * @pin: GPIO pin to use
-+ * @is_open_drain: GPIO pin is configured as open drain
-+ */
-+struct w1_gpio_platform_data {
-+      unsigned int pin;
-+      unsigned int is_open_drain:1;
-+};
-+
-+#endif /* _LINUX_W1_GPIO_H */
diff --git a/target/linux/generic-2.6/patches-2.6.24/930-ppc_big_endian_io_memory_accessors.patch b/target/linux/generic-2.6/patches-2.6.24/930-ppc_big_endian_io_memory_accessors.patch
deleted file mode 100644 (file)
index 25abf82..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-From a.othieno@bluewin.ch Tue Oct 11 07:50:21 2005
-From: Arthur Othieno <a.othieno@bluewin.ch>
-Subject: Big-endian I/O memory accessors.
-Date: Tue, 11 Oct 2005 07:50:21 +1000
-X-Patchwork-ID: 2759
-
-From: Arthur Othieno <a.othieno@bluewin.ch>
-
-I/O memory accessors. Big endian version. For those busses/devices
-that do export big-endian I/O memory.
-
-Of notable relevance/reference:
-
-  http://lwn.net/Articles/132804/
-  http://ozlabs.org/pipermail/linuxppc-embedded/2005-August/019798.html
-  http://ozlabs.org/pipermail/linuxppc-embedded/2005-August/019752.html
-
-Signed-off-by: Arthur Othieno <a.othieno@bluewin.ch>
----
-
-Paulus, 
-
-A similar patch for ppc64 made it upstream with your big ppc64 merge.
-This one is still sitting in http://patchwork.ozlabs.org/linuxppc/
-and didn't make it with the ppc32 equivalent. Thanks.
-
-
- include/asm-ppc/io.h |   20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-
----
---- a/include/asm-ppc/io.h
-+++ b/include/asm-ppc/io.h
-@@ -413,11 +413,21 @@ static inline unsigned int ioread16(void
-       return readw(addr);
- }
-+static inline unsigned int ioread16be(void __iomem *addr)
-+{
-+      return in_be16(addr);
-+}
-+
- static inline unsigned int ioread32(void __iomem *addr)
- {
-       return readl(addr);
- }
-+static inline unsigned int ioread32be(void __iomem *addr)
-+{
-+      return in_be32(addr);
-+}
-+
- static inline void iowrite8(u8 val, void __iomem *addr)
- {
-       writeb(val, addr);
-@@ -428,11 +438,21 @@ static inline void iowrite16(u16 val, vo
-       writew(val, addr);
- }
-+static inline void iowrite16be(u16 val, void __iomem *addr)
-+{
-+      out_be16(addr, val);
-+}
-+
- static inline void iowrite32(u32 val, void __iomem *addr)
- {
-       writel(val, addr);
- }
-+static inline void iowrite32be(u32 val, void __iomem *addr)
-+{
-+      out_be32(addr, val);
-+}
-+
- static inline void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
- {
-       _insb(addr, dst, count);
diff --git a/target/linux/generic-2.6/patches-2.6.24/940-arm_mach_types.patch b/target/linux/generic-2.6/patches-2.6.24/940-arm_mach_types.patch
deleted file mode 100644 (file)
index cfc8b6c..0000000
+++ /dev/null
@@ -1,426 +0,0 @@
---- a/arch/arm/tools/mach-types
-+++ b/arch/arm/tools/mach-types
-@@ -12,7 +12,7 @@
- #
- #   http://www.arm.linux.org.uk/developer/machines/?action=new
- #
--# Last update: Fri May 11 19:53:41 2007
-+# Last update: Wed Apr 9 13:26:57 2008
- #
- # machine_is_xxx      CONFIG_xxxx             MACH_TYPE_xxx           number
- #
-@@ -266,7 +266,7 @@ stork_egg          ARCH_STORK_EGG          STORK_EGG               24
- wismo                 SA1100_WISMO            WISMO                   249
- ezlinx                        ARCH_EZLINX             EZLINX                  250
- at91rm9200            ARCH_AT91RM9200         AT91RM9200              251
--orion                 ARCH_ORION              ORION                   252
-+adtech_orion          ARCH_ADTECH_ORION       ADTECH_ORION            252
- neptune                       ARCH_NEPTUNE            NEPTUNE                 253
- hackkit                       SA1100_HACKKIT          HACKKIT                 254
- pxa_wins30            ARCH_PXA_WINS30         PXA_WINS30              255
-@@ -381,13 +381,13 @@ ks8695p                  ARCH_KS8695P            KS8695P                 363
- se4000                        ARCH_SE4000             SE4000                  364
- quadriceps            ARCH_QUADRICEPS         QUADRICEPS              365
- bronco                        ARCH_BRONCO             BRONCO                  366
--esl_wireless_tab      ARCH_ESL_WIRELESS_TABLETESL_WIRELESS_TABLET     367
-+esl_wireless_tab      ARCH_ESL_WIRELESS_TAB   ESL_WIRELESS_TAB        367
- esl_sofcomp           ARCH_ESL_SOFCOMP        ESL_SOFCOMP             368
- s5c7375                       ARCH_S5C7375            S5C7375                 369
- spearhead             ARCH_SPEARHEAD          SPEARHEAD               370
- pantera                       ARCH_PANTERA            PANTERA                 371
- prayoglite            ARCH_PRAYOGLITE         PRAYOGLITE              372
--gumstix                       ARCH_GUMSTIK            GUMSTIK                 373
-+gumstix                       ARCH_GUMSTIX            GUMSTIX                 373
- rcube                 ARCH_RCUBE              RCUBE                   374
- rea_olv                       ARCH_REA_OLV            REA_OLV                 375
- pxa_iphone            ARCH_PXA_IPHONE         PXA_IPHONE              376
-@@ -661,7 +661,6 @@ a9200ec                    MACH_A9200EC            A9200EC                 645
- pnx0105                       MACH_PNX0105            PNX0105                 646
- adcpoecpu             MACH_ADCPOECPU          ADCPOECPU               647
- csb637                        MACH_CSB637             CSB637                  648
--ml69q6203             MACH_ML69Q6203          ML69Q6203               649
- mb9200                        MACH_MB9200             MB9200                  650
- kulun                 MACH_KULUN              KULUN                   651
- snapper                       MACH_SNAPPER            SNAPPER                 652
-@@ -953,7 +952,6 @@ fred_jack          MACH_FRED_JACK          FRED_JACK               93
- ttg_color1            MACH_TTG_COLOR1         TTG_COLOR1              940
- nxeb500hmi            MACH_NXEB500HMI         NXEB500HMI              941
- netdcu8                       MACH_NETDCU8            NETDCU8                 942
--ml675050_cpu_boa      MACH_ML675050_CPU_BOA   ML675050_CPU_BOA        943
- ng_fvx538             MACH_NG_FVX538          NG_FVX538               944
- ng_fvs338             MACH_NG_FVS338          NG_FVS338               945
- pnx4103                       MACH_PNX4103            PNX4103                 946
-@@ -1148,7 +1146,7 @@ aidx270                  MACH_AIDX270            AIDX270                 1134
- rema                  MACH_REMA               REMA                    1135
- bps1000                       MACH_BPS1000            BPS1000                 1136
- hw90350                       MACH_HW90350            HW90350                 1137
--omap_sdp3430          MACH_OMAP_SDP3430       OMAP_SDP3430            1138
-+omap_3430sdp          MACH_OMAP_3430SDP       OMAP_3430SDP            1138
- bluetouch             MACH_BLUETOUCH          BLUETOUCH               1139
- vstms                 MACH_VSTMS              VSTMS                   1140
- xsbase270             MACH_XSBASE270          XSBASE270               1141
-@@ -1214,7 +1212,7 @@ osstbox                  MACH_OSSTBOX            OSSTBOX                 1203
- kbat9261              MACH_KBAT9261           KBAT9261                1204
- ct1100                        MACH_CT1100             CT1100                  1205
- akcppxa                       MACH_AKCPPXA            AKCPPXA                 1206
--zevio_1020            MACH_ZEVIO_1020         ZEVIO_1020              1207
-+ochaya1020            MACH_OCHAYA1020         OCHAYA1020              1207
- hitrack                       MACH_HITRACK            HITRACK                 1208
- syme1                 MACH_SYME1              SYME1                   1209
- syhl1                 MACH_SYHL1              SYHL1                   1210
-@@ -1299,7 +1297,7 @@ xp179                    MACH_XP179              XP179                   1290
- h4300                 MACH_H4300              H4300                   1291
- goramo_mlr            MACH_GORAMO_MLR         GORAMO_MLR              1292
- mxc30020evb           MACH_MXC30020EVB        MXC30020EVB             1293
--adsbitsymx            MACH_ADSBITSIMX         ADSBITSIMX              1294
-+adsbitsyg5            MACH_ADSBITSYG5         ADSBITSYG5              1294
- adsportalplus         MACH_ADSPORTALPLUS      ADSPORTALPLUS           1295
- mmsp2plus             MACH_MMSP2PLUS          MMSP2PLUS               1296
- em_x270                       MACH_EM_X270            EM_X270                 1297
-@@ -1367,3 +1365,346 @@ db88f5281              MACH_DB88F5281          DB88F5281               13
- csb726                        MACH_CSB726             CSB726                  1359
- tik27                 MACH_TIK27              TIK27                   1360
- mx_uc7420             MACH_MX_UC7420          MX_UC7420               1361
-+rirm3                 MACH_RIRM3              RIRM3                   1362
-+pelco_odyssey         MACH_PELCO_ODYSSEY      PELCO_ODYSSEY           1363
-+adx_abox              MACH_ADX_ABOX           ADX_ABOX                1365
-+adx_tpid              MACH_ADX_TPID           ADX_TPID                1366
-+minicheck             MACH_MINICHECK          MINICHECK               1367
-+idam                  MACH_IDAM               IDAM                    1368
-+mario_mx              MACH_MARIO_MX           MARIO_MX                1369
-+vi1888                        MACH_VI1888             VI1888                  1370
-+zr4230                        MACH_ZR4230             ZR4230                  1371
-+t1_ix_blue            MACH_T1_IX_BLUE         T1_IX_BLUE              1372
-+syhq2                 MACH_SYHQ2              SYHQ2                   1373
-+computime_r3          MACH_COMPUTIME_R3       COMPUTIME_R3            1374
-+oratis                        MACH_ORATIS             ORATIS                  1375
-+mikko                 MACH_MIKKO              MIKKO                   1376
-+holon                 MACH_HOLON              HOLON                   1377
-+olip8                 MACH_OLIP8              OLIP8                   1378
-+ghi270hg              MACH_GHI270HG           GHI270HG                1379
-+davinci_dm6467_evm    MACH_DAVINCI_DM6467_EVM DAVINCI_DM6467_EVM      1380
-+davinci_dm355_evm     MACH_DAVINCI_DM350_EVM  DAVINCI_DM350_EVM       1381
-+ocearm                        MACH_OCEARMTEST         OCEARMTEST              1382
-+blackriver            MACH_BLACKRIVER         BLACKRIVER              1383
-+sandgate_wp           MACH_SANDGATEWP         SANDGATEWP              1384
-+cdotbwsg              MACH_CDOTBWSG           CDOTBWSG                1385
-+quark963              MACH_QUARK963           QUARK963                1386
-+csb735                        MACH_CSB735             CSB735                  1387
-+littleton             MACH_LITTLETON          LITTLETON               1388
-+mio_p550              MACH_MIO_P550           MIO_P550                1389
-+motion2440            MACH_MOTION2440         MOTION2440              1390
-+imm500                        MACH_IMM500             IMM500                  1391
-+homematic             MACH_HOMEMATIC          HOMEMATIC               1392
-+ermine                        MACH_ERMINE             ERMINE                  1393
-+kb9202b                       MACH_KB9202B            KB9202B                 1394
-+hs1xx                 MACH_HS1XX              HS1XX                   1395
-+studentmate2440               MACH_STUDENTMATE2440    STUDENTMATE2440         1396
-+arvoo_l1_z1           MACH_ARVOO_L1_Z1        ARVOO_L1_Z1             1397
-+dep2410k              MACH_DEP2410K           DEP2410K                1398
-+xxsvideo              MACH_XXSVIDEO           XXSVIDEO                1399
-+im4004                        MACH_IM4004             IM4004                  1400
-+ochaya1050            MACH_OCHAYA1050         OCHAYA1050              1401
-+lep9261                       MACH_LEP9261            LEP9261                 1402
-+svenmeb                       MACH_SVENMEB            SVENMEB                 1403
-+fortunet2ne           MACH_FORTUNET2NE        FORTUNET2NE             1404
-+nxhx                  MACH_NXHX               NXHX                    1406
-+realview_pb11mp               MACH_REALVIEW_PB11MP    REALVIEW_PB11MP         1407
-+ids500                        MACH_IDS500             IDS500                  1408
-+ors_n725              MACH_ORS_N725           ORS_N725                1409
-+hsdarm                        MACH_HSDARM             HSDARM                  1410
-+sha_pon003            MACH_SHA_PON003         SHA_PON003              1411
-+sha_pon004            MACH_SHA_PON004         SHA_PON004              1412
-+sha_pon007            MACH_SHA_PON007         SHA_PON007              1413
-+sha_pon011            MACH_SHA_PON011         SHA_PON011              1414
-+h6042                 MACH_H6042              H6042                   1415
-+h6043                 MACH_H6043              H6043                   1416
-+looxc550              MACH_LOOXC550           LOOXC550                1417
-+cnty_titan            MACH_CNTY_TITAN         CNTY_TITAN              1418
-+app3xx                        MACH_APP3XX             APP3XX                  1419
-+sideoatsgrama         MACH_SIDEOATSGRAMA      SIDEOATSGRAMA           1420
-+xscale_palmt700p      MACH_XSCALE_PALMT700P   XSCALE_PALMT700P        1421
-+xscale_palmt700w      MACH_XSCALE_PALMT700W   XSCALE_PALMT700W        1422
-+xscale_palmt750               MACH_XSCALE_PALMT750    XSCALE_PALMT750         1423
-+xscale_palmt755p      MACH_XSCALE_PALMT755P   XSCALE_PALMT755P        1424
-+ezreganut9200         MACH_EZREGANUT9200      EZREGANUT9200           1425
-+sarge                 MACH_SARGE              SARGE                   1426
-+a696                  MACH_A696               A696                    1427
-+turtle1916            MACH_TURTLE             TURTLE                  1428
-+mx27_3ds              MACH_MX27_3DS           MX27_3DS                1430
-+bishop                        MACH_BISHOP             BISHOP                  1431
-+pxx                   MACH_PXX                PXX                     1432
-+redwood                       MACH_REDWOOD            REDWOOD                 1433
-+omap_2430dlp          MACH_OMAP_2430DLP       OMAP_2430DLP            1436
-+omap_2430osk          MACH_OMAP_2430OSK       OMAP_2430OSK            1437
-+sardine                       MACH_SARDINE            SARDINE                 1438
-+halibut                       MACH_HALIBUT            HALIBUT                 1439
-+trout                 MACH_TROUT              TROUT                   1440
-+goldfish              MACH_GOLDFISH           GOLDFISH                1441
-+gesbc2440             MACH_GESBC2440          GESBC2440               1442
-+nomad                 MACH_NOMAD              NOMAD                   1443
-+rosalind              MACH_ROSALIND           ROSALIND                1444
-+cc9p9215              MACH_CC9P9215           CC9P9215                1445
-+cc9p9210              MACH_CC9P9210           CC9P9210                1446
-+cc9p9215js            MACH_CC9P9215JS         CC9P9215JS              1447
-+cc9p9210js            MACH_CC9P9210JS         CC9P9210JS              1448
-+nasffe                        MACH_NASFFE             NASFFE                  1449
-+tn2x0bd                       MACH_TN2X0BD            TN2X0BD                 1450
-+gwmpxa                        MACH_GWMPXA             GWMPXA                  1451
-+exyplus                       MACH_EXYPLUS            EXYPLUS                 1452
-+jadoo21                       MACH_JADOO21            JADOO21                 1453
-+looxn560              MACH_LOOXN560           LOOXN560                1454
-+bonsai                        MACH_BONSAI             BONSAI                  1455
-+adsmilgato            MACH_ADSMILGATO         ADSMILGATO              1456
-+gba                   MACH_GBA                GBA                     1457
-+h6044                 MACH_H6044              H6044                   1458
-+app                   MACH_APP                APP                     1459
-+tct_hammer            MACH_TCT_HAMMER         TCT_HAMMER              1460
-+herald                        MACH_HERMES             HERMES                  1461
-+artemis                       MACH_ARTEMIS            ARTEMIS                 1462
-+htctitan              MACH_HTCTITAN           HTCTITAN                1463
-+qranium                       MACH_QRANIUM            QRANIUM                 1464
-+adx_wsc2              MACH_ADX_WSC2           ADX_WSC2                1465
-+adx_medcom            MACH_ADX_MEDINET        ADX_MEDINET             1466
-+bboard                        MACH_BBOARD             BBOARD                  1467
-+cambria                       MACH_CAMBRIA            CAMBRIA                 1468
-+mt7xxx                        MACH_MT7XXX             MT7XXX                  1469
-+matrix512             MACH_MATRIX512          MATRIX512               1470
-+matrix522             MACH_MATRIX522          MATRIX522               1471
-+ipac5010              MACH_IPAC5010           IPAC5010                1472
-+sakura                        MACH_SAKURA             SAKURA                  1473
-+grocx                 MACH_GROCX              GROCX                   1474
-+pm9263                        MACH_PM9263             PM9263                  1475
-+sim_one                       MACH_SIM_ONE            SIM_ONE                 1476
-+acq132                        MACH_ACQ132             ACQ132                  1477
-+datr                  MACH_DATR               DATR                    1478
-+actux1                        MACH_ACTUX1             ACTUX1                  1479
-+actux2                        MACH_ACTUX2             ACTUX2                  1480
-+actux3                        MACH_ACTUX3             ACTUX3                  1481
-+flexit                        MACH_FLEXIT             FLEXIT                  1482
-+bh2x0bd                       MACH_BH2X0BD            BH2X0BD                 1483
-+atb2002                       MACH_ATB2002            ATB2002                 1484
-+xenon                 MACH_XENON              XENON                   1485
-+fm607                 MACH_FM607              FM607                   1486
-+matrix514             MACH_MATRIX514          MATRIX514               1487
-+matrix524             MACH_MATRIX524          MATRIX524               1488
-+inpod                 MACH_INPOD              INPOD                   1489
-+jive                  MACH_JIVE               JIVE                    1490
-+tll_mx21              MACH_TLL_MX21           TLL_MX21                1491
-+sbc2800                       MACH_SBC2800            SBC2800                 1492
-+cc7ucamry             MACH_CC7UCAMRY          CC7UCAMRY               1493
-+ubisys_p9_sc15                MACH_UBISYS_P9_SC15     UBISYS_P9_SC15          1494
-+ubisys_p9_ssc2d10     MACH_UBISYS_P9_SSC2D10  UBISYS_P9_SSC2D10       1495
-+ubisys_p9_rcu3                MACH_UBISYS_P9_RCU3     UBISYS_P9_RCU3          1496
-+aml_m8000             MACH_AML_M8000          AML_M8000               1497
-+snapper_270           MACH_SNAPPER_270        SNAPPER_270             1498
-+omap_bbx              MACH_OMAP_BBX           OMAP_BBX                1499
-+ucn2410                       MACH_UCN2410            UCN2410                 1500
-+sam9_l9260            MACH_SAM9_L9260         SAM9_L9260              1501
-+eti_c2                        MACH_ETI_C2             ETI_C2                  1502
-+avalanche             MACH_AVALANCHE          AVALANCHE               1503
-+realview_pb1176               MACH_REALVIEW_PB1176    REALVIEW_PB1176         1504
-+dp1500                        MACH_DP1500             DP1500                  1505
-+apple_iphone          MACH_APPLE_IPHONE       APPLE_IPHONE            1506
-+yl9200                        MACH_YL9200             YL9200                  1507
-+rd88f5182             MACH_RD88F5182          RD88F5182               1508
-+kurobox_pro           MACH_KUROBOX_PRO        KUROBOX_PRO             1509
-+se_poet                       MACH_SE_POET            SE_POET                 1510
-+mx31_3ds              MACH_MX31_3DS           MX31_3DS                1511
-+r270                  MACH_R270               R270                    1512
-+armour21              MACH_ARMOUR21           ARMOUR21                1513
-+dt2                   MACH_DT2                DT2                     1514
-+vt4                   MACH_VT4                VT4                     1515
-+tyco320                       MACH_TYCO320            TYCO320                 1516
-+adma                  MACH_ADMA               ADMA                    1517
-+wp188                 MACH_WP188              WP188                   1518
-+corsica                       MACH_CORSICA            CORSICA                 1519
-+bigeye                        MACH_BIGEYE             BIGEYE                  1520
-+tll5000                       MACH_TLL5000            TLL5000                 1522
-+hni270                        MACH_HNI_X270           HNI_X270                1523
-+qong                  MACH_QONG               QONG                    1524
-+tcompact              MACH_TCOMPACT           TCOMPACT                1525
-+puma5                 MACH_PUMA5              PUMA5                   1526
-+elara                 MACH_ELARA              ELARA                   1527
-+ellington             MACH_ELLINGTON          ELLINGTON               1528
-+xda_atom              MACH_XDA_ATOM           XDA_ATOM                1529
-+energizer2            MACH_ENERGIZER2         ENERGIZER2              1530
-+odin                  MACH_ODIN               ODIN                    1531
-+actux4                        MACH_ACTUX4             ACTUX4                  1532
-+esl_omap              MACH_ESL_OMAP           ESL_OMAP                1533
-+omap2evm              MACH_OMAP2EVM           OMAP2EVM                1534
-+omap3evm              MACH_OMAP3EVM           OMAP3EVM                1535
-+adx_pcu57             MACH_ADX_PCU57          ADX_PCU57               1536
-+monaco                        MACH_MONACO             MONACO                  1537
-+levante                       MACH_LEVANTE            LEVANTE                 1538
-+tmxipx425             MACH_TMXIPX425          TMXIPX425               1539
-+leep                  MACH_LEEP               LEEP                    1540
-+raad                  MACH_RAAD               RAAD                    1541
-+dns323                        MACH_DNS323             DNS323                  1542
-+ap1000                        MACH_AP1000             AP1000                  1543
-+a9sam6432             MACH_A9SAM6432          A9SAM6432               1544
-+shiny                 MACH_SHINY              SHINY                   1545
-+omap3_beagle          MACH_OMAP3_BEAGLE       OMAP3_BEAGLE            1546
-+csr_bdb2              MACH_CSR_BDB2           CSR_BDB2                1547
-+nokia_n810            MACH_NOKIA_N810         NOKIA_N810              1548
-+c270                  MACH_C270               C270                    1549
-+sentry                        MACH_SENTRY             SENTRY                  1550
-+pcm038                        MACH_PCM038             PCM038                  1551
-+anc300                        MACH_ANC300             ANC300                  1552
-+htckaiser             MACH_HTCKAISER          HTCKAISER               1553
-+sbat100                       MACH_SBAT100            SBAT100                 1554
-+modunorm              MACH_MODUNORM           MODUNORM                1555
-+pelos_twarm           MACH_PELOS_TWARM        PELOS_TWARM             1556
-+flank                 MACH_FLANK              FLANK                   1557
-+sirloin                       MACH_SIRLOIN            SIRLOIN                 1558
-+brisket                       MACH_BRISKET            BRISKET                 1559
-+chuck                 MACH_CHUCK              CHUCK                   1560
-+otter                 MACH_OTTER              OTTER                   1561
-+davinci_ldk           MACH_DAVINCI_LDK        DAVINCI_LDK             1562
-+phreedom              MACH_PHREEDOM           PHREEDOM                1563
-+sg310                 MACH_SG310              SG310                   1564
-+ts_x09                        MACH_TS209              TS209                   1565
-+at91cap9adk           MACH_AT91CAP9ADK        AT91CAP9ADK             1566
-+tion9315              MACH_TION9315           TION9315                1567
-+mast                  MACH_MAST               MAST                    1568
-+pfw                   MACH_PFW                PFW                     1569
-+yl_p2440              MACH_YL_P2440           YL_P2440                1570
-+zsbc32                        MACH_ZSBC32             ZSBC32                  1571
-+omap_pace2            MACH_OMAP_PACE2         OMAP_PACE2              1572
-+imx_pace2             MACH_IMX_PACE2          IMX_PACE2               1573
-+mx31moboard           MACH_MX31MOBOARD        MX31MOBOARD             1574
-+mx37_3ds              MACH_MX37_3DS           MX37_3DS                1575
-+rcc                   MACH_RCC                RCC                     1576
-+dmp                   MACH_ARM9               ARM9                    1577
-+vision_ep9307         MACH_VISION_EP9307      VISION_EP9307           1578
-+scly1000              MACH_SCLY1000           SCLY1000                1579
-+fontel_ep             MACH_FONTEL_EP          FONTEL_EP               1580
-+voiceblue3g           MACH_VOICEBLUE3G        VOICEBLUE3G             1581
-+tt9200                        MACH_TT9200             TT9200                  1582
-+digi2410              MACH_DIGI2410           DIGI2410                1583
-+terastation_pro2      MACH_TERASTATION_PRO2   TERASTATION_PRO2        1584
-+linkstation_pro               MACH_LINKSTATION_PRO    LINKSTATION_PRO         1585
-+motorola_a780         MACH_MOTOROLA_A780      MOTOROLA_A780           1587
-+motorola_e6           MACH_MOTOROLA_E6        MOTOROLA_E6             1588
-+motorola_e2           MACH_MOTOROLA_E2        MOTOROLA_E2             1589
-+motorola_e680         MACH_MOTOROLA_E680      MOTOROLA_E680           1590
-+ur2410                        MACH_UR2410             UR2410                  1591
-+tas9261                       MACH_TAS9261            TAS9261                 1592
-+davinci_hermes_hd     MACH_HERMES_HD          HERMES_HD               1593
-+davinci_perseo_hd     MACH_PERSEO_HD          PERSEO_HD               1594
-+stargazer2            MACH_STARGAZER2         STARGAZER2              1595
-+e350                  MACH_E350               E350                    1596
-+wpcm450                       MACH_WPCM450            WPCM450                 1597
-+cartesio              MACH_CARTESIO           CARTESIO                1598
-+toybox                        MACH_TOYBOX             TOYBOX                  1599
-+tx27                  MACH_TX27               TX27                    1600
-+ts409                 MACH_TS409              TS409                   1601
-+p300                  MACH_P300               P300                    1602
-+xdacomet              MACH_XDACOMET           XDACOMET                1603
-+dexflex2              MACH_DEXFLEX2           DEXFLEX2                1604
-+ow                    MACH_OW                 OW                      1605
-+armebs3                       MACH_ARMEBS3            ARMEBS3                 1606
-+u3                    MACH_U3                 U3                      1607
-+smdk2450              MACH_SMDK2450           SMDK2450                1608
-+rsi_ews                       MACH_RSI_EWS            RSI_EWS                 1609
-+tnb                   MACH_TNB                TNB                     1610
-+toepath                       MACH_TOEPATH            TOEPATH                 1611
-+kb9263                        MACH_KB9263             KB9263                  1612
-+mt7108                        MACH_MT7108             MT7108                  1613
-+smtr2440              MACH_SMTR2440           SMTR2440                1614
-+manao                 MACH_MANAO              MANAO                   1615
-+cm_x300                       MACH_CM_X300            CM_X300                 1616
-+gulfstream_kp         MACH_GULFSTREAM_KP      GULFSTREAM_KP           1617
-+lanreadyfn522         MACH_LANREADYFN522      LANREADYFN522           1618
-+arma37                        MACH_ARMA37             ARMA37                  1619
-+mendel                        MACH_MENDEL             MENDEL                  1620
-+pelco_iliad           MACH_PELCO_ILIAD        PELCO_ILIAD             1621
-+unit2p                        MACH_UNIT2P             UNIT2P                  1622
-+inc20otter            MACH_INC20OTTER         INC20OTTER              1623
-+at91sam9g20ek         MACH_AT91SAM9G20EK      AT91SAM9G20EK           1624
-+sc_ge2                        MACH_STORCENTER         STORCENTER              1625
-+smdk6410              MACH_SMDK6410           SMDK6410                1626
-+u300                  MACH_U300               U300                    1627
-+u500                  MACH_U500               U500                    1628
-+ds9260                        MACH_DS9260             DS9260                  1629
-+riverrock             MACH_RIVERROCK          RIVERROCK               1630
-+scibath                       MACH_SCIBATH            SCIBATH                 1631
-+at91sam7se            MACH_AT91SAM7SE512EK    AT91SAM7SE512EK         1632
-+wrt350n_v2            MACH_WRT350N_V2         WRT350N_V2              1633
-+multimedia            MACH_MULTIMEDIA         MULTIMEDIA              1634
-+marvin                        MACH_MARVIN             MARVIN                  1635
-+x500                  MACH_X500               X500                    1636
-+awlug4lcu             MACH_AWLUG4LCU          AWLUG4LCU               1637
-+palermoc              MACH_PALERMOC           PALERMOC                1638
-+omap_zoom             MACH_OMAP_3430LABRADOR  OMAP_3430LABRADOR       1639
-+ip500                 MACH_IP500              IP500                   1640
-+mx35ads                       MACH_MACH_MX35ADS       MACH_MX35ADS            1641
-+ase2                  MACH_ASE2               ASE2                    1642
-+mx35evb                       MACH_MX35EVB            MX35EVB                 1643
-+aml_m8050             MACH_AML_M8050          AML_M8050               1644
-+mx35_3ds              MACH_MX35_3DS           MX35_3DS                1645
-+mars                  MACH_MARS               MARS                    1646
-+ntosd_644xa           MACH_NTOSD_644XA        NTOSD_644XA             1647
-+badger                        MACH_BADGER             BADGER                  1648
-+trizeps4wl            MACH_TRIZEPS4WL         TRIZEPS4WL              1649
-+trizeps5              MACH_TRIZEPS5           TRIZEPS5                1650
-+marlin                        MACH_MARLIN             MARLIN                  1651
-+ts7800                        MACH_TS7800             TS7800                  1652
-+hpipaq214             MACH_HPIPAQ214          HPIPAQ214               1653
-+at572d940dcm          MACH_AT572D940DCM       AT572D940DCM            1654
-+ne1board              MACH_NE1BOARD           NE1BOARD                1655
-+zante                 MACH_ZANTE              ZANTE                   1656
-+sffsdr                        MACH_SFFSDR             SFFSDR                  1657
-+tw2662                        MACH_TW2662             TW2662                  1658
-+vf10xx                        MACH_VF10XX             VF10XX                  1659
-+zoran43xx             MACH_ZORAN43XX          ZORAN43XX               1660
-+sonix926              MACH_SONIX926           SONIX926                1661
-+celestialsemi         MACH_CELESTIALSEMI      CELESTIALSEMI           1662
-+cc9m2443              MACH_CC9M2443           CC9M2443                1663
-+tw5334                        MACH_TW5334             TW5334                  1664
-+omap_htcartemis               MACH_HTCARTEMIS         HTCARTEMIS              1665
-+nal_hlite             MACH_NAL_HLITE          NAL_HLITE               1666
-+htcvogue              MACH_HTCVOGUE           HTCVOGUE                1667
-+smartweb              MACH_SMARTWEB           SMARTWEB                1668
-+mv86xx                        MACH_MV86XX             MV86XX                  1669
-+mv87xx                        MACH_MV87XX             MV87XX                  1670
-+songyoungho           MACH_SONGYOUNGHO        SONGYOUNGHO             1671
-+younghotema           MACH_YOUNGHOTEMA        YOUNGHOTEMA             1672
-+pcm037                        MACH_PCM037             PCM037                  1673
-+mmvp                  MACH_MMVP               MMVP                    1674
-+mmap                  MACH_MMAP               MMAP                    1675
-+ptid2410              MACH_PTID2410           PTID2410                1676
-+james_926             MACH_JAMES_926          JAMES_926               1677
-+fm6000                        MACH_FM6000             FM6000                  1678
-+db88f6281_bp          MACH_DB88F6281_BP       DB88F6281_BP            1680
-+rd88f6192_nas         MACH_RD88F6192_NAS      RD88F6192_NAS           1681
-+rd88f6281             MACH_RD88F6281          RD88F6281               1682
-+db78x00_bp            MACH_DB78X00_BP         DB78X00_BP              1683
-+smdk2416              MACH_SMDK2416           SMDK2416                1685
-+oce_spider_si         MACH_OCE_SPIDER_SI      OCE_SPIDER_SI           1686
-+oce_spider_sk         MACH_OCE_SPIDER_SK      OCE_SPIDER_SK           1687
-+rovern6                       MACH_ROVERN6            ROVERN6                 1688
-+pelco_evolution               MACH_PELCO_EVOLUTION    PELCO_EVOLUTION         1689
-+wbd111                        MACH_WBD111             WBD111                  1690
-+elaracpe              MACH_ELARACPE           ELARACPE                1691
-+mabv3                 MACH_MABV3              MABV3                   1692
-+mv2120                        MACH_MV2120             MV2120                  1693
-+csb737                        MACH_CSB737             CSB737                  1695
-+mx51_3ds              MACH_MX51_3DS           MX51_3DS                1696
-+g900                  MACH_G900               G900                    1697
-+apf27                 MACH_APF27              APF27                   1698
-+ggus2000              MACH_GGUS2000           GGUS2000                1699
-+omap_2430_mimic               MACH_OMAP_2430_MIMIC    OMAP_2430_MIMIC         1700
-+imx27lite             MACH_IMX27LITE          IMX27LITE               1701
-+almex                 MACH_ALMEX              ALMEX                   1702
-+control                       MACH_CONTROL            CONTROL                 1703
-+mba2410                       MACH_MBA2410            MBA2410                 1704
-+volcano                       MACH_VOLCANO            VOLCANO                 1705
-+zenith                        MACH_ZENITH             ZENITH                  1706
-+muchip                        MACH_MUCHIP             MUCHIP                  1707
-+magellan              MACH_MAGELLAN           MAGELLAN                1708
-+usb_a9260             MACH_USB_A9260          USB_A9260               1709
-+usb_a9263             MACH_USB_A9263          USB_A9263               1710
-+qil_a9260             MACH_QIL_A9260          QIL_A9260               1711
-+cme9210                       MACH_CME9210            CME9210                 1712
-+hczh4                 MACH_HCZH4              HCZH4                   1713
-+spearbasic            MACH_SPEARBASIC         SPEARBASIC              1714
diff --git a/target/linux/generic-2.6/patches-2.6.24/950-mtd_cfi_intel_p33_compatbility.patch b/target/linux/generic-2.6/patches-2.6.24/950-mtd_cfi_intel_p33_compatbility.patch
deleted file mode 100644 (file)
index 42e8927..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/mtd/chips/cfi_cmdset_0001.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
-@@ -277,7 +277,7 @@ read_pri_intelext(struct map_info *map, 
-               return NULL;
-       if (extp->MajorVersion != '1' ||
--          (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-+          (extp->MinorVersion < '0' || extp->MinorVersion > '5')) {
-               printk(KERN_ERR "  Unknown Intel/Sharp Extended Query "
-                      "version %c.%c.\n",  extp->MajorVersion,
-                      extp->MinorVersion);
diff --git a/target/linux/generic-2.6/patches-2.6.24/975-crypto_kconfig_hacks.patch b/target/linux/generic-2.6/patches-2.6.24/975-crypto_kconfig_hacks.patch
deleted file mode 100644 (file)
index 86d6ecd..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -20,7 +20,7 @@ menuconfig CRYPTO
- if CRYPTO
- config CRYPTO_ALGAPI
--      tristate
-+      tristate "ALG API"
-       help
-         This option provides the API for cryptographic algorithms.
-@@ -29,15 +29,15 @@ config CRYPTO_ABLKCIPHER
-       select CRYPTO_BLKCIPHER
- config CRYPTO_AEAD
--      tristate
-+      tristate "AEAD"
-       select CRYPTO_ALGAPI
- config CRYPTO_BLKCIPHER
--      tristate
-+      tristate "Block cipher"
-       select CRYPTO_ALGAPI
- config CRYPTO_HASH
--      tristate
-+      tristate "HASH"
-       select CRYPTO_ALGAPI
- config CRYPTO_MANAGER